Author: ruschein
Date: 2011-01-14 09:05:39 -0800 (Fri, 14 Jan 2011)
New Revision: 23457

Added:
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableRowChangeListener.java
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableRowChangeTracker.java
Modified:
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MyTableColumnModel.java
   
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableBrowser.java
Log:
Proof of concept of a row change event aggregator.

Modified: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
  2011-01-14 04:05:16 UTC (rev 23456)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/BrowserTableModel.java
  2011-01-14 17:05:39 UTC (rev 23457)
@@ -12,9 +12,13 @@
 import java.util.Set;
 
 import javax.swing.JTable;
+import javax.swing.table.TableModel;
 import javax.swing.event.TableModelEvent;
-import javax.swing.table.AbstractTableModel;
+import javax.swing.event.TableModelEvent.*;
+import javax.swing.event.TableModelListener;
 
+import org.cytoscape.browser.internal.TableRowChangeListener.ChangeType;
+import org.cytoscape.browser.internal.TableRowChangeListener.ChangeType.*;
 import org.cytoscape.equations.EqnCompiler;
 import org.cytoscape.equations.Equation;
 import org.cytoscape.event.CyEventHelper;
@@ -25,39 +29,31 @@
 import org.cytoscape.model.events.ColumnCreatedListener;
 import org.cytoscape.model.events.ColumnDeletedEvent;
 import org.cytoscape.model.events.ColumnDeletedListener;
-import org.cytoscape.model.events.RowCreatedMicroListener;
-import org.cytoscape.model.events.RowSetMicroListener;
 
 
-public class BrowserTableModel extends AbstractTableModel
-       implements ColumnCreatedListener, ColumnDeletedListener, 
RowCreatedMicroListener
+public class BrowserTableModel
+       implements TableModel, ColumnCreatedListener, ColumnDeletedListener, 
TableRowChangeListener
 {
        private static final int EOF = -1;
        private static final int MAX_INITIALLY_VSIBLE_ATTRS = 10;
        private final JTable table;
-       private final CyEventHelper eventHelper;
        private final CyTable attrs;
        private final EqnCompiler compiler;
        private boolean tableHasBooleanSelected;
-       private Map<CyRow, RowSetMicroListenerProxy> rowToListenerProxyMap;
        private List<AttrNameAndVisibility> attrNamesAndVisibilities;
+       private final List<TableModelListener> tableModelListeners;
+       private final TableRowChangeTracker tableRowChangeTracker;
 
        public BrowserTableModel(final JTable table, final CyEventHelper 
eventHelper,
                                 final CyTable attrs, final EqnCompiler 
compiler)
        {
                this.table = table;
-               this.eventHelper = eventHelper;
                this.attrs = attrs;
                this.compiler = compiler;
                this.tableHasBooleanSelected = 
attrs.getColumnTypeMap().get(CyNetwork.SELECTED) == Boolean.class;
-               this.rowToListenerProxyMap = new HashMap<CyRow, 
RowSetMicroListenerProxy>();
+               this.tableModelListeners = new ArrayList<TableModelListener>();
+               this.tableRowChangeTracker = new TableRowChangeTracker(attrs, 
this, eventHelper);
 
-               eventHelper.addMicroListener(this, 
RowCreatedMicroListener.class, attrs);
-
-               final List<CyRow> rows = attrs.getAllRows();
-               for (final CyRow row : rows)
-                       rowToListenerProxyMap.put(row, new 
RowSetMicroListenerProxy(this, eventHelper, row));
-
                initAttrNamesAndVisibilities();
        }
 
@@ -81,6 +77,11 @@
 
        public CyTable getAttributes() { return attrs; }
 
+       @Override
+       public Class getColumnClass(final int columnIndex) {
+               return Object.class;
+       }
+
        // Note: return value excludes the primary key of the associated 
CyTable!
        public List<String> getVisibleAttributeNames() {
                final List<String> visibleAttrNames = new ArrayList<String>();
@@ -114,8 +115,11 @@
                        }
                }
 
-               if (changed)
-                       fireTableStructureChanged();
+               if (changed) {
+                       final TableModelEvent event = new TableModelEvent(this, 
TableModelEvent.HEADER_ROW);
+                       for (final TableModelListener listener : 
tableModelListeners)
+                               listener.tableChanged(event);
+               }
        }
 
        @Override
@@ -247,7 +251,10 @@
                        return;
 
                attrNamesAndVisibilities.add(new 
AttrNameAndVisibility(e.getColumnName(), true));
-               fireTableStructureChanged();
+
+               final TableModelEvent event = new TableModelEvent(this, 
TableModelEvent.HEADER_ROW);
+               for (final TableModelListener listener : tableModelListeners)
+                       listener.tableChanged(event);
        }
 
        @Override
@@ -263,19 +270,30 @@
                        }
                }
 
-               fireTableStructureChanged();
+               final TableModelEvent event = new TableModelEvent(this, 
TableModelEvent.HEADER_ROW);
+               for (final TableModelListener listener : tableModelListeners)
+                       listener.tableChanged(event);
        }
 
        @Override
-       public String getColumnName(final int column) {
-               return mapColumnIndexToColumnName(column);
+       public void handleTableEntryUpdate(final CyRow row, final String 
columnName,
+                                          final Object newValue, final Object 
newRawValue,
+                                          final ChangeType changeType)
+       {
+               if (changeType == ChangeType.ROW_CREATED) {
+                       final int newRowIndex = mapRowToRowIndex(row);
+                       final TableModelEvent event
+                               = new TableModelEvent(this, newRowIndex, 
newRowIndex,
+                                                     
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
+                       for (final TableModelListener listener : 
tableModelListeners)
+                               listener.tableChanged(event);
+               } else
+                       handleRowValueUpdate(row, columnName, newValue, 
newRawValue);
        }
 
        @Override
-       public void handleRowCreated(final Object key) {
-               final CyRow newRow = attrs.getRow(key);
-               rowToListenerProxyMap.put(newRow, new 
RowSetMicroListenerProxy(this, eventHelper, newRow));
-               fireTableStructureChanged();
+       public String getColumnName(final int column) {
+               return mapColumnIndexToColumnName(column);
        }
 
        private int mapColumnNameToColumnIndex(final String columnName) {
@@ -324,23 +342,29 @@
                                  final Object newRawValue)
        {
                if (tableHasBooleanSelected && 
columnName.equals(CyNetwork.SELECTED)) {
+/*
                        final boolean selected = (Boolean)newValue;
-                       if (!selected && getRowCount() == 0)
+                       final int rowIndex = mapRowToRowIndex(row);
+                       if (!selected && rowIndex == -1)
                                return;
+*/
 
-                       final int rowIndex = mapRowToRowIndex(row);
-/*
-                       if (selected || rowIndex != -1)
-*/
-                       
-final String primaryKey = attrs.getPrimaryKey();
-final Class<?> primaryKeyType = attrs.getColumnTypeMap().get(primaryKey);
-System.err.println("************************** selected="+selected+", 
rowIndex="+rowIndex+", primaryKey="+row.get(primaryKey,primaryKeyType));
-                               fireTableStructureChanged();
+                       //TODO: Need to optimise the following event!
+                       final TableModelEvent event = new TableModelEvent(this);
+                       for (final TableModelListener listener : 
tableModelListeners)
+                               listener.tableChanged(event);
                } else {
                        final int rowIndex = mapRowToRowIndex(row);
-                       if (rowIndex != -1)
-                               fireTableChanged(new TableModelEvent(this, 
rowIndex));
+                       if (rowIndex == -1)
+                               return;
+
+                       final int columnIndex = 
mapColumnNameToColumnIndex(columnName);
+                       if (columnIndex == -1)
+                               return;
+
+                       final TableModelEvent event = new TableModelEvent(this, 
rowIndex, rowIndex, columnIndex);
+                       for (final TableModelListener listener : 
tableModelListeners)
+                               listener.tableChanged(event);
                }
        }
 
@@ -403,7 +427,10 @@
                        }
                }
 
-               fireTableCellUpdated(rowIndex, columnIndex);
+
+               final TableModelEvent event = new TableModelEvent(this, 
rowIndex, rowIndex, columnIndex);
+               for (final TableModelListener listener : tableModelListeners)
+                       listener.tableChanged(event);
        }
 
        private boolean eqnTypeIsCompatible(final Class<?> columnType, final 
Class<?> eqnType) {
@@ -789,36 +816,18 @@
                return table.convertColumnIndexToModel(columnIndex) != 0;
        }
 
-       public void cleanup() {
-               eventHelper.removeMicroListener(this, 
RowCreatedMicroListener.class, attrs);
-               for (final RowSetMicroListenerProxy proxy : 
rowToListenerProxyMap.values())
-                       proxy.cleanup();
+       @Override
+       public void addTableModelListener(final TableModelListener listener) {
+               tableModelListeners.add(listener);
        }
-}
 
-
-class RowSetMicroListenerProxy implements RowSetMicroListener {
-       private final BrowserTableModel tableModel;
-       private final CyEventHelper eventHelper;
-       private final CyRow row;
-
-       RowSetMicroListenerProxy(final BrowserTableModel tableModel, final 
CyEventHelper eventHelper,
-                                final CyRow row)
-       {
-               this.tableModel = tableModel;
-               this.eventHelper = eventHelper;
-               this.row = row;
-
-               eventHelper.addMicroListener(this, RowSetMicroListener.class, 
row);
-       }
-
        @Override
-       public void handleRowSet(final String columnName, final Object 
newValue, final Object newRawValue) {
-               tableModel.handleRowValueUpdate(row, columnName, newValue, 
newRawValue);
+       public void removeTableModelListener(final TableModelListener listener) 
{
+               tableModelListeners.remove(listener);
        }
 
-       void cleanup() {
-               eventHelper.removeMicroListener(this, 
RowSetMicroListener.class, row);
+       public void cleanup() {
+               tableRowChangeTracker.cleanup();
        }
 }
 

Modified: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MyTableColumnModel.java
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MyTableColumnModel.java
 2011-01-14 04:05:16 UTC (rev 23456)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/MyTableColumnModel.java
 2011-01-14 17:05:39 UTC (rev 23457)
@@ -48,7 +48,6 @@
 
        @Override
        public TableColumn getColumn(final int columnIndex) {
-System.err.println("++X+++++++++++++++++++++++++ 
tableColumns.size()="+tableColumns.size());
                if (columnIndex >= tableColumns.size()) {
 System.err.println("++Y+++++++++++++++++++++++++ call to 
getColumn("+columnIndex+") but we only have "+tableColumns.size()+" columns");
                        return null;

Modified: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableBrowser.java
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableBrowser.java
       2011-01-14 04:05:16 UTC (rev 23456)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableBrowser.java
       2011-01-14 17:05:39 UTC (rev 23457)
@@ -95,12 +95,10 @@
                        if (browserTableModel != null) {
                                browserTableModel.cleanup();
                                
serviceRegistrar.unregisterAllServices(browserTableModel);
-                               
eventHelper.removeMicroListener(browserTableModel, 
RowCreatedMicroListener.class, table);
                        }
 
                        currentTable = table;
                        browserTableModel = new BrowserTableModel(browserTable, 
eventHelper, table, compiler);
-                       eventHelper.addMicroListener(browserTableModel, 
RowCreatedMicroListener.class, table);
                        serviceRegistrar.registerAllServices(browserTableModel, 
new Properties());
                        browserTable.setModel(browserTableModel);
                        browserTable.setRowSorter(new 
TableRowSorter(browserTableModel));

Added: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableRowChangeListener.java
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableRowChangeListener.java
                             (rev 0)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableRowChangeListener.java
     2011-01-14 17:05:39 UTC (rev 23457)
@@ -0,0 +1,20 @@
+package org.cytoscape.browser.internal;
+
+
+import org.cytoscape.model.CyRow;
+
+
+/** Listens to row update events. */
+interface TableRowChangeListener {
+       enum ChangeType { ROW_UPDATED, ROW_CREATED }
+
+       /**
+        *  @param row          the row that has been updated
+        *  @param columnName   the column that has been updated
+        *  @param newValue     the new value of the changed table entry
+        *  @param newRawValue  the new raw value of the changed table entry
+        *  @param changeType   what type of change took place
+        */
+       void handleTableEntryUpdate(CyRow row, String columnName, Object 
newValue,
+                                   Object newRawValue, ChangeType changeType);
+}

Added: 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableRowChangeTracker.java
===================================================================
--- 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableRowChangeTracker.java
                              (rev 0)
+++ 
core3/table-browser-impl/trunk/src/main/java/org/cytoscape/browser/internal/TableRowChangeTracker.java
      2011-01-14 17:05:39 UTC (rev 23457)
@@ -0,0 +1,83 @@
+package org.cytoscape.browser.internal;
+
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.cytoscape.browser.internal.TableRowChangeListener.ChangeType;
+import org.cytoscape.browser.internal.TableRowChangeListener.ChangeType.*;
+import org.cytoscape.event.CyEventHelper;
+import org.cytoscape.model.CyRow;
+import org.cytoscape.model.CyTable;
+import org.cytoscape.model.events.RowCreatedMicroListener;
+import org.cytoscape.model.events.RowSetMicroListener;
+
+
+public final class TableRowChangeTracker implements RowCreatedMicroListener {
+       private final CyTable table;
+       private final TableRowChangeListener listener;
+       private final Map<CyRow, RowSetMicroListenerProxy> 
rowToListenerProxyMap;
+       private final CyEventHelper eventHelper;
+
+       /** @param table     the table whose row updates we're forwarding
+        *  @param listener  the object whose handleTableEntryUpdate() method 
we're calling for each
+        *                   row update
+        */
+       public TableRowChangeTracker(final CyTable table, final 
TableRowChangeListener listener,
+                                    final CyEventHelper eventHelper)
+       {
+               this.table = table;
+               this.listener = listener;
+               this.eventHelper = eventHelper;
+               this.rowToListenerProxyMap = new HashMap<CyRow, 
RowSetMicroListenerProxy>();
+
+               eventHelper.addMicroListener(this, 
RowCreatedMicroListener.class, table);
+
+               final List<CyRow> rows = table.getAllRows();
+               for (final CyRow row : rows)
+                       rowToListenerProxyMap.put(row, new 
RowSetMicroListenerProxy(listener, eventHelper, row));
+       }
+
+       @Override
+       public void handleRowCreated(final Object key) {
+               final CyRow newRow = table.getRow(key);
+               rowToListenerProxyMap.put(
+                       newRow, new RowSetMicroListenerProxy(listener, 
eventHelper, newRow));
+               listener.handleTableEntryUpdate(newRow, null, null, null, 
ChangeType.ROW_CREATED);
+       }
+
+       /** Unregisters all listeners. */
+       public void cleanup() {
+               eventHelper.removeMicroListener(this, 
RowCreatedMicroListener.class, table);
+               for (final RowSetMicroListenerProxy proxy : 
rowToListenerProxyMap.values())
+                       proxy.cleanup();
+       }
+
+
+       private static class RowSetMicroListenerProxy implements 
RowSetMicroListener {
+               private final TableRowChangeListener listener;
+               private final CyEventHelper eventHelper;
+               private final CyRow row;
+
+               RowSetMicroListenerProxy(final TableRowChangeListener listener,
+                                        final CyEventHelper eventHelper, final 
CyRow row)
+               {
+                       this.listener = listener;
+                       this.eventHelper = eventHelper;
+                       this.row = row;
+
+                       eventHelper.addMicroListener(this, 
RowSetMicroListener.class, row);
+               }
+
+               @Override
+                       public void handleRowSet(final String columnName, final 
Object newValue, final Object newRawValue) {
+                       listener.handleTableEntryUpdate(row, columnName, 
newValue, newRawValue,
+                                                       ChangeType.ROW_UPDATED);
+               }
+
+               void cleanup() {
+                       eventHelper.removeMicroListener(this, 
RowSetMicroListener.class, row);
+               }
+       }
+}

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