Merge branch 'feature/add_hover_to_transaction' into develop
This commit is contained in:
		| @@ -2,7 +2,7 @@ Manifest-Version: 1.0 | ||||
| Bundle-ManifestVersion: 2 | ||||
| Bundle-Name: SWT widget | ||||
| Bundle-SymbolicName: com.minres.scviewer.database.ui.swt | ||||
| Bundle-Version: 2.1.0.qualifier | ||||
| Bundle-Version: 2.2.0.qualifier | ||||
| Bundle-Vendor: MINRES Technologies GmbH | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Require-Bundle: org.eclipse.swt;bundle-version="3.103.1", | ||||
|   | ||||
| @@ -8,5 +8,5 @@ | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<relativePath>../com.minres.scviewer.parent</relativePath> | ||||
|   </parent> | ||||
|   <version>2.1.0-SNAPSHOT</version> | ||||
|   <version>2.2.0-SNAPSHOT</version> | ||||
| </project> | ||||
| @@ -2,8 +2,11 @@ package com.minres.scviewer.database.swt; | ||||
|  | ||||
| public class Constants { | ||||
|  | ||||
| 	public final static String[] unitString={"fs", "ps", "ns", "us", "ms"};//, "s"}; | ||||
| 	public static final String[] unitString={"fs", "ps", "ns", "us", "ms"};//, "s"}; | ||||
|      | ||||
|     public final static int[] unitMultiplier={1, 3, 10, 30, 100, 300}; | ||||
|     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 HELP_PROVIDER_TAG = "TOOLTIP_HELP_PROVIDER"; | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,12 @@ | ||||
| package com.minres.scviewer.database.swt; | ||||
|  | ||||
| import org.eclipse.swt.widgets.Widget; | ||||
|  | ||||
| public interface ToolTipHelpTextProvider { | ||||
| 	/** | ||||
| 	 * Get help text | ||||
| 	 * @param widget the widget that is under help | ||||
| 	 * @return a help text string | ||||
| 	 */ | ||||
| 	public String getHelpText(Widget widget); | ||||
| } | ||||
| @@ -0,0 +1,73 @@ | ||||
| package com.minres.scviewer.database.swt.internal; | ||||
|  | ||||
| import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.eclipse.swt.SWT; | ||||
| import org.eclipse.swt.layout.RowLayout; | ||||
| import org.eclipse.swt.widgets.Button; | ||||
| import org.eclipse.swt.widgets.Dialog; | ||||
| import org.eclipse.swt.widgets.Display; | ||||
| import org.eclipse.swt.widgets.Label; | ||||
| import org.eclipse.swt.widgets.List; | ||||
| import org.eclipse.swt.widgets.Shell; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxRelation; | ||||
|  | ||||
| class RelSelectionDialog extends Dialog { | ||||
| 	private java.util.List<ITxRelation> entries; | ||||
| 	 | ||||
| 	private java.util.List<ITx> entryTx; | ||||
| 	 | ||||
| 	private ITxRelation selected = null; | ||||
| 	 | ||||
| 	public RelSelectionDialog(Shell shell, ArrayList<ITxRelation> candidates, boolean target) { | ||||
| 		super(shell); | ||||
| 		entries = candidates; | ||||
| 		entryTx = entries.stream().map(r->target?r.getTarget():r.getSource()).collect(Collectors.toCollection(ArrayList::new)); | ||||
| 	} | ||||
|  | ||||
| public ITxRelation open() { | ||||
|     Shell parent = getParent(); | ||||
|     Shell dialog = new Shell(parent, SWT.SHEET | SWT.APPLICATION_MODAL); | ||||
|     dialog.setMinimumSize(10, 10); | ||||
|      | ||||
|     RowLayout rowLayout = new RowLayout(SWT.VERTICAL); | ||||
|     //rowLayout.fill = true; // Overriding default values. | ||||
|     rowLayout.marginWidth=3; | ||||
|     rowLayout.marginHeight=0; | ||||
|     rowLayout.marginLeft = 3; | ||||
|     rowLayout.marginTop = 0; | ||||
|     rowLayout.marginRight = 3; | ||||
|     rowLayout.marginBottom = 0; | ||||
|     dialog.setLayout(rowLayout); | ||||
|     final Label lbl = new Label(dialog,SWT.NONE); | ||||
|     lbl.setText("Select one:"); | ||||
|     final List list = new List (dialog, SWT.NONE); | ||||
|     for (ITx iTx : entryTx) { | ||||
|     	list.add ("#tx" + iTx.getId()+" ("+iTx.getStream().getFullName()+")"); | ||||
| 	} | ||||
| 	list.addListener (SWT.Selection, e -> { | ||||
| 		int selection = list.getSelectionIndex(); | ||||
| 		if(selection>=0) { | ||||
| 			selected=entries.get(selection); | ||||
| 			dialog.close(); | ||||
| 		} | ||||
| 	}); | ||||
| 	final Button bt = new Button(dialog, SWT.PUSH | SWT.RIGHT); | ||||
| 	bt.setText("Dismiss"); | ||||
| 	bt.setAlignment(SWT.CENTER); | ||||
| 	bt.addSelectionListener(widgetSelectedAdapter(e -> dialog.close())); | ||||
| 	dialog.pack(); | ||||
|     dialog.open(); | ||||
|     Display display = parent.getDisplay(); | ||||
|     while (!dialog.isDisposed()) { | ||||
|       if (!display.readAndDispatch()) | ||||
|         display.sleep(); | ||||
|     } | ||||
|     return selected; | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,140 @@ | ||||
| package com.minres.scviewer.database.swt.internal; | ||||
|  | ||||
| import org.eclipse.swt.SWT; | ||||
| import org.eclipse.swt.graphics.Point; | ||||
| import org.eclipse.swt.graphics.Rectangle; | ||||
| import org.eclipse.swt.layout.FillLayout; | ||||
| 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; | ||||
| 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; | ||||
|  | ||||
| class ToolTipHandler { | ||||
|  | ||||
| 	private final Display display; | ||||
| 	private Shell  parentShell; | ||||
| 	private Shell  shell; | ||||
|  | ||||
| 	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 | ||||
| 	 * | ||||
| 	 * @param parent the parent Shell | ||||
| 	 */ | ||||
| 	public ToolTipHandler(Shell parent) { | ||||
| 		display = parent.getDisplay(); | ||||
| 		parentShell = parent; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Enables customized hover help for a specified control | ||||
| 	 * | ||||
| 	 * @control the control on which to enable hoverhelp | ||||
| 	 */ | ||||
| 	public void activateHoverHelp(final Control control) { | ||||
| 		Listener listener = new Listener () { | ||||
| 			Shell tip = null; | ||||
| 			@Override | ||||
| 			public void handleEvent (Event event) { | ||||
| 				switch (event.type) { | ||||
| 				case SWT.KeyDown:{ | ||||
| 					if (tip != null && tip.isVisible() && event.keyCode == SWT.F2) { | ||||
| 						tip.setFocus(); | ||||
| 						break; | ||||
| 					}  | ||||
| 				} | ||||
| 				case SWT.Dispose: | ||||
| 				case SWT.MouseMove: | ||||
| 				case SWT.MouseDown: { | ||||
| 					if (tip != null){ | ||||
| 						tip.dispose (); | ||||
| 						tip = null; | ||||
| 						tipWidget=null; | ||||
| 					} | ||||
| 					break; | ||||
| 				} | ||||
| 				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); | ||||
| 						if(visible) | ||||
| 							tipWidget=event.widget; | ||||
| 					} | ||||
| 				} | ||||
| 				} | ||||
| 			} | ||||
| 		}; | ||||
| 		control.addListener (SWT.Dispose, listener); | ||||
| 		control.addListener (SWT.KeyDown, listener); | ||||
| 		//control.addListener (SWT.MouseMove, listener); | ||||
| 		control.addListener (SWT.MouseHover, listener); | ||||
| 		control.addListener (SWT.MouseDown, listener); | ||||
|  | ||||
| 		/* | ||||
| 		 * Trap F1 Help to pop up a custom help box | ||||
| 		 */ | ||||
| 		control.addHelpListener(event -> { | ||||
| 			if (tipWidget == null) return; | ||||
| 			ToolTipHelpTextProvider handler = (ToolTipHelpTextProvider)tipWidget.getData(Constants.HELP_PROVIDER_TAG); | ||||
| 			if (handler == null) return; | ||||
| 			String text = handler.getHelpText(tipWidget); | ||||
| 			if (text == null) return; | ||||
|  | ||||
| 			if (shell.isVisible()) { | ||||
| 				shell.setVisible(false); | ||||
| 				Shell helpShell = new Shell(parentShell, SWT.SHELL_TRIM); | ||||
| 				helpShell.setLayout(new FillLayout()); | ||||
| 				Label label = new Label(helpShell, SWT.NONE); | ||||
| 				label.setText(text); | ||||
| 				helpShell.pack(); | ||||
| 				setHoverLocation(helpShell, tipPosition); | ||||
| 				helpShell.open(); | ||||
| 			} | ||||
| 		}); | ||||
| 		//		control.addKeyListener(KeyListener.keyPressedAdapter( e-> { | ||||
| 		//				if (e.keyCode == SWT.F2 && shell.isVisible()) { | ||||
| 		//                    shell.setFocus(); | ||||
| 		//                } | ||||
| 		//		})); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Sets the location for a hovering shell | ||||
| 	 * @param shell the object that is to hover | ||||
| 	 * @param position the position of a widget to hover over | ||||
| 	 * @return the top-left location for a hovering box | ||||
| 	 */ | ||||
| 	private void setHoverLocation(Shell shell, Point position) { | ||||
| 		Rectangle displayBounds = shell.getDisplay().getBounds(); | ||||
| 		Rectangle shellBounds = shell.getBounds(); | ||||
| 		shellBounds.x = Math.max(Math.min(position.x, displayBounds.width - shellBounds.width), 0); | ||||
| 		shellBounds.y = Math.max(Math.min(position.y + hoverYOffset, displayBounds.height - shellBounds.height), 0); | ||||
| 		shell.setBounds(shellBounds); | ||||
| 	} | ||||
| } | ||||
| @@ -426,7 +426,7 @@ public class WaveformCanvas extends Canvas{ | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public List<Object> getClicked(Point point) { | ||||
|     public List<Object> getElementsAt(Point point) { | ||||
|     	LinkedList<Object> result=new LinkedList<>(); | ||||
|         for (IPainter p : Lists.reverse(painterList)) { | ||||
|             if (p instanceof TrackAreaPainter) { | ||||
|   | ||||
| @@ -15,6 +15,7 @@ import java.beans.PropertyChangeEvent; | ||||
| import java.beans.PropertyChangeListener; | ||||
| import java.beans.PropertyChangeSupport; | ||||
| import java.text.DecimalFormat; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| @@ -24,6 +25,7 @@ import java.util.Map.Entry; | ||||
| import java.util.NavigableMap; | ||||
| import java.util.NoSuchElementException; | ||||
| import java.util.TreeMap; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import org.eclipse.core.runtime.ListenerList; | ||||
| import org.eclipse.jface.util.LocalSelectionTransfer; | ||||
| @@ -97,7 +99,7 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
|  | ||||
| 	private PropertyChangeSupport pcs; | ||||
|  | ||||
| 	static final DecimalFormat df = new DecimalFormat("#.00####");  | ||||
| 	static final DecimalFormat df = new DecimalFormat("#0.00####");  | ||||
|  | ||||
| 	private ITx currentTxSelection; | ||||
|  | ||||
| @@ -115,6 +117,8 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
|  | ||||
| 	final WaveformCanvas waveformCanvas; | ||||
|  | ||||
| 	final ToolTipHandler toolTipHandler; | ||||
| 	 | ||||
| 	private boolean revealSelected=false; | ||||
| 	 | ||||
| 	private Composite top; | ||||
| @@ -159,7 +163,7 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
| 			down=true; | ||||
| 			if((e.stateMask&SWT.MODIFIER_MASK)!=0) return; //don't react on modifier | ||||
| 			if (e.button ==  1) {	 | ||||
| 				initialSelected = waveformCanvas.getClicked(start); | ||||
| 				initialSelected = waveformCanvas.getElementsAt(start); | ||||
| 			} else if (e.button == 3) { | ||||
| 				Menu topMenu= top.getMenu(); | ||||
| 				if(topMenu!=null) topMenu.setVisible(true); | ||||
| @@ -248,7 +252,7 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
| 		protected long snapOffsetToEvent(Point p) { | ||||
| 			long time= waveformCanvas.getTimeForOffset(p.x); | ||||
| 			long scaling=5*waveformCanvas.getScaleFactor(); | ||||
| 			for(Object o:waveformCanvas.getClicked(p)){ | ||||
| 			for(Object o:waveformCanvas.getElementsAt(p)){ | ||||
| 				Entry<Long, ?> floorEntry=null, ceilEntry=null; | ||||
| 				if(o instanceof TrackEntry){  | ||||
| 					TrackEntry entry = (TrackEntry) o; | ||||
| @@ -417,6 +421,9 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
| 		createStreamDropTarget(valueList); | ||||
| 		createWaveformDragSource(waveformCanvas); | ||||
| 		createWaveformDropTarget(waveformCanvas); | ||||
| 		 | ||||
| 		toolTipHandler = new ToolTipHandler(parent.getShell()); | ||||
| 		toolTipHandler.activateHoverHelp(waveformCanvas); | ||||
| 	} | ||||
|  | ||||
| 	private Composite createTextPane(SashForm leftSash, String text) { | ||||
| @@ -809,25 +816,41 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
| 			} else { | ||||
| 				if (direction == GotoDirection.NEXT) { | ||||
| 					Collection<ITxRelation>  outRel=currentTxSelection.getOutgoingRelations(); | ||||
| 					for(ITxRelation rel:outRel){ | ||||
| 						if(relationType.equals(rel.getRelationType())){ | ||||
| 							setSelection(new StructuredSelection(rel.getTarget()), true); | ||||
| 							return; | ||||
| 						} | ||||
| 					} | ||||
| 					ITxRelation tx = selectTxToNavigateTo(outRel, relationType, true); | ||||
| 					if(tx!=null) setSelection(new StructuredSelection(tx.getTarget()), true); | ||||
| 				} else if (direction == GotoDirection.PREV) { | ||||
| 					Collection<ITxRelation>  inRel=currentTxSelection.getIncomingRelations(); | ||||
| 					for(ITxRelation rel:inRel){ | ||||
| 						if(relationType.equals(rel.getRelationType())){ | ||||
| 							setSelection(new StructuredSelection(rel.getSource()), true); | ||||
| 							return; | ||||
| 						} | ||||
| 					} | ||||
| 					ITxRelation tx = selectTxToNavigateTo(inRel, relationType, false); | ||||
| 					if(tx!=null) setSelection(new StructuredSelection(tx.getSource()), true); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private ITxRelation selectTxToNavigateTo(Collection<ITxRelation> rel, RelationType relationType, boolean target) { | ||||
| 		ArrayList<ITxRelation> candidates = rel.stream().filter(r -> relationType.equals(r.getRelationType())).collect(Collectors.toCollection(ArrayList::new)); | ||||
| 		//new RelSelectionDialog(waveformCanvas.getShell(), candidates, target).open(); | ||||
| 		switch (candidates.size()) { | ||||
| 		case 0: return null; | ||||
| 		case 1: return candidates.get(0); | ||||
| 		default: | ||||
| 			ArrayList<ITxRelation> visibleCandidates = candidates.stream().filter(r -> streamsVisible(r)).collect(Collectors.toCollection(ArrayList::new)); | ||||
| 			if(visibleCandidates.size()==0) { | ||||
| 				return new RelSelectionDialog(waveformCanvas.getShell(), candidates, target).open(); | ||||
| 			} else if(visibleCandidates.size()==1) { | ||||
| 				return visibleCandidates.size()==1?visibleCandidates.get(0):null; | ||||
| 			} else { | ||||
| 				return new RelSelectionDialog(waveformCanvas.getShell(), visibleCandidates, target).open(); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	private boolean streamsVisible(ITxRelation relation) { | ||||
| 		final ITxStream<ITxEvent> src = relation.getSource().getStream(); | ||||
| 		final ITxStream<ITxEvent> tgt = relation.getTarget().getStream(); | ||||
| 		return streams.stream().anyMatch(x -> x.waveform == src) && streams.stream().anyMatch(x -> x.waveform == tgt); | ||||
| 	} | ||||
|  | ||||
| 	/* (non-Javadoc) | ||||
| 	 * @see com.minres.scviewer.database.swt.IWaveformPanel#moveCursor(com.minres.scviewer.database.swt.GotoDirection) | ||||
| 	 */ | ||||
| @@ -1130,6 +1153,10 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| 	public List<Object> getElementsAt(Point pt){ | ||||
| 		return waveformCanvas.getElementsAt(pt); | ||||
| 	} | ||||
| 	 | ||||
| 	private void createWaveformDragSource(final Canvas canvas) { | ||||
| 		Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() }; | ||||
| 		DragSource dragSource = new DragSource(canvas, DND.DROP_MOVE); | ||||
| @@ -1137,7 +1164,7 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
| 		dragSource.addDragListener(new DragSourceAdapter() { | ||||
| 			public void dragStart(DragSourceEvent event) { | ||||
| 				event.doit = false; | ||||
| 				List<Object> clicked = waveformCanvas.getClicked(new Point(event.x, event.y)); | ||||
| 				List<Object> clicked = waveformCanvas.getElementsAt(new Point(event.x, event.y)); | ||||
| 				for(Object o:clicked){ | ||||
| 					if(o instanceof CursorPainter){ | ||||
| 						LocalSelectionTransfer.getTransfer().setSelection(new StructuredSelection(o)); | ||||
| @@ -1150,7 +1177,7 @@ public class WaveformViewer implements IWaveformViewer  { | ||||
|  | ||||
| 			public void dragSetData(DragSourceEvent event) { | ||||
| 				if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) { | ||||
| 					event.data=waveformCanvas.getClicked(new Point(event.x, event.y));  | ||||
| 					event.data=waveformCanvas.getElementsAt(new Point(event.x, event.y));  | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
|   | ||||
| @@ -18,6 +18,7 @@ import org.eclipse.jface.viewers.ISelection; | ||||
| import org.eclipse.jface.viewers.ISelectionChangedListener; | ||||
| import org.eclipse.jface.viewers.ISelectionProvider; | ||||
| import org.eclipse.swt.events.DisposeListener; | ||||
| import org.eclipse.swt.graphics.Point; | ||||
| import org.eclipse.swt.graphics.RGB; | ||||
| import org.eclipse.swt.widgets.Control; | ||||
|  | ||||
| @@ -62,6 +63,8 @@ public interface IWaveformViewer extends PropertyChangeListener, ISelectionProvi | ||||
|  | ||||
| 	public TrackEntry getEntryForStream(IWaveform source); | ||||
| 	 | ||||
| 	public List<Object> getElementsAt(Point pt); | ||||
| 	 | ||||
| 	public void moveSelectedTrack(int i); | ||||
| 	 | ||||
|     public void setHighliteRelation(RelationType relationType); | ||||
|   | ||||
| @@ -123,17 +123,22 @@ | ||||
|         </children> | ||||
|       </children> | ||||
|       <children xsi:type="menu:ToolBar" xmi:id="_oQdMUHcqEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.toolbar.1"> | ||||
|         <children xsi:type="menu:HandledToolItem" xmi:id="_5DrGQHf4EeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledtoolitem.zoomfit" label="Zoom out" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/zoom.png" tooltip="Restore default zoom level" command="_693GoHcqEeWwZ-9vrAR2UQ"> | ||||
|         <children xsi:type="menu:HandledToolItem" xmi:id="_5DrGQHf4EeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledtoolitem.zoomfit" label="Zoom out" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/magnifier.png" tooltip="Restore default zoom level" command="_693GoHcqEeWwZ-9vrAR2UQ"> | ||||
|           <parameters xmi:id="_5DrGQXf4EeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.14" name="com.minres.scviewer.e4.application.command.zoomcommand.parameter.level" value="fit"/> | ||||
|         </children> | ||||
|         <children xsi:type="menu:ToolBarSeparator" xmi:id="_p1AvUHcqEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.toolbarseparator.1"/> | ||||
|         <children xsi:type="menu:HandledToolItem" xmi:id="_XMQPAHcrEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledtoolitem.zoomin" label="Zoom in" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/zoom_in.png" tooltip="Zoom in by a factor of 3" command="_693GoHcqEeWwZ-9vrAR2UQ"> | ||||
|         <children xsi:type="menu:HandledToolItem" xmi:id="_XMQPAHcrEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledtoolitem.zoomin" label="Zoom in" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/magnifier_zoom_in.png" tooltip="Zoom in by a factor of 3" command="_693GoHcqEeWwZ-9vrAR2UQ"> | ||||
|           <parameters xmi:id="_fi5w4HcrEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.15" name="com.minres.scviewer.e4.application.command.zoomcommand.parameter.level" value="in"/> | ||||
|         </children> | ||||
|         <children xsi:type="menu:HandledToolItem" xmi:id="_XqTc8HcrEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledtoolitem.zoomout" label="Zoom out" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/zoom_out.png" tooltip="Zoom out by a factor of 3" command="_693GoHcqEeWwZ-9vrAR2UQ"> | ||||
|         <children xsi:type="menu:HandledToolItem" xmi:id="_XqTc8HcrEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledtoolitem.zoomout" label="Zoom out" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/magifier_zoom_out.png" tooltip="Zoom out by a factor of 3" command="_693GoHcqEeWwZ-9vrAR2UQ"> | ||||
|           <parameters xmi:id="_d7OBYHcrEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.14" name="com.minres.scviewer.e4.application.command.zoomcommand.parameter.level" value="out"/> | ||||
|         </children> | ||||
|       </children> | ||||
|       <children xsi:type="menu:ToolBar" xmi:id="_fwn8wGtTEeqmlpoaaMHoiw" elementId="com.minres.scviewer.e4.application.toolbar.2"> | ||||
|         <children xsi:type="menu:HandledToolItem" xmi:id="_j-XIgGtTEeqmlpoaaMHoiw" elementId="com.minres.scviewer.e4.application.handledtoolitem.hover" label="Hover" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/lightbulb.png" tooltip="Enable hover window in waveform" selected="true" type="Check" command="_uyeyYGtTEeqmlpoaaMHoiw"> | ||||
|           <tags>EnableHover</tags> | ||||
|         </children> | ||||
|       </children> | ||||
|     </trimBars> | ||||
|     <trimBars xmi:id="_JHMt8HS8EeWBq8z1Dv39LA" elementId="org.eclipse.ui.trim.status" side="Bottom"> | ||||
|       <children xsi:type="menu:ToolControl" xmi:id="_YsBi8HfLEeWwZ-9vrAR2UQ" elementId="org.eclipse.ui.StatusLine" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.internal.status.WaveStatusBarControl"> | ||||
| @@ -156,6 +161,7 @@ | ||||
|   <handlers xmi:id="_UUnX8IoNEeWxJ_wPkM6yGQ" elementId="com.minres.scviewer.e4.application.handler.set_them" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.handlers.ThemeSetHandler" command="_KlGlsIoNEeWxJ_wPkM6yGQ"/> | ||||
|   <handlers xmi:id="_V4EscIuGEeWid7xO48ZBXw" elementId="com.minres.scviewer.e4.application.handler.setreleationtype" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.handlers.SetRelationTypeHandler" command="_E9lUgIt2EeWid7xO48ZBXw"/> | ||||
|   <handlers xmi:id="__99WoJebEeW09eyIbHsdvg" elementId="com.minres.scviewer.e4.application.handler.loadStoreSettings" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.handlers.LoadStoreSettingsHandler" command="_7-AIMJebEeW09eyIbHsdvg"/> | ||||
|   <handlers xmi:id="_x4pSEGtTEeqmlpoaaMHoiw" elementId="com.minres.scviewer.e4.application.handler.0" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.handlers.EnableHover" command="_uyeyYGtTEeqmlpoaaMHoiw"/> | ||||
|   <bindingTables xmi:id="_95PfvnNmEeWBq8z1Dv39LA" bindingContext="_95PfuXNmEeWBq8z1Dv39LA"> | ||||
|     <bindings xmi:id="_95Pfv3NmEeWBq8z1Dv39LA" elementId="com.minres.scviewer.e4.application.keybinding.quit" keySequence="M1+Q" command="_95PfvHNmEeWBq8z1Dv39LA"> | ||||
|       <tags>type:user</tags> | ||||
| @@ -286,6 +292,7 @@ | ||||
|   <commands xmi:id="_4C_asM3ZEei6rfTGo88R-w" elementId="com.minres.scviewer.e4.application.command.changevaluedisplay" commandName="Change Value Display Command"> | ||||
|     <parameters xmi:id="_4C_asc3ZEei6rfTGo88R-w" elementId="com.minres.scviewer.e4.application.commandparameter.changevaluedisplay" name="Type" optional="false"/> | ||||
|   </commands> | ||||
|   <commands xmi:id="_uyeyYGtTEeqmlpoaaMHoiw" elementId="com.minres.scviewer.e4.application.command.enablehover" commandName="Enable hover" description="Enable hover window in waveform"/> | ||||
|   <addons xmi:id="_95PfsnNmEeWBq8z1Dv39LA" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/> | ||||
|   <addons xmi:id="_95Pfs3NmEeWBq8z1Dv39LA" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/> | ||||
|   <addons xmi:id="_95PftHNmEeWBq8z1Dv39LA" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/> | ||||
|   | ||||
| @@ -2,37 +2,37 @@ Manifest-Version: 1.0 | ||||
| Bundle-ManifestVersion: 2 | ||||
| Bundle-Name: %Bundle-Name | ||||
| Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true | ||||
| Bundle-Version: 2.3.0.qualifier | ||||
| Bundle-Version: 2.4.0.qualifier | ||||
| Bundle-Vendor: %Bundle-Vendor | ||||
| Require-Bundle: javax.inject;bundle-version="1.0.0", | ||||
|   org.eclipse.core.runtime;bundle-version="3.11.1", | ||||
|   org.eclipse.swt;bundle-version="3.104.1", | ||||
|   org.eclipse.e4.ui.model.workbench;bundle-version="1.1.100", | ||||
|   org.eclipse.jface;bundle-version="3.11.0", | ||||
|   org.eclipse.e4.ui.services;bundle-version="1.2.0", | ||||
|   org.eclipse.e4.ui.workbench;bundle-version="1.3.0", | ||||
|   org.eclipse.e4.core.di;bundle-version="1.5.0", | ||||
|   org.eclipse.e4.ui.di;bundle-version="1.1.0", | ||||
|   org.eclipse.e4.core.contexts;bundle-version="1.4.0", | ||||
|   com.minres.scviewer.database.ui.swt;bundle-version="1.0.0", | ||||
|   com.minres.scviewer.database.ui, | ||||
|   com.minres.scviewer.database;bundle-version="1.0.0", | ||||
|   org.eclipse.equinox.ds;bundle-version="1.4.300", | ||||
|   org.eclipse.equinox.util;bundle-version="1.0.500", | ||||
|   org.eclipse.osgi.services;bundle-version="3.5.0", | ||||
|   org.eclipse.e4.core.services;bundle-version="2.0.0", | ||||
|   org.eclipse.osgi.services;bundle-version="3.5.0", | ||||
|   org.eclipse.core.jobs, | ||||
|   org.eclipse.osgi, | ||||
|   com.google.guava, | ||||
|   org.eclipse.equinox.preferences, | ||||
|   org.eclipse.core.expressions, | ||||
|   org.eclipse.e4.core.commands;bundle-version="0.11.0", | ||||
|   org.eclipse.e4.ui.workbench.addons.swt, | ||||
|   com.opcoach.e4.preferences, | ||||
|   org.eclipse.e4.core.di.extensions, | ||||
|   org.eclipse.e4.ui.css.swt.theme;bundle-version="0.10.0" | ||||
|  org.eclipse.core.runtime;bundle-version="3.11.1", | ||||
|  org.eclipse.swt;bundle-version="3.104.1", | ||||
|  org.eclipse.e4.ui.model.workbench;bundle-version="1.1.100", | ||||
|  org.eclipse.jface;bundle-version="3.11.0", | ||||
|  org.eclipse.e4.ui.services;bundle-version="1.2.0", | ||||
|  org.eclipse.e4.ui.workbench;bundle-version="1.3.0", | ||||
|  org.eclipse.e4.core.di;bundle-version="1.5.0", | ||||
|  org.eclipse.e4.ui.di;bundle-version="1.1.0", | ||||
|  org.eclipse.e4.core.contexts;bundle-version="1.4.0", | ||||
|  com.minres.scviewer.database.ui.swt;bundle-version="1.0.0", | ||||
|  com.minres.scviewer.database.ui, | ||||
|  com.minres.scviewer.database;bundle-version="1.0.0", | ||||
|  org.eclipse.equinox.ds;bundle-version="1.4.300", | ||||
|  org.eclipse.equinox.util;bundle-version="1.0.500", | ||||
|  org.eclipse.osgi.services;bundle-version="3.5.0", | ||||
|  org.eclipse.e4.core.services;bundle-version="2.0.0", | ||||
|  org.eclipse.osgi.services;bundle-version="3.5.0", | ||||
|  org.eclipse.core.jobs, | ||||
|  org.eclipse.osgi, | ||||
|  com.google.guava, | ||||
|  org.eclipse.equinox.preferences, | ||||
|  org.eclipse.core.expressions, | ||||
|  org.eclipse.e4.core.commands;bundle-version="0.11.0", | ||||
|  org.eclipse.e4.ui.workbench.addons.swt, | ||||
|  com.opcoach.e4.preferences, | ||||
|  org.eclipse.e4.core.di.extensions, | ||||
|  org.eclipse.e4.ui.css.swt.theme;bundle-version="0.10.0" | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Import-Package: com.minres.scviewer.database, | ||||
|   javax.inject;version="1.0.0" | ||||
|  javax.inject;version="1.0.0" | ||||
| Automatic-Module-Name: com.minres.scviewer.e4.application | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								com.minres.scviewer.e4.application/icons/lightbulb.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								com.minres.scviewer.e4.application/icons/lightbulb.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 782 B | 
							
								
								
									
										
											BIN
										
									
								
								com.minres.scviewer.e4.application/icons/magifier_zoom_out.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								com.minres.scviewer.e4.application/icons/magifier_zoom_out.png
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 657 B | 
							
								
								
									
										
											BIN
										
									
								
								com.minres.scviewer.e4.application/icons/magnifier.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								com.minres.scviewer.e4.application/icons/magnifier.png
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 615 B | 
							
								
								
									
										
											BIN
										
									
								
								com.minres.scviewer.e4.application/icons/magnifier_zoom_in.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								com.minres.scviewer.e4.application/icons/magnifier_zoom_in.png
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 680 B | 
| @@ -1,7 +1,7 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <artifactId>com.minres.scviewer.e4.application</artifactId> | ||||
|   <version>2.3.0-SNAPSHOT</version> | ||||
|   <version>2.4.0-SNAPSHOT</version> | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   | ||||
| @@ -22,6 +22,7 @@ public class Messages extends NLS { | ||||
| 	public static String RelationTypeToolControl_1; | ||||
| 	public static String ResourceManager_0; | ||||
| 	public static String SCViewerPreferencesPage_0; | ||||
| 	public static String SCViewerPreferencesPage_1; | ||||
| 	public static String StatusBarControl_1; | ||||
| 	public static String StatusBarControl_2; | ||||
| 	public static String StatusBarControl_3; | ||||
|   | ||||
| @@ -0,0 +1,49 @@ | ||||
|   | ||||
| package com.minres.scviewer.e4.application.handlers; | ||||
|  | ||||
| import java.util.LinkedList; | ||||
| import java.util.List; | ||||
|  | ||||
| import javax.annotation.PostConstruct; | ||||
| import javax.inject.Inject; | ||||
|  | ||||
| import org.eclipse.core.runtime.preferences.IEclipsePreferences; | ||||
| import org.eclipse.e4.core.contexts.Active; | ||||
| import org.eclipse.e4.core.di.annotations.Execute; | ||||
| import org.eclipse.e4.core.di.extensions.Preference; | ||||
| import org.eclipse.e4.ui.model.application.MApplication; | ||||
| import org.eclipse.e4.ui.model.application.ui.basic.MPart; | ||||
| import org.eclipse.e4.ui.model.application.ui.basic.MWindow; | ||||
| import org.eclipse.e4.ui.model.application.ui.menu.MHandledItem; | ||||
| import org.eclipse.e4.ui.workbench.modeling.EModelService; | ||||
|  | ||||
| import com.minres.scviewer.e4.application.preferences.PreferenceConstants; | ||||
|  | ||||
| @SuppressWarnings("restriction") | ||||
| public class EnableHover { | ||||
| 	static final String TAG_NAME = "EnableHover"; //$NON-NLS-1$ | ||||
|  | ||||
| 	@Inject | ||||
| 	@Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE) | ||||
| 	IEclipsePreferences prefs; | ||||
|  | ||||
| 	@Inject | ||||
| 	MApplication application; | ||||
| 		 | ||||
| 	@PostConstruct | ||||
| 	public void initialize(EModelService modelService) { | ||||
| 		List<String> tags = new LinkedList<>(); | ||||
| 		tags.add(TAG_NAME); | ||||
| 		List<MHandledItem> elements = modelService.findElements(application, null, MHandledItem.class, tags ); | ||||
| 	   // cover initialization stuff, sync it with code | ||||
| 		for( MHandledItem hi : elements ){ | ||||
| 			hi.setSelected(prefs.getBoolean(PreferenceConstants.SHOW_HOVER, true)); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	@Execute | ||||
| 	public void execute(@Active MPart part, @Active MWindow window, MHandledItem handledItem, EModelService modelService ) { | ||||
| 		prefs.putBoolean(PreferenceConstants.SHOW_HOVER, handledItem.isSelected()); | ||||
| 	} | ||||
| 		 | ||||
| } | ||||
| @@ -16,6 +16,7 @@ RelationTypeToolControl_0=------------ | ||||
| RelationTypeToolControl_1=Select | ||||
| ResourceManager_0=Wrong decorate corner | ||||
| SCViewerPreferencesPage_0=Check for changed database | ||||
| SCViewerPreferencesPage_1=Show hover window in waveform | ||||
| StatusBarControl_1=Currently running:  | ||||
| StatusBarControl_2=\nLast task:  | ||||
| StatusBarControl_3=Currently running:  | ||||
|   | ||||
| @@ -50,9 +50,6 @@ import com.minres.scviewer.e4.application.Messages; | ||||
|  */ | ||||
| public class AboutDialog extends Dialog { | ||||
|  | ||||
| 	/** The product title. */ | ||||
| 	private String productTitle=Messages.AboutDialog_0; | ||||
| 	 | ||||
| 	/** The copyright text. */ | ||||
| 	private String copyrightText=Messages.AboutDialog_1; | ||||
|  | ||||
| @@ -106,8 +103,8 @@ public class AboutDialog extends Dialog { | ||||
| 		styledText.setLayoutData(gd_styledText); | ||||
| 		Version version = Platform.getProduct().getDefiningBundle().getVersion(); | ||||
| 		String versionString = String.format("%d.%d.%d", version.getMajor(), version.getMinor(), version.getMicro()); | ||||
| 		String pt = NLS.bind(Messages.AboutDialog_0, versionString); | ||||
| 		styledText.setText(pt+copyrightText); | ||||
| 		String productTitle = NLS.bind(Messages.AboutDialog_0, versionString); | ||||
| 		styledText.setText(productTitle+copyrightText); | ||||
| 		styledText.setBackground(white); | ||||
| 		styledText.setWordWrap(true); | ||||
| 		styledText.setLeftMargin(5); | ||||
|   | ||||
| @@ -97,7 +97,7 @@ public class TransactionDetails { | ||||
|  | ||||
| 	/** The attribute filter. */ | ||||
| 	TxAttributeFilter attributeFilter; | ||||
| 	 | ||||
|  | ||||
| 	/** The view sorter. */ | ||||
| 	TxAttributeViewerSorter viewSorter; | ||||
|  | ||||
| @@ -124,12 +124,12 @@ public class TransactionDetails { | ||||
| 				treeViewer.expandAll(true); | ||||
| 			} | ||||
| 		}); | ||||
| 		 | ||||
|  | ||||
| 		nameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); | ||||
|  | ||||
| 		attributeFilter = new TxAttributeFilter(); | ||||
| 		viewSorter = new TxAttributeViewerSorter(); | ||||
| 		 | ||||
|  | ||||
| 		treeViewer = new TreeViewer(parent); | ||||
| 		treeViewer.setContentProvider(new TransactionTreeContentProvider()); | ||||
| 		treeViewer.setLabelProvider(new TxPropertiesLabelProvider()); | ||||
| @@ -148,7 +148,7 @@ public class TransactionDetails { | ||||
| 			public void treeExpanded(TreeExpansionEvent event) { | ||||
| 				treeViewer.getSelection(); | ||||
| 			} | ||||
| 			 | ||||
|  | ||||
| 		}); | ||||
|  | ||||
| 		// Set up the table | ||||
| @@ -188,14 +188,14 @@ public class TransactionDetails { | ||||
| 			} | ||||
| 		}); | ||||
| 		// Pack the columns | ||||
| //		for (int i = 0, n = table.getColumnCount(); i < n; i++) { | ||||
| //			table.getColumn(i).pack(); | ||||
| //		} | ||||
| 		//		for (int i = 0, n = table.getColumnCount(); i < n; i++) { | ||||
| 		//			table.getColumn(i).pack(); | ||||
| 		//		} | ||||
|  | ||||
| 		// Turn on the header and the lines | ||||
| 		tree.setHeaderVisible(true); | ||||
| 		tree.setLinesVisible(true); | ||||
| 		 | ||||
|  | ||||
| 		treeViewer.addDoubleClickListener(new IDoubleClickListener(){ | ||||
|  | ||||
| 			@Override | ||||
| @@ -213,7 +213,7 @@ public class TransactionDetails { | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			 | ||||
|  | ||||
| 		}); | ||||
| 		parent.addControlListener(new ControlAdapter() { | ||||
| 			public void controlResized(ControlEvent e) { | ||||
| @@ -279,7 +279,7 @@ public class TransactionDetails { | ||||
| 		} else { | ||||
| 			treeViewer.setInput(null); | ||||
| 		} | ||||
| 		 | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	private void setExpandedState(TreeItem[] treeItems, ArrayList<Boolean> states) { | ||||
| @@ -294,7 +294,7 @@ public class TransactionDetails { | ||||
| 			ret.add(treeItem.getItemCount()>0?treeItem.getExpanded():true); | ||||
| 		return ret; | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	private int getTopItemHier(ArrayList<String> names){ | ||||
| 		int indexInParent=-1; | ||||
| 		TreeItem obj = treeViewer.getTree().getTopItem(); | ||||
| @@ -314,7 +314,7 @@ public class TransactionDetails { | ||||
| 		} | ||||
| 		return indexInParent; | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	private void setTopItemFromHier(ArrayList<String> names, int indexInParent) { | ||||
| 		if(indexInParent<0 || names.size()==0 ) return; | ||||
| 		TreeItem selItem=null; | ||||
| @@ -375,16 +375,16 @@ public class TransactionDetails { | ||||
| 	 */ | ||||
| 	String txToString(ITx tx){ | ||||
| 		StringBuilder sb = new StringBuilder(); | ||||
| 		sb.append("tx#").append(tx.getId()).append("[").append(timeToString(tx.getBeginTime())). //$NON-NLS-1$ //$NON-NLS-2$ | ||||
| 			append(" - ").append(timeToString(tx.getEndTime())).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ | ||||
| 		sb.append("tx#").append(tx.getId()).append("[").append(timeToString(tx.getBeginTime())); //$NON-NLS-1$ //$NON-NLS-2$ | ||||
| 		sb.append(" - ").append(timeToString(tx.getEndTime())).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ | ||||
| 		return sb.toString(); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	 * The Class TxAttributeViewerSorter. | ||||
| 	 */ | ||||
| 	class TxAttributeViewerSorter extends ViewerComparator { | ||||
| 		 | ||||
|  | ||||
| 		/** The Constant ASCENDING. */ | ||||
| 		private static final int ASCENDING = 0; | ||||
|  | ||||
| @@ -469,7 +469,7 @@ public class TransactionDetails { | ||||
| 		 */ | ||||
| 		@Override | ||||
| 		public boolean select(Viewer viewer, Object parentElement, Object element) { | ||||
| 			 | ||||
|  | ||||
| 			if (searchString == null || searchString.length() == 0) { | ||||
| 				return true; | ||||
| 			} | ||||
| @@ -482,7 +482,7 @@ public class TransactionDetails { | ||||
| 			if(element instanceof Object[]) { | ||||
| 				return (((Object[])element)[0]).toString().toLowerCase().matches(searchString.toLowerCase());	 | ||||
| 			} | ||||
| 			 | ||||
|  | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| @@ -491,19 +491,19 @@ public class TransactionDetails { | ||||
| 	 * The Enum Type. | ||||
| 	 */ | ||||
| 	enum Type {/** The props. */ | ||||
| PROPS, /** The attrs. */ | ||||
|  ATTRS, /** The in rel. */ | ||||
|  IN_REL, /** The out rel. */ | ||||
|  OUT_REL} | ||||
| 		PROPS, /** The attrs. */ | ||||
| 		ATTRS, /** The in rel. */ | ||||
| 		IN_REL, /** The out rel. */ | ||||
| 		OUT_REL} | ||||
|  | ||||
| 	/** | ||||
| 	 * The Class TreeNode. | ||||
| 	 */ | ||||
| 	class TreeNode{ | ||||
| 		 | ||||
|  | ||||
| 		/** The type. */ | ||||
| 		public Type type; | ||||
| 		 | ||||
|  | ||||
| 		/** The element. */ | ||||
| 		public ITx element; | ||||
|  | ||||
| @@ -624,16 +624,16 @@ PROPS, /** The attrs. */ | ||||
| 	 * The Class AttributeLabelProvider. | ||||
| 	 */ | ||||
| 	class AttributeLabelProvider extends LabelProvider implements IStyledLabelProvider { | ||||
| 		 | ||||
|  | ||||
| 		/** The field. */ | ||||
| 		final int field; | ||||
| 		 | ||||
|  | ||||
| 		/** The Constant NAME. */ | ||||
| 		public static final int NAME=0; | ||||
| 		 | ||||
|  | ||||
| 		/** The Constant TYPE. */ | ||||
| 		public static final int TYPE=1; | ||||
| 		 | ||||
|  | ||||
| 		/** The Constant VALUE. */ | ||||
| 		public static final int VALUE=2; | ||||
|  | ||||
| @@ -678,13 +678,18 @@ PROPS, /** The attrs. */ | ||||
| 					String value = attribute.getValue().toString(); | ||||
| 					if((DataType.UNSIGNED == attribute.getDataType() || DataType.INTEGER==attribute.getDataType()) && !"0".equals(value)) { | ||||
| 						try { | ||||
| 							value = attribute.getValue().toString() + " [0x"+Long.toHexString(Long.parseLong(attribute.getValue().toString()))+"]"; | ||||
| 							value += " [0x"+Long.toHexString(Long.parseLong(attribute.getValue().toString()))+"]"; | ||||
| 						} catch(NumberFormatException e) { } | ||||
| 					} | ||||
| 					return new StyledString(value); | ||||
| 				}else if(element instanceof Object[]){ | ||||
| 					Object[] elements = (Object[]) element; | ||||
| 					return new StyledString(elements[field].toString()); | ||||
| 					Object o = elements[field]; | ||||
| 					if(o instanceof ITx) { | ||||
| 						ITx tx = (ITx)o; | ||||
| 						return new StyledString(txToString(tx)+" ("+tx.getStream().getFullName()+")"); | ||||
| 					} else | ||||
| 						return new StyledString(o.toString()); | ||||
| 				} else if(element instanceof ITx){ | ||||
| 					return new StyledString(txToString((ITx) element)); | ||||
| 				}else  | ||||
|   | ||||
| @@ -65,14 +65,26 @@ 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.FocusListener; | ||||
| 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.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; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxAttribute; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxRelation; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| @@ -80,6 +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.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; | ||||
| @@ -366,6 +380,84 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis | ||||
| 		prefs.addPreferenceChangeListener(this); | ||||
| 		 | ||||
| 		waveformPane.addDisposeListener(this); | ||||
|  | ||||
| 		waveformPane.getWaveformControl().setData(Constants.HELP_PROVIDER_TAG, new ToolTipHelpTextProvider() { | ||||
| 			@Override | ||||
| 			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 boolean createContent(Composite parent, Point pt) { | ||||
| 				if(!prefs.getBoolean(PreferenceConstants.SHOW_HOVER, true)) return false; | ||||
| 				List<Object> 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"); | ||||
|  | ||||
| 						for (ITxAttribute iTxAttribute : tx.getAttributes()) { | ||||
| 							String value = iTxAttribute.getValue().toString(); | ||||
| 							if((DataType.UNSIGNED == iTxAttribute.getDataType() || DataType.INTEGER==iTxAttribute.getDataType()) && !"0".equals(value)) { | ||||
| 								try { | ||||
| 									value += " [0x"+Long.toHexString(Long.parseLong(iTxAttribute.getValue().toString()))+"]"; | ||||
| 								} catch(NumberFormatException e) { } | ||||
| 							} | ||||
| 							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()); | ||||
| 							} | ||||
| 						}); | ||||
| 						parent.addFocusListener(FocusListener.focusGainedAdapter(e -> { | ||||
| 							table.setFocus(); | ||||
| 						})); | ||||
| 						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 false; | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	/* (non-Javadoc) | ||||
|   | ||||
| @@ -67,6 +67,7 @@ public class DefaultValuesInitializer extends AbstractPreferenceInitializer { | ||||
| 		IPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, PreferenceConstants.PREFERENCES_SCOPE); | ||||
|  | ||||
| 		store.setDefault(PreferenceConstants.DATABASE_RELOAD, true); | ||||
| 		store.setDefault(PreferenceConstants.SHOW_HOVER, true); | ||||
|         for (WaveformColors c : WaveformColors.values()) { | ||||
|         	 store.setDefault(c.name()+"_COLOR", StringConverter.asString(colors[c.ordinal()].getRGB())); //$NON-NLS-1$ | ||||
|         } | ||||
|   | ||||
| @@ -21,6 +21,9 @@ public class PreferenceConstants { | ||||
| 	/** The Constant DATABASE_RELOAD. */ | ||||
| 	public static final String DATABASE_RELOAD="databaseReload"; //$NON-NLS-1$ | ||||
| 	 | ||||
| 	/** The Constant DATABASE_RELOAD. */ | ||||
| 	public static final String SHOW_HOVER="showWaveformHover"; //$NON-NLS-1$ | ||||
| 	 | ||||
| 	/** The Constant LINE_COLOR. */ | ||||
| 	public static final String LINE_COLOR="LINE_COLOR"; //$NON-NLS-1$ | ||||
| 	 | ||||
|   | ||||
| @@ -36,6 +36,8 @@ public class SCViewerPreferencesPage extends FieldEditorPreferencePage { | ||||
|  | ||||
| 		addField(new BooleanFieldEditor(PreferenceConstants.DATABASE_RELOAD, Messages.SCViewerPreferencesPage_0, | ||||
| 				getFieldEditorParent())); | ||||
| 		addField(new BooleanFieldEditor(PreferenceConstants.SHOW_HOVER, Messages.SCViewerPreferencesPage_1, | ||||
| 				getFieldEditorParent())); | ||||
|  | ||||
| 	} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user