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 f4e186771ab0db550d43031a58cb8e0d9c47d5e4..92fd70593baaf23644cdde58b20e60bd9571c1a8 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 @@ -35,6 +35,7 @@ import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; @@ -60,6 +61,8 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType; */ public class DataSetMetadataPanel extends JPanel { + private static final String EMPTY_FILE_SELECTION = ""; + private static final long serialVersionUID = 1L; private final JFrame mainWindow; @@ -74,6 +77,8 @@ public class DataSetMetadataPanel extends JPanel private final JPanel dataSetTypePanel; + private final JComboBox dataSetFileComboBox; + private final JButton dataSetFileButton; private final JRadioButton experimentButton; @@ -104,7 +109,11 @@ public class DataSetMetadataPanel extends JPanel dataSetTypeComboBox = new JComboBox(); dataSetTypePanel = new JPanel(); - dataSetFileButton = new JButton(""); + + String[] initialOptions = + { EMPTY_FILE_SELECTION }; + dataSetFileComboBox = new JComboBox(initialOptions); + dataSetFileButton = new JButton("Browse..."); createGui(); } @@ -119,7 +128,7 @@ public class DataSetMetadataPanel extends JPanel { if (null == newDataSetInfo) { - ownerIdText.setText(""); + ownerIdText.setText(EMPTY_FILE_SELECTION); updateFileLabel(); disableAllWidgets(); return; @@ -194,7 +203,31 @@ public class DataSetMetadataPanel extends JPanel JLabel label = new JLabel("File:", JLabel.TRAILING); label.setPreferredSize(new Dimension(LABEL_WIDTH, BUTTON_HEIGHT)); - dataSetFileButton.setPreferredSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); + dataSetFileComboBox.setPreferredSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); + dataSetFileComboBox.addItemListener(new ItemListener() + { + + public void itemStateChanged(ItemEvent e) + { + if (null == newDataSetInfo) + { + return; + } + + Object selectedItem = e.getItem(); + if (null == selectedItem || EMPTY_FILE_SELECTION == selectedItem) + { + newDataSetInfo.getNewDataSetBuilder().setFile(null); + } else + { + newDataSetInfo.getNewDataSetBuilder().setFile((File) selectedItem); + } + + notifyObserversOfChanges(); + } + + }); + dataSetFileButton.setPreferredSize(new Dimension(40, BUTTON_HEIGHT)); dataSetFileButton.setToolTipText("The file to upload."); dataSetFileButton.addActionListener(new ActionListener() { @@ -211,13 +244,15 @@ public class DataSetMetadataPanel extends JPanel if (newDirOrNull != null) { newDataSetInfo.getNewDataSetBuilder().setFile(newDirOrNull); + clientModel.userDidSelectFile(newDirOrNull); + updateFileComboBoxList(); updateFileLabel(); notifyObserversOfChanges(); } } }); - addRow(1, label, dataSetFileButton); + addRow(1, label, dataSetFileComboBox, dataSetFileButton); // The owner row label = new JLabel("Owner:", JLabel.TRAILING); @@ -303,16 +338,34 @@ public class DataSetMetadataPanel extends JPanel clientModel.notifyObserversOfChanges(newDataSetInfo); } + private void updateFileComboBoxList() + { + dataSetFileComboBox.removeAllItems(); + ArrayList<File> files = new ArrayList<File>(clientModel.getUserSelectedFiles()); + Collections.sort(files); + for (File file : files) + { + dataSetFileComboBox.addItem(file); + } + dataSetFileComboBox.addItem(EMPTY_FILE_SELECTION); + } + protected void updateFileLabel() { if (null == newDataSetInfo) { - dataSetFileButton.setText(""); + // Select the empty string + dataSetFileComboBox.setSelectedItem(EMPTY_FILE_SELECTION); return; } File file = newDataSetInfo.getNewDataSetBuilder().getFile(); - String filePath = (null != file) ? file.getAbsolutePath() : ""; - dataSetFileButton.setText(filePath); + if (null != file) + { + dataSetFileComboBox.setSelectedItem(file); + } else + { + dataSetFileComboBox.setSelectedItem(EMPTY_FILE_SELECTION); + } } private void createDataSetTypePanel() @@ -353,6 +406,27 @@ public class DataSetMetadataPanel extends JPanel } } + private void addRow(int rowy, Component label, Component field, Component button) + { + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = rowy; + c.weightx = 0; + c.weighty = 0; + c.insets = new Insets((rowy > 0) ? 5 : 0, 0, 0, 5); + add(label, c); + c.gridx = 1; + c.weightx = 0.5; + c.insets = new Insets((rowy > 0) ? 5 : 0, 0, 0, 5); + add(field, c); + + ++c.gridx; + c.weightx = 0; + c.insets = new Insets((rowy > 0) ? 5 : 0, 0, 0, 0); + add(button, c); + } + private void addRow(int rowy, Component label, Component field) { GridBagConstraints c = new GridBagConstraints(); @@ -421,4 +495,5 @@ public class DataSetMetadataPanel extends JPanel builder.setDataSetOwnerIdentifier(text); notifyObserversOfChanges(); } + } 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 55d3c9ecbb788ab8ba0c7830fb5596fd2933631a..87d0fa99e1426c60d5ff4312d5ceb9eef7dd7c3f 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 @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.dss.client.api.gui; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -56,6 +57,9 @@ public class DataSetUploadClientModel private final ArrayList<NewDataSetInfo> newDataSetInfos = new ArrayList<NewDataSetInfo>(); + // Track which files a user selected to make share the list of files in the selection combo box. + private final ArrayList<File> userSelectedFiles = new ArrayList<File>(); + // References to UI elements that are looking at the client model -- a way of implementing // obeserver. private DataSetUploadTableModel tableModel; @@ -335,6 +339,11 @@ public class DataSetUploadClientModel } + public void userDidSelectFile(File selectedFile) + { + userSelectedFiles.add(selectedFile); + } + private DataSetType tryDataSetType(String dataSetTypeCode) { if (null == dataSetTypeCode) @@ -353,4 +362,8 @@ public class DataSetUploadClientModel return null; } + public ArrayList<File> getUserSelectedFiles() + { + return userSelectedFiles; + } }