Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Rolka2013-11-24 20:38:50 +0000
committerDaniel Rolka2013-11-24 20:38:50 +0000
commitb3f5717cac2c695b4550c09726fd90862f94ef6f (patch)
tree5a319dc700bf77d79426fabc14ea2024e9f5464f
parent97b5ff1ff7f28dd1ede8346d0bec678c463ce1d1 (diff)
downloadorg.eclipse.e4.tools-b3f5717cac2c695b4550c09726fd90862f94ef6f.tar.gz
org.eclipse.e4.tools-b3f5717cac2c695b4550c09726fd90862f94ef6f.tar.xz
org.eclipse.e4.tools-b3f5717cac2c695b4550c09726fd90862f94ef6f.zip
Bug 422422 - [event spy] Add single cell selection to the captured
events tree Signed-off-by: Daniel Rolka <daniel.rolka@pl.ibm.com>
-rw-r--r--bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/CapturedEventTree.java902
-rw-r--r--bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/ICapturedEventTreeListener.java (renamed from bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/model/CapturedEventTreeSelection.java)38
-rw-r--r--bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/SpyDialog.java12
-rw-r--r--bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/SpyDialogMemento.java (renamed from bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/model/SpyDialogMemento.java)4
4 files changed, 514 insertions, 442 deletions
diff --git a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/CapturedEventTree.java b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/CapturedEventTree.java
index 999add4a..8ae238e8 100644
--- a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/CapturedEventTree.java
+++ b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/CapturedEventTree.java
@@ -1,411 +1,491 @@
-/*******************************************************************************
- * Copyright (c) 2013 IBM Corporation 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.e4.tools.event.spy.internal.ui;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.databinding.beans.PojoObservables;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.e4.tools.event.spy.internal.model.CapturedEvent;
-import org.eclipse.e4.tools.event.spy.internal.model.CapturedEventTreeSelection;
-import org.eclipse.e4.tools.event.spy.internal.model.IEventItem;
-import org.eclipse.e4.tools.event.spy.internal.model.ItemToFilter;
-import org.eclipse.e4.tools.event.spy.internal.util.JDTUtils;
-import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.TreeStructureAdvisor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-
-
-public class CapturedEventTree extends TreeViewer {
-
- public interface SelectionListener {
- void selectionChanged(CapturedEventTreeSelection selection);
- }
-
- private SelectionListener selectionListener;
-
- private final WritableList capturedEvents;
-
- private final Clipboard clipboard;
-
- private final TreeItemCursor treeItemCursor;
-
- private final TreeItemColor treeItemColor;
-
- private final TreeItemFont treeItemFont;
-
- private final SelectedClassItem selectedClassItem;
-
- private String selectedItemText;
-
- public CapturedEventTree(Composite parent) {
- super(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
-
- getTree().setHeaderVisible(true);
- getTree().setLinesVisible(true);
-
- TreeColumn column = new TreeColumn(getTree(), SWT.LEFT);
- column.setText(ItemToFilter.Topic.toString());
- column.setWidth(350);
-
- column = new TreeColumn(getTree(), SWT.LEFT);
- column.setText(ItemToFilter.Publisher.toString());
- column.setWidth(150);
-
- column = new TreeColumn(getTree(), SWT.LEFT);
- column.setText(ItemToFilter.ChangedElement.toString());
- column.setWidth(150);
-
- ObservableListTreeContentProvider contentProvider = new ObservableListTreeContentProvider(
- new CapturedEventsObservableFactory(), new CapturedEventsTreeStructureAdvisor());
- setContentProvider(contentProvider);
-
- IObservableMap[] attributes = PojoObservables.observeMaps(
- contentProvider.getKnownElements(), IEventItem.class,
- new String[] {"name", "param1", "param2"});
- setLabelProvider(new ObservableMapLabelProvider(attributes));
-
- capturedEvents = new WritableList(new ArrayList<CapturedEvent>(), CapturedEvent.class);
- setInput(capturedEvents);
-
- clipboard = new Clipboard(getTree().getDisplay());
-
- treeItemCursor = new TreeItemCursor(getTree().getCursor(),
- getTree().getDisplay().getSystemCursor(SWT.CURSOR_HAND));
-
- treeItemColor = new TreeItemColor(new Color(getTree().getDisplay(), new RGB(0, 0, 120)),
- getTree().getDisplay().getSystemColor(SWT.COLOR_WHITE),
- getTree().getDisplay().getSystemColor(SWT.COLOR_BLACK));
-
- Font currentFont = getTree().getFont();
- FontData currentFontData = currentFont.getFontData()[0];
- treeItemFont = new TreeItemFont(currentFont, new Font(getTree().getDisplay(),
- currentFontData.getName(), currentFontData.getHeight(), SWT.ITALIC));
-
- selectedClassItem = new SelectedClassItem();
-
- addTreeEventListeners();
- }
-
- private static class CapturedEventsTreeStructureAdvisor extends TreeStructureAdvisor {
- @Override
- public Boolean hasChildren(Object element) {
- if (element instanceof CapturedEvent) {
- return !((CapturedEvent) element).getParameters().isEmpty();
- }
- return false;
- }
- }
-
- private static class CapturedEventsObservableFactory implements IObservableFactory {
- public IObservable createObservable(Object target) {
- if (target instanceof IObservableList) {
- return (IObservableList) target;
- }
- if (target instanceof CapturedEvent) {
- return PojoObservables.observeList(target, "parameters");
- }
- return null;
- }
- }
-
- private void addTreeEventListeners() {
- getTree().addDisposeListener(new DisposeListener() {
- public void widgetDisposed(DisposeEvent e) {
- if (clipboard != null && !clipboard.isDisposed()) {
- clipboard.dispose();
- }
- if (treeItemColor.getParamColor() != null &&
- !treeItemColor.getParamColor().isDisposed()) {
- treeItemColor.getParamColor().dispose();
- }
- if (treeItemFont.getSelectedClassNameFont() != null &&
- !treeItemFont.getSelectedClassNameFont().isDisposed()) {
- treeItemFont.getSelectedClassNameFont().dispose();
- }
- }
- });
-
- //TODO: Simplify the hit test for item
- getTree().addMouseMoveListener(new MouseMoveListener() {
- public void mouseMove(MouseEvent e) {
- Tree tree = getTree();
- clearSelectedClassItem();
-
- //we can select and finally open the class only when 'ctrl' is pressed
- if ((e.stateMask & SWT.CTRL) != SWT.CTRL) {
- return;
- }
-
- TreeItem item = getTree().getItem(new Point(e.x, e.y));
- int selectedItemIndex = getSelectedColumnIndex(item, e.x, e.y);
-
- if (selectedItemIndex > 0 /*we check the 2nd and 3rd column only*/ &&
- item.getParentItem() == null /*we don't check parameters at this moment*/) {
- String text = item.getText(selectedItemIndex);
- if (JDTUtils.containsClassName(text)) {
- selectedClassItem.setClassName(text);
- selectedClassItem.setColumnIndex(selectedItemIndex);
- selectedClassItem.setTreeItem(item);
- tree.setCursor(treeItemCursor.getPointerCursor());
- redrawTreeItem(item, selectedItemIndex);
- }
- }
- }
- });
-
- getTree().addMouseListener(new MouseAdapter() {
- @Override
- public void mouseDown(MouseEvent e) {
- TreeItem item = getTree().getItem(new Point(e.x, e.y));
- int index = getSelectedColumnIndex(item, e.x, e.y);
- selectedItemText = index != -1? item.getText(index): null;
-
- if ((e.stateMask & SWT.CTRL) == SWT.CTRL && selectedClassItem.getClassName() != null) {
- selectionListener.selectionChanged(new CapturedEventTreeSelection(selectedClassItem.getClassName()));
- }
- }
- });
-
- getTree().addListener(SWT.EraseItem, new Listener() {
- public void handleEvent(Event event) {
- event.detail &= ~SWT.FOREGROUND;
- }
- });
-
- getTree().addListener(SWT.PaintItem, new Listener() {
- public void handleEvent(Event event) {
- TreeItem item = (TreeItem) event.item;
- String text = item.getText(event.index);
- int xOffset = item.getParentItem() != null? 10: 2;
- Color color = getColorForItem(item, event.detail);
-
- event.gc.setFont(getFontForItem(item, event.index));
- event.gc.setForeground(color);
- event.gc.drawText(text, event.x + xOffset, event.y, true);
- }
- });
-
- getTree().addKeyListener(new KeyListener() {
- public void keyPressed(KeyEvent e) {
- boolean ctrlC = (e.stateMask & SWT.CTRL) == SWT.CTRL && e.keyCode == 'c';
- if(ctrlC && selectedItemText != null && selectedItemText.length() > 0) {
- clipboard.setContents(new Object[] {selectedItemText},
- new Transfer[] {TextTransfer.getInstance()});
- }
- }
- public void keyReleased(KeyEvent e) {
- clearSelectedClassItem();
- }
- });
-
- getTree().addFocusListener(new FocusAdapter() {
- @Override
- public void focusLost(FocusEvent e) {
- clearSelectedClassItem();
- }
- });
- }
-
- private Color getColorForItem(TreeItem item, int eventDetails) {
- if ((eventDetails & SWT.SELECTED) == SWT.SELECTED) {
- return treeItemColor.getSelectedColor();
- }
- if (item.getParentItem() != null) {
- return treeItemColor.getParamColor();
- }
- return treeItemColor.getDefaultColor();
- }
-
- private Font getFontForItem(TreeItem item, int columnIndex) {
- if (selectedClassItem.getTreeItem() == item &&
- selectedClassItem.getColumnIndex() == columnIndex) {
- return treeItemFont.getSelectedClassNameFont();
- }
- return treeItemFont.getDefaultFont();
- }
-
- private void redrawTreeItem(TreeItem item, int columnIndex) {
- if (item != null) {
- Rectangle rec = item.getBounds(columnIndex);
- getTree().redraw(rec.x, rec.y, rec.width, rec.height, true);
- }
- }
-
- private int getSelectedColumnIndex(TreeItem item, int mouseX, int mouseY) {
- for (int i=0; item != null && i<getTree().getColumnCount(); i++) {
- Rectangle rec = item.getBounds(i);
- if (mouseX >= rec.x && mouseX <= rec.x + rec.width) {
- return i;
- }
- }
- return -1;
- }
-
- private void clearSelectedClassItem() {
- redrawTreeItem(selectedClassItem.getTreeItem(), selectedClassItem.getColumnIndex());
- selectedClassItem.clear();
-
- Tree tree = getTree();
- if (tree.getCursor() != treeItemCursor.getDefaultCursor()) {
- tree.setCursor(treeItemCursor.getDefaultCursor());
- }
- }
-
- public void addEvent(CapturedEvent event) {
- capturedEvents.add(event);
- }
-
- public void setSelectionListener(SelectionListener selectionListener) {
- this.selectionListener = selectionListener;
- }
-
- public void removeAll() {
- capturedEvents.clear();
- }
-
- private static class TreeItemColor {
- private final Color paramColor;
-
- private final Color selectedColor;
-
- private final Color defaultColor;
-
- public TreeItemColor(Color paramColor, Color selectedColor, Color defaultColor) {
- this.paramColor = paramColor;
- this.selectedColor = selectedColor;
- this.defaultColor = defaultColor;
- }
-
- public Color getParamColor() {
- return paramColor;
- }
-
- public Color getSelectedColor() {
- return selectedColor;
- }
-
- public Color getDefaultColor() {
- return defaultColor;
- }
- }
-
- private static class TreeItemCursor {
- private final Cursor defaultCursor;
-
- private final Cursor pointerCursor;
-
- public TreeItemCursor(Cursor defaultCursor, Cursor pointerCursor) {
- this.defaultCursor = defaultCursor;
- this.pointerCursor = pointerCursor;
- }
-
- public Cursor getDefaultCursor() {
- return defaultCursor;
- }
-
- public Cursor getPointerCursor() {
- return pointerCursor;
- }
- }
-
- private static class TreeItemFont {
- private final Font defaultFont;
-
- private final Font selectedClassNameFont;
-
- public TreeItemFont(Font defaultFont, Font selectedClassNameFont) {
- this.defaultFont = defaultFont;
- this.selectedClassNameFont = selectedClassNameFont;
- }
-
- public Font getDefaultFont() {
- return defaultFont;
- }
-
- public Font getSelectedClassNameFont() {
- return selectedClassNameFont;
- }
- }
-
- private static class SelectedClassItem {
- private TreeItem treeItem;
-
- private int columnIndex;
-
- private String className;
-
- public SelectedClassItem() {
- clear();
- }
-
- public void setTreeItem(TreeItem treeItem) {
- this.treeItem = treeItem;
- }
-
- public TreeItem getTreeItem() {
- return treeItem;
- }
-
- public void setColumnIndex(int columnIndex) {
- this.columnIndex = columnIndex;
- }
-
- public int getColumnIndex() {
- return columnIndex;
- }
-
- public void setClassName(String className) {
- this.className = className;
- }
-
- public String getClassName() {
- return className;
- }
-
- public void clear() {
- treeItem = null;
- columnIndex = -1;
- className = null;
- }
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.e4.tools.event.spy.internal.ui;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.databinding.beans.PojoObservables;
+import org.eclipse.core.databinding.observable.IObservable;
+import org.eclipse.core.databinding.observable.list.IObservableList;
+import org.eclipse.core.databinding.observable.list.WritableList;
+import org.eclipse.core.databinding.observable.map.IObservableMap;
+import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
+import org.eclipse.e4.tools.event.spy.internal.model.CapturedEvent;
+import org.eclipse.e4.tools.event.spy.internal.model.IEventItem;
+import org.eclipse.e4.tools.event.spy.internal.model.ItemToFilter;
+import org.eclipse.e4.tools.event.spy.internal.util.JDTUtils;
+import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
+import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
+import org.eclipse.jface.databinding.viewers.TreeStructureAdvisor;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Resource;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+
+public class CapturedEventTree extends TreeViewer {
+ private ICapturedEventTreeListener listener;
+
+ private WritableList capturedEvents;
+
+ private Clipboard clipboard;
+
+ private TreeItemCursor treeItemCursor;
+
+ private TreeItemForeground treeItemForeground;
+
+ private TreeItemBackground treeItemBackground;
+
+ private TreeItemFont treeItemFont;
+
+ private SelectedTreeItem selectedClassNameTreeItem;
+
+ private SelectedTreeItem selectedTreeItem;
+
+ public CapturedEventTree(Composite parent) {
+ super(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
+
+ getTree().setHeaderVisible(true);
+ getTree().setLinesVisible(true);
+
+ TreeColumn column = new TreeColumn(getTree(), SWT.LEFT);
+ column.setText(ItemToFilter.Topic.toString());
+ column.setWidth(350);
+
+ column = new TreeColumn(getTree(), SWT.LEFT);
+ column.setText(ItemToFilter.Publisher.toString());
+ column.setWidth(150);
+
+ column = new TreeColumn(getTree(), SWT.LEFT);
+ column.setText(ItemToFilter.ChangedElement.toString());
+ column.setWidth(150);
+
+ ObservableListTreeContentProvider contentProvider = new ObservableListTreeContentProvider(
+ new CapturedEventsObservableFactory(), new CapturedEventsTreeStructureAdvisor());
+ setContentProvider(contentProvider);
+
+ IObservableMap[] attributes = PojoObservables.observeMaps(
+ contentProvider.getKnownElements(), IEventItem.class,
+ new String[] {"name", "param1", "param2"});
+ setLabelProvider(new ObservableMapLabelProvider(attributes));
+
+ capturedEvents = new WritableList(new ArrayList<CapturedEvent>(), CapturedEvent.class);
+ setInput(capturedEvents);
+
+ clipboard = new Clipboard(getTree().getDisplay());
+
+ createTreeItemResources();
+
+ addTreeEventListeners();
+ }
+
+ private static class CapturedEventsTreeStructureAdvisor extends TreeStructureAdvisor {
+ @Override
+ public Boolean hasChildren(Object element) {
+ if (element instanceof CapturedEvent) {
+ return !((CapturedEvent) element).getParameters().isEmpty();
+ }
+ return false;
+ }
+ }
+
+ private static class CapturedEventsObservableFactory implements IObservableFactory {
+ public IObservable createObservable(Object target) {
+ if (target instanceof IObservableList) {
+ return (IObservableList) target;
+ }
+ if (target instanceof CapturedEvent) {
+ return PojoObservables.observeList(target, "parameters");
+ }
+ return null;
+ }
+ }
+
+ private void createTreeItemResources() {
+ Display display = getTree().getDisplay();
+
+ treeItemCursor = new TreeItemCursor(getTree().getCursor(),
+ display.getSystemCursor(SWT.CURSOR_HAND));
+
+ treeItemForeground = new TreeItemForeground(new Color(display, new RGB(0, 0, 120)),
+ display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT), display.getSystemColor(SWT.COLOR_BLACK));
+
+ treeItemBackground = new TreeItemBackground(display.getSystemColor(SWT.COLOR_LIST_SELECTION),
+ getTree().getBackground());
+
+ Font currentFont = getTree().getFont();
+ FontData currentFontData = currentFont.getFontData()[0];
+ treeItemFont = new TreeItemFont(currentFont, new Font(display, currentFontData.getName(),
+ currentFontData.getHeight(), SWT.ITALIC));
+
+ selectedClassNameTreeItem = new SelectedTreeItem() {
+ @Override
+ public void clear() {
+ redrawTreeItem(getTreeItem(), getColumnIndex());
+ super.clear();
+
+ Tree tree = getTree();
+ if (tree.getCursor() != treeItemCursor.getDefaultCursor()) {
+ tree.setCursor(treeItemCursor.getDefaultCursor());
+ }
+ }
+ };
+
+ selectedTreeItem = new SelectedTreeItem() {
+ @Override
+ public void clear() {
+ redrawTreeItem(getTreeItem(), getColumnIndex());
+ super.clear();
+ }
+ };
+ }
+
+ private void addTreeEventListeners() {
+ getTree().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ if (clipboard != null && !clipboard.isDisposed()) {
+ clipboard.dispose();
+ }
+ disposeResource(treeItemForeground.getParamColor());
+ disposeResource(treeItemFont.getSelectedClassNameFont());
+ }
+ private void disposeResource(Resource resource) {
+ if (resource != null && !resource.isDisposed()) {
+ resource.dispose();
+ }
+ }
+ });
+
+ getTree().addMouseMoveListener(new MouseMoveListener() {
+ public void mouseMove(MouseEvent e) {
+ selectedClassNameTreeItem.clear();
+
+ //we can select and finally open the class only when 'ctrl' is pressed
+ if ((e.stateMask & SWT.CTRL) != SWT.CTRL) {
+ return;
+ }
+
+ TreeItem item = getTree().getItem(new Point(e.x, e.y));
+ int index = getSelectedColumnIndex(item, e.x, e.y);
+
+ if (index > 0 /*we check the 2nd and 3rd column only*/ &&
+ item.getParentItem() == null /*we don't check parameters at this moment*/) {
+ String text = item.getText(index);
+ if (JDTUtils.containsClassName(text)) {
+ selectedClassNameTreeItem.setText(text);
+ selectedClassNameTreeItem.setColumnIndex(index);
+ selectedClassNameTreeItem.setTreeItem(item);
+ getTree().setCursor(treeItemCursor.getPointerCursor());
+ redrawTreeItem(item, index);
+ }
+ }
+ }
+ });
+
+ getTree().addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseDown(MouseEvent e) {
+ if (listener != null && (e.stateMask & SWT.CTRL) == SWT.CTRL &&
+ selectedClassNameTreeItem.getText() != null) {
+ listener.treeItemWithClassNameClicked(selectedClassNameTreeItem.getText());
+ } else {
+ TreeItem item = getTree().getItem(new Point(e.x, e.y));
+ updateSelectedTreeItem(item, getSelectedColumnIndex(item, e.x, e.y));
+ }
+ }
+ });
+
+ getTree().addListener(SWT.EraseItem, new Listener() {
+ public void handleEvent(Event event) {
+ if((event.detail & SWT.FOREGROUND) == SWT.FOREGROUND){
+ event.detail &= ~SWT.FOREGROUND;
+ }
+ if ((event.detail & SWT.SELECTED) == SWT.SELECTED) {
+ event.detail &= ~SWT.SELECTED;
+ }
+ }
+ });
+
+ getTree().addListener(SWT.PaintItem, new Listener() {
+ public void handleEvent(Event event) {
+ TreeItem item = (TreeItem) event.item;
+ String text = item.getText(event.index);
+ int xOffset = item.getParentItem() != null? 10: 2;
+ Rectangle rec = item.getBounds(event.index);
+
+ event.gc.setFont(getFont(item, event.index));
+ event.gc.setForeground(getForeground(item, event.index));
+ event.gc.setBackground(getBackground(item, event.index));
+ event.gc.fillRectangle(rec.x, rec.y, rec.width, rec.height);
+ event.gc.drawText(text, event.x + xOffset, event.y, true);
+ }
+ });
+
+ getTree().addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ String text = selectedTreeItem.getText();
+ if (text == null || (e.stateMask & SWT.CTRL) != SWT.CTRL) {
+ return;
+ }
+ if(e.keyCode == 'c' && text.trim().length() > 0) {
+ clipboard.setContents(new Object[] {text}, new Transfer[] {TextTransfer.getInstance()});
+ } else if (e.keyCode == SWT.ARROW_LEFT) {
+ updateSelectedTreeItem(selectedTreeItem.getTreeItem(),
+ Math.max(0, selectedTreeItem.getColumnIndex() - 1));
+ } else if (e.keyCode == SWT.ARROW_RIGHT) {
+ updateSelectedTreeItem(selectedTreeItem.getTreeItem(),
+ Math.min(getTree().getColumnCount() - 1, selectedTreeItem.getColumnIndex() + 1));
+ }
+ }
+ public void keyReleased(KeyEvent e) {
+ selectedClassNameTreeItem.clear();
+ }
+ });
+
+ getTree().addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if ((e.stateMask & SWT.BUTTON1) != SWT.BUTTON1) {
+ updateSelectedTreeItem((TreeItem) e.item,
+ selectedTreeItem.getText() != null?
+ selectedTreeItem.getColumnIndex(): 0);
+ } else if (e.item != selectedTreeItem.getTreeItem() &&
+ selectedTreeItem.getTreeItem() != null) {
+ //we don't change selected item when user has triggered ICapturedEventTreeListener.treeItemWithClassNameClicked
+ getTree().setSelection(selectedTreeItem.getTreeItem());
+ }
+ }
+ });
+
+ getTree().addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ selectedClassNameTreeItem.clear();
+ }
+ });
+ }
+
+ private void updateSelectedTreeItem(TreeItem item, int columnIndex) {
+ if (columnIndex > -1) {
+ selectedTreeItem.clear(); //clear old selection
+ selectedTreeItem.setTreeItem(item);
+ selectedTreeItem.setColumnIndex(columnIndex);
+ selectedTreeItem.setText(item.getText(columnIndex));
+ redrawTreeItem(item, columnIndex);
+ }
+ }
+
+ private Color getForeground(TreeItem item, int index) {
+ if (selectedTreeItem.getTreeItem() == item && selectedTreeItem.getColumnIndex() == index) {
+ return treeItemForeground.getSelectedColor();
+ }
+ if (item.getParentItem() != null) {
+ return treeItemForeground.getParamColor();
+ }
+ return treeItemForeground.getDefaultColor();
+ }
+
+ private Color getBackground(TreeItem item, int index) {
+ if (selectedTreeItem.getTreeItem() == item && selectedTreeItem.getColumnIndex() == index) {
+ return treeItemBackground.getSelectedColor();
+ }
+ return treeItemBackground.getDefaultColor();
+ }
+
+ private Font getFont(TreeItem item, int columnIndex) {
+ if (selectedClassNameTreeItem.getTreeItem() == item &&
+ selectedClassNameTreeItem.getColumnIndex() == columnIndex) {
+ return treeItemFont.getSelectedClassNameFont();
+ }
+ return treeItemFont.getDefaultFont();
+ }
+
+ private void redrawTreeItem(TreeItem item, int columnIndex) {
+ if (item != null && !item.isDisposed()) {
+ Rectangle rec = item.getBounds(columnIndex);
+ getTree().redraw(rec.x, rec.y, rec.width, rec.height, true);
+ }
+ }
+
+ private int getSelectedColumnIndex(TreeItem item, int mouseX, int mouseY) {
+ for (int i=0; item != null && i<getTree().getColumnCount(); i++) {
+ Rectangle rec = item.getBounds(i);
+ if (mouseX >= rec.x && mouseX <= rec.x + rec.width) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public void addEvent(CapturedEvent event) {
+ capturedEvents.add(event);
+ }
+
+ public void setListener(ICapturedEventTreeListener listener) {
+ this.listener = listener;
+ }
+
+ public void removeAll() {
+ capturedEvents.clear();
+ }
+
+ private static class TreeItemForeground {
+ private final Color paramColor;
+
+ private final Color selectedColor;
+
+ private final Color defaultColor;
+
+ public TreeItemForeground(Color paramColor, Color selectedColor, Color defaultColor) {
+ this.paramColor = paramColor;
+ this.selectedColor = selectedColor;
+ this.defaultColor = defaultColor;
+ }
+
+ public Color getParamColor() {
+ return paramColor;
+ }
+
+ public Color getSelectedColor() {
+ return selectedColor;
+ }
+
+ public Color getDefaultColor() {
+ return defaultColor;
+ }
+ }
+
+ private static class TreeItemBackground {
+ private final Color selectedColor;
+
+ private final Color defaultColor;
+
+ public TreeItemBackground(Color selectedColor, Color defaultColor) {
+ this.selectedColor = selectedColor;
+ this.defaultColor = defaultColor;
+ }
+
+ public Color getSelectedColor() {
+ return selectedColor;
+ }
+
+ public Color getDefaultColor() {
+ return defaultColor;
+ }
+ }
+
+ private static class TreeItemCursor {
+ private final Cursor defaultCursor;
+
+ private final Cursor pointerCursor;
+
+ public TreeItemCursor(Cursor defaultCursor, Cursor pointerCursor) {
+ this.defaultCursor = defaultCursor;
+ this.pointerCursor = pointerCursor;
+ }
+
+ public Cursor getDefaultCursor() {
+ return defaultCursor;
+ }
+
+ public Cursor getPointerCursor() {
+ return pointerCursor;
+ }
+ }
+
+ private static class TreeItemFont {
+ private final Font defaultFont;
+
+ private final Font selectedClassNameFont;
+
+ public TreeItemFont(Font defaultFont, Font selectedClassNameFont) {
+ this.defaultFont = defaultFont;
+ this.selectedClassNameFont = selectedClassNameFont;
+ }
+
+ public Font getDefaultFont() {
+ return defaultFont;
+ }
+
+ public Font getSelectedClassNameFont() {
+ return selectedClassNameFont;
+ }
+ }
+
+ private static class SelectedTreeItem {
+ private TreeItem treeItem;
+
+ private int columnIndex;
+
+ private String text;
+
+ public SelectedTreeItem() {
+ clear();
+ }
+
+ public void setTreeItem(TreeItem treeItem) {
+ this.treeItem = treeItem;
+ }
+
+ public TreeItem getTreeItem() {
+ return treeItem;
+ }
+
+ public void setColumnIndex(int columnIndex) {
+ this.columnIndex = columnIndex;
+ }
+
+ public int getColumnIndex() {
+ return columnIndex;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void clear() {
+ treeItem = null;
+ columnIndex = -1;
+ text = null;
+ }
+ }
+}
diff --git a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/model/CapturedEventTreeSelection.java b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/ICapturedEventTreeListener.java
index 02150493..a89d405a 100644
--- a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/model/CapturedEventTreeSelection.java
+++ b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/ICapturedEventTreeListener.java
@@ -1,23 +1,15 @@
-/*******************************************************************************
- * Copyright (c) 2013 IBM Corporation 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.e4.tools.event.spy.internal.model;
-
-public class CapturedEventTreeSelection {
- private final String selection;
-
- public CapturedEventTreeSelection(String selection) {
- this.selection = selection;
- }
-
- public String getSelection() {
- return selection;
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.e4.tools.event.spy.internal.ui;
+
+public interface ICapturedEventTreeListener {
+ void treeItemWithClassNameClicked(String text);
+}
diff --git a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/SpyDialog.java b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/SpyDialog.java
index d499f6ca..7f0df2a4 100644
--- a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/SpyDialog.java
+++ b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/SpyDialog.java
@@ -19,8 +19,6 @@ import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.tools.event.spy.internal.core.EventMonitor;
import org.eclipse.e4.tools.event.spy.internal.model.CapturedEvent;
import org.eclipse.e4.tools.event.spy.internal.model.CapturedEventFilter;
-import org.eclipse.e4.tools.event.spy.internal.model.CapturedEventTreeSelection;
-import org.eclipse.e4.tools.event.spy.internal.model.SpyDialogMemento;
import org.eclipse.e4.tools.event.spy.internal.util.JDTUtils;
import org.eclipse.e4.tools.event.spy.internal.util.LoggerWrapper;
import org.eclipse.jface.dialogs.Dialog;
@@ -181,9 +179,9 @@ public class SpyDialog extends Dialog implements EventMonitor.NewEventListener {
private void createCapturedEventTree(Composite parent) {
capturedEventTree = new CapturedEventTree(outer);
capturedEventTree.getControl().setLayoutData(createDefaultGridData());
- capturedEventTree.setSelectionListener(new CapturedEventTree.SelectionListener() {
- public void selectionChanged(CapturedEventTreeSelection selection) {
- openResource(selection);
+ capturedEventTree.setListener(new ICapturedEventTreeListener() {
+ public void treeItemWithClassNameClicked(String text) {
+ openResource(text);
}
});
}
@@ -221,9 +219,9 @@ public class SpyDialog extends Dialog implements EventMonitor.NewEventListener {
}
@SuppressWarnings("restriction")
- private void openResource(CapturedEventTreeSelection selection) {
+ private void openResource(String text) {
try {
- JDTUtils.openClass(selection.getSelection());
+ JDTUtils.openClass(text);
} catch(ClassNotFoundException exc) {
logger.warn(exc.getMessage());
}
diff --git a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/model/SpyDialogMemento.java b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/SpyDialogMemento.java
index 979e3eaa..a5e437f9 100644
--- a/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/model/SpyDialogMemento.java
+++ b/bundles/org.eclipse.e4.tools.event.spy/src/org/eclipse/e4/tools/event/spy/internal/ui/SpyDialogMemento.java
@@ -8,10 +8,12 @@
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
-package org.eclipse.e4.tools.event.spy.internal.model;
+package org.eclipse.e4.tools.event.spy.internal.ui;
import java.util.Collection;
+import org.eclipse.e4.tools.event.spy.internal.model.CapturedEventFilter;
+
public class SpyDialogMemento {
private String baseTopic;

Back to the top