99import org .vcell .N5 .retrieving .SimResultsLoader ;
1010
1111import javax .swing .*;
12- import javax .swing .border .Border ;
13- import javax .swing .border .EtchedBorder ;
1412import javax .swing .event .ListSelectionEvent ;
1513import javax .swing .event .ListSelectionListener ;
1614import javax .swing .table .AbstractTableModel ;
2422import java .util .*;
2523import java .util .concurrent .TimeUnit ;
2624
27- public class N5ExportTable extends JScrollPane implements ListSelectionListener , SimLoadingListener {
28- public N5ExportTableModel n5ExportTableModel ;
25+ public class N5ExportTable extends JTabbedPane implements ListSelectionListener , SimLoadingListener {
26+ private N5ExportTableModel n5ExportTableModel ;
2927 private JTable exportListTable ;
30-
31- private final Border lowerEtchedBorder = BorderFactory .createEtchedBorder (EtchedBorder .LOWERED );
32- private final Border exampleBorder = BorderFactory .createTitledBorder (lowerEtchedBorder , "Example Exports" );
28+ private JTable exampleExportListTable ;
3329 private final Map <Integer , String > loadingRowsJobID = new HashMap <>();
3430
31+ private final JScrollPane personalExportsPanel = new JScrollPane ();
32+ private final JScrollPane exampleExportsPanel = new JScrollPane ();
33+
34+
3535 private ControlButtonsPanel controlPanel ;
3636 private ExportDetailsPanel exportDetailsPanel ;
3737 private TimeFilter timeFilter ;
@@ -49,7 +49,12 @@ public void initialize(ControlButtonsPanel controlButtonsPanel, ExportDetailsPan
4949 N5ImageHandler .loadingManager .addSimLoadingListener (this );
5050 n5ExportTableModel = new N5ExportTableModel ();
5151 exportListTable = new JTable (n5ExportTableModel );
52- this .setViewportView (exportListTable );
52+ exampleExportListTable = new JTable (n5ExportTableModel );
53+ personalExportsPanel .setViewportView (exportListTable );
54+ exampleExportsPanel .setViewportView (exampleExportListTable );
55+
56+ this .addTab ("Personal Exports" , personalExportsPanel );
57+ this .addTab ("Example Exports" , exampleExportsPanel );
5358
5459
5560 DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer (){
@@ -70,12 +75,14 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole
7075 int columns = n5ExportTableModel .getColumnCount ();
7176 for (int i = 0 ; i < columns ; i ++){
7277 exportListTable .getColumnModel ().getColumn (i ).setCellRenderer (cellRenderer );
78+ exampleExportListTable .getColumnModel ().getColumn (i ).setCellRenderer (cellRenderer );
7379 }
7480
7581 this .setPreferredSize (new Dimension (500 , 400 ));
76- this .setBorder (BorderFactory .createTitledBorder (lowerEtchedBorder , "Export Table" ));
7782 exportListTable .getSelectionModel ().addListSelectionListener (this );
83+ exampleExportListTable .getSelectionModel ().addListSelectionListener (this );
7884
85+ this .setSelectedIndex (N5ImageHandler .exportedDataExists () ? 0 : 1 );
7986 updateTableData ("" );
8087 automaticRefresh ();
8188 }
@@ -95,13 +102,9 @@ public void updateTableData(String strFilter){
95102
96103 void updateTableData (LocalDateTime oldestTimeAllowed , String strFilter ){
97104 n5ExportTableModel .resetData ();
98- if (!controlPanel .includeExampleExports .isSelected ()){
99- this .setBorder (BorderFactory .createTitledBorder (lowerEtchedBorder , "Personal Exports" ));
100- } else {
101- this .setBorder (exampleBorder );
102- }
103105 try {
104- ExportDataRepresentation .FormatExportDataRepresentation formatExportData = N5ImageHandler .exportedDataExists () && !controlPanel .includeExampleExports .isSelected () ?
106+ boolean hasPersonalExports = N5ImageHandler .exportedDataExists () && this .getSelectedIndex () == 0 ;
107+ ExportDataRepresentation .FormatExportDataRepresentation formatExportData = hasPersonalExports ?
105108 N5ImageHandler .getJsonData () : N5ImageHandler .getExampleJSONData ();
106109
107110 Stack <String > jobStack = (Stack <String >) formatExportData .formatJobIDs .clone ();
@@ -123,7 +126,7 @@ private void automaticRefresh(){
123126 try {
124127 while (true ){
125128 ExportDataRepresentation .FormatExportDataRepresentation formatExportData = N5ImageHandler .getJsonData ();
126- if (formatExportData != null && ! controlPanel . includeExampleExports . isSelected () ){
129+ if (formatExportData != null && this . getSelectedIndex () == 0 ){
127130 ExportDataRepresentation .SimulationExportDataRepresentation mostRecentTableEntry = !n5ExportTableModel .tableData .isEmpty () ? n5ExportTableModel .tableData .getFirst () : null ;
128131 Stack <String > jobStack = formatExportData .formatJobIDs ;
129132 boolean isUpdated = false ;
@@ -156,7 +159,8 @@ private void automaticRefresh(){
156159
157160 public void openSelectedRows (boolean openInMemory , boolean performDataReduction , SimResultsLoader .OpenTag openTag ){
158161 ArrayList <SimResultsLoader > filesToOpen = new ArrayList <>();
159- for (int row : exportListTable .getSelectedRows ()){
162+ JTable currentTable = getCurrentTable ();
163+ for (int row : currentTable .getSelectedRows ()){
160164 String uri = n5ExportTableModel .getRowData (row ).uri ;
161165 ExportDataRepresentation .SimulationExportDataRepresentation rowData = n5ExportTableModel .getRowData (row );
162166 SimResultsLoader simResultsLoader = new SimResultsLoader (uri , rowData .savedFileName , row , rowData .jobID , openTag );
@@ -167,7 +171,8 @@ public void openSelectedRows(boolean openInMemory, boolean performDataReduction,
167171 }
168172
169173 public void copySelectedRowLink (){
170- ExportDataRepresentation .SimulationExportDataRepresentation selectedRow = n5ExportTableModel .getRowData (exportListTable .getSelectedRow ());
174+ JTable currentTable = getCurrentTable ();
175+ ExportDataRepresentation .SimulationExportDataRepresentation selectedRow = n5ExportTableModel .getRowData (currentTable .getSelectedRow ());
171176 Clipboard clipboard = Toolkit .getDefaultToolkit ().getSystemClipboard ();
172177 clipboard .setContents (new StringSelection (selectedRow .uri ), null );
173178 }
@@ -192,9 +197,10 @@ else if (n5ExportTableModel.getRowData(currentRow).jobID.equals(expectedJobID) &
192197
193198 @ Override
194199 public void valueChanged (ListSelectionEvent e ) {
195- int row = exportListTable .getSelectedRow ();
200+ JTable currentTable = getCurrentTable ();
201+ int row = currentTable .getSelectedRow ();
196202 exportDetailsPanel .resetExportDetails ();
197- if (row > exportListTable .getRowCount () || row < 0 ){
203+ if (row > currentTable .getRowCount () || row < 0 ){
198204 controlPanel .disableAllContextDependentButtons ();
199205 return ;
200206 }
@@ -206,24 +212,33 @@ public void valueChanged(ListSelectionEvent e) {
206212 controlPanel .updateButtonsToMatchState (loadingRow != -1 );
207213 }
208214
215+ @ Override
216+ public void setSelectedIndex (int index ) {
217+ super .setSelectedIndex (index );
218+ updateTableData ();
219+ }
220+
209221 public void stopSelectedImageFromLoading (){
210- int row = exportListTable .getSelectedRow ();
222+ JTable currentTable = getCurrentTable ();
223+ int row = currentTable .getSelectedRow ();
211224 N5ImageHandler .loadingManager .stopLoadingImage (n5ExportTableModel .tableData .get (row ).jobID );
212225 loadingRowsJobID .remove (row );
213- exportListTable .repaint ();
226+ currentTable .repaint ();
214227 }
215228
216229 public void removeSpecificRowFromLoadingRows (int rowNumber ){
230+ JTable currentTable = getCurrentTable ();
217231 int realRowNumber = findLoadingRow (rowNumber , rowNumber );
218232 loadingRowsJobID .remove (realRowNumber );
219233 controlPanel .updateButtonsToMatchState (false );
220- exportListTable .repaint ();
234+ currentTable .repaint ();
221235 }
222236
223237 @ Override
224238 public void simIsLoading (int itemRow , String exportID ) {
239+ JTable currentTable = getCurrentTable ();
225240 loadingRowsJobID .put (itemRow , exportID );
226- exportListTable .repaint ();
241+ currentTable .repaint ();
227242 }
228243
229244 @ Override
@@ -234,6 +249,18 @@ public void simFinishedLoading(SimResultsLoader loadedResults) {
234249 }
235250 }
236251
252+ /**
253+ * Required, for there is one table for examples and another for personal exports. The same table
254+ * can not be used for both tabs, because a JComponent can have only one parent.
255+ */
256+ private JTable getCurrentTable (){
257+ return this .getSelectedIndex () == 0 ? exportListTable : exampleExportListTable ;
258+ }
259+
260+ public N5ExportTableModel getN5ExportTableModel (){
261+ return n5ExportTableModel ;
262+ }
263+
237264 public static class N5ExportTableModel extends AbstractTableModel {
238265 public final ArrayList <String > headers = new ArrayList <String >(){{
239266 add ("BioModel" );
0 commit comments