diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java index f7d1aa5..700cc04 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java @@ -62,4 +62,13 @@ public interface IWaveformDb extends IHierNode { */ public boolean isLoaded(); + /** + * close an open database. + * + * @param inp the inp + * @return true, if successful + */ + public void close(); + + } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java index 6530b57..d56f2df 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java @@ -18,6 +18,7 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; @@ -39,6 +40,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL /** The loaders. */ private static List loaderFactories = new LinkedList<>(); + private List activeLoader = new ArrayList<>(); /** The loaded. */ private boolean loaded; @@ -136,6 +138,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL loader.addPropertyChangeListener(this); try { loader.load(inp); + activeLoader.add(loader); } catch (Exception e) { LOG.error("error loading file "+inp.getName(), e); retval=false; @@ -158,6 +161,12 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL return retval; } + @Override + public void close() { + for (IWaveformDbLoader entry : activeLoader) { + entry.dispose(); + } + } /** * Gets the file basename. * diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java index bb24484..358282a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java @@ -124,7 +124,7 @@ public class RelationTypeToolControl extends PartListener implements ISelectionC return; } } - if(comboViewer!=null) comboViewer.getCombo().setEnabled(false); + if(comboViewer!=null && !comboViewer.getCombo().isDisposed()) comboViewer.getCombo().setEnabled(false); } /* (non-Javadoc) diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddSeparatorHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddSeparatorHandler.java index 2af596a..91686c5 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddSeparatorHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddSeparatorHandler.java @@ -35,8 +35,12 @@ public class AddSeparatorHandler { Object sel = ((WaveformViewer)part.getObject()).getSelection(); if( sel instanceof IStructuredSelection) { if(((IStructuredSelection)sel).isEmpty()) return false; - Object o= ((IStructuredSelection)sel).getFirstElement(); - return o instanceof TrackEntry; + IStructuredSelection isel = (IStructuredSelection) sel; + if(isel.size()==1) + return isel.getFirstElement() instanceof TrackEntry; + else if(isel.size()==2) { + return isel.toArray()[1] instanceof TrackEntry; + } } } return false; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SelectAllHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SelectAllHandler.java index 2c7aa58..00e8207 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SelectAllHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SelectAllHandler.java @@ -23,13 +23,13 @@ public class SelectAllHandler { @CanExecute public boolean canExecute(EPartService partService) { MPart part = partService.getActivePart(); - return part.getObject() instanceof WaveformViewer; + return part!=null && part.getObject() instanceof WaveformViewer; } @Execute public void execute(EPartService partService) { MPart part = partService.getActivePart(); - if(part.getObject() instanceof WaveformViewer) + if(part!=null && part.getObject() instanceof WaveformViewer) ((WaveformViewer) part.getObject()).selectAll(); } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java index 79e964a..760107a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java @@ -29,6 +29,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Named; @@ -512,6 +513,12 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis showTxDetails(false); } + @PreDestroy + public void closeDatabase() { + if(database.isLoaded()) + database.close(); + } + @Inject @Optional public void reactOnPrefsChange(@Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE) IEclipsePreferences prefs) { diff --git a/tests/com.minres.scviewer.database.test/inputs/my_db.fst b/tests/com.minres.scviewer.database.test/inputs/my_db.fst index 42f3e3e..79137db 100644 Binary files a/tests/com.minres.scviewer.database.test/inputs/my_db.fst and b/tests/com.minres.scviewer.database.test/inputs/my_db.fst differ diff --git a/tests/com.minres.scviewer.database.test/inputs/my_db.ftr b/tests/com.minres.scviewer.database.test/inputs/my_db.ftr index 077592e..4514d8b 100644 Binary files a/tests/com.minres.scviewer.database.test/inputs/my_db.ftr and b/tests/com.minres.scviewer.database.test/inputs/my_db.ftr differ diff --git a/tests/com.minres.scviewer.database.test/inputs/my_db.scview b/tests/com.minres.scviewer.database.test/inputs/my_db.scview new file mode 100644 index 0000000..819e4d1 --- /dev/null +++ b/tests/com.minres.scviewer.database.test/inputs/my_db.scview @@ -0,0 +1,49 @@ +#Written by SCViewer +#Wed Mar 01 08:49:19 CET 2023 +SHOWN_WAVEFORM0=tr.addr_ack +SHOWN_WAVEFORM2=tr.bus_addr[7\:0] +SHOWN_WAVEFORM1=tr.addr_req +SHOWN_WAVEFORM7=tr.rw +SHOWN_WAVEFORM5.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM4=tr.bus_data[7\:0] +SHOWN_WAVEFORM3=Blank +SHOWN_WAVEFORM6=tr.data_rdy +SHOWN_WAVEFORM5=tr.clk +SHOWN_CURSOR1=100000000 +SHOWN_CURSOR0=10000000 +SHOWN_WAVEFORM0.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM5.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM0.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORMS=8 +SCALING_FACTOR=1000000 +SHOWN_CURSORS=2 +SHOWN_WAVEFORM0.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM7.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM3.WAVEFORM_TYPE=EMPTY +SHOWN_WAVEFORM2.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM6.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM2.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM4.WAVEFORM_TYPE=SIGNAL +DATABASE_FILE0=/scratch/eyck/workarea/MINRES/SCViewer/tests/com.minres.scviewer.database.test/inputs/my_db.vcd +SHOWN_WAVEFORM7.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM7.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM4.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM5.WAVE_DISPLAY=DEFAULT +DATABASE_FILES=1 +SHOWN_WAVEFORM1.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM4.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM5.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM1.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM6.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM6.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM1.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM4.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM1.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM7.WAVEFORM_TYPE=SIGNAL +TX_DETAILS_SHOWN=false +SHOWN_WAVEFORM2.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM2.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM0.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM6.WAVE_DISPLAY=DEFAULT +BASE_LINE_TIME=0 +SHOWN_WAVEFORM3.WAVEFORM_SELECTED=TRUE