Java tutorial
/******************************************************************************* * Copyright (c) 2004, 2009 Tasktop Technologies and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tasktop Technologies - initial API and implementation * Eugene Kuleshov - improvements * Atlassian - improvements *******************************************************************************/ package org.eclipse.mylyn.internal.jira.ui.wizards; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.jira.core.JiraAttribute; import org.eclipse.mylyn.internal.jira.core.JiraClientFactory; import org.eclipse.mylyn.internal.jira.core.JiraCorePlugin; import org.eclipse.mylyn.internal.jira.core.model.Project; import org.eclipse.mylyn.internal.jira.core.model.filter.FilterDefinition; import org.eclipse.mylyn.internal.jira.core.model.filter.ProjectFilter; import org.eclipse.mylyn.internal.jira.core.service.JiraClient; import org.eclipse.mylyn.internal.jira.core.service.JiraException; import org.eclipse.mylyn.internal.jira.core.util.JiraUtil; import org.eclipse.mylyn.internal.jira.ui.JiraUiPlugin; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil; import org.eclipse.mylyn.internal.provisional.commons.ui.EnhancedFilteredTree; import org.eclipse.mylyn.internal.provisional.commons.ui.ICoreRunnable; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.mylyn.tasks.core.data.TaskData; import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.FilteredTree; import org.eclipse.ui.dialogs.PatternFilter; import org.eclipse.ui.progress.UIJob; /** * Implements a wizard page for selecting a JIRA project. * * @author Steffen Pingel * @author Eugene Kuleshov * @author Thomas Ehrnhoefer * @author Pawel Niewiadomski */ public class JiraProjectPage extends WizardPage { private FilteredTree projectTree; private final TaskRepository repository; public JiraProjectPage(TaskRepository repository) { super("jiraProject"); //$NON-NLS-1$ Assert.isNotNull(repository); setTitle(Messages.JiraProjectPage_New_JIRA_Task); setDescription(Messages.JiraProjectPage_Pick_a_project_to_open_the_new_bug_editor); this.repository = repository; } public void createControl(Composite parent) { // create the composite to hold the widgets Composite composite = new Composite(parent, SWT.NULL); // create the desired layout for this wizard page composite.setLayout(new GridLayout()); // create the list of bug reports // TODO e3.5 use new FilteredTree API PatternFilter patternFilter = new PatternFilter() { // matching on project keys @Override protected boolean isLeafMatch(Viewer viewer, Object element) { if (element instanceof Project) { Project project = (Project) element; if (wordMatches(project.getKey())) { return true; } } return super.isLeafMatch(viewer, element); } }; projectTree = new EnhancedFilteredTree(composite, SWT.SINGLE | SWT.BORDER, patternFilter, true); projectTree.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.FILL).grab(true, true) .hint(SWT.DEFAULT, 200).create()); TreeViewer projectTreeViewer = projectTree.getViewer(); projectTreeViewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof Project) { Project project = (Project) element; return project.getName() + " (" + project.getKey() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } return ""; //$NON-NLS-1$ } @Override public Image getImage(Object element) { // if (element instanceof Project) { // Project project = (Project) element; // if (!project.hasDetails()) { // return CommonImages.getImage(CommonImages.REFRESH); // } // } return super.getImage(element); } }); projectTreeViewer.setContentProvider(new ITreeContentProvider() { public Object[] getChildren(Object parentElement) { if (parentElement instanceof Project[]) { return (Project[]) parentElement; } return null; } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { return false; } public Object[] getElements(Object inputElement) { return getChildren(inputElement); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); updateProjectsFromRepository(false); final Project[] projects = discoverProject(); if (projects != null && projects.length > 0) { new UIJob("") { // waiting on delayed refresh of filtered tree //$NON-NLS-1$ @Override public IStatus runInUIThread(IProgressMonitor monitor) { TreeViewer viewer = projectTree.getViewer(); if (viewer != null && viewer.getTree() != null && !viewer.getTree().isDisposed()) { viewer.setSelection(new StructuredSelection(projects)); viewer.reveal(projects); viewer.getTree().showSelection(); viewer.getTree().setFocus(); } return Status.OK_STATUS; } }.schedule(300L); } projectTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (getSelectedProject() == null) { setErrorMessage(Messages.JiraProjectPage_You_must_select_a_project); } else if (!getSelectedProject().hasDetails()) { setMessage(Messages.JiraProjectPage_This_project_has_details_missing); } else { setErrorMessage(null); setMessage(null); } getWizard().getContainer().updateButtons(); } }); projectTreeViewer.addOpenListener(new IOpenListener() { public void open(OpenEvent event) { if (getWizard().canFinish()) { if (getWizard().performFinish()) { ((WizardDialog) getContainer()).close(); } } } }); Button updateButton = new Button(composite, SWT.LEFT | SWT.PUSH); updateButton.setText(Messages.JiraProjectPage_Update_Projects_from_Repository); updateButton.setLayoutData(new GridData()); updateButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { updateProjectsFromRepository(true); } }); Dialog.applyDialogFont(composite); setControl(composite); } @Override public boolean isPageComplete() { return getSelectedProject() != null; } private void updateProjectsFromRepository(final boolean force) { final JiraClient client = JiraClientFactory.getDefault().getJiraClient(repository); if (!client.getCache().hasDetails() || force) { ICoreRunnable runner = new ICoreRunnable() { public void run(IProgressMonitor monitor) throws CoreException { try { JiraClient client = JiraClientFactory.getDefault().getJiraClient(repository); client.getCache().refreshDetails(monitor); } catch (JiraException e) { throw new CoreException(JiraCorePlugin.toStatus(repository, e)); } } }; try { if (getContainer().getShell().isVisible()) { CommonUiUtil.run(getContainer(), runner); } else { CommonUiUtil.busyCursorWhile(runner); } } catch (OperationCanceledException e) { // canceled return; } catch (CoreException e) { CommonUiUtil.setMessage(this, e.getStatus()); } } Project[] projects = client.getCache().getProjects(); projectTree.getViewer().setInput(projects); getWizard().getContainer().updateButtons(); if (projects.length == 1 && projectTree.getViewer().getSelection().isEmpty()) { projectTree.getViewer().setSelection(new StructuredSelection(projects[0])); } else { projectTree.setFocus(); } } public Project getSelectedProject() { IStructuredSelection selection = (IStructuredSelection) projectTree.getViewer().getSelection(); return (Project) selection.getFirstElement(); } private Project[] discoverProject() { // TODO similarity with TasksUiUtil and Bugzilla implementation. consider adapting to TaskSelection or RepositoryTaskData Object element = getSelectedElement(); if (element == null) { return new Project[0]; } if (element instanceof ITask) { ITask task = (ITask) element; if (task.getRepositoryUrl().equals(repository.getRepositoryUrl())) { try { TaskData taskData = TasksUi.getTaskDataManager().getTaskData(task); Project project = getProject(taskData); if (project != null) { return new Project[] { project }; } } catch (CoreException e) { StatusHandler.log(new Status(IStatus.WARNING, JiraUiPlugin.ID_PLUGIN, "Failed to determine selected project", //$NON-NLS-1$ e)); } } } else if (element instanceof IRepositoryQuery) { IRepositoryQuery query = (IRepositoryQuery) element; if (query.getRepositoryUrl().equals(repository.getRepositoryUrl())) { JiraClient client = JiraClientFactory.getDefault().getJiraClient(repository); FilterDefinition filter = JiraUtil.getFilterDefinition(repository, client, query, false); if (filter != null) { ProjectFilter projectFilter = filter.getProjectFilter(); if (projectFilter != null) { return projectFilter.getProjects(); } } } } return new Project[0]; } private Object getSelectedElement() { IStructuredSelection selection = getSelection(); if (selection != null) { return selection.getFirstElement(); } else { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) { return null; } IWorkbenchPage page = window.getActivePage(); if (page == null) { return null; } IEditorPart editor = page.getActiveEditor(); if (editor == null) { return null; } IEditorInput editorInput = editor.getEditorInput(); if (editorInput instanceof TaskEditorInput) { return ((TaskEditorInput) editorInput).getTask(); } } return null; } private Project getProject(TaskData taskData) { if (taskData != null) { TaskAttribute attribute = taskData.getRoot().getMappedAttribute(JiraAttribute.PROJECT.id()); if (attribute != null) { JiraClient client = JiraClientFactory.getDefault().getJiraClient(repository); return client.getCache().getProjectById(attribute.getValue()); } } return null; } private IStructuredSelection getSelection() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); ISelection selection = window.getSelectionService().getSelection(); if (selection instanceof IStructuredSelection) { return (IStructuredSelection) selection; } return null; } }