diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialog.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialog.java index dc7a13f83788e55aa8a99704cd3d55198e298257..39617de26e8ebfa8ded3bdec2d0ce0a54b84eb19 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialog.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialog.java @@ -16,27 +16,122 @@ package ch.systemsx.cisd.openbis.dss.client.api.gui; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Timer; + +import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; /** * @author Chandrasekhar Ramakrishnan + * @author Kaloyan Enimanev */ public abstract class AbstractEntityPickerDialog extends JDialog { + private static final long serialVersionUID = 1L; + + /** + * do not spawn one thread for each subclass. + */ + protected static final Timer scheduler = new Timer(); + protected final JFrame mainWindow; + protected final JButton refreshButton; + + protected final DataSetUploadClientModel clientModel; + /** * @param mainWindow The parent window of thie dialog * @param title The title of the window + * @param clientModel the client model used for connecting to the openBIS server and for + * caching. */ - public AbstractEntityPickerDialog(JFrame mainWindow, String title) + public AbstractEntityPickerDialog(JFrame mainWindow, String title, + DataSetUploadClientModel clientModel) { super(mainWindow, title, true); this.mainWindow = mainWindow; + + this.clientModel = clientModel; + + this.refreshButton = createRefreshButton(); } - private static final long serialVersionUID = 1L; + /** + * populates the dialog based on content cached in {@link #clientModel}. + */ + protected abstract void setDialogData(); + + protected JButton createRefreshButton() + { + final JButton button = new JButton(); + button.setText("Refresh"); + button.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + button.setEnabled(false); + refresh(); + } + }); + return button; + } + + protected void refresh() + { + new Thread() + { + @Override + public void run() + { + // reload data + clientModel.reloadDataFromServer(); + + // update UI + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + setDialogData(); + refreshButton.setEnabled(true); + } + }); + } + }.start(); + } + + protected static JPanel createFilterAndRefreshButtonPanel(JTextField textField, + JButton refreshButton) + { + JPanel innerPanel = new JPanel(new BorderLayout()); + innerPanel.setMaximumSize(new Dimension(9999, 30)); + + refreshButton.setMargin(new Insets(refreshButton.getMargin().top, 2, refreshButton + .getMargin().bottom, 2)); + + innerPanel.add(textField, BorderLayout.CENTER); + innerPanel.add(refreshButton, BorderLayout.EAST); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.weightx = 1.0; + + JPanel outerPanel = new JPanel(new GridBagLayout()); + outerPanel.add(innerPanel, gbc); + + return outerPanel; + } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialogWithServerConnection.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialogWithServerConnection.java deleted file mode 100644 index 06891d347bcfd978c0741b25afe07bd557a69584..0000000000000000000000000000000000000000 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialogWithServerConnection.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.dss.client.api.gui; - -import java.util.Timer; - -import javax.swing.JFrame; - -import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade; - -/** - * @author Chandrasekhar Ramakrishnan - */ -public abstract class AbstractEntityPickerDialogWithServerConnection extends - AbstractEntityPickerDialog -{ - - protected final IOpenbisServiceFacade openbisService; - - protected final Timer scheduler = new Timer(); - - /** - * @param mainWindow - * @param title - */ - public AbstractEntityPickerDialogWithServerConnection(JFrame mainWindow, String title, - final IOpenbisServiceFacade openbisService) - { - super(mainWindow, title); - this.openbisService = openbisService; - } - - private static final long serialVersionUID = 1L; - -} diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerPanel.java index c09bee169b1fafb5e59b3ff09d5dbcaa37b3c7da..e838d295fbb7cb9540a8c652b7e1bdde037dc486 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerPanel.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerPanel.java @@ -36,16 +36,12 @@ import java.awt.BorderLayout; import java.awt.Insets; import java.awt.event.ActionListener; import java.awt.event.FocusListener; -import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; -import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; - /** * @author Pawel Glyzewski */ @@ -70,8 +66,7 @@ public abstract class AbstractEntityPickerPanel extends JPanel implements Action private final JButton button = new JButton("..."); - public AbstractEntityPickerPanel(final JFrame mainWindow, List<Experiment> experiments, - IOpenbisServiceFacade openbisService) + public AbstractEntityPickerPanel(final JFrame mainWindow) { super(new BorderLayout()); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java index d1cf5a3ebe85947fddfc431528e763807ee02f76..a265daa6eeec9d0829e6d969b74709fadfbde981 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java @@ -184,19 +184,9 @@ public class DataSetMetadataPanel extends JPanel implements Observer // Initialize the fields in the gui ownerIdLabel = new JLabel("Owner:", JLabel.TRAILING); - samplePanel = - new SamplePickerPanel(mainWindow, clientModel.getOpenBISService() - .listExperimentsHavingSamplesForProjects( - clientModel.getProjectIdentifiers()), - clientModel.getOpenBISService()); - dataSetPanel = - new DataSetPickerPanel(mainWindow, clientModel.getOpenBISService() - .listExperimentsHavingDataSetsForProjects( - clientModel.getProjectIdentifiers()), - clientModel.getOpenBISService()); - experimentPicker = - new ExperimentPickerPanel(mainWindow, clientModel.getExperiments(), - clientModel.getOpenBISService()); + samplePanel = new SamplePickerPanel(mainWindow, clientModel); + dataSetPanel = new DataSetPickerPanel(mainWindow, clientModel); + experimentPicker = new ExperimentPickerPanel(mainWindow, clientModel); ownerIdPanel = new JPanel(new CardLayout()); ownerComboBox = new JComboBox(DataSetOwnerType.values()); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerDialog.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerDialog.java index ce749335c42e3821c4e80329ae7c2bfec208c1d5..9183b4d1aee5b025c3d41e71493a9c2bb5ca7827 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerDialog.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerDialog.java @@ -28,6 +28,7 @@ import java.util.TimerTask; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTree; @@ -44,14 +45,13 @@ import javax.swing.tree.TreeSelectionModel; import ch.systemsx.cisd.openbis.dss.client.api.gui.tree.FilterableMutableTreeNode; import ch.systemsx.cisd.openbis.dss.client.api.v1.DataSet; -import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample; /** * @author Pawel Glyzewski */ -public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerConnection implements +public class DataSetPickerDialog extends AbstractEntityPickerDialog implements TreeWillExpandListener { private static final long serialVersionUID = 1L; @@ -62,31 +62,41 @@ public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerCon private final JOptionPane optionPane; - /** - * @param mainWindow - * @param experiments - * @param openbisService - */ - public DataSetPickerDialog(JFrame mainWindow, List<Experiment> experiments, - final IOpenbisServiceFacade openbisService) + public DataSetPickerDialog(JFrame mainWindow, DataSetUploadClientModel clientModel) { - super(mainWindow, "Pick a data set", openbisService); + super(mainWindow, "Pick a data set", clientModel); - FilterableMutableTreeNode top = new FilterableMutableTreeNode("Experiments"); - createNodes(top, experiments); - tree = new JTree(top); + tree = new JTree(); tree.addTreeWillExpandListener(this); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - filterField = createFilterField(top, tree); + filterField = createFilterField(); - optionPane = createOptionPane(filterField, tree, this); + JPanel northPanel = createFilterAndRefreshButtonPanel(filterField, refreshButton); + optionPane = createOptionPane(northPanel, tree, this); addTreeSelectionListener(); + setDialogData(); this.setContentPane(optionPane); } + @Override + protected void setDialogData() + { + FilterableMutableTreeNode top = new FilterableMutableTreeNode("Experiments"); + + final List<String> projectIdentifiers = clientModel.getProjectIdentifiers(); + List<Experiment> experiments = + clientModel.getOpenBISService().listExperimentsHavingDataSetsForProjects( + projectIdentifiers); + createNodes(top, experiments); + + DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel(); + treeModel.setRoot(top); + updateTreeSelection(); + } + /** * Treat double click and return the same as clicking the ok button. */ @@ -105,13 +115,13 @@ public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerCon }); } - private static JOptionPane createOptionPane(JTextField filterField, final JTree tree, + private static JOptionPane createOptionPane(final JPanel northPanel, final JTree tree, final JDialog parent) { final JScrollPane scrollPane = new JScrollPane(tree); Object[] objects = new Object[] - { "Filter experiments: ", filterField, "Select data set:", scrollPane }; + { "Filter experiments: ", northPanel, "Select data set:", scrollPane }; final JOptionPane optionPane = new JOptionPane(objects, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION); optionPane.addPropertyChangeListener(new PropertyChangeListener() @@ -157,33 +167,37 @@ public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerCon } } - private static JTextField createFilterField(final FilterableMutableTreeNode treeNode, - final JTree tree) + private JTextField createFilterField() { - final JTextField filterField = new JTextField(); - filterField.setEditable(true); - filterField.getDocument().addDocumentListener(new DocumentListener() + final JTextField textField = new JTextField(); + textField.setEditable(true); + textField.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { - treeNode.filter(filterField.getText()); - ((DefaultTreeModel) tree.getModel()).reload(); + updateTreeSelection(); } public void insertUpdate(DocumentEvent e) { - treeNode.filter(filterField.getText()); - ((DefaultTreeModel) tree.getModel()).reload(); + updateTreeSelection(); } public void changedUpdate(DocumentEvent e) { - treeNode.filter(filterField.getText()); - ((DefaultTreeModel) tree.getModel()).reload(); + updateTreeSelection(); } }); - return filterField; + return textField; + } + + private void updateTreeSelection() + { + DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel(); + FilterableMutableTreeNode rootNode = (FilterableMutableTreeNode) treeModel.getRoot(); + rootNode.filter(filterField.getText()); + treeModel.reload(); } public String pickDataSet() @@ -290,27 +304,29 @@ public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerCon protected List<DataSet> listExperimentDataSets(TreeExpansionEvent event) { + final List<String> experimentId = + Collections.singletonList(event.getPath().getLastPathComponent().toString()); List<DataSet> dataSets = - openbisService.listDataSetsForExperiments(Collections.singletonList(event - .getPath().getLastPathComponent().toString())); + clientModel.getOpenBISService().listDataSetsForExperiments(experimentId); UploadClientSortingUtils.sortDataSetsByCode(dataSets); return dataSets; } protected List<Sample> listExperimentSamples(TreeExpansionEvent event) { + final List<String> experimentId = + Collections.singletonList(event.getPath().getLastPathComponent().toString()); List<Sample> samples = - openbisService.listSamplesForExperiments(Collections.singletonList(event - .getPath().getLastPathComponent().toString())); + clientModel.getOpenBISService().listSamplesForExperiments(experimentId); UploadClientSortingUtils.sortSamplesByIdentifier(samples); return samples; } protected List<DataSet> listSampleDataSets(TreeExpansionEvent event) { - List<DataSet> dataSets = - openbisService.listDataSetsForSamples(Collections.singletonList(event.getPath() - .getLastPathComponent().toString())); + final List<String> sampleId = Collections.singletonList(event.getPath() + .getLastPathComponent().toString()); + List<DataSet> dataSets = clientModel.getOpenBISService().listDataSetsForSamples(sampleId); UploadClientSortingUtils.sortDataSetsByCode(dataSets); return dataSets; } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerPanel.java index b4d4217292e2b15ce0ccceb2bfae6ce8a5e5c399..89aa0db1460d6da44801ea6cef6b4b085c43d8a4 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerPanel.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerPanel.java @@ -17,13 +17,9 @@ package ch.systemsx.cisd.openbis.dss.client.api.gui; import java.awt.event.ActionEvent; -import java.util.List; import javax.swing.JFrame; -import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; - /** * @author Pawel Glyzewski */ @@ -33,12 +29,11 @@ public class DataSetPickerPanel extends AbstractEntityPickerPanel private final DataSetPickerDialog dialog; - public DataSetPickerPanel(final JFrame mainWindow, List<Experiment> experiments, - IOpenbisServiceFacade openbisService) + public DataSetPickerPanel(final JFrame mainWindow, final DataSetUploadClientModel clientModel) { - super(mainWindow, experiments, openbisService); + super(mainWindow); - dialog = new DataSetPickerDialog(mainWindow, experiments, openbisService); + dialog = new DataSetPickerDialog(mainWindow, clientModel); } public void actionPerformed(ActionEvent e) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java index a8b8a39b5a57adec2edad99139f3f5195e8d9f2c..ca61c4d270d2b529dbfda8363cd0086e5fce7852 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java @@ -98,6 +98,11 @@ public class DataSetUploadClientModel this.openBISService = commState.getOpenBISService(); this.timeProvider = timeProvider; + reloadDataFromServer(); + } + + public void reloadDataFromServer() + { DataSetTypeFilter filter = new DataSetTypeFilter( System.getProperty(ResourceNames.CREATABLE_DATA_SET_TYPES_WHITELIST), @@ -574,12 +579,12 @@ public class DataSetUploadClientModel public List<Experiment> getExperiments() { - return experiments; + return Collections.unmodifiableList(experiments); } public List<String> getProjectIdentifiers() { - return projectIdentifiers; + return Collections.unmodifiableList(projectIdentifiers); } public Vocabulary getVocabulary(String code) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerDialog.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerDialog.java index 32552882ebd3a7e3b3891098755820d752a5df2e..5c23715048677965fc60a0869d58884206d23dc8 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerDialog.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerDialog.java @@ -28,6 +28,7 @@ import java.util.List; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; @@ -55,29 +56,32 @@ public class ExperimentPickerDialog extends AbstractEntityPickerDialog private final JTable table; - final JTextField filterField; + private final JTextField filterField; private final JOptionPane optionPane; - public ExperimentPickerDialog(JFrame mainWindow, List<Experiment> experiments) + public ExperimentPickerDialog(JFrame mainWindow, DataSetUploadClientModel clientModel) { - super(mainWindow, "Pick an experiment"); + super(mainWindow, "Pick an experiment", clientModel); - table = createTable(prepareData(experiments)); + table = createTable(); filterField = createFilterField(table); - optionPane = createOptionPane(filterField, table, this); + + JPanel northPanel = createFilterAndRefreshButtonPanel(filterField, refreshButton); + optionPane = createOptionPane(northPanel, table, this); createTableListener(table, optionPane); + setDialogData(); this.setContentPane(optionPane); } - private static JOptionPane createOptionPane(JTextField filterField, final JTable table, + private static JOptionPane createOptionPane(JPanel northPanel, final JTable table, final JDialog parent) { final JScrollPane scrollPane = new JScrollPane(table); Object[] objects = new Object[] - { "Filter experiments: ", filterField, "Select Experiment:", scrollPane }; + { "Filter experiments: ", northPanel, "Select Experiment:", scrollPane }; final JOptionPane optionPane = new JOptionPane(objects, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION); optionPane.addPropertyChangeListener(new PropertyChangeListener() @@ -120,10 +124,9 @@ public class ExperimentPickerDialog extends AbstractEntityPickerDialog return data; } - private static JTable createTable(List<String[]> data) + private static JTable createTable() { - final JTable table = new JTable(new SortableFilterableTableModel(data, HEADERS)); - + final JTable table = new JTable(); table.setPreferredScrollableViewportSize(new Dimension(500, 150)); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); @@ -132,10 +135,6 @@ public class ExperimentPickerDialog extends AbstractEntityPickerDialog { table.getColumnModel().getColumn(i).setPreferredWidth(110); } - table.getColumnModel().getColumn(3).setPreferredWidth(200); - - header.addMouseListener(new TableHeaderMouseListener((SortableFilterableTableModel) table - .getModel())); header.setDefaultRenderer(new SortButtonRenderer()); return table; @@ -190,6 +189,18 @@ public class ExperimentPickerDialog extends AbstractEntityPickerDialog return filterField; } + @Override + protected void setDialogData() + { + List<Experiment> experiments = clientModel.getExperiments(); + final SortableFilterableTableModel model = + new SortableFilterableTableModel(prepareData(experiments), HEADERS); + table.setModel(model); + table.getTableHeader().addMouseListener(new TableHeaderMouseListener(model)); + model.filter(filterField.getText()); + table.getColumnModel().getColumn(3).setPreferredWidth(200); + } + public String pickExperiment() { this.pack(); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerPanel.java index f9733c211ccc4faf01aa7a5fb03dbbf303e598d8..c60103ed2c7534c0391bd3cb8ac4227e14f2a885 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerPanel.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerPanel.java @@ -17,13 +17,9 @@ package ch.systemsx.cisd.openbis.dss.client.api.gui; import java.awt.event.ActionEvent; -import java.util.List; import javax.swing.JFrame; -import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; - /** * @author Pawel Glyzewski */ @@ -33,12 +29,11 @@ public class ExperimentPickerPanel extends AbstractEntityPickerPanel private final ExperimentPickerDialog dialog; - public ExperimentPickerPanel(final JFrame mainWindow, final List<Experiment> experiments, - IOpenbisServiceFacade openbisServiceFacade) + public ExperimentPickerPanel(final JFrame mainWindow, DataSetUploadClientModel clientModel) { - super(mainWindow, experiments, openbisServiceFacade); + super(mainWindow); - dialog = new ExperimentPickerDialog(mainWindow, experiments); + dialog = new ExperimentPickerDialog(mainWindow, clientModel); } public void actionPerformed(ActionEvent e) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerDialog.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerDialog.java index fabba382f3324887726d82b28ec82a40842d1ef9..c6b2d4143d0186a2985b6970be160cb1b1c73584 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerDialog.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerDialog.java @@ -27,6 +27,7 @@ import java.util.TimerTask; import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTree; @@ -42,14 +43,13 @@ import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import ch.systemsx.cisd.openbis.dss.client.api.gui.tree.FilterableMutableTreeNode; -import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample; /** * @author Pawel Glyzewski */ -public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConnection implements +public class SamplePickerDialog extends AbstractEntityPickerDialog implements TreeWillExpandListener { private static final long serialVersionUID = 1L; @@ -60,31 +60,43 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn private final JOptionPane optionPane; - /** - * @param mainWindow - * @param experiments - * @param openbisService - */ - public SamplePickerDialog(JFrame mainWindow, List<Experiment> experiments, - final IOpenbisServiceFacade openbisService) + public SamplePickerDialog(JFrame mainWindow, DataSetUploadClientModel clientModel) { - super(mainWindow, "Pick a sample", openbisService); + super(mainWindow, "Pick a sample", clientModel); - FilterableMutableTreeNode top = new FilterableMutableTreeNode("Experiments"); - createNodes(top, experiments); - tree = new JTree(top); + tree = new JTree(); + tree.setModel(new DefaultTreeModel(null)); tree.addTreeWillExpandListener(this); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - filterField = createFilterField(top, tree); + filterField = createFilterField(); - optionPane = createOptionPane(tree, filterField, this); + JPanel northPanel = createFilterAndRefreshButtonPanel(filterField, refreshButton); + optionPane = createOptionPane(tree, northPanel, this); addTreeSelectionListener(); + setDialogData(); this.setContentPane(optionPane); } + @Override + protected void setDialogData() + { + FilterableMutableTreeNode top = new FilterableMutableTreeNode("Experiments"); + + final List<String> projectIdentifiers = clientModel.getProjectIdentifiers(); + List<Experiment> experiments = + clientModel.getOpenBISService().listExperimentsHavingSamplesForProjects( + projectIdentifiers); + createNodes(top, experiments); + + DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel(); + treeModel.setRoot(top); + updateTreeSelection(); + } + + /** * Treat double click and return the same as clicking the ok button. */ @@ -103,13 +115,13 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn }); } - private static JOptionPane createOptionPane(final JTree tree, final JTextField filterField, + private static JOptionPane createOptionPane(final JTree tree, final JPanel northPanel, final SamplePickerDialog parent) { final JScrollPane scrollPane = new JScrollPane(tree); Object[] objects = new Object[] - { "Filter experiments: ", filterField, "Select Sample:", scrollPane }; + { "Filter experiments: ", northPanel, "Select Sample:", scrollPane }; final JOptionPane theOptionPane = new JOptionPane(objects, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION); @@ -180,33 +192,41 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn } } - private static JTextField createFilterField(final FilterableMutableTreeNode treeNode, - final JTree tree) + private JTextField createFilterField() { - final JTextField filterField = new JTextField(); - filterField.setEditable(true); - filterField.getDocument().addDocumentListener(new DocumentListener() + final JTextField textField = new JTextField(); + textField.setEditable(true); + textField.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { - treeNode.filter(filterField.getText()); - ((DefaultTreeModel) tree.getModel()).reload(); + updateTreeSelection(); } public void insertUpdate(DocumentEvent e) { - treeNode.filter(filterField.getText()); - ((DefaultTreeModel) tree.getModel()).reload(); + updateTreeSelection(); } public void changedUpdate(DocumentEvent e) { - treeNode.filter(filterField.getText()); - ((DefaultTreeModel) tree.getModel()).reload(); + updateTreeSelection(); } + }); - return filterField; + return textField; + } + + private void updateTreeSelection() + { + DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel(); + FilterableMutableTreeNode rootNode = (FilterableMutableTreeNode) treeModel.getRoot(); + if (rootNode != null) + { + rootNode.filter(filterField.getText()); + } + treeModel.reload(); } public String pickSample() @@ -275,9 +295,10 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn protected List<Sample> listSortedSamples(TreeExpansionEvent event) { + final List<String> experimentId = + Collections.singletonList(event.getPath().getLastPathComponent().toString()); List<Sample> samples = - openbisService.listSamplesForExperiments(Collections.singletonList(event.getPath() - .getLastPathComponent().toString())); + clientModel.getOpenBISService().listSamplesForExperiments(experimentId); UploadClientSortingUtils.sortSamplesByIdentifier(samples); return samples; } @@ -290,4 +311,5 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn node.removeAllChildren(); node.add(new DefaultMutableTreeNode("dummy child")); } + } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerPanel.java index 3a44f109a2a548da67e388d0f85bdfafa8e7e43b..5336ac80b868d64d8af3ef81a727d166c6a0445f 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerPanel.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerPanel.java @@ -17,13 +17,9 @@ package ch.systemsx.cisd.openbis.dss.client.api.gui; import java.awt.event.ActionEvent; -import java.util.List; import javax.swing.JFrame; -import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; - /** * @author Pawel Glyzewski */ @@ -33,12 +29,11 @@ public class SamplePickerPanel extends AbstractEntityPickerPanel private final SamplePickerDialog dialog; - public SamplePickerPanel(final JFrame mainWindow, List<Experiment> experiments, - IOpenbisServiceFacade openbisService) + public SamplePickerPanel(final JFrame mainWindow, DataSetUploadClientModel clientModel) { - super(mainWindow, experiments, openbisService); + super(mainWindow); - dialog = new SamplePickerDialog(mainWindow, experiments, openbisService); + dialog = new SamplePickerDialog(mainWindow, clientModel); } public void actionPerformed(ActionEvent e)