package com.opendoorlogistics.studio.components.map.plugins.selection; import gnu.trove.list.array.TLongArrayList; import gnu.trove.set.hash.TIntHashSet; import java.awt.BorderLayout; import java.util.ArrayList; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.plaf.basic.BasicTabbedPaneUI; import com.opendoorlogistics.api.tables.ODLDatastore; import com.opendoorlogistics.api.tables.ODLDatastoreUndoable; import com.opendoorlogistics.api.tables.ODLTable; import com.opendoorlogistics.api.tables.ODLTableAlterable; import com.opendoorlogistics.api.tables.ODLTableReadOnly; import com.opendoorlogistics.api.ui.Disposable; import com.opendoorlogistics.core.tables.decorators.datastores.RowFilterDecorator; import com.opendoorlogistics.studio.tables.grid.PreferredColumnWidths; class TablesPanel extends JPanel implements Disposable { protected final JTabbedPane tabbedPane; protected final ODLDatastoreUndoable<? extends ODLTableAlterable> globalDs; protected final PreferredColumnWidths preferredColumnWidths = new PreferredColumnWidths(); final RowFilterDecorator<? extends ODLTable> filteredDs; TablesPanel(ODLDatastoreUndoable<? extends ODLTableAlterable> globalDs) { this.globalDs = globalDs; setLayout(new BorderLayout()); tabbedPane = new JTabbedPane(); tabbedPane.setUI(new BasicTabbedPaneUI() { @Override protected int calculateTabAreaHeight(int tab_placement, int run_count, int max_tab_height) { // hide tab header if only one class selected if (tabbedPane.getTabCount() > 1) return super.calculateTabAreaHeight(tab_placement, run_count, max_tab_height); else return 0; } }); add(tabbedPane, BorderLayout.CENTER); filteredDs = new RowFilterDecorator<>(globalDs); } void updateTableTabs(boolean singleRowSelection, ODLGridTableFactory tableFactory) { // delete tabs as needed int i = 0; TIntHashSet existingTableTableIds = new TIntHashSet(); while (i < tabbedPane.getTabCount()) { SingleTableTab tab = (SingleTableTab) tabbedPane.getComponentAt(i); ODLTableReadOnly table = filteredDs.getTableByImmutableId(tab.tableId); if (table == null || table.getRowCount() == 0) { tab.dispose(); tabbedPane.remove(i); } else { // update name if (tabbedPane.getTitleAt(i).equals(table.getName()) == false) { tabbedPane.setTitleAt(i, table.getName()); } // update data tab.updateData(); existingTableTableIds.add(tab.tableId); i++; } } // create tabs as needed for (i = 0; i < filteredDs.getTableCount(); i++) { ODLTableReadOnly table = filteredDs.getTableAt(i); if (existingTableTableIds.contains(table.getImmutableId()) == false && table.getRowCount() > 0) { SingleTableTab tab = new SingleTableTab( table.getImmutableId(),tableFactory); tabbedPane.addTab(table.getName(), tab); } } } @Override public void dispose() { int i = 0; while (i < tabbedPane.getTabCount()) { SingleTableTab tab = (SingleTableTab) tabbedPane.getComponentAt(i); tab.dispose(); i++; } } public long [] getRowIds(boolean selectedOnly){ TLongArrayList ret = new TLongArrayList(); for(int i =0 ; i < tabbedPane.getTabCount() ; i++){ ret.addAll(((SingleTableTab)tabbedPane.getComponentAt(i)).getRowIds(selectedOnly)); } return ret.toArray(); } }