/** Convenience getter for the proxied model's user-supplied TreeModel */ private TreeModel getTreeModel() { return getModel().getTreeModel(); }
/** Convenience getter for the proxied model's layout cache */ private AbstractLayoutCache getLayout() { return getModel().getLayout(); }
/** Convenience getter for the proxied model's user-supplied TableModel (in * practice, an instance of ProxyTableModel driven by the tree model and a * RowModel) */ private TableModel getTableModel() { return getModel().getTableModel(); }
/** Convenience getter for the proxied model's TreePathSupport */ private TreePathSupport getTreePathSupport() { return getModel().getTreePathSupport(); }
/** Fire a table change to the list of listeners supplied. The event should * already have its source set to be the OutlineModel we're proxying for. */ private void fireTableChange (TableModelEvent e, TableModelListener[] listeners) { //Event may be null for offscreen info, etc. if (e == null) { return; } assert (e.getSource() == getModel()); log ("fireTableChange", e); for (int i=0; i < listeners.length; i++) { listeners[i].tableChanged(e); } }
/** Creates an identical TreeModelEvent with the model we are proxying * as the event source */ private TreeModelEvent translateEvent (TreeModelEvent e) { //Create a new TreeModelEvent with us as the source TreeModelEvent nue = new TreeModelEvent (getModel(), e.getPath(), e.getChildIndices(), e.getChildren()); return nue; }
/** Create a change TableModelEvent for the passed TreeModelEvent and the * contiguous subrange of the TreeModelEvent's getChildIndices() value */ private TableModelEvent createTableChangeEvent (TreeModelEvent e, int[] indices) { TableModelEvent result = null; TreePath path = e.getTreePath(); int row = getLayout().getRowForPath(path); int first = null == indices ? row : indices[0]; int last = null == indices ? row : indices[indices.length-1]; //TODO - does not need to be ALL_COLUMNS, but we need a way to determine //which column index is the tree result = new TableModelEvent (getModel(), first, last, TableModelEvent.ALL_COLUMNS, TableModelEvent.UPDATE); return result; }
/** Creates a TableModelEvent identical to the original except that the * column index has been shifted by +1. This is used to refire events * from the ProxyTableModel (generated by RowModel.setValueFor()) as * change events on the OutlineModel. */ private TableModelEvent translateEvent (TableModelEvent e) { TableModelEvent nue = new TableModelEvent (getModel(), e.getFirstRow(), e.getLastRow(), e.getColumn()+1, e.getType()); return nue; }
/** Updates the layout to mark the descendants of the events path as also * expanded if they were the last it was expanded, then fires a table change. */ public void treeExpanded(TreeExpansionEvent event) { assert SwingUtilities.isEventDispatchThread(); log ("treeExpanded", event); //Mysterious how the event could be null, but JTree tests it //so we will too. if(event != null) { updateExpandedDescendants(event.getPath()); } log ("about to fire", pendingExpansionEvent); //Now fire a change on the owning row so its display is updated (it //may have just become an expandable node) TreePath path = event.getPath(); int row = getLayout().getRowForPath(path); TableModelEvent evt = new TableModelEvent (getModel(), row, row, 0, TableModelEvent.UPDATE); if (row == -1) { evt = new TableModelEvent(getModel()); } fireTableChange(new TableModelEvent[] {evt, pendingExpansionEvent}); pendingExpansionEvent = null; inProgressEvent = null; }
return; assert (e.getSource() == getModel());
/** Process a structural change event from the user-supplied tree model. * This will result in a generic "something changed" * TableModelEvent being fired. */ public void treeStructureChanged(TreeModelEvent e) { assert SwingUtilities.isEventDispatchThread(); getLayout().treeStructureChanged(e); fireTreeChange (translateEvent(e), STRUCTURE_CHANGED); //If it's a structural change, we need to dump all our info about the //existing tree structure - it can be bogus now. Similar to JTree, //this will have the effect of collapsing all expanded paths. The //TreePathSupport takes care of dumping the layout cache's copy of //such data getTreePathSupport().clear(); //We will just fire a "Something happened. Go figure out what." event. fireTableChange (new TableModelEvent (getModel())); }
TableModelEvent result = new TableModelEvent (getModel(), firstRow, lastRow, TableModelEvent.ALL_COLUMNS, expand ? TableModelEvent.INSERT : TableModelEvent.DELETE);
log(" toRow: ", new Integer(lastRow)); result = new TableModelEvent (getModel(), firstRow, lastRow, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE);
public void treeCollapsed(TreeExpansionEvent event) { assert SwingUtilities.isEventDispatchThread(); log ("treeExpanded", event); //FixedHeightLayoutCache tests if the event is null. //Don't know how it could be, but there's probably a reason... if(event != null) { TreePath path = event.getPath(); //Tell the layout about the change if(path != null && getTreePathSupport().isVisible(path)) { getLayout().setExpandedState(path, false); } } log ("about to fire", pendingExpansionEvent); //Now fire a change on the owning row so its display is updated (it //may have just become an expandable node) TreePath path = event.getPath(); int row = getLayout().getRowForPath(path); TableModelEvent evt = new TableModelEvent (getModel(), row, row, 0, TableModelEvent.UPDATE); fireTableChange(new TableModelEvent[] {evt, pendingExpansionEvent}); pendingExpansionEvent = null; inProgressEvent = null; }
case NODES_REMOVED : return new TableModelEvent[] { new TableModelEvent (getModel(), row, row, 0, TableModelEvent.UPDATE) };