add dynamic update of waveform list

This commit is contained in:
2021-01-09 20:10:58 +01:00
parent 15fb825548
commit 73b21cb80b
24 changed files with 1028 additions and 894 deletions

View File

@ -26,8 +26,6 @@ import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
@ -36,13 +34,12 @@ import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wb.swt.ResourceManager;
import org.eclipse.wb.swt.SWTResourceManager;
import org.osgi.framework.Version;
import com.minres.scviewer.e4.application.Constants;
import com.minres.scviewer.e4.application.Messages;
/**
@ -73,34 +70,32 @@ public class AboutDialog extends Dialog {
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridData gd_composite = new GridData(SWT.LEFT, SWT.FILL, true, true);
gd_composite.widthHint = 600;
gd_composite.heightHint =300;
composite.setLayoutData(gd_composite);
GridData gdComposite = new GridData(SWT.LEFT, SWT.FILL, true, true);
gdComposite.widthHint = 600;
gdComposite.heightHint =300;
composite.setLayoutData(gdComposite);
composite.setLayout(new GridLayout(2, false));
final Color white=SWTResourceManager.getColor(SWT.COLOR_WHITE);
final Image scviewerLogo=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/SCViewer_logo.png"); //$NON-NLS-1$ //$NON-NLS-2$
final Image minresLogo=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/Minres_logo.png"); //$NON-NLS-1$ //$NON-NLS-2$
final Image scviewerLogo=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/SCViewer_logo.png"); //$NON-NLS-1$
final Image minresLogo=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/Minres_logo.png"); //$NON-NLS-1$
Canvas canvas = new Canvas(composite,SWT.NO_REDRAW_RESIZE);
GridData gd_canvas = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_canvas.widthHint = 200;
gd_canvas.heightHint =300;
canvas.setLayoutData(gd_canvas);
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
GridData gdCanvas = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gdCanvas.widthHint = 200;
gdCanvas.heightHint =300;
canvas.setLayoutData(gdCanvas);
canvas.addPaintListener(e -> {
e.gc.setBackground(white);
e.gc.fillRectangle(e.x, e.y, e.width, e.height);
e.gc.drawImage(scviewerLogo,4,0);
e.gc.drawImage(minresLogo,0,200);
}
});
StyledText styledText = new StyledText(composite, SWT.V_SCROLL | SWT.BORDER);
styledText.setEditable(false);
GridData gd_styledText = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
styledText.setLayoutData(gd_styledText);
GridData gdStyledText = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
styledText.setLayoutData(gdStyledText);
Version version = Platform.getProduct().getDefiningBundle().getVersion();
String versionString = String.format("%d.%d.%d", version.getMajor(), version.getMinor(), version.getMicro());
String productTitle = NLS.bind(Messages.AboutDialog_0, versionString);
@ -129,22 +124,17 @@ public class AboutDialog extends Dialog {
styleRange.length = matcher.end()-matcher.start();
styledText.setStyleRange(styleRange);
}
styledText.addListener(SWT.MouseDown, new Listener() {
@Override
public void handleEvent(Event event) {
// It is up to the application to determine when and how a link should be activated.
// links are activated on mouse down when the control key is held down
// if ((event.stateMask & SWT.MOD1) != 0) {
try {
@SuppressWarnings("deprecation")
int offset = ((StyledText)event.widget).getOffsetAtLocation(new Point (event.x, event.y));
StyleRange style = ((StyledText)event.widget).getStyleRangeAtOffset(offset);
if (style != null && style.underline && style.underlineStyle == SWT.UNDERLINE_LINK) {
Desktop.getDesktop().browse(new java.net.URI(style.data.toString()));
}
} catch (IOException | URISyntaxException | IllegalArgumentException e) {}
// }
}
styledText.addListener(SWT.MouseDown, event -> {
// It is up to the application to determine when and how a link should be activated.
// links are activated on mouse down when the control key is held down
try {
@SuppressWarnings("deprecation")
int offset = ((StyledText)event.widget).getOffsetAtLocation(new Point (event.x, event.y));
StyleRange style = ((StyledText)event.widget).getStyleRangeAtOffset(offset);
if (style != null && style.underline && style.underlineStyle == SWT.UNDERLINE_LINK) {
Desktop.getDesktop().browse(new java.net.URI(style.data.toString()));
}
} catch (IOException | URISyntaxException | IllegalArgumentException e) {}
});
styleRange.start = 0;
@ -154,6 +144,7 @@ public class AboutDialog extends Dialog {
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
// create OK button
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true);

View File

@ -13,7 +13,6 @@ package com.minres.scviewer.e4.application.parts;
import java.beans.PropertyChangeListener;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
@ -65,6 +64,7 @@ import com.minres.scviewer.database.HierNode;
import com.minres.scviewer.database.IHierNode;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.e4.application.Constants;
import com.minres.scviewer.e4.application.Messages;
import com.minres.scviewer.e4.application.handlers.AddWaveformHandler;
import com.minres.scviewer.e4.application.provider.TxDbContentProvider;
@ -125,12 +125,17 @@ public class DesignBrowser {
/** The tree viewer pcl. */
private PropertyChangeListener treeViewerPCL = evt -> {
if("CHILDS".equals(evt.getPropertyName())){ //$NON-NLS-1$
if(IHierNode.CHILDS.equals(evt.getPropertyName())){ //$NON-NLS-1$
treeViewer.getTree().getDisplay().asyncExec(() -> treeViewer.refresh());
} else if("WAVEFORMS".equals(evt.getPropertyName())) {
} else if(IHierNode.WAVEFORMS.equals(evt.getPropertyName())) {
treeViewer.getTree().getDisplay().asyncExec(() -> {
IWaveformDb database = waveformViewerPart.getDatabase();
treeViewer.setInput(Arrays.asList(database.isLoaded()?new IWaveformDb[]{database}:new IWaveformDb[]{new LoadingWaveformDb()}));
treeViewer.setInput(new IWaveformDb[]{waveformViewerPart.getDatabase()});
treeViewer.refresh();
});
} else if(IHierNode.LOADING_FINISHED.equals(evt.getPropertyName())) {
treeViewer.getTree().getDisplay().asyncExec(() -> {
treeViewer.update(waveformViewerPart.getDatabase(), null);
DesignBrowser.this.updateButtons();
});
}
};
@ -195,7 +200,12 @@ public class DesignBrowser {
treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
treeViewer.setContentProvider(new TxDbContentProvider());
treeViewer.setContentProvider(new TxDbContentProvider() {
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
updateButtons();
}
});
treeViewer.setLabelProvider(new TxDbLabelProvider());
treeViewer.addFilter(treeAttributeFilter);
treeViewer.setUseHashlookup(true);
@ -236,7 +246,12 @@ public class DesignBrowser {
tableAttributeFilter = new StreamTableFilter();
txTableViewer = new TableViewer(parent);
txTableViewer.setContentProvider(new TxDbContentProvider(true));
txTableViewer.setContentProvider(new TxDbContentProvider(true) {
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
updateButtons();
}
});
txTableViewer.setLabelProvider(new TxDbLabelProvider());
txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
txTableViewer.addFilter(tableAttributeFilter);
@ -258,7 +273,7 @@ public class DesignBrowser {
appendItem = new ToolItem(toolBar, SWT.NONE);
appendItem.setToolTipText(Messages.DesignBrowser_4);
appendItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/append_wave.png")); //$NON-NLS-1$ //$NON-NLS-2$
appendItem.setImage(ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/append_wave.png")); //$NON-NLS-1$
appendItem.setEnabled(false);
appendItem.addSelectionListener(new SelectionAdapter() {
@Override
@ -273,7 +288,7 @@ public class DesignBrowser {
insertItem = new ToolItem(toolBar, SWT.NONE);
insertItem.setToolTipText(Messages.DesignBrowser_8);
insertItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/insert_wave.png")); //$NON-NLS-1$ //$NON-NLS-2$
insertItem.setImage(ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/insert_wave.png")); //$NON-NLS-1$
insertItem.setEnabled(false);
insertItem.addSelectionListener(new SelectionAdapter() {
@Override
@ -356,7 +371,7 @@ public class DesignBrowser {
if(db==database) return; // do nothing if old and new database is the same
((List<IWaveformDb>)input).get(0).removePropertyChangeListener(treeViewerPCL);
}
treeViewer.setInput(Arrays.asList(database.isLoaded()?new IWaveformDb[]{database}:new IWaveformDb[]{new LoadingWaveformDb()}));
treeViewer.setInput(new IWaveformDb[]{database});
Object state=this.waveformViewerPart.retrieveDesignBrowerState();
if(state instanceof DBState)
((DBState)state).apply();

View File

@ -5,7 +5,6 @@ import java.nio.file.FileSystems;
import java.nio.file.PathMatcher;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@ -48,6 +47,8 @@ import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.wb.swt.ResourceManager;
import com.minres.scviewer.e4.application.Constants;
public class FileBrowserDialog extends TrayDialog {
private Image folderImage;
@ -80,9 +81,9 @@ public class FileBrowserDialog extends TrayDialog {
public FileBrowserDialog(Shell parentShell) {
super(parentShell);
folderImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/folder.png"); //$NON-NLS-1$ //$NON-NLS-2$
dbImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/database.png"); //$NON-NLS-1$ //$NON-NLS-2$
fileImage=ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/page_white.png"); //$NON-NLS-1$ //$NON-NLS-2$
folderImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/folder.png"); //$NON-NLS-1$
dbImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/database.png"); //$NON-NLS-1$
fileImage=ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/page_white.png"); //$NON-NLS-1$
currentDirFile = new File(".");
}
@ -148,7 +149,7 @@ public class FileBrowserDialog extends TrayDialog {
toolBar.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
final ToolItem toolbarItemUp = new ToolItem(toolBar, SWT.PUSH);
toolbarItemUp.setToolTipText("up one level");
toolbarItemUp.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/arrow_up.png")); //$NON-NLS-1$ //$NON-NLS-2$);
toolbarItemUp.setImage(ResourceManager.getPluginImage(Constants.PLUGIN_ID, "icons/arrow_up.png")); //$NON-NLS-1$
toolbarItemUp.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
@ -158,7 +159,7 @@ public class FileBrowserDialog extends TrayDialog {
}
}
});
tableViewer = new TableViewer(tableViewerParent, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
tableViewer = new TableViewer(tableViewerParent, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
tableViewer.getTable().setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
tableViewer.addSelectionChangedListener(event -> {
IStructuredSelection sel = event.getStructuredSelection();
@ -187,8 +188,8 @@ public class FileBrowserDialog extends TrayDialog {
public void mouseDown(MouseEvent e) { mouseUp(e); }
@Override
public void mouseUp(MouseEvent e) {
TableItem element = (TableItem)tableViewer.getTable().getItem(new Point(e.x, e.y));
final Table table = tableViewer.getTable();
TableItem element = table.getItem(new Point(e.x, e.y));
if (element == null )//&& (e.stateMask&SWT.MODIFIER_MASK)!=0)
table.deselectAll();
else {
@ -231,7 +232,6 @@ public class FileBrowserDialog extends TrayDialog {
colEmpty.setLabelProvider(new FileTableLabelProvider() {
@Override public String getText(Object element) { return ""; }
});
//colEmpty.getColumn().setWidth(200);
colEmpty.getColumn().setText("");
fileTableComparator = new FileTableComparator();
@ -268,7 +268,7 @@ public class FileBrowserDialog extends TrayDialog {
}
private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) {
SelectionAdapter selectionAdapter = new SelectionAdapter() {
return new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fileTableComparator.setColumn(index);
@ -278,7 +278,6 @@ public class FileBrowserDialog extends TrayDialog {
tableViewer.refresh();
}
};
return selectionAdapter;
}
private void setDirSelection(File f) {
@ -334,10 +333,11 @@ public class FileBrowserDialog extends TrayDialog {
}
public boolean matches(Object f) {
assert(f instanceof File);
if(matchers.size()==0) return true;
for (PathMatcher m : matchers) {
if(m.matches(((File)f).toPath())) return true;
if(f instanceof File) {
if(matchers.isEmpty()) return true;
for (PathMatcher m : matchers) {
if(m.matches(((File)f).toPath())) return true;
}
}
return false;
}
@ -349,10 +349,8 @@ public class FileBrowserDialog extends TrayDialog {
if(entries != null) {
List<File> res = Arrays.stream(entries)
.filter(file -> !(file.isFile()||file.getName().startsWith(".") ||globber.matches(file)))
.sorted(new Comparator<File>(){
public int compare(File f1, File f2){return f1.getName().compareTo(f2.getName());}
})
.collect(Collectors.toList()); ;
.sorted( (f1, f2) -> f1.getName().compareTo(f2.getName()))
.collect(Collectors.toList());
return res.toArray();
} else
return new Object[0];
@ -364,25 +362,20 @@ public class FileBrowserDialog extends TrayDialog {
public boolean hasChildren(Object arg0) {
Object[] obj = getChildren(arg0);
return obj == null ? false : obj.length > 0;
return obj != null && obj.length > 0;
}
public Object[] getElements(Object arg0) {
return File.listRoots();
}
public void dispose() {
}
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
}
}
class FileTreeLabelProvider implements ILabelProvider {
private List<ILabelProviderListener> listeners;
public FileTreeLabelProvider() {
listeners = new ArrayList<ILabelProviderListener>();
listeners = new ArrayList<>();
}
public Image getImage(Object arg0) {
@ -400,6 +393,7 @@ public class FileBrowserDialog extends TrayDialog {
@Override
public void dispose() {
// nothing to ispose
}
public boolean isLabelProperty(Object arg0, String arg1) {
@ -425,15 +419,12 @@ public class FileBrowserDialog extends TrayDialog {
private int propertyIndex = 0;
private boolean descending = false;
public FileTableComparator() {
}
public int getDirection() {
return descending ? SWT.DOWN : SWT.UP;
}
public void setColumn(int column) {
descending = column == this.propertyIndex?!descending : false;
descending = column == this.propertyIndex && !descending;
this.propertyIndex = column;
}

View File

@ -1,94 +0,0 @@
package com.minres.scviewer.e4.application.parts;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.minres.scviewer.database.IDerivedWaveform;
import com.minres.scviewer.database.IHierNode;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.e4.application.Messages;
public class LoadingWaveformDb implements IWaveformDb {
private final String label = Messages.LoadingWaveformDb_0;
@Override
public void addPropertyChangeListener(PropertyChangeListener l) {
}
@Override
public void removePropertyChangeListener(PropertyChangeListener l) {
}
@Override
public String getFullName() {
return label;
}
@Override
public String getName() {
return label;
}
@Override
public void setName(String name) {
}
@Override
public void setParent(IHierNode name) {
}
@Override
public List<IHierNode> getChildNodes() {
return new ArrayList<IHierNode>();
}
@Override
public int compareTo(IHierNode o) {
return 0;
}
@Override
public Long getMaxTime() {
return new Long(0);
}
@Override
public IWaveform getStreamByName(String name) {
return null;
}
@Override
public List<IWaveform> getAllWaves() {
return new ArrayList<IWaveform>();
}
@Override
public List<RelationType> getAllRelationTypes() {
return new ArrayList<RelationType>();
}
@Override
public boolean load(File inp) {
return false;
}
@Override
public boolean isLoaded() {
return false;
}
@Override
public void clear() {
}
@Override
public IDerivedWaveform deriveWaveform() {
return null;
}
}

View File

@ -85,9 +85,6 @@ public class TransactionDetails {
/** The selection service. */
@Inject ESelectionService selectionService;
/** The name filter. */
private Text nameFilter;
/** The tree viewer. */
private TreeViewer treeViewer;
@ -122,7 +119,7 @@ public class TransactionDetails {
top = new Composite(parent, SWT.NONE);
top.setLayout(new GridLayout(1, false));
nameFilter = new Text(top, SWT.BORDER);
Text nameFilter = new Text(top, SWT.BORDER);
nameFilter.setMessage(Messages.TransactionDetails_0);
nameFilter.addModifyListener(e -> {
attributeFilter.setSearchText(((Text) e.widget).getText());
@ -204,11 +201,6 @@ public class TransactionDetails {
treeViewer.refresh();
}
});
// Pack the columns
// for (int i = 0, n = table.getColumnCount(); i < n; i++) {
// table.getColumn(i).pack();
// }
// Turn on the header and the lines
tree.setHeaderVisible(true);
tree.setLinesVisible(true);

View File

@ -75,6 +75,7 @@ import org.eclipse.swt.widgets.Widget;
import com.minres.scviewer.database.DataType;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IHierNode;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbFactory;
@ -251,7 +252,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
showHover=hover;
database = dbFactory.getDatabase();
database.addPropertyChangeListener(evt -> {
if ("WAVEFORMS".equals(evt.getPropertyName())) { //$NON-NLS-1$
if (IHierNode.WAVEFORMS.equals(evt.getPropertyName())) { //$NON-NLS-1$
myParent.getDisplay().syncExec(() -> waveformPane.setMaxTime(database.getMaxTime()));
}
});
@ -536,6 +537,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
protected void loadDatabase(final Map<String, String> state, long delay) {
fileMonitor.removeFileChangeListener(this);
database.setName(filesToLoad.stream().map(File::getName).reduce(null, (prefix, element) -> prefix==null? element : prefix + ","+ element));
Job job = new Job(Messages.WaveformViewer_15) {
@Override
protected IStatus run(IProgressMonitor monitor) {
@ -683,9 +685,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
//clear old streams before loading tab settings
if(!waveformPane.getStreamList().isEmpty()) {
waveformPane.getStreamList().clear();
for (TrackEntry trackEntry : waveformPane.getStreamList()) {
trackEntry.selected = false;
}
waveformPane.getStreamList().stream().forEach(e -> e.selected=false);
}
try (FileInputStream in = new FileInputStream(fileName)) {
Properties props = new Properties();
@ -916,15 +916,6 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
return ext;
}
/**
* Gets the model.
*
* @return the model
*/
public IWaveformDb getModel() {
return database;
}
/**
* Gets the database.
*