blob: c6e9d212a2649df157a2c456b3b57faadfefd1f0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 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.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();
}
}