diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntry.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntry.java index d528d35..05e248c 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntry.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntry.java @@ -11,12 +11,17 @@ package com.minres.scviewer.database.ui; +import java.util.ArrayList; +import java.util.List; + +import com.minres.scviewer.database.EmptyWaveform; import com.minres.scviewer.database.IWaveform; public class TrackEntry { + public enum HierState { + NONE, CLOSED, OPENED + } - IWaveformStyleProvider styleProvider; - public enum ValueDisplay { DEFAULT, BINARY, SIGNED, UNSIGNED @@ -26,28 +31,45 @@ public class TrackEntry { DEFAULT, STEP_WISE, CONTINOUS } + IWaveformStyleProvider styleProvider = null; + final public IWaveform waveform; - public int vOffset; + public int vOffset=0; - public int height; + public int height=0; - public boolean selected; + public boolean selected=false; + public HierState hierState=HierState.NONE; + + public List waveforms = new ArrayList<>(); + public String currentValue=""; public ValueDisplay valueDisplay = ValueDisplay.DEFAULT; public WaveDisplay waveDisplay = WaveDisplay.DEFAULT; + public TrackEntry() { + this.waveform = null; + this.styleProvider=null; + } + public TrackEntry(IWaveform waveform, IWaveformStyleProvider styleProvider) { this.waveform = waveform; this.styleProvider=styleProvider; - vOffset=0; - height=0; - selected=false; + this.hierState = (waveform!=null && waveform.getChildNodes().size()>0)?HierState.CLOSED:HierState.NONE; } - + + public TrackEntry(TrackEntry[] waveform, IWaveformStyleProvider styleProvider) { + this(new EmptyWaveform(), styleProvider); + this.hierState = HierState.CLOSED; + for (TrackEntry iWaveform : waveform) { + waveforms.add(iWaveform); + } + } + @Override public boolean equals(Object obj) { if(obj instanceof TrackEntry){ @@ -56,4 +78,5 @@ public class TrackEntry { } return false; } + } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntryGroup.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntryGroup.java deleted file mode 100644 index a209b66..0000000 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/TrackEntryGroup.java +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015-2023 MINRES Technologies GmbH and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * MINRES Technologies GmbH - initial API and implementation - *******************************************************************************/ - -package com.minres.scviewer.database.ui; - -import java.util.ArrayList; -import java.util.List; - -import com.minres.scviewer.database.EmptyWaveform; - -public class TrackEntryGroup extends TrackEntry { - - public List waveforms = new ArrayList<>(); - - public Boolean is_open = true; - - public TrackEntryGroup(TrackEntry[] waveform, IWaveformStyleProvider styleProvider) { - super(new EmptyWaveform(), styleProvider); - for (TrackEntry iWaveform : waveform) { - waveforms.add(iWaveform); - } - } - -} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index 295f112..2ba50de 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -91,7 +91,6 @@ import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformZoom; import com.minres.scviewer.database.ui.IWaveformviewEventListener; import com.minres.scviewer.database.ui.TrackEntry; -import com.minres.scviewer.database.ui.TrackEntryGroup; import com.minres.scviewer.database.ui.swt.internal.slider.ZoomBar; public class WaveformView implements IWaveformView { @@ -589,9 +588,8 @@ public class WaveformView implements IWaveformView { TextLayout tl = new TextLayout(waveformCanvas.getDisplay()); tl.setFont(styleProvider.getNameFont()); for (TrackEntry streamEntry : streams) { - if(streamEntry instanceof TrackEntryGroup && ((TrackEntryGroup)streamEntry).is_open) { - TrackEntryGroup streamEntryGroup = (TrackEntryGroup)streamEntry; - for (TrackEntry trackEntry : streamEntryGroup.waveforms) { + if(streamEntry.hierState == TrackEntry.HierState.OPENED) { + for (TrackEntry trackEntry : streamEntry.waveforms) { addPainter(even, trackEntry); trackVerticalOffset.put(tracksVerticalHeight, trackEntry); tl.setText(trackEntry.waveform.getFullName()); @@ -1140,19 +1138,11 @@ public class WaveformView implements IWaveformView { Integer lastKey = trackVerticalOffset.floorKey(rect.y + rect.height); Rectangle subArea = new Rectangle(rect.x, 0, rect.width, styleProvider.getTrackHeight()); if (lastKey.equals(firstKey)) { - TrackEntry trackEntry = trackVerticalOffset.get(firstKey); - IWaveform w = trackEntry.waveform; - if (w.getType() == WaveformType.TRANSACTION) - subArea.height *= w.getRowCount(); - drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected); + drawName(gc, subArea, firstKey, trackVerticalOffset.get(firstKey)); } else { for (Entry entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true) .entrySet()) { - IWaveform w = entry.getValue().waveform; - subArea.height = styleProvider.getTrackHeight(); - if (w.getType() == WaveformType.TRANSACTION) - subArea.height *= w.getRowCount(); - drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected); + drawName(gc, subArea, entry.getKey(), entry.getValue()); } } } catch (NoSuchElementException e) { @@ -1190,6 +1180,13 @@ public class WaveformView implements IWaveformView { } } + private void drawName(GC gc, Rectangle subArea, Integer firstKey, TrackEntry entry) { + IWaveform w = entry.waveform; + if (w.getType() == WaveformType.TRANSACTION) + subArea.height *= w.getRowCount(); + drawTextFormat(gc, subArea, firstKey, w.getFullName(), entry.selected, entry.hierState); + } + protected void drawValue(GC gc, Rectangle subArea, Integer yOffset, String value, boolean highlite) { int beginIndex = 0; for (int offset = 0; offset < subArea.height; offset += styleProvider.getTrackHeight()) { @@ -1202,7 +1199,12 @@ public class WaveformView implements IWaveformView { } protected void drawTextFormat(GC gc, Rectangle subArea, int yOffset, String value, boolean highlite) { + drawTextFormat(gc, subArea, yOffset, value, highlite, TrackEntry.HierState.NONE); + } + + protected void drawTextFormat(GC gc, Rectangle subArea, int yOffset, String value, boolean highlite, TrackEntry.HierState state) { Point size = gc.textExtent(value); + int height = styleProvider.getTrackHeight(); if (highlite) { gc.setBackground(SWTResourceManager.getColor(SWT.COLOR_LIST_SELECTION)); gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_LIST_SELECTION_TEXT)); @@ -1213,7 +1215,14 @@ public class WaveformView implements IWaveformView { gc.setForeground(namePaneHeader.getForeground()); gc.setFont(styleProvider.getNameFont()); } - gc.drawText(value, subArea.x + 5, subArea.y + yOffset + (styleProvider.getTrackHeight() - size.y) / 2, true); + if(state==TrackEntry.HierState.NONE) { + gc.drawText(value, subArea.x + 5, subArea.y + yOffset + (height - size.y) / 2, true); + } else { + gc.setBackground(highlite?SWTResourceManager.getColor(SWT.COLOR_LIST_SELECTION_TEXT):namePaneHeader.getForeground()); + gc.fillPolygon(new int[]{3, yOffset+(height-10)/2, 10, yOffset+height/2, 3, yOffset+(height+10)/2}); + Rectangle textArea = new Rectangle(subArea.x+12, subArea.y, subArea.width-12, subArea.height); + gc.drawText(value, textArea.x + 5, subArea.y + yOffset + (height - size.y) / 2, true); + } } public void setHighliteRelation(RelationType relationType) { diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java index 1b67efd..f2ac5b1 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/WaveformPopupMenuContribution.java @@ -34,7 +34,7 @@ public class WaveformPopupMenuContribution { @Inject MPart activePart; - final TrackEntry nullEntry = new TrackEntry(null, null); + final TrackEntry nullEntry = new TrackEntry(); private boolean selHasBitVector(ISelection sel, boolean checkForDouble) { if(!sel.isEmpty() && sel instanceof IStructuredSelection) {