diff --git a/view-simulation-results/src/main/java/org/vcell/N5/UI/ControlButtonsPanel.java b/view-simulation-results/src/main/java/org/vcell/N5/UI/ControlButtonsPanel.java index ebbc9fb..17c3974 100644 --- a/view-simulation-results/src/main/java/org/vcell/N5/UI/ControlButtonsPanel.java +++ b/view-simulation-results/src/main/java/org/vcell/N5/UI/ControlButtonsPanel.java @@ -22,7 +22,6 @@ public class ControlButtonsPanel extends JPanel implements ActionListener { // private final JButton openLocal = new JButton("Open N5 Local"); private final JButton questionMark; - public final JCheckBox includeExampleExports; public final JCheckBox displayAdvancedFeatures; private N5ExportTable n5ExportTable; @@ -31,9 +30,6 @@ public class ControlButtonsPanel extends JPanel implements ActionListener { private PanelState panelState = PanelState.NOTHING_OR_LOADING_IMAGE; public ControlButtonsPanel(){ - includeExampleExports = new JCheckBox("Show Example Exports"); - includeExampleExports.setSelected(!N5ImageHandler.exportedDataExists()); - displayAdvancedFeatures = new JCheckBox("Advanced Features"); openOrCancel = new JButton("Open Virtual Stack"); @@ -54,7 +50,6 @@ public ControlButtonsPanel(){ JPanel bottomRow = new JPanel(new GridBagLayout()); - bottomRow.add(includeExampleExports); gridBagConstraints.gridx = 1; bottomRow.add(displayAdvancedFeatures, gridBagConstraints); gridBagConstraints.gridx = 2; @@ -86,7 +81,6 @@ public ControlButtonsPanel(){ questionMark.addActionListener(this); advancedFeatures.useN5Link.addActionListener(this); // openLocal.addActionListener(this); - includeExampleExports.addActionListener(this); displayAdvancedFeatures.addActionListener(this); dataReduction.addActionListener(this); advancedFeatures.openInMemory.addActionListener(this); @@ -130,8 +124,6 @@ public void actionPerformed(ActionEvent e) { new HelpExplanation().displayHelpMenu(); } else if (e.getSource().equals(advancedFeatures.useN5Link)) { remoteFileSelection.setVisible(true); - } else if (e.getSource().equals(includeExampleExports)){ - n5ExportTable.updateTableData(); } else if (e.getSource().equals(displayAdvancedFeatures)) { advancedFeatures.setVisible(displayAdvancedFeatures.isSelected()); } diff --git a/view-simulation-results/src/main/java/org/vcell/N5/UI/Filters/TimeFilter.java b/view-simulation-results/src/main/java/org/vcell/N5/UI/Filters/TimeFilter.java index 6a29fd7..eb3152a 100644 --- a/view-simulation-results/src/main/java/org/vcell/N5/UI/Filters/TimeFilter.java +++ b/view-simulation-results/src/main/java/org/vcell/N5/UI/Filters/TimeFilter.java @@ -57,10 +57,6 @@ public TimeFilter(){ public void actionPerformed(ActionEvent e) { if (e.getSource().equals(anyInterval) || e.getSource().equals(todayInterval) || e.getSource().equals(monthInterval) || e.getSource().equals(yearlyInterval)) { - if(MainPanel.controlButtonsPanel.includeExampleExports.isSelected()){ - n5ExportTable.updateTableData(); - return; - } n5ExportTable.updateTableData(); } } diff --git a/view-simulation-results/src/main/java/org/vcell/N5/UI/N5ExportTable.java b/view-simulation-results/src/main/java/org/vcell/N5/UI/N5ExportTable.java index ca79296..7645746 100644 --- a/view-simulation-results/src/main/java/org/vcell/N5/UI/N5ExportTable.java +++ b/view-simulation-results/src/main/java/org/vcell/N5/UI/N5ExportTable.java @@ -9,8 +9,6 @@ import org.vcell.N5.retrieving.SimResultsLoader; import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.EtchedBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; @@ -24,14 +22,16 @@ import java.util.*; import java.util.concurrent.TimeUnit; -public class N5ExportTable extends JScrollPane implements ListSelectionListener, SimLoadingListener { - public N5ExportTableModel n5ExportTableModel; +public class N5ExportTable extends JTabbedPane implements ListSelectionListener, SimLoadingListener { + private N5ExportTableModel n5ExportTableModel; private JTable exportListTable; - - private final Border lowerEtchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED); - private final Border exampleBorder = BorderFactory.createTitledBorder(lowerEtchedBorder, "Example Exports"); + private JTable exampleExportListTable; private final Map loadingRowsJobID = new HashMap<>(); + private final JScrollPane personalExportsPanel = new JScrollPane(); + private final JScrollPane exampleExportsPanel = new JScrollPane(); + + private ControlButtonsPanel controlPanel; private ExportDetailsPanel exportDetailsPanel; private TimeFilter timeFilter; @@ -49,7 +49,12 @@ public void initialize(ControlButtonsPanel controlButtonsPanel, ExportDetailsPan N5ImageHandler.loadingManager.addSimLoadingListener(this); n5ExportTableModel = new N5ExportTableModel(); exportListTable = new JTable(n5ExportTableModel); - this.setViewportView(exportListTable); + exampleExportListTable = new JTable(n5ExportTableModel); + personalExportsPanel.setViewportView(exportListTable); + exampleExportsPanel.setViewportView(exampleExportListTable); + + this.addTab("Personal Exports", personalExportsPanel); + this.addTab("Example Exports", exampleExportsPanel); DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer(){ @@ -70,12 +75,14 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole int columns = n5ExportTableModel.getColumnCount(); for (int i = 0; i < columns; i++){ exportListTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); + exampleExportListTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); } this.setPreferredSize(new Dimension(500, 400)); - this.setBorder(BorderFactory.createTitledBorder(lowerEtchedBorder, "Export Table")); exportListTable.getSelectionModel().addListSelectionListener(this); + exampleExportListTable.getSelectionModel().addListSelectionListener(this); + this.setSelectedIndex(N5ImageHandler.exportedDataExists() ? 0 : 1); updateTableData(""); automaticRefresh(); } @@ -95,13 +102,9 @@ public void updateTableData(String strFilter){ void updateTableData(LocalDateTime oldestTimeAllowed, String strFilter){ n5ExportTableModel.resetData(); - if (!controlPanel.includeExampleExports.isSelected()){ - this.setBorder(BorderFactory.createTitledBorder(lowerEtchedBorder, "Personal Exports")); - } else { - this.setBorder(exampleBorder); - } try { - ExportDataRepresentation.FormatExportDataRepresentation formatExportData = N5ImageHandler.exportedDataExists() && !controlPanel.includeExampleExports.isSelected() ? + boolean hasPersonalExports = N5ImageHandler.exportedDataExists() && this.getSelectedIndex() == 0; + ExportDataRepresentation.FormatExportDataRepresentation formatExportData = hasPersonalExports ? N5ImageHandler.getJsonData() : N5ImageHandler.getExampleJSONData(); Stack jobStack = (Stack) formatExportData.formatJobIDs.clone(); @@ -123,7 +126,7 @@ private void automaticRefresh(){ try { while(true){ ExportDataRepresentation.FormatExportDataRepresentation formatExportData = N5ImageHandler.getJsonData(); - if (formatExportData != null && !controlPanel.includeExampleExports.isSelected()){ + if (formatExportData != null && this.getSelectedIndex() == 0){ ExportDataRepresentation.SimulationExportDataRepresentation mostRecentTableEntry = !n5ExportTableModel.tableData.isEmpty() ? n5ExportTableModel.tableData.getFirst() : null; Stack jobStack = formatExportData.formatJobIDs; boolean isUpdated = false; @@ -156,7 +159,8 @@ private void automaticRefresh(){ public void openSelectedRows(boolean openInMemory, boolean performDataReduction, SimResultsLoader.OpenTag openTag){ ArrayList filesToOpen = new ArrayList<>(); - for(int row: exportListTable.getSelectedRows()){ + JTable currentTable = getCurrentTable(); + for(int row: currentTable.getSelectedRows()){ String uri = n5ExportTableModel.getRowData(row).uri; ExportDataRepresentation.SimulationExportDataRepresentation rowData = n5ExportTableModel.getRowData(row); SimResultsLoader simResultsLoader = new SimResultsLoader(uri, rowData.savedFileName, row, rowData.jobID, openTag); @@ -167,7 +171,8 @@ public void openSelectedRows(boolean openInMemory, boolean performDataReduction, } public void copySelectedRowLink(){ - ExportDataRepresentation.SimulationExportDataRepresentation selectedRow = n5ExportTableModel.getRowData(exportListTable.getSelectedRow()); + JTable currentTable = getCurrentTable(); + ExportDataRepresentation.SimulationExportDataRepresentation selectedRow = n5ExportTableModel.getRowData(currentTable.getSelectedRow()); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new StringSelection(selectedRow.uri), null); } @@ -192,9 +197,10 @@ else if (n5ExportTableModel.getRowData(currentRow).jobID.equals(expectedJobID) & @Override public void valueChanged(ListSelectionEvent e) { - int row = exportListTable.getSelectedRow(); + JTable currentTable = getCurrentTable(); + int row = currentTable.getSelectedRow(); exportDetailsPanel.resetExportDetails(); - if (row > exportListTable.getRowCount() || row < 0){ + if (row > currentTable.getRowCount() || row < 0){ controlPanel.disableAllContextDependentButtons(); return; } @@ -206,24 +212,33 @@ public void valueChanged(ListSelectionEvent e) { controlPanel.updateButtonsToMatchState(loadingRow != -1); } + @Override + public void setSelectedIndex(int index) { + super.setSelectedIndex(index); + updateTableData(); + } + public void stopSelectedImageFromLoading(){ - int row = exportListTable.getSelectedRow(); + JTable currentTable = getCurrentTable(); + int row = currentTable.getSelectedRow(); N5ImageHandler.loadingManager.stopLoadingImage(n5ExportTableModel.tableData.get(row).jobID); loadingRowsJobID.remove(row); - exportListTable.repaint(); + currentTable.repaint(); } public void removeSpecificRowFromLoadingRows(int rowNumber){ + JTable currentTable = getCurrentTable(); int realRowNumber = findLoadingRow(rowNumber, rowNumber); loadingRowsJobID.remove(realRowNumber); controlPanel.updateButtonsToMatchState(false); - exportListTable.repaint(); + currentTable.repaint(); } @Override public void simIsLoading(int itemRow, String exportID) { + JTable currentTable = getCurrentTable(); loadingRowsJobID.put(itemRow, exportID); - exportListTable.repaint(); + currentTable.repaint(); } @Override @@ -234,6 +249,18 @@ public void simFinishedLoading(SimResultsLoader loadedResults) { } } + /** + * Required, for there is one table for examples and another for personal exports. The same table + * can not be used for both tabs, because a JComponent can have only one parent. + */ + private JTable getCurrentTable(){ + return this.getSelectedIndex() == 0 ? exportListTable : exampleExportListTable; + } + + public N5ExportTableModel getN5ExportTableModel(){ + return n5ExportTableModel; + } + public static class N5ExportTableModel extends AbstractTableModel { public final ArrayList headers = new ArrayList(){{ add("BioModel"); diff --git a/view-simulation-results/src/main/java/org/vcell/N5/reduction/DataReductionWriter.java b/view-simulation-results/src/main/java/org/vcell/N5/reduction/DataReductionWriter.java index 65c5509..ab9cde6 100644 --- a/view-simulation-results/src/main/java/org/vcell/N5/reduction/DataReductionWriter.java +++ b/view-simulation-results/src/main/java/org/vcell/N5/reduction/DataReductionWriter.java @@ -141,7 +141,7 @@ public void initializeDataSheets(){ public void addMetaData(SimResultsLoader loadedResults){ synchronized (metaDataLock){ N5ExportTable n5ExportTable = MainPanel.n5ExportTable; - ExportDataRepresentation.SimulationExportDataRepresentation data = n5ExportTable.n5ExportTableModel.getRowData(loadedResults.rowNumber); + ExportDataRepresentation.SimulationExportDataRepresentation data = n5ExportTable.getN5ExportTableModel().getRowData(loadedResults.rowNumber); ArrayList newMetaData = new ArrayList<>(); newMetaData.add(loadedResults.userSetFileName); newMetaData.add(data.biomodelName);