| /******************************************************************************* |
| * Copyright (c) 2004, 2007 Mylyn project committers 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 |
| *******************************************************************************/ |
| /* |
| * Created on Jun 10, 2005 |
| */ |
| package org.eclipse.mylyn.examples.monitor.study; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.internal.ui.actions.SelectionConverter; |
| import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; |
| import org.eclipse.jface.text.TextSelection; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.mylyn.context.core.ContextCore; |
| import org.eclipse.mylyn.context.core.IInteractionElement; |
| import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin; |
| import org.eclipse.mylyn.monitor.core.InteractionEvent; |
| import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IPathEditorInput; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.part.EditorPart; |
| |
| /** |
| * Limited to Java selections. |
| * |
| * @author Mik Kersten |
| */ |
| public class SelectionMonitor extends AbstractUserInteractionMonitor { |
| |
| private static final String STRUCTURE_KIND_JAVA = "java"; |
| |
| private static final String ID_JAVA_UNKNOWN = "(non-source element)"; |
| |
| public static final String SELECTION_DEFAULT = "selected"; |
| |
| public static final String SELECTION_NEW = "new"; |
| |
| public static final String SELECTION_DECAYED = "decayed"; |
| |
| public static final String SELECTION_PREDICTED = "predicted"; |
| |
| private static final Object ID_JAVA_UNKNOW_OLD = "(non-existing element)"; |
| |
| private IJavaElement lastSelectedElement = null; |
| |
| // private InteractionEventObfuscator obfuscator = new InteractionEventObfuscator(); |
| |
| @Override |
| protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) { |
| // ignored, since not using context monitoring facilities |
| } |
| |
| @Override |
| public void selectionChanged(IWorkbenchPart part, ISelection selection) { |
| String structureKind = InteractionEvent.ID_UNKNOWN; |
| // String obfuscatedElementHandle = InteractionEvent.ID_UNKNOWN; |
| String elementHandle = InteractionEvent.ID_UNKNOWN; |
| InteractionEvent.Kind interactionKind = InteractionEvent.Kind.SELECTION; |
| if (selection instanceof StructuredSelection) { |
| StructuredSelection structuredSelection = (StructuredSelection) selection; |
| Object selectedObject = structuredSelection.getFirstElement(); |
| if (selectedObject == null) { |
| return; |
| } |
| if (selectedObject instanceof IJavaElement) { |
| IJavaElement javaElement = (IJavaElement) selectedObject; |
| structureKind = STRUCTURE_KIND_JAVA; |
| elementHandle = javaElement.getHandleIdentifier(); |
| // obfuscatedElementHandle = |
| // obfuscateJavaElementHandle(javaElement); |
| lastSelectedElement = javaElement; |
| } else { |
| structureKind = InteractionEvent.ID_UNKNOWN + ": " + selectedObject.getClass(); |
| if (selectedObject instanceof IAdaptable) { |
| IResource resource = (IResource) ((IAdaptable) selectedObject).getAdapter(IResource.class); |
| if (resource != null) { |
| elementHandle = getHandleIdentifier(resource.getFullPath()); |
| // obfuscatedElementHandle = |
| // obfuscator.obfuscateResourcePath(resource.getProjectRelativePath()); |
| } |
| } |
| } |
| } else { |
| if (selection instanceof TextSelection && part instanceof JavaEditor) { |
| TextSelection textSelection = (TextSelection) selection; |
| IJavaElement javaElement; |
| try { |
| javaElement = SelectionConverter.resolveEnclosingElement((JavaEditor) part, textSelection); |
| if (javaElement != null) { |
| structureKind = STRUCTURE_KIND_JAVA; |
| // obfuscatedElementHandle = |
| // obfuscateJavaElementHandle(javaElement); |
| elementHandle = javaElement.getHandleIdentifier(); |
| if (javaElement.equals(lastSelectedElement)) { |
| interactionKind = InteractionEvent.Kind.EDIT; |
| } |
| lastSelectedElement = javaElement; |
| } |
| } catch (JavaModelException e) { |
| // ignore unresolved elements |
| } |
| } else if (part instanceof EditorPart) { |
| EditorPart editorPart = (EditorPart) part; |
| IEditorInput input = editorPart.getEditorInput(); |
| if (input instanceof IPathEditorInput) { |
| structureKind = "file"; |
| elementHandle = getHandleIdentifier(((IPathEditorInput) input).getPath()); |
| // obfuscatedElementHandle = |
| // obfuscator.obfuscateResourcePath(((IPathEditorInput) |
| // input).getPath()); |
| } |
| } |
| } |
| IInteractionElement node = ContextCore.getContextManager().getElement(elementHandle); |
| String delta = ""; |
| float selectionFactor = ContextCore.getCommonContextScaling().get(InteractionEvent.Kind.SELECTION); |
| |
| if (node != null) { |
| if (node.getInterest().getEncodedValue() <= selectionFactor |
| && node.getInterest().getValue() > selectionFactor) { |
| delta = SELECTION_PREDICTED; |
| } else if (node.getInterest().getEncodedValue() < selectionFactor |
| && node.getInterest().getDecayValue() > selectionFactor) { |
| delta = SELECTION_DECAYED; |
| } else if (node.getInterest().getValue() == selectionFactor |
| && node.getInterest().getDecayValue() < selectionFactor) { |
| delta = SELECTION_NEW; |
| } else { |
| delta = SELECTION_DEFAULT; |
| } |
| } |
| |
| InteractionEvent event = new InteractionEvent(interactionKind, structureKind, elementHandle, part.getSite() |
| .getId(), "null", delta, 0); |
| MonitorUiPlugin.getDefault().notifyInteractionObserved(event); |
| } |
| |
| // private String obfuscateJavaElementHandle(IJavaElement javaElement) { |
| // try { |
| // StringBuffer obfuscatedPath = new StringBuffer(); |
| // IResource resource; |
| // resource = (IResource) javaElement.getUnderlyingResource(); |
| // if (resource != null && (resource instanceof IFile)) { |
| // IFile file = (IFile) resource; |
| // obfuscatedPath.append(obfuscator.obfuscateResourcePath(file.getProjectRelativePath())); |
| // obfuscatedPath.append(':'); |
| // obfuscatedPath.append(obfuscator.obfuscateString(javaElement.getElementName())); |
| // return obfuscatedPath.toString(); |
| // } else { |
| // return obfuscator.obfuscateString(javaElement.getHandleIdentifier()); |
| // } |
| // } catch (JavaModelException e) { |
| // // ignore non-existing element |
| // } |
| // return ID_JAVA_UNKNOWN; |
| // } |
| |
| // NOTE: duplicated from ResourceStructureBridge |
| private String getHandleIdentifier(IPath path) { |
| if (path != null) { |
| return path.toPortableString(); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Some events do not have a valid handle, e.g. hande is null or ? |
| */ |
| public static boolean isValidStructureHandle(InteractionEvent event) { |
| String handle = event.getStructureHandle(); |
| return handle != null && !handle.trim().equals("") && !handle.equals(SelectionMonitor.ID_JAVA_UNKNOWN) |
| && !handle.equals(SelectionMonitor.ID_JAVA_UNKNOW_OLD) && event.isValidStructureHandle(); |
| } |
| } |