Author: rozagh
Date: 2012-08-03 15:33:26 -0700 (Fri, 03 Aug 2012)
New Revision: 30094

Added:
   
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTableColumnModel.java
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/AttributeBrowserToolBar.java
   
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AttributeListModel.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/BrowserTableModel.java
   
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/DeletionDialog.java
Log:
fixes #1316 added a column model to keep track of columns in the table browser 
view and keep the order of the columns after any structural  change. 

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-03 22:28:09 UTC (rev 30093)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AbstractTableBrowser.java
  2012-08-03 22:33:26 UTC (rev 30094)
@@ -184,6 +184,13 @@
                                updateColumnComparators(rowSorter, 
browserTableModel);
                                browserTable.setUpdateComparators(true);
                                
+                               //hide SUID and selected by default
+                               
+                               final List<String> attrList = 
browserTableModel.getAllAttributeNames();
+                               attrList.remove(CyNetwork.SUID);
+                               attrList.remove( CyNetwork.SELECTED);
+                               
browserTableModel.setVisibleAttributeNames(attrList);
+                               
                                scrollPane = new JScrollPane(browserTable);
                                scrollPanes.put(browserTableModel, scrollPane);
                        }
@@ -198,13 +205,10 @@
                if (btm == null && currentTable != null) {
                        final BrowserTable browserTable = new 
BrowserTable(compiler, popupMenuHelper,
                                        applicationManager, eventHelper, 
tableManager);
+                       BrowserTableColumnModel columnModel = new 
BrowserTableColumnModel();
+                       browserTable.setColumnModel(columnModel);
                        
                        btm = new BrowserTableModel(browserTable, currentTable, 
compiler, tableManager);
-                       final List<String> attrList =  
btm.getVisibleAttributeNames();
-                       //hide SUID and selected by default
-                       attrList.remove(CyNetwork.SUID);
-                       attrList.remove( CyNetwork.SELECTED);
-                       btm.setVisibleAttributeNames(attrList);
                        browserTableModels.put(currentTable, btm);
                }
                

Modified: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AttributeBrowserToolBar.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AttributeBrowserToolBar.java
       2012-08-03 22:28:09 UTC (rev 30093)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AttributeBrowserToolBar.java
       2012-08-03 22:33:26 UTC (rev 30094)
@@ -737,7 +737,7 @@
                final String[] attrArray = getAttributeArray();
 
                final JFrame frame = (JFrame)SwingUtilities.getRoot(this);
-               final DeletionDialog dDialog = new DeletionDialog(frame, 
browserTableModel.getAttributes());
+               final DeletionDialog dDialog = new DeletionDialog(frame, 
browserTableModel.getAttributes(), browserTableModel);
 
                dDialog.pack();
                dDialog.setLocationRelativeTo(toolBar);

Modified: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AttributeListModel.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AttributeListModel.java
    2012-08-03 22:28:09 UTC (rev 30093)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/AttributeListModel.java
    2012-08-03 22:33:26 UTC (rev 30094)
@@ -49,11 +49,13 @@
 import org.cytoscape.model.events.ColumnCreatedListener;
 import org.cytoscape.model.events.ColumnDeletedEvent;
 import org.cytoscape.model.events.ColumnDeletedListener;
+import org.cytoscape.model.events.ColumnNameChangedEvent;
+import org.cytoscape.model.events.ColumnNameChangedListener;
 import org.cytoscape.service.util.CyServiceRegistrar;
 
 
 public class AttributeListModel
-       implements ListModel, ComboBoxModel, ColumnCreatedListener, 
ColumnDeletedListener
+       implements ListModel, ComboBoxModel, ColumnCreatedListener, 
ColumnDeletedListener, ColumnNameChangedListener
 {
        private Vector listeners = new Vector();
        private BrowserTableModel browserTableModel;
@@ -179,4 +181,20 @@
                        }
                }
        }
+
+       @Override
+       public void handleEvent(ColumnNameChangedEvent e) {
+
+               if (browserTableModel == null)
+                       return;
+
+               if (e.getSource() != browserTableModel.getAttributes())
+                       return;
+               
+               if (attributeNames.contains(e.getOldColumnName())){
+                       int attrIndex = 
attributeNames.indexOf(e.getOldColumnName());
+                       attributeNames.set(attrIndex, e.getNewColumnName());
+               }
+               
+       }
 }

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-03 22:28:09 UTC (rev 30093)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTable.java
  2012-08-03 22:33:26 UTC (rev 30094)
@@ -617,8 +617,8 @@
                if (rowSorter == null)
                        return;
 
-               final BrowserTableModel tableModel = (BrowserTableModel) 
getModel();
-               final Class<?> rowDataType = 
tableModel.getColumn(aColumn.getModelIndex()).getType();
+               final BrowserTableModel tableModel = 
(BrowserTableModel)getModel();
+               final Class<?> rowDataType = 
tableModel.getColumnByModelIndex(aColumn.getModelIndex()).getType();
                rowSorter.setComparator(aColumn.getModelIndex(), new 
ValidatedObjectAndEditStringComparator(rowDataType));
        }
 

Added: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTableColumnModel.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTableColumnModel.java
                               (rev 0)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTableColumnModel.java
       2012-08-03 22:33:26 UTC (rev 30094)
@@ -0,0 +1,255 @@
+package org.cytoscape.browser.internal;
+
+import javax.swing.table.*;
+import java.util.Vector;
+import java.util.Enumeration;
+
+/**
+ * <code>BrowserTableColumnModel</code> extends the DefaultTableColumnModel .
+ * It provides a comfortable way to hide/show columns.
+ * Columns keep their positions when hidden and shown again.
+ *
+ * In order to work with JTable it cannot add any events to 
<code>TableColumnModelListener</code>.
+ * Therefore hiding a column will result in <code>columnRemoved</code> event 
and showing it
+ * again will notify listeners of a <code>columnAdded</code>, and possibly a 
<code>columnMoved</code> event.
+ * For the same reason the following methods still deal with visible columns 
only:
+ * getColumnCount(), getColumns(), getColumnIndex(), getColumn()
+ * There are overloaded versions of these methods that take a parameter 
<code>onlyVisible</code> which let's
+ * you specify wether you want invisible columns taken into account.
+ *
+ * @version 0.9 04/03/01
+ * @author Stephen Kelvin, [email protected]
+ * @see DefaultTableColumnModel
+ */
+
+public class BrowserTableColumnModel extends DefaultTableColumnModel {
+       /** Array of TableColumn objects in this model.
+        *  Holds all column objects, regardless of their visibility
+        */
+       protected Vector allTableColumns            = new Vector();
+
+
+       /**
+        * Creates an extended table column model.
+        */
+       BrowserTableColumnModel() {
+       }
+
+       /**
+        * Sets the visibility of the specified TableColumn.
+        * The call is ignored if the TableColumn is not found in this column 
model
+        * or its visibility status did not change.
+        * <p>
+        *
+        * @param aColumn        the column to show/hide
+        * @param visible its new visibility status
+        */
+       // listeners will receive columnAdded()/columnRemoved() event
+       public void setColumnVisible(TableColumn column, boolean visible) {
+               if(!visible) {
+                       super.removeColumn(column);
+               }
+               else {
+                       // find the visible index of the column:
+                       // iterate through both collections of visible and all 
columns, counting
+                       // visible columns up to the one that's about to be 
shown again
+                       int noVisibleColumns    = tableColumns.size();
+                       int noInvisibleColumns  = allTableColumns.size();
+                       int visibleIndex        = 0;
+
+                       for(int invisibleIndex = 0; invisibleIndex < 
noInvisibleColumns; ++invisibleIndex) {
+                               TableColumn visibleColumn   = (visibleIndex < 
noVisibleColumns ? (TableColumn)tableColumns.get(visibleIndex) : null);
+                               TableColumn testColumn      = 
(TableColumn)allTableColumns.get(invisibleIndex);
+
+                               if(testColumn == column) {
+                                       if(visibleColumn != column) {
+                                               super.addColumn(column);
+                                               
super.moveColumn(tableColumns.size() - 1, visibleIndex);
+                                       }
+                                       return; // ####################
+                               }
+                               if(testColumn == visibleColumn) {
+                                       ++visibleIndex;
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Makes all columns in this model visible
+        */
+       public void setAllColumnsVisible() {
+               int noColumns       = allTableColumns.size();
+
+               for(int columnIndex = 0; columnIndex < noColumns; 
++columnIndex) {
+                       TableColumn visibleColumn = (columnIndex < 
tableColumns.size() ? (TableColumn)tableColumns.get(columnIndex) : null);
+                       TableColumn invisibleColumn = 
(TableColumn)allTableColumns.get(columnIndex);
+
+                       if(visibleColumn != invisibleColumn) {
+                               super.addColumn(invisibleColumn);
+                               super.moveColumn(tableColumns.size() - 1, 
columnIndex);
+                       }
+               }
+       }
+
+       /**
+        * Maps the index of the column in the table model at
+        * <code>modelColumnIndex</code> to the TableColumn object.
+        * There may me multiple TableColumn objects showing the same model 
column, though this is uncommon.
+        * This method will always return the first visible or else the first 
invisible column with the specified index.
+        * @param modelColumnIndex index of column in table model
+        * @return table column object or null if no such column in this column 
model
+        */
+       public TableColumn getColumnByModelIndex(int modelColumnIndex) {
+               for (int columnIndex = 0; columnIndex < allTableColumns.size(); 
++columnIndex) {
+                       TableColumn column = 
(TableColumn)allTableColumns.elementAt(columnIndex);
+                       if(column.getModelIndex() == modelColumnIndex) {
+                               return column;
+                       }
+               }
+               return null;
+       }
+
+       /** Checks wether the specified column is currently visible.
+        * @param aColumn column to check
+        * @return visibility of specified column (false if there is no such 
column at all. [It's not visible, right?])
+        */    
+       public boolean isColumnVisible(TableColumn aColumn) {
+               return (tableColumns.indexOf(aColumn) >= 0);
+       }
+
+       /** Append <code>column</code> to the right of exisiting columns.
+        * Posts <code>columnAdded</code> event.
+        * @param column The column to be added
+        * @see #removeColumn
+        * @exception IllegalArgumentException if <code>column</code> is 
<code>null</code>
+        */    
+       public void addColumn(TableColumn column) {
+               allTableColumns.addElement(column);
+               super.addColumn(column);
+       }
+
+       /** Removes <code>column</code> from this column model.
+        * Posts <code>columnRemoved</code> event.
+        * Will do nothing if the column is not in this model.
+        * @param column the column to be added
+        * @see #addColumn
+        */    
+       public void removeColumn(TableColumn column) {
+               int allColumnsIndex = allTableColumns.indexOf(column);
+               if(allColumnsIndex != -1) {
+                       allTableColumns.removeElementAt(allColumnsIndex);
+               }
+               super.removeColumn(column);             
+               for (int columnIndex = 0; columnIndex < allTableColumns.size(); 
++columnIndex) {
+                       TableColumn column2 = 
(TableColumn)allTableColumns.elementAt(columnIndex);                      
+
+               }
+
+       }
+
+       /** Moves the column from <code>oldIndex</code> to 
<code>newIndex</code>.
+        * Posts  <code>columnMoved</code> event.
+        * Will not move any columns if <code>oldIndex</code> equals 
<code>newIndex</code>.
+        *
+        * @param       oldIndex                        index of column to be 
moved
+        * @param       newIndex                        new index of the column
+        * @exception IllegalArgumentException  if either <code>oldIndex</code> 
or
+        *                                              <code>newIndex</code>
+        *                                              are not in [0, 
getColumnCount() - 1]
+        */
+       public void moveColumn(int oldIndex, int newIndex) {
+               if ((oldIndex < 0) || (oldIndex >= getColumnCount()) ||
+                               (newIndex < 0) || (newIndex >= 
getColumnCount()))
+                       throw new IllegalArgumentException("moveColumn() - 
Index out of range");
+
+               TableColumn fromColumn  = (TableColumn) 
tableColumns.get(oldIndex);
+               TableColumn toColumn    = (TableColumn) 
tableColumns.get(newIndex);
+
+               int allColumnsOldIndex  = allTableColumns.indexOf(fromColumn);
+               int allColumnsNewIndex  = allTableColumns.indexOf(toColumn);
+
+               if(oldIndex != newIndex) {
+                       allTableColumns.removeElementAt(allColumnsOldIndex);
+                       allTableColumns.insertElementAt(fromColumn, 
allColumnsNewIndex);
+               }
+
+               super.moveColumn(oldIndex, newIndex);
+       }
+
+       /**
+        * Returns the total number of columns in this model.
+        *
+        * @param   onlyVisible   if set only visible columns will be counted
+        * @return      the number of columns in the <code>tableColumns</code> 
array
+        * @see #getColumns
+        */
+       public int getColumnCount(boolean onlyVisible) {
+               Vector columns = (onlyVisible ? tableColumns : allTableColumns);
+               return columns.size();
+       }
+
+       /**
+        * Returns an <code>Enumeration</code> of all the columns in the model.
+        *
+        * @param   onlyVisible   if set all invisible columns will be missing 
from the enumeration.
+        * @return an <code>Enumeration</code> of the columns in the model
+        */
+       public Enumeration getColumns(boolean onlyVisible) {
+               Vector columns = (onlyVisible ? tableColumns : allTableColumns);
+
+               return columns.elements();
+       }
+
+       /**
+        * Returns the position of the first column whose identifier equals 
<code>identifier</code>.
+        * Position is the the index in all visible columns if 
<code>onlyVisible</code> is true or
+        * else the index in all columns.
+        *
+        * @param       identifier   the identifier object to search for
+        * @param       onlyVisible  if set searches only visible columns
+        *
+        * @return              the index of the first column whose identifier
+        *                      equals <code>identifier</code>
+        *
+        * @exception       IllegalArgumentException  if <code>identifier</code>
+        *                              is <code>null</code>, or if no
+        *                              <code>TableColumn</code> has this
+        *                              <code>identifier</code>
+        * @see         #getColumn
+        */
+       public int getColumnIndex(Object identifier, boolean onlyVisible) {
+               if (identifier == null) {
+                       throw new IllegalArgumentException("Identifier is 
null");
+               }
+
+               Vector      columns     = (onlyVisible ? tableColumns : 
allTableColumns);
+               int         noColumns   = columns.size();
+               TableColumn column;
+
+               for(int columnIndex = 0; columnIndex < noColumns; 
++columnIndex) {
+                       column = (TableColumn)columns.get(columnIndex);
+
+                       if(identifier.equals(column.getIdentifier()))
+                               return columnIndex;
+               }
+
+               throw new IllegalArgumentException("Identifier not found");
+       }
+
+       /**
+        * Returns the <code>TableColumn</code> object for the column
+        * at <code>columnIndex</code>.
+        *
+        * @param       columnIndex     the index of the column desired
+        * @param       onlyVisible     if set columnIndex is meant to be 
relative to all visible columns only
+        *                          else it is the index in all columns
+        *
+        * @return      the <code>TableColumn</code> object for the column
+        *                              at <code>columnIndex</code>
+        */
+       public TableColumn getColumn(int columnIndex, boolean onlyVisible) {
+               return (TableColumn)tableColumns.elementAt(columnIndex);
+       }
+}
+

Modified: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
     2012-08-03 22:28:09 UTC (rev 30093)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
     2012-08-03 22:33:26 UTC (rev 30094)
@@ -5,6 +5,7 @@
 import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Vector;
@@ -14,6 +15,7 @@
 import javax.swing.event.TableModelEvent;
 import javax.swing.table.AbstractTableModel;
 import javax.swing.table.TableColumn;
+import javax.swing.table.TableRowSorter;
 
 import org.cytoscape.browser.internal.util.TableBrowserUtil;
 import org.cytoscape.equations.Equation;
@@ -51,8 +53,8 @@
        // If this is FALSE then we show all rows
        private boolean regularViewMode;
 
-       private List<AttrNameAndVisibility> attrNamesAndVisibilities;
-
+       private List<String> attrNames;
+       
        private Collection<CyRow> selectedRows = null;
 
        private Object[] rowIndexToPrimaryKey;
@@ -69,8 +71,8 @@
 
                initAttrNamesAndVisibilities();
 
-               
-               
+
+
                // add each row to an array to allow fast lookup from an index
                final Collection<CyRow> rows = dataTable.getAllRows();
                this.rowIndexToPrimaryKey = new Object[rows.size()]; 
@@ -85,12 +87,13 @@
        }
 
        private void initAttrNamesAndVisibilities() {
-               attrNamesAndVisibilities = new 
ArrayList<AttrNameAndVisibility>();
+               attrNames = new ArrayList<String>();
                int i = 0;
                for (final CyColumn column : dataTable.getColumns()) {
-                       attrNamesAndVisibilities.add(new 
AttrNameAndVisibility(column.getName(), true));
+                       attrNames.add(column.getName());
                        i++;
                }
+               
        }
 
        public JTable getTable() { return table; }
@@ -103,26 +106,49 @@
        public Class<?> getColumnClass(final int columnIndex) {
                return ValidatedObjectAndEditString.class;
        }
+       
+       List<String> getAllAttributeNames() {
+               final List<String> AttrNames = new ArrayList<String>();         
+               
+               for (final String name : attrNames) {
+                       AttrNames.add(name);
+               }
 
-       // Note: return value excludes the primary key of the associated 
CyTable!
+               return AttrNames;
+               //Never rerturn the list of attrNames itself, because it will 
be returned by reference and anychanges to this list will affect the model
+               //return attrNames; 
+       }
+
        List<String> getVisibleAttributeNames() {
-               final List<String> visibleAttrNames = new ArrayList<String>();
 
-               for (final AttrNameAndVisibility nameAndVisibility : 
attrNamesAndVisibilities) {
-                       if (nameAndVisibility.isVisible())// && 
!nameAndVisibility.getName().equals(primaryKey))
-                               
visibleAttrNames.add(nameAndVisibility.getName());
+               final List<String> visibleAttrNames = new ArrayList<String>();  
        
+               for (final String name : attrNames) {
+                       if (isColumnVisible(name))
+                               visibleAttrNames.add(name);
                }
-
+               
                return visibleAttrNames;
        }
 
+
+       public Boolean isColumnVisible(String colName){
+               BrowserTableColumnModel columnModel = (BrowserTableColumnModel) 
table.getColumnModel();
+               TableColumn column = 
columnModel.getColumnByModelIndex(mapColumnNameToColumnIndex(colName));
+               return columnModel.isColumnVisible(column);
+       }
        
        public void setVisibleAttributeNames(final Collection<String> 
visibleAttributes) {
-
-               for (final AttrNameAndVisibility nameAndVisibility : 
attrNamesAndVisibilities) 
-                       
nameAndVisibility.setVisibility(visibleAttributes.contains(nameAndVisibility.getName()));
-                               
-               fireTableStructureChanged();
+               
+               BrowserTableColumnModel columnModel = (BrowserTableColumnModel) 
table.getColumnModel();
+               for (final String name : attrNames) {
+                       int col = mapColumnNameToColumnIndex(name);
+                       int convCol = table.convertColumnIndexToView(col);
+                       TableColumn column = 
columnModel.getColumnByModelIndex(col);
+                       columnModel.setColumnVisible(column, 
visibleAttributes.contains(name));
+               }
+               
+               //don't fire this, it will reset all the columns based on model
+               //fireTableStructureChanged();
        }
 
        @Override
@@ -139,37 +165,38 @@
 
        }
 
+       // this should return the number of columns in model
        @Override
        public int getColumnCount() {
-               int count = 0;
-               for (final AttrNameAndVisibility nameAndVisibility : 
attrNamesAndVisibilities) {
-                       if (nameAndVisibility.isVisible())
-                               ++count;
-               }
-
-               return count;
+               return attrNames.size();
        }
 
-       
+
        public Object getValueAt(final int rowIndex, final String columnName) {
                final CyRow row = 
mapRowIndexToRow(table.convertRowIndexToModel(rowIndex));
                return getValidatedObjectAndEditString(row, columnName);
        }
 
        @Override
-       public Object getValueAt(final int rowIndex, final int columnIndex) {
+       public Object getValueAt(final int rowIndex, final int columnIndex) {   
        
                final String columnName = getColumnName(columnIndex);
                final CyRow row = mapRowIndexToRow(rowIndex);   
-               
+
                return getValidatedObjectAndEditString(row, columnName);
        }
 
        CyColumn getColumn(final int columnIndex)  {
                final String columnName = getColumnName( 
table.convertColumnIndexToModel(columnIndex));
-               
+
                return dataTable.getColumn(columnName);
        }
 
+       CyColumn getColumnByModelIndex(final int modelIndex)  {
+               final String columnName = getColumnName( modelIndex);
+
+               return dataTable.getColumn(columnName);
+       }
+
        private CyRow mapRowIndexToRow(final int rowIndex) {
                if (regularViewMode) {
                        if (selectedRows == null)
@@ -230,30 +257,62 @@
                        return row.get(columnName, column.getType());
        }
 
+       @SuppressWarnings("unchecked")
        @Override
        public void handleEvent(final ColumnCreatedEvent e) {
                if (e.getSource() != dataTable)
                        return;
-               attrNamesAndVisibilities.add(new 
AttrNameAndVisibility(e.getColumnName(), true));
-               fireTableStructureChanged();
+               BrowserTableColumnModel columnModel = (BrowserTableColumnModel) 
table.getColumnModel();
+
+               attrNames.add(e.getColumnName());
+               
+               int colIndex = columnModel.getColumnCount(false);
+               TableColumn newCol = new TableColumn(colIndex);
+               newCol.setHeaderValue(e.getColumnName());
+               table.setUpdateComparators(false);
+               table.addColumn(newCol);
+               final TableRowSorter<BrowserTableModel> rowSorter = new 
TableRowSorter<BrowserTableModel>(this);
+               table.setRowSorter(rowSorter);
+               updateColumnComparators(rowSorter, this);
+               table.setUpdateComparators(true);
+
        }
 
+       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()));
+       }
 
-
        @Override
        public void handleEvent(final ColumnDeletedEvent e) {
                if (e.getSource() != dataTable)
                        return;
+               BrowserTableColumnModel columnModel = (BrowserTableColumnModel) 
table.getColumnModel();
 
                final String columnName = e.getColumnName();
-               for (int i = 0; i < attrNamesAndVisibilities.size(); ++i) {
-                       if 
(attrNamesAndVisibilities.get(i).getName().equals(columnName)) {
-                               attrNamesAndVisibilities.remove(i);
-                               break;
+               boolean columnFound = false;
+               int removedColIndex = -1;
+               
+               for (int i = 0; i < attrNames.size(); ++i) {
+                       if (attrNames.get(i).equals(columnName)) {
+                               removedColIndex = i;
+                               columnModel.removeColumn 
(columnModel.getColumn(table.convertColumnIndexToView( i)));
+                               columnFound = true;
                        }
+                       else if (columnFound){ //need to push back the model 
indexes for all of the columns after this
+                               TableColumn nextCol = 
columnModel.getColumn(table.convertColumnIndexToView( i));
+                               nextCol.setModelIndex(i- 1);
+                       }
                }
+               
+               if (removedColIndex != -1){//remove the item after the loop is 
done
+                       attrNames.remove(removedColIndex);
+               }
 
-               fireTableStructureChanged();
        }
 
        @Override
@@ -262,10 +321,15 @@
                        return;
 
                final String newColumnName = e.getNewColumnName();
+               final int column = 
mapColumnNameToColumnIndex(e.getOldColumnName());
+               if (isColumnVisible(e.getOldColumnName())){
+                       int colIndex = table.convertColumnIndexToView(column);
+                       if (colIndex != -1)
+                               
table.getColumnModel().getColumn(colIndex).setHeaderValue(newColumnName);
+               }
+               
                renameColumnName(e.getOldColumnName(), newColumnName);
-               final int column = mapColumnNameToColumnIndex(newColumnName);
-               if (column != -1)
-                       
table.getColumnModel().getColumn(column).setHeaderValue(newColumnName);
+
        }
 
        @Override
@@ -401,63 +465,52 @@
                } 
        }
 
-       
+
        public String getCyColumnName( final int column){
                return (String) dataTable.getColumns().toArray()[column];
        }
-       
+
        @Override
        public String getColumnName(final int column) {
                return mapColumnIndexToColumnName(column);
        }
+       
+       
 
        private void renameColumnName(final String oldName, final String 
newName) {
-               for (final AttrNameAndVisibility nameAndVisibility : 
attrNamesAndVisibilities) {
-                       if (nameAndVisibility.getName().equals(oldName)) {
-                               nameAndVisibility.setName(newName);
-                               return;
-                       }
+               
+               BrowserTableColumnModel columnModel = (BrowserTableColumnModel) 
table.getColumnModel();
+
+               if (attrNames.contains(oldName)){
+                       int index = attrNames.indexOf(oldName);
+                       attrNames.set(index, newName);
+                       columnModel.getColumn(table.convertColumnIndexToView( 
index)).setHeaderValue(newName);
+                       return;
                }
-
-               throw new IllegalStateException("We should *never* get here.");
+       
+               throw new IllegalStateException("The specified column " + 
oldName +" does not exist in the model.");
        }
 
 
-       
+
        public boolean isPrimaryKey (int col){
                return 
dataTable.getPrimaryKey().getName().equals(getColumnName(table.convertColumnIndexToModel(col)));
        }
 
-       
+
        int mapColumnNameToColumnIndex(final String columnName) {
                
-               int index = 0;
-               for (final AttrNameAndVisibility nameAndVisibility : 
attrNamesAndVisibilities) {
-                       
-                       if(!nameAndVisibility.isVisible())
-                               continue;
-                       
-                       if (nameAndVisibility.getName().equals(columnName))
-                               return index;
-                       index++;
-               }
+               if(attrNames.contains(columnName))
+                       return attrNames.indexOf(columnName);
                return -1;
        }
 
-       private String mapColumnIndexToColumnName(final int index) {
-               
-               int i = 0;
-               for (final AttrNameAndVisibility nameAndVisibility : 
attrNamesAndVisibilities) {
-                       if (!nameAndVisibility.isVisible())
-                               continue;
+       private String mapColumnIndexToColumnName(final int index) {            
+               if (index <= attrNames.size())
+                       return attrNames.get(index);
 
-                       if (index == i)
-                               return nameAndVisibility.getName();
+               throw new ArrayIndexOutOfBoundsException();
 
-                       ++i;
-               }
-               throw new IllegalStateException("We should *never* get here. 
(index="+index+", visible attibutes are="+ attrNamesAndVisibilities.size()+")");
-               
        }
 
        // Because tableModel will disappear if user click on open space on 
canvas, 
@@ -473,9 +526,9 @@
        CyRow getRow(final Object suid) {
                return dataTable.getRow(suid);
        }
-       
-       
 
+
+
        @Override
        public void setValueAt(final Object value, final int rowIndex, final 
int columnIndex) {
                final String text = (String)value;
@@ -514,7 +567,6 @@
                } else { // Not an equation!
 
                        ArrayList parsedData = 
TableBrowserUtil.parseCellInput(dataTable, columnName, value);
-
                        if (parsedData.get(0) != null)
                                row.set(columnName, parsedData.get(0));
                        else {
@@ -530,7 +582,7 @@
 
        // Pop-up window for error message
        private static void showErrorWindow(final String errMessage) {
-               JOptionPane.showMessageDialog(null, errMessage, "Invalid 
Value.",
+               JOptionPane.showMessageDialog(null, errMessage, "Invalid Value",
                                JOptionPane.ERROR_MESSAGE);
        }
 
@@ -585,36 +637,3 @@
        }
 
 }
-
-
-final class AttrNameAndVisibility {
-
-       private String attrName;
-       private boolean isVisible;
-       
-       AttrNameAndVisibility(final String attrName, final boolean isVisible) {
-               this.attrName = attrName;
-               this.isVisible = isVisible;;
-       }
-
-       String getName() {
-               return attrName;
-       }
-
-       void setName(final String newAttrName) {
-               attrName = newAttrName;
-       }
-       
-       void setVisibility(final boolean isVisible) {
-               this.isVisible = isVisible;
-       }
-
-       boolean isVisible() {
-               return isVisible;
-       }
-
-       @Override
-       public String toString(){
-               return "Attr name " + attrName + " visiblity " + isVisible;
-       }
-}

Modified: 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/DeletionDialog.java
===================================================================
--- 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/DeletionDialog.java
        2012-08-03 22:28:09 UTC (rev 30093)
+++ 
core3/impl/trunk/table-browser-impl/src/main/java/org/cytoscape/browser/internal/DeletionDialog.java
        2012-08-03 22:33:26 UTC (rev 30094)
@@ -35,12 +35,15 @@
        }
 
        private CyTable attributes;
+       private BrowserTableModel tableModel;
 
        /** Creates new form DeletionDialog */
-       protected DeletionDialog(final Frame parent, final CyTable attributes) {
+       protected DeletionDialog(final Frame parent, final CyTable attributes, 
final BrowserTableModel tableModel) {
                super(parent, "Delete Attributes", /* modal = */ true);
 
                this.attributes = attributes;
+               this.tableModel  = tableModel;
+
                initComponents();
        }
 
@@ -60,80 +63,83 @@
 
                
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
                attributeList.setModel(new AbstractListModel() {
-                               public int getSize() {
-                                       int mutableCount = 0;
-                                       for (final CyColumn column : 
attributes.getColumns()) {
-                                               if (!column.isImmutable())
+                       public int getSize() {
+                               int mutableCount = 0;
+                               for (final CyColumn column : 
attributes.getColumns()) {
+                                       if (!column.isImmutable())
+                                               if 
(tableModel.isColumnVisible(column.getName()))
                                                        ++mutableCount;
-                                       }
-
-                                       return mutableCount;
                                }
 
-                               public Object getElementAt(final int i) {
-                                       final String[] columnNames = new 
String[getSize()];
+                               return mutableCount;
+                       }
 
-                                       int k = 0;
-                                       for (final CyColumn column : 
attributes.getColumns()) {
-                                                if (!column.isImmutable())
+                       public Object getElementAt(final int i) {
+                               final String[] columnNames = new 
String[getSize()];
+
+                               int k = 0;
+                               for (final CyColumn column : 
attributes.getColumns()) {
+                                       if (!column.isImmutable()){
+                                               if 
(tableModel.isColumnVisible(column.getName()))
                                                        columnNames[k++] = 
column.getName();
                                        }
+                               }
 
-                                       Arrays.sort(columnNames, new 
CaseInsensitiveCompare());
-                                       return columnNames[i];
-                               }
-                       });
+                               Arrays.sort(columnNames, new 
CaseInsensitiveCompare());
+                               return columnNames[i];
+                       }
+               });
                deletionPane.setViewportView(attributeList);
 
                deleteButton.setText("Delete");
                deleteButton.addActionListener(new ActionListener() {
-                               public void 
actionPerformed(java.awt.event.ActionEvent evt) {
-                                       deleteButtonActionPerformed(evt);
-                               }
-                       });
+                       public void actionPerformed(java.awt.event.ActionEvent 
evt) {
+                               deleteButtonActionPerformed(evt);
+                       }
+               });
 
                cancelButton.setText("Cancel");
                cancelButton.addActionListener(new ActionListener() {
-                               public void 
actionPerformed(java.awt.event.ActionEvent evt) {
-                                       cancelButtonActionPerformed(evt);
-                                       ;
-                               }
-                       });
+                       public void actionPerformed(java.awt.event.ActionEvent 
evt) {
+                               cancelButtonActionPerformed(evt);
+                               ;
+                       }
+               });
 
                descriptionLabel.setText("Please select attributes to be 
deleted:");
 
                final GroupLayout layout = new GroupLayout(getContentPane());
                getContentPane().setLayout(layout);
                
layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING)
-                                               
.addGroup(layout.createSequentialGroup().addContainerGap()
-                                                          
.addGroup(layout.createParallelGroup(Alignment.LEADING)
-                                                                     
.addGroup(Alignment.TRAILING,
-                                                                          
layout.createSequentialGroup()
-                                                                               
 .addComponent(deleteButton)
-                                                                               
 .addPreferredGap(ComponentPlacement.RELATED)
-                                                                               
 .addComponent(cancelButton)
-                                                                               
 .addContainerGap())
-                                                                     
.addGroup(Alignment.TRAILING,
-                                                                          
layout.createSequentialGroup()
-                                                                               
 .addComponent(deletionPane,
-                                                                               
      GroupLayout.DEFAULT_SIZE,
-                                                                               
      229, Short.MAX_VALUE)
-                                                                               
 .addGap(12, 12, 12))
-                                                                     
.addGroup(layout.createSequentialGroup()
-                                                                               
 .addComponent(descriptionLabel)
-                                                                               
 .addContainerGap(26,
-                                                                               
                  Short.MAX_VALUE)))));
+                               
.addGroup(layout.createSequentialGroup().addContainerGap()
+                                               
.addGroup(layout.createParallelGroup(Alignment.LEADING)
+                                                               
.addGroup(Alignment.TRAILING,
+                                                                               
layout.createSequentialGroup()
+                                                                               
.addComponent(deleteButton)
+                                                                               
.addPreferredGap(ComponentPlacement.RELATED)
+                                                                               
.addComponent(cancelButton)
+                                                                               
.addContainerGap())
+                                                                               
.addGroup(Alignment.TRAILING,
+                                                                               
                layout.createSequentialGroup()
+                                                                               
                .addComponent(deletionPane,
+                                                                               
                                GroupLayout.DEFAULT_SIZE,
+                                                                               
                                229, Short.MAX_VALUE)
+                                                                               
                                .addGap(12, 12, 12))
+                                                                               
                                .addGroup(layout.createSequentialGroup()
+                                                                               
                                                .addComponent(descriptionLabel)
+                                                                               
                                                .addContainerGap(26,
+                                                                               
                                                                
Short.MAX_VALUE)))));
                
layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING)
-                                             .addGroup(Alignment.TRAILING,
-                                                  
layout.createSequentialGroup().addContainerGap()
-                                                        
.addComponent(descriptionLabel).addGap(12, 12, 12)
-                                                        
.addComponent(deletionPane,
-                                                             
GroupLayout.DEFAULT_SIZE,
-                                                             200, 
Short.MAX_VALUE)
-                                                        
.addPreferredGap(ComponentPlacement.RELATED)
-                                                        
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
-                                                                   
.addComponent(deleteButton).addComponent(cancelButton))
-                                                        .addContainerGap()));
+                               .addGroup(Alignment.TRAILING,
+                                               
layout.createSequentialGroup().addContainerGap()
+                                               
.addComponent(descriptionLabel).addGap(12, 12, 12)
+                                               .addComponent(deletionPane,
+                                                               
GroupLayout.DEFAULT_SIZE,
+                                                               200, 
Short.MAX_VALUE)
+                                                               
.addPreferredGap(ComponentPlacement.RELATED)
+                                                               
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
+                                                                               
.addComponent(deleteButton).addComponent(cancelButton))
+                                                                               
.addContainerGap()));
                pack();
        } // </editor-fold>
 

-- 
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