blob: d4e8edfcc0c53da2db73eaec05b75d2a67116e0f [file] [log] [blame]
/*******************************************************************************
* 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.internal.context.ui.editors;
import java.lang.reflect.Method;
import java.util.List;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.mylar.context.core.ContextCorePlugin;
import org.eclipse.mylar.context.core.IMylarContext;
import org.eclipse.mylar.context.core.IMylarContextListener;
import org.eclipse.mylar.context.core.IMylarElement;
import org.eclipse.mylar.core.MylarStatusHandler;
import org.eclipse.mylar.internal.context.ui.ContextUiImages;
import org.eclipse.mylar.internal.context.ui.actions.ContextAttachAction;
import org.eclipse.mylar.internal.context.ui.actions.ContextCopyAction;
import org.eclipse.mylar.internal.context.ui.actions.ContextRetrieveAction;
import org.eclipse.mylar.internal.context.ui.actions.RemoveFromContextAction;
import org.eclipse.mylar.internal.context.ui.views.ContextNodeOpenListener;
import org.eclipse.mylar.internal.tasks.ui.TasksUiImages;
import org.eclipse.mylar.internal.tasks.ui.actions.TaskActivateAction;
import org.eclipse.mylar.tasks.core.AbstractRepositoryTask;
import org.eclipse.mylar.tasks.core.ITask;
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
import org.eclipse.mylar.tasks.ui.editors.TaskEditorInput;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.INavigatorContentExtension;
/**
*
* @author Mik Kersten
*/
public class ContextEditorFormPage extends FormPage {
public static final String ID_VIEWER = "org.eclipse.mylar.context.ui.navigator.context";
private ScrolledForm form;
private FormToolkit toolkit;
private CommonViewer commonViewer;
private RemoveFromContextAction removeFromContextAction;
private ScalableInterestFilter interestFilter = new ScalableInterestFilter();
private Scale doiScale;
private ITask task;
private IMylarContextListener CONTEXT_LISTENER = new IMylarContextListener() {
private void refresh() {
if (commonViewer != null && !commonViewer.getTree().isDisposed()) {
commonViewer.refresh();
commonViewer.expandAll();
}
}
public void contextActivated(IMylarContext context) {
refresh();
}
public void contextDeactivated(IMylarContext context) {
refresh();
}
public void elementDeleted(IMylarElement element) {
refresh();
}
public void interestChanged(List<IMylarElement> elements) {
refresh();
}
public void landmarkAdded(IMylarElement element) {
refresh();
}
public void landmarkRemoved(IMylarElement element) {
refresh();
}
public void presentationSettingsChanged(UpdateKind kind) {
refresh();
}
public void presentationSettingsChanging(UpdateKind kind) {
refresh();
}
public void relationsChanged(IMylarElement element) {
refresh();
}
};
public ContextEditorFormPage(FormEditor editor, String id, String title) {
super(editor, id, title);
}
@Override
protected void createFormContent(IManagedForm managedForm) {
super.createFormContent(managedForm);
ContextCorePlugin.getContextManager().addListener(CONTEXT_LISTENER);
task = ((TaskEditorInput) getEditorInput()).getTask();
form = managedForm.getForm();
toolkit = managedForm.getToolkit();
//form.setImage(TaskListImages.getImage(TaskListImages.TASK_ACTIVE_CENTERED));
//form.setText(LABEL);
//toolkit.decorateFormHeading(form.getForm());
form.getBody().setLayout(new GridLayout(2, false));
form.getBody().setLayoutData(new GridData(GridData.FILL_BOTH));
createActionsSection(form.getBody());
createDisplaySection(form.getBody());
form.reflow(true);
}
@Override
public void dispose() {
super.dispose();
// ContextUiPlugin.getDefault().getViewerManager().removeManagedViewer(commonViewer,
// this);
ContextCorePlugin.getContextManager().removeListener(CONTEXT_LISTENER);
}
private void createActionsSection(Composite composite) {
Section section = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR | Section.TWISTIE);
section.setText("Actions");
section.setLayout(new GridLayout());
GridData sectionGridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
sectionGridData.widthHint = 80;
section.setLayoutData(sectionGridData);
Composite sectionClient = toolkit.createComposite(section);
section.setClient(sectionClient);
sectionClient.setLayout(new GridLayout(2, false));
sectionClient.setLayoutData(new GridData());
Label label = toolkit.createLabel(sectionClient, "");
label.setImage(TasksUiImages.getImage(TasksUiImages.FILTER));
doiScale = new Scale(sectionClient, SWT.FLAT);
GridData scaleGridData = new GridData(GridData.FILL_HORIZONTAL);
scaleGridData.heightHint = 36;
scaleGridData.widthHint = 80;
doiScale.setLayoutData(scaleGridData);
doiScale.setPageIncrement(1);
doiScale.setSelection(0);
doiScale.setMinimum(0);
doiScale.setMaximum(10);
doiScale.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
setFilterThreshold();
}
public void widgetDefaultSelected(SelectionEvent e) {
// don't care about default selection
}
});
doiScale.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
// don't care about double click
}
public void mouseDown(MouseEvent e) {
// don't care about mouse down
}
public void mouseUp(MouseEvent e) {
setFilterThreshold();
}
});
if (!task.equals(TasksUiPlugin.getTaskListManager().getTaskList().getActiveTask())) {
doiScale.setEnabled(false);
}
Label attachImage = toolkit.createLabel(sectionClient, "");
attachImage.setImage(TasksUiImages.getImage(ContextUiImages.CONTEXT_ATTACH));
attachImage.setEnabled(task instanceof AbstractRepositoryTask);
Hyperlink attachHyperlink = toolkit.createHyperlink(sectionClient, "Attach context...", SWT.NONE);
attachHyperlink.setEnabled(task instanceof AbstractRepositoryTask);
attachHyperlink.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
new ContextAttachAction().run((AbstractRepositoryTask) task);
}
public void mouseDoubleClick(MouseEvent e) {
// ignore
}
public void mouseDown(MouseEvent e) {
// ignore
}
});
Label retrieveImage = toolkit.createLabel(sectionClient, "");
retrieveImage.setImage(TasksUiImages.getImage(ContextUiImages.CONTEXT_RETRIEVE));
retrieveImage.setEnabled(task instanceof AbstractRepositoryTask);
Hyperlink retrieveHyperlink = toolkit.createHyperlink(sectionClient, "Retrieve Context...", SWT.NONE);
retrieveHyperlink.setEnabled(task instanceof AbstractRepositoryTask);
retrieveHyperlink.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
new ContextRetrieveAction().run((AbstractRepositoryTask) task);
}
public void mouseDoubleClick(MouseEvent e) {
// ignore
}
public void mouseDown(MouseEvent e) {
// ignore
}
});
Label copyImage = toolkit.createLabel(sectionClient, "");
copyImage.setImage(TasksUiImages.getImage(ContextUiImages.CONTEXT_COPY));
Hyperlink copyHyperlink = toolkit.createHyperlink(sectionClient, "Copy Context to...", SWT.NONE);
copyHyperlink.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
new ContextCopyAction().run(task);
}
public void mouseDoubleClick(MouseEvent e) {
// ignore
}
public void mouseDown(MouseEvent e) {
// ignore
}
});
section.setExpanded(true);
}
protected void setFilterThreshold() {
int setting = doiScale.getSelection();
int threshold = setting * setting * setting;
interestFilter.setThreshold(threshold);
commonViewer.refresh();
commonViewer.expandAll();
}
private void createDisplaySection(Composite composite) {
Section section = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR | Section.TWISTIE);
section.setText("Elements");
section.setLayout(new GridLayout());
section.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite sectionClient = toolkit.createComposite(section);
section.setClient(sectionClient);
sectionClient.setLayout(new FillLayout());
if (task.equals(TasksUiPlugin.getTaskListManager().getTaskList().getActiveTask())) {
createViewer(sectionClient);
} else {
Hyperlink retrieveHyperlink = toolkit.createHyperlink(sectionClient, "Activate task to edit context",
SWT.NONE);
retrieveHyperlink.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
new TaskActivateAction().run(task);
}
public void mouseDoubleClick(MouseEvent e) {
// ignore
}
public void mouseDown(MouseEvent e) {
// ignore
}
});
}
section.setExpanded(true);
}
private void createViewer(Composite aParent) {
commonViewer = createCommonViewer(aParent);
commonViewer.addFilter(interestFilter);
commonViewer.addOpenListener(new ContextNodeOpenListener(commonViewer));
try {
commonViewer.getControl().setRedraw(false);
forceFlatLayoutOfJavaContent(commonViewer);
commonViewer.setInput(getSite().getPage().getInput());
getSite().setSelectionProvider(commonViewer);
// ContextUiPlugin.getDefault().getViewerManager().addManagedViewer(commonViewer,
// this);
makeContextMenuActions();
hookContextMenu();
commonViewer.expandAll();
} finally {
commonViewer.getControl().setRedraw(true);
}
}
public static void forceFlatLayoutOfJavaContent(CommonViewer commonViewer) {
INavigatorContentExtension javaContent = commonViewer.getNavigatorContentService().getContentExtensionById(
"org.eclipse.jdt.java.ui.javaContent");
if (javaContent != null) {
ITreeContentProvider treeContentProvider = javaContent.getContentProvider();
// TODO: find a sane way of doing this, should be:
// if (javaContent.getContentProvider() != null) {
// JavaNavigatorContentProvider java =
// (JavaNavigatorContentProvider)javaContent.getContentProvider();
// java.setIsFlatLayout(true);
// }
try {
Class<?> clazz = treeContentProvider.getClass().getSuperclass();
Method method = clazz.getDeclaredMethod("setIsFlatLayout", new Class[] { boolean.class });
method.invoke(treeContentProvider, new Object[] { true });
} catch (Exception e) {
MylarStatusHandler.log(e, "couldn't set flat layout on Java content provider");
}
}
}
protected CommonViewer createCommonViewer(Composite parent) {
CommonViewer viewer = new CommonViewer(ID_VIEWER, parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
return viewer;
}
private void makeContextMenuActions() {
removeFromContextAction = new RemoveFromContextAction(commonViewer, interestFilter);
commonViewer.addSelectionChangedListener(removeFromContextAction);
}
private void hookContextMenu() {
MenuManager menuManager = new MenuManager("#PopupMenu");
menuManager.setRemoveAllWhenShown(true);
menuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
Menu menu = menuManager.createContextMenu(commonViewer.getControl());
commonViewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuManager, commonViewer);
}
protected void fillContextMenu(IMenuManager manager) {
manager.add(removeFromContextAction);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
public ISelection getSelection() {
if (getSite() != null && getSite().getSelectionProvider() != null) {
return getSite().getSelectionProvider().getSelection();
} else {
return StructuredSelection.EMPTY;
}
}
}