diff options
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java')
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java | 441 |
1 files changed, 441 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java new file mode 100644 index 000000000..53687c822 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java @@ -0,0 +1,441 @@ +/******************************************************************************* + * Copyright (c) 2004 - 2006 University Of British Columbia 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: + * University Of British Columbia - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylar.tasks.ui.editors; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.mylar.context.core.MylarStatusHandler; +import org.eclipse.mylar.internal.tasks.ui.TaskListImages; +import org.eclipse.mylar.internal.tasks.ui.TaskListPreferenceConstants; +import org.eclipse.mylar.internal.tasks.ui.editors.TaskEditorActionContributor; +import org.eclipse.mylar.internal.tasks.ui.editors.TaskPlanningEditor; +import org.eclipse.mylar.internal.tasks.ui.views.TaskListView; +import org.eclipse.mylar.tasks.core.AbstractRepositoryTask; +import org.eclipse.mylar.tasks.core.ITask; +import org.eclipse.mylar.tasks.ui.TasksUiPlugin; +import org.eclipse.swt.SWT; +import org.eclipse.swt.SWTError; +import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.IPartListener; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.forms.editor.FormEditor; +import org.eclipse.ui.forms.editor.IFormPage; +import org.eclipse.ui.forms.widgets.FormToolkit; + +/** + * @author Mik Kersten + * @author Eric Booth (initial prototype) + */ +public class TaskEditor extends FormEditor { + + // private static final String TASK_INFO_PAGE_LABEL = "Planning"; + + private static final String ISSUE_WEB_PAGE_LABEL = "Browser"; + + protected ITask task; + + private TaskPlanningEditor taskPlanningEditor; + + private Browser webBrowser; + + private TaskEditorInput taskEditorInput; + + private TaskEditorListener partListener; + + private List<IEditorPart> editors = new ArrayList<IEditorPart>(); + + private Menu contextMenu; + + private IEditorPart contentOutlineProvider = null; + + private int browserPageIndex; + + public TaskEditor() { + super(); + taskPlanningEditor = new TaskPlanningEditor(this); + taskPlanningEditor.setParentEditor(this); + } + + protected void contextMenuAboutToShow(IMenuManager manager) { + TaskEditorActionContributor contributor = getContributor(); + // IFormPage page = getActivePageInstance(); + if (contributor != null) + contributor.contextMenuAboutToShow(manager); + } + + public TaskEditorActionContributor getContributor() { + return (TaskEditorActionContributor) getEditorSite().getActionBarContributor(); + } + + @SuppressWarnings("unchecked") + @Override + public Object getAdapter(Class adapter) { + return getAdapterDelgate(adapter); + } + + public Object getAdapterDelgate(Class<?> adapter) { + // TODO: consider adding: IContentOutlinePage.class.equals(adapter) && + if (contentOutlineProvider != null) { + return contentOutlineProvider.getAdapter(adapter); + } else { + return super.getAdapter(adapter); + } + } + + @Override + public IEditorPart getActiveEditor() { + return super.getActiveEditor(); + } + + private int createBrowserPage(String url) { + if (!TasksUiPlugin.getDefault().getPreferenceStore().getBoolean( + TaskListPreferenceConstants.REPORT_DISABLE_INTERNAL)) { + try { + webBrowser = new Browser(getContainer(), SWT.NONE); + int index = addPage(webBrowser); + setPageText(index, ISSUE_WEB_PAGE_LABEL); + webBrowser.setUrl(url); + + boolean openWithBrowser = TasksUiPlugin.getDefault().getPreferenceStore().getBoolean( + TaskListPreferenceConstants.REPORT_OPEN_INTERNAL); + // if (!(task instanceof AbstractRepositoryTask) || + // openWithBrowser) { + if (openWithBrowser) { + setActivePage(index); + } + return index; + } catch (SWTError e) { + MylarStatusHandler.fail(e, "Could not create Browser page: " + e.getMessage(), true); + } catch (RuntimeException e) { + MylarStatusHandler.fail(e, "could not create issue report page", false); + } + } + return 0; + } + + @Override + public void doSave(IProgressMonitor monitor) { + if (this.getEditorInput() instanceof NewTaskEditorInput) { + MessageDialog.openWarning(this.getSite().getShell(), "Operation not supported", + "Save of un-submitted new tasks is not currently supported.\nPlease submit all new tasks."); + monitor.setCanceled(true); + return; + } + + for (IFormPage page : getPages()) { + if (page.isDirty()) { + page.doSave(monitor); + } + } + + editorDirtyStateChanged(); + } + + // see PDEFormEditor + /* package */@SuppressWarnings("unchecked") + IFormPage[] getPages() { + ArrayList formPages = new ArrayList(); + for (int i = 0; i < pages.size(); i++) { + Object page = pages.get(i); + if (page instanceof IFormPage) + formPages.add(page); + } + return (IFormPage[]) formPages.toArray(new IFormPage[formPages.size()]); + } + + /** + * HACK: perform real check + */ + private String getUrl() { + String url = null; + if (getEditorInput() instanceof RepositoryTaskEditorInput) { + url = ((RepositoryTaskEditorInput) getEditorInput()).getUrl(); + if (url == null) { + url = task.getUrl(); + } + } else if (task != null && task.getUrl().length() > 9) { + url = task.getUrl(); + } + return url; + } + + /** + * Saves the multi-page editor's document as another file. Also updates the + * text for page 0's tab, and updates this multi-page editor's input to + * correspond to the nested editor's. + * + * @see org.eclipse.ui.ISaveablePart#doSaveAs() + */ + @Override + public void doSaveAs() { + IEditorPart editor = getEditor(0); + if (editor != null) { + editor.doSaveAs(); + setPageText(0, editor.getTitle()); + setInput(editor.getEditorInput()); + } + } + + @Override + public void init(IEditorSite site, IEditorInput input) throws PartInitException { + partListener = new TaskEditorListener(); + site.getPage().addPartListener(partListener); + super.init(site, input); + setSite(site); + } + + public void notifyTaskChanged() { + TasksUiPlugin.getTaskListManager().getTaskList().notifyLocalInfoChanged(task); + } + + @Override + public boolean isSaveAsAllowed() { + return false; + } + + @Override + public boolean isDirty() { + for (IFormPage page : getPages()) { + if (page.isDirty()) { + return true; + } + } + return false; + } + + private class TaskEditorListener implements IPartListener { + + public void partActivated(IWorkbenchPart part) { + if (part.equals(TaskEditor.this)) { + if (taskEditorInput != null) { + ITask task = taskEditorInput.getTask(); + if (TaskListView.getFromActivePerspective() != null) { + ITask selected = TaskListView.getFromActivePerspective().getSelectedTask(); + if (selected == null || !selected.equals(task)) { + TaskListView.getFromActivePerspective().selectedAndFocusTask(task); + } + } + } + } + } + + /** + * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart) + */ + public void partBroughtToTop(IWorkbenchPart part) { + // don't care about this event + } + + /** + * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart) + */ + public void partClosed(IWorkbenchPart part) { + // don't care about this event + } + + /** + * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart) + */ + public void partDeactivated(IWorkbenchPart part) { + // don't care about this event + } + + /** + * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart) + */ + public void partOpened(IWorkbenchPart part) { + // don't care about this event + } + } + + /** + * Updates the tab title + */ + public void changeTitle() { + this.setPartName(taskEditorInput.getLabel()); + } + + public void markDirty() { + firePropertyChange(PROP_DIRTY); + return; + } + + @Override + public void setFocus() { + if (taskPlanningEditor != null) + taskPlanningEditor.setFocus(); + } + + public Browser getWebBrowser() { + return webBrowser; + } + + public void revealBrowser() { + setActivePage(browserPageIndex); + } + + public void displayInBrowser(String url) { + webBrowser.setUrl(url); + revealBrowser(); + } + + @Override + protected void pageChange(int newPageIndex) { + // for (ITaskEditorFactory factory : + // TasksUiPlugin.getDefault().getTaskEditorFactories()) { + // for (IEditorPart editor : editors) { + // factory.notifyEditorActivationChange(editor); + // } + // } + super.pageChange(newPageIndex); + } + + @Override + public void dispose() { + for (IEditorPart part : editors) { + part.dispose(); + } + if (taskPlanningEditor != null) + taskPlanningEditor.dispose(); + if (webBrowser != null) { + webBrowser.dispose(); + } + + IWorkbench workbench = TasksUiPlugin.getDefault().getWorkbench(); + if (workbench != null && partListener != null) { + for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) { + IWorkbenchPage activePage = window.getActivePage(); + if (activePage != null) { + activePage.removePartListener(partListener); + } + } + } + super.dispose(); + } + + public TaskEditorInput getTaskEditorInput() { + return taskEditorInput; + } + + @Override + protected void addPages() { + try { + MenuManager manager = new MenuManager(); + IMenuListener listener = new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + contextMenuAboutToShow(manager); + } + }; + manager.setRemoveAllWhenShown(true); + manager.addMenuListener(listener); + contextMenu = manager.createContextMenu(getContainer()); + getContainer().setMenu(contextMenu); + int index = -1; + if (getEditorInput() instanceof TaskEditorInput) { + addPage(taskPlanningEditor); + index++; + taskEditorInput = (TaskEditorInput) getEditorInput(); + task = taskEditorInput.getTask(); + setPartName(taskEditorInput.getLabel()); + } + + int selectedIndex = index; + for (ITaskEditorFactory factory : TasksUiPlugin.getDefault().getTaskEditorFactories()) { + if (factory.canCreateEditorFor(task) || factory.canCreateEditorFor(getEditorInput())) { + try { + IEditorPart editor = factory.createEditor(this, getEditorInput()); + IEditorInput input = task != null ? factory.createEditorInput(task) : getEditorInput(); + if (editor != null && input != null) { + if (editor instanceof AbstractRepositoryTaskEditor) { + TaskFormPage repositoryTaskEditor = (TaskFormPage) editor; + // repositoryTaskEditor.setParentEditor(this); + editor.init(getEditorSite(), input); + repositoryTaskEditor.createPartControl(getContainer()); + index = addPage(repositoryTaskEditor); + if (getEditorInput() instanceof RepositoryTaskEditorInput) { + RepositoryTaskEditorInput existingInput = (RepositoryTaskEditorInput) getEditorInput(); + setPartName(existingInput.getName()); + } else if (getEditorInput() instanceof NewTaskEditorInput) { + String label = ((NewTaskEditorInput) getEditorInput()).getName(); + setPartName(label); + } + } else { + index = addPage(editor, input); + } + selectedIndex = index; + setPageText(index++, factory.getTitle()); + } + + // HACK: overwrites if multiple present + if (factory.providesOutline()) { + contentOutlineProvider = editor; + } + } catch (Exception e) { + MylarStatusHandler.fail(e, "Could not create editor via factory: " + factory, true); + } + } + } + String urlToOpen = getUrl(); + if (urlToOpen != null && !urlToOpen.equals("")) { + browserPageIndex = createBrowserPage(urlToOpen); + if (selectedIndex == 0 && taskEditorInput != null && !taskEditorInput.isNewTask()) { + selectedIndex = browserPageIndex; + } + } + + if (selectedIndex != -1) { + setActivePage(selectedIndex); + } + + if (task instanceof AbstractRepositoryTask) { + setTitleImage(TaskListImages.getImage(TaskListImages.TASK_REPOSITORY)); + } else if (getEditorInput() instanceof AbstractTaskEditorInput) { + this.setTitleImage(TaskListImages.getImage(TaskListImages.TASK_REMOTE)); + } else if (getUrl() != null) { + setTitleImage(TaskListImages.getImage(TaskListImages.TASK_WEB)); + } + } catch (PartInitException e) { + MylarStatusHandler.fail(e, "failed to create task editor pages", false); + } + } + + @Override + protected FormToolkit createToolkit(Display display) { + // Create a toolkit that shares colors between editors. + return new FormToolkit(PlatformUI.getWorkbench().getDisplay()); + } + + public ISelection getSelection() { + if (getSite() != null && getSite().getSelectionProvider() != null) { + return getSite().getSelectionProvider().getSelection(); + } else { + return null; + } + } +} |