From 1d1e1a2f2d2765510201e4c841d021b3e0be46ad Mon Sep 17 00:00:00 2001 From: Sky French Date: Tue, 7 Aug 2018 12:43:52 +0100 Subject: [PATCH 01/27] WIP: replacing PV selection Combo with MultiSelectCombo to allow the selection of multiple PVs in waveform plot; beginnings of modifications to WaveformView to handle multiple PV traces --- .../multiselectcombo/MultiSelectCombo.java | 155 ++++++++++++++++++ .../waveformview/WaveformView.java | 126 ++++++++------ 2 files changed, 235 insertions(+), 46 deletions(-) create mode 100644 applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java new file mode 100644 index 00000000000..8aea7fb1928 --- /dev/null +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java @@ -0,0 +1,155 @@ +package org.csstudio.trends.databrowser2.multiselectcombo; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.events.ShellAdapter; +import org.eclipse.swt.events.ShellEvent; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; + + +/** An implementation of a Combo box with multi-select capabilities + * + */ + +public class MultiSelectCombo extends Composite { + + Shell selectionShell; + Text selectionSummary; + String[] allItems; + List selectedIndices; + + private Button[] itemButtons; + private SelectionAdapter selectionAdapter; + + public MultiSelectCombo(Composite parent, String[] items, int style) { + super(parent, style); + + allItems = items; + + setLayout(new GridLayout()); + + selectedIndices = new ArrayList(); + + selectionSummary = new Text(this, SWT.READ_ONLY); + selectionSummary.setText("Select Item(s) for Waveform inspection ..."); + selectionSummary.addMouseListener(new MouseAdapter() { + @Override + public void mouseDown(MouseEvent event) { + super.mouseDown(event); + showSelectionShell(); + } + + }); + + } + + public void setItems(String[] names) { + + allItems = names; + //showSelectionShell(); + + /* + final int numItems = names.length; + itemButtons = new Button[numItems]; + for (int i = 0; i < numItems; i++) { + Button button = new Button(selectionShell, SWT.CHECK); + button.setText(names[i]); + if (selectedIndices.contains(i)) + button.setSelection(true); + button.pack(); + itemButtons[i] = button; + + } + */ + //selectionList = new List(selectionShell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); + //for (String item : allItems) + // selectionList.add(item); + //selectionList.setSelection(selectedIndices); + //.setLayoutData(new GridData(GridData.FILL_BOTH)) + + } + + private void showSelectionShell() { + + Point p = selectionSummary.getParent().toDisplay(selectionSummary.getLocation()); + Point size = selectionSummary.getSize(); + Rectangle shellRect = new Rectangle(p.x, p.y + size.y, size.x, 0); + + final int numItems = allItems.length; + + selectionShell = new Shell(Display.getDefault(), SWT.NO_TRIM); + selectionShell.setLayout(new GridLayout()); + this.setLayoutData(new GridData()); + selectionShell.setSize(shellRect.width, 30*numItems); + selectionShell.setLocation(shellRect.x, shellRect.y); + + itemButtons = new Button[numItems]; + for (int i = 0; i < numItems; i++) { + Button button = new Button(selectionShell, SWT.CHECK); + button.setText(allItems[i]); + if (selectedIndices.contains(i)) + button.setSelection(true); + button.pack(); + itemButtons[i] = button; + itemButtons[i].addSelectionListener(selectionAdapter); + } + //selectionList = new List(selectionShell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); + //for (String item : allItems) + // selectionList.add(item); + //selectionList.setSelection(selectedIndices); + //.setLayoutData(new GridData(GridData.FILL_BOTH)) + + selectionShell.open(); + + + + selectionShell.addShellListener(new ShellAdapter() { + public void shellDeactivated(ShellEvent event) { + if (selectionShell != null && !selectionShell.isDisposed()) { + selectedIndices.clear(); + for (int i = 0; i < numItems; i++) { + if (itemButtons[i].getSelection()) + selectedIndices.add(i); + } + //selectedIndices = selectionList.getSelectionIndices(); + selectionShell.dispose(); + } + } + + }); + + } + + public List getSelectedIndices() { + selectedIndices.clear(); + for (int i = 0; i < itemButtons.length; i++) { + if (itemButtons[i].getSelection()) + selectedIndices.add(i); + } + return selectedIndices; + } + + public void addSelectionListener(SelectionAdapter selAdapter) { + selectionAdapter = selAdapter; + } + + +} diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index f2a03471caf..8a6acfd24fa 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -32,6 +32,7 @@ import org.csstudio.trends.databrowser2.model.ModelItem; import org.csstudio.trends.databrowser2.model.ModelListener; import org.csstudio.trends.databrowser2.model.ModelListenerAdapter; +import org.csstudio.trends.databrowser2.multiselectcombo.MultiSelectCombo; import org.csstudio.trends.databrowser2.model.PlotSample; import org.csstudio.trends.databrowser2.model.PlotSamples; import org.diirt.vtype.VNumberArray; @@ -43,10 +44,17 @@ import org.eclipse.jface.action.Separator; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.MouseTrackListener; +import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -77,7 +85,7 @@ public class WaveformView extends DataBrowserAwareView final public static String ANNOTATION_TEXT = "Waveform view"; /** PV Name selector */ - private Combo pv_name; + private MultiSelectCombo pv_select; /** Plot */ private RTValuePlot plot; @@ -186,25 +194,30 @@ protected void doCreatePartControl(final Composite parent) l.setText(Messages.SampleView_Item); l.setLayoutData(new GridData()); - pv_name = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY); - pv_name.setLayoutData(new GridData(SWT.FILL, 0, true, false, layout.numColumns-2, 1)); - pv_name.addSelectionListener(new SelectionListener() - { - @Override - public void widgetSelected(final SelectionEvent e) + final List names_list = new ArrayList<>(); + if (model != null) { + for (ModelItem item : model.getItems()) + names_list.add(item.getName()); + } + final String[] names = names_list.toArray(new String[names_list.size()]); + + pv_select = new MultiSelectCombo(parent, names, SWT.READ_ONLY); + pv_select.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); + ((GridData)pv_select.getLayoutData()).widthHint = 300; + pv_select.addSelectionListener (new SelectionAdapter() { + //@Override + public void widgetSelected(SelectionEvent event) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(final SelectionEvent e) - { // First item is "--select PV name--" - if (pv_name.getSelectionIndex() == 0) - selectPV(null); - else - selectPV(model.getItem(pv_name.getText())); - } - }); + final List curr_names_list = new ArrayList<>(); + if (model != null) { + for (ModelItem item : model.getItems()) + curr_names_list.add(item.getName()); + } + final String[] curr_names = curr_names_list.toArray(new String[curr_names_list.size()]); + List modelItems = getModelItems(curr_names); + selectPV(modelItems); + }} + ); final Button refresh = new Button(parent, SWT.PUSH); refresh.setText(Messages.SampleView_Refresh); @@ -215,10 +228,8 @@ public void widgetDefaultSelected(final SelectionEvent e) @Override public void widgetSelected(final SelectionEvent e) { // First item is "--select PV name--" - if (pv_name.getSelectionIndex() == 0) - selectPV(null); - else - selectPV(model.getItem(pv_name.getText())); + List modelItems = getModelItems(names); + selectPV(modelItems); } }); @@ -275,12 +286,32 @@ public void menuAboutToShow(IMenuManager manager) { }); } + + /** Return List of selected ModelItems + * by finding Model Items from checked items in PV list + * @param names list of all PV names available in list + * @returns List of ModelItems + */ + private List getModelItems(final String [] names) + { + List modelItems = new ArrayList(); + List selectedIndices = pv_select.getSelectedIndices(); + if (selectedIndices.size() == 0) + modelItems = null; + else { + for(int n=0; n { - if (pv_name.isDisposed()) + if (pv_select.isDisposed()) { return; } if (model == null) { // Clear/disable GUI - pv_name.setItems(new String[] { Messages.SampleView_NoPlot}); - pv_name.select(0); - pv_name.setEnabled(false); + pv_select.setItems(new String[] {}); + pv_select.setEnabled(false); selectPV(null); return; } // Show PV names final List names_list = new ArrayList<>(); - names_list.add(Messages.SampleView_SelectItem); for (ModelItem item : model.getItems()) names_list.add(item.getName()); final String[] names = names_list.toArray(new String[names_list.size()]); // Is the previously selected item still valid? - final int selected = pv_name.getSelectionIndex(); - if (!model_changed && selected > 0 && model_item != null && pv_name.getText().equals(model_item.getName())) + final int selected = 1;//pv_name.getSelectionIndex(); + if (!model_changed && selected > 0 && model_item != null) // && pv_name.getText().equals(model_item.getName())) { // Show same PV name again in combo box - pv_name.setItems(names); - pv_name.select(selected); - pv_name.setEnabled(true); + pv_select.setItems(names); + //pv_name.select(selected); + pv_select.setEnabled(true); return; } // Previously selected item no longer valid. // Show new items, clear rest - pv_name.setItems(names); - pv_name.select(0); - pv_name.setEnabled(true); + pv_select.setItems(names); + //.select(0); + pv_select.setEnabled(true); selectPV(null); }); } /** Select given PV item (or null). */ - private void selectPV(final ModelItem new_item) + private void selectPV(final List new_item) { - model_item = new_item; + //model_item = new_item; // Delete all existing traces for (Trace trace : plot.getTraces()) plot.removeTrace(trace); // No or unknown PV name? - if (model_item == null) - { - pv_name.setText(""); - sample_index.setEnabled(false); - removeAnnotation(); + if (new_item == null) return; - } + + model_item = new_item.get(0); + //if (model_item == null) + //{ + //pv_name.setText(""); + // sample_index.setEnabled(false); + // removeAnnotation(); + // return; + //} // Prepare to show waveforms of model item in plot waveform = new WaveformValueDataProvider(); // Create trace for waveform - plot.addTrace(model_item.getResolvedDisplayName(), model_item.getUnits(), waveform, model_item.getColor(), TraceType.NONE, 1, PointType.CIRCLES, 5, 0); + for(int n=0; n Date: Tue, 7 Aug 2018 14:32:02 +0100 Subject: [PATCH 02/27] WIP: further modifications to allow multiple wave form traces - annotation and slider handling; needs tidy --- .../waveformview/WaveformView.java | 195 ++++++++++-------- 1 file changed, 108 insertions(+), 87 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 8a6acfd24fa..0b63b6c4c2c 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -84,13 +84,13 @@ public class WaveformView extends DataBrowserAwareView /** Text used for the annotation that indicates waveform sample */ final public static String ANNOTATION_TEXT = "Waveform view"; - /** PV Name selector */ + /** PV Name(s) selector */ private MultiSelectCombo pv_select; /** Plot */ private RTValuePlot plot; - /** Selector for model_item's current sample */ + /** Selector for first model_item's current sample */ private Slider sample_index; /** Timestamp of current sample. */ @@ -103,7 +103,7 @@ public class WaveformView extends DataBrowserAwareView private Model model; /** Annotation in plot that indicates waveform sample */ - private AnnotationInfo waveform_annotation; + private List waveform_annotations; private boolean changing_annotations = false; @@ -123,9 +123,9 @@ public void itemAdded(final ModelItem item) @Override public void itemRemoved(final ModelItem item) { - if (item == model_item) { - model_item = null; - } + //if (item == model_item) { + // model_item = null; + //} update(false); } @@ -154,16 +154,16 @@ public void changedAnnotations() public void changedTimerange() { // Update selected sample to assert that it's one of the visible ones. - if (model_item != null) + if (model_items != null) showSelectedSample(); } }; /** Selected model item in model, or null */ - private ModelItem model_item = null; + private List model_items = null; /** Waveform for the currently selected sample */ - private WaveformValueDataProvider waveform = null; + private List waveforms = null; /** {@inheritDoc} */ @Override @@ -361,14 +361,14 @@ private void update(final boolean model_changed) // Is the previously selected item still valid? final int selected = 1;//pv_name.getSelectionIndex(); - if (!model_changed && selected > 0 && model_item != null) // && pv_name.getText().equals(model_item.getName())) - { + //if (!model_changed && selected > 0 && model_item != null) // && pv_name.getText().equals(model_item.getName())) + // { // Show same PV name again in combo box - pv_select.setItems(names); + // pv_select.setItems(names); //pv_name.select(selected); - pv_select.setEnabled(true); - return; - } + // pv_select.setEnabled(true); + // return; + //} // Previously selected item no longer valid. // Show new items, clear rest pv_select.setItems(names); @@ -391,22 +391,24 @@ private void selectPV(final List new_item) if (new_item == null) return; - model_item = new_item.get(0); - //if (model_item == null) - //{ - //pv_name.setText(""); - // sample_index.setEnabled(false); - // removeAnnotation(); - // return; - //} + model_items = new_item; + + if (model_items == null) + { + sample_index.setEnabled(false); + removeAnnotation(); + return; + } // Prepare to show waveforms of model item in plot - waveform = new WaveformValueDataProvider(); // Create trace for waveform - for(int n=0; n(); + for(int n=0; n new_item) /** Show the current sample of the current model item. */ private void showSelectedSample() { - // Get selected sample (= one waveform) - final PlotSamples samples = model_item.getSamples(); + final int numItems = model_items.size(); + final int idx = sample_index.getSelection(); - final PlotSample sample; - samples.getLock().lock(); - try - { - sample_index.setMaximum(samples.size()); - sample = samples.get(idx); - } - finally - { - samples.getLock().unlock(); - } - // Setting the value can be delayed while the plot is being updated - final VType value = sample.getVType(); - Activator.getThreadPool().execute(() -> waveform.setValue(value)); - if (value == null) - clearInfo(); - else - { - updateAnnotation(sample.getPosition(), sample.getValue()); - int size = value instanceof VNumberArray ? ((VNumberArray)value).getData().size() : 1; - plot.getXAxis().setValueRange(0.0, (double)size); - timestamp.setText(TimestampHelper.format(VTypeHelper.getTimestamp(value))); - status.setText(NLS.bind(Messages.SeverityStatusFmt, VTypeHelper.getSeverity(value).toString(), VTypeHelper.getMessage(value))); + + for(int n=0; n waveforms.get(waveformIndex).setValue(value)); + if (value == null) + clearInfo(); + else + { + updateAnnotation(n, sample.getPosition(), sample.getValue()); + if (n == 0) { + int size = value instanceof VNumberArray ? ((VNumberArray)value).getData().size() : 1; + plot.getXAxis().setValueRange(0.0, (double)size); + timestamp.setText(TimestampHelper.format(VTypeHelper.getTimestamp(value))); + status.setText(NLS.bind(Messages.SeverityStatusFmt, VTypeHelper.getSeverity(value).toString(), VTypeHelper.getMessage(value))); + } + } } plot.requestUpdate(); } @@ -458,33 +470,37 @@ private void clearInfo() private void userMovedAnnotation() { - if (waveform_annotation == null) + if (waveform_annotations == null) return; for (AnnotationInfo annotation : model.getAnnotations()) { // Locate the annotation for this waveform - if (annotation.isInternal() && - annotation.getItemIndex() == waveform_annotation.getItemIndex() && - annotation.getText().equals(waveform_annotation.getText())) - { // Locate index of sample for annotation's time stamp - final PlotSamples samples = model_item.getSamples(); - final TimeDataSearch search = new TimeDataSearch(); - final int idx; - samples.getLock().lock(); - try - { - idx = search.findClosestSample(samples, annotation.getTime()); + int n = 0; + for (AnnotationInfo waveform_annotation : waveform_annotations) { + if (annotation.isInternal() && + annotation.getItemIndex() == waveform_annotation.getItemIndex() && + annotation.getText().equals(waveform_annotation.getText())) + { // Locate index of sample for annotation's time stamp + final PlotSamples samples = model_items.get(n).getSamples(); + final TimeDataSearch search = new TimeDataSearch(); + final int idx; + samples.getLock().lock(); + try + { + idx = search.findClosestSample(samples, annotation.getTime()); + } + finally + { + samples.getLock().unlock(); + } + // Update waveform view for that sample on UI thread + sample_index.getDisplay().asyncExec(() -> + { + sample_index.setSelection(idx); + showSelectedSample(); + }); + return; } - finally - { - samples.getLock().unlock(); - } - // Update waveform view for that sample on UI thread - sample_index.getDisplay().asyncExec(() -> - { - sample_index.setSelection(idx); - showSelectedSample(); - }); - return; + n++; } } } @@ -494,30 +510,35 @@ private void removeAnnotation() if (model != null) { final List modelAnnotations = new ArrayList(model.getAnnotations()); - if (modelAnnotations.remove(waveform_annotation)) - { - changing_annotations = true; - model.setAnnotations(modelAnnotations); - changing_annotations = false; + for (AnnotationInfo waveform_annotation : waveform_annotations) { + if (modelAnnotations.remove(waveform_annotation)) + { + changing_annotations = true; + model.setAnnotations(modelAnnotations); + changing_annotations = false; + } } } - waveform_annotation = null; + waveform_annotations = null; } - private void updateAnnotation(final Instant time, final double value) + private void updateAnnotation(final int annotation_index, final Instant time, final double value) { + if (waveform_annotations == null) + waveform_annotations = new ArrayList(); + final List annotations = new ArrayList(model.getAnnotations()); // Initial annotation offset Point offset = new Point(20, -20); // If already in model, note its offset and remove for (AnnotationInfo annotation : annotations) { - if (annotation.getText().equals(ANNOTATION_TEXT)) + if (annotation.getText().equals(ANNOTATION_TEXT + " " + model_items.get(annotation_index).getDisplayName())) { // Update offset to where user last placed it offset = annotation.getOffset(); - waveform_annotation = annotation; - annotations.remove(waveform_annotation); + annotations.remove(annotation); break; + } } @@ -525,15 +546,15 @@ private void updateAnnotation(final Instant time, final double value) int item_index = 0; for (ModelItem item : model.getItems()) { - if (item == model_item) + if (item == model_items.get(annotation_index)) { item_index = i; break; } i++; } - waveform_annotation = new AnnotationInfo(true, item_index, time, value, offset, ANNOTATION_TEXT); - annotations.add(waveform_annotation); + waveform_annotations.add(annotation_index, new AnnotationInfo(true, item_index, time, value, offset, ANNOTATION_TEXT + " " + model_items.get(annotation_index).getDisplayName())); + annotations.add(waveform_annotations.get(annotation_index)); changing_annotations = true; model.setAnnotations(annotations); changing_annotations = false; From da55d81e68b71802850c9e0af3d99f822ed86402 Mon Sep 17 00:00:00 2001 From: Sky French Date: Tue, 7 Aug 2018 14:48:29 +0100 Subject: [PATCH 03/27] fewer bugs on multiple waveform view --- .../waveformview/WaveformView.java | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 0b63b6c4c2c..207da105353 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -90,10 +90,10 @@ public class WaveformView extends DataBrowserAwareView /** Plot */ private RTValuePlot plot; - /** Selector for first model_item's current sample */ + /** Selector for first model_item current sample */ private Slider sample_index; - /** Timestamp of current sample. */ + /** Timestamp of current sample(s). */ private Text timestamp; /** Status/severity of current sample. */ @@ -102,7 +102,7 @@ public class WaveformView extends DataBrowserAwareView /** Model of the currently active Data Browser plot or null */ private Model model; - /** Annotation in plot that indicates waveform sample */ + /** Annotation(s) in plot that indicate waveform sample(s) */ private List waveform_annotations; private boolean changing_annotations = false; @@ -123,9 +123,11 @@ public void itemAdded(final ModelItem item) @Override public void itemRemoved(final ModelItem item) { - //if (item == model_item) { - // model_item = null; - //} + for (ModelItem model_item : model_items) { + if (item == model_item) { + model_items.remove(model_item); + } + } update(false); } @@ -275,7 +277,6 @@ public void widgetSelected(SelectionEvent e) getSite().registerContextMenu(mm, null); mm.addMenuListener(new IMenuListener(){ - @Override public void menuAboutToShow(IMenuManager manager) { mm.add(plot.getToolbarAction()); @@ -359,22 +360,11 @@ private void update(final boolean model_changed) names_list.add(item.getName()); final String[] names = names_list.toArray(new String[names_list.size()]); - // Is the previously selected item still valid? - final int selected = 1;//pv_name.getSelectionIndex(); - //if (!model_changed && selected > 0 && model_item != null) // && pv_name.getText().equals(model_item.getName())) - // { - // Show same PV name again in combo box - // pv_select.setItems(names); - //pv_name.select(selected); - // pv_select.setEnabled(true); - // return; - //} - // Previously selected item no longer valid. // Show new items, clear rest pv_select.setItems(names); - //.select(0); pv_select.setEnabled(true); selectPV(null); + }); } @@ -424,6 +414,8 @@ private void showSelectedSample() final int idx = sample_index.getSelection(); + String timestampText = null; + for(int n=0; n Date: Tue, 7 Aug 2018 15:02:49 +0100 Subject: [PATCH 04/27] further bug fixes for multiple waveform trace display --- .../databrowser2/waveformview/WaveformView.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 207da105353..3529fd4b8ef 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -371,24 +371,21 @@ private void update(final boolean model_changed) /** Select given PV item (or null). */ private void selectPV(final List new_item) { - //model_item = new_item; // Delete all existing traces for (Trace trace : plot.getTraces()) plot.removeTrace(trace); - // No or unknown PV name? - if (new_item == null) - return; - model_items = new_item; - if (model_items == null) + if (model_items == null || model_items.size() == 0) { sample_index.setEnabled(false); removeAnnotation(); return; } + + removeAnnotation(); // Prepare to show waveforms of model item in plot @@ -504,7 +501,7 @@ private void userMovedAnnotation() private void removeAnnotation() { - if (model != null) + if (model != null && waveform_annotations != null) { final List modelAnnotations = new ArrayList(model.getAnnotations()); for (AnnotationInfo waveform_annotation : waveform_annotations) { From f6369203ba766e0d9c478766191509f3b85de067 Mon Sep 17 00:00:00 2001 From: Sky French Date: Wed, 8 Aug 2018 07:30:17 +0100 Subject: [PATCH 05/27] tidy up MultiSelectCombo class --- .../multiselectcombo/MultiSelectCombo.java | 58 ++----------------- 1 file changed, 6 insertions(+), 52 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java index 8aea7fb1928..da47bfd58eb 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java @@ -12,20 +12,16 @@ import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; -/** An implementation of a Combo box with multi-select capabilities +/** An implementation of a Combo box for the selection of multiple items * */ @@ -43,11 +39,8 @@ public MultiSelectCombo(Composite parent, String[] items, int style) { super(parent, style); allItems = items; - - setLayout(new GridLayout()); - selectedIndices = new ArrayList(); - + setLayout(new GridLayout()); selectionSummary = new Text(this, SWT.READ_ONLY); selectionSummary.setText("Select Item(s) for Waveform inspection ..."); selectionSummary.addMouseListener(new MouseAdapter() { @@ -62,29 +55,7 @@ public void mouseDown(MouseEvent event) { } public void setItems(String[] names) { - allItems = names; - //showSelectionShell(); - - /* - final int numItems = names.length; - itemButtons = new Button[numItems]; - for (int i = 0; i < numItems; i++) { - Button button = new Button(selectionShell, SWT.CHECK); - button.setText(names[i]); - if (selectedIndices.contains(i)) - button.setSelection(true); - button.pack(); - itemButtons[i] = button; - - } - */ - //selectionList = new List(selectionShell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); - //for (String item : allItems) - // selectionList.add(item); - //selectionList.setSelection(selectedIndices); - //.setLayoutData(new GridData(GridData.FILL_BOTH)) - } private void showSelectionShell() { @@ -94,13 +65,11 @@ private void showSelectionShell() { Rectangle shellRect = new Rectangle(p.x, p.y + size.y, size.x, 0); final int numItems = allItems.length; - selectionShell = new Shell(Display.getDefault(), SWT.NO_TRIM); selectionShell.setLayout(new GridLayout()); this.setLayoutData(new GridData()); selectionShell.setSize(shellRect.width, 30*numItems); selectionShell.setLocation(shellRect.x, shellRect.y); - itemButtons = new Button[numItems]; for (int i = 0; i < numItems; i++) { Button button = new Button(selectionShell, SWT.CHECK); @@ -109,30 +78,16 @@ private void showSelectionShell() { button.setSelection(true); button.pack(); itemButtons[i] = button; - itemButtons[i].addSelectionListener(selectionAdapter); + itemButtons[i].addSelectionListener(selectionAdapter); } - //selectionList = new List(selectionShell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); - //for (String item : allItems) - // selectionList.add(item); - //selectionList.setSelection(selectedIndices); - //.setLayoutData(new GridData(GridData.FILL_BOTH)) - + selectionShell.open(); - - selectionShell.addShellListener(new ShellAdapter() { public void shellDeactivated(ShellEvent event) { - if (selectionShell != null && !selectionShell.isDisposed()) { - selectedIndices.clear(); - for (int i = 0; i < numItems; i++) { - if (itemButtons[i].getSelection()) - selectedIndices.add(i); - } - //selectedIndices = selectionList.getSelectionIndices(); + if (selectionShell != null && !selectionShell.isDisposed()) selectionShell.dispose(); - } - } + } }); @@ -150,6 +105,5 @@ public List getSelectedIndices() { public void addSelectionListener(SelectionAdapter selAdapter) { selectionAdapter = selAdapter; } - } From b4d5a061f5b1fd80ff6ab95452989f36609010e8 Mon Sep 17 00:00:00 2001 From: Sky French Date: Wed, 8 Aug 2018 07:32:41 +0100 Subject: [PATCH 06/27] removed unused imports from WaveformView --- .../trends/databrowser2/waveformview/WaveformView.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 3529fd4b8ef..04b6012798f 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -44,22 +44,13 @@ import org.eclipse.jface.action.Separator; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.events.MouseTrackListener; -import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; From 6ba526fde99f266f21d1cf0c237b2174423b1ff6 Mon Sep 17 00:00:00 2001 From: Sky French Date: Wed, 8 Aug 2018 08:45:18 +0100 Subject: [PATCH 07/27] assorted interaction fixes for waveform view with mutliple traces --- .../multiselectcombo/MultiSelectCombo.java | 15 +++++- .../waveformview/WaveformView.java | 52 +++++++++++-------- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java index da47bfd58eb..f853e8a6044 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java @@ -33,6 +33,7 @@ public class MultiSelectCombo extends Composite { List selectedIndices; private Button[] itemButtons; + private Integer[] itemStates; private SelectionAdapter selectionAdapter; public MultiSelectCombo(Composite parent, String[] items, int style) { @@ -71,6 +72,7 @@ private void showSelectionShell() { selectionShell.setSize(shellRect.width, 30*numItems); selectionShell.setLocation(shellRect.x, shellRect.y); itemButtons = new Button[numItems]; + itemStates = new Integer[numItems]; for (int i = 0; i < numItems; i++) { Button button = new Button(selectionShell, SWT.CHECK); button.setText(allItems[i]); @@ -79,6 +81,10 @@ private void showSelectionShell() { button.pack(); itemButtons[i] = button; itemButtons[i].addSelectionListener(selectionAdapter); + if (button.getSelection()) + itemStates[i] = 1; + else + itemStates[i] = 0; } selectionShell.open(); @@ -86,6 +92,11 @@ private void showSelectionShell() { selectionShell.addShellListener(new ShellAdapter() { public void shellDeactivated(ShellEvent event) { if (selectionShell != null && !selectionShell.isDisposed()) + selectedIndices.clear(); + for (int i = 0; i < itemButtons.length; i++) { + if (itemButtons[i].getSelection()) + selectedIndices.add(i); + } selectionShell.dispose(); } @@ -94,6 +105,8 @@ public void shellDeactivated(ShellEvent event) { } public List getSelectedIndices() { + if (selectionShell.isDisposed()) + return selectedIndices; selectedIndices.clear(); for (int i = 0; i < itemButtons.length; i++) { if (itemButtons[i].getSelection()) @@ -103,7 +116,7 @@ public List getSelectedIndices() { } public void addSelectionListener(SelectionAdapter selAdapter) { - selectionAdapter = selAdapter; + selectionAdapter = selAdapter; } } diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 04b6012798f..e5a498bb71a 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -87,13 +87,13 @@ public class WaveformView extends DataBrowserAwareView /** Timestamp of current sample(s). */ private Text timestamp; - /** Status/severity of current sample. */ + /** Status/severity of current sample(s). */ private Text status; /** Model of the currently active Data Browser plot or null */ private Model model; - /** Annotation(s) in plot that indicate waveform sample(s) */ + /** Annotation(s) in data browser plot that indicate waveform sample(s) */ private List waveform_annotations; private boolean changing_annotations = false; @@ -107,7 +107,6 @@ public class WaveformView extends DataBrowserAwareView @Override public void itemAdded(final ModelItem item) { - update(false); } @@ -187,13 +186,7 @@ protected void doCreatePartControl(final Composite parent) l.setText(Messages.SampleView_Item); l.setLayoutData(new GridData()); - final List names_list = new ArrayList<>(); - if (model != null) { - for (ModelItem item : model.getItems()) - names_list.add(item.getName()); - } - final String[] names = names_list.toArray(new String[names_list.size()]); - + final String[] names = getAvailableItems(); pv_select = new MultiSelectCombo(parent, names, SWT.READ_ONLY); pv_select.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); ((GridData)pv_select.getLayoutData()).widthHint = 300; @@ -201,13 +194,11 @@ protected void doCreatePartControl(final Composite parent) //@Override public void widgetSelected(SelectionEvent event) { - final List curr_names_list = new ArrayList<>(); - if (model != null) { - for (ModelItem item : model.getItems()) - curr_names_list.add(item.getName()); - } - final String[] curr_names = curr_names_list.toArray(new String[curr_names_list.size()]); - List modelItems = getModelItems(curr_names); + widgetDefaultSelected(event); + } + //@Override + public void widgetDefaultSelected(final SelectionEvent event) { + List modelItems = getModelItems(getAvailableItems()); selectPV(modelItems); }} ); @@ -221,7 +212,7 @@ public void widgetSelected(SelectionEvent event) @Override public void widgetSelected(final SelectionEvent e) { // First item is "--select PV name--" - List modelItems = getModelItems(names); + List modelItems = getModelItems(getAvailableItems()); selectPV(modelItems); } }); @@ -298,6 +289,19 @@ private List getModelItems(final String [] names) } return modelItems; } + + /**Returns List of the Names of available ModelItems + * @returns String List of names + */ + private String[] getAvailableItems() + { + List curr_names_list = new ArrayList<>(); + if (model != null) { + for (ModelItem item : model.getItems()) + curr_names_list.add(item.getName()); + } + return curr_names_list.toArray(new String[curr_names_list.size()]); + } /** {@inheritDoc} */ @Override @@ -354,7 +358,8 @@ private void update(final boolean model_changed) // Show new items, clear rest pv_select.setItems(names); pv_select.setEnabled(true); - selectPV(null); + List modelItems = getModelItems(getAvailableItems()); + selectPV(modelItems); }); } @@ -403,6 +408,7 @@ private void showSelectedSample() final int idx = sample_index.getSelection(); String timestampText = null; + String statusText = null; for(int n=0; n Date: Wed, 8 Aug 2018 08:54:53 +0100 Subject: [PATCH 08/27] removing unused item states array --- .../databrowser2/multiselectcombo/MultiSelectCombo.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java index f853e8a6044..eb470b0a661 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java @@ -33,7 +33,6 @@ public class MultiSelectCombo extends Composite { List selectedIndices; private Button[] itemButtons; - private Integer[] itemStates; private SelectionAdapter selectionAdapter; public MultiSelectCombo(Composite parent, String[] items, int style) { @@ -72,7 +71,6 @@ private void showSelectionShell() { selectionShell.setSize(shellRect.width, 30*numItems); selectionShell.setLocation(shellRect.x, shellRect.y); itemButtons = new Button[numItems]; - itemStates = new Integer[numItems]; for (int i = 0; i < numItems; i++) { Button button = new Button(selectionShell, SWT.CHECK); button.setText(allItems[i]); @@ -81,10 +79,6 @@ private void showSelectionShell() { button.pack(); itemButtons[i] = button; itemButtons[i].addSelectionListener(selectionAdapter); - if (button.getSelection()) - itemStates[i] = 1; - else - itemStates[i] = 0; } selectionShell.open(); From c4a87c552325cf5c3eae95b29cfd41061314116b Mon Sep 17 00:00:00 2001 From: Sky French Date: Wed, 8 Aug 2018 10:07:35 +0100 Subject: [PATCH 09/27] Add autoscaling toggle to y axis menu in WaveformView; allows user to add a new waveform without having the y axis autoscale to a different range --- .../waveformview/WaveformView.java | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index e5a498bb71a..34133bddc55 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -22,7 +22,6 @@ import org.csstudio.swt.rtplot.RTValuePlot; import org.csstudio.swt.rtplot.Trace; import org.csstudio.swt.rtplot.TraceType; -import org.csstudio.swt.rtplot.YAxis; import org.csstudio.swt.rtplot.data.TimeDataSearch; import org.csstudio.trends.databrowser2.Activator; import org.csstudio.trends.databrowser2.Messages; @@ -265,6 +264,7 @@ public void menuAboutToShow(IMenuManager manager) { mm.add(plot.getLegendAction()); mm.add(new Separator()); mm.add(new ToggleYAxisAction(plot, true)); + mm.add(new ToggleYAxisAutoscaleAction(plot, true)); } }); @@ -394,10 +394,7 @@ private void selectPV(final List new_item) } sample_index.setEnabled(true); showSelectedSample(); - // Autoscale Y axis by default. If the user tries to move the axis this will automatically turn off. - for (YAxis yaxis : plot.getYAxes()) { - yaxis.setAutoscale(true); - } + } /** Show the current sample of the current model item. */ @@ -577,4 +574,27 @@ public void run() plot.requestUpdate(); } } + + public class ToggleYAxisAutoscaleAction> extends Action + { + final private RTPlot plot; + + public ToggleYAxisAutoscaleAction(final RTPlot plot, final boolean is_visible) + { + super(plot.getYAxes().get(0).isAutoscale() ? "Autoscaling" : "Not autoscaling", null); + this.plot = plot; + } + + public void updateText() + { + setText(plot.getYAxes().get(0).isAutoscale() ? "Autoscaling" : "Not autoscaling"); + } + + @Override + public void run() + { + plot.getYAxes().get(0).setAutoscale(!plot.getYAxes().get(0).isAutoscale()); + plot.requestUpdate(); + } + } } From 098af33958fdf9b40074e914e8dbc860de9c7fe4 Mon Sep 17 00:00:00 2001 From: Sky French Date: Wed, 8 Aug 2018 10:17:10 +0100 Subject: [PATCH 10/27] NullPointerException fix; menu labelling logic fix --- .../databrowser2/multiselectcombo/MultiSelectCombo.java | 2 +- .../trends/databrowser2/waveformview/WaveformView.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java index eb470b0a661..786017fd19a 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java @@ -99,7 +99,7 @@ public void shellDeactivated(ShellEvent event) { } public List getSelectedIndices() { - if (selectionShell.isDisposed()) + if (selectionShell == null || selectionShell.isDisposed()) return selectedIndices; selectedIndices.clear(); for (int i = 0; i < itemButtons.length; i++) { diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 34133bddc55..ec01cfc2ff9 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -581,13 +581,13 @@ public class ToggleYAxisAutoscaleAction> extends public ToggleYAxisAutoscaleAction(final RTPlot plot, final boolean is_visible) { - super(plot.getYAxes().get(0).isAutoscale() ? "Autoscaling" : "Not autoscaling", null); + super(plot.getYAxes().get(0).isAutoscale() ? "Not autoscaling" : "Autoscaling", null); this.plot = plot; } public void updateText() { - setText(plot.getYAxes().get(0).isAutoscale() ? "Autoscaling" : "Not autoscaling"); + setText(plot.getYAxes().get(0).isAutoscale() ? "Not autoscaling" : "Autoscaling"); } @Override From 24aa8e0c6a0ddba91fe33169f063611de61b3575 Mon Sep 17 00:00:00 2001 From: Sky French Date: Wed, 8 Aug 2018 10:26:03 +0100 Subject: [PATCH 11/27] trailing whitespace fixes --- .../waveformview/WaveformView.java | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index ec01cfc2ff9..b62f5a9b062 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -31,9 +31,9 @@ import org.csstudio.trends.databrowser2.model.ModelItem; import org.csstudio.trends.databrowser2.model.ModelListener; import org.csstudio.trends.databrowser2.model.ModelListenerAdapter; -import org.csstudio.trends.databrowser2.multiselectcombo.MultiSelectCombo; import org.csstudio.trends.databrowser2.model.PlotSample; import org.csstudio.trends.databrowser2.model.PlotSamples; +import org.csstudio.trends.databrowser2.multiselectcombo.MultiSelectCombo; import org.diirt.vtype.VNumberArray; import org.diirt.vtype.VType; import org.eclipse.jface.action.Action; @@ -189,13 +189,15 @@ protected void doCreatePartControl(final Composite parent) pv_select = new MultiSelectCombo(parent, names, SWT.READ_ONLY); pv_select.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); ((GridData)pv_select.getLayoutData()).widthHint = 300; - pv_select.addSelectionListener (new SelectionAdapter() { + pv_select.addSelectionListener (new SelectionAdapter() { //@Override - public void widgetSelected(SelectionEvent event) + @Override + public void widgetSelected(SelectionEvent event) { widgetDefaultSelected(event); } //@Override + @Override public void widgetDefaultSelected(final SelectionEvent event) { List modelItems = getModelItems(getAvailableItems()); selectPV(modelItems); @@ -269,14 +271,14 @@ public void menuAboutToShow(IMenuManager manager) { }); } - + /** Return List of selected ModelItems * by finding Model Items from checked items in PV list * @param names list of all PV names available in list * @returns List of ModelItems */ - private List getModelItems(final String [] names) - { + private List getModelItems(final String [] names) + { List modelItems = new ArrayList(); List selectedIndices = pv_select.getSelectedIndices(); if (selectedIndices.size() == 0) @@ -289,7 +291,7 @@ private List getModelItems(final String [] names) } return modelItems; } - + /**Returns List of the Names of available ModelItems * @returns String List of names */ @@ -299,7 +301,7 @@ private String[] getAvailableItems() if (model != null) { for (ModelItem item : model.getItems()) curr_names_list.add(item.getName()); - } + } return curr_names_list.toArray(new String[curr_names_list.size()]); } @@ -360,7 +362,7 @@ private void update(final boolean model_changed) pv_select.setEnabled(true); List modelItems = getModelItems(getAvailableItems()); selectPV(modelItems); - + }); } @@ -373,22 +375,22 @@ private void selectPV(final List new_item) plot.removeTrace(trace); model_items = new_item; - + if (model_items == null || model_items.size() == 0) { sample_index.setEnabled(false); removeAnnotation(); return; } - + removeAnnotation(); // Prepare to show waveforms of model item in plot // Create trace for waveform waveforms = new ArrayList(); - for(int n=0; n(); - + final List annotations = new ArrayList(model.getAnnotations()); // Initial annotation offset Point offset = new Point(20, -20); @@ -530,7 +532,7 @@ private void updateAnnotation(final int annotation_index, final Instant time, fi offset = annotation.getOffset(); annotations.remove(annotation); break; - + } } @@ -574,7 +576,7 @@ public void run() plot.requestUpdate(); } } - + public class ToggleYAxisAutoscaleAction> extends Action { final private RTPlot plot; From 351c92b05543e00120742889d0eddd7833d1e835 Mon Sep 17 00:00:00 2001 From: Sky French Date: Wed, 8 Aug 2018 14:59:16 +0100 Subject: [PATCH 12/27] modify choice of sample for additional waveforms --- .../waveformview/WaveformView.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index b62f5a9b062..d94c0f628fa 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -409,17 +409,30 @@ private void showSelectedSample() String timestampText = null; String statusText = null; + Instant firstWaveformSampleTime = null; + for(int n=0; n Date: Thu, 9 Aug 2018 15:47:04 +0100 Subject: [PATCH 13/27] bugfix SWTException (Widget disposed) --- .../multiselectcombo/MultiSelectCombo.java | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java index 786017fd19a..9c4db7f06a5 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java @@ -3,26 +3,25 @@ import java.util.ArrayList; import java.util.List; -import org.eclipse.swt.widgets.Text; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - +import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; -import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; /** An implementation of a Combo box for the selection of multiple items - * + * */ public class MultiSelectCombo extends Composite { @@ -31,13 +30,13 @@ public class MultiSelectCombo extends Composite { Text selectionSummary; String[] allItems; List selectedIndices; - + private Button[] itemButtons; private SelectionAdapter selectionAdapter; - + public MultiSelectCombo(Composite parent, String[] items, int style) { super(parent, style); - + allItems = items; selectedIndices = new ArrayList(); setLayout(new GridLayout()); @@ -49,17 +48,17 @@ public void mouseDown(MouseEvent event) { super.mouseDown(event); showSelectionShell(); } - + }); - + } - + public void setItems(String[] names) { allItems = names; } - + private void showSelectionShell() { - + Point p = selectionSummary.getParent().toDisplay(selectionSummary.getLocation()); Point size = selectionSummary.getSize(); Rectangle shellRect = new Rectangle(p.x, p.y + size.y, size.x, 0); @@ -81,9 +80,8 @@ private void showSelectionShell() { itemButtons[i].addSelectionListener(selectionAdapter); } - selectionShell.open(); - selectionShell.addShellListener(new ShellAdapter() { + @Override public void shellDeactivated(ShellEvent event) { if (selectionShell != null && !selectionShell.isDisposed()) selectedIndices.clear(); @@ -93,11 +91,13 @@ public void shellDeactivated(ShellEvent event) { } selectionShell.dispose(); } - + }); - + + selectionShell.open(); + } - + public List getSelectedIndices() { if (selectionShell == null || selectionShell.isDisposed()) return selectedIndices; From afb0c2f5965f471b62dc2d1b34b336e1fd188d4e Mon Sep 17 00:00:00 2001 From: Sky French Date: Fri, 10 Aug 2018 09:17:58 +0100 Subject: [PATCH 14/27] WaveformView Value Axis auto scale option as check box --- .../trends/databrowser2/waveformview/WaveformView.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index d94c0f628fa..484d6c18f06 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -597,13 +597,9 @@ public class ToggleYAxisAutoscaleAction> extends public ToggleYAxisAutoscaleAction(final RTPlot plot, final boolean is_visible) { - super(plot.getYAxes().get(0).isAutoscale() ? "Not autoscaling" : "Autoscaling", null); + super("Autoscaling", Action.AS_CHECK_BOX); this.plot = plot; - } - - public void updateText() - { - setText(plot.getYAxes().get(0).isAutoscale() ? "Not autoscaling" : "Autoscaling"); + this.setChecked(plot.getYAxes().get(0).isAutoscale()); } @Override @@ -611,6 +607,7 @@ public void run() { plot.getYAxes().get(0).setAutoscale(!plot.getYAxes().get(0).isAutoscale()); plot.requestUpdate(); + this.setChecked(plot.getYAxes().get(0).isAutoscale()); } } } From da3c27e96c7797cfaa5d79b9b349813fdc7a6461 Mon Sep 17 00:00:00 2001 From: Sky French Date: Fri, 10 Aug 2018 10:14:58 +0100 Subject: [PATCH 15/27] style improvements for MultiSelectCombo --- .../multiselectcombo/MultiSelectCombo.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java index 9c4db7f06a5..bfb4fd3c93b 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java @@ -11,13 +11,12 @@ import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; /** An implementation of a Combo box for the selection of multiple items @@ -27,7 +26,8 @@ public class MultiSelectCombo extends Composite { Shell selectionShell; - Text selectionSummary; + Button selectionSummary; + Label selectionLabel; String[] allItems; List selectedIndices; @@ -39,9 +39,12 @@ public MultiSelectCombo(Composite parent, String[] items, int style) { allItems = items; selectedIndices = new ArrayList(); - setLayout(new GridLayout()); - selectionSummary = new Text(this, SWT.READ_ONLY); - selectionSummary.setText("Select Item(s) for Waveform inspection ..."); + GridLayout grdLyt = new GridLayout(); + setLayout(grdLyt); + grdLyt.numColumns = 2; + selectionLabel = new Label(this, SWT.READ_ONLY); + selectionLabel.setText("Select Item(s)"); + selectionSummary = new Button(this, SWT.ARROW | SWT.DOWN); selectionSummary.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent event) { @@ -60,15 +63,13 @@ public void setItems(String[] names) { private void showSelectionShell() { Point p = selectionSummary.getParent().toDisplay(selectionSummary.getLocation()); - Point size = selectionSummary.getSize(); + Point size = selectionLabel.getSize(); Rectangle shellRect = new Rectangle(p.x, p.y + size.y, size.x, 0); final int numItems = allItems.length; selectionShell = new Shell(Display.getDefault(), SWT.NO_TRIM); selectionShell.setLayout(new GridLayout()); - this.setLayoutData(new GridData()); - selectionShell.setSize(shellRect.width, 30*numItems); - selectionShell.setLocation(shellRect.x, shellRect.y); + selectionShell.setLocation(shellRect.x, shellRect.y + 10); itemButtons = new Button[numItems]; for (int i = 0; i < numItems; i++) { Button button = new Button(selectionShell, SWT.CHECK); @@ -79,7 +80,8 @@ private void showSelectionShell() { itemButtons[i] = button; itemButtons[i].addSelectionListener(selectionAdapter); } - + selectionShell.layout(true, true); + selectionShell.setSize(selectionShell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); selectionShell.addShellListener(new ShellAdapter() { @Override public void shellDeactivated(ShellEvent event) { From cb280034bc559f5b6ccb3d977f6ed60d984f8c5e Mon Sep 17 00:00:00 2001 From: Sky French Date: Fri, 10 Aug 2018 10:19:13 +0100 Subject: [PATCH 16/27] WaveformView specific context menu style improvements --- .../trends/databrowser2/waveformview/WaveformView.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 484d6c18f06..c21b543338e 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -574,13 +574,9 @@ public class ToggleYAxisAction> extends Action public ToggleYAxisAction(final RTPlot plot, final boolean is_visible) { - super(plot.getYAxes().get(0).isLogarithmic() ? "Linear Axis" : "Logarithmic Axis", null); + super("Logarithmic Axis", Action.AS_CHECK_BOX); this.plot = plot; - } - - public void updateText() - { - setText(plot.getYAxes().get(0).isLogarithmic() ? "Linear Axis" : "Logarithmic Axis"); + this.setChecked(plot.getYAxes().get(0).isLogarithmic()); } @Override @@ -588,6 +584,7 @@ public void run() { plot.getYAxes().get(0).setLogarithmic(!plot.getYAxes().get(0).isLogarithmic()); plot.requestUpdate(); + this.setChecked(plot.getYAxes().get(0).isLogarithmic()); } } From 9cd99f7c6113d9f0c80b953ecd560ffda01acef1 Mon Sep 17 00:00:00 2001 From: Sky French Date: Fri, 10 Aug 2018 10:25:51 +0100 Subject: [PATCH 17/27] default WaveformView to autoscale --- .../csstudio/trends/databrowser2/waveformview/WaveformView.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index c21b543338e..c6250f31880 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -224,6 +224,8 @@ public void widgetSelected(final SelectionEvent e) plot = new RTValuePlot(parent); plot.getXAxis().setName(Messages.WaveformIndex); plot.getYAxes().get(0).setName(Messages.WaveformAmplitude); + plot.getYAxes().get(0).setAutoscale(true); + plot.requestUpdate(); plot.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, layout.numColumns, 1)); // <<<<<< Slider >>>>>> From 5296b9e3337aae8351e63fc498da113b0e16c5cd Mon Sep 17 00:00:00 2001 From: Sky French Date: Fri, 10 Aug 2018 11:53:32 +0100 Subject: [PATCH 18/27] removing dead code --- .../csstudio/trends/databrowser2/waveformview/WaveformView.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index c6250f31880..eaee3b64c8e 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -190,13 +190,11 @@ protected void doCreatePartControl(final Composite parent) pv_select.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); ((GridData)pv_select.getLayoutData()).widthHint = 300; pv_select.addSelectionListener (new SelectionAdapter() { - //@Override @Override public void widgetSelected(SelectionEvent event) { widgetDefaultSelected(event); } - //@Override @Override public void widgetDefaultSelected(final SelectionEvent event) { List modelItems = getModelItems(getAvailableItems()); From 425c97434d38276cc8dd2f33cadda899b7a4c276 Mon Sep 17 00:00:00 2001 From: Sky French Date: Fri, 10 Aug 2018 12:01:10 +0100 Subject: [PATCH 19/27] robuster code for updating user moved sample annotations --- .../waveformview/WaveformView.java | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index eaee3b64c8e..1034f17dddc 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -482,33 +482,36 @@ private void userMovedAnnotation() return; for (AnnotationInfo annotation : model.getAnnotations()) { // Locate the annotation for this waveform - int n = 0; for (AnnotationInfo waveform_annotation : waveform_annotations) { if (annotation.isInternal() && annotation.getItemIndex() == waveform_annotation.getItemIndex() && annotation.getText().equals(waveform_annotation.getText())) { // Locate index of sample for annotation's time stamp - final PlotSamples samples = model_items.get(n).getSamples(); - final TimeDataSearch search = new TimeDataSearch(); - final int idx; - samples.getLock().lock(); - try - { - idx = search.findClosestSample(samples, annotation.getTime()); - } - finally - { - samples.getLock().unlock(); + // By first locating the relevant samples + for(ModelItem model_item : model_items) { + if (annotation.getText().contains(model_item.getDisplayName())) { + final PlotSamples samples = model_item.getSamples(); + final TimeDataSearch search = new TimeDataSearch(); + final int idx; + samples.getLock().lock(); + try + { + idx = search.findClosestSample(samples, annotation.getTime()); + } + finally + { + samples.getLock().unlock(); + } + // Update waveform view for that sample on UI thread + sample_index.getDisplay().asyncExec(() -> + { + sample_index.setSelection(idx); + showSelectedSample(); + }); + return; + } } - // Update waveform view for that sample on UI thread - sample_index.getDisplay().asyncExec(() -> - { - sample_index.setSelection(idx); - showSelectedSample(); - }); - return; } - n++; } } } From 4a564ad527dcec7ef03c1fe817980be4d4801996 Mon Sep 17 00:00:00 2001 From: Sky French Date: Fri, 10 Aug 2018 12:03:57 +0100 Subject: [PATCH 20/27] code tidy: add buildAnnotationText method --- .../trends/databrowser2/waveformview/WaveformView.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 1034f17dddc..f04f43fdb87 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -544,7 +544,7 @@ private void updateAnnotation(final int annotation_index, final Instant time, fi // If already in model, note its offset and remove for (AnnotationInfo annotation : annotations) { - if (annotation.getText().equals(ANNOTATION_TEXT + " " + model_items.get(annotation_index).getDisplayName())) + if (annotation.getText().equals(buildAnnotationText(annotation_index))) { // Update offset to where user last placed it offset = annotation.getOffset(); annotations.remove(annotation); @@ -564,13 +564,17 @@ private void updateAnnotation(final int annotation_index, final Instant time, fi } i++; } - waveform_annotations.add(annotation_index, new AnnotationInfo(true, item_index, time, value, offset, ANNOTATION_TEXT + " " + model_items.get(annotation_index).getDisplayName())); + waveform_annotations.add(annotation_index, new AnnotationInfo(true, item_index, time, value, offset, buildAnnotationText(annotation_index))); annotations.add(waveform_annotations.get(annotation_index)); changing_annotations = true; model.setAnnotations(annotations); changing_annotations = false; } + private String buildAnnotationText(final Integer annotation_index) { + return ANNOTATION_TEXT + " " + model_items.get(annotation_index).getDisplayName(); + } + public class ToggleYAxisAction> extends Action { final private RTPlot plot; From 4549279d5a9e2cf94a629c49ba7f454f6517ee4c Mon Sep 17 00:00:00 2001 From: Will Rogers Date: Mon, 13 Aug 2018 17:09:04 +0100 Subject: [PATCH 21/27] Simpler list removal. --- .../trends/databrowser2/waveformview/WaveformView.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index a5b1fe01828..a93e96bfde6 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -112,11 +112,7 @@ public void itemAdded(final ModelItem item) @Override public void itemRemoved(final ModelItem item) { - for (ModelItem model_item : model_items) { - if (item == model_item) { - model_items.remove(model_item); - } - } + model_items.remove(item); update(false); } From b6685aefa1a9f9604baa11a9248362ba7200fe62 Mon Sep 17 00:00:00 2001 From: Sky French Date: Tue, 14 Aug 2018 09:53:54 +0100 Subject: [PATCH 22/27] modifications to use MultipleSelectionCombo --- .../waveformview/WaveformView.java | 100 +++++++----------- 1 file changed, 37 insertions(+), 63 deletions(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index a93e96bfde6..99d71dacdda 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -7,6 +7,8 @@ ******************************************************************************/ package org.csstudio.trends.databrowser2.waveformview; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -33,7 +35,7 @@ import org.csstudio.trends.databrowser2.model.ModelListenerAdapter; import org.csstudio.trends.databrowser2.model.PlotSample; import org.csstudio.trends.databrowser2.model.PlotSamples; -import org.csstudio.trends.databrowser2.multiselectcombo.MultiSelectCombo; +import org.csstudio.ui.util.widgets.MultipleSelectionCombo; import org.diirt.vtype.VNumberArray; import org.diirt.vtype.VType; import org.eclipse.jface.action.Action; @@ -75,7 +77,7 @@ public class WaveformView extends DataBrowserAwareView final public static String ANNOTATION_TEXT = "Waveform view"; /** PV Name(s) selector */ - private MultiSelectCombo pv_select; + private MultipleSelectionCombo pv_select; /** Plot */ private RTValuePlot plot; @@ -141,8 +143,9 @@ public void changedAnnotations() public void changedTimerange() { // Update selected sample to assert that it's one of the visible ones. - if (model_items != null) - showSelectedSample(); + if (model_items != null && waveforms != null) + if (waveforms.size() > 0) + showSelectedSample(); } }; @@ -181,22 +184,15 @@ protected void doCreatePartControl(final Composite parent) l.setText(Messages.SampleView_Item); l.setLayoutData(new GridData()); - final String[] names = getAvailableItems(); - pv_select = new MultiSelectCombo(parent, names, SWT.READ_ONLY); - pv_select.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); - ((GridData)pv_select.getLayoutData()).widthHint = 300; - pv_select.addSelectionListener (new SelectionAdapter() { + pv_select = new MultipleSelectionCombo<>(parent, 0); + pv_select.setItems(getModelItems()); + pv_select.setLayoutData(new GridData(SWT.FILL, 0, true, false, layout.numColumns-2, 1)); + pv_select.addPropertyChangeListener(new PropertyChangeListener() { @Override - public void widgetSelected(SelectionEvent event) - { - widgetDefaultSelected(event); + public void propertyChange(PropertyChangeEvent evt) { + selectPV(pv_select.getSelection()); } - @Override - public void widgetDefaultSelected(final SelectionEvent event) { - List modelItems = getModelItems(getAvailableItems()); - selectPV(modelItems); - }} - ); + }); final Button refresh = new Button(parent, SWT.PUSH); refresh.setText(Messages.SampleView_Refresh); @@ -206,9 +202,8 @@ public void widgetDefaultSelected(final SelectionEvent event) { { @Override public void widgetSelected(final SelectionEvent e) - { // First item is "--select PV name--" - List modelItems = getModelItems(getAvailableItems()); - selectPV(modelItems); + { + selectPV(pv_select.getSelection()); } }); @@ -276,34 +271,16 @@ public void menuAboutToShow(IMenuManager manager) { * @param names list of all PV names available in list * @returns List of ModelItems */ - private List getModelItems(final String [] names) + private List getModelItems() { - List modelItems = new ArrayList(); - List selectedIndices = pv_select.getSelectedIndices(); - if (selectedIndices.size() == 0) - modelItems = null; - else { - for(int n=0; n modelItemList = new ArrayList<>(); + if (model != null) { + for (ModelItem item : model.getItems()) + modelItemList.add(item); } - return modelItems; + return modelItemList; } - /**Returns List of the Names of available ModelItems - * @returns String List of names - */ - private String[] getAvailableItems() - { - List curr_names_list = new ArrayList<>(); - if (model != null) { - for (ModelItem item : model.getItems()) - curr_names_list.add(item.getName()); - } - return curr_names_list.toArray(new String[curr_names_list.size()]); - } - /** {@inheritDoc} */ @Override public void setFocus() @@ -339,28 +316,25 @@ private void update(final boolean model_changed) Display.getDefault().asyncExec( () -> { if (pv_select.isDisposed()) - { return; - } - if (model == null) - { // Clear/disable GUI - pv_select.setItems(new String[] {}); + + final List oldSelection = new ArrayList<>(pv_select.getSelection()); + pv_select.setItems(getModelItems()); + if (model == null) { pv_select.setEnabled(false); selectPV(null); return; } - // Show PV names - final List names_list = new ArrayList<>(); - for (ModelItem item : model.getItems()) - names_list.add(item.getName()); - final String[] names = names_list.toArray(new String[names_list.size()]); - // Show new items, clear rest - pv_select.setItems(names); pv_select.setEnabled(true); - List modelItems = getModelItems(getAvailableItems()); - selectPV(modelItems); + final List newSelection = new ArrayList<>(); + for(ModelItem oldItem : oldSelection) { + if (getModelItems().contains(oldItem)) + newSelection.add(oldItem); + } + pv_select.setSelection(newSelection); + selectPV(oldSelection); }); } @@ -375,15 +349,14 @@ private void selectPV(final List new_item) model_items = new_item; + removeAnnotation(); + if (model_items == null || model_items.size() == 0) { sample_index.setEnabled(false); - removeAnnotation(); return; } - removeAnnotation(); - // Prepare to show waveforms of model item in plot // Create trace for waveform @@ -394,7 +367,8 @@ private void selectPV(final List new_item) // Enable waveform selection and update slider's range } sample_index.setEnabled(true); - showSelectedSample(); + if (waveforms.size() > 0) + showSelectedSample(); } From ae3a0644ad2642b77a665cf506c7a1be42e99899 Mon Sep 17 00:00:00 2001 From: Sky French Date: Tue, 14 Aug 2018 13:19:32 +0100 Subject: [PATCH 23/27] bug fixed itemRemoved method in WaveformView --- .../databrowser2/waveformview/WaveformView.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java index 99d71dacdda..3f7140bb176 100644 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java +++ b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/waveformview/WaveformView.java @@ -114,7 +114,17 @@ public void itemAdded(final ModelItem item) @Override public void itemRemoved(final ModelItem item) { - model_items.remove(item); + List oldSelectedItems = pv_select.getSelection(); + List items = new ArrayList<>(); + List selectedItems = new ArrayList<>(); + for(ModelItem modelItem : model.getItems()) + items.add(modelItem); + for(ModelItem modelItem : oldSelectedItems) { + if (modelItem != item) + selectedItems.add(modelItem); + } + pv_select.setItems(items); + pv_select.setSelection(selectedItems); update(false); } From 57aab9158ad9b40d2ee0a0398b9d49106980eb80 Mon Sep 17 00:00:00 2001 From: Sky French Date: Tue, 14 Aug 2018 15:01:37 +0100 Subject: [PATCH 24/27] removing unused MultiSelectCombo class --- .../multiselectcombo/MultiSelectCombo.java | 118 ------------------ 1 file changed, 118 deletions(-) delete mode 100644 applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java diff --git a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java b/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java deleted file mode 100644 index bfb4fd3c93b..00000000000 --- a/applications/databrowser/databrowser-plugins/org.csstudio.trends.databrowser2/src/org/csstudio/trends/databrowser2/multiselectcombo/MultiSelectCombo.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.csstudio.trends.databrowser2.multiselectcombo; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.ShellAdapter; -import org.eclipse.swt.events.ShellEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; - - -/** An implementation of a Combo box for the selection of multiple items - * - */ - -public class MultiSelectCombo extends Composite { - - Shell selectionShell; - Button selectionSummary; - Label selectionLabel; - String[] allItems; - List selectedIndices; - - private Button[] itemButtons; - private SelectionAdapter selectionAdapter; - - public MultiSelectCombo(Composite parent, String[] items, int style) { - super(parent, style); - - allItems = items; - selectedIndices = new ArrayList(); - GridLayout grdLyt = new GridLayout(); - setLayout(grdLyt); - grdLyt.numColumns = 2; - selectionLabel = new Label(this, SWT.READ_ONLY); - selectionLabel.setText("Select Item(s)"); - selectionSummary = new Button(this, SWT.ARROW | SWT.DOWN); - selectionSummary.addMouseListener(new MouseAdapter() { - @Override - public void mouseDown(MouseEvent event) { - super.mouseDown(event); - showSelectionShell(); - } - - }); - - } - - public void setItems(String[] names) { - allItems = names; - } - - private void showSelectionShell() { - - Point p = selectionSummary.getParent().toDisplay(selectionSummary.getLocation()); - Point size = selectionLabel.getSize(); - Rectangle shellRect = new Rectangle(p.x, p.y + size.y, size.x, 0); - - final int numItems = allItems.length; - selectionShell = new Shell(Display.getDefault(), SWT.NO_TRIM); - selectionShell.setLayout(new GridLayout()); - selectionShell.setLocation(shellRect.x, shellRect.y + 10); - itemButtons = new Button[numItems]; - for (int i = 0; i < numItems; i++) { - Button button = new Button(selectionShell, SWT.CHECK); - button.setText(allItems[i]); - if (selectedIndices.contains(i)) - button.setSelection(true); - button.pack(); - itemButtons[i] = button; - itemButtons[i].addSelectionListener(selectionAdapter); - } - selectionShell.layout(true, true); - selectionShell.setSize(selectionShell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); - selectionShell.addShellListener(new ShellAdapter() { - @Override - public void shellDeactivated(ShellEvent event) { - if (selectionShell != null && !selectionShell.isDisposed()) - selectedIndices.clear(); - for (int i = 0; i < itemButtons.length; i++) { - if (itemButtons[i].getSelection()) - selectedIndices.add(i); - } - selectionShell.dispose(); - } - - }); - - selectionShell.open(); - - } - - public List getSelectedIndices() { - if (selectionShell == null || selectionShell.isDisposed()) - return selectedIndices; - selectedIndices.clear(); - for (int i = 0; i < itemButtons.length; i++) { - if (itemButtons[i].getSelection()) - selectedIndices.add(i); - } - return selectedIndices; - } - - public void addSelectionListener(SelectionAdapter selAdapter) { - selectionAdapter = selAdapter; - } - -} From 42408064a7e908983620cfa41dc1f8b554cad6c4 Mon Sep 17 00:00:00 2001 From: Sky French Date: Wed, 15 Aug 2018 14:49:18 +0100 Subject: [PATCH 25/27] modifying MultipleSelectionCombo to use check boxes --- .../util/widgets/MultipleSelectionCombo.java | 100 +++++++++--------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java b/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java index fce9ba43456..1a6e23e9ce2 100644 --- a/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java +++ b/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java @@ -15,8 +15,6 @@ import java.util.List; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.FocusAdapter; -import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; @@ -24,9 +22,11 @@ import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.events.ShellAdapter; +import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -76,7 +76,7 @@ public class MultipleSelectionCombo extends Composite { private Button drop_down; private Shell popup; - private org.eclipse.swt.widgets.List list; + private Button[] itemButtons; /** Items to show in list */ private List items = new ArrayList(); @@ -188,8 +188,8 @@ public void widgetSelected(final SelectionEvent e) { if (!isDropped()) drop(true); } - }); - } + }); + }; /** {@inheritDoc} */ @Override @@ -328,7 +328,13 @@ public List getSelection() { /** Update selection from list */ private void updateSelectionFromList() { - setSelection(list.getSelection()); + List selection = new ArrayList(); + if (itemButtons != null) { + for (int n=0; ntext to reflect selection */ @@ -364,70 +370,64 @@ private void drop(boolean drop) { /** Create shell that simulates drop-down */ private void createPopup() { popup = new Shell(getShell(), SWT.NO_TRIM | SWT.ON_TOP); - popup.setLayout(new FillLayout()); - list = new org.eclipse.swt.widgets.List(popup, SWT.MULTI | SWT.V_SCROLL); - list.setToolTipText(tool_tip); - - // Position popup under the text box - Rectangle bounds = text.getBounds(); - bounds.y += bounds.height; - // As high as necessary for items - bounds.height = 5 + 2 * list.getBorderWidth() + list.getItemHeight() - * items.size(); - // ..with limitation - bounds.height = Math.min(bounds.height, display.getBounds().height / 2); - // Map to screen coordinates - bounds = display.map(text, null, bounds); - popup.setBounds(bounds); - popup.open(); + popup.setLayout(new GridLayout()); + popup.setToolTipText(tool_tip); - // Update text from changed list selection - list.addSelectionListener(new SelectionListener() { + SelectionListener selectionListener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { updateSelectionFromList(); updateText(); } - @Override public void widgetDefaultSelected(SelectionEvent e) { updateSelectionFromList(); updateText(); hidePopup(); - } - }); + }}; + + int itemWidth = 0; + int itemHeight = 0; String[] stringItems = new String[items.size()]; for (int i = 0; i < items.size(); i++) { stringItems[i] = stringRepresention(items.get(i)); } - list.setItems(stringItems); - int[] intSelectionIndex = new int[selectionIndex.size()]; - for (int i = 0; i < intSelectionIndex.length; i++) { - intSelectionIndex[i] = selectionIndex.get(i); - } - list.setSelection(intSelectionIndex); - list.addKeyListener(new KeyAdapter() { + int numItems = stringItems.length; + itemButtons = new Button[numItems]; + for (int n=0; n Date: Wed, 15 Aug 2018 16:26:59 +0100 Subject: [PATCH 26/27] display 'Select Items ...' in MultipleSelectionCombo when no items are selected --- .../org/csstudio/ui/util/widgets/MultipleSelectionCombo.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java b/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java index 1a6e23e9ce2..fffcee6265d 100644 --- a/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java +++ b/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java @@ -142,6 +142,7 @@ public void propertyChange(PropertyChangeEvent e) { text = new Text(this, SWT.BORDER); GridData gd = new GridData(SWT.FILL, 0, true, false); text.setLayoutData(gd); + text.setText("Select Items ..."); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { @@ -346,6 +347,8 @@ private void updateText() { buf.append(stringRepresention(items.get(index))); } text.setText(buf.toString()); + if (selectionIndex.size() == 0) + text.setText("Select Items ..."); text.setSelection(buf.length()); } From 78fe82901d713f0a71ca1c9bb509069efee2493e Mon Sep 17 00:00:00 2001 From: Sky French Date: Thu, 16 Aug 2018 09:18:19 +0100 Subject: [PATCH 27/27] ensure MultipleSelectionCombo dissapears on click elsewhere --- .../org/csstudio/ui/util/widgets/MultipleSelectionCombo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java b/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java index fffcee6265d..9ccfd76ac82 100644 --- a/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java +++ b/core/ui/ui-plugins/org.csstudio.ui.util/src/org/csstudio/ui/util/widgets/MultipleSelectionCombo.java @@ -372,7 +372,7 @@ private void drop(boolean drop) { /** Create shell that simulates drop-down */ private void createPopup() { - popup = new Shell(getShell(), SWT.NO_TRIM | SWT.ON_TOP); + popup = new Shell(getShell(), SWT.NO_TRIM); popup.setLayout(new GridLayout()); popup.setToolTipText(tool_tip);