Author: jm
Date: 2012-08-15 12:26:22 -0700 (Wed, 15 Aug 2012)
New Revision: 30200

Modified:
   
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AbstractTableBrowser.java
   
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
   
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/CustomHeaderRenderer.java
   
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/SortHeaderRenderer.java
Log:
Fixes #1368: Fixed way TableRowSorter and TableColumnModel is being used so we 
don't allocate new instances each time the model changes.

Modified: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AbstractTableBrowser.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AbstractTableBrowser.java
  2012-08-15 18:14:42 UTC (rev 30199)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AbstractTableBrowser.java
  2012-08-15 19:26:22 UTC (rev 30200)
@@ -19,7 +19,6 @@
 import javax.swing.JTable;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableModel;
-import javax.swing.table.TableRowSorter;
 
 import org.cytoscape.application.CyApplicationManager;
 import org.cytoscape.application.swing.CytoPanelComponent;
@@ -190,14 +189,8 @@
                                
serviceRegistrar.registerAllServices(browserTableModel, new Properties());
                                
browserTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                                
browserTable.getTableHeader().setBackground(Color.LIGHT_GRAY);
-                               browserTable.setUpdateComparators(false);
                                browserTable.setModel(browserTableModel);
                                
-                               final TableRowSorter<BrowserTableModel> 
rowSorter = new TableRowSorter<BrowserTableModel>(browserTableModel);
-                               browserTable.setRowSorter(rowSorter);
-                               updateColumnComparators(rowSorter, 
browserTableModel);
-                               browserTable.setUpdateComparators(true);
-                               
                                //move and hide SUID and selected by default
                                final List<String> attrList = 
browserTableModel.getAllAttributeNames();
 
@@ -226,9 +219,6 @@
                if (table == null && currentTable != null) {
                        table = new BrowserTable(compiler, popupMenuHelper,
                                        applicationManager, eventHelper, 
tableManager);
-                       BrowserTableColumnModel columnModel = new 
BrowserTableColumnModel();
-                       table.setColumnModel(columnModel);
-                       
                        BrowserTableModel model = new 
BrowserTableModel(currentTable, compiler, tableManager);
                        table.setModel(model);
                        browserTables.put(currentTable, table);
@@ -241,14 +231,6 @@
                return browserTables;
        }
 
-       void updateColumnComparators(final TableRowSorter<BrowserTableModel> 
rowSorter,
-                       final BrowserTableModel browserTableModel) {
-               for (int column = 0; column < 
browserTableModel.getColumnCount(); ++column)
-                       rowSorter.setComparator(
-                               column,
-                               new ValidatedObjectAndEditStringComparator(
-                                       
browserTableModel.getColumn(column).getType()));
-       }
 
        @Override
        public String toString() {

Modified: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
  2012-08-15 18:14:42 UTC (rev 30199)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
  2012-08-15 19:26:22 UTC (rev 30200)
@@ -2,7 +2,6 @@
 
 import java.awt.Color;
 import java.awt.Component;
-import java.awt.Cursor;
 import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.Graphics;
@@ -27,6 +26,7 @@
 import java.util.EventObject;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -100,7 +100,6 @@
 
        private final EquationCompiler compiler;
        private final PopupMenuHelper popupMenuHelper;
-       private boolean updateColumnComparators;
 
        private final CyApplicationManager applicationManager;
        private final CyEventHelper eventHelper;
@@ -108,22 +107,18 @@
 
        private JPopupMenu cellMenu;
 
-       private int sortedColumnIndex;
-       private boolean sortedColumnAscending;
-       
        public BrowserTable(final EquationCompiler compiler, final 
PopupMenuHelper popupMenuHelper,
                        final CyApplicationManager applicationManager, final 
CyEventHelper eventHelper,
                        final CyTableManager tableManager) {
                this.compiler = compiler;
                this.popupMenuHelper = popupMenuHelper;
-               this.updateColumnComparators = false;
                this.applicationManager = applicationManager;
                this.eventHelper = eventHelper;
                this.tableManager = tableManager;
-               this.sortedColumnAscending = true;
-               this.sortedColumnIndex = -1;
                
                initHeader();
+               setAutoCreateColumnsFromModel(false);
+               setAutoCreateRowSorter(false);
                setCellSelectionEnabled(true);
                setDefaultEditor(Object.class, new MultiLineTableCellEditor());
                getPopupMenu();
@@ -132,8 +127,30 @@
                setTransferHandler(new BrowserTableTransferHandler());
        }
 
-       public void setUpdateComparators(final boolean updateColumnComparators) 
{
-               this.updateColumnComparators = updateColumnComparators;
+       @Override
+       public void setModel(TableModel dataModel) {
+               super.setModel(dataModel);
+               
+               BrowserTableColumnModel columnModel = new 
BrowserTableColumnModel();
+               setColumnModel(columnModel);
+               
+               TableRowSorter<TableModel> sorter = new 
TableRowSorter<TableModel>(dataModel);
+               setRowSorter(sorter);
+
+               if (!(dataModel instanceof BrowserTableModel)) {
+                       return;
+               }
+               
+               BrowserTableModel model = (BrowserTableModel) dataModel;
+               for (int i = 0; i < model.getColumnCount(); i++) {
+                       TableColumn tableColumn = new TableColumn(i);
+                       tableColumn.setHeaderValue(model.getColumnName(i));
+                       columnModel.addColumn(tableColumn);
+                       
+                       CyColumn column = model.getColumnByModelIndex(i);
+                       sorter.setComparator(i, new 
ValidatedObjectAndEditStringComparator(column.getType()));
+               }
+               
        }
 
        /**
@@ -464,24 +481,7 @@
 
        @Override
        public void mouseClicked(final MouseEvent event) {
-               
-               //*******************Sort header code **********************
-
-               final int cursorType = getTableHeader().getCursor().getType();
-               if ((event.getButton() == MouseEvent.BUTTON1) && (cursorType != 
Cursor.E_RESIZE_CURSOR)
-                               && (cursorType != Cursor.W_RESIZE_CURSOR)) {
-                       final int index = 
getColumnModel().getColumnIndexAtX(event.getX());
-
-                       if (index >= 0) {
-                               final int modelIndex = 
getColumnModel().getColumn(index).getModelIndex();
-                               if (sortedColumnIndex == index) {
-                                       sortedColumnAscending = 
!sortedColumnAscending;
-                               }
-
-                               sortedColumnIndex = index;
-                       }
-               }//end of sorting
-               else if (event.getButton() == MouseEvent.BUTTON3) {
+               if (event.getButton() == MouseEvent.BUTTON3) {
                        final int column = 
getColumnModel().getColumnIndexAtX(event.getX());
                        final BrowserTableModel tableModel = 
(BrowserTableModel) getModel();
 
@@ -641,21 +641,6 @@
                }
        }
 
-       public void addColumn(final TableColumn aColumn) {
-               super.addColumn(aColumn);
-
-               if (!updateColumnComparators)
-                       return;
-
-               final TableRowSorter rowSorter = (TableRowSorter) 
getRowSorter();
-               if (rowSorter == null)
-                       return;
-
-               final BrowserTableModel tableModel = 
(BrowserTableModel)getModel();
-               final Class<?> rowDataType = 
tableModel.getColumnByModelIndex(aColumn.getModelIndex()).getType();
-               rowSorter.setComparator(aColumn.getModelIndex(), new 
ValidatedObjectAndEditStringComparator(rowDataType));
-       }
-
        @Override
        public void paint(Graphics graphics) {
                synchronized (getModel()) {
@@ -715,16 +700,6 @@
        }
        
        
-       //*******************Sort header code **********************
-       public int getSortedColumnIndex() {
-               return sortedColumnIndex;
-       }
-
-       
-       public boolean isSortedColumnAscending() {
-               return sortedColumnAscending;
-       }
-
        public void setVisibleAttributeNames(Collection<String> 
visibleAttributes) {
                BrowserTableModel model = (BrowserTableModel) getModel();
 
@@ -766,6 +741,12 @@
                
                if (e.getSource() != dataTable)
                        return;
+               
+               TableRowSorter<BrowserTableModel> sorter = 
(TableRowSorter<BrowserTableModel>) getRowSorter();
+               List<? extends SortKey> sortKeys = sorter.getSortKeys();
+
+               model.fireTableStructureChanged();
+               
                BrowserTableColumnModel columnModel = (BrowserTableColumnModel) 
getColumnModel();
 
                model.addColumn(e.getColumnName());
@@ -773,25 +754,15 @@
                int colIndex = columnModel.getColumnCount(false);
                TableColumn newCol = new TableColumn(colIndex);
                newCol.setHeaderValue(e.getColumnName());
-               setUpdateComparators(false);
                addColumn(newCol);
-               List<? extends SortKey> sortKeys = getRowSorter().getSortKeys();
-               final TableRowSorter<BrowserTableModel> rowSorter = new 
TableRowSorter<BrowserTableModel>(model);
-               setRowSorter(rowSorter);
-               updateColumnComparators(rowSorter, model);
-               setUpdateComparators(true);
-               rowSorter.setSortKeys(sortKeys);
-       }
 
-       void updateColumnComparators(final TableRowSorter<BrowserTableModel> 
rowSorter,
-                       final BrowserTableModel browserTableModel) {
-               for (int column = 0; column < 
browserTableModel.getColumnCount(); ++column)
-                       rowSorter.setComparator(
-                                       column,
-                                       new 
ValidatedObjectAndEditStringComparator(
-                                                       
browserTableModel.getColumnByModelIndex(column).getType()));
+               CyColumn column = model.getColumnByModelIndex(colIndex);
+               sorter.setComparator(colIndex, new 
ValidatedObjectAndEditStringComparator(column.getType()));
+               sorter.setSortKeys(sortKeys);
+
        }
 
+
        @Override
        public void handleEvent(final ColumnDeletedEvent e) {
                BrowserTableModel model = (BrowserTableModel) getModel();
@@ -799,6 +770,12 @@
                
                if (e.getSource() != dataTable)
                        return;
+               
+               TableRowSorter<BrowserTableModel> sorter = 
(TableRowSorter<BrowserTableModel>) getRowSorter();
+               List<? extends SortKey> sortKeys = new 
ArrayList<SortKey>(sorter.getSortKeys());
+
+               model.fireTableStructureChanged();
+
                BrowserTableColumnModel columnModel = (BrowserTableColumnModel) 
getColumnModel();
 
                final String columnName = e.getColumnName();
@@ -823,6 +800,15 @@
                        model.removeColumn(removedColIndex);
                }
 
+               // Ensure we don't re-add a sort key for the deleted column
+               Iterator<? extends SortKey> keys = sortKeys.iterator();
+               while (keys.hasNext()) {
+                       SortKey key = keys.next();
+                       if (key.getColumn() == removedColIndex) {
+                               keys.remove();
+                       }
+               }
+               sorter.setSortKeys(sortKeys);
        }
 
        @Override

Modified: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/CustomHeaderRenderer.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/CustomHeaderRenderer.java
  2012-08-15 18:14:42 UTC (rev 30199)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/CustomHeaderRenderer.java
  2012-08-15 19:26:22 UTC (rev 30200)
@@ -36,12 +36,16 @@
 import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JTable;
+import javax.swing.RowSorter;
+import javax.swing.SortOrder;
 import javax.swing.SwingConstants;
+import javax.swing.RowSorter.SortKey;
 import javax.swing.border.Border;
 import javax.swing.border.CompoundBorder;
 import javax.swing.border.EmptyBorder;
 import javax.swing.border.MatteBorder;
 import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableModel;
 
 import org.cytoscape.browser.internal.util.SortArrowIcon;
 import org.cytoscape.model.CyColumn;
@@ -161,10 +165,15 @@
                int index = -1;
                boolean ascending = true;
                
-               if (table instanceof BrowserTable) {
-                       BrowserTable sortTable = (BrowserTable) table;
-                       index = sortTable.getSortedColumnIndex();
-                       ascending = sortTable.isSortedColumnAscending();
+               RowSorter<? extends TableModel> rowSorter = 
table.getRowSorter();
+               int modelColumn = table.convertColumnIndexToModel(vColIndex);
+               List<? extends SortKey> sortKeys = rowSorter.getSortKeys();
+               if (sortKeys.size() > 0) {
+                       SortKey key = sortKeys.get(0);
+                       if (key.getColumn() == modelColumn) {
+                               index = vColIndex;
+                               ascending = key.getSortOrder() == 
SortOrder.ASCENDING;
+                       }
                }
                
                Icon icon = ascending ? ASCENDING : DECENDING;

Modified: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/SortHeaderRenderer.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/SortHeaderRenderer.java
    2012-08-15 18:14:42 UTC (rev 30199)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/SortHeaderRenderer.java
    2012-08-15 19:26:22 UTC (rev 30200)
@@ -24,12 +24,17 @@
 package org.cytoscape.browser.internal;
 
 import java.awt.Component;
+import java.util.List;
 
 import javax.swing.Icon;
 import javax.swing.JTable;
+import javax.swing.RowSorter;
+import javax.swing.RowSorter.SortKey;
+import javax.swing.SortOrder;
 import javax.swing.UIManager;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.JTableHeader;
+import javax.swing.table.TableModel;
 
 import org.cytoscape.browser.internal.util.SortArrowIcon;
 
@@ -79,13 +84,17 @@
                int index = -1;
                boolean ascending = true;
 
-               if (table instanceof BrowserTable) {
-                       BrowserTable sortTable = (BrowserTable) table;
-                       index = sortTable.getSortedColumnIndex();
-                       ascending = sortTable.isSortedColumnAscending();
-               }
-
                if (table != null) {
+                       RowSorter<? extends TableModel> rowSorter = 
table.getRowSorter();
+                       int modelColumn = table.convertColumnIndexToModel(col);
+                       List<? extends SortKey> sortKeys = 
rowSorter.getSortKeys();
+                       if (sortKeys.size() > 0) {
+                               SortKey key = sortKeys.get(0);
+                               if (key.getColumn() == modelColumn) {
+                                       index = col;
+                                       ascending = key.getSortOrder() == 
SortOrder.ASCENDING;
+                               }
+                       }
                        JTableHeader header = table.getTableHeader();
 
                        if (header != null) {

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to