| /******************************************************************************* |
| * 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 |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.monitor.ui; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.mylyn.commons.core.StatusHandler; |
| import org.eclipse.mylyn.context.core.AbstractContextStructureBridge; |
| import org.eclipse.mylyn.context.core.ContextCore; |
| import org.eclipse.mylyn.internal.monitor.ui.IMonitoredWindow; |
| import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin; |
| import org.eclipse.mylyn.monitor.core.InteractionEvent; |
| import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind; |
| import org.eclipse.ui.ISelectionListener; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.IWorkbenchWindow; |
| |
| /** |
| * Self-registering on construction. Encapsulates users' interaction with the context model. |
| * |
| * @author Mik Kersten |
| * @author Shawn Minto |
| * @since 2.0 |
| */ |
| public abstract class AbstractUserInteractionMonitor implements ISelectionListener { |
| |
| protected Object lastSelectedElement = null; |
| |
| /** |
| * Requires workbench to be active. |
| */ |
| public AbstractUserInteractionMonitor() { |
| try { |
| MonitorUiPlugin.getDefault().addWindowPostSelectionListener(this); |
| } catch (NullPointerException e) { |
| StatusHandler.log(new Status(IStatus.WARNING, MonitorUiPlugin.ID_PLUGIN, |
| "Monitors can not be instantiated until the workbench is active", e)); //$NON-NLS-1$ |
| } |
| } |
| |
| public void dispose() { |
| try { |
| MonitorUiPlugin.getDefault().removeWindowPostSelectionListener(this); |
| } catch (NullPointerException e) { |
| StatusHandler.log(new Status(IStatus.WARNING, MonitorUiPlugin.ID_PLUGIN, "Could not dispose monitor", e)); //$NON-NLS-1$ |
| } |
| } |
| |
| public void selectionChanged(IWorkbenchPart part, ISelection selection) { |
| if (part.getSite() != null && part.getSite().getWorkbenchWindow() != null) { |
| IWorkbenchWindow window = part.getSite().getWorkbenchWindow(); |
| if (window instanceof IMonitoredWindow && !((IMonitoredWindow) window).isMonitored()) { |
| return; |
| } |
| } |
| if (selection == null || selection.isEmpty()) { |
| return; |
| } |
| if (!ContextCore.getContextManager().isContextActive()) { |
| handleWorkbenchPartSelection(part, selection, false); |
| } else { |
| handleWorkbenchPartSelection(part, selection, true); |
| } |
| } |
| |
| protected abstract void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, |
| boolean contributeToContext); |
| |
| /** |
| * Intended to be called back by subclasses. |
| */ |
| protected InteractionEvent handleElementSelection(IWorkbenchPart part, Object selectedElement, |
| boolean contributeToContext) { |
| return handleElementSelection(part.getSite().getId(), selectedElement, contributeToContext); |
| } |
| |
| /** |
| * Intended to be called back by subclasses. |
| */ |
| protected void handleElementEdit(IWorkbenchPart part, Object selectedElement, boolean contributeToContext) { |
| handleElementEdit(part.getSite().getId(), selectedElement, contributeToContext); |
| } |
| |
| /** |
| * Intended to be called back by subclasses. |
| */ |
| protected void handleNavigation(IWorkbenchPart part, Object targetElement, String kind, boolean contributeToContext) { |
| handleNavigation(part.getSite().getId(), targetElement, kind, contributeToContext); |
| } |
| |
| /** |
| * Intended to be called back by subclasses. * |
| * |
| * @since 3.1 |
| */ |
| protected void handleNavigation(String partId, Object targetElement, String kind, boolean contributeToContext) { |
| AbstractContextStructureBridge adapter = ContextCore.getStructureBridge(targetElement); |
| if (adapter.getContentType() != null) { |
| String handleIdentifier = adapter.getHandleIdentifier(targetElement); |
| InteractionEvent navigationEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION, |
| adapter.getContentType(), handleIdentifier, partId, kind); |
| if (handleIdentifier != null && contributeToContext) { |
| ContextCore.getContextManager().processInteractionEvent(navigationEvent); |
| } |
| MonitorUiPlugin.getDefault().notifyInteractionObserved(navigationEvent); |
| } |
| } |
| |
| /** |
| * Intended to be called back by subclasses. |
| * |
| * @since 3.1 |
| */ |
| protected void handleElementEdit(String partId, Object selectedElement, boolean contributeToContext) { |
| if (selectedElement == null) { |
| return; |
| } |
| AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(selectedElement); |
| String handleIdentifier = bridge.getHandleIdentifier(selectedElement); |
| InteractionEvent editEvent = new InteractionEvent(InteractionEvent.Kind.EDIT, bridge.getContentType(), |
| handleIdentifier, partId); |
| if (handleIdentifier != null && contributeToContext) { |
| ContextCore.getContextManager().processInteractionEvent(editEvent); |
| } |
| MonitorUiPlugin.getDefault().notifyInteractionObserved(editEvent); |
| } |
| |
| /** |
| * Intended to be called back by subclasses. * |
| * |
| * @since 3.1 |
| */ |
| protected InteractionEvent handleElementSelection(String partId, Object selectedElement, boolean contributeToContext) { |
| if (selectedElement == null || selectedElement.equals(lastSelectedElement)) { |
| return null; |
| } |
| AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(selectedElement); |
| String handleIdentifier = bridge.getHandleIdentifier(selectedElement); |
| InteractionEvent selectionEvent; |
| if (bridge.getContentType() != null) { |
| selectionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION, bridge.getContentType(), |
| handleIdentifier, partId); |
| } else { |
| selectionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION, null, null, partId); |
| } |
| if (handleIdentifier != null && contributeToContext) { |
| ContextCore.getContextManager().processInteractionEvent(selectionEvent); |
| } |
| MonitorUiPlugin.getDefault().notifyInteractionObserved(selectionEvent); |
| return selectionEvent; |
| } |
| |
| public Kind getEventKind() { |
| return InteractionEvent.Kind.SELECTION; |
| } |
| } |