- improved Tx details view
- added functionality adding waveforms to list and navigating tx
@@ -188,6 +188,6 @@ public class Tx implements ITx {
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return "tx#"+getId()+"@"+getBeginTime()+"-@"+getEndTime();
 | 
			
		||||
		return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -88,33 +88,43 @@ import com.minres.scviewer.database.swt.internal.WaveformCanvas;
 | 
			
		||||
import swing2swt.layout.BorderLayout;
 | 
			
		||||
 | 
			
		||||
public class TxDisplay implements PropertyChangeListener, ISelectionProvider  {
 | 
			
		||||
	
 | 
			
		||||
	private ListenerList selectionChangedListeners = new ListenerList();
 | 
			
		||||
	
 | 
			
		||||
	private PropertyChangeSupport pcs;
 | 
			
		||||
 | 
			
		||||
	public static final String CURSOR_PROPERTY = "cursor time";
 | 
			
		||||
 | 
			
		||||
	private static final String SELECTION = "selection";
 | 
			
		||||
	
 | 
			
		||||
	private ITx currentTxSelection;
 | 
			
		||||
	
 | 
			
		||||
	private IWaveform<? extends IWaveformEvent> currentWaveformSelection;
 | 
			
		||||
	private CursorPainter currentCursorSelection;
 | 
			
		||||
 | 
			
		||||
	private ScrolledComposite nameListScrolled;
 | 
			
		||||
	
 | 
			
		||||
	private ScrolledComposite valueListScrolled;
 | 
			
		||||
 | 
			
		||||
	private Canvas nameList;
 | 
			
		||||
	
 | 
			
		||||
	private Canvas valueList;
 | 
			
		||||
	
 | 
			
		||||
	WaveformCanvas waveformList;
 | 
			
		||||
 | 
			
		||||
	private Composite top;
 | 
			
		||||
 | 
			
		||||
	protected ObservableList<IWaveform<? extends IWaveformEvent>> streams;
 | 
			
		||||
	
 | 
			
		||||
	Vector<CursorPainter> cursorPainters;
 | 
			
		||||
 | 
			
		||||
	private Composite trackPane;
 | 
			
		||||
	
 | 
			
		||||
	private int trackVerticalHeight;
 | 
			
		||||
	
 | 
			
		||||
	private TreeMap<Integer, IWaveform<? extends IWaveformEvent>> trackVerticalOffset;
 | 
			
		||||
	
 | 
			
		||||
	private HashMap<IWaveform<? extends IWaveformEvent>, String> actualValues;
 | 
			
		||||
	// private long maxTime=0;
 | 
			
		||||
	
 | 
			
		||||
	private Font nameFont, nameFontB;
 | 
			
		||||
 | 
			
		||||
	protected MouseListener nameValueMouseListener = new MouseAdapter() {
 | 
			
		||||
@@ -389,10 +399,12 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider  {
 | 
			
		||||
		actualValues.clear();
 | 
			
		||||
		waveformList.clearAllWavefromPainter();
 | 
			
		||||
		boolean even = true;
 | 
			
		||||
		boolean clearSelection = true;
 | 
			
		||||
		TextLayout tl = new TextLayout(waveformList.getDisplay());
 | 
			
		||||
		tl.setFont(nameFontB);
 | 
			
		||||
		for (IWaveform<? extends IWaveformEvent> waveform : streams) {
 | 
			
		||||
			int height = waveformList.getTrackHeight();
 | 
			
		||||
			clearSelection &= (waveform != currentWaveformSelection);
 | 
			
		||||
			if (waveform instanceof ITxStream<?>) {
 | 
			
		||||
				ITxStream<? extends ITxEvent> stream = (ITxStream<? extends ITxEvent>) waveform;
 | 
			
		||||
				height *= stream.getMaxConcurrency();
 | 
			
		||||
@@ -421,7 +433,7 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider  {
 | 
			
		||||
			Point o = waveformList.getOrigin();
 | 
			
		||||
			waveformList.setOrigin(o.x, o.y - (previousHeight - trackVerticalOffset.lastKey()));
 | 
			
		||||
		}
 | 
			
		||||
		setSelection(new StructuredSelection());
 | 
			
		||||
		if(clearSelection) setSelection(new StructuredSelection());
 | 
			
		||||
		/*        System.out.println("updateTracklist() state:");
 | 
			
		||||
        for(Entry<Integer, IWaveform<? extends IWaveformEvent>> entry: trackVerticalOffset.entrySet()){
 | 
			
		||||
        	System.out.println("    "+entry.getKey()+": " +entry.getValue().getFullName());
 | 
			
		||||
@@ -514,42 +526,44 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider  {
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public ISelection getSelection() {
 | 
			
		||||
		if(currentCursorSelection != null){
 | 
			
		||||
			return new StructuredSelection(currentCursorSelection);            
 | 
			
		||||
		}else if (currentTxSelection != null)
 | 
			
		||||
		if (currentTxSelection != null)
 | 
			
		||||
			return new StructuredSelection(currentTxSelection);
 | 
			
		||||
		else if (currentWaveformSelection != null)
 | 
			
		||||
			return new StructuredSelection(currentWaveformSelection);
 | 
			
		||||
		else
 | 
			
		||||
			return null;
 | 
			
		||||
			return new StructuredSelection();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setSelection(ISelection selection) {
 | 
			
		||||
		setSelection(selection, false);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public void setSelection(ISelection selection, boolean addIfNeeded) {
 | 
			
		||||
		boolean selectionChanged = false;
 | 
			
		||||
		if (selection instanceof IStructuredSelection) {
 | 
			
		||||
			if(((IStructuredSelection) selection).size()==0){
 | 
			
		||||
				selectionChanged = currentTxSelection!=null||currentWaveformSelection!=null;                
 | 
			
		||||
				currentTxSelection = null;
 | 
			
		||||
				currentWaveformSelection = null;
 | 
			
		||||
				currentCursorSelection=null;
 | 
			
		||||
			} else {
 | 
			
		||||
				for(Object sel:((IStructuredSelection) selection).toArray()){
 | 
			
		||||
					if (sel instanceof ITx && currentTxSelection != sel && streams.contains(((ITx)sel).getStream())) {
 | 
			
		||||
						currentTxSelection = (ITx) sel;
 | 
			
		||||
						currentWaveformSelection = currentTxSelection.getStream();
 | 
			
		||||
						currentCursorSelection=null;
 | 
			
		||||
						selectionChanged = true;
 | 
			
		||||
					if (sel instanceof ITx && currentTxSelection != sel){
 | 
			
		||||
						ITx txSel = (ITx) sel;
 | 
			
		||||
						if (streams.contains(((ITx)sel).getStream())) {
 | 
			
		||||
							currentTxSelection = txSel;
 | 
			
		||||
							currentWaveformSelection = txSel.getStream();
 | 
			
		||||
							selectionChanged = true;
 | 
			
		||||
						} else if(addIfNeeded){
 | 
			
		||||
							streams.add(txSel.getStream());
 | 
			
		||||
							currentTxSelection = txSel;
 | 
			
		||||
							currentWaveformSelection = txSel.getStream();
 | 
			
		||||
							selectionChanged = true;
 | 
			
		||||
						}
 | 
			
		||||
					} else if (sel instanceof IWaveform<?> && currentWaveformSelection != sel&& streams.contains(sel)) {
 | 
			
		||||
						currentTxSelection = null;
 | 
			
		||||
						currentWaveformSelection = (IWaveform<? extends IWaveformEvent>) sel;
 | 
			
		||||
						currentCursorSelection=null;
 | 
			
		||||
						selectionChanged = true;
 | 
			
		||||
					} else if (sel instanceof CursorPainter && currentCursorSelection != sel){
 | 
			
		||||
						currentTxSelection = null;
 | 
			
		||||
						currentWaveformSelection = null;                    
 | 
			
		||||
						currentCursorSelection=(CursorPainter) sel;
 | 
			
		||||
						selectionChanged = true;
 | 
			
		||||
					}            		
 | 
			
		||||
				}
 | 
			
		||||
@@ -559,7 +573,6 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider  {
 | 
			
		||||
				selectionChanged = true;
 | 
			
		||||
			currentTxSelection = null;
 | 
			
		||||
			currentWaveformSelection = null;
 | 
			
		||||
			currentCursorSelection=null;
 | 
			
		||||
		}
 | 
			
		||||
		if (selectionChanged) {
 | 
			
		||||
			waveformList.setSelected(currentTxSelection, currentWaveformSelection);
 | 
			
		||||
@@ -823,6 +836,7 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider  {
 | 
			
		||||
						Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y);
 | 
			
		||||
						Object target = trackVerticalOffset.floorEntry(dropPoint.y).getValue();
 | 
			
		||||
						if(source instanceof IWaveform<?> && target instanceof IWaveform<?>){
 | 
			
		||||
							IWaveform<? extends IWaveformEvent> srcWave=(IWaveform<? extends IWaveformEvent>) source;
 | 
			
		||||
							//                            int srcIdx=streams.indexOf(source);
 | 
			
		||||
							//                            int tgtIdx=streams.indexOf(target);
 | 
			
		||||
							//                            if(srcIdx<tgtIdx){
 | 
			
		||||
@@ -830,10 +844,15 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider  {
 | 
			
		||||
							//                            } else {
 | 
			
		||||
							//                                streams.rotate(tgtIdx,  srcIdx+1, 1);
 | 
			
		||||
							//                            }
 | 
			
		||||
							int srcIdx=streams.indexOf(source);
 | 
			
		||||
							int srcIdx=streams.indexOf(srcWave);
 | 
			
		||||
							streams.remove(source);
 | 
			
		||||
							int tgtIdx=streams.indexOf(target);
 | 
			
		||||
							streams.add(srcIdx>tgtIdx?tgtIdx:tgtIdx+1, (IWaveform<? extends IWaveformEvent>) source);
 | 
			
		||||
							if(srcIdx<=tgtIdx) tgtIdx++;
 | 
			
		||||
							if(tgtIdx>=streams.size())
 | 
			
		||||
								streams.add(srcWave);
 | 
			
		||||
							else
 | 
			
		||||
								streams.add(tgtIdx, srcWave);
 | 
			
		||||
							currentWaveformSelection=srcWave;
 | 
			
		||||
							updateTracklist();
 | 
			
		||||
						} else if(source instanceof CursorPainter){
 | 
			
		||||
							((CursorPainter)source).setTime(0);
 | 
			
		||||
@@ -954,4 +973,9 @@ public class TxDisplay implements PropertyChangeListener, ISelectionProvider  {
 | 
			
		||||
		return this.pcs.hasListeners(propertyName);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String getScaledTime(Long time) {
 | 
			
		||||
		StringBuilder sb = new StringBuilder();
 | 
			
		||||
		return sb.append(time/waveformList.getScaleFactor()).append(waveformList.getUnitStr()).toString();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
bin.includes = META-INF/,\
 | 
			
		||||
               .,\
 | 
			
		||||
               OSGI-INF/component.xml
 | 
			
		||||
               OSGI-INF/
 | 
			
		||||
source.. = src/
 | 
			
		||||
 
 | 
			
		||||
@@ -59,4 +59,9 @@ class Tx implements ITx {
 | 
			
		||||
			return id.compareTo(o.id)
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,8 @@ public interface IWaveformDb extends IHierNode {
 | 
			
		||||
	
 | 
			
		||||
	public boolean load(File inp) throws Exception;
 | 
			
		||||
 | 
			
		||||
	public boolean isLoaded();
 | 
			
		||||
 | 
			
		||||
	public void clear();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,4 +27,7 @@ public class RelationType {
 | 
			
		||||
		this.name = name;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String toString(){
 | 
			
		||||
		return name;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,8 @@ public class WaveformDb extends HierNode implements IWaveformDb {
 | 
			
		||||
 | 
			
		||||
	private static List<IWaveformDbLoader> loaders=new LinkedList<IWaveformDbLoader>();
 | 
			
		||||
 | 
			
		||||
	private boolean loaded;
 | 
			
		||||
 | 
			
		||||
	private List<IHierNode> childNodes;
 | 
			
		||||
 | 
			
		||||
	private Map<String, IWaveform<?>> waveforms;
 | 
			
		||||
@@ -89,6 +91,7 @@ public class WaveformDb extends HierNode implements IWaveformDb {
 | 
			
		||||
				buildHierarchyNodes() ;
 | 
			
		||||
				pcs.firePropertyChange("WAVEFORMS", null, waveforms);
 | 
			
		||||
				pcs.firePropertyChange("CHILDS", null, childNodes);
 | 
			
		||||
				loaded = true;
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}		
 | 
			
		||||
@@ -108,6 +111,11 @@ public class WaveformDb extends HierNode implements IWaveformDb {
 | 
			
		||||
	public void clear() {
 | 
			
		||||
		waveforms.clear();
 | 
			
		||||
		childNodes.clear();
 | 
			
		||||
		loaded=false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean isLoaded() {
 | 
			
		||||
		return loaded;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void buildHierarchyNodes() throws InputFormatException{
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,2 @@
 | 
			
		||||
eclipse.preferences.version=1
 | 
			
		||||
org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
 | 
			
		||||
@@ -1,16 +1,36 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:advanced="http://www.eclipse.org/ui/2010/UIModel/application/ui/advanced" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmi:id="_95PfsHNmEeWBq8z1Dv39LA" elementId="org.eclipse.e4.ide.application" bindingContexts="_95PfuXNmEeWBq8z1Dv39LA">
 | 
			
		||||
<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:advanced="http://www.eclipse.org/ui/2010/UIModel/application/ui/advanced" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmlns:ui="http://www.eclipse.org/ui/2010/UIModel/application/ui" xmi:id="_95PfsHNmEeWBq8z1Dv39LA" elementId="org.eclipse.e4.ide.application" bindingContexts="_95PfuXNmEeWBq8z1Dv39LA">
 | 
			
		||||
  <children xsi:type="basic:TrimmedWindow" xmi:id="_95PfsXNmEeWBq8z1Dv39LA" label="SC Viewer" width="980" height="700">
 | 
			
		||||
    <children xsi:type="advanced:PerspectiveStack" xmi:id="_95QGxnNmEeWBq8z1Dv39LA">
 | 
			
		||||
      <children xsi:type="advanced:Perspective" xmi:id="_95QGx3NmEeWBq8z1Dv39LA">
 | 
			
		||||
        <children xsi:type="basic:PartSashContainer" xmi:id="_95QGyHNmEeWBq8z1Dv39LA" horizontal="true">
 | 
			
		||||
          <children xsi:type="basic:PartSashContainer" xmi:id="_61hA8HTPEeWwZ-9vrAR2UQ" elementId="" containerData="20">
 | 
			
		||||
            <children xsi:type="basic:Part" xmi:id="_95QGynNmEeWBq8z1Dv39LA" containerData="10" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.parts.DesignBrowser" label="Design Browser"/>
 | 
			
		||||
            <children xsi:type="basic:Part" xmi:id="_8KyKwHTPEeWwZ-9vrAR2UQ" containerData="9" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.parts.WaveformListPart" label="Signal List"/>
 | 
			
		||||
            <children xsi:type="basic:Part" xmi:id="_8KyKwHTPEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parts.WaveformList" containerData="9" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.parts.WaveformListPart" label="Waveform List">
 | 
			
		||||
              <handlers xmi:id="_Bx9s0Hr-EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.handler.addWaveformCommand" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.handlers.AddWaveformHandler" command="_2PehEHr9EeWVM_sKoXvptg"/>
 | 
			
		||||
              <menus xsi:type="menu:PopupMenu" xmi:id="_G6xAYHsDEeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.parts.WaveformList.popupmenu">
 | 
			
		||||
                <children xsi:type="menu:HandledMenuItem" xmi:id="_swdo8Hr9EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.handledmenuitem.append" label="Append after" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/append_wave.png" command="_2PehEHr9EeWVM_sKoXvptg">
 | 
			
		||||
                  <parameters xmi:id="_IA_lcHr_EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.parameter.21" name="com.minres.scviewer.e4.application.command.addwaveform.where" value="after"/>
 | 
			
		||||
                  <parameters xmi:id="_B6hTkHwJEeWv0Y5uF2QN5w" elementId="com.minres.scviewer.e4.application.parameter.25" name="com.minres.scviewer.e4.application.command.addwaveform.all" value="false"/>
 | 
			
		||||
                </children>
 | 
			
		||||
                <children xsi:type="menu:HandledMenuItem" xmi:id="_twC2oHr9EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.handledmenuitem.insertbefore" label="Insert before" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/insert_wave.png" command="_2PehEHr9EeWVM_sKoXvptg">
 | 
			
		||||
                  <parameters xmi:id="_KQPEMHr_EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.parameter.22" name="com.minres.scviewer.e4.application.command.addwaveform.where" value="before"/>
 | 
			
		||||
                  <parameters xmi:id="_Em0hwHwJEeWv0Y5uF2QN5w" elementId="com.minres.scviewer.e4.application.parameter.26" name="com.minres.scviewer.e4.application.command.addwaveform.all" value="false"/>
 | 
			
		||||
                </children>
 | 
			
		||||
                <children xsi:type="menu:HandledMenuItem" xmi:id="_uMoE8Hr9EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.handledmenuitem.appendall" label="Append all" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/append_all_waves.png" command="_2PehEHr9EeWVM_sKoXvptg">
 | 
			
		||||
                  <parameters xmi:id="_LpOQYHr_EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.parameter.23" name="com.minres.scviewer.e4.application.command.addwaveform.where" value="after"/>
 | 
			
		||||
                  <parameters xmi:id="_G-T9kHwJEeWv0Y5uF2QN5w" elementId="com.minres.scviewer.e4.application.parameter.27" name="com.minres.scviewer.e4.application.command.addwaveform.all" value="true"/>
 | 
			
		||||
                </children>
 | 
			
		||||
                <children xsi:type="menu:HandledMenuItem" xmi:id="_ukpjYHr9EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.handledmenuitem.insertall" label="Insert All" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/insert_all_waves.png" command="_2PehEHr9EeWVM_sKoXvptg">
 | 
			
		||||
                  <parameters xmi:id="_M9U8kHr_EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.parameter.24" name="com.minres.scviewer.e4.application.command.addwaveform.where" value="before"/>
 | 
			
		||||
                  <parameters xmi:id="_ckAToHwJEeWv0Y5uF2QN5w" elementId="com.minres.scviewer.e4.application.parameter.28" name="com.minres.scviewer.e4.application.command.addwaveform.all" value="true"/>
 | 
			
		||||
                </children>
 | 
			
		||||
              </menus>
 | 
			
		||||
            </children>
 | 
			
		||||
          </children>
 | 
			
		||||
          <children xsi:type="basic:PartSashContainer" xmi:id="_uT9BIHgtEeWwZ-9vrAR2UQ" elementId="" containerData="80">
 | 
			
		||||
            <children xsi:type="basic:PartStack" xmi:id="_95QGyXNmEeWBq8z1Dv39LA" elementId="org.eclipse.editorss" containerData="80"/>
 | 
			
		||||
            <children xsi:type="basic:Part" xmi:id="_vtfm8HgtEeWwZ-9vrAR2UQ" elementId="" containerData="20" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.parts.TransactionDetails"/>
 | 
			
		||||
            <children xsi:type="basic:PartStack" xmi:id="_95QGyXNmEeWBq8z1Dv39LA" elementId="org.eclipse.editorss" containerData="75"/>
 | 
			
		||||
            <children xsi:type="basic:Part" xmi:id="_vtfm8HgtEeWwZ-9vrAR2UQ" elementId="" containerData="25" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.parts.TransactionDetails"/>
 | 
			
		||||
          </children>
 | 
			
		||||
        </children>
 | 
			
		||||
      </children>
 | 
			
		||||
@@ -101,7 +121,9 @@
 | 
			
		||||
      <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.WaveStatusBarControl">
 | 
			
		||||
        <tags>stretch</tags>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:ToolControl" xmi:id="_VZzJMHdHEeWwZ-9vrAR2UQ" elementId="org.eclipse.ui.HeapStatus" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.internal.StatusBarControl"/>
 | 
			
		||||
      <children xsi:type="menu:ToolControl" xmi:id="_VZzJMHdHEeWwZ-9vrAR2UQ" elementId="org.eclipse.ui.HeapStatus" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.internal.StatusBarControl">
 | 
			
		||||
        <tags>Draggable</tags>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:ToolControl" xmi:id="_y0ZS0HfzEeWwZ-9vrAR2UQ" elementId="org.eclipse.ui.ProgressBar" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.internal.StatusBarControl">
 | 
			
		||||
        <tags>Draggable</tags>
 | 
			
		||||
      </children>
 | 
			
		||||
@@ -131,31 +153,43 @@
 | 
			
		||||
    <handlers xmi:id="_Du1NAHcrEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handler.zoomCommand" contributionURI="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.handlers.ZoomHandler" command="_693GoHcqEeWwZ-9vrAR2UQ"/>
 | 
			
		||||
    <menus xsi:type="menu:PopupMenu" xmi:id="_TwzrsHWSEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.popupmenu.namecontext" label="Name Menu">
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_Vco7YHWSEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.moveup" label="Move up" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/up_blue.png" command="_N_sOkHXHEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_elFdcHr_EeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneWaveSeleted"/>
 | 
			
		||||
        <parameters xmi:id="_qNG5kHZWEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.0" name="com.minres.scviewer.e4.application.command.movewaveformupCommand.parameter.dir" value="up"/>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_UlTbMHXIEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.movedown" label="Move down" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/down_blue.png" command="_N_sOkHXHEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_eBN0AHsCEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneWaveSeleted"/>
 | 
			
		||||
        <parameters xmi:id="_soO4MHZWEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.1" name="com.minres.scviewer.e4.application.command.movewaveformupCommand.parameter.dir" value="down"/>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_Vj4jUHXIEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.remove" label="Remove" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/cross.png" command="_WUZ2wHXHEeWwZ-9vrAR2UQ"/>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_Vj4jUHXIEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.remove" label="Remove" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/cross.png" command="_WUZ2wHXHEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_f6MH0HsCEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneWaveSeleted"/>
 | 
			
		||||
      </children>
 | 
			
		||||
    </menus>
 | 
			
		||||
    <menus xsi:type="menu:PopupMenu" xmi:id="_CxJvAHXGEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.popupmenu.wavecontext" label="Wave Menu">
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_7HrlwHXREeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.moveup" label="Move up" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/up_blue.png" command="_N_sOkHXHEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_orHK4HsCEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneWaveSeleted"/>
 | 
			
		||||
        <parameters xmi:id="_snsmsHaYEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.2" name="com.minres.scviewer.e4.application.command.movewaveformupCommand.parameter.dir" value="up"/>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_8MkxQHXREeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.movedown" label="Move down" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/down_blue.png" command="_N_sOkHXHEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_sSb24HsCEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneWaveSeleted"/>
 | 
			
		||||
        <parameters xmi:id="_uZBaYHaYEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.3" name="com.minres.scviewer.e4.application.command.movewaveformupCommand.parameter.dir" value="down"/>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_7Hz3sHXIEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.remove" label="Remove" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/cross.png" command="_WUZ2wHXHEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_uusd8HsCEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneWaveSeleted"/>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_h4B6YHcZEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.nextevent" label="Next event" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/play_blue.png" command="_79rx4HabEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_mDkrcHsDEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneWaveSeleted"/>
 | 
			
		||||
        <parameters xmi:id="_rKkcwHcZEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.6" name="com.minres.scviewer.e4.application.command.navigateEventCommand.parameter.dir" value="next"/>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_kU1UAHcZEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.previousevent" label="Previous event" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/reverse_blue.png" command="_79rx4HabEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_mdnjIHsDEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneWaveSeleted"/>
 | 
			
		||||
        <parameters xmi:id="_tJOh0HcZEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.7" name="com.minres.scviewer.e4.application.command.navigateEventCommand.parameter.dir" value="prev"/>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_7Hz3sHXIEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.remove" label="Remove" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/cross.png" command="_WUZ2wHXHEeWwZ-9vrAR2UQ"/>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_33qXsHabEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.nextchange" label="Next Tx" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/play_green.png" command="_Gn3lEHXKEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_m2RTsHsDEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneTxSeleted"/>
 | 
			
		||||
        <parameters xmi:id="_33qXsXabEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.4" name="com.minres.scviewer.e4.application.command.navigateTransCommand.parameter.dir" value="next"/>
 | 
			
		||||
      </children>
 | 
			
		||||
      <children xsi:type="menu:HandledMenuItem" xmi:id="_4ZeEQHabEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.handledmenuitem.previouschange" label="Previous Tx" iconURI="platform:/plugin/com.minres.scviewer.e4.application/icons/reverse_green.png" command="_Gn3lEHXKEeWwZ-9vrAR2UQ">
 | 
			
		||||
        <visibleWhen xsi:type="ui:CoreExpression" xmi:id="_nReB8HsDEeWVM_sKoXvptg" coreExpressionId="com.minres.scviewer.e4.application.oneTxSeleted"/>
 | 
			
		||||
        <parameters xmi:id="_4ZeEQXabEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.parameter.5" name="com.minres.scviewer.e4.application.command.navigateTransCommand.parameter.dir" value="prev"/>
 | 
			
		||||
      </children>
 | 
			
		||||
    </menus>
 | 
			
		||||
@@ -178,6 +212,10 @@
 | 
			
		||||
  <commands xmi:id="_693GoHcqEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.command.zoomcommand" commandName="zoomCommand">
 | 
			
		||||
    <parameters xmi:id="_8tbm0HcqEeWwZ-9vrAR2UQ" elementId="com.minres.scviewer.e4.application.command.zoomcommand.parameter.level" name="level" optional="false"/>
 | 
			
		||||
  </commands>
 | 
			
		||||
  <commands xmi:id="_2PehEHr9EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.command.addwaveform" commandName="addWaveformCommand">
 | 
			
		||||
    <parameters xmi:id="_6KsZcHr9EeWVM_sKoXvptg" elementId="com.minres.scviewer.e4.application.command.addwaveform.where" name="where" optional="false"/>
 | 
			
		||||
    <parameters xmi:id="_7T1TcHwIEeWv0Y5uF2QN5w" elementId="com.minres.scviewer.e4.application.command.addwaveform.all" name="all" typeId="" optional="false"/>
 | 
			
		||||
  </commands>
 | 
			
		||||
  <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"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
Manifest-Version: 1.0
 | 
			
		||||
Bundle-ManifestVersion: 2
 | 
			
		||||
Bundle-Name: Application
 | 
			
		||||
Bundle-Name: %Bundle-Name
 | 
			
		||||
Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true
 | 
			
		||||
Bundle-Version: 1.0.0.qualifier
 | 
			
		||||
Bundle-Vendor: MINRES Technologies GmbH
 | 
			
		||||
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",
 | 
			
		||||
@@ -24,7 +24,9 @@ Require-Bundle: javax.inject;bundle-version="1.0.0",
 | 
			
		||||
 org.eclipse.core.jobs,
 | 
			
		||||
 org.eclipse.osgi,
 | 
			
		||||
 com.google.guava,
 | 
			
		||||
 org.eclipse.equinox.preferences
 | 
			
		||||
 org.eclipse.equinox.preferences,
 | 
			
		||||
 org.eclipse.core.expressions,
 | 
			
		||||
 org.eclipse.e4.core.commands;bundle-version="0.11.0"
 | 
			
		||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 | 
			
		||||
Import-Package: com.minres.scviewer.database,
 | 
			
		||||
 javax.inject;version="1.0.0"
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
#Properties file for com.minres.scviewer.e4.application
 | 
			
		||||
Bundle-Vendor = MINRES Technologies GmbH
 | 
			
		||||
Bundle-Name = Application
 | 
			
		||||
product.description = SystemC Transaction and Waveform Viewer
 | 
			
		||||
product.name = SCViewer
 | 
			
		||||
@@ -5,5 +5,6 @@ bin.includes = META-INF/,\
 | 
			
		||||
               plugin.xml,\
 | 
			
		||||
               Application.e4xmi,\
 | 
			
		||||
               icons/,\
 | 
			
		||||
               css/default.css
 | 
			
		||||
               css/default.css,\
 | 
			
		||||
               OSGI-INF/l10n/bundle.properties
 | 
			
		||||
source.. = src/
 | 
			
		||||
 
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB  | 
| 
		 Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB  | 
@@ -6,8 +6,8 @@
 | 
			
		||||
         point="org.eclipse.core.runtime.products">
 | 
			
		||||
      <product
 | 
			
		||||
            application="org.eclipse.e4.ui.workbench.swt.E4Application"
 | 
			
		||||
            description="SystemC Transaction and Waveform Viewer"
 | 
			
		||||
            name="SCViewer">
 | 
			
		||||
            description="%product.description"
 | 
			
		||||
            name="%product.name">
 | 
			
		||||
         <property
 | 
			
		||||
               name="lifeCycleURI"
 | 
			
		||||
               value="bundleclass://com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.E4LifeCycle">
 | 
			
		||||
@@ -22,5 +22,47 @@
 | 
			
		||||
         </property>
 | 
			
		||||
      </product>
 | 
			
		||||
   </extension>
 | 
			
		||||
   <extension
 | 
			
		||||
         point="org.eclipse.core.expressions.definitions">
 | 
			
		||||
      <definition
 | 
			
		||||
            id="com.minres.scviewer.e4.application.oneWaveSeleted">
 | 
			
		||||
            <with
 | 
			
		||||
                  variable="selection">
 | 
			
		||||
               <and>
 | 
			
		||||
                  <count
 | 
			
		||||
                        value="1">
 | 
			
		||||
                  </count>
 | 
			
		||||
 				<iterate
 | 
			
		||||
           operator="or">
 | 
			
		||||
       				<instanceof value="com.minres.scviewer.database.IWaveform"/>
 | 
			
		||||
    			</iterate>      
 | 
			
		||||
            </and>
 | 
			
		||||
            </with>
 | 
			
		||||
      </definition>
 | 
			
		||||
      <definition
 | 
			
		||||
            id="com.minres.scviewer.e4.application.oneTxSeleted">
 | 
			
		||||
            <with
 | 
			
		||||
                  variable="selection">
 | 
			
		||||
               <and>
 | 
			
		||||
                  <count
 | 
			
		||||
                        value="1">
 | 
			
		||||
                  </count>
 | 
			
		||||
 				<iterate
 | 
			
		||||
           operator="or">
 | 
			
		||||
       				<instanceof value="com.minres.scviewer.database.ITx"/>
 | 
			
		||||
    			</iterate>      
 | 
			
		||||
            </and>
 | 
			
		||||
            </with>
 | 
			
		||||
      </definition>
 | 
			
		||||
      <definition
 | 
			
		||||
            id="com.minres.scviewer.e4.application.waveformViewerActive">
 | 
			
		||||
         <with
 | 
			
		||||
               variable="activeEditorId">
 | 
			
		||||
            <equals
 | 
			
		||||
                  value="com.minres.scviewer.e4.application.partdescriptor.waveformviewer">
 | 
			
		||||
            </equals>
 | 
			
		||||
         </with>
 | 
			
		||||
      </definition>
 | 
			
		||||
   </extension>
 | 
			
		||||
 | 
			
		||||
</plugin>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,11 +10,28 @@
 | 
			
		||||
 *******************************************************************************/
 | 
			
		||||
package com.minres.scviewer.e4.application;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.PostConstruct;
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 | 
			
		||||
import org.eclipse.e4.core.contexts.IEclipseContext;
 | 
			
		||||
import org.eclipse.e4.core.services.events.IEventBroker;
 | 
			
		||||
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.MPartStack;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.UIEvents;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.lifecycle.PreSave;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.lifecycle.ProcessAdditions;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.lifecycle.ProcessRemovals;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EModelService;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EPartService;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
 | 
			
		||||
import org.eclipse.equinox.app.IApplicationContext;
 | 
			
		||||
import org.osgi.service.event.Event;
 | 
			
		||||
import org.osgi.service.event.EventHandler;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This is a stub implementation containing e4 LifeCycle annotated methods.<br />
 | 
			
		||||
@@ -25,10 +42,30 @@ import org.eclipse.e4.ui.workbench.lifecycle.ProcessRemovals;
 | 
			
		||||
@SuppressWarnings("restriction")
 | 
			
		||||
public class E4LifeCycle {
 | 
			
		||||
 | 
			
		||||
	@PostContextCreate
 | 
			
		||||
	void postContextCreate(IEclipseContext workbenchContext) {
 | 
			
		||||
	@PostConstruct
 | 
			
		||||
	private static void postConstruct(final IEventBroker eventBroker) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@PostContextCreate
 | 
			
		||||
	void postContextCreate(IApplicationContext appContext, final IEventBroker eventBroker) {
 | 
			
		||||
		final String[] args = (String[])appContext.getArguments().get(IApplicationContext.APPLICATION_ARGS); 
 | 
			
		||||
		// react on the first view being created, at that time the UI is available
 | 
			
		||||
		eventBroker.subscribe(UIEvents.UILifeCycle.ACTIVATE, new EventHandler() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void handleEvent(Event event) {
 | 
			
		||||
				MPart part = (MPart) event.getProperty("ChangedElement");
 | 
			
		||||
				if(part!=null){
 | 
			
		||||
					IEclipseContext ctx = part.getContext();
 | 
			
		||||
					OpenViewHandler openViewHandler= new OpenViewHandler();
 | 
			
		||||
					ContextInjectionFactory.inject(openViewHandler, ctx);
 | 
			
		||||
					eventBroker.unsubscribe(this);
 | 
			
		||||
					for(String name:args){
 | 
			
		||||
						if(new File(name).exists())	openViewHandler.openViewForFile(name);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
	@PreSave
 | 
			
		||||
	void preSave(IEclipseContext workbenchContext) {
 | 
			
		||||
	}
 | 
			
		||||
@@ -40,4 +77,31 @@ public class E4LifeCycle {
 | 
			
		||||
	@ProcessRemovals
 | 
			
		||||
	void processRemovals(IEclipseContext workbenchContext) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	String join(String[] tokens){
 | 
			
		||||
		StringBuilder sb = new StringBuilder();
 | 
			
		||||
		boolean first=true;
 | 
			
		||||
		for(String token:tokens){
 | 
			
		||||
			if(!first) sb.append(",");
 | 
			
		||||
			sb.append(token);
 | 
			
		||||
			first=false;
 | 
			
		||||
		}
 | 
			
		||||
		return sb.toString();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private class OpenViewHandler {
 | 
			
		||||
		@Inject MApplication app;
 | 
			
		||||
		@Inject EModelService modelService;
 | 
			
		||||
		@Inject EPartService partService;
 | 
			
		||||
		public void openViewForFile(String name){
 | 
			
		||||
			MPart part = partService.createPart("com.minres.scviewer.e4.application.partdescriptor.waveformviewer");
 | 
			
		||||
			part.setLabel(name);
 | 
			
		||||
			MPartStack partStack = (MPartStack)modelService.find("org.eclipse.editorss", app);
 | 
			
		||||
			partStack.getChildren().add(part);
 | 
			
		||||
			partService.showPart(part, PartState.ACTIVATE);
 | 
			
		||||
			IEclipseContext ctx=part.getContext();
 | 
			
		||||
			ctx.modify("input", new File(name));
 | 
			
		||||
			ctx.declareModifiable("input");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,58 @@
 | 
			
		||||
 | 
			
		||||
package com.minres.scviewer.e4.application.handlers;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.e4.core.di.annotations.CanExecute;
 | 
			
		||||
import org.eclipse.e4.core.di.annotations.Execute;
 | 
			
		||||
import org.eclipse.e4.core.di.annotations.Optional;
 | 
			
		||||
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 | 
			
		||||
import org.eclipse.e4.ui.services.IServiceConstants;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EPartService;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
 | 
			
		||||
import com.minres.scviewer.database.IWaveform;
 | 
			
		||||
import com.minres.scviewer.e4.application.parts.WaveformListPart;
 | 
			
		||||
 | 
			
		||||
public class AddWaveformHandler {
 | 
			
		||||
 | 
			
		||||
	public final static String PARAM_WHERE_ID="com.minres.scviewer.e4.application.command.addwaveform.where";
 | 
			
		||||
	public final static String PARAM_ALL_ID="com.minres.scviewer.e4.application.command.addwaveform.all";
 | 
			
		||||
 | 
			
		||||
	@CanExecute
 | 
			
		||||
	public boolean canExecute(@Named(PARAM_WHERE_ID) String where, @Named(PARAM_ALL_ID) String all,
 | 
			
		||||
			EPartService partService,
 | 
			
		||||
			@Named(IServiceConstants.ACTIVE_SELECTION) @Optional IStructuredSelection selection) {
 | 
			
		||||
		WaveformListPart listPart = getListPart( partService);
 | 
			
		||||
		if(listPart==null || listPart.getActiveWaveformViewerPart()==null) return false;
 | 
			
		||||
		Boolean before = "before".equalsIgnoreCase(where);
 | 
			
		||||
		if("true".equalsIgnoreCase(all)) 
 | 
			
		||||
			return listPart.getFilteredChildren().length>0 && 
 | 
			
		||||
					(!before || ((IStructuredSelection)listPart.getActiveWaveformViewerPart().getSelection()).size()>0);
 | 
			
		||||
		else
 | 
			
		||||
			return selection.size()>0 && 
 | 
			
		||||
					(!before || ((IStructuredSelection)listPart.getActiveWaveformViewerPart().getSelection()).size()>0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Execute
 | 
			
		||||
	public void execute(@Named(PARAM_WHERE_ID) String where, @Named(PARAM_ALL_ID) String all, 
 | 
			
		||||
			EPartService partService,
 | 
			
		||||
			@Named(IServiceConstants.ACTIVE_SELECTION) @Optional IStructuredSelection selection) {
 | 
			
		||||
		WaveformListPart listPart = getListPart( partService);
 | 
			
		||||
		if(listPart!=null && selection.size()>0){
 | 
			
		||||
			List<?> sel=selection.toList();
 | 
			
		||||
			listPart.getActiveWaveformViewerPart().addStreamsToList(sel.toArray(new IWaveform<?>[]{}),
 | 
			
		||||
					"before".equalsIgnoreCase(where));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected WaveformListPart getListPart(EPartService partService){
 | 
			
		||||
		MPart part = partService.getActivePart();
 | 
			
		||||
		if(part.getObject() instanceof WaveformListPart)
 | 
			
		||||
			return (WaveformListPart) part.getObject();
 | 
			
		||||
		else
 | 
			
		||||
			return null;
 | 
			
		||||
	}	
 | 
			
		||||
}
 | 
			
		||||
@@ -15,6 +15,7 @@ import org.eclipse.e4.core.di.annotations.CanExecute;
 | 
			
		||||
import org.eclipse.e4.core.di.annotations.Execute;
 | 
			
		||||
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
 | 
			
		||||
import com.minres.scviewer.database.IWaveform;
 | 
			
		||||
import com.minres.scviewer.e4.application.parts.WaveformViewerPart;
 | 
			
		||||
@@ -24,16 +25,15 @@ public class DeleteWaveformHandler {
 | 
			
		||||
	@CanExecute
 | 
			
		||||
	public Boolean canExecute(ESelectionService selectionService){
 | 
			
		||||
		Object o = selectionService.getSelection();
 | 
			
		||||
		return o instanceof IWaveform<?>;
 | 
			
		||||
		return o instanceof IStructuredSelection && ((IStructuredSelection)o).getFirstElement() instanceof IWaveform<?>;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Execute
 | 
			
		||||
	public void execute(ESelectionService selectionService, MPart activePart) {
 | 
			
		||||
		Object o = activePart.getObject();
 | 
			
		||||
		Object sel = selectionService.getSelection();
 | 
			
		||||
		if(o instanceof WaveformViewerPart && sel instanceof IWaveform<?>){
 | 
			
		||||
			((WaveformViewerPart)o).removeStreamFromList((IWaveform<?>) sel);
 | 
			
		||||
		if(o instanceof WaveformViewerPart && ((IStructuredSelection)sel).getFirstElement() instanceof IWaveform<?>){
 | 
			
		||||
			((WaveformViewerPart)o).removeStreamFromList((IWaveform<?>) ((IStructuredSelection)sel).getFirstElement());
 | 
			
		||||
		}	
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
	}	
 | 
			
		||||
}
 | 
			
		||||
@@ -18,6 +18,7 @@ import org.eclipse.e4.core.di.annotations.Execute;
 | 
			
		||||
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EPartService;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
 | 
			
		||||
import com.minres.scviewer.database.ITx;
 | 
			
		||||
import com.minres.scviewer.database.IWaveform;
 | 
			
		||||
@@ -29,8 +30,12 @@ public class MoveWaveformHandler {
 | 
			
		||||
 | 
			
		||||
	@CanExecute
 | 
			
		||||
	public Boolean canExecute(ESelectionService selectionService){
 | 
			
		||||
		Object o = selectionService.getSelection();
 | 
			
		||||
		return o instanceof IWaveform<?> || o instanceof ITx;
 | 
			
		||||
		Object sel = selectionService.getSelection();
 | 
			
		||||
		if( sel instanceof IStructuredSelection) {
 | 
			
		||||
			Object o= ((IStructuredSelection)sel).getFirstElement();
 | 
			
		||||
			return o instanceof IWaveform<?> || o instanceof ITx;
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Execute
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ import org.eclipse.e4.core.di.annotations.Execute;
 | 
			
		||||
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EPartService;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
 | 
			
		||||
import com.minres.scviewer.database.ITx;
 | 
			
		||||
import com.minres.scviewer.database.IWaveform;
 | 
			
		||||
@@ -30,8 +31,12 @@ public class NavigateEvent {
 | 
			
		||||
	
 | 
			
		||||
	@CanExecute
 | 
			
		||||
	public Boolean canExecute(ESelectionService selectionService){
 | 
			
		||||
		Object o = selectionService.getSelection();
 | 
			
		||||
		return o instanceof IWaveform<?> || o instanceof ITx;
 | 
			
		||||
		Object sel = selectionService.getSelection();
 | 
			
		||||
		if( sel instanceof IStructuredSelection) {
 | 
			
		||||
			Object o= ((IStructuredSelection)sel).getFirstElement();
 | 
			
		||||
			return o instanceof IWaveform<?> || o instanceof ITx;
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Execute
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ import org.eclipse.e4.core.di.annotations.Execute;
 | 
			
		||||
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EPartService;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
 | 
			
		||||
import com.minres.scviewer.database.ITx;
 | 
			
		||||
import com.minres.scviewer.database.swt.GotoDirection;
 | 
			
		||||
@@ -29,8 +30,12 @@ public class NavigateTrans {
 | 
			
		||||
	
 | 
			
		||||
	@CanExecute
 | 
			
		||||
	public Boolean canExecute(ESelectionService selectionService){
 | 
			
		||||
		Object o = selectionService.getSelection();
 | 
			
		||||
		return o instanceof ITx;
 | 
			
		||||
		Object sel = selectionService.getSelection();
 | 
			
		||||
		if( sel instanceof IStructuredSelection) {
 | 
			
		||||
			Object o= ((IStructuredSelection)sel).getFirstElement();
 | 
			
		||||
			return o instanceof ITx;
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Execute
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,6 @@
 | 
			
		||||
 *******************************************************************************/
 | 
			
		||||
package com.minres.scviewer.e4.application.internal;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
 | 
			
		||||
@@ -22,6 +20,7 @@ import org.eclipse.e4.ui.services.IServiceConstants;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EModelService;
 | 
			
		||||
import org.eclipse.jface.action.ContributionItem;
 | 
			
		||||
import org.eclipse.jface.action.StatusLineManager;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
import org.eclipse.swt.SWT;
 | 
			
		||||
import org.eclipse.swt.custom.CLabel;
 | 
			
		||||
import org.eclipse.swt.layout.GridData;
 | 
			
		||||
@@ -87,13 +86,19 @@ public class WaveStatusBarControl extends StatusBarControl {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Inject
 | 
			
		||||
	public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION)@Optional Object obj){
 | 
			
		||||
		//		if(status!=null ) status.setText(obj==null?"":obj.toString());
 | 
			
		||||
		if(manager!=null ){
 | 
			
		||||
			if(obj instanceof List<?>){
 | 
			
		||||
				manager.setMessage(""+((List<?>)obj).size()+" Elements");
 | 
			
		||||
			} else 
 | 
			
		||||
				manager.setMessage(obj==null?"":obj.getClass().getSimpleName()+" selected");
 | 
			
		||||
	public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION)@Optional IStructuredSelection selection){
 | 
			
		||||
		if(manager!=null && selection!=null){
 | 
			
		||||
			switch(selection.size()){
 | 
			
		||||
			case 0:
 | 
			
		||||
				manager.setMessage("");
 | 
			
		||||
				break;
 | 
			
		||||
			case 1:
 | 
			
		||||
				manager.setMessage(selection.getFirstElement().getClass().getSimpleName()+" selected");
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				manager.setMessage(""+selection.size()+" Elements");
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,9 +23,7 @@ import org.eclipse.e4.core.services.events.IEventBroker;
 | 
			
		||||
import org.eclipse.e4.ui.di.Focus;
 | 
			
		||||
import org.eclipse.e4.ui.di.UIEventTopic;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 | 
			
		||||
import org.eclipse.jface.viewers.ISelection;
 | 
			
		||||
import org.eclipse.jface.viewers.ISelectionChangedListener;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
import org.eclipse.jface.viewers.SelectionChangedEvent;
 | 
			
		||||
import org.eclipse.jface.viewers.TreeViewer;
 | 
			
		||||
import org.eclipse.swt.SWT;
 | 
			
		||||
@@ -45,6 +43,7 @@ public class DesignBrowser implements ISelectionChangedListener {
 | 
			
		||||
 | 
			
		||||
	private TreeViewer contentOutlineViewer;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	private PropertyChangeListener l = new PropertyChangeListener() {
 | 
			
		||||
		@Override
 | 
			
		||||
		public void propertyChange(PropertyChangeEvent evt) {
 | 
			
		||||
@@ -58,6 +57,7 @@ public class DesignBrowser implements ISelectionChangedListener {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	@PostConstruct
 | 
			
		||||
	public void createComposite(Composite parent) {
 | 
			
		||||
@@ -73,38 +73,22 @@ public class DesignBrowser implements ISelectionChangedListener {
 | 
			
		||||
	@Focus
 | 
			
		||||
	public void setFocus() {
 | 
			
		||||
		contentOutlineViewer.getTree().setFocus();
 | 
			
		||||
		setSelection(contentOutlineViewer.getSelection());
 | 
			
		||||
		selectionService.setSelection(contentOutlineViewer.getSelection());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void selectionChanged(SelectionChangedEvent event) {
 | 
			
		||||
		setSelection(event.getSelection());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected void setSelection(ISelection iSelection) {
 | 
			
		||||
		IStructuredSelection selection = (IStructuredSelection)iSelection;
 | 
			
		||||
		switch(selection.size()){
 | 
			
		||||
		case 0:
 | 
			
		||||
			eventBroker.post(WaveformViewerPart.ACTIVE_NODE, null);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1:
 | 
			
		||||
			eventBroker.post(WaveformViewerPart.ACTIVE_NODE, selection.getFirstElement());
 | 
			
		||||
			selectionService.setSelection(selection.getFirstElement());
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			eventBroker.post(WaveformViewerPart.ACTIVE_NODE, selection.getFirstElement());
 | 
			
		||||
			selectionService.setSelection(selection.toList());
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		selectionService.setSelection(event.getSelection());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	@Inject @Optional
 | 
			
		||||
	public void  getStatusEvent(@UIEventTopic(WaveformViewerPart.ACTIVE_DATABASE) IWaveformDb database) {
 | 
			
		||||
	public void  getStatusEvent(@UIEventTopic(WaveformViewerPart.ACTIVE_WAVEFORMVIEW) WaveformViewerPart waveformViewerPart) {
 | 
			
		||||
		IWaveformDb database = waveformViewerPart.getDatabase();
 | 
			
		||||
		Object input = contentOutlineViewer.getInput();
 | 
			
		||||
		if(input!=null && input instanceof List<?>)
 | 
			
		||||
			((List<IWaveformDb>)input).get(0).removePropertyChangeListener(l);
 | 
			
		||||
		contentOutlineViewer.setInput(Arrays.asList(new IWaveformDb[]{database}));
 | 
			
		||||
		contentOutlineViewer.setInput(database.isLoaded()?Arrays.asList(new IWaveformDb[]{database}):null);
 | 
			
		||||
		// Set up the tree viewer
 | 
			
		||||
		database.addPropertyChangeListener(l);
 | 
			
		||||
	} 
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,8 @@
 | 
			
		||||
 *******************************************************************************/
 | 
			
		||||
package com.minres.scviewer.e4.application.parts;
 | 
			
		||||
 | 
			
		||||
import java.util.Vector;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.PostConstruct;
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
@@ -17,9 +19,21 @@ import javax.inject.Named;
 | 
			
		||||
import org.eclipse.e4.core.di.annotations.Optional;
 | 
			
		||||
import org.eclipse.e4.core.services.events.IEventBroker;
 | 
			
		||||
import org.eclipse.e4.ui.di.Focus;
 | 
			
		||||
import org.eclipse.e4.ui.di.UIEventTopic;
 | 
			
		||||
import org.eclipse.e4.ui.services.IServiceConstants;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 | 
			
		||||
import org.eclipse.jface.viewers.TableViewer;
 | 
			
		||||
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
 | 
			
		||||
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
 | 
			
		||||
import org.eclipse.jface.viewers.DoubleClickEvent;
 | 
			
		||||
import org.eclipse.jface.viewers.IDoubleClickListener;
 | 
			
		||||
import org.eclipse.jface.viewers.ISelection;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
import org.eclipse.jface.viewers.ITreeContentProvider;
 | 
			
		||||
import org.eclipse.jface.viewers.LabelProvider;
 | 
			
		||||
import org.eclipse.jface.viewers.StructuredSelection;
 | 
			
		||||
import org.eclipse.jface.viewers.StyledString;
 | 
			
		||||
import org.eclipse.jface.viewers.TreeViewer;
 | 
			
		||||
import org.eclipse.jface.viewers.TreeViewerColumn;
 | 
			
		||||
import org.eclipse.jface.viewers.Viewer;
 | 
			
		||||
import org.eclipse.jface.viewers.ViewerFilter;
 | 
			
		||||
import org.eclipse.jface.viewers.ViewerSorter;
 | 
			
		||||
@@ -35,13 +49,12 @@ import org.eclipse.swt.graphics.Rectangle;
 | 
			
		||||
import org.eclipse.swt.layout.GridData;
 | 
			
		||||
import org.eclipse.swt.layout.GridLayout;
 | 
			
		||||
import org.eclipse.swt.widgets.Composite;
 | 
			
		||||
import org.eclipse.swt.widgets.Table;
 | 
			
		||||
import org.eclipse.swt.widgets.TableColumn;
 | 
			
		||||
import org.eclipse.swt.widgets.Text;
 | 
			
		||||
import org.eclipse.swt.widgets.Tree;
 | 
			
		||||
 | 
			
		||||
import com.minres.scviewer.database.ITx;
 | 
			
		||||
import com.minres.scviewer.database.ITxAttribute;
 | 
			
		||||
import com.minres.scviewer.e4.application.provider.TxPropertiesContentProvider;
 | 
			
		||||
import com.minres.scviewer.database.ITxRelation;
 | 
			
		||||
import com.minres.scviewer.e4.application.provider.TxPropertiesLabelProvider;
 | 
			
		||||
 | 
			
		||||
public class TransactionDetails {
 | 
			
		||||
@@ -51,16 +64,25 @@ public class TransactionDetails {
 | 
			
		||||
 | 
			
		||||
	public static final int COLUMN_SECOND = 1;
 | 
			
		||||
 | 
			
		||||
	public static final int COLUMN_THIRD = 2;
 | 
			
		||||
 | 
			
		||||
	@Inject IEventBroker eventBroker;
 | 
			
		||||
 | 
			
		||||
	@Inject	ESelectionService selectionService;
 | 
			
		||||
 | 
			
		||||
	private Text nameFilter;
 | 
			
		||||
	private TableViewer txTableViewer;
 | 
			
		||||
	private TableColumn col1, col2;
 | 
			
		||||
 | 
			
		||||
	private TreeViewer treeViewer;
 | 
			
		||||
 | 
			
		||||
	private TreeViewerColumn col1, col2, col3;
 | 
			
		||||
 | 
			
		||||
	TxAttributeFilter attributeFilter;
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	TxAttributeViewerSorter viewSorter;
 | 
			
		||||
 | 
			
		||||
	private WaveformViewerPart waveformViewerPart;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	@PostConstruct
 | 
			
		||||
	public void createComposite(final Composite parent) {
 | 
			
		||||
		parent.setLayout(new GridLayout(1, false));
 | 
			
		||||
@@ -71,57 +93,89 @@ public class TransactionDetails {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void modifyText(ModifyEvent e) {
 | 
			
		||||
				attributeFilter.setSearchText(((Text) e.widget).getText());
 | 
			
		||||
				txTableViewer.refresh();
 | 
			
		||||
				treeViewer.refresh();
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		nameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 | 
			
		||||
 | 
			
		||||
		attributeFilter = new TxAttributeFilter();
 | 
			
		||||
		viewSorter = new TxAttributeViewerSorter();
 | 
			
		||||
		
 | 
			
		||||
		txTableViewer = new TableViewer(parent);
 | 
			
		||||
		txTableViewer.setContentProvider(new TxPropertiesContentProvider());
 | 
			
		||||
		txTableViewer.setLabelProvider(new TxPropertiesLabelProvider());
 | 
			
		||||
		txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
 | 
			
		||||
		txTableViewer.addFilter(attributeFilter);
 | 
			
		||||
		
 | 
			
		||||
		treeViewer = new TreeViewer(parent);
 | 
			
		||||
		treeViewer.setContentProvider(new TransactionTreeContentProvider());
 | 
			
		||||
		treeViewer.setLabelProvider(new TxPropertiesLabelProvider());
 | 
			
		||||
		treeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
 | 
			
		||||
		treeViewer.addFilter(attributeFilter);
 | 
			
		||||
		treeViewer.setSorter(viewSorter);
 | 
			
		||||
		treeViewer.setAutoExpandLevel(2);
 | 
			
		||||
 | 
			
		||||
		// Set up the table
 | 
			
		||||
		Table table = txTableViewer.getTable();
 | 
			
		||||
		table.setLayoutData(new GridData(GridData.FILL_BOTH));
 | 
			
		||||
 | 
			
		||||
		// Add the first name column
 | 
			
		||||
		col1 = new TableColumn(table, SWT.LEFT);
 | 
			
		||||
		col1.setText("Name");
 | 
			
		||||
		col1.setResizable(true);
 | 
			
		||||
		col1.addSelectionListener(new SelectionAdapter() {
 | 
			
		||||
		Tree tree = treeViewer.getTree();
 | 
			
		||||
		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
 | 
			
		||||
		// Add the name column
 | 
			
		||||
		col1 = new TreeViewerColumn(treeViewer, SWT.NONE);
 | 
			
		||||
		col1.getColumn().setText("Name");
 | 
			
		||||
		col1.getColumn().setResizable(true);
 | 
			
		||||
		col1.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.NAME)));
 | 
			
		||||
		col1.getColumn().addSelectionListener(new SelectionAdapter() {
 | 
			
		||||
			public void widgetSelected(SelectionEvent event) {
 | 
			
		||||
				((TxAttributeViewerSorter) txTableViewer.getSorter()).doSort(COLUMN_FIRST);
 | 
			
		||||
				txTableViewer.refresh();
 | 
			
		||||
				((TxAttributeViewerSorter) treeViewer.getSorter()).doSort(COLUMN_FIRST);
 | 
			
		||||
				treeViewer.refresh();
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		// Add the last name column
 | 
			
		||||
		col2 = new TableColumn(table, SWT.LEFT);
 | 
			
		||||
		col2.setText("Value");
 | 
			
		||||
		col2.setResizable(true);
 | 
			
		||||
		col2.addSelectionListener(new SelectionAdapter() {
 | 
			
		||||
		// Add the type column
 | 
			
		||||
		col2 = new TreeViewerColumn(treeViewer, SWT.NONE);
 | 
			
		||||
		col2.getColumn().setText("Type");
 | 
			
		||||
		col2.getColumn().setResizable(true);
 | 
			
		||||
		col2.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.TYPE)));
 | 
			
		||||
		col2.getColumn().addSelectionListener(new SelectionAdapter() {
 | 
			
		||||
			public void widgetSelected(SelectionEvent event) {
 | 
			
		||||
				((TxAttributeViewerSorter) txTableViewer.getSorter()).doSort(COLUMN_SECOND);
 | 
			
		||||
				txTableViewer.refresh();
 | 
			
		||||
				((TxAttributeViewerSorter) treeViewer.getSorter()).doSort(COLUMN_SECOND);
 | 
			
		||||
				treeViewer.refresh();
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		// Add the value column
 | 
			
		||||
		col3 = new TreeViewerColumn(treeViewer, SWT.NONE);
 | 
			
		||||
		col3.getColumn().setText("Value");
 | 
			
		||||
		col3.getColumn().setResizable(true);
 | 
			
		||||
		col3.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.VALUE)));
 | 
			
		||||
		col3.getColumn().addSelectionListener(new SelectionAdapter() {
 | 
			
		||||
			public void widgetSelected(SelectionEvent event) {
 | 
			
		||||
				((TxAttributeViewerSorter) treeViewer.getSorter()).doSort(COLUMN_SECOND);
 | 
			
		||||
				treeViewer.refresh();
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		// 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
 | 
			
		||||
		table.setHeaderVisible(true);
 | 
			
		||||
		table.setLinesVisible(true);
 | 
			
		||||
		tree.setHeaderVisible(true);
 | 
			
		||||
		tree.setLinesVisible(true);
 | 
			
		||||
		
 | 
			
		||||
		treeViewer.addDoubleClickListener(new IDoubleClickListener(){
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
			public void doubleClick(DoubleClickEvent event) {
 | 
			
		||||
				ISelection selection = treeViewer.getSelection();
 | 
			
		||||
				if(selection instanceof IStructuredSelection){
 | 
			
		||||
					IStructuredSelection structuredSelection = (IStructuredSelection) selection;
 | 
			
		||||
					Object selected = structuredSelection.getFirstElement();
 | 
			
		||||
					if(selected instanceof Object[]){
 | 
			
		||||
						Object[] selectedArray = (Object[]) selected;
 | 
			
		||||
						if(selectedArray.length==3 && selectedArray[2] instanceof ITx){
 | 
			
		||||
							waveformViewerPart.setSelection(new StructuredSelection(selectedArray[2]));
 | 
			
		||||
							treeViewer.setInput(selectedArray[2]);
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
		});
 | 
			
		||||
		parent.addControlListener(new ControlAdapter() {
 | 
			
		||||
			public void controlResized(ControlEvent e) {
 | 
			
		||||
				Table table = txTableViewer.getTable();
 | 
			
		||||
				Tree table = treeViewer.getTree();
 | 
			
		||||
				Rectangle area = parent.getClientArea();
 | 
			
		||||
				Point preferredSize = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);
 | 
			
		||||
				int width = area.width - 2*table.getBorderWidth();
 | 
			
		||||
@@ -136,16 +190,18 @@ public class TransactionDetails {
 | 
			
		||||
					// table is getting smaller so make the columns 
 | 
			
		||||
					// smaller first and then resize the table to
 | 
			
		||||
					// match the client area width
 | 
			
		||||
					col1.setWidth(width/3);
 | 
			
		||||
					col2.setWidth(width - col1.getWidth());
 | 
			
		||||
					col1.getColumn().setWidth(width/3);
 | 
			
		||||
					col2.getColumn().setWidth(width/4);
 | 
			
		||||
					col3.getColumn().setWidth(width - col1.getColumn().getWidth());
 | 
			
		||||
					table.setSize(area.width, area.height);
 | 
			
		||||
				} else {
 | 
			
		||||
					// table is getting bigger so make the table 
 | 
			
		||||
					// bigger first and then make the columns wider
 | 
			
		||||
					// to match the client area width
 | 
			
		||||
					table.setSize(area.width, area.height);
 | 
			
		||||
					col1.setWidth(width/3);
 | 
			
		||||
					col2.setWidth(width - col1.getWidth());
 | 
			
		||||
					col1.getColumn().setWidth(width/3);
 | 
			
		||||
					col2.getColumn().setWidth(width/4);
 | 
			
		||||
					col3.getColumn().setWidth(width - col1.getColumn().getWidth()- col2.getColumn().getWidth());
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
@@ -153,19 +209,39 @@ public class TransactionDetails {
 | 
			
		||||
 | 
			
		||||
	@Focus
 | 
			
		||||
	public void setFocus() {
 | 
			
		||||
		txTableViewer.getTable().setFocus();
 | 
			
		||||
		treeViewer.getTree().setFocus();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Inject @Optional
 | 
			
		||||
	public void  getStatusEvent(@UIEventTopic(WaveformViewerPart.ACTIVE_WAVEFORMVIEW) WaveformViewerPart part) {
 | 
			
		||||
		this.waveformViewerPart=part;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Inject
 | 
			
		||||
	public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional Object object){
 | 
			
		||||
		if(txTableViewer!=null && !txTableViewer.getTable().isDisposed())
 | 
			
		||||
			if(object instanceof ITx){
 | 
			
		||||
				txTableViewer.setInput(object);
 | 
			
		||||
			} else {
 | 
			
		||||
				txTableViewer.setInput(null);
 | 
			
		||||
	public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional IStructuredSelection selection){
 | 
			
		||||
		if(treeViewer!=null && selection!=null && !treeViewer.getTree().isDisposed()){
 | 
			
		||||
			if( selection instanceof IStructuredSelection) {
 | 
			
		||||
				Object object= ((IStructuredSelection)selection).getFirstElement();			
 | 
			
		||||
				if(object instanceof ITx){
 | 
			
		||||
					treeViewer.setInput(object);
 | 
			
		||||
				} else {
 | 
			
		||||
					treeViewer.setInput(null);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	String timeToString(Long time){
 | 
			
		||||
		return waveformViewerPart.getScaledTime(time);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	String txToString(ITx tx){
 | 
			
		||||
		StringBuilder sb = new StringBuilder();
 | 
			
		||||
		sb.append("tx#").append(tx.getId()).append("[").append(timeToString(tx.getBeginTime())).
 | 
			
		||||
			append(" - ").append(timeToString(tx.getEndTime())).append("]");
 | 
			
		||||
		return sb.toString();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	class TxAttributeViewerSorter extends ViewerSorter {
 | 
			
		||||
		private static final int ASCENDING = 0;
 | 
			
		||||
 | 
			
		||||
@@ -199,45 +275,182 @@ public class TransactionDetails {
 | 
			
		||||
		@SuppressWarnings("unchecked")
 | 
			
		||||
		public int compare(Viewer viewer, Object e1, Object e2) {
 | 
			
		||||
			int rc = 0;
 | 
			
		||||
			ITxAttribute p1 = (ITxAttribute) e1;
 | 
			
		||||
			ITxAttribute p2 = (ITxAttribute) e2;
 | 
			
		||||
 | 
			
		||||
			// Determine which column and do the appropriate sort
 | 
			
		||||
			switch (column) {
 | 
			
		||||
			case COLUMN_FIRST:
 | 
			
		||||
				rc = getComparator().compare(p1.getName(), p2.getName());
 | 
			
		||||
				break;
 | 
			
		||||
			case COLUMN_SECOND:
 | 
			
		||||
				rc = getComparator().compare(p1.getValue(), p2.getValue());
 | 
			
		||||
				break;
 | 
			
		||||
			if(e1 instanceof ITxAttribute && e2 instanceof ITxAttribute){
 | 
			
		||||
				ITxAttribute p1 = (ITxAttribute) e1;
 | 
			
		||||
				ITxAttribute p2 = (ITxAttribute) e2;
 | 
			
		||||
				// Determine which column and do the appropriate sort
 | 
			
		||||
				switch (column) {
 | 
			
		||||
				case COLUMN_FIRST:
 | 
			
		||||
					rc = getComparator().compare(p1.getName(), p2.getName());
 | 
			
		||||
					break;
 | 
			
		||||
				case COLUMN_SECOND:
 | 
			
		||||
					rc = getComparator().compare(p1.getDataType().name(), p2.getDataType().name());
 | 
			
		||||
					break;
 | 
			
		||||
				case COLUMN_THIRD:
 | 
			
		||||
					rc = getComparator().compare(p1.getValue(), p2.getValue());
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				// If descending order, flip the direction
 | 
			
		||||
				if (direction == DESCENDING) rc = -rc;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// If descending order, flip the direction
 | 
			
		||||
			if (direction == DESCENDING)
 | 
			
		||||
				rc = -rc;
 | 
			
		||||
 | 
			
		||||
			return rc;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public class TxAttributeFilter extends ViewerFilter {
 | 
			
		||||
	class TxAttributeFilter extends ViewerFilter {
 | 
			
		||||
 | 
			
		||||
		  private String searchString;
 | 
			
		||||
		private String searchString;
 | 
			
		||||
 | 
			
		||||
		  public void setSearchText(String s) {
 | 
			
		||||
		    this.searchString = ".*" + s + ".*";
 | 
			
		||||
		  }
 | 
			
		||||
 | 
			
		||||
		  @Override
 | 
			
		||||
		  public boolean select(Viewer viewer, Object parentElement, Object element) {
 | 
			
		||||
		    if (searchString == null || searchString.length() == 0) {
 | 
			
		||||
		      return true;
 | 
			
		||||
		    }
 | 
			
		||||
		    ITxAttribute p = (ITxAttribute) element;
 | 
			
		||||
		    if (p.getName().matches(searchString)) {
 | 
			
		||||
		      return true;
 | 
			
		||||
		    }
 | 
			
		||||
		    return false;
 | 
			
		||||
		  }
 | 
			
		||||
		public void setSearchText(String s) {
 | 
			
		||||
			this.searchString = ".*" + s + ".*";
 | 
			
		||||
		}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public boolean select(Viewer viewer, Object parentElement, Object element) {
 | 
			
		||||
			if (searchString == null || searchString.length() == 0) {
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
			if(element instanceof ITxAttribute){
 | 
			
		||||
				ITxAttribute p = (ITxAttribute) element;
 | 
			
		||||
				if (p.getName().matches(searchString)) {
 | 
			
		||||
					return true;
 | 
			
		||||
				}
 | 
			
		||||
			} else if(element instanceof TreeNode)
 | 
			
		||||
				return true;
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	enum Type {TIMES, PROPS, IN_REL, OUT_REL}
 | 
			
		||||
 | 
			
		||||
	class TreeNode{
 | 
			
		||||
		public Type type;
 | 
			
		||||
		public ITx element;
 | 
			
		||||
 | 
			
		||||
		public TreeNode(ITx element, Type type){
 | 
			
		||||
			this.element=element;
 | 
			
		||||
			this.type=type;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public String toString(){
 | 
			
		||||
			switch(type){
 | 
			
		||||
			case TIMES:      return "Times";
 | 
			
		||||
			case PROPS:	     return "Attributes";
 | 
			
		||||
			case IN_REL:     return "Incoming relations";
 | 
			
		||||
			case OUT_REL:    return "Outgoing relations";
 | 
			
		||||
			}
 | 
			
		||||
			return "";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	class TransactionTreeContentProvider implements ITreeContentProvider {
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public void dispose() {	}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public Object[] getElements(Object element) {
 | 
			
		||||
			return new Object[]{
 | 
			
		||||
					new TreeNode((ITx)element, Type.TIMES),  
 | 
			
		||||
					new TreeNode((ITx)element, Type.PROPS),  
 | 
			
		||||
					new TreeNode((ITx)element, Type.IN_REL),
 | 
			
		||||
					new TreeNode((ITx)element, Type.OUT_REL)
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public Object[] getChildren(Object element) {
 | 
			
		||||
			if(element instanceof TreeNode){
 | 
			
		||||
				TreeNode propertyHolder=(TreeNode) element;
 | 
			
		||||
				if(propertyHolder.type == Type.TIMES)
 | 
			
		||||
					return new Object[][]{
 | 
			
		||||
							{"Start time", "", timeToString(propertyHolder.element.getBeginTime())},
 | 
			
		||||
							{"End time", "", timeToString(propertyHolder.element.getEndTime())}};
 | 
			
		||||
				else if(propertyHolder.type == Type.PROPS)
 | 
			
		||||
					return propertyHolder.element.getAttributes().toArray();
 | 
			
		||||
				else if(propertyHolder.type == Type.IN_REL){
 | 
			
		||||
					Vector<Object[] > res = new Vector<>();
 | 
			
		||||
					for(ITxRelation rel:propertyHolder.element.getIncomingRelations()){
 | 
			
		||||
						res.add(new Object[]{
 | 
			
		||||
								rel.getRelationType(), 
 | 
			
		||||
								rel.getSource().getGenerator().getName(), 
 | 
			
		||||
								txToString(rel.getSource())});
 | 
			
		||||
					}
 | 
			
		||||
					return res.toArray();
 | 
			
		||||
				} else if(propertyHolder.type == Type.OUT_REL){
 | 
			
		||||
					Vector<Object[] > res = new Vector<>();
 | 
			
		||||
					for(ITxRelation rel:propertyHolder.element.getOutgoingRelations()){
 | 
			
		||||
						res.add(new Object[]{
 | 
			
		||||
								rel.getRelationType(), 
 | 
			
		||||
								rel.getTarget().getGenerator().getName(), 
 | 
			
		||||
								txToString(rel.getTarget())});
 | 
			
		||||
					}
 | 
			
		||||
					return res.toArray();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public Object getParent(Object element) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public boolean hasChildren(Object element) {
 | 
			
		||||
			return getChildren(element)!=null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	class AttributeLabelProvider extends LabelProvider implements IStyledLabelProvider {
 | 
			
		||||
		final int field;
 | 
			
		||||
		public static final int NAME=0;
 | 
			
		||||
		public static final int TYPE=1;
 | 
			
		||||
		public static final int VALUE=2;
 | 
			
		||||
 | 
			
		||||
		public  AttributeLabelProvider(int field) {
 | 
			
		||||
			this.field=field;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public StyledString getStyledText(Object element) {
 | 
			
		||||
			switch(field){
 | 
			
		||||
			case NAME:
 | 
			
		||||
				if (element instanceof ITxAttribute) {
 | 
			
		||||
					ITxAttribute attribute = (ITxAttribute) element;
 | 
			
		||||
					return new StyledString(attribute.getName());
 | 
			
		||||
				}else if (element instanceof ITxRelation) {
 | 
			
		||||
					return new StyledString("Relation");
 | 
			
		||||
				}else if(element instanceof Object[]){
 | 
			
		||||
					Object[] elements = (Object[]) element;
 | 
			
		||||
					return new StyledString(elements[field].toString());
 | 
			
		||||
				} else 
 | 
			
		||||
					return new StyledString(element.toString());
 | 
			
		||||
			case TYPE:
 | 
			
		||||
				if (element instanceof ITxAttribute) {
 | 
			
		||||
					ITxAttribute attribute = (ITxAttribute) element;
 | 
			
		||||
					return new StyledString(attribute.getDataType().toString());
 | 
			
		||||
				}else if(element instanceof Object[]){
 | 
			
		||||
					Object[] elements = (Object[]) element;
 | 
			
		||||
					return new StyledString(elements[field].toString());
 | 
			
		||||
				}else 
 | 
			
		||||
					return new StyledString("");					
 | 
			
		||||
			default:
 | 
			
		||||
				if (element instanceof ITxAttribute) {
 | 
			
		||||
					ITxAttribute attribute = (ITxAttribute) element;
 | 
			
		||||
					return new StyledString(attribute.getValue().toString());
 | 
			
		||||
				}else if(element instanceof Object[]){
 | 
			
		||||
					Object[] elements = (Object[]) element;
 | 
			
		||||
					return new StyledString(elements[field].toString());
 | 
			
		||||
				}else 
 | 
			
		||||
					return new StyledString("");					
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,25 +10,33 @@
 | 
			
		||||
 *******************************************************************************/
 | 
			
		||||
package com.minres.scviewer.e4.application.parts;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.lang.annotation.Annotation;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.PostConstruct;
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 | 
			
		||||
import org.eclipse.e4.core.contexts.IEclipseContext;
 | 
			
		||||
import org.eclipse.e4.core.di.annotations.CanExecute;
 | 
			
		||||
import org.eclipse.e4.core.di.annotations.Execute;
 | 
			
		||||
import org.eclipse.e4.core.di.annotations.Optional;
 | 
			
		||||
import org.eclipse.e4.core.services.events.IEventBroker;
 | 
			
		||||
import org.eclipse.e4.ui.di.Focus;
 | 
			
		||||
import org.eclipse.e4.ui.di.UIEventTopic;
 | 
			
		||||
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 | 
			
		||||
import org.eclipse.e4.ui.services.EMenuService;
 | 
			
		||||
import org.eclipse.e4.ui.services.IServiceConstants;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.EPartService;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 | 
			
		||||
import org.eclipse.jface.viewers.DoubleClickEvent;
 | 
			
		||||
import org.eclipse.jface.viewers.IDoubleClickListener;
 | 
			
		||||
import org.eclipse.jface.viewers.ISelection;
 | 
			
		||||
import org.eclipse.jface.viewers.ISelectionChangedListener;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredContentProvider;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
import org.eclipse.jface.viewers.SelectionChangedEvent;
 | 
			
		||||
import org.eclipse.jface.viewers.StructuredSelection;
 | 
			
		||||
import org.eclipse.jface.viewers.TableViewer;
 | 
			
		||||
import org.eclipse.jface.viewers.Viewer;
 | 
			
		||||
import org.eclipse.jface.viewers.ViewerFilter;
 | 
			
		||||
@@ -45,23 +53,38 @@ import org.eclipse.swt.widgets.ToolBar;
 | 
			
		||||
import org.eclipse.swt.widgets.ToolItem;
 | 
			
		||||
import org.eclipse.wb.swt.ResourceManager;
 | 
			
		||||
 | 
			
		||||
import com.minres.scviewer.database.IHierNode;
 | 
			
		||||
import com.minres.scviewer.database.ITx;
 | 
			
		||||
import com.minres.scviewer.database.IWaveform;
 | 
			
		||||
import com.minres.scviewer.e4.application.handlers.AddWaveformHandler;
 | 
			
		||||
import com.minres.scviewer.e4.application.provider.TxDbContentProvider;
 | 
			
		||||
import com.minres.scviewer.e4.application.provider.TxDbLabelProvider;
 | 
			
		||||
 | 
			
		||||
public class WaveformListPart implements ISelectionChangedListener {
 | 
			
		||||
 | 
			
		||||
	private static final String POPUP_ID="com.minres.scviewer.e4.application.parts.WaveformList.popupmenu";
 | 
			
		||||
 | 
			
		||||
	@Inject IEventBroker eventBroker;
 | 
			
		||||
 | 
			
		||||
	@Inject	ESelectionService selectionService;
 | 
			
		||||
 | 
			
		||||
	@Inject EMenuService menuService;
 | 
			
		||||
 | 
			
		||||
	@Inject IEclipseContext eclipseCtx;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	private Text nameFilter;
 | 
			
		||||
 | 
			
		||||
	private TableViewer txTableViewer;
 | 
			
		||||
 | 
			
		||||
	ToolItem appendItem, insertItem, insertAllItem, appendAllItem;
 | 
			
		||||
 | 
			
		||||
	WaveformAttributeFilter attributeFilter;
 | 
			
		||||
 | 
			
		||||
	int thisSelectionCount=0, otherSelectionCount=0;
 | 
			
		||||
 | 
			
		||||
	private WaveformViewerPart waveformViewerPart;
 | 
			
		||||
 | 
			
		||||
	@PostConstruct
 | 
			
		||||
	public void createComposite(Composite parent) {
 | 
			
		||||
		parent.setLayout(new GridLayout(1, false));
 | 
			
		||||
@@ -86,40 +109,64 @@ public class WaveformListPart implements ISelectionChangedListener {
 | 
			
		||||
		txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
 | 
			
		||||
		txTableViewer.addSelectionChangedListener(this);
 | 
			
		||||
		txTableViewer.addFilter(attributeFilter);
 | 
			
		||||
		txTableViewer.addDoubleClickListener(new IDoubleClickListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void doubleClick(DoubleClickEvent event) {
 | 
			
		||||
				AddWaveformHandler myHandler = new AddWaveformHandler();
 | 
			
		||||
				Object result = runCommand(myHandler, CanExecute.class, "after", false);
 | 
			
		||||
				if(result!=null && (Boolean)result)
 | 
			
		||||
					ContextInjectionFactory.invoke(myHandler, Execute.class, eclipseCtx);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		menuService.registerContextMenu(txTableViewer.getControl(), POPUP_ID);
 | 
			
		||||
 | 
			
		||||
		ToolBar toolBar = new ToolBar(parent, SWT.FLAT | SWT.RIGHT);
 | 
			
		||||
		toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
 | 
			
		||||
		toolBar.setBounds(0, 0, 87, 20);
 | 
			
		||||
 | 
			
		||||
		appendItem = new ToolItem(toolBar, SWT.NONE);
 | 
			
		||||
		appendItem.setToolTipText("Append selected");
 | 
			
		||||
		appendItem.setToolTipText("Append after");
 | 
			
		||||
		appendItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/append_wave.png"));
 | 
			
		||||
		appendItem.setEnabled(false);
 | 
			
		||||
		appendItem.addSelectionListener(new SelectionAdapter() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void widgetSelected(SelectionEvent e) {
 | 
			
		||||
				/*
 | 
			
		||||
				eventBroker.post(WaveformViewerPart.ADD_WAVEFORM,
 | 
			
		||||
						((IStructuredSelection)txTableViewer.getSelection()).toList());
 | 
			
		||||
 | 
			
		||||
				ECommandService commandService = eclipseCtx.get(ECommandService.class);
 | 
			
		||||
				EHandlerService handlerService = eclipseCtx.get(EHandlerService.class); 
 | 
			
		||||
				HashMap<String,Object> param=new HashMap<>();
 | 
			
		||||
				param.clear();
 | 
			
		||||
				//param.put("where", "after");
 | 
			
		||||
				ParameterizedCommand myCommand = commandService.createCommand(COMMAND_ID, param);
 | 
			
		||||
				if(myCommand!=null)handlerService.executeHandler(myCommand);
 | 
			
		||||
				 */
 | 
			
		||||
				AddWaveformHandler myHandler = new AddWaveformHandler();
 | 
			
		||||
				Object result = runCommand(myHandler, CanExecute.class, "after", false);
 | 
			
		||||
				if(result!=null && (Boolean)result)
 | 
			
		||||
					ContextInjectionFactory.invoke(myHandler, Execute.class, eclipseCtx);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		insertItem = new ToolItem(toolBar, SWT.NONE);
 | 
			
		||||
		insertItem.setToolTipText("Insert selected");
 | 
			
		||||
		insertItem.setToolTipText("Insert before");
 | 
			
		||||
		insertItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/insert_wave.png"));
 | 
			
		||||
		insertItem.setEnabled(false);
 | 
			
		||||
		insertItem.addSelectionListener(new SelectionAdapter() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void widgetSelected(SelectionEvent e) {
 | 
			
		||||
				eventBroker.post(WaveformViewerPart.ADD_WAVEFORM,
 | 
			
		||||
						((IStructuredSelection)txTableViewer.getSelection()).toList());
 | 
			
		||||
 | 
			
		||||
				AddWaveformHandler myHandler = new AddWaveformHandler();
 | 
			
		||||
				Object result = runCommand(myHandler, CanExecute.class, "before", false);
 | 
			
		||||
				if(result!=null && (Boolean)result)
 | 
			
		||||
					ContextInjectionFactory.invoke(myHandler, Execute.class, eclipseCtx);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		new ToolItem(toolBar, SWT.SEPARATOR);
 | 
			
		||||
 | 
			
		||||
		appendAllItem = new ToolItem(toolBar, SWT.NONE);
 | 
			
		||||
		appendAllItem.setToolTipText("Append all");
 | 
			
		||||
		appendAllItem.setToolTipText("Append all after");
 | 
			
		||||
		appendAllItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/append_all_waves.png"));
 | 
			
		||||
		appendAllItem.setEnabled(false);
 | 
			
		||||
 | 
			
		||||
@@ -128,22 +175,34 @@ public class WaveformListPart implements ISelectionChangedListener {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void widgetSelected(SelectionEvent e) {
 | 
			
		||||
				Object[] all = getFilteredChildren(txTableViewer);
 | 
			
		||||
				if(all.length>0)
 | 
			
		||||
					eventBroker.post(WaveformViewerPart.ADD_WAVEFORM, Arrays.asList(all));
 | 
			
		||||
 | 
			
		||||
				if(all.length>0){
 | 
			
		||||
					Object oldSel=selectionService.getSelection();
 | 
			
		||||
					selectionService.setSelection(new StructuredSelection(all));
 | 
			
		||||
					AddWaveformHandler myHandler = new AddWaveformHandler();
 | 
			
		||||
					Object result = runCommand(myHandler, CanExecute.class, "after", false);
 | 
			
		||||
					if(result!=null && (Boolean)result)
 | 
			
		||||
						ContextInjectionFactory.invoke(myHandler, Execute.class, eclipseCtx);
 | 
			
		||||
					selectionService.setSelection(oldSel);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		insertAllItem = new ToolItem(toolBar, SWT.NONE);
 | 
			
		||||
		insertAllItem.setToolTipText("Insert all");
 | 
			
		||||
		insertAllItem.setToolTipText("Insert all before");
 | 
			
		||||
		insertAllItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/insert_all_waves.png"));
 | 
			
		||||
		insertAllItem.setEnabled(false);
 | 
			
		||||
		insertAllItem.addSelectionListener(new SelectionAdapter() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void widgetSelected(SelectionEvent e) {
 | 
			
		||||
				Object[] all = getFilteredChildren(txTableViewer);
 | 
			
		||||
				if(all.length>0)
 | 
			
		||||
					eventBroker.post(WaveformViewerPart.ADD_WAVEFORM, Arrays.asList(all));
 | 
			
		||||
 | 
			
		||||
				if(all.length>0){
 | 
			
		||||
					Object oldSel=selectionService.getSelection();
 | 
			
		||||
					selectionService.setSelection(new StructuredSelection(all));
 | 
			
		||||
					AddWaveformHandler myHandler = new AddWaveformHandler();
 | 
			
		||||
					Object result = runCommand(myHandler, CanExecute.class, "before", false);
 | 
			
		||||
					if(result!=null && (Boolean)result)
 | 
			
		||||
						ContextInjectionFactory.invoke(myHandler, Execute.class, eclipseCtx);
 | 
			
		||||
					selectionService.setSelection(oldSel);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
@@ -155,8 +214,8 @@ public class WaveformListPart implements ISelectionChangedListener {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Inject @Optional
 | 
			
		||||
	public void  getStatusEvent(@UIEventTopic(WaveformViewerPart.ACTIVE_NODE) Object o) {
 | 
			
		||||
		txTableViewer.setInput(o);
 | 
			
		||||
	public void  getStatusEvent(@UIEventTopic(WaveformViewerPart.ACTIVE_WAVEFORMVIEW) WaveformViewerPart part) {
 | 
			
		||||
		this.waveformViewerPart=part;
 | 
			
		||||
		updateButtons();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -167,37 +226,40 @@ public class WaveformListPart implements ISelectionChangedListener {
 | 
			
		||||
 | 
			
		||||
	protected void setSelection(ISelection iSelection) {
 | 
			
		||||
		IStructuredSelection selection = (IStructuredSelection)iSelection;
 | 
			
		||||
		switch(selection.size()){
 | 
			
		||||
		case 0:
 | 
			
		||||
		if(selection.size()==0){
 | 
			
		||||
			appendItem.setEnabled(false);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1:
 | 
			
		||||
			selectionService.setSelection(selection.getFirstElement());
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			selectionService.setSelection(selection.toList());
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		selectionService.setSelection(selection);
 | 
			
		||||
		thisSelectionCount=selection.toList().size();
 | 
			
		||||
		updateButtons();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Inject
 | 
			
		||||
	public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional Object object, EPartService partService){
 | 
			
		||||
	public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional IStructuredSelection selection, EPartService partService){
 | 
			
		||||
		MPart part = partService.getActivePart();
 | 
			
		||||
		if(part!=null && part.getObject() != this)
 | 
			
		||||
			otherSelectionCount = (object instanceof IWaveform<?> || object instanceof ITx)?1:0;
 | 
			
		||||
		if(part!=null && part.getObject() != this && selection!=null){
 | 
			
		||||
			if( selection instanceof IStructuredSelection) {
 | 
			
		||||
				Object object= ((IStructuredSelection)selection).getFirstElement();			
 | 
			
		||||
				if(object instanceof IHierNode&& !(object instanceof IWaveform<?>))
 | 
			
		||||
					txTableViewer.setInput(object);
 | 
			
		||||
				otherSelectionCount = (object instanceof IWaveform<?> || object instanceof ITx)?1:0;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		updateButtons();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void updateButtons() {
 | 
			
		||||
		if(txTableViewer!=null && !insertItem.isDisposed() && !appendItem.isDisposed() && 
 | 
			
		||||
				!appendAllItem.isDisposed() && !insertAllItem.isDisposed()){
 | 
			
		||||
			Object[] all = getFilteredChildren(txTableViewer);
 | 
			
		||||
			appendItem.setEnabled(thisSelectionCount>0);
 | 
			
		||||
			appendAllItem.setEnabled(all.length>0);
 | 
			
		||||
			insertItem.setEnabled(thisSelectionCount>0 && otherSelectionCount>0);
 | 
			
		||||
			insertAllItem.setEnabled(all.length>0 && otherSelectionCount>0);
 | 
			
		||||
			AddWaveformHandler myHandler = new AddWaveformHandler();
 | 
			
		||||
			Object result = runCommand(myHandler, CanExecute.class, "after", false);
 | 
			
		||||
			appendItem.setEnabled(result instanceof Boolean && (Boolean)result);
 | 
			
		||||
			result = runCommand(myHandler, CanExecute.class, "after", true);
 | 
			
		||||
			appendAllItem.setEnabled(result instanceof Boolean && (Boolean)result);
 | 
			
		||||
			result = runCommand(myHandler, CanExecute.class, "before", false);
 | 
			
		||||
			insertItem.setEnabled(result instanceof Boolean && (Boolean)result);
 | 
			
		||||
			result = runCommand(myHandler, CanExecute.class, "before", true);
 | 
			
		||||
			insertAllItem.setEnabled(result instanceof Boolean && (Boolean)result);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -222,6 +284,10 @@ public class WaveformListPart implements ISelectionChangedListener {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Object[] getFilteredChildren(){
 | 
			
		||||
		return getFilteredChildren(txTableViewer);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	protected Object[] getFilteredChildren(TableViewer viewer){
 | 
			
		||||
		Object parent = viewer.getInput();
 | 
			
		||||
		if(parent==null) return new Object[0];
 | 
			
		||||
@@ -245,4 +311,17 @@ public class WaveformListPart implements ISelectionChangedListener {
 | 
			
		||||
		}
 | 
			
		||||
		return result;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public WaveformViewerPart getActiveWaveformViewerPart() {
 | 
			
		||||
		return waveformViewerPart;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected Object runCommand(AddWaveformHandler myHandler, Class<? extends Annotation> annotation, String where, Boolean all) {
 | 
			
		||||
		ContextInjectionFactory.inject(myHandler, eclipseCtx);
 | 
			
		||||
		eclipseCtx.set(AddWaveformHandler.PARAM_WHERE_ID, where);
 | 
			
		||||
		eclipseCtx.set(AddWaveformHandler.PARAM_ALL_ID, all.toString());
 | 
			
		||||
		Object result = ContextInjectionFactory.invoke(myHandler, annotation, eclipseCtx);
 | 
			
		||||
		return result;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -18,7 +18,6 @@ import java.util.ArrayList;
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
import java.util.regex.Matcher;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
@@ -42,12 +41,12 @@ import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 | 
			
		||||
import org.eclipse.e4.ui.services.EMenuService;
 | 
			
		||||
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 | 
			
		||||
import org.eclipse.jface.dialogs.MessageDialog;
 | 
			
		||||
import org.eclipse.jface.viewers.ISelection;
 | 
			
		||||
import org.eclipse.jface.viewers.ISelectionChangedListener;
 | 
			
		||||
import org.eclipse.jface.viewers.IStructuredSelection;
 | 
			
		||||
import org.eclipse.jface.viewers.SelectionChangedEvent;
 | 
			
		||||
import org.eclipse.swt.widgets.Composite;
 | 
			
		||||
 | 
			
		||||
import com.minres.scviewer.database.IHierNode;
 | 
			
		||||
import com.minres.scviewer.database.ITx;
 | 
			
		||||
import com.minres.scviewer.database.IWaveform;
 | 
			
		||||
import com.minres.scviewer.database.IWaveformDb;
 | 
			
		||||
@@ -59,9 +58,7 @@ import com.minres.scviewer.e4.application.internal.StatusBarControl;
 | 
			
		||||
 | 
			
		||||
public class WaveformViewerPart {
 | 
			
		||||
 | 
			
		||||
	public static final String ACTIVE_DATABASE="Active_Database";
 | 
			
		||||
	public static final String ACTIVE_NODE="ActiveNode";
 | 
			
		||||
	public static final String ACTIVE_NODE_PATH="ActiveNodePath";
 | 
			
		||||
	public static final String ACTIVE_WAVEFORMVIEW="Active_Waveform_View";
 | 
			
		||||
	public static final String ADD_WAVEFORM="AddWaveform";
 | 
			
		||||
 | 
			
		||||
	protected static final String DATABASE_FILE = "DATABASE_FILE";
 | 
			
		||||
@@ -83,12 +80,10 @@ public class WaveformViewerPart {
 | 
			
		||||
	@Inject	private IEventBroker eventBroker;
 | 
			
		||||
 | 
			
		||||
	@Inject EMenuService menuService;
 | 
			
		||||
	
 | 
			
		||||
	@Inject	ESelectionService selectionService;
 | 
			
		||||
	
 | 
			
		||||
	private IWaveformDb database;
 | 
			
		||||
 | 
			
		||||
	private IHierNode activeNode;
 | 
			
		||||
	@Inject	ESelectionService selectionService;
 | 
			
		||||
 | 
			
		||||
	private IWaveformDb database;
 | 
			
		||||
 | 
			
		||||
	private Composite myParent;
 | 
			
		||||
 | 
			
		||||
@@ -128,12 +123,7 @@ public class WaveformViewerPart {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void selectionChanged(SelectionChangedEvent event) {
 | 
			
		||||
				if(event.getSelection() instanceof IStructuredSelection)
 | 
			
		||||
					for(Object o:((IStructuredSelection)event.getSelection()).toList()){
 | 
			
		||||
						if(o instanceof ITx || o instanceof IWaveform<?>){
 | 
			
		||||
							selectionService.setSelection(o);
 | 
			
		||||
							return;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					selectionService.setSelection(event.getSelection());
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		filesToLoad=new ArrayList<File>();
 | 
			
		||||
@@ -159,7 +149,7 @@ public class WaveformViewerPart {
 | 
			
		||||
				subMonitor.setTaskName("Loading database");
 | 
			
		||||
				try {
 | 
			
		||||
					for(File file: filesToLoad){
 | 
			
		||||
				        TimeUnit.SECONDS.sleep(2);
 | 
			
		||||
						//TimeUnit.SECONDS.sleep(2);
 | 
			
		||||
						database.load(file);
 | 
			
		||||
						database.addPropertyChangeListener(txDisplay);
 | 
			
		||||
						subMonitor.worked(1);
 | 
			
		||||
@@ -237,8 +227,6 @@ public class WaveformViewerPart {
 | 
			
		||||
			persistedState.put(DATABASE_FILE+index, file.getAbsolutePath());
 | 
			
		||||
			index++;
 | 
			
		||||
		}
 | 
			
		||||
		if(activeNode!=null)
 | 
			
		||||
			persistedState.put(ACTIVE_NODE_PATH, activeNode.getFullName());
 | 
			
		||||
		persistedState.put(SHOWN_WAVEFORM+"S", Integer.toString(txDisplay.getStreamList().size()));
 | 
			
		||||
		index=0;
 | 
			
		||||
		for(IWaveform<? extends IWaveformEvent> waveform:txDisplay.getStreamList()){
 | 
			
		||||
@@ -249,8 +237,6 @@ public class WaveformViewerPart {
 | 
			
		||||
 | 
			
		||||
	protected void restoreState() {
 | 
			
		||||
		updateAll();
 | 
			
		||||
		String hierName = persistedState.get(ACTIVE_NODE_PATH);
 | 
			
		||||
		if(hierName!=null) eventBroker.post(ACTIVE_NODE_PATH, hierName);
 | 
			
		||||
		Integer waves = persistedState.containsKey(SHOWN_WAVEFORM+"S")?Integer.parseInt(persistedState.get(SHOWN_WAVEFORM+"S")):0;
 | 
			
		||||
		List<IWaveform<? extends IWaveformEvent>> res = new LinkedList<>();
 | 
			
		||||
		for(int i=0; i<waves;i++){
 | 
			
		||||
@@ -259,33 +245,24 @@ public class WaveformViewerPart {
 | 
			
		||||
		}
 | 
			
		||||
		if(res.size()>0) txDisplay.getStreamList().addAll(res);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	private void updateAll() {
 | 
			
		||||
		eventBroker.post(ACTIVE_DATABASE, database);
 | 
			
		||||
		eventBroker.post(ACTIVE_WAVEFORMVIEW, this);
 | 
			
		||||
		eventBroker.post(StatusBarControl.ZOOM_LEVEL, zoomLevel[txDisplay.getZoomLevel()]);
 | 
			
		||||
		eventBroker.post(StatusBarControl.CURSOR_TIME, Long.toString(txDisplay.getCursorTime()/1000000)+"ns");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Inject @Optional
 | 
			
		||||
	public void  getActiveNodeEvent(@UIEventTopic(WaveformViewerPart.ACTIVE_NODE) Object o, MPart activePart) {
 | 
			
		||||
		if(o instanceof IHierNode){
 | 
			
		||||
			activeNode=(IHierNode) o;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Inject @Optional
 | 
			
		||||
	public void  getAddWaveformEvent(@UIEventTopic(WaveformViewerPart.ADD_WAVEFORM) Object o) {
 | 
			
		||||
		Object sel = o==null?selectionService.getSelection():o;
 | 
			
		||||
		if(sel instanceof List<?>)
 | 
			
		||||
			for(Object el:((List<?>)sel)){
 | 
			
		||||
		if(sel instanceof IStructuredSelection)
 | 
			
		||||
			for(Object el:((IStructuredSelection)sel).toArray()){
 | 
			
		||||
				if(el instanceof IWaveform<?>) 
 | 
			
		||||
					addStreamToList((IWaveform<?>) el);
 | 
			
		||||
					addStreamToList((IWaveform<?>) el, false);
 | 
			
		||||
			}
 | 
			
		||||
		else if(sel instanceof IWaveform<?> )
 | 
			
		||||
			addStreamToList((IWaveform<?>) sel);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
/*	
 | 
			
		||||
	/*	
 | 
			
		||||
    @Inject 
 | 
			
		||||
	public void setWaveform(@Optional @Named( IServiceConstants.ACTIVE_SELECTION) IWaveform<?> waveform, 
 | 
			
		||||
			@Optional @Named( IServiceConstants.ACTIVE_PART) MPart part) {
 | 
			
		||||
@@ -293,7 +270,7 @@ public class WaveformViewerPart {
 | 
			
		||||
			txDisplay.setSelection(waveform==null?new StructuredSelection():new StructuredSelection(waveform)); 
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
*/
 | 
			
		||||
	 */
 | 
			
		||||
	protected boolean askIfToLoad(File txFile) {
 | 
			
		||||
		if(txFile.exists() &&
 | 
			
		||||
				MessageDialog.openQuestion(myParent.getDisplay().getActiveShell(), "Database open", 
 | 
			
		||||
@@ -326,17 +303,29 @@ public class WaveformViewerPart {
 | 
			
		||||
	public IWaveformDb getModel() {
 | 
			
		||||
		return database;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public IWaveformDb getDatabase() {
 | 
			
		||||
		return database;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void addStreamToList(IWaveform<? extends IWaveformEvent> obj){
 | 
			
		||||
		txDisplay.getStreamList().add(obj);
 | 
			
		||||
	public void addStreamToList(IWaveform<? extends IWaveformEvent> obj, boolean insert){
 | 
			
		||||
		addStreamsToList(new IWaveform<?>[]{obj}, insert);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void addStreamsToList(IWaveform<? extends IWaveformEvent>[] iWaveforms){
 | 
			
		||||
	public void addStreamsToList(IWaveform<? extends IWaveformEvent>[] iWaveforms, boolean insert){
 | 
			
		||||
		List<IWaveform<? extends IWaveformEvent>> streams= new LinkedList<>();
 | 
			
		||||
		for(IWaveform<? extends IWaveformEvent> stream:iWaveforms)
 | 
			
		||||
			addStreamToList(stream);
 | 
			
		||||
			streams.add(stream);
 | 
			
		||||
		IStructuredSelection selection = (IStructuredSelection) txDisplay.getSelection();
 | 
			
		||||
		if(selection.size()==0)
 | 
			
		||||
			txDisplay.getStreamList().addAll(streams);
 | 
			
		||||
		else {
 | 
			
		||||
			IWaveform<?> selectedStream = (selection.getFirstElement() instanceof ITx)?
 | 
			
		||||
					((ITx)selection.getFirstElement()).getStream():(IWaveform<?>)selection.getFirstElement();
 | 
			
		||||
			int index = txDisplay.getStreamList().indexOf(selectedStream);
 | 
			
		||||
			if(!insert) index++;
 | 
			
		||||
			txDisplay.getStreamList().addAll(index, streams);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void removeStreamFromList(IWaveform<? extends IWaveformEvent> obj){
 | 
			
		||||
@@ -355,7 +344,7 @@ public class WaveformViewerPart {
 | 
			
		||||
	public void moveSelected(int i) {
 | 
			
		||||
		txDisplay.moveSelected(i);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	public void moveSelection(GotoDirection direction) {
 | 
			
		||||
		txDisplay.moveSelection(direction);
 | 
			
		||||
	}
 | 
			
		||||
@@ -379,5 +368,15 @@ public class WaveformViewerPart {
 | 
			
		||||
		return txDisplay.getZoomLevel();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public ISelection getSelection() {
 | 
			
		||||
		return txDisplay.getSelection();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setSelection(IStructuredSelection structuredSelection) {
 | 
			
		||||
		txDisplay.setSelection(structuredSelection, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String getScaledTime(Long time) {
 | 
			
		||||
		return txDisplay.getScaledTime(time);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
	
 | 
			
		||||
@@ -16,13 +16,13 @@
 | 
			
		||||
<stringAttribute key="location" value="${workspace_loc}/../runtime-com.minres.scviewer.e4.application.product"/>
 | 
			
		||||
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
 | 
			
		||||
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
 | 
			
		||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -clearPersistedState"/>
 | 
			
		||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -clearPersistedState /Users/eyck/Workspaces/SCViewer/scv_tr_sqlite/my_db.vcd"/>
 | 
			
		||||
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
 | 
			
		||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx512m -Xdock:icon=../Resources/Eclipse.icns -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts"/>
 | 
			
		||||
<stringAttribute key="pde.version" value="3.3"/>
 | 
			
		||||
<stringAttribute key="product" value="com.minres.scviewer.e4.application.product"/>
 | 
			
		||||
<stringAttribute key="productFile" value="/com.minres.scviewer.e4.application/com.minres.scviewer.e4.application.product"/>
 | 
			
		||||
<stringAttribute key="selected_target_plugins" value="com.google.guava*10.0.1.v201203051515@default:default,com.google.guava*15.0.0.v201403281430@default:default,com.ibm.icu@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.servlet*3.1.0.v201410161800@default:default,javax.xml@default:default,org.apache.ant@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.commons.jxpath@default:default,org.apache.commons.logging@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.codehaus.groovy*1.8.6.xx-201508121448-e45@default:default,org.codehaus.groovy*2.0.7.xx-201508121448-e45@default:default,org.codehaus.groovy*2.1.8.xx-201508121448-e45@default:default,org.codehaus.groovy*2.2.2.xx-201508121448-e45@default:default,org.codehaus.groovy*2.3.10.xx-201508121448-e45@default:default,org.codehaus.groovy*2.4.3.xx-201508121448-e45@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem.java7@default:false,org.eclipse.core.filesystem.macosx@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt.cocoa@default:false,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.concurrent@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.osgi.compatibility.state@default:false,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.cocoa.macosx.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.text@default:default,org.eclipse.ui.cocoa@default:false,org.eclipse.ui.console@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.hamcrest.core@default:default,org.junit@default:default,org.w3c.css.sac@default:default,org.w3c.dom.events@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
 | 
			
		||||
<stringAttribute key="selected_target_plugins" value="com.google.guava@default:default,com.ibm.icu@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet@default:default,javax.xml@default:default,org.apache.ant@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.commons.jxpath@default:default,org.apache.commons.logging@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.codehaus.groovy@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem.java7@default:false,org.eclipse.core.filesystem.macosx@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt.cocoa@default:false,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.concurrent@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.util@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.osgi.compatibility.state@default:false,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.cocoa.macosx.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.text@default:default,org.eclipse.ui.cocoa@default:false,org.eclipse.ui.console@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.hamcrest.core@default:default,org.junit@default:default,org.w3c.css.sac@default:default,org.w3c.dom.events@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
 | 
			
		||||
<stringAttribute key="selected_workspace_plugins" value="com.minres.scviewer.database.sqlite@default:default,com.minres.scviewer.database.swt@default:default,com.minres.scviewer.database.text@default:default,com.minres.scviewer.database.vcd@default:default,com.minres.scviewer.database@default:default,com.minres.scviewer.e4.application@default:default"/>
 | 
			
		||||
<booleanAttribute key="show_selected_only" value="false"/>
 | 
			
		||||
<booleanAttribute key="tracing" value="false"/>
 | 
			
		||||
 
 | 
			
		||||