diff --git a/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF b/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF index 4e48cb5..09c794c 100644 --- a/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF +++ b/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF @@ -11,7 +11,6 @@ Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", org.eclipse.osgi.services;bundle-version="3.4.0" Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar Service-Component: OSGI-INF/component.xml -Export-Package: com.minres.scviewer.database.sqlite Bundle-ActivationPolicy: lazy Embed-Dependency: sqlite-jdbc Embedded-Artifacts: sqlite-jdbc-3.8.7.jar;g="org.xerial"; diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java index 6f4f10b..9cbdeac 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/SQLiteDbLoader.java @@ -33,10 +33,6 @@ public class SQLiteDbLoader implements IWaveformDbLoader { protected IDatabase database; - protected List> streams; - - long timeResolution=1; - private RelationTypeFactory rtf = new RelationTypeFactory(); private IWaveformDb db; @@ -63,19 +59,17 @@ public class SQLiteDbLoader implements IWaveformDbLoader { @Override public List> getAllWaves() { - if(streams==null){ - SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvStream.class, database); - streams=new ArrayList>(); - try { - for(ScvStream scvStream:handler.selectObjects()){ - TxStream stream = new TxStream(database, db, scvStream); - stream.setRelationTypeFactory(rtf); - streams.add(stream); - } - } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException - | InvocationTargetException | SQLException | IntrospectionException e) { - // e.printStackTrace(); + SQLiteDatabaseSelectHandler handler = new SQLiteDatabaseSelectHandler(ScvStream.class, database); + List> streams=new ArrayList>(); + try { + for(ScvStream scvStream:handler.selectObjects()){ + TxStream stream = new TxStream(database, db, scvStream); + stream.setRelationTypeFactory(rtf); + streams.add(stream); } + } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException + | InvocationTargetException | SQLException | IntrospectionException e) { +// e.printStackTrace(); } return streams; } @@ -85,7 +79,6 @@ public class SQLiteDbLoader implements IWaveformDbLoader { @Override public boolean load(IWaveformDb db, File file) throws Exception { this.db=db; - streams=null; FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[x.length]; int read = fis.read(buffer, 0, x.length); diff --git a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java index 797ba4b..1b001a6 100644 --- a/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java +++ b/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxStream.java @@ -27,7 +27,9 @@ import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.ITxEvent; import com.minres.scviewer.database.ITxGenerator; import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.database.IWaveformEvent; import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.sqlite.db.IDatabase; import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; @@ -189,4 +191,9 @@ public class TxStream extends HierNode implements ITxStream { return null; } + @Override + public Boolean equals(IWaveform other) { + return(other instanceof TxStream && this.getId()==other.getId()); + } + } diff --git a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/TxDisplay.java b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/TxDisplay.java index a4dabd7..bf06533 100644 --- a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/TxDisplay.java +++ b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/TxDisplay.java @@ -13,9 +13,11 @@ package com.minres.scviewer.database.swt; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; +import java.util.NavigableMap; import java.util.TreeMap; import java.util.Vector; @@ -41,6 +43,7 @@ import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionAdapter; @@ -59,11 +62,10 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.wb.swt.SWTResourceManager; -import swing2swt.layout.BorderLayout; - import com.google.common.collect.Lists; import com.minres.scviewer.database.ISignal; import com.minres.scviewer.database.ISignalChange; @@ -83,727 +85,873 @@ import com.minres.scviewer.database.swt.internal.StreamPainter; import com.minres.scviewer.database.swt.internal.TrackPainter; import com.minres.scviewer.database.swt.internal.WaveformCanvas; -public class TxDisplay implements PropertyChangeListener, ISelectionProvider, MouseListener { - private ListenerList selectionChangedListeners = new ListenerList(); - private PropertyChangeSupport pcs; +import swing2swt.layout.BorderLayout; - public static final String CURSOR_PROPERTY = "cursor time"; +public class TxDisplay implements PropertyChangeListener, ISelectionProvider { + private ListenerList selectionChangedListeners = new ListenerList(); + private PropertyChangeSupport pcs; - private static final String SELECTION = "selection"; - private ITx currentTxSelection; - private IWaveform currentWaveformSelection; - private CursorPainter currentCursorSelection; + public static final String CURSOR_PROPERTY = "cursor time"; - private ScrolledComposite nameListScrolled; - private ScrolledComposite valueListScrolled; + private static final String SELECTION = "selection"; + private ITx currentTxSelection; + private IWaveform currentWaveformSelection; + private CursorPainter currentCursorSelection; - private Canvas nameList; - private Canvas valueList; - WaveformCanvas trackList; + private ScrolledComposite nameListScrolled; + private ScrolledComposite valueListScrolled; - private Composite top; + private Canvas nameList; + private Canvas valueList; + WaveformCanvas waveformList; - protected ObservableList> streams; - Vector cursorPainters; + private Composite top; - private Composite trackPane; - private int trackVerticalHeight; - private TreeMap> trackVerticalOffset; - private HashMap, String> actualValues; - // private long maxTime=0; - private Font nameFont, nameFontB; + protected ObservableList> streams; + Vector cursorPainters; - public TxDisplay(Composite parent) { - pcs=new PropertyChangeSupport(this); - - trackVerticalOffset = new TreeMap>(); - trackVerticalHeight=0; - actualValues = new HashMap, String>(); - cursorPainters = new Vector(); + private Composite trackPane; + private int trackVerticalHeight; + private TreeMap> trackVerticalOffset; + private HashMap, String> actualValues; + // private long maxTime=0; + private Font nameFont, nameFontB; - nameFont = parent.getDisplay().getSystemFont(); - nameFontB = SWTResourceManager.getBoldFont(nameFont); + protected MouseListener nameValueMouseListener = new MouseAdapter() { + @Override + public void mouseDown(MouseEvent e) { + if ((e.button == 1 || e.button == 3)) { + Entry> entry = trackVerticalOffset.floorEntry(e.y); + if (entry != null) + setSelection(new StructuredSelection(entry.getValue())); + } + if (e.button == 3) { + Menu topMenu= top.getMenu(); + if(topMenu!=null) topMenu.setVisible(true); + } + } + }; - streams = new ObservableList>(); - streams.addPropertyChangeListener(this); + protected MouseListener waveformMouseListener = new MouseAdapter(){ + Point start; + List initialSelected; + + @Override + public void mouseDown(MouseEvent e) { + start=new Point(e.x, e.y); + if (e.button == 1) { + initialSelected = waveformList.getClicked(start); + } else if (e.button == 3) { + List hitted = waveformList.getClicked(start); + for(Object entry:hitted){ + if(entry instanceof IWaveform){ + setSelection(new StructuredSelection(entry)); + break; + }else if(entry instanceof ITx){ + setSelection(new StructuredSelection(((ITx)entry).getStream())); + break; + } + } + Menu topMenu= top.getMenu(); + if(topMenu!=null) topMenu.setVisible(true); + } + } - top = new Composite(parent, SWT.NONE); - top.setLayout(new FillLayout(SWT.HORIZONTAL)); + @Override + public void mouseUp(MouseEvent e) { + if (e.button == 1) { + if(Math.abs(e.x-start.x)<3 && Math.abs(e.y-start.y)<3){ + long time= waveformList.getTimeForOffset(e.x); + long scaling=5*waveformList.getScaleFactor(); + for(Object o:waveformList.getClicked(start)){ + Entry floorEntry=null, ceilEntry=null; + if(o instanceof ISignal){ + NavigableMap map = ((ISignal)o).getEvents(); + floorEntry = map.floorEntry(time); + ceilEntry = map.ceilingEntry(time); + } else if (o instanceof ITxStream){ + NavigableMap map = ((ITxStream)o).getEvents(); + floorEntry = map.floorEntry(time); + ceilEntry = map.ceilingEntry(time); + } else if(o instanceof ITx){ + NavigableMap map = ((ITx)o).getStream().getEvents(); + floorEntry = map.floorEntry(time); + ceilEntry = map.ceilingEntry(time); + } + if(floorEntry!=null && time-floorEntry.getKey()>scaling) + floorEntry=null; + if(ceilEntry!=null && ceilEntry.getKey()-time>scaling) + ceilEntry=null; + if(ceilEntry==null && floorEntry!=null){ + time=floorEntry.getKey(); + }else if(ceilEntry!=null && floorEntry==null){ + time=ceilEntry.getKey(); + }else if(ceilEntry!=null && floorEntry!=null){ + time=time-floorEntry.getKey()>(); + trackVerticalHeight=0; + actualValues = new HashMap, String>(); + cursorPainters = new Vector(); - trackPane = new Composite(topSash, SWT.NONE); - trackPane.setLayout(new BorderLayout(0, 0)); + nameFont = parent.getDisplay().getSystemFont(); + nameFontB = SWTResourceManager.getBoldFont(nameFont); - trackList = new WaveformCanvas(trackPane, SWT.NONE); - trackList.setLayoutData(BorderLayout.CENTER); + streams = new ObservableList>(); + streams.addPropertyChangeListener(this); - SashForm leftSash = new SashForm(composite, SWT.SMOOTH); - leftSash.setBackground(leftSash.getDisplay().getSystemColor(SWT.COLOR_GRAY)); + top = new Composite(parent, SWT.NONE); + top.setLayout(new FillLayout(SWT.HORIZONTAL)); - Composite namePane = createTextPane(leftSash, "Name"); - namePane.setBackground(namePane.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); + SashForm topSash = new SashForm(top, SWT.SMOOTH); + topSash.setBackground(topSash.getDisplay().getSystemColor(SWT.COLOR_GRAY)); - nameListScrolled = new ScrolledComposite(namePane, SWT.H_SCROLL | SWT.V_SCROLL); - nameListScrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); - nameListScrolled.setExpandHorizontal(true); - nameListScrolled.setExpandVertical(true); - nameListScrolled.setAlwaysShowScrollBars(true); - nameListScrolled.addControlListener(new ControlAdapter() { - @Override - public void controlResized(ControlEvent e) { - nameListScrolled.getVerticalBar().setVisible(false); + Composite composite = new Composite(topSash, SWT.NONE); + composite.setLayout(new FillLayout(SWT.HORIZONTAL)); - } - }); - nameList = new Canvas(nameListScrolled, SWT.NONE) { - @Override - public Point computeSize(int wHint, int hHint, boolean changed) { - Rectangle bounds = super.getClientArea(); - return new Point(bounds.width, bounds.height); - } - }; - nameList.addListener(SWT.Paint, new Listener() { - @Override - public void handleEvent(Event event) { - GC gc = event.gc; - Rectangle rect = ((Canvas) event.widget).getClientArea(); - paintNames(gc, rect); - } - }); - nameList.addMouseListener(this); - nameListScrolled.setContent(nameList); + trackPane = new Composite(topSash, SWT.NONE); + trackPane.setLayout(new BorderLayout(0, 0)); - Composite valuePane = createTextPane(leftSash, "Value"); - valuePane.setBackground(valuePane.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); - valueListScrolled = new ScrolledComposite(valuePane, SWT.H_SCROLL | SWT.V_SCROLL); - valueListScrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); - valueListScrolled.setExpandHorizontal(true); - valueListScrolled.setExpandVertical(true); - valueListScrolled.setAlwaysShowScrollBars(true); - valueListScrolled.addControlListener(new ControlAdapter() { - @Override - public void controlResized(ControlEvent e) { - valueListScrolled.getVerticalBar().setVisible(false); + waveformList = new WaveformCanvas(trackPane, SWT.NONE); + waveformList.setLayoutData(BorderLayout.CENTER); - } - }); - valueList = new Canvas(valueListScrolled, SWT.NONE) { - @Override - public Point computeSize(int wHint, int hHint, boolean changed) { - Rectangle bounds = super.getClientArea(); - return new Point(bounds.width, bounds.height); - } - }; - valueList.addListener(SWT.Paint, new Listener() { - @Override - public void handleEvent(Event event) { - GC gc = event.gc; - Rectangle rect = ((Canvas) event.widget).getClientArea(); - paintValues(gc, rect); - } - }); - valueList.addMouseListener(this); - valueListScrolled.setContent(valueList); + SashForm leftSash = new SashForm(composite, SWT.SMOOTH); + leftSash.setBackground(leftSash.getDisplay().getSystemColor(SWT.COLOR_GRAY)); - trackList.setStreams(streams); - // order is important: it is bottom to top - trackList.addPainter(new TrackPainter(trackList)); - trackList.addPainter(new RulerPainter( - trackList, trackList.getDisplay().getSystemColor(SWT.COLOR_BLACK), trackList.getDisplay().getSystemColor(SWT.COLOR_WHITE))); - CursorPainter cp = new CursorPainter(trackList, trackList.getScaleFactor() * 10); - trackList.addPainter(cp); - cursorPainters.add(cp); - trackList.setMaxTime(1); - trackList.addMouseListener(this); + Composite namePane = createTextPane(leftSash, "Name"); + namePane.setBackground(namePane.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); - nameListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = ((ScrollBar) e.widget).getSelection(); - Point v = valueListScrolled.getOrigin(); - valueListScrolled.setOrigin(v.x, y); - Point t = trackList.getOrigin(); - trackList.setOrigin(t.x, -y); - } - }); - valueListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = ((ScrollBar) e.widget).getSelection(); - nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); - trackList.setOrigin(trackList.getOrigin().x, -y); - } - }); - trackList.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int y = trackList.getVerticalBar().getSelection(); - nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); - valueListScrolled.setOrigin(valueListScrolled.getOrigin().x, y); - } - }); - topSash.setWeights(new int[] { 30, 70 }); - leftSash.setWeights(new int[] { 75, 25 }); + nameListScrolled = new ScrolledComposite(namePane, SWT.H_SCROLL | SWT.V_SCROLL); + nameListScrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + nameListScrolled.setExpandHorizontal(true); + nameListScrolled.setExpandVertical(true); + nameListScrolled.setAlwaysShowScrollBars(true); + nameListScrolled.addControlListener(new ControlAdapter() { + @Override + public void controlResized(ControlEvent e) { + nameListScrolled.getVerticalBar().setVisible(false); - createWaveDragSource(nameList); - createWaveDragSource(valueList); - createWaveDropTarget(nameList); - createWaveDropTarget(valueList); - createTrackDragSource(trackList); - createTrackDropTarget(trackList); - } + } + }); + nameList = new Canvas(nameListScrolled, SWT.NONE) { + @Override + public Point computeSize(int wHint, int hHint, boolean changed) { + Rectangle bounds = super.getClientArea(); + return new Point(bounds.width, bounds.height); + } + }; + nameList.addListener(SWT.Paint, new Listener() { + @Override + public void handleEvent(Event event) { + GC gc = event.gc; + Rectangle rect = ((Canvas) event.widget).getClientArea(); + paintNames(gc, rect); + } + }); + nameList.addMouseListener(nameValueMouseListener); + nameListScrolled.setContent(nameList); - private Composite createTextPane(SashForm leftSash, String text) { - Composite namePane = new Composite(leftSash, SWT.NONE); - GridLayout gl_namePane = new GridLayout(1, false); - gl_namePane.verticalSpacing = 0; - gl_namePane.marginWidth = 0; - gl_namePane.horizontalSpacing = 0; - gl_namePane.marginHeight = 0; - namePane.setLayout(gl_namePane); + Composite valuePane = createTextPane(leftSash, "Value"); + valuePane.setBackground(valuePane.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); + valueListScrolled = new ScrolledComposite(valuePane, SWT.H_SCROLL | SWT.V_SCROLL); + valueListScrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + valueListScrolled.setExpandHorizontal(true); + valueListScrolled.setExpandVertical(true); + valueListScrolled.setAlwaysShowScrollBars(true); + valueListScrolled.addControlListener(new ControlAdapter() { + @Override + public void controlResized(ControlEvent e) { + valueListScrolled.getVerticalBar().setVisible(false); - CLabel nameLabel = new CLabel(namePane, SWT.NONE); - GridData gd_nameLabel = new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1); - gd_nameLabel.heightHint = trackList.getRulerHeight() - 2; - nameLabel.setLayoutData(gd_nameLabel); - nameLabel.setText(text); + } + }); + valueList = new Canvas(valueListScrolled, SWT.NONE) { + @Override + public Point computeSize(int wHint, int hHint, boolean changed) { + Rectangle bounds = super.getClientArea(); + return new Point(bounds.width, bounds.height); + } + }; + valueList.addListener(SWT.Paint, new Listener() { + @Override + public void handleEvent(Event event) { + GC gc = event.gc; + Rectangle rect = ((Canvas) event.widget).getClientArea(); + paintValues(gc, rect); + } + }); + valueList.addMouseListener(nameValueMouseListener); + valueListScrolled.setContent(valueList); - Label nameSep = new Label(namePane, SWT.SEPARATOR | SWT.HORIZONTAL); - nameSep.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY)); - nameSep.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK)); - GridData gd_nameSep = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); - gd_nameSep.heightHint = 2; - nameSep.setLayoutData(gd_nameSep); - return namePane; - } + waveformList.setStreams(streams); + // order is important: it is bottom to top + waveformList.addPainter(new TrackPainter(waveformList)); + waveformList.addPainter(new RulerPainter( + waveformList, waveformList.getDisplay().getSystemColor(SWT.COLOR_BLACK), waveformList.getDisplay().getSystemColor(SWT.COLOR_WHITE))); + CursorPainter cp = new CursorPainter(waveformList, waveformList.getScaleFactor() * 10); + waveformList.addPainter(cp); + cursorPainters.add(cp); + waveformList.setMaxTime(1); + waveformList.addMouseListener(waveformMouseListener); - @Override - public void propertyChange(PropertyChangeEvent pce) { - if ("size".equals(pce.getPropertyName()) || "content".equals(pce.getPropertyName())) { - updateTracklist(); + nameListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = ((ScrollBar) e.widget).getSelection(); + Point v = valueListScrolled.getOrigin(); + valueListScrolled.setOrigin(v.x, y); + Point t = waveformList.getOrigin(); + waveformList.setOrigin(t.x, -y); + } + }); + valueListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = ((ScrollBar) e.widget).getSelection(); + nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); + waveformList.setOrigin(waveformList.getOrigin().x, -y); + } + }); + waveformList.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + int y = waveformList.getVerticalBar().getSelection(); + nameListScrolled.setOrigin(nameListScrolled.getOrigin().x, y); + valueListScrolled.setOrigin(valueListScrolled.getOrigin().x, y); + } + }); + topSash.setWeights(new int[] { 30, 70 }); + leftSash.setWeights(new int[] { 75, 25 }); + + createStreamDragSource(nameList); + createStreamDragSource(valueList); + createStreamDropTarget(nameList); + createStreamDropTarget(valueList); + createWaveformDragSource(waveformList); + createWaveformDropTarget(waveformList); + } + + private Composite createTextPane(SashForm leftSash, String text) { + Composite namePane = new Composite(leftSash, SWT.NONE); + GridLayout gl_namePane = new GridLayout(1, false); + gl_namePane.verticalSpacing = 0; + gl_namePane.marginWidth = 0; + gl_namePane.horizontalSpacing = 0; + gl_namePane.marginHeight = 0; + namePane.setLayout(gl_namePane); + + CLabel nameLabel = new CLabel(namePane, SWT.NONE); + GridData gd_nameLabel = new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1); + gd_nameLabel.heightHint = waveformList.getRulerHeight() - 2; + nameLabel.setLayoutData(gd_nameLabel); + nameLabel.setText(text); + + Label nameSep = new Label(namePane, SWT.SEPARATOR | SWT.HORIZONTAL); + nameSep.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY)); + nameSep.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK)); + GridData gd_nameSep = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + gd_nameSep.heightHint = 2; + nameSep.setLayoutData(gd_nameSep); + return namePane; + } + + @Override + public void propertyChange(PropertyChangeEvent pce) { + if ("size".equals(pce.getPropertyName()) || "content".equals(pce.getPropertyName())) { + updateTracklist(); + } + } + + @SuppressWarnings("unchecked") + protected void updateTracklist() { + trackVerticalHeight = 0; + int nameMaxWidth = 0; + int previousHeight = trackVerticalOffset.size() == 0 ? 0 : trackVerticalOffset.lastKey(); + IWaveformPainter painter = null; + trackVerticalOffset.clear(); + actualValues.clear(); + waveformList.clearAllWavefromPainter(); + boolean even = true; + TextLayout tl = new TextLayout(waveformList.getDisplay()); + tl.setFont(nameFontB); + for (IWaveform waveform : streams) { + int height = waveformList.getTrackHeight(); + if (waveform instanceof ITxStream) { + ITxStream stream = (ITxStream) waveform; + height *= stream.getMaxConcurrency(); + painter = new StreamPainter(waveformList, even, height, (ITxStream) waveform); + actualValues.put(stream, ""); + } else if (waveform instanceof ISignal) { + painter = new SignalPainter(waveformList, even, height, (ISignal) waveform); + actualValues.put(waveform, "---"); + } + waveformList.addWavefromPainter(trackVerticalHeight, painter); + trackVerticalOffset.put(trackVerticalHeight, waveform); + tl.setText(waveform.getFullName()); + nameMaxWidth = Math.max(nameMaxWidth, tl.getBounds().width); + trackVerticalHeight += height; + even = !even; + } + nameList.setSize(nameMaxWidth + 15, trackVerticalHeight); + nameListScrolled.setMinSize(nameMaxWidth + 15, trackVerticalHeight); + valueList.setSize(calculateValueWidth(), trackVerticalHeight); + valueListScrolled.setMinSize(calculateValueWidth(), trackVerticalHeight); + nameList.redraw(); + updateValueList(); + waveformList.redraw(); + top.layout(new Control[] { valueList, nameList, waveformList }); + if (trackVerticalOffset.isEmpty() || previousHeight > trackVerticalOffset.lastKey()) { + Point o = waveformList.getOrigin(); + waveformList.setOrigin(o.x, o.y - (previousHeight - trackVerticalOffset.lastKey())); + } + setSelection(new StructuredSelection()); + /* System.out.println("updateTracklist() state:"); + for(Entry> entry: trackVerticalOffset.entrySet()){ + System.out.println(" "+entry.getKey()+": " +entry.getValue().getFullName()); } - } + */ } - @SuppressWarnings("unchecked") - protected void updateTracklist() { - int trackVerticalHeight = 0; - int nameMaxWidth = 0; - int previousHeight = trackVerticalOffset.size() == 0 ? 0 : trackVerticalOffset.lastKey(); - IWaveformPainter painter = null; - trackVerticalOffset.clear(); - actualValues.clear(); - trackList.clearAllWavefromPainter(); - boolean even = true; - TextLayout tl = new TextLayout(trackList.getDisplay()); - tl.setFont(nameFontB); - for (IWaveform waveform : streams) { - int height = trackList.getTrackHeight(); - if (waveform instanceof ITxStream) { - height *= ((ITxStream) waveform).getMaxConcurrency(); - painter = new StreamPainter(trackList, even, height, (ITxStream) waveform); - actualValues.put(waveform, ""); - } else if (waveform instanceof ISignal) { - painter = new SignalPainter(trackList, even, height, (ISignal) waveform); - actualValues.put(waveform, "---"); + private int calculateValueWidth() { + TextLayout tl = new TextLayout(waveformList.getDisplay()); + tl.setFont(nameFontB); + int valueMaxWidth = 0; + for (String v : actualValues.values()) { + tl.setText(v); + valueMaxWidth = Math.max(valueMaxWidth, tl.getBounds().width); + } + return valueMaxWidth + 15; + } + + private void updateValueList(){ + final Long time = getCursorTime(); + for(Entry, String> entry:actualValues.entrySet()){ + if(entry.getKey() instanceof ISignal){ + ISignalChange event = ((ISignal)entry.getKey()).getWaveformEventsBeforeTime(time); + if(event instanceof ISignalChangeSingle){ + entry.setValue("b'"+((ISignalChangeSingle)event).getValue()); + } else if(event instanceof ISignalChangeMulti){ + entry.setValue("h'"+((ISignalChangeMulti)event).getValue().toHexString()); + } + } else if(entry.getKey() instanceof ITxStream){ + ITxStream stream = (ITxStream) entry.getKey(); + ITx[] resultsList = new ITx[stream.getMaxConcurrency()]; + Entry> firstTx=stream.getEvents().floorEntry(time); + if(firstTx!=null){ + do { + for(ITxEvent evt:firstTx.getValue()){ + ITx tx=evt.getTransaction(); + if(evt.getType()==ITxEvent.Type.BEGIN && tx.getBeginTime()<=time && tx.getEndTime()>=time){ + if(resultsList[tx.getConcurrencyIndex()]==null) + resultsList[tx.getConcurrencyIndex()]= evt.getTransaction(); + } + } + firstTx=stream.getEvents().lowerEntry(firstTx.getKey()); + }while(firstTx!=null && !isArrayFull(resultsList)); + String value=null; + for(ITx o:resultsList){ + if(value==null) + value=new String(); + else + value+="|"; + if(o!=null) value+=((ITx)o).getGenerator().getName(); + } + entry.setValue(value); + } } - trackList.addWavefromPainter(trackVerticalHeight, painter); - trackVerticalOffset.put(trackVerticalHeight, waveform); - tl.setText(waveform.getFullName()); - nameMaxWidth = Math.max(nameMaxWidth, tl.getBounds().width); - trackVerticalHeight += height; - even = !even; - } - nameList.setSize(nameMaxWidth + 15, trackVerticalHeight); - nameListScrolled.setMinSize(nameMaxWidth + 15, trackVerticalHeight); - valueList.setSize(calculateValueWidth(), trackVerticalHeight); - valueListScrolled.setMinSize(calculateValueWidth(), trackVerticalHeight); - nameList.redraw(); - updateValueList(); - trackList.redraw(); - top.layout(new Control[] { valueList, nameList, trackList }); - if (previousHeight > trackVerticalOffset.lastKey()) { - Point o = trackList.getOrigin(); - trackList.setOrigin(o.x, o.y - (previousHeight - trackVerticalOffset.lastKey())); - } - setSelection(new StructuredSelection()); - } + } + valueList.redraw(); + } - private int calculateValueWidth() { - TextLayout tl = new TextLayout(trackList.getDisplay()); - tl.setFont(nameFontB); - int valueMaxWidth = 0; - for (String v : actualValues.values()) { - tl.setText(v); - valueMaxWidth = Math.max(valueMaxWidth, tl.getBounds().width); - } - return valueMaxWidth + 15; - } + private boolean isArrayFull(Object[] array){ + for(Object o:array){ + if(o==null) return false; + } + return true; + } + + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + selectionChangedListeners.add(listener); + } - private void updateValueList(){ - final Long time = cursorPainters.get(0).getTime(); - for(Entry, String> entry:actualValues.entrySet()){ - if(entry.getKey() instanceof ISignal){ - ISignalChange event = ((ISignal)entry.getKey()).getWaveformEventsBeforeTime(time); - if(event instanceof ISignalChangeSingle){ - entry.setValue("b'"+((ISignalChangeSingle)event).getValue()); - } else if(event instanceof ISignalChangeMulti){ - entry.setValue("h'"+((ISignalChangeMulti)event).getValue().toHexString()); - } - } /*else if(entry instanceof ITxStream){ - Collection events = ((ITxStream)entry.getKey()).getWaveformEventsAtTime(time); - - }*/ - } - valueList.redraw(); - } - - @Override - public void addSelectionChangedListener(ISelectionChangedListener listener) { - selectionChangedListeners.add(listener); - } + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + selectionChangedListeners.remove(listener); + } - @Override - public void removeSelectionChangedListener(ISelectionChangedListener listener) { - selectionChangedListeners.remove(listener); - } + public Control getControl() { + return top; + } - public Control getControl() { - return top; - } + public Control getNameControl() { + return nameList; + } - @Override - public ISelection getSelection() { - if(currentCursorSelection != null){ - return new StructuredSelection(currentCursorSelection); - }else if (currentTxSelection != null) - return new StructuredSelection(currentTxSelection); - else if (currentWaveformSelection != null) - return new StructuredSelection(currentWaveformSelection); - else - return null; - } + public Control getValueControl() { + return valueList; + } - @SuppressWarnings("unchecked") - @Override - public void setSelection(ISelection selection) { - boolean selectionChanged = false; - if (selection instanceof IStructuredSelection) { - if(((IStructuredSelection) selection).size()==0){ - selectionChanged = currentTxSelection!=null||currentWaveformSelection!=null; - currentTxSelection = null; - currentWaveformSelection = null; - currentCursorSelection=null; - } else { - Object sel = ((IStructuredSelection) selection).getFirstElement(); - if (sel instanceof ITx && currentTxSelection != sel) { - currentTxSelection = (ITx) sel; - currentWaveformSelection = currentTxSelection.getStream(); - currentCursorSelection=null; - selectionChanged = true; - } else if (sel instanceof IWaveform && currentWaveformSelection != sel) { - currentTxSelection = null; - currentWaveformSelection = (IWaveform) sel; - currentCursorSelection=null; - selectionChanged = true; - } else if (sel instanceof CursorPainter && currentCursorSelection != sel){ - currentTxSelection = null; - currentWaveformSelection = null; - currentCursorSelection=(CursorPainter) sel; - selectionChanged = true; - } - } - } else { - if (currentTxSelection != null || currentWaveformSelection != null) - selectionChanged = true; - currentTxSelection = null; - currentWaveformSelection = null; - currentCursorSelection=null; - } - if (currentWaveformSelection != null && !streams.contains(currentWaveformSelection)) { - streams.add(currentWaveformSelection); - } - if (selectionChanged) { - trackList.setSelected(currentTxSelection, currentWaveformSelection); - nameList.setData(SELECTION, currentWaveformSelection); - valueList.redraw(); - nameList.redraw(); - Object[] list = selectionChangedListeners.getListeners(); - for (int i = 0; i < list.length; i++) { - ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); - } - } - } + public Control getWaveformControl() { + return waveformList; + } - @SuppressWarnings("unchecked") - public void moveSelection(GotoDirection direction) { - if (currentWaveformSelection instanceof ITxStream) { - ITxStream stream = (ITxStream) currentWaveformSelection; - ITx transaction = null; - if (direction == GotoDirection.NEXT) { - List thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime()); - boolean meFound=false; - for (ITxEvent evt : thisEntryList) { - if (evt.getType() == ITxEvent.Type.BEGIN) { - if(meFound){ - transaction = evt.getTransaction(); - break; - } - meFound|= evt.getTransaction().getId()==currentTxSelection.getId(); - } - } - if (transaction == null){ - Entry> entry = stream.getEvents().higherEntry(currentTxSelection.getBeginTime()); - if (entry != null) do { - for (ITxEvent evt : entry.getValue()) { - if (evt.getType() == ITxEvent.Type.BEGIN) { - transaction = evt.getTransaction(); - break; - } - } - if (transaction == null) - entry = stream.getEvents().higherEntry(entry.getKey()); - } while (entry != null && transaction == null); - } - } else if (direction == GotoDirection.PREV) { - List thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime()); - boolean meFound=false; - for (ITxEvent evt : Lists.reverse(thisEntryList)) { - if (evt.getType() == ITxEvent.Type.BEGIN) { - if(meFound){ - transaction = evt.getTransaction(); - break; - } - meFound|= evt.getTransaction().getId()==currentTxSelection.getId(); - } - } - if (transaction == null){ - Entry> entry = stream.getEvents().lowerEntry(currentTxSelection.getBeginTime()); - if (entry != null) - do { - for (ITxEvent evt : Lists.reverse(entry.getValue())) { - if (evt.getType() == ITxEvent.Type.BEGIN) { - transaction = evt.getTransaction(); - break; - } - } - if (transaction == null) - entry = stream.getEvents().lowerEntry(entry.getKey()); - } while (entry != null && transaction == null); - } - } - if (transaction != null) { - setSelection(new StructuredSelection(transaction)); - } - } - } + @Override + public ISelection getSelection() { + if(currentCursorSelection != null){ + return new StructuredSelection(currentCursorSelection); + }else if (currentTxSelection != null) + return new StructuredSelection(currentTxSelection); + else if (currentWaveformSelection != null) + return new StructuredSelection(currentWaveformSelection); + else + return null; + } - @Override - public void mouseDoubleClick(MouseEvent e) { - if (e.button == 1&& e.widget == trackList) { - Object o = trackList.getClicked(new Point(e.x, e.y)); - if (o != null) - setSelection(new StructuredSelection(o)); - } - } + @SuppressWarnings("unchecked") + @Override + public void setSelection(ISelection selection) { + 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; + } else if (sel instanceof IWaveform && currentWaveformSelection != sel&& streams.contains(sel)) { + currentTxSelection = null; + currentWaveformSelection = (IWaveform) sel; + currentCursorSelection=null; + selectionChanged = true; + } else if (sel instanceof CursorPainter && currentCursorSelection != sel){ + currentTxSelection = null; + currentWaveformSelection = null; + currentCursorSelection=(CursorPainter) sel; + selectionChanged = true; + } + } + } + } else { + if (currentTxSelection != null || currentWaveformSelection != null) + selectionChanged = true; + currentTxSelection = null; + currentWaveformSelection = null; + currentCursorSelection=null; + } + if (selectionChanged) { + waveformList.setSelected(currentTxSelection, currentWaveformSelection); + nameList.setData(SELECTION, currentWaveformSelection); + valueList.redraw(); + nameList.redraw(); + Object[] list = selectionChangedListeners.getListeners(); + for (int i = 0; i < list.length; i++) { + ((ISelectionChangedListener) list[i]).selectionChanged(new SelectionChangedEvent(this, selection)); + } + } + } - @Override - public void mouseDown(MouseEvent e) { - if ((e.button == 1 || e.button == 3) && (e.widget == valueList || e.widget == nameList)) { - Entry> entry = trackVerticalOffset.floorEntry(e.y); - if (entry != null) - setSelection(new StructuredSelection(entry.getValue())); - } else if (e.button == 1&& e.widget == trackList) { - Object o = trackList.getClicked(new Point(e.x, e.y)); - if (o != null && o instanceof CursorPainter) - setSelection(new StructuredSelection(o)); + @SuppressWarnings("unchecked") + public void moveSelection(GotoDirection direction) { + if (currentWaveformSelection instanceof ITxStream) { + ITxStream stream = (ITxStream) currentWaveformSelection; + ITx transaction = null; + if (direction == GotoDirection.NEXT) { + List thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime()); + boolean meFound=false; + for (ITxEvent evt : thisEntryList) { + if (evt.getType() == ITxEvent.Type.BEGIN) { + if(meFound){ + transaction = evt.getTransaction(); + break; + } + meFound|= evt.getTransaction().equals(currentTxSelection); + } + } + if (transaction == null){ + Entry> entry = stream.getEvents().higherEntry(currentTxSelection.getBeginTime()); + if (entry != null) do { + for (ITxEvent evt : entry.getValue()) { + if (evt.getType() == ITxEvent.Type.BEGIN) { + transaction = evt.getTransaction(); + break; + } + } + if (transaction == null) + entry = stream.getEvents().higherEntry(entry.getKey()); + } while (entry != null && transaction == null); + } + } else if (direction == GotoDirection.PREV) { + List thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime()); + boolean meFound=false; + for (ITxEvent evt : Lists.reverse(thisEntryList)) { + if (evt.getType() == ITxEvent.Type.BEGIN) { + if(meFound){ + transaction = evt.getTransaction(); + break; + } + meFound|= evt.getTransaction().equals(currentTxSelection); + } + } + if (transaction == null){ + Entry> entry = stream.getEvents().lowerEntry(currentTxSelection.getBeginTime()); + if (entry != null) + do { + for (ITxEvent evt : Lists.reverse(entry.getValue())) { + if (evt.getType() == ITxEvent.Type.BEGIN) { + transaction = evt.getTransaction(); + break; + } + } + if (transaction == null) + entry = stream.getEvents().lowerEntry(entry.getKey()); + } while (entry != null && transaction == null); + } + } + if (transaction != null) { + setSelection(new StructuredSelection(transaction)); + } + } + } - } else if (e.button == 3) { - top.getMenu().setVisible(true); - } - } + public void moveCursor(GotoDirection direction) { + long time = getCursorTime(); + NavigableMap map=null; + if(currentWaveformSelection instanceof ITxStream){ + map=((ITxStream) currentWaveformSelection).getEvents(); + } else if(currentWaveformSelection instanceof ISignal){ + map=((ISignal) currentWaveformSelection).getEvents(); + } + if(map!=null){ + Entry entry=direction==GotoDirection.PREV?map.lowerEntry(time):map.higherEntry(time); + if(entry!=null) { + time=entry.getKey(); + setCursorTime(time); + waveformList.reveal(time); + waveformList.redraw(); + } + } + + } - @Override - public void mouseUp(MouseEvent e) { - if (e.button == 1&& e.widget == trackList) { - setCursorTime(trackList.getTimeForOffset(e.x)); - e.widget.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - trackList.redraw(); - updateValueList(); - } - }); - } - } + public List> getStreamList() { + return streams; + } - public List> getStreamList() { - return streams; - } + public void moveSelected(int i) { + if(currentWaveformSelection!=null){ + ITx selectedTx=currentTxSelection; + IWaveform selectedWaveform=currentWaveformSelection; + int idx = streams.indexOf(currentWaveformSelection); + int newIdx=idx+i; + if(newIdx>=0 && newIdx 0) { - @SuppressWarnings("unchecked") - IWaveform wave = (IWaveform) nameList.getData(SELECTION); - Integer firstKey = trackVerticalOffset.floorKey(rect.y); - if (firstKey == null) - firstKey = trackVerticalOffset.firstKey(); - Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); - Rectangle subArea = new Rectangle(rect.x, 0, rect.width, trackList.getTrackHeight()); - if (lastKey == firstKey) { - IWaveform w = trackVerticalOffset.get(firstKey); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawTextFormat(gc, subArea, firstKey, w.getFullName(), wave != null && w.getId() == wave.getId()); - } else { - for (Entry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) - .entrySet()) { - IWaveform w = entry.getValue(); - subArea.height = trackList.getTrackHeight(); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), wave != null && w.getId() == wave.getId()); - } - } - } - } - @SuppressWarnings("unchecked") - protected void paintValues(GC gc, Rectangle rect) { - if (streams.size() > 0) { - IWaveform wave = (IWaveform) nameList.getData(SELECTION); - Integer firstKey = trackVerticalOffset.floorKey(rect.y); - if (firstKey == null) - firstKey = trackVerticalOffset.firstKey(); - Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); - Rectangle subArea = new Rectangle(rect.x, 0, rect.width, trackList.getTrackHeight()); - if (lastKey == firstKey) { - IWaveform w = trackVerticalOffset.get(firstKey); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawTextFormat(gc, subArea, firstKey, actualValues.get(w), wave != null && w.getId() == wave.getId()); - } else { - for (Entry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) - .entrySet()) { - IWaveform w = entry.getValue(); - subArea.height = trackList.getTrackHeight(); - if (w instanceof ITxStream) - subArea.height *= ((ITxStream) w).getMaxConcurrency(); - drawTextFormat(gc, subArea, entry.getKey(), actualValues.get(w), wave != null && w.getId() == wave.getId()); - } - } - } - } + protected void paintNames(GC gc, Rectangle rect) { + if (streams.size() > 0) { + @SuppressWarnings("unchecked") + IWaveform wave = (IWaveform) nameList.getData(SELECTION); + Integer firstKey = trackVerticalOffset.floorKey(rect.y); + if (firstKey == null) + firstKey = trackVerticalOffset.firstKey(); + Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); + Rectangle subArea = new Rectangle(rect.x, 0, rect.width, waveformList.getTrackHeight()); + if (lastKey == firstKey) { + IWaveform w = trackVerticalOffset.get(firstKey); + if (w instanceof ITxStream) + subArea.height *= ((ITxStream) w).getMaxConcurrency(); + drawTextFormat(gc, subArea, firstKey, w.getFullName(), w.equals(wave)); + } else { + for (Entry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) + .entrySet()) { + IWaveform w = entry.getValue(); + subArea.height = waveformList.getTrackHeight(); + if (w instanceof ITxStream) + subArea.height *= ((ITxStream) w).getMaxConcurrency(); + drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), w.equals(wave)); + } + } + } + } - protected void drawTextFormat(GC gc, Rectangle subArea, int yOffset, String value, boolean highlite) { - Point size = gc.textExtent(value); - if (highlite) { - gc.setBackground(SWTResourceManager.getColor(SWT.COLOR_LIST_SELECTION)); - gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_LIST_SELECTION_TEXT)); - gc.fillRectangle(subArea.x, subArea.y + yOffset, subArea.width, subArea.height); - gc.setFont(nameFontB); - } else { - gc.setBackground(SWTResourceManager.getColor(SWT.COLOR_LIST_BACKGROUND)); - gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_LIST_FOREGROUND)); - gc.setFont(nameFont); - } - gc.drawText(value, subArea.x + 5, subArea.y + yOffset + (trackList.getTrackHeight() - size.y) / 2, true); - } + @SuppressWarnings("unchecked") + protected void paintValues(GC gc, Rectangle rect) { + if (streams.size() > 0) { + IWaveform wave = (IWaveform) nameList.getData(SELECTION); + Integer firstKey = trackVerticalOffset.floorKey(rect.y); + if (firstKey == null) + firstKey = trackVerticalOffset.firstKey(); + Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); + Rectangle subArea = new Rectangle(rect.x, 0, rect.width, waveformList.getTrackHeight()); + if (lastKey == firstKey) { + IWaveform w = trackVerticalOffset.get(firstKey); + if (w instanceof ITxStream) + subArea.height *= ((ITxStream) w).getMaxConcurrency(); + drawValue(gc, subArea, firstKey, actualValues.get(w), w.equals(wave)); + } else { + for (Entry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) + .entrySet()) { + IWaveform w = entry.getValue(); + subArea.height = waveformList.getTrackHeight(); + if (w instanceof ITxStream) + subArea.height *= ((ITxStream) w).getMaxConcurrency(); + drawValue(gc, subArea, entry.getKey(), actualValues.get(w), w.equals(wave)); + } + } + } + } - public long getMaxTime() { - return trackList.getMaxTime(); - } + protected void drawValue(GC gc, Rectangle subArea, Integer yOffset, String value, boolean highlite) { + int beginIndex=0; + for(int offset=0; offset && target instanceof IWaveform){ -// int srcIdx=streams.indexOf(source); -// int tgtIdx=streams.indexOf(target); -// if(srcIdx) source); - } else if(source instanceof CursorPainter){ - ((CursorPainter)source).setTime(0); - updateValueList(); - } - } - } - } + public long getCursorTime(){ + return cursorPainters.get(0).getTime(); + } - public void dropAccept(DropTargetEvent event) { - if (event.detail != DND.DROP_MOVE || event.y > trackVerticalOffset.lastKey() + trackList.getTrackHeight()) { - event.detail = DND.DROP_NONE; - } - } - }); - } - - private void createTrackDragSource(final Canvas canvas) { - Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() }; - DragSource dragSource = new DragSource(canvas, DND.DROP_MOVE); - dragSource.setTransfer(types); - dragSource.addDragListener(new DragSourceAdapter() { - public void dragStart(DragSourceEvent event) { - if (currentCursorSelection!=null) { - event.doit = true; - LocalSelectionTransfer.getTransfer().setSelection(getSelection()); - currentCursorSelection.setDragging(true); - } - } + private void createStreamDragSource(final Canvas canvas) { + Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() }; + DragSource dragSource = new DragSource(canvas, DND.DROP_MOVE); + dragSource.setTransfer(types); + dragSource.addDragListener(new DragSourceAdapter() { + public void dragStart(DragSourceEvent event) { + if (event.y < trackVerticalHeight) { + // event.data = + // trackVerticalOffset.floorEntry(event.y).getValue().getFullName(); + event.doit = true; + LocalSelectionTransfer.getTransfer().setSelection(new StructuredSelection(currentWaveformSelection)); + // System.out.println("dragStart at location "+new + // Point(event.x, event.y)); + } + } - public void dragSetData(DragSourceEvent event) { - if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) { - event.data =getSelection(); - } - } - }); - } + public void dragSetData(DragSourceEvent event) { + if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) { + event.data =getSelection(); + } + } + }); + } - private void createTrackDropTarget(final Canvas canvas) { - Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() }; - DropTarget dropTarget = new DropTarget(canvas, DND.DROP_MOVE); - dropTarget.setTransfer(types); - dropTarget.addDropListener(new DropTargetAdapter() { - public void drop(DropTargetEvent event) { - if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){ - ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); - if(sel!=null && sel instanceof IStructuredSelection){ - Object selObject = ((IStructuredSelection)sel).getFirstElement(); - if(selObject instanceof CursorPainter){ - CursorPainter painter = (CursorPainter) selObject; - DropTarget tgt = (DropTarget) event.widget; - Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y); - // painter.setTime(trackList.getTimeForOffset(dropPoint.x)); - setCursorTime(trackList.getTimeForOffset(dropPoint.x)); - ((Canvas) tgt.getControl()).redraw(); - canvas.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - updateValueList(); - } - }); - } - } - } - } + private void createStreamDropTarget(final Canvas canvas) { + Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() }; + DropTarget dropTarget = new DropTarget(canvas, DND.DROP_MOVE); + dropTarget.setTransfer(types); - public void dropAccept(DropTargetEvent event) { - if (event.detail != DND.DROP_MOVE || event.y > trackVerticalOffset.lastKey() + trackList.getTrackHeight()) { - event.detail = DND.DROP_NONE; - } - if(currentCursorSelection!=null) currentCursorSelection.setDragging(false); - } - public void dragOver(DropTargetEvent event){ - ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); - if(sel!=null && sel instanceof IStructuredSelection){ - Object selObject = ((IStructuredSelection)sel).getFirstElement(); - if(selObject instanceof CursorPainter){ - DropTarget tgt = (DropTarget) event.widget; - Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y); - setCursorTime(trackList.getTimeForOffset(dropPoint.x)); - ((Canvas) tgt.getControl()).redraw(); - canvas.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - updateValueList(); - } - }); - } - } - } - }); - } + dropTarget.addDropListener(new DropTargetAdapter() { + @SuppressWarnings("unchecked") + public void drop(DropTargetEvent event) { + if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){ + ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); + if(sel!=null && sel instanceof IStructuredSelection){ + Object source = ((IStructuredSelection)sel).getFirstElement(); + DropTarget tgt = (DropTarget) event.widget; + Point dropPoint = ((Canvas) tgt.getControl()).toControl(event.x, event.y); + Object target = trackVerticalOffset.floorEntry(dropPoint.y).getValue(); + if(source instanceof IWaveform && target instanceof IWaveform){ + // int srcIdx=streams.indexOf(source); + // int tgtIdx=streams.indexOf(target); + // if(srcIdxtgtIdx?tgtIdx:tgtIdx+1, (IWaveform) source); + updateTracklist(); + } else if(source instanceof CursorPainter){ + ((CursorPainter)source).setTime(0); + updateValueList(); + } + } + } + } - public void addPropertyChangeListener(PropertyChangeListener listener) { - this.pcs.addPropertyChangeListener(listener); - } - public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - this.pcs.addPropertyChangeListener(propertyName, listener); - } + public void dropAccept(DropTargetEvent event) { + Point offset = canvas.toControl(event.x, event.y); + if (event.detail != DND.DROP_MOVE || offset.y > trackVerticalOffset.lastKey() + waveformList.getTrackHeight()) { + event.detail = DND.DROP_NONE; + } + } + }); + } - public PropertyChangeListener[] getPropertyChangeListeners() { - return this.pcs.getPropertyChangeListeners(); - } + private void createWaveformDragSource(final Canvas canvas) { + Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() }; + DragSource dragSource = new DragSource(canvas, DND.DROP_MOVE); + dragSource.setTransfer(types); + dragSource.addDragListener(new DragSourceAdapter() { + public void dragStart(DragSourceEvent event) { + event.doit = false; + for(Object o:waveformList.getClicked(new Point(event.x, event.y))){ + if(o instanceof CursorPainter){ + LocalSelectionTransfer.getTransfer().setSelection(new StructuredSelection(o)); + ((CursorPainter)o).setDragging(true); + event.doit = true; + return; + } + } + } - public PropertyChangeListener[] getPropertyChangeListeners(String propertyName) { - return this.pcs.getPropertyChangeListeners(propertyName); - } + public void dragSetData(DragSourceEvent event) { + if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) { + event.data=waveformList.getClicked(new Point(event.x, event.y)); + } + } + }); + } - public void removePropertyChangeListener(PropertyChangeListener listener) { - this.pcs.removePropertyChangeListener(listener); - } + private void createWaveformDropTarget(final Canvas canvas) { + Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() }; + DropTarget dropTarget = new DropTarget(canvas, DND.DROP_MOVE); + dropTarget.setTransfer(types); + dropTarget.addDropListener(new DropTargetAdapter() { + public void drop(DropTargetEvent event) { + if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)){ + ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); + if(sel!=null && sel instanceof IStructuredSelection && + ((IStructuredSelection)sel).getFirstElement() instanceof CursorPainter){ + ((CursorPainter)((IStructuredSelection)sel).getFirstElement()).setDragging(false); + updateWaveform(canvas, event); + } + } + } - public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { - this.pcs.removePropertyChangeListener(propertyName, listener); - } + public void dropAccept(DropTargetEvent event) { + Point offset = canvas.toControl(event.x, event.y); + if (event.detail != DND.DROP_MOVE || offset.y > trackVerticalOffset.lastKey() + waveformList.getTrackHeight()) { + event.detail = DND.DROP_NONE; + } + } - public boolean hasListeners(String propertyName) { - return this.pcs.hasListeners(propertyName); - } + public void dragOver(DropTargetEvent event){ + ISelection sel = LocalSelectionTransfer.getTransfer().getSelection(); + if(sel!=null && sel instanceof IStructuredSelection && + ((IStructuredSelection)sel).getFirstElement() instanceof CursorPainter){ + updateWaveform(canvas, event); + } + } + + protected void updateWaveform(final Canvas canvas, DropTargetEvent event) { + Point dropPoint = canvas.toControl(event.x, event.y); + setCursorTime(waveformList.getTimeForOffset(dropPoint.x)); + canvas.getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + if(!canvas.isDisposed()){ + canvas.redraw(); + updateValueList(); + } + } + }); + } + }); + + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + this.pcs.addPropertyChangeListener(listener); + } + + public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { + this.pcs.addPropertyChangeListener(propertyName, listener); + } + + public PropertyChangeListener[] getPropertyChangeListeners() { + return this.pcs.getPropertyChangeListeners(); + } + + public PropertyChangeListener[] getPropertyChangeListeners(String propertyName) { + return this.pcs.getPropertyChangeListeners(propertyName); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + this.pcs.removePropertyChangeListener(listener); + } + + public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { + this.pcs.removePropertyChangeListener(propertyName, listener); + } + + public boolean hasListeners(String propertyName) { + return this.pcs.hasListeners(propertyName); + } } diff --git a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/SignalPainter.java b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/SignalPainter.java index 6f06e48..8eb9707 100644 --- a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/SignalPainter.java +++ b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/SignalPainter.java @@ -42,7 +42,7 @@ public class SignalPainter implements IWaveformPainter { } public void paintArea(GC gc, Rectangle area) { - if(waveCanvas.currentWaveformSelection!=null && waveCanvas.currentWaveformSelection.getId()==signal.getId()) + if(waveCanvas.currentWaveformSelection!=null && waveCanvas.currentWaveformSelection.equals(signal)) gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TRACK_BG_HIGHLITE.ordinal()]); else gc.setBackground(this.waveCanvas.colors[even?WaveformCanvas.Colors.TRACK_BG_EVEN.ordinal():WaveformCanvas.Colors.TRACK_BG_ODD.ordinal()]); diff --git a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java index 26df2ff..b0e1561 100644 --- a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java +++ b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/StreamPainter.java @@ -51,12 +51,12 @@ public class StreamPainter implements IWaveformPainter{ @SuppressWarnings("unchecked") public void paintArea(GC gc, Rectangle area) { if(stream.getEvents().size()==0) return; - if(waveCanvas.currentWaveformSelection!=null && waveCanvas.currentWaveformSelection.getId()==stream.getId()) + if(waveCanvas.currentWaveformSelection!=null && waveCanvas.currentWaveformSelection.equals(stream)) gc.setBackground(this.waveCanvas.colors[WaveformCanvas.Colors.TRACK_BG_HIGHLITE.ordinal()]); else gc.setBackground(this.waveCanvas.colors[even?WaveformCanvas.Colors.TRACK_BG_EVEN.ordinal():WaveformCanvas.Colors.TRACK_BG_ODD.ordinal()]); gc.setFillRule(SWT.FILL_EVEN_ODD); - gc.fillRectangle(0,0,area.width, area.height); + gc.fillRectangle(area); Entry firstTx=stream.getEvents().floorEntry(area.x*waveCanvas.getScaleFactor()); Entry lastTx=stream.getEvents().ceilingEntry((area.x+area.width)*waveCanvas.getScaleFactor()); if(firstTx==null) firstTx = stream.getEvents().firstEntry(); @@ -82,7 +82,7 @@ public class StreamPainter implements IWaveformPainter{ seenTx.add(txEvent.getTransaction()); if(txEvent.getType()==ITxEvent.Type.END){ ITx tx = txEvent.getTransaction(); - highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.getId()==tx.getId(); + highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.equals(tx); drawTx(gc, area, tx); seenTx.remove(tx); } diff --git a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java index 4b541e0..91ce938 100644 --- a/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java +++ b/com.minres.scviewer.database.swt/src/com/minres/scviewer/database/swt/internal/WaveformCanvas.java @@ -327,7 +327,8 @@ public class WaveformCanvas extends Canvas { } } - public Object getClicked(Point point) { + public List getClicked(Point point) { + LinkedList result=new LinkedList<>(); for (IPainter p : Lists.reverse(painterList)) { if (p instanceof TrackPainter) { int y = point.y - origin.y; @@ -335,17 +336,28 @@ public class WaveformCanvas extends Canvas { Entry entry = trackVerticalOffset.floorEntry(y); if (entry != null) { if (entry.getValue() instanceof StreamPainter) { - return ((StreamPainter) entry.getValue()).getClicked(new Point(x, y - entry.getKey())); + result.add(((StreamPainter) entry.getValue()).getClicked(new Point(x, y - entry.getKey()))); } else if (entry.getValue() instanceof SignalPainter) - return ((SignalPainter) entry.getValue()).getSignal(); + result.add(((SignalPainter) entry.getValue()).getSignal()); } } else if (p instanceof CursorPainter) { - if (Math.abs(point.x - ((CursorPainter) p).getTime()/scaleFactor) < 2) { - return p; + if (Math.abs(point.x - origin.x - ((CursorPainter) p).getTime()/scaleFactor) < 2) { + result.add(p); } } } - return null; + return result; + } + + public List getEntriesAtPosition(IWaveform iWaveform, int i) { + LinkedList result=new LinkedList<>(); + int x = i - origin.x; + for(IPainter p: trackVerticalOffset.values()){ + if (p instanceof StreamPainter && ((StreamPainter)p).getStream()==iWaveform) { + result.add(((StreamPainter) p).getClicked(new Point(x, trackHeight/2))); + } + } + return result; } public void setSelected(ITx currentSelection, IWaveform currentWaveformSelection) { @@ -379,6 +391,18 @@ public class WaveformCanvas extends Canvas { } } } + + public void reveal(long time) { + int scaledTime = (int) (time / scaleFactor); + Point size = getSize(); + size.x -= getVerticalBar().getSize().x + 2; + size.y -= getHorizontalBar().getSize().y; + if (scaledTime < -origin.x) { + setOrigin(-scaledTime+10, origin.y); + } else if (scaledTime > (size.x - origin.x)) { + setOrigin(size.x - scaledTime-30, origin.y); + } + } public int getRulerHeight() { return rulerHeight; diff --git a/com.minres.scviewer.database.swt/src/org/eclipse/wb/swt/SWTResourceManager.java b/com.minres.scviewer.database.swt/src/org/eclipse/wb/swt/SWTResourceManager.java index 53472ad..8b6d4cc 100644 --- a/com.minres.scviewer.database.swt/src/org/eclipse/wb/swt/SWTResourceManager.java +++ b/com.minres.scviewer.database.swt/src/org/eclipse/wb/swt/SWTResourceManager.java @@ -1,32 +1,32 @@ /******************************************************************************* - * Copyright (c) 2014, 2015 MINRES Technologies GmbH and others. + * Copyright (c) 2011 Google, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * MINRES Technologies GmbH - initial API and implementation + * Google, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.wb.swt; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Display; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Cursor; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Display; /** * Utility class for managing OS resources associated with SWT controls such as colors, fonts, images, etc. diff --git a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java index 55ab621..9d28370 100644 --- a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java +++ b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java @@ -21,7 +21,7 @@ import org.junit.Before; import org.junit.Test; import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.database.WaveformDb; +import com.minres.scviewer.database.internal.WaveformDb; public class DatabaseServicesTest { diff --git a/com.minres.scviewer.database.text/META-INF/MANIFEST.MF b/com.minres.scviewer.database.text/META-INF/MANIFEST.MF index 2d579e8..2dcd5cf 100644 --- a/com.minres.scviewer.database.text/META-INF/MANIFEST.MF +++ b/com.minres.scviewer.database.text/META-INF/MANIFEST.MF @@ -14,5 +14,4 @@ Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", org.eclipse.osgi.services;bundle-version="3.4.0", com.google.guava;bundle-version="15.0.0" Service-Component: OSGI-INF/component.xml -Export-Package: com.minres.scviewer.database.text Bundle-ActivationPolicy: lazy diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy index 072f46e..8477153 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy @@ -17,12 +17,13 @@ import java.util.List; import java.util.Map; import java.util.NavigableMap; -import com.google.common.collect.TreeMultimap; -import com.minres.scviewer.database.HierNode; +import com.google.common.collect.TreeMultimap import com.minres.scviewer.database.ITxEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb +import com.minres.scviewer.database.IWaveformEvent import com.minres.scviewer.database.ITxGenerator +import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.IHierNode import com.minres.scviewer.database.ITxStream import com.minres.scviewer.database.ITx @@ -107,4 +108,10 @@ class TxStream extends HierNode implements ITxStream { public Collection getWaveformEventsAtTime(Long time) { return events.get(time); } + + @Override + public Boolean equals(IWaveform other) { + return(other instanceof TxStream && this.getId()==other.getId()); + } + } diff --git a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java index 9962fbb..f4e3468 100644 --- a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java +++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java @@ -109,6 +109,11 @@ public class VCDSignal extends HierNode implements ISig return values.floorEntry(time).getValue(); } + @Override + public Boolean equals(IWaveform other) { + return(other instanceof VCDSignal && this.getId()==other.getId()); + } + } diff --git a/com.minres.scviewer.database/META-INF/MANIFEST.MF b/com.minres.scviewer.database/META-INF/MANIFEST.MF index 043bc87..e158606 100644 --- a/com.minres.scviewer.database/META-INF/MANIFEST.MF +++ b/com.minres.scviewer.database/META-INF/MANIFEST.MF @@ -7,7 +7,8 @@ Bundle-Vendor: MINRES Technologies GmbH Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Export-Package: com.minres.scviewer.database Bundle-ActivationPolicy: lazy -Service-Component: OSGI-INF/component.xml +Service-Component: OSGI-INF/component.xml,OSGI-INF/component2.xml Require-Bundle: org.eclipse.equinox.ds;bundle-version="1.4.200", org.eclipse.equinox.util;bundle-version="1.0.500", - org.eclipse.osgi.services;bundle-version="3.4.0" + org.eclipse.osgi.services;bundle-version="3.4.0", + org.eclipse.wb.core.lib diff --git a/com.minres.scviewer.database/OSGI-INF/component.xml b/com.minres.scviewer.database/OSGI-INF/component.xml index b26e405..e313c27 100644 --- a/com.minres.scviewer.database/OSGI-INF/component.xml +++ b/com.minres.scviewer.database/OSGI-INF/component.xml @@ -1,5 +1,5 @@ - - + + diff --git a/com.minres.scviewer.database/OSGI-INF/component2.xml b/com.minres.scviewer.database/OSGI-INF/component2.xml new file mode 100644 index 0000000..95b8490 --- /dev/null +++ b/com.minres.scviewer.database/OSGI-INF/component2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java index b849733..267a2e9 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java @@ -19,6 +19,8 @@ public class HierNode implements IHierNode { protected String name; + protected String parentName; + protected ArrayList childs; protected PropertyChangeSupport pcs; @@ -29,8 +31,13 @@ public class HierNode implements IHierNode { } public HierNode(String name) { + this(name, ""); + } + + public HierNode(String name, String parentName) { this(); this.name=name; + this.parentName=parentName; } @Override @@ -46,7 +53,10 @@ public class HierNode implements IHierNode { @Override public String getFullName() { - return name; + if(parentName!=null && parentName.length()>0) + return parentName+"."+name; + else + return name; } @Override @@ -59,6 +69,11 @@ public class HierNode implements IHierNode { this.name=name; } + @Override + public void setParentName(String name) { + this.parentName=name; + } + @Override public List getChildNodes() { return childs; diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java index e1af551..aabc142 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/IHierNode.java @@ -39,6 +39,8 @@ public interface IHierNode extends Comparable{ public void setName(String name); + public void setParentName(String name); + public List getChildNodes(); } diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java index 3e9994a..761553b 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java @@ -18,5 +18,7 @@ public interface IWaveform extends IHierNode { public String getKind(); public IWaveformDb getDb(); + + public Boolean equals(IWaveform other); } diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbFactory.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbFactory.java new file mode 100644 index 0000000..556d728 --- /dev/null +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDbFactory.java @@ -0,0 +1,6 @@ +package com.minres.scviewer.database; + +public interface IWaveformDbFactory { + + IWaveformDb getDatabase(); +} diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformDb.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java similarity index 78% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformDb.java rename to com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java index 2c7cb53..7e78ce7 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/WaveformDb.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java @@ -8,7 +8,7 @@ * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ -package com.minres.scviewer.database; +package com.minres.scviewer.database.internal; import java.io.File; import java.util.ArrayList; @@ -18,6 +18,17 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import com.google.common.base.Joiner; +import com.minres.scviewer.database.HierNode; +import com.minres.scviewer.database.IHierNode; +import com.minres.scviewer.database.ISignal; +import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.database.IWaveformDbLoader; +import com.minres.scviewer.database.IWaveformEvent; +import com.minres.scviewer.database.InputFormatException; + public class WaveformDb extends HierNode implements IWaveformDb { private static List loaders=new LinkedList(); @@ -29,11 +40,11 @@ public class WaveformDb extends HierNode implements IWaveformDb { private Long maxTime; - public void bind(IWaveformDbLoader loader){ + public synchronized void bind(IWaveformDbLoader loader){ loaders.add(loader); } - public void unbind(IWaveformDbLoader loader){ + public synchronized void unbind(IWaveformDbLoader loader){ loaders.remove(loader); } @@ -73,8 +84,8 @@ public class WaveformDb extends HierNode implements IWaveformDb { if(loader.getMaxTime()>maxTime){ maxTime=loader.getMaxTime(); } - buildHierarchyNodes() ; if(name==null) name=getFileBasename(inp.getName()); + buildHierarchyNodes() ; pcs.firePropertyChange("WAVEFORMS", null, waveforms); pcs.firePropertyChange("CHILDS", null, childNodes); return true; @@ -102,16 +113,18 @@ public class WaveformDb extends HierNode implements IWaveformDb { childNodes= new ArrayList(); for(IWaveform stream:getAllWaves()){ updateMaxTime(stream); - String[] hier = stream.getFullName().split("\\."); + String[] hier = stream.getName().split("\\."); IHierNode node = this; + List path=new LinkedList(); + path.add(name); for(String name:hier){ IHierNode n1 = null; - for (IHierNode n : node.getChildNodes()) { - if (n.getName().equals(name)) { - n1=n; - break; - } - } + for (IHierNode n : node.getChildNodes()) { + if (n.getName().equals(name)) { + n1=n; + break; + } + } if(name == hier[hier.length-1]){ //leaf if(n1!=null) { if(n1 instanceof HierNode){ @@ -123,6 +136,7 @@ public class WaveformDb extends HierNode implements IWaveformDb { } } stream.setName(name); + stream.setParentName(Joiner.on(".").join(path)); node.getChildNodes().add(stream); Collections.sort(node.getChildNodes()); node=stream; @@ -130,12 +144,13 @@ public class WaveformDb extends HierNode implements IWaveformDb { if(n1 != null) { node=n1; } else { - HierNode newNode = new HierNode(name); + HierNode newNode = new HierNode(name, Joiner.on(".").join(path)); node.getChildNodes().add(newNode); Collections.sort(node.getChildNodes()); node=newNode; } } + path.add(name); } } } diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDbFactory.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDbFactory.java new file mode 100644 index 0000000..d79247d --- /dev/null +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDbFactory.java @@ -0,0 +1,23 @@ +/** + * + */ +package com.minres.scviewer.database.internal; + +import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.database.IWaveformDbFactory; + +/** + * @author eyck + * + */ +public class WaveformDbFactory implements IWaveformDbFactory { + + /* (non-Javadoc) + * @see com.minres.scviewer.database.IWaveformDbFactory#getDatabase() + */ + @Override + public IWaveformDb getDatabase() { + return new WaveformDb(); + } + +} diff --git a/scv_tr_sqlite/.settings/language.settings.xml b/scv_tr_sqlite/.settings/language.settings.xml new file mode 100644 index 0000000..7d28d39 --- /dev/null +++ b/scv_tr_sqlite/.settings/language.settings.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/sqlite-jdbc.osgi/.gitignore b/sqlite-jdbc.osgi/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/sqlite-jdbc.osgi/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/sqlite-jdbc.osgi/.project b/sqlite-jdbc.osgi/.project new file mode 100644 index 0000000..aee7c93 --- /dev/null +++ b/sqlite-jdbc.osgi/.project @@ -0,0 +1,17 @@ + + + sqlite-jdbc.osgi + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/sqlite-jdbc.osgi/pom.xml b/sqlite-jdbc.osgi/pom.xml new file mode 100644 index 0000000..cb5bda7 --- /dev/null +++ b/sqlite-jdbc.osgi/pom.xml @@ -0,0 +1,48 @@ + + 4.0.0 + + sqlite + sqlite-jdbc.osgi + 3.8.7 + bundle + + sqlite-jdbc.osgi-wrapped + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + org.xerial + sqlite-jdbc + 3.8.7 + + + + + + + org.apache.felix + maven-bundle-plugin + 2.3.7 + true + + + *;resolution:=optional + <_exportcontents>* + sqlite-jdbc + + + + + +