blob: 74652ad569508c41333efddc6657276fd47045b4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 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
* Sebastian Schmidt - bug 385594
*******************************************************************************/
package org.eclipse.mylyn.internal.context.ui.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.core.IInteractionContext;
import org.eclipse.mylyn.context.core.IInteractionElement;
import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.PlatformUI;
/**
* @author Mik Kersten
* @author Sebastian Schmidt
*/
public abstract class AbstractInterestManipulationAction implements IViewActionDelegate, IWorkbenchWindowActionDelegate {
public static final String SOURCE_ID = "org.eclipse.mylyn.ui.interest.user"; //$NON-NLS-1$
protected IViewPart view;
protected IWorkbenchWindow window;
protected boolean preserveUninteresting = false;
private ISelection selection;
public void init(IWorkbenchWindow window) {
this.window = window;
}
public void init(IViewPart view) {
this.view = view;
}
@Deprecated
protected boolean isRemove() {
return !isIncrement();
}
protected abstract boolean isIncrement();
public void run(IAction action) {
IInteractionContext context = getContext();
if (context == null) {
return;
}
boolean increment = !isRemove();
if (selection instanceof StructuredSelection) {
StructuredSelection structuredSelection = (StructuredSelection) selection;
List<IInteractionElement> nodes = new ArrayList<IInteractionElement>();
for (Object object : structuredSelection.toList()) {
IInteractionElement node = convertSelectionToInteractionElement(context, object);
nodes.add(node);
}
if (nodes != null && nodes.size() > 0) {
if (!increment) {
try {
// NOTE: need to set the selection null so the
// automatic reselection does not induce interest
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage()
.getActivePart()
.getSite()
.getSelectionProvider()
.setSelection(StructuredSelection.EMPTY);
} catch (Exception e) {
// ignore
}
}
boolean manipulated = ContextCorePlugin.getContextManager().manipulateInterestForElements(nodes,
increment, false, preserveUninteresting, SOURCE_ID, context, true);
if (!manipulated) {
AbstractInterestManipulationAction.displayInterestManipulationFailure();
}
}
} else {
IInteractionElement node = ContextCore.getContextManager().getActiveElement();
if (node != null) {
boolean manipulated = ContextCorePlugin.getContextManager().manipulateInterestForElement(node,
increment, false, false, SOURCE_ID, ContextCore.getContextManager().getActiveContext(), true);
if (!manipulated) {
AbstractInterestManipulationAction.displayInterestManipulationFailure();
}
} else {
MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
Messages.AbstractInterestManipulationAction_Interest_Manipulation,
Messages.AbstractInterestManipulationAction_No_task_context_is_active);
}
}
ContextCorePlugin.getContextManager().saveContext(context);
}
protected IInteractionContext getContext() {
IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IInteractionContext context = null;
if (activeWorkbenchWindow != null && activeWorkbenchWindow.getActivePage() != null) {
IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
IEditorPart activeEditor = activePage.getActiveEditor();
// action is invoked from context editor
if (activeEditor != null && activePage.getActivePart().equals(activeEditor)) {
context = (IInteractionContext) activeEditor.getEditorInput().getAdapter(IInteractionContext.class);
}
}
// action is invoked from somewhere else, trying to use the active context
if (context == null && ContextCorePlugin.getContextManager().isContextActive()) {
context = ContextCorePlugin.getContextManager().getActiveContext();
}
return context;
}
/**
* TODO: consider moving this extensibility to the UI Bridge
*
* @deprecated use {@link #convertSelectionToInteractionElement(IInteractionContext, Object) }
*/
@Deprecated
protected IInteractionElement convertSelectionToInteractionElement(Object object) {
return convertSelectionToInteractionElement(ContextCore.getContextManager().getActiveContext(), object);
}
protected IInteractionElement convertSelectionToInteractionElement(IInteractionContext context, Object object) {
IInteractionElement node = null;
if (object instanceof IInteractionElement) {
node = (IInteractionElement) object;
} else {
AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
String handle = bridge.getHandleIdentifier(object);
node = context.get(handle);
}
return node;
}
public void dispose() {
// ignore
}
public void selectionChanged(IAction action, ISelection selection) {
this.selection = selection;
}
public static void displayInterestManipulationFailure() {
MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
Messages.AbstractInterestManipulationAction_Interest_Manipulation,
Messages.AbstractInterestManipulationAction_Not_a_valid_landmark);
}
public ISelection getSelection() {
return selection;
}
}