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.