From 14ac6654b94d143ff67dad82e5b2ae6b754231e4 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 21 Mar 2020 08:42:35 +0100 Subject: [PATCH] refactor ToolTipHandler to allow more control over content --- .../scviewer/database/swt/Constants.java | 1 - .../database/swt/ToolTipContentProvider.java | 10 ++ .../swt/ToolTipTableContentProvider.java | 21 --- .../database/swt/internal/ToolTipHandler.java | 163 +++++------------- .../e4/application/parts/WaveformViewer.java | 97 +++++++---- 5 files changed, 124 insertions(+), 168 deletions(-) create mode 100644 com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/ToolTipContentProvider.java delete mode 100644 com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/ToolTipTableContentProvider.java diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/Constants.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/Constants.java index f2142fc..4abb67c 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/Constants.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/Constants.java @@ -7,7 +7,6 @@ public class Constants { public static final int[] unitMultiplier={1, 3, 10, 30, 100, 300}; public static final String CONTENT_PROVIDER_TAG = "TOOLTIP_CONTENT_PROVIDER"; - public static final String TEXT_PROVIDER_TAG = "TOOLTIP_TEXT_PROVIDER"; public static final String HELP_PROVIDER_TAG = "TOOLTIP_HELP_PROVIDER"; } diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/ToolTipContentProvider.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/ToolTipContentProvider.java new file mode 100644 index 0000000..6d46a31 --- /dev/null +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/ToolTipContentProvider.java @@ -0,0 +1,10 @@ +package com.minres.scviewer.database.swt; + +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Composite; + +public interface ToolTipContentProvider { + + public boolean createContent(Composite parent, Point pt); + +} \ No newline at end of file diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/ToolTipTableContentProvider.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/ToolTipTableContentProvider.java deleted file mode 100644 index 8a9daee..0000000 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/ToolTipTableContentProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.minres.scviewer.database.swt; - -import java.util.List; - -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Widget; - -public interface ToolTipTableContentProvider { - - public ToolTipTableContentProvider initialize(Widget widget, Point pt); - - public String getTableTitle(); - /** - * Get tool tip table content - * @param widget the widget that is under help - * @oaram pt the point where the mouse cursor is located - * @return a list of string arrays of size 2 (content & value) - */ - public List getTableContent(); - -} \ No newline at end of file diff --git a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/ToolTipHandler.java b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/ToolTipHandler.java index 27381fe..23dd0d3 100644 --- a/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/ToolTipHandler.java +++ b/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/swt/internal/ToolTipHandler.java @@ -12,9 +12,12 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; @@ -24,11 +27,11 @@ import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.Widget; import com.minres.scviewer.database.swt.Constants; +import com.minres.scviewer.database.swt.ToolTipContentProvider; import com.minres.scviewer.database.swt.ToolTipHelpTextProvider; -import com.minres.scviewer.database.swt.ToolTipTableContentProvider; class ToolTipHandler { - + private final Display display; private Shell parentShell; private Shell shell; @@ -36,12 +39,12 @@ class ToolTipHandler { private Table table; private TableColumn nameCol; private TableColumn valueCol; - + private Widget tipWidget; // widget this tooltip is hovering over private Point tipPosition; // the position being hovered over private static final int hoverYOffset = 1; - + /** * Creates a new tooltip handler * @@ -49,43 +52,7 @@ class ToolTipHandler { */ public ToolTipHandler(Shell parent) { display = parent.getDisplay(); - this.parentShell = parent; - - shell = new Shell(parent, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL); - GridLayout gridLayout = new GridLayout(); - gridLayout.numColumns = 1; - gridLayout.marginWidth = 2; - gridLayout.marginHeight = 2; - shell.setLayout(gridLayout); - - shell.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); - - label = new Label(shell, SWT.NONE); - label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND)); - label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); - label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL |GridData.VERTICAL_ALIGN_CENTER)); - - final Font font = new Font(Display.getCurrent(), "Terminal", 10, SWT.NORMAL); - table = new Table(shell, SWT.NONE); - table.setHeaderVisible(false); - table.setLinesVisible(true); - table.setFont(font); - table.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND)); - table.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); - table.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - nameCol = new TableColumn(table, SWT.LEFT); - nameCol.setText("Name"); - valueCol = new TableColumn(table, SWT.LEFT); - nameCol.setText("Value"); - - shell.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - Rectangle area = shell.getClientArea(); - valueCol.setWidth(area.width - nameCol.getWidth()); - } - }); + parentShell = parent; } /** @@ -94,83 +61,45 @@ class ToolTipHandler { * @control the control on which to enable hoverhelp */ public void activateHoverHelp(final Control control) { - /* - * Get out of the way if we attempt to activate the control underneath the tooltip - */ - control.addMouseListener(MouseListener.mouseDownAdapter(e -> { - if (shell.isVisible()) - shell.setVisible(false); - })); - /* - * Trap hover events to pop-up tooltip - */ - control.addMouseTrackListener(new MouseTrackAdapter () { + Listener listener = new Listener () { + Shell tip = null; @Override - public void mouseExit(MouseEvent e) { - if (shell.isVisible()) shell.setVisible(false); - tipWidget = null; - } - @Override - public void mouseHover (MouseEvent event) { - Point pt = new Point (event.x, event.y); - Widget widget = event.widget; - if (widget instanceof ToolBar) { - ToolBar w = (ToolBar) widget; - widget = w.getItem (pt); + public void handleEvent (Event event) { + switch (event.type) { + case SWT.Dispose: + case SWT.KeyDown: + case SWT.MouseMove: { + if (tip == null) break; + tip.dispose (); + tip = null; + label = null; + break; } - if (widget instanceof Table) { - Table w = (Table) widget; - widget = w.getItem (pt); - } - if (widget instanceof Tree) { - Tree w = (Tree) widget; - widget = w.getItem (pt); - } - if (widget == null) { - shell.setVisible(false); - tipWidget = null; - return; - } - Point newPos = control.toDisplay(pt); - if(shell.isFocusControl()) return; - if (widget == tipWidget && tipPosition.equals(newPos) && shell.isVisible()) return; - tipWidget = widget; - tipPosition = newPos; - boolean showDialog = false; - Object o = widget.getData(Constants.CONTENT_PROVIDER_TAG); - if(o != null) { - ToolTipTableContentProvider provider = ((ToolTipTableContentProvider)o).initialize(widget, pt); - label.setText(provider.getTableTitle()); - table.setRedraw(false); - table.removeAll(); - for (String[] strings : provider.getTableContent()) { - if(strings.length>0) { - showDialog=true; - TableItem item = new TableItem(table, SWT.NONE); - item.setText(0, strings[0]); - if(strings.length>1) - item.setText(1, strings[1]); - } + case SWT.MouseHover: { + Object o = control.getData(Constants.CONTENT_PROVIDER_TAG); + if(o != null && o instanceof ToolTipContentProvider) { + ToolTipContentProvider provider = ((ToolTipContentProvider)o); + Point pt = new Point (event.x, event.y); + tipPosition = control.toDisplay(pt); + if (tip != null && !tip.isDisposed ()) tip.dispose (); + tip = new Shell (parentShell, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL); + tip.setBackground (display.getSystemColor (SWT.COLOR_INFO_BACKGROUND)); + RowLayout layout=new RowLayout(SWT.VERTICAL); + layout.fill=true; + tip.setLayout(layout); + boolean visible = provider.createContent(tip, pt); + tip.pack(); + setHoverLocation(tip, tipPosition); + tip.setVisible (visible); } - nameCol.pack(); - valueCol.pack(); - table.setRedraw(true); - table.setVisible(true); - } else { - table.setVisible(false); } - String text = (String) widget.getData(Constants.TEXT_PROVIDER_TAG); - if(text != null) { - label.setText(text != null ? text : "Hover test should go here"); - showDialog=true; - } - if(showDialog) { - shell.pack(); - setHoverLocation(shell, tipPosition); - shell.setVisible(true); } } - }); + }; + control.addListener (SWT.Dispose, listener); + control.addListener (SWT.KeyDown, listener); + control.addListener (SWT.MouseMove, listener); + control.addListener (SWT.MouseHover, listener); /* * Trap F1 Help to pop up a custom help box @@ -193,11 +122,11 @@ class ToolTipHandler { helpShell.open(); } }); -// control.addKeyListener(KeyListener.keyPressedAdapter( e-> { -// if (e.keyCode == SWT.F2 && shell.isVisible()) { -// shell.setFocus(); -// } -// })); + // control.addKeyListener(KeyListener.keyPressedAdapter( e-> { + // if (e.keyCode == SWT.F2 && shell.isVisible()) { + // shell.setFocus(); + // } + // })); } /** diff --git a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java index ef059fa..f1abb83 100644 --- a/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java +++ b/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java @@ -65,13 +65,21 @@ import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Widget; import com.minres.scviewer.database.DataType; @@ -84,7 +92,8 @@ import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbFactory; import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.swt.Constants; -import com.minres.scviewer.database.swt.ToolTipTableContentProvider; +import com.minres.scviewer.database.swt.ToolTipContentProvider; +import com.minres.scviewer.database.swt.ToolTipHelpTextProvider; import com.minres.scviewer.database.swt.WaveformViewerFactory; import com.minres.scviewer.database.ui.GotoDirection; import com.minres.scviewer.database.ui.ICursor; @@ -372,35 +381,41 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis waveformPane.addDisposeListener(this); - waveformPane.getWaveformControl().setData(Constants.CONTENT_PROVIDER_TAG, new ToolTipTableContentProvider() { - private List res; - + waveformPane.getWaveformControl().setData(Constants.CONTENT_PROVIDER_TAG, new ToolTipHelpTextProvider() { @Override - public ToolTipTableContentProvider initialize(Widget widget, Point pt) { - res = waveformPane.getElementsAt(pt); - return this; + public String getHelpText(Widget widget) { + return "Waveform pane: press F2 to set the focus to the tooltip"; } - + }); + waveformPane.getWaveformControl().setData(Constants.CONTENT_PROVIDER_TAG, new ToolTipContentProvider() { @Override - public String getTableTitle() { - if(res.size()>0) { - Object o = res.get(0); - if(o instanceof ITx) { - ITx tx = (ITx)o; - return tx.toString(); - } - } - return ""; - } + public boolean createContent(Composite parent, Point pt) { + List res = waveformPane.getElementsAt(pt); + if(res.size()>0) + if(res.get(0) instanceof ITx) { + ITx tx = (ITx)res.get(0); + final Display display = parent.getDisplay(); + final Font font = new Font(Display.getCurrent(), "Terminal", 10, SWT.NORMAL); + + final Label label = new Label(parent, SWT.NONE); + label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + label.setText(tx.toString()); + label.setFont(font); + + final Table table = new Table(parent, SWT.NONE); + table.setHeaderVisible(true); + table.setLinesVisible(true); + table.setFont(font); + table.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + table.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + table.setRedraw(false); + + final TableColumn nameCol = new TableColumn(table, SWT.LEFT); + nameCol.setText("Attribute"); + final TableColumn valueCol = new TableColumn(table, SWT.LEFT); + valueCol.setText("Value"); - @Override - public List getTableContent() { - final ArrayList ret = new ArrayList<>(); - if(res.size()>0){ - Object o = res.get(0); - if(o instanceof ITx) { - ITx tx = (ITx)o; - ret.add(new String[]{"type", tx.getGenerator().getName()}); for (ITxAttribute iTxAttribute : tx.getAttributes()) { String value = iTxAttribute.getValue().toString(); if((DataType.UNSIGNED == iTxAttribute.getDataType() || DataType.INTEGER==iTxAttribute.getDataType()) && !"0".equals(value)) { @@ -408,11 +423,35 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis value += " [0x"+Long.toHexString(Long.parseLong(iTxAttribute.getValue().toString()))+"]"; } catch(NumberFormatException e) { } } - ret.add(new String[]{iTxAttribute.getName(), value}); + TableItem item = new TableItem(table, SWT.NONE); + item.setText(0, iTxAttribute.getName()); + item.setText(1, value); } + nameCol.pack(); + valueCol.pack(); + table.setRedraw(true); + + parent.addPaintListener(new PaintListener() { + @Override + public void paintControl(PaintEvent e) { + Rectangle area = parent.getClientArea(); + valueCol.setWidth(area.width - nameCol.getWidth()); + } + }); + return true; + } else if(res.get(0) instanceof TrackEntry) { + TrackEntry te = (TrackEntry)res.get(0); + final Display display = parent.getDisplay(); + final Font font = new Font(Display.getCurrent(), "Terminal", 10, SWT.NORMAL); + + final Label label = new Label(parent, SWT.NONE); + label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + label.setText(te.waveform.getFullName()); + label.setFont(font); + return true; } - } - return ret; + return false; } }); }