From cc9be707087b7e26f9e740b4adb699f15b497fe1 Mon Sep 17 00:00:00 2001 From: eyck Date: Sun, 4 Oct 2020 16:20:16 +0200 Subject: [PATCH 1/3] refactor to integrate design browser --- .../.settings/org.eclipse.jdt.core.prefs | 1 + .../.settings/org.eclipse.jdt.core.prefs | 1 + .../.settings/org.eclipse.jdt.core.prefs | 1 + .../.settings/org.eclipse.jdt.core.prefs | 1 + .../.settings/org.eclipse.jdt.core.prefs | 1 + .../.settings/org.eclipse.pde.core.prefs | 1 - .../Application.e4xmi | 31 +- .../META-INF/MANIFEST.MF | 3 +- .../elements/RelationTypeToolControl.java | 2 +- .../e4/application/handlers/OpenHandler.java | 11 +- .../internal/ui/AbstractDesignBrowser.java | 575 ++++++++++++++++++ .../application/parts/TransactionDetails.java | 3 +- .../e4/application/parts/WaveformViewer.java | 105 ++-- .../.settings/org.eclipse.jdt.core.prefs | 1 + .../.settings/org.eclipse.jdt.core.prefs | 1 + 15 files changed, 655 insertions(+), 83 deletions(-) create mode 100644 plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/ui/AbstractDesignBrowser.java diff --git a/plugins/com.minres.scviewer.database.sqlite/.settings/org.eclipse.jdt.core.prefs b/plugins/com.minres.scviewer.database.sqlite/.settings/org.eclipse.jdt.core.prefs index 0c68a61..9f6ece8 100644 --- a/plugins/com.minres.scviewer.database.sqlite/.settings/org.eclipse.jdt.core.prefs +++ b/plugins/com.minres.scviewer.database.sqlite/.settings/org.eclipse.jdt.core.prefs @@ -4,4 +4,5 @@ org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/plugins/com.minres.scviewer.database.ui.swt/.settings/org.eclipse.jdt.core.prefs b/plugins/com.minres.scviewer.database.ui.swt/.settings/org.eclipse.jdt.core.prefs index ce96ddf..ddb046a 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/.settings/org.eclipse.jdt.core.prefs +++ b/plugins/com.minres.scviewer.database.ui.swt/.settings/org.eclipse.jdt.core.prefs @@ -98,4 +98,5 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/plugins/com.minres.scviewer.database.vcd/.settings/org.eclipse.jdt.core.prefs b/plugins/com.minres.scviewer.database.vcd/.settings/org.eclipse.jdt.core.prefs index 0c68a61..9f6ece8 100644 --- a/plugins/com.minres.scviewer.database.vcd/.settings/org.eclipse.jdt.core.prefs +++ b/plugins/com.minres.scviewer.database.vcd/.settings/org.eclipse.jdt.core.prefs @@ -4,4 +4,5 @@ org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/plugins/com.minres.scviewer.database/.settings/org.eclipse.jdt.core.prefs b/plugins/com.minres.scviewer.database/.settings/org.eclipse.jdt.core.prefs index 6e80039..4e4a3ad 100644 --- a/plugins/com.minres.scviewer.database/.settings/org.eclipse.jdt.core.prefs +++ b/plugins/com.minres.scviewer.database/.settings/org.eclipse.jdt.core.prefs @@ -5,4 +5,5 @@ org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/plugins/com.minres.scviewer.e4.application/.settings/org.eclipse.jdt.core.prefs b/plugins/com.minres.scviewer.e4.application/.settings/org.eclipse.jdt.core.prefs index a698e59..87b7a7a 100644 --- a/plugins/com.minres.scviewer.e4.application/.settings/org.eclipse.jdt.core.prefs +++ b/plugins/com.minres.scviewer.e4.application/.settings/org.eclipse.jdt.core.prefs @@ -9,4 +9,5 @@ org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/plugins/com.minres.scviewer.e4.application/.settings/org.eclipse.pde.core.prefs b/plugins/com.minres.scviewer.e4.application/.settings/org.eclipse.pde.core.prefs index f29e940..4b08937 100644 --- a/plugins/com.minres.scviewer.e4.application/.settings/org.eclipse.pde.core.prefs +++ b/plugins/com.minres.scviewer.e4.application/.settings/org.eclipse.pde.core.prefs @@ -1,3 +1,2 @@ eclipse.preferences.version=1 pluginProject.extensions=false -resolve.requirebundle=false diff --git a/plugins/com.minres.scviewer.e4.application/Application.e4xmi b/plugins/com.minres.scviewer.e4.application/Application.e4xmi index 0f5ec93..17cd779 100644 --- a/plugins/com.minres.scviewer.e4.application/Application.e4xmi +++ b/plugins/com.minres.scviewer.e4.application/Application.e4xmi @@ -3,34 +3,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - NoAutoCollapse - - + + + NoAutoCollapse + diff --git a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF index edabd54..8ee0898 100644 --- a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF @@ -28,7 +28,8 @@ Require-Bundle: javax.inject;bundle-version="1.0.0", com.opcoach.e4.preferences, org.eclipse.e4.core.di.extensions, org.eclipse.e4.ui.css.swt.theme;bundle-version="0.10.0", - org.eclipse.core.resources;bundle-version="3.13.0" + org.eclipse.core.resources;bundle-version="3.13.0", + javax.annotation;bundle-version="1.2.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: com.minres.scviewer.database, javax.inject;version="1.0.0" 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 808360b..2c214a7 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 @@ -123,7 +123,7 @@ public class RelationTypeToolControl extends PartListener implements ISelectionC return; } } - comboViewer.getCombo().setEnabled(false); + if(comboViewer!=null) comboViewer.getCombo().setEnabled(false); } /* (non-Javadoc) diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java index 9d6f034..11fd756 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java @@ -11,6 +11,7 @@ package com.minres.scviewer.e4.application.handlers; import java.io.File; +import java.util.ArrayList; import java.util.List; import org.eclipse.e4.core.contexts.IEclipseContext; @@ -39,12 +40,12 @@ public class OpenHandler { part.setLabel(files.get(0).getName()); MPartStack partStack = (MPartStack)modelService.find("org.eclipse.editorss", app); //$NON-NLS-1$ partStack.getChildren().add(part); - partService.showPart(part, PartState.ACTIVATE); + partService.showPart(part, PartState.CREATE); final IEclipseContext ctx=part.getContext(); - files.stream() - .map(x -> x.getAbsolutePath()) - .reduce((s1, s2) -> s1 + "," + s2) - .ifPresent(s -> ctx.modify("input", s)); //$NON-NLS-1$ + List inputs=new ArrayList<>(); + for(File f: files) + inputs.add(f.getAbsolutePath()); + ctx.modify("input", inputs); ctx.modify("config", ""); //$NON-NLS-1$ } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/ui/AbstractDesignBrowser.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/ui/AbstractDesignBrowser.java new file mode 100644 index 0000000..e40d6dc --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/ui/AbstractDesignBrowser.java @@ -0,0 +1,575 @@ +/******************************************************************************* + * Copyright (c) 2015 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.e4.application.internal.ui; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Named; + +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.core.di.annotations.Optional; +import org.eclipse.e4.core.services.events.IEventBroker; +import org.eclipse.e4.ui.di.Focus; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.services.EMenuService; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.e4.ui.workbench.modeling.ESelectionService; +import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.ITreePathContentProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TreePath; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; +import org.eclipse.wb.swt.ResourceManager; +import org.eclipse.wb.swt.SWTResourceManager; + +import com.minres.scviewer.database.HierNode; +import com.minres.scviewer.database.IHierNode; +import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.e4.application.Messages; +import com.minres.scviewer.e4.application.parts.LoadingWaveformDb; +import com.minres.scviewer.e4.application.provider.TxDbContentProvider; +import com.minres.scviewer.e4.application.provider.TxDbLabelProvider; + +/** + * The Class DesignBrowser. It contains the design tree, a list of Streams & signals and a few buttons to + * add them them to the waveform view + */ +public abstract class AbstractDesignBrowser { + + public TreeViewer getDbTreeViewer() { + return dbTreeViewer; + } + + public TableViewer getStreamTableViewer() { + return streamTableViewer; + } + + /** The Constant POPUP_ID. */ + private static final String POPUP_ID="com.minres.scviewer.e4.application.parts.DesignBrowser.popupmenu"; //$NON-NLS-1$ + + /** The event broker. */ + @Inject IEventBroker eventBroker; + + /** The selection service. */ + @Inject ESelectionService selectionService; + + /** The menu service. */ + @Inject EMenuService menuService; + + /** The eclipse ctx. */ + @Inject IEclipseContext eclipseCtx; + + /** The sash form. */ + private SashForm sashForm; + + /** The top. */ + Composite top; + + /** The bottom. */ + private Composite bottom; + + /** The tree viewer. */ + private TreeViewer dbTreeViewer; + + /** The name filter of the design browser tree. */ + private Text treeNameFilter; + + /** The attribute filter. */ + StreamTTreeFilter treeAttributeFilter; + + /** The name filter. */ + private Text tableNameFilter; + + /** The attribute filter. */ + StreamTableFilter tableAttributeFilter; + + /** The tx table viewer. */ + protected TableViewer streamTableViewer; + + /** The append all item. */ + protected ToolItem appendItem, insertItem; + + /** The other selection count. */ + int thisSelectionCount=0, otherSelectionCount=0; + + IWaveformDb waveformDb=null; + + /** The tree viewer pcl. */ + private PropertyChangeListener treeViewerPCL = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if("CHILDS".equals(evt.getPropertyName())){ //$NON-NLS-1$ + dbTreeViewer.getTree().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + dbTreeViewer.refresh(); + } + }); + } + } + }; + + /** The sash paint listener. */ + protected PaintListener sashPaintListener=new PaintListener() { + @Override + public void paintControl(PaintEvent e) { + int size=Math.min(e.width, e.height)-1; + e.gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY)); + e.gc.setFillRule(SWT.FILL_EVEN_ODD); + if(e.width>e.height) + e.gc.drawArc(e.x+(e.width-size)/2, e.y, size, size, 0, 360); + else + e.gc.drawArc(e.x, e.y+(e.height-size)/2, size, size, 0, 360); + } + }; + + + /** + * Creates the composite. + * + * @param parent the parent + */ + @PostConstruct + public void createComposite(Composite parent) { + sashForm = new SashForm(parent, SWT.BORDER | SWT.SMOOTH | SWT.VERTICAL); + + top = new Composite(sashForm, SWT.NONE); + createTreeViewerComposite(top); + bottom = new Composite(sashForm, SWT.NONE); + createTableComposite(bottom); + + sashForm.setWeights(new int[] {100, 100}); + sashForm.SASH_WIDTH=5; + top.addControlListener(new ControlAdapter() { + public void controlResized(ControlEvent e) { + sashForm.getChildren()[2].addPaintListener(sashPaintListener); + top.removeControlListener(this); + } + }); + } + + /** + * Creates the tree viewer composite. + * + * @param parent the parent + */ + public void createTreeViewerComposite(Composite parent) { + parent.setLayout(new GridLayout(1, false)); + + treeNameFilter = new Text(parent, SWT.BORDER); + treeNameFilter.setMessage(Messages.DesignBrowser_3); + treeNameFilter.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + treeAttributeFilter.setSearchText(((Text) e.widget).getText()); + dbTreeViewer.refresh(); + } + }); + treeNameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + treeAttributeFilter = new StreamTTreeFilter(); + + dbTreeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + dbTreeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); + dbTreeViewer.setContentProvider(new TxDbContentProvider()); + dbTreeViewer.setLabelProvider(new TxDbLabelProvider()); + dbTreeViewer.addFilter(treeAttributeFilter); + dbTreeViewer.setUseHashlookup(true); + dbTreeViewer.setAutoExpandLevel(2); + dbTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent event) { + ISelection selection=event.getSelection(); + if( selection instanceof IStructuredSelection) { + Object object= ((IStructuredSelection)selection).getFirstElement(); + if(object instanceof IHierNode && ((IHierNode)object).getChildNodes().size()!=0){ + streamTableViewer.setInput(object); + updateButtons(); + } + else { //if selection is changed but empty + streamTableViewer.setInput(null); + updateButtons(); + } + } + } + }); + } + + /** + * Creates the table composite. + * + * @param parent the parent + */ + public void createTableComposite(Composite parent) { + parent.setLayout(new GridLayout(1, false)); + + tableNameFilter = new Text(parent, SWT.BORDER); + tableNameFilter.setMessage(Messages.DesignBrowser_2); + tableNameFilter.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + tableAttributeFilter.setSearchText(((Text) e.widget).getText()); + updateButtons(); + streamTableViewer.refresh(); + } + }); + tableNameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + tableAttributeFilter = new StreamTableFilter(); + + streamTableViewer = new TableViewer(parent); + streamTableViewer.setContentProvider(new TxDbContentProvider(true)); + streamTableViewer.setLabelProvider(new TxDbLabelProvider()); + streamTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); + streamTableViewer.addFilter(tableAttributeFilter); + streamTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent event) { + selectionService.setSelection(event.getSelection()); + updateButtons(); + } + }); + menuService.registerContextMenu(streamTableViewer.getControl(), POPUP_ID); + + ToolBar toolBar = new ToolBar(parent, SWT.FLAT | SWT.RIGHT); + toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); + toolBar.setBounds(0, 0, 87, 20); + + appendItem = new ToolItem(toolBar, SWT.NONE); + appendItem.setToolTipText(Messages.DesignBrowser_4); + appendItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/append_wave.png")); //$NON-NLS-1$ //$NON-NLS-2$ + appendItem.setEnabled(false); + + 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.setEnabled(false); + } + + public IWaveformDb getWaveformDb() { + return waveformDb; + } + + @SuppressWarnings("unchecked") + public void setWaveformDb(IWaveformDb waveformDb) { + this.waveformDb = waveformDb; + Object input = dbTreeViewer.getInput(); + if(input!=null && input instanceof List){ + IWaveformDb db = ((List)input).get(0); + if(db==waveformDb) return; // do nothing if old and new database is the same + ((List)input).get(0).removePropertyChangeListener(treeViewerPCL); + } + dbTreeViewer.setInput(Arrays.asList(waveformDb.isLoaded()?new IWaveformDb[]{waveformDb}:new IWaveformDb[]{new LoadingWaveformDb()})); + // Set up the tree viewer + waveformDb.addPropertyChangeListener(treeViewerPCL); + } + + /** + * Sets the focus. + */ + @Focus + public void setFocus() { + if(streamTableViewer!=null) { + streamTableViewer.getTable().setFocus(); + IStructuredSelection selection = (IStructuredSelection)streamTableViewer.getSelection(); + if(selection.size()==0){ + appendItem.setEnabled(false); + } + selectionService.setSelection(selection); + thisSelectionCount=selection.toList().size(); + } + updateButtons(); + } + + /** + * reset tree viewer and tableviewer after every closed tab + */ + protected void resetTreeViewer() { + //reset tree- and tableviewer + dbTreeViewer.setInput(null); + streamTableViewer.setInput(null); + streamTableViewer.setSelection(null); + } + + public void selectAllWaveforms() { + int itemCount = streamTableViewer.getTable().getItemCount(); + ArrayList list = new ArrayList<>(); + for(int i=0; i filesToLoad = new ArrayList<>(); + String partConfig = ""; + /** The persisted state. */ Map persistedState; @@ -225,6 +244,10 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis /** The file checker. */ IModificationChecker fileChecker; + @Inject IWaveformDbFactory dbFactory; + + @Inject Composite parent; + private Boolean showHover; /** @@ -235,7 +258,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis * @param dbFactory the db factory */ @PostConstruct - public void createComposite(MPart part, Composite parent, IWaveformDbFactory dbFactory, @Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE) IEclipsePreferences prefs, @Preference(value = PreferenceConstants.SHOW_HOVER) Boolean hover) { + public void createComposite(MPart part, EMenuService menuService, @Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE) IEclipsePreferences prefs, @Preference(value = PreferenceConstants.SHOW_HOVER) Boolean hover) { disposeListenerNumber += 1; myPart = part; @@ -256,7 +279,20 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis } } }); - waveformPane = factory.createPanel(parent); + parent.setLayout(new FillLayout(SWT.HORIZONTAL)); + SashForm sashFormTop = new SashForm(parent, SWT.NONE); + + Composite left = new Composite(sashFormTop, SWT.NONE); + left.setLayout(new FillLayout(SWT.HORIZONTAL)); + + browser.createComposite(left); + browser.setWaveformDb(database); + + Composite right = new Composite(sashFormTop, SWT.NONE); + + waveformPane = factory.createPanel(right); + sashFormTop.setWeights(new int[] {25, 75}); + waveformPane.setMaxTime(0); setupColors(); //set selection to empty selection when opening a new waveformPane @@ -614,48 +650,21 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis */ @Inject @Optional - public void setPartInput(@Named("input") Object partInput, @Named("config") Object partConfig) { - if (partInput instanceof String) { - String name = (String)partInput; - filesToLoad = new ArrayList(); - boolean explicit = name.contains(","); - for(String tok: name.split(",")) { - File file = new File(tok); - if(file.isFile() && "CURRENT".equals(file.getName())){ - file=file.getParentFile(); - } - if (file.exists()) { - filesToLoad.add(file); - } - if(!explicit) - try { - String ext = getFileExtension(file.getName()); - if (Messages.WaveformViewer_19.equals(ext.toLowerCase())) { - if (askIfToLoad(new File(renameFileExtension(file.getCanonicalPath(), Messages.WaveformViewer_20)))) { - filesToLoad.add(new File(renameFileExtension(file.getCanonicalPath(), Messages.WaveformViewer_20))); - } else if (askIfToLoad(new File(renameFileExtension(file.getCanonicalPath(), Messages.WaveformViewer_21)))) { - filesToLoad.add(new File(renameFileExtension(file.getCanonicalPath(), Messages.WaveformViewer_21))); - } else if (askIfToLoad(new File(renameFileExtension(file.getCanonicalPath(), Messages.WaveformViewer_22)))) { - filesToLoad.add(new File(renameFileExtension(file.getCanonicalPath(), Messages.WaveformViewer_22))); - } - } else if (Messages.WaveformViewer_20.equals(ext.toLowerCase()) || - Messages.WaveformViewer_21.equals(ext.toLowerCase()) || - Messages.WaveformViewer_22.equals(ext.toLowerCase()) - ) { - if (askIfToLoad(new File(renameFileExtension(file.getCanonicalPath(), Messages.WaveformViewer_19)))) { - filesToLoad.add(new File(renameFileExtension(file.getCanonicalPath(), Messages.WaveformViewer_19))); - } - } - } catch (IOException e) { // silently ignore any error - } - - } - if (filesToLoad.size() > 0) - loadDatabase(persistedState); - if(partConfig instanceof String && ((String)partConfig).length()>0) { - loadState((String) partConfig); - } + public void setPartInput(@Named("input") List partInput, @Named("config") String partConfig) { + for(String s:partInput) { + File file = new File(s); + if(file.isFile() && "CURRENT".equals(file.getName())) + file=file.getParentFile(); + if (file.exists()) + filesToLoad.add(file); } + if(partConfig!=null) { + this.partConfig=partConfig; + } + if (filesToLoad.size() > 0) + loadDatabase(persistedState); + if(partConfig.length()>0) + loadState(partConfig); } /** @@ -663,7 +672,7 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis */ @Focus public void setFocus() { - waveformPane.getWaveformControl().setFocus(); + if(waveformPane!=null) waveformPane.getWaveformControl().setFocus(); } /** @@ -1108,7 +1117,10 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis * @return the selection */ public ISelection getSelection() { - return waveformPane.getSelection(); + if(waveformPane!=null) + return waveformPane.getSelection(); + else + return new StructuredSelection(); } /** @@ -1259,5 +1271,4 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis eventBroker.post(WaveStatusBarControl.MARKER_DIFF, null); } } - } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/com.minres.scviewer.ui/.settings/org.eclipse.jdt.core.prefs index a698e59..87b7a7a 100644 --- a/plugins/com.minres.scviewer.ui/.settings/org.eclipse.jdt.core.prefs +++ b/plugins/com.minres.scviewer.ui/.settings/org.eclipse.jdt.core.prefs @@ -9,4 +9,5 @@ org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/tests/com.minres.scviewer.database.test/.settings/org.eclipse.jdt.core.prefs b/tests/com.minres.scviewer.database.test/.settings/org.eclipse.jdt.core.prefs index 6e80039..4e4a3ad 100644 --- a/tests/com.minres.scviewer.database.test/.settings/org.eclipse.jdt.core.prefs +++ b/tests/com.minres.scviewer.database.test/.settings/org.eclipse.jdt.core.prefs @@ -5,4 +5,5 @@ org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 From 664e99d09e9a0d6e5b94fa615ac276b94f64cdcd Mon Sep 17 00:00:00 2001 From: eyck Date: Sat, 17 Oct 2020 12:44:33 +0200 Subject: [PATCH 2/3] re-organize layout and fix drawing errors --- .../ui/swt/internal/ArrowPainter.java | 19 +- .../database/ui/swt/internal/Projection.java | 8 +- .../ui/swt/internal/StreamPainter.java | 8 +- .../ui/swt/internal/WaveformCanvas.java | 26 +- .../ui/swt/internal/WaveformView.java | 82 +-- .../Application.e4xmi | 7 +- .../handlers/MoveWaveformHandler.java | 3 +- .../application/handlers/NavigateEvent.java | 3 +- .../e4/application/handlers/OpenHandler.java | 3 +- .../internal/ui/AbstractDesignBrowser.java | 575 ------------------ .../e4/application/parts/DesignBrowser.java | 25 +- .../application/parts/FileBrowserDialog.java | 14 +- .../application/parts/TransactionDetails.java | 4 +- .../e4/application/parts/WaveformViewer.java | 63 +- .../provider/TxDbLabelProvider.java | 6 - 15 files changed, 142 insertions(+), 704 deletions(-) delete mode 100644 plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/ui/AbstractDesignBrowser.java diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java index 966dc9f..813824b 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java @@ -126,24 +126,17 @@ public class ArrowPainter implements IPainter { Rectangle correctedTargetRectangle = new Rectangle(txRectangle.x+correctionValue, txRectangle.y, txRectangle.width, txRectangle.height); for (LinkEntry entry : iRect) { Rectangle correctedRectangle = new Rectangle(entry.rectangle.x+correctionValue, entry.rectangle.y, entry.rectangle.width, entry.rectangle.height); - Point target = drawPath(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor, + drawArrow(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor, correctedRectangle, correctedTargetRectangle); - drawArrow(proj, target); } for (LinkEntry entry : oRect) { Rectangle correctedRectangle = new Rectangle(entry.rectangle.x+correctionValue, entry.rectangle.y, entry.rectangle.width, entry.rectangle.height); - Point target = drawPath(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor, correctedTargetRectangle, + drawArrow(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor, correctedTargetRectangle, correctedRectangle); - drawArrow(proj, target); } } - protected void drawArrow(Projection proj, Point target) { - proj.drawLine(target.x - 8, target.y - 5, target.x, target.y); - proj.drawLine(target.x - 8, target.y + 5, target.x, target.y); - } - - protected Point drawPath(Projection proj, Color fgColor, Rectangle srcRectangle, Rectangle tgtRectangle) { + protected void drawArrow(Projection proj, Color fgColor, Rectangle srcRectangle, Rectangle tgtRectangle) { Point point1 = proj.project(new Point(srcRectangle.x, srcRectangle.y + srcRectangle.height / 2)); Point point2 = proj.project(new Point(tgtRectangle.x, tgtRectangle.y + tgtRectangle.height / 2)); @@ -160,11 +153,15 @@ public class ArrowPainter implements IPainter { path.cubicTo(center.x + xCtrlOffset, center.y, point2.x - xCtrlOffset, point2.y, point2.x, point2.y); } else path.cubicTo(point1.x + xCtrlOffset, point1.y, point2.x - xCtrlOffset, point2.y, point2.x, point2.y); + proj.setAntialias(SWT.ON); proj.setForeground(fgColor); proj.getGC().drawPath(path); path.dispose(); - return point2; + // now draw the arrow head + proj.getGC().drawLine(point2.x - 8, point2.y - 5, point2.x, point2.y); + proj.getGC().drawLine(point2.x - 8, point2.y + 5, point2.x, point2.y); + } class LinkEntry { diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/Projection.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/Projection.java index d13aaca..a85db0a 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/Projection.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/Projection.java @@ -44,10 +44,6 @@ public class Projection { public void setFillRule(int rule) { gc.setFillRule(rule); } - public void fillRectangle(Rectangle rect) { - gc.fillRectangle(rect.x+translation.x, rect.y+translation.y, rect.width, rect.height); - } - public void setLineStyle(int style) { gc.setLineStyle(style); } @@ -69,6 +65,10 @@ public class Projection { return gc; } + public void fillRectangle(Rectangle rect) { + gc.fillRectangle(rect.x+translation.x, rect.y+translation.y, rect.width, rect.height); + } + public void drawRectangle(Rectangle rect) { gc.drawRectangle(rect.x+translation.y, rect.y+translation.y, rect.width, rect.height); } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java index 289e1f8..a746fde 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java @@ -135,9 +135,6 @@ public class StreamPainter extends TrackPainter{ if(bb.x+bb.widtharea.x+area.width) return; if(bb.width==0){ proj.drawLine(bb.x, bb.y, bb.x, bb.y+bb.height); - } else if(bb.width<10){ - proj.fillRectangle(bb); - proj.drawRectangle(bb); } else { if(bb.x < area.x) { bb.width = bb.width-(area.x-bb.x)+5; @@ -149,8 +146,9 @@ public class StreamPainter extends TrackPainter{ bb_x2=area_x2+5; bb.width= bb_x2-bb.x; } - proj.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5); - proj.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5); + int arc = bb.width<10?1:5; + proj.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, arc, arc); + proj.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, arc, arc); } } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java index 1a105e9..7a3fef9 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java @@ -229,10 +229,10 @@ public class WaveformCanvas extends Canvas { } public void setZoomLevel(int level, long centerTime) { + //FIXME: keep center if zoom-out and cursor is not in view long oldScaleFactor=scaleFactor; if(level<0) level = 0; if(level0) { - origin.x=(int) -originX; // new cursor time offset relative to left border - }else { - origin.x=0; - } + long xc=centerTime/oldScaleFactor; // cursor total x-offset + long xoffs=xc+origin.x; // cursor offset relative to left border + long xcn=centerTime/scaleFactor; // new total x-offset + long originX=xcn-xoffs; + if(originX>0) { + origin.x=(int) -originX; // new cursor time offset relative to left border + }else { + origin.x=0; + } syncScrollBars(); arrowPainter.setTx(tx); redraw(); + this.level = level; } } @@ -400,12 +401,13 @@ public class WaveformCanvas extends Canvas { /* Paint function */ private void paint(GC gc) { + Point pt = getSize(); + if(pt.x==0 || pt.y==0) return; Rectangle clientRect = getClientArea(); /* Canvas' painting area */ GC thisGc = gc; Image d_backingImg = null; if(doubleBuffering) { - Point p = getSize(); - d_backingImg = new Image(getDisplay(), p.x, p.y); + d_backingImg = new Image(getDisplay(), pt.x, pt.y); thisGc = new GC(d_backingImg); thisGc.setBackground(gc.getBackground()); thisGc.setForeground(gc.getForeground()); 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 68882c2..08e8c76 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 @@ -52,7 +52,6 @@ import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; @@ -170,37 +169,11 @@ public class WaveformView implements IWaveformView { } }; - class WaveformMouseListener implements MouseMoveListener, MouseListener, PaintListener { + class WaveformMouseListener implements PaintListener, Listener { Point start, end; List initialSelected; boolean down=false; - @Override - public void mouseDoubleClick(MouseEvent e) { - } - - @Override - public void mouseDown(MouseEvent e) { - start=new Point(e.x, e.y); - end=new Point(e.x, e.y); - down=true; - if((e.stateMask&SWT.MODIFIER_MASK)!=0) return; //don't react on modifier - if (e.button == 1) { - initialSelected = waveformCanvas.getElementsAt(start); - } else if (e.button == 3) { - Menu topMenu= top.getMenu(); - if(topMenu!=null) topMenu.setVisible(true); - } - } - - @Override - public void mouseMove(MouseEvent e) { - if(down) { - end=new Point(e.x, e.y); - asyncUpdate(e.widget); - } - } - @Override public void paintControl(PaintEvent e) { if(down) { @@ -214,8 +187,7 @@ public class WaveformView implements IWaveformView { } } - @Override - public void mouseUp(MouseEvent e) { + private void mouseUp(MouseEvent e) { down=false; if(start==null) return; if((e.stateMask&SWT.MODIFIER_MASK&~SWT.SHIFT)!=0) return; //don't react on modifier except shift @@ -307,8 +279,43 @@ public class WaveformView implements IWaveformView { return time; } + @Override + public void handleEvent(Event e) { + switch (e.type) { + case SWT.MouseWheel: + break; + case SWT.MouseDown: + start=new Point(e.x, e.y); + end=new Point(e.x, e.y); + down=true; + if((e.stateMask&SWT.MODIFIER_MASK)!=0) return; //don't react on modifier + if (e.button == 1) { + initialSelected = waveformCanvas.getElementsAt(start); + } else if (e.button == 3) { + Menu topMenu= top.getMenu(); + if(topMenu!=null) topMenu.setVisible(true); + } + break; + case SWT.MouseUp: + mouseUp(new MouseEvent(e)); + break; + //case SWT.MouseDoubleClick: + //mouseDoubleClick(new MouseEvent(e)); + //break; + case SWT.MouseMove: + if(down) { + end=new Point(e.x, e.y); + asyncUpdate(e.widget); + } + break; + default: + break; + } + + } + }; - protected WaveformMouseListener waveformMouseListener = new WaveformMouseListener(); + protected WaveformMouseListener waveformMouseListener = new WaveformMouseListener(); public WaveformView(Composite parent) { pcs=new PropertyChangeSupport(this); @@ -322,7 +329,7 @@ public class WaveformView implements IWaveformView { streams = new ObservableList<>(); streams.addPropertyChangeListener("content", this); - top = new Composite(parent, SWT.NONE); + top = parent; top.setLayout(new FillLayout(SWT.HORIZONTAL)); SashForm topSash = new SashForm(top, SWT.SMOOTH); @@ -407,9 +414,12 @@ public class WaveformView implements IWaveformView { valueListScrolled.setContent(valueList); waveformCanvas.setMaxTime(1); - waveformCanvas.addMouseListener(waveformMouseListener); - waveformCanvas.addMouseMoveListener(waveformMouseListener); - waveformCanvas.addPaintListener(waveformMouseListener); + waveformCanvas.addPaintListener(waveformMouseListener); + waveformCanvas.addListener(SWT.MouseDown,waveformMouseListener); + waveformCanvas.addListener(SWT.MouseUp,waveformMouseListener); + //waveformCanvas.addListener(SWT.MouseDoubleClick,waveformMouseListener); + waveformCanvas.addListener(SWT.MouseMove,waveformMouseListener); + waveformCanvas.addListener(SWT.MouseWheel, waveformMouseListener); nameListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { @@ -895,7 +905,7 @@ public class WaveformView implements IWaveformView { @Override public void moveCursor(GotoDirection direction) { if(currentWaveformSelection.size()!=1) return; - TrackEntry sel = currentWaveformSelection.get(1); + TrackEntry sel = currentWaveformSelection.get(0); long time = getCursorTime(); NavigableMap map=null; if(sel.isStream()){ diff --git a/plugins/com.minres.scviewer.e4.application/Application.e4xmi b/plugins/com.minres.scviewer.e4.application/Application.e4xmi index 17cd779..81fadd5 100644 --- a/plugins/com.minres.scviewer.e4.application/Application.e4xmi +++ b/plugins/com.minres.scviewer.e4.application/Application.e4xmi @@ -3,11 +3,8 @@ - - - NoAutoCollapse - - + + NoAutoCollapse diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/MoveWaveformHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/MoveWaveformHandler.java index 79bf117..3b5fcce 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/MoveWaveformHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/MoveWaveformHandler.java @@ -22,6 +22,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.IWaveform; +import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.e4.application.parts.WaveformViewer; public class MoveWaveformHandler { @@ -33,7 +34,7 @@ public class MoveWaveformHandler { Object sel = selectionService.getSelection(); if( sel instanceof IStructuredSelection) { Object o= ((IStructuredSelection)sel).getFirstElement(); - return o instanceof IWaveform || o instanceof ITx; + return o instanceof IWaveform || o instanceof ITx | o instanceof TrackEntry; } return false; } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateEvent.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateEvent.java index 2144313..971d409 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateEvent.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/NavigateEvent.java @@ -23,6 +23,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.ui.GotoDirection; +import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.e4.application.parts.WaveformViewer; public class NavigateEvent { @@ -34,7 +35,7 @@ public class NavigateEvent { Object sel = selectionService.getSelection(); if( sel instanceof IStructuredSelection) { Object o= ((IStructuredSelection)sel).getFirstElement(); - return o instanceof IWaveform || o instanceof ITx; + return o instanceof IWaveform || o instanceof ITx || o instanceof TrackEntry; } return false; } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java index 11fd756..2fc5a9b 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/OpenHandler.java @@ -46,7 +46,8 @@ public class OpenHandler { for(File f: files) inputs.add(f.getAbsolutePath()); ctx.modify("input", inputs); - ctx.modify("config", ""); //$NON-NLS-1$ + ctx.modify("config", ""); //$NON-NLS-1$ + partStack.setSelectedElement(part); } } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/ui/AbstractDesignBrowser.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/ui/AbstractDesignBrowser.java deleted file mode 100644 index e40d6dc..0000000 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/ui/AbstractDesignBrowser.java +++ /dev/null @@ -1,575 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 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.e4.application.internal.ui; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; - -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import javax.inject.Named; - -import org.eclipse.e4.core.contexts.IEclipseContext; -import org.eclipse.e4.core.di.annotations.Optional; -import org.eclipse.e4.core.services.events.IEventBroker; -import org.eclipse.e4.ui.di.Focus; -import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.e4.ui.services.EMenuService; -import org.eclipse.e4.ui.services.IServiceConstants; -import org.eclipse.e4.ui.workbench.modeling.EPartService; -import org.eclipse.e4.ui.workbench.modeling.ESelectionService; -import org.eclipse.jface.viewers.IContentProvider; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.ITreePathContentProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.TreePath; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerFilter; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.SashForm; -import org.eclipse.swt.events.ControlAdapter; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Text; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; -import org.eclipse.wb.swt.ResourceManager; -import org.eclipse.wb.swt.SWTResourceManager; - -import com.minres.scviewer.database.HierNode; -import com.minres.scviewer.database.IHierNode; -import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.IWaveform; -import com.minres.scviewer.database.IWaveformDb; -import com.minres.scviewer.e4.application.Messages; -import com.minres.scviewer.e4.application.parts.LoadingWaveformDb; -import com.minres.scviewer.e4.application.provider.TxDbContentProvider; -import com.minres.scviewer.e4.application.provider.TxDbLabelProvider; - -/** - * The Class DesignBrowser. It contains the design tree, a list of Streams & signals and a few buttons to - * add them them to the waveform view - */ -public abstract class AbstractDesignBrowser { - - public TreeViewer getDbTreeViewer() { - return dbTreeViewer; - } - - public TableViewer getStreamTableViewer() { - return streamTableViewer; - } - - /** The Constant POPUP_ID. */ - private static final String POPUP_ID="com.minres.scviewer.e4.application.parts.DesignBrowser.popupmenu"; //$NON-NLS-1$ - - /** The event broker. */ - @Inject IEventBroker eventBroker; - - /** The selection service. */ - @Inject ESelectionService selectionService; - - /** The menu service. */ - @Inject EMenuService menuService; - - /** The eclipse ctx. */ - @Inject IEclipseContext eclipseCtx; - - /** The sash form. */ - private SashForm sashForm; - - /** The top. */ - Composite top; - - /** The bottom. */ - private Composite bottom; - - /** The tree viewer. */ - private TreeViewer dbTreeViewer; - - /** The name filter of the design browser tree. */ - private Text treeNameFilter; - - /** The attribute filter. */ - StreamTTreeFilter treeAttributeFilter; - - /** The name filter. */ - private Text tableNameFilter; - - /** The attribute filter. */ - StreamTableFilter tableAttributeFilter; - - /** The tx table viewer. */ - protected TableViewer streamTableViewer; - - /** The append all item. */ - protected ToolItem appendItem, insertItem; - - /** The other selection count. */ - int thisSelectionCount=0, otherSelectionCount=0; - - IWaveformDb waveformDb=null; - - /** The tree viewer pcl. */ - private PropertyChangeListener treeViewerPCL = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if("CHILDS".equals(evt.getPropertyName())){ //$NON-NLS-1$ - dbTreeViewer.getTree().getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - dbTreeViewer.refresh(); - } - }); - } - } - }; - - /** The sash paint listener. */ - protected PaintListener sashPaintListener=new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - int size=Math.min(e.width, e.height)-1; - e.gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY)); - e.gc.setFillRule(SWT.FILL_EVEN_ODD); - if(e.width>e.height) - e.gc.drawArc(e.x+(e.width-size)/2, e.y, size, size, 0, 360); - else - e.gc.drawArc(e.x, e.y+(e.height-size)/2, size, size, 0, 360); - } - }; - - - /** - * Creates the composite. - * - * @param parent the parent - */ - @PostConstruct - public void createComposite(Composite parent) { - sashForm = new SashForm(parent, SWT.BORDER | SWT.SMOOTH | SWT.VERTICAL); - - top = new Composite(sashForm, SWT.NONE); - createTreeViewerComposite(top); - bottom = new Composite(sashForm, SWT.NONE); - createTableComposite(bottom); - - sashForm.setWeights(new int[] {100, 100}); - sashForm.SASH_WIDTH=5; - top.addControlListener(new ControlAdapter() { - public void controlResized(ControlEvent e) { - sashForm.getChildren()[2].addPaintListener(sashPaintListener); - top.removeControlListener(this); - } - }); - } - - /** - * Creates the tree viewer composite. - * - * @param parent the parent - */ - public void createTreeViewerComposite(Composite parent) { - parent.setLayout(new GridLayout(1, false)); - - treeNameFilter = new Text(parent, SWT.BORDER); - treeNameFilter.setMessage(Messages.DesignBrowser_3); - treeNameFilter.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - treeAttributeFilter.setSearchText(((Text) e.widget).getText()); - dbTreeViewer.refresh(); - } - }); - treeNameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - treeAttributeFilter = new StreamTTreeFilter(); - - dbTreeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); - dbTreeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); - dbTreeViewer.setContentProvider(new TxDbContentProvider()); - dbTreeViewer.setLabelProvider(new TxDbLabelProvider()); - dbTreeViewer.addFilter(treeAttributeFilter); - dbTreeViewer.setUseHashlookup(true); - dbTreeViewer.setAutoExpandLevel(2); - dbTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { - - @Override - public void selectionChanged(SelectionChangedEvent event) { - ISelection selection=event.getSelection(); - if( selection instanceof IStructuredSelection) { - Object object= ((IStructuredSelection)selection).getFirstElement(); - if(object instanceof IHierNode && ((IHierNode)object).getChildNodes().size()!=0){ - streamTableViewer.setInput(object); - updateButtons(); - } - else { //if selection is changed but empty - streamTableViewer.setInput(null); - updateButtons(); - } - } - } - }); - } - - /** - * Creates the table composite. - * - * @param parent the parent - */ - public void createTableComposite(Composite parent) { - parent.setLayout(new GridLayout(1, false)); - - tableNameFilter = new Text(parent, SWT.BORDER); - tableNameFilter.setMessage(Messages.DesignBrowser_2); - tableNameFilter.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - tableAttributeFilter.setSearchText(((Text) e.widget).getText()); - updateButtons(); - streamTableViewer.refresh(); - } - }); - tableNameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - tableAttributeFilter = new StreamTableFilter(); - - streamTableViewer = new TableViewer(parent); - streamTableViewer.setContentProvider(new TxDbContentProvider(true)); - streamTableViewer.setLabelProvider(new TxDbLabelProvider()); - streamTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); - streamTableViewer.addFilter(tableAttributeFilter); - streamTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { - - @Override - public void selectionChanged(SelectionChangedEvent event) { - selectionService.setSelection(event.getSelection()); - updateButtons(); - } - }); - menuService.registerContextMenu(streamTableViewer.getControl(), POPUP_ID); - - ToolBar toolBar = new ToolBar(parent, SWT.FLAT | SWT.RIGHT); - toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); - toolBar.setBounds(0, 0, 87, 20); - - appendItem = new ToolItem(toolBar, SWT.NONE); - appendItem.setToolTipText(Messages.DesignBrowser_4); - appendItem.setImage(ResourceManager.getPluginImage("com.minres.scviewer.e4.application", "icons/append_wave.png")); //$NON-NLS-1$ //$NON-NLS-2$ - appendItem.setEnabled(false); - - 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.setEnabled(false); - } - - public IWaveformDb getWaveformDb() { - return waveformDb; - } - - @SuppressWarnings("unchecked") - public void setWaveformDb(IWaveformDb waveformDb) { - this.waveformDb = waveformDb; - Object input = dbTreeViewer.getInput(); - if(input!=null && input instanceof List){ - IWaveformDb db = ((List)input).get(0); - if(db==waveformDb) return; // do nothing if old and new database is the same - ((List)input).get(0).removePropertyChangeListener(treeViewerPCL); - } - dbTreeViewer.setInput(Arrays.asList(waveformDb.isLoaded()?new IWaveformDb[]{waveformDb}:new IWaveformDb[]{new LoadingWaveformDb()})); - // Set up the tree viewer - waveformDb.addPropertyChangeListener(treeViewerPCL); - } - - /** - * Sets the focus. - */ - @Focus - public void setFocus() { - if(streamTableViewer!=null) { - streamTableViewer.getTable().setFocus(); - IStructuredSelection selection = (IStructuredSelection)streamTableViewer.getSelection(); - if(selection.size()==0){ - appendItem.setEnabled(false); - } - selectionService.setSelection(selection); - thisSelectionCount=selection.toList().size(); - } - updateButtons(); - } - - /** - * reset tree viewer and tableviewer after every closed tab - */ - protected void resetTreeViewer() { - //reset tree- and tableviewer - dbTreeViewer.setInput(null); - streamTableViewer.setInput(null); - streamTableViewer.setSelection(null); - } - - public void selectAllWaveforms() { - int itemCount = streamTableViewer.getTable().getItemCount(); - ArrayList list = new ArrayList<>(); - for(int i=0; i listeners; - private Image file; - - private Image dir; - public FileTreeLabelProvider() { listeners = new ArrayList(); } public Image getImage(Object arg0) { - return ((File) arg0).isDirectory() ? folderImage : file; + return ((File) arg0).isDirectory() ? folderImage : fileImage; } public String getText(Object arg0) { @@ -402,16 +398,12 @@ public class FileBrowserDialog extends TrayDialog { listeners.add(arg0); } + @Override public void dispose() { - // Dispose the images - if (dir != null) - dir.dispose(); - if (file != null) - file.dispose(); } public boolean isLabelProperty(Object arg0, String arg1) { - return false; + return true; } public void removeListener(ILabelProviderListener arg0) { diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java index f79fd36..6d4cc71 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java @@ -120,7 +120,9 @@ public class TransactionDetails { * @param parent the parent */ @PostConstruct - public void createComposite(final Composite parent) { + public void createComposite(final Composite parent, @Optional WaveformViewer waveformViewerPart) { + this.waveformViewerPart=waveformViewerPart; + parent.setLayout(new GridLayout(1, false)); nameFilter = new Text(parent, SWT.BORDER); 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 d0375d1..6282533 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 @@ -41,6 +41,8 @@ import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; +import org.eclipse.e4.core.contexts.ContextInjectionFactory; +import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.di.extensions.Preference; import org.eclipse.e4.core.services.events.IEventBroker; @@ -60,6 +62,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.FocusListener; @@ -69,6 +72,7 @@ import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; @@ -96,20 +100,17 @@ import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.TrackEntry.ValueDisplay; import com.minres.scviewer.database.ui.TrackEntry.WaveDisplay; +import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.database.ui.swt.Constants; import com.minres.scviewer.database.ui.swt.ToolTipContentProvider; import com.minres.scviewer.database.ui.swt.ToolTipHelpTextProvider; import com.minres.scviewer.database.ui.swt.WaveformViewFactory; -import com.minres.scviewer.database.ui.WaveformColors; import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.internal.status.WaveStatusBarControl; -import com.minres.scviewer.e4.application.internal.ui.AbstractDesignBrowser; import com.minres.scviewer.e4.application.internal.util.FileMonitor; import com.minres.scviewer.e4.application.internal.util.IFileChangeListener; import com.minres.scviewer.e4.application.internal.util.IModificationChecker; import com.minres.scviewer.e4.application.preferences.PreferenceConstants; -import org.eclipse.swt.custom.SashForm; -import org.eclipse.swt.layout.FillLayout; /** * The Class WaveformViewerPart. @@ -169,20 +170,10 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis /** The factory. */ WaveformViewFactory factory = new WaveformViewFactory(); - AbstractDesignBrowser browser = new AbstractDesignBrowser() { - - @Override - protected void updateButtons() { - // TODO Auto-generated method stub - - } - - @Override - protected void initializeButtonListeners() { - // TODO Auto-generated method stub - - } - }; + DesignBrowser browser = null; + + TransactionDetails detailsView = null; + /** The waveform pane. */ private IWaveformView waveformPane; @@ -280,19 +271,31 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis } }); parent.setLayout(new FillLayout(SWT.HORIZONTAL)); - SashForm sashFormTop = new SashForm(parent, SWT.NONE); - + SashForm sashFormTop = new SashForm(parent, SWT.BORDER | SWT.SMOOTH); + Composite left = new Composite(sashFormTop, SWT.NONE); - left.setLayout(new FillLayout(SWT.HORIZONTAL)); - browser.createComposite(left); - browser.setWaveformDb(database); + IEclipseContext ctx = myPart.getContext(); + ctx.set(WaveformViewer.class, this); + ctx.set(IWaveformDb.class, database); + ctx.set(Composite.class, left); + + browser = ContextInjectionFactory.make(DesignBrowser.class, ctx); - Composite right = new Composite(sashFormTop, SWT.NONE); - - waveformPane = factory.createPanel(right); + //Composite right = new Composite(sashFormTop, SWT.NONE); + SashForm sashFormRight = new SashForm(sashFormTop, SWT.BORDER | SWT.SMOOTH | SWT.VERTICAL); sashFormTop.setWeights(new int[] {25, 75}); + + Composite rightTop = new Composite(sashFormRight, SWT.NONE); + Composite rightBottom = new Composite(sashFormRight, SWT.NONE); + sashFormRight.setWeights(new int[] {80, 20}); + waveformPane = factory.createPanel(rightTop); + + ctx.set(Composite.class, rightBottom); + detailsView = ContextInjectionFactory.make(TransactionDetails.class, ctx); + + waveformPane.setMaxTime(0); setupColors(); //set selection to empty selection when opening a new waveformPane @@ -765,10 +768,10 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis // get selected transaction of a stream ISelection selection = waveformPane.getSelection(); if (!selection.isEmpty()) { - List t = getISelection(selection); - if(t.get(0) instanceof ITx) { - ITx tx = (ITx) t.get(0); - TrackEntry te = (TrackEntry) t.get(1); + List sel = getISelection(selection); + if(sel.size()>1 && sel.get(0) instanceof ITx && sel.get(1) instanceof TrackEntry) { + ITx tx = (ITx) sel.get(0); + TrackEntry te = (TrackEntry) sel.get(1); // get transaction id persistedState.put(SELECTED_TX_ID, Long.toString(tx.getId())); //get TrackEntry name diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbLabelProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbLabelProvider.java index 343ee7e..9a9164f 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbLabelProvider.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/provider/TxDbLabelProvider.java @@ -63,12 +63,6 @@ public class TxDbLabelProvider implements ILabelProvider { */ @Override public void dispose() { - if(loadinDatabase!=null) database.dispose(); - if(database!=null) database.dispose(); - if(stream!=null) stream.dispose(); - if(folder!=null) folder.dispose(); - if(signal!=null) signal.dispose(); - if(wave!=null) wave.dispose(); } /* (non-Javadoc) From bd24c4dd05fd442137fdc823fd7d5636995b6668 Mon Sep 17 00:00:00 2001 From: eyck Date: Sat, 17 Oct 2020 12:44:55 +0200 Subject: [PATCH 3/3] update JDT/Groovy settings --- plugins/com.minres.scviewer.database.text/.classpath | 1 - .../.settings/org.eclipse.jdt.groovy.core.prefs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/com.minres.scviewer.database.text/.classpath b/plugins/com.minres.scviewer.database.text/.classpath index 564bae4..289f0a4 100644 --- a/plugins/com.minres.scviewer.database.text/.classpath +++ b/plugins/com.minres.scviewer.database.text/.classpath @@ -18,6 +18,5 @@ - diff --git a/plugins/com.minres.scviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs b/plugins/com.minres.scviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs index 1e68ed6..71b5e37 100644 --- a/plugins/com.minres.scviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs +++ b/plugins/com.minres.scviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs @@ -1,3 +1,3 @@ eclipse.preferences.version=1 -groovy.compiler.level=25 +groovy.compiler.level=-1 groovy.script.filters=**/*.dsld,y,**/*.gradle,n