From: <cs-...@li...> - 2011-08-31 20:16:09
|
details: http://cs-studio.hg.sourceforge.net/hgweb/cs-studio/cs-studio//hgrepo/c/cs/cs-studio/cs-studio/rev/6d7cdfaa372f changeset: 12342:6d7cdfaa372f user: Gabriele Carcassi <car...@bn...> date: Wed Aug 31 15:26:10 2011 -0400 description: ..utility.channelfinder: making query execute on a different thread. details: http://cs-studio.hg.sourceforge.net/hgweb/cs-studio/cs-studio//hgrepo/c/cs/cs-studio/cs-studio/rev/2b9b1d364bf6 changeset: 12343:2b9b1d364bf6 user: Gabriele Carcassi <car...@bn...> date: Wed Aug 31 15:27:29 2011 -0400 description: ..channel.*: PVTableByProperty now uses a query (instead of just tags). details: http://cs-studio.hg.sourceforge.net/hgweb/cs-studio/cs-studio//hgrepo/c/cs/cs-studio/cs-studio/rev/2fde74f71c0d changeset: 12344:2fde74f71c0d user: Gabriele Carcassi <car...@bn...> date: Wed Aug 31 15:43:31 2011 -0400 description: ..channel.widgets: making sure only rows/columns with data are being displayed. details: http://cs-studio.hg.sourceforge.net/hgweb/cs-studio/cs-studio//hgrepo/c/cs/cs-studio/cs-studio/rev/504307be2065 changeset: 12345:504307be2065 user: Gabriele Carcassi <car...@bn...> date: Wed Aug 31 15:57:21 2011 -0400 description: ..channel.views: save old property selection, so that if query changes old properties are used (if present). diffstat: applications/plugins/org.csstudio.channel.views/src/org/csstudio/channel/views/PVTableByPropertyView.java | 41 ++- applications/plugins/org.csstudio.channel.widgets/src/org/csstudio/channel/widgets/PVTableByPropertyWidget.java | 136 ++++++--- applications/plugins/org.csstudio.utility.channelfinder/src/org/csstudio/utility/channelfinder/ChannelQuery.java | 29 +- 3 files changed, 147 insertions(+), 59 deletions(-) diffs (truncated from 353 to 300 lines): diff -r 5f63052acc46 -r 504307be2065 applications/plugins/org.csstudio.channel.views/src/org/csstudio/channel/views/PVTableByPropertyView.java --- a/applications/plugins/org.csstudio.channel.views/src/org/csstudio/channel/views/PVTableByPropertyView.java Wed Aug 31 14:28:20 2011 -0400 +++ b/applications/plugins/org.csstudio.channel.views/src/org/csstudio/channel/views/PVTableByPropertyView.java Wed Aug 31 15:57:21 2011 -0400 @@ -2,8 +2,12 @@ import gov.bnl.channelfinder.api.ChannelUtil; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.lang.reflect.Constructor; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import org.eclipse.swt.widgets.Composite; @@ -83,15 +87,7 @@ private Composite parent; private void changeQuery(String text) { - tableWidget.setColumnProperty(null); - tableWidget.setRowProperty(null); tableWidget.setChannelQuery(text); - if (tableWidget.getChannels() != null) { - Collection<String> propertyNames = ChannelUtil.getPropertyNames(tableWidget.getChannels()); - rowProperty.setItems(propertyNames.toArray(new String[propertyNames.size()])); - columnProperty.setItems(propertyNames.toArray(new String[propertyNames.size()])); - parent.layout(); - } } @Override @@ -120,6 +116,35 @@ fd_waterfallComposite.left = new FormAttachment(0, 10); fd_waterfallComposite.right = new FormAttachment(100, -10); tableWidget.setLayoutData(fd_waterfallComposite); + tableWidget.addPropertyChangeListener(new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if ("channels".equals(evt.getPropertyName())) { + if (tableWidget.getChannels() != null) { + List<String> propertyNames = new ArrayList<String>(ChannelUtil.getPropertyNames(tableWidget.getChannels())); + Collections.sort(propertyNames); + + // Save old selection + String oldRow = null; + if (rowProperty.getSelectionIndex() != -1) + oldRow = rowProperty.getItem(rowProperty.getSelectionIndex()); + String oldColumn = null; + if (columnProperty.getSelectionIndex() != -1) + oldColumn = columnProperty.getItem(columnProperty.getSelectionIndex()); + + // Change properties to select + rowProperty.setItems(propertyNames.toArray(new String[propertyNames.size()])); + columnProperty.setItems(propertyNames.toArray(new String[propertyNames.size()])); + + // Try to keep old selection + rowProperty.select(propertyNames.indexOf(oldRow)); + columnProperty.select(propertyNames.indexOf(oldColumn)); + } + PVTableByPropertyView.this.parent.layout(); + } + } + }); ComboHistoryHelper name_helper = new ComboHistoryHelper(Activator.getDefault() diff -r 5f63052acc46 -r 504307be2065 applications/plugins/org.csstudio.channel.widgets/src/org/csstudio/channel/widgets/PVTableByPropertyWidget.java --- a/applications/plugins/org.csstudio.channel.widgets/src/org/csstudio/channel/widgets/PVTableByPropertyWidget.java Wed Aug 31 14:28:20 2011 -0400 +++ b/applications/plugins/org.csstudio.channel.widgets/src/org/csstudio/channel/widgets/PVTableByPropertyWidget.java Wed Aug 31 15:57:21 2011 -0400 @@ -8,14 +8,21 @@ import static org.epics.pvmanager.util.TimeDuration.ms; import gov.bnl.channelfinder.api.Channel; import gov.bnl.channelfinder.api.ChannelFinderClient; +import gov.bnl.channelfinder.api.ChannelUtil; import gov.bnl.channelfinder.api.Property; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import org.csstudio.utility.channelfinder.CFClientManager; +import org.csstudio.utility.channelfinder.ChannelQuery; +import org.csstudio.utility.channelfinder.ChannelQueryListener; import org.csstudio.utility.pvmanager.ui.SWTUtil; import org.csstudio.utility.pvmanager.widgets.ErrorBar; import org.csstudio.utility.pvmanager.widgets.VTableDisplay; @@ -25,6 +32,8 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; import org.epics.pvmanager.PVManager; import org.epics.pvmanager.PVReader; import org.epics.pvmanager.PVReaderListener; @@ -35,6 +44,7 @@ private VTableDisplay table; private ErrorBar errorBar; + private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); public PVTableByPropertyWidget(Composite parent, int style) { super(parent, style); @@ -61,6 +71,26 @@ errorBar = new ErrorBar(this, SWT.NONE); errorBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + + addPropertyChangeListener(new PropertyChangeListener() { + + List<String> properties = Arrays.asList("channels", "rowProperty", "columnProperty"); + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (properties.contains(evt.getPropertyName())) { + computeTableChannels(); + } + } + }); + + changeSupport.addPropertyChangeListener("channelQuery", new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + queryChannels(); + } + }); } private void setLastException(Exception ex) { @@ -87,10 +117,19 @@ } }; + public void addPropertyChangeListener( PropertyChangeListener listener ) { + changeSupport.addPropertyChangeListener( listener ); + } + + public void removePropertyChangeListener( PropertyChangeListener listener ) { + changeSupport.removePropertyChangeListener( listener ); + } + private void reconnect() { if (pv != null) { pv.close(); pv = null; + table.setVTable(null); } if (columnNames == null || rowNames == null || cellPvs == null || @@ -118,9 +157,9 @@ } public void setChannelQuery(String channelQuery) { + String oldValue = this.channelQuery; this.channelQuery = channelQuery; - queryChannels(); - computeTableChannels(); + changeSupport.firePropertyChange("channelQuery", oldValue, channelQuery); } public String getRowProperty() { @@ -128,8 +167,9 @@ } public void setRowProperty(String rowProperty) { + String oldValue = this.rowProperty; this.rowProperty = rowProperty; - computeTableChannels(); + changeSupport.firePropertyChange("rowProperty", oldValue, rowProperty); } public String getColumnProperty() { @@ -137,8 +177,9 @@ } public void setColumnProperty(String columnProperty) { + String oldValue = this.columnProperty; this.columnProperty = columnProperty; - computeTableChannels(); + changeSupport.firePropertyChange("columnProperty", oldValue, columnProperty); } public Collection<Channel> getChannels() { @@ -147,39 +188,61 @@ private Collection<Channel> channels; + private void setChannels(Collection<Channel> channels) { + Collection<Channel> oldChannels = this.channels; + this.channels = channels; + changeSupport.firePropertyChange("channels", oldChannels, channels); + } + private void queryChannels() { - try { - // Should be done in a background task - channels = CFClientManager.getClient().findByTag(channelQuery); - } catch (Exception e) { - } + setChannels(null); + final ChannelQuery query = ChannelQuery.Builder.query(channelQuery).create(); + query.addChannelQueryListener(new ChannelQueryListener() { + + @Override + public void getQueryResult() { + SWTUtil.swtThread().execute(new Runnable() { + + @Override + public void run() { + Exception e = query.getLastException(); + if (e == null) { + setChannels(query.getResult()); + } else { + errorBar.setException(e); + } + } + }); + + } + }); + query.execute(); } private void computeTableChannels() { // Not have all the bits to prepare the channel list - if (channels == null || rowProperty == null || columnProperty == null) + if (channels == null || rowProperty == null || columnProperty == null) { + columnNames = null; + rowNames = null; + cellPvs = null; + reconnect(); return; + } + + // Filter only the channels that actually have the properties + // If none, then nothing should be shown + Collection<Channel> channelsInTable = ChannelUtil.filterbyProperties(channels, Arrays.asList(rowProperty, columnProperty)); + if (channelsInTable.isEmpty()) { + columnNames = null; + rowNames = null; + cellPvs = null; + reconnect(); + return; + } // Find the rows and columns - List<String> possibleRows = new ArrayList<String>(); - List<String> possibleColumns = new ArrayList<String>(); - // TODO replace this mess when the API gets better - for (Channel channel : channels) { - for (Property prop : channel.getProperties()) { - if (prop.getName().equals(rowProperty)) { - String value = prop.getValue(); - if (value != null && !possibleRows.contains(value)) { - possibleRows.add(value); - } - } - if (prop.getName().equals(columnProperty)) { - String value = prop.getValue(); - if (value != null && !possibleColumns.contains(value)) { - possibleColumns.add(value); - } - } - } - } + List<String> possibleRows = new ArrayList<String>(ChannelUtil.getPropValues(channelsInTable, rowProperty)); + List<String> possibleColumns = new ArrayList<String>(ChannelUtil.getPropValues(channelsInTable, columnProperty)); Collections.sort(possibleRows); Collections.sort(possibleColumns); @@ -192,18 +255,9 @@ cells.add(column); } - for (Channel channel : channels) { - String row = null; - String column = null; - // TODO replace this mess when the API gets better - for (Property prop : channel.getProperties()) { - if (prop.getName().equals(rowProperty)) { - row = prop.getValue(); - } - if (prop.getName().equals(columnProperty)) { - column = prop.getValue(); - } - } + for (Channel channel : channelsInTable) { + String row = channel.getProperty(rowProperty).getValue(); + String column = channel.getProperty(columnProperty).getValue(); int nRow = possibleRows.indexOf(row); int nColumn = possibleColumns.indexOf(column); |