project35.desktopDeployment
Class NavigationTree

java.lang.Object
  extended by java.awt.Component
      extended by java.awt.Container
          extended by javax.swing.JComponent
              extended by javax.swing.JTree
                  extended by project35.desktopDeployment.NavigationTree
All Implemented Interfaces:
java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, java.util.EventListener, javax.accessibility.Accessible, javax.swing.event.ChangeListener, javax.swing.Scrollable, NavigationView

public class NavigationTree
extends javax.swing.JTree
implements NavigationView, javax.swing.event.ChangeListener

Does management of tree nodes. It is one of the two main UI classes that make the Project35 windows work. The most difficult part of writing this was trying to manage tree events in the following situation:

Most of this complexity was offloaded to another class TreeSelectionEventManager The problems related to the tree's tendency to continue firing events which triggered the event handlers which ended up generating more events... I got around some of this by using the "enableUpdateUI" which tries to control when updates occur. Update by TIM - I have smoothed out a lot of these problems by eliminating all calls to updateUI().

NavigationTree attempts to synhronize selection with a search dialog's list of choices.


Copyright (c) 2008 Kevin Garwood for Project35. The original code was developed by Kevin Garwood for the University of Manchester. Revisions have been made for Project35, a project that is independent of that institution. This code is licensed under the Academic Free License version 3.0. The code attribution for the original code is included here:

Copyright (c) Kevin Garwood, Tim Booth and University of Manchester 2007. All rights reserved. Licensed under the Academic Free License version 3.0. For more information on the terms and conditions, please see the file "LICENSE" that is included in this distribution.


Version:
1.0
Author:
Kevin Garwood (kgarwood@users.sourceforge.net), code contributions from 2002 - September 30, 2007.
See Also:
Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from class javax.swing.JTree
javax.swing.JTree.AccessibleJTree, javax.swing.JTree.DynamicUtilTreeNode, javax.swing.JTree.EmptySelectionModel, javax.swing.JTree.TreeModelHandler, javax.swing.JTree.TreeSelectionRedirector
 
Nested classes/interfaces inherited from class javax.swing.JComponent
javax.swing.JComponent.AccessibleJComponent
 
Nested classes/interfaces inherited from class java.awt.Container
java.awt.Container.AccessibleAWTContainer
 
Nested classes/interfaces inherited from class java.awt.Component
java.awt.Component.AccessibleAWTComponent, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
 
Field Summary
 
Fields inherited from class javax.swing.JTree
ANCHOR_SELECTION_PATH_PROPERTY, CELL_EDITOR_PROPERTY, CELL_RENDERER_PROPERTY, cellEditor, cellRenderer, editable, EDITABLE_PROPERTY, EXPANDS_SELECTED_PATHS_PROPERTY, INVOKES_STOP_CELL_EDITING_PROPERTY, invokesStopCellEditing, LARGE_MODEL_PROPERTY, largeModel, LEAD_SELECTION_PATH_PROPERTY, ROOT_VISIBLE_PROPERTY, rootVisible, ROW_HEIGHT_PROPERTY, rowHeight, SCROLLS_ON_EXPAND_PROPERTY, scrollsOnExpand, SELECTION_MODEL_PROPERTY, selectionModel, selectionRedirector, SHOWS_ROOT_HANDLES_PROPERTY, showsRootHandles, TOGGLE_CLICK_COUNT_PROPERTY, toggleClickCount, TREE_MODEL_PROPERTY, treeModel, treeModelListener, VISIBLE_ROW_COUNT_PROPERTY, visibleRowCount
 
Fields inherited from class javax.swing.JComponent
accessibleContext, listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
 
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
NavigationTree(Project35UIFactory project35UIFactory)
           
 
Method Summary
 void acknowledgeChangesMade()
           
 void addChangeListener(javax.swing.event.ChangeListener changeListener)
           
 void addNode(RecordNameProvider parentRecordNameProvider, RecordNameProvider childRecordNameProvider)
           
 void addSubTree(RecordModel parentRecordNameProvider, RecordNameProvider childSubTreeRecordNameProvider)
           
 NavigationTreeNode addSubTreeNode(NavigationTreeNode parentNode, RecordNameProvider childRecordNameProvider, java.util.ArrayList changeListeners)
           
 void addSubTrees(RecordModel parentRecordNameProvider, java.util.ArrayList subTreeRoots)
           
 void addToKeyList(NavigationTreeNode node)
           
 java.util.ArrayList applySearch(java.lang.String searchMask)
           
 void changeFont(java.awt.Font font)
           
 void deleteNode(RecordNameProvider recordNameProvider)
           
 boolean fileHasErrors()
          indicates whether the current file has errors
 NavigationTreeNode getActiveNode()
           
 NavigationTreeNode getNodeFromRecordNameProvider(RecordNameProvider recordNameProvider)
           
 java.util.ArrayList getRecordModels()
           
 NavigationTreeNode getRoot()
           
 void markNodeWithComments(RecordNameProvider recordNameProvider)
           
 boolean nodesAddedOrDeleted()
           
 void pasteNode(RecordNameProvider targetRecordNameProvider, RecordNameProvider pasteRecordNameProvider)
           
 void pasteNode(RecordNameProvider targetRecordNameProvider, RecordNameProvider pasteRecordNameProvider, boolean promptUserForAcceptingChanges)
          the idea here is to "paste" pasteModel in place of targetModel in the tree.
 void resetDisplay()
           
 void setActiveNode(RecordNameProvider recordNameProvider)
           
 void setNodesAddedOrDeleted(boolean nodesAddedOrDeleted)
           
 void setRecordView(RecordView recordView)
           
 void setRoot(NavigationTreeNode rootNode)
           
 void setRoot(RecordModel rootRecordModel)
           
 void setSelectedNode(NavigationTreeNode node)
           
 void shiftSelectedNode(boolean directionIsUp)
           
 void shiftSelectedNodeDown()
           
 void shiftSelectedNodeUp()
           
 void showChanges()
           
 void showError(RecordModel recordModel)
          tells the tree to paint the node associated with a recordModel so that it indicates an error.
 void showNode(NavigationTreeNode node)
           
 void showNode(RecordNameProvider recordNameProvider)
           
 void stateChanged(javax.swing.event.ChangeEvent event)
           
 void updateDateFields()
           
 void updateNode(NavigationTreeNode node)
           
 void updateNode(RecordNameProvider recordNameProvider)
           
 
Methods inherited from class javax.swing.JTree
addSelectionInterval, addSelectionPath, addSelectionPaths, addSelectionRow, addSelectionRows, addTreeExpansionListener, addTreeSelectionListener, addTreeWillExpandListener, cancelEditing, clearSelection, clearToggledPaths, collapsePath, collapseRow, convertValueToText, createTreeModel, createTreeModelListener, expandPath, expandRow, fireTreeCollapsed, fireTreeExpanded, fireTreeWillCollapse, fireTreeWillExpand, fireValueChanged, getAccessibleContext, getAnchorSelectionPath, getCellEditor, getCellRenderer, getClosestPathForLocation, getClosestRowForLocation, getDefaultTreeModel, getDescendantToggledPaths, getDragEnabled, getEditingPath, getExpandedDescendants, getExpandsSelectedPaths, getInvokesStopCellEditing, getLastSelectedPathComponent, getLeadSelectionPath, getLeadSelectionRow, getMaxSelectionRow, getMinSelectionRow, getModel, getNextMatch, getPathBetweenRows, getPathBounds, getPathForLocation, getPathForRow, getPreferredScrollableViewportSize, getRowBounds, getRowCount, getRowForLocation, getRowForPath, getRowHeight, getScrollableBlockIncrement, getScrollableTracksViewportHeight, getScrollableTracksViewportWidth, getScrollableUnitIncrement, getScrollsOnExpand, getSelectionCount, getSelectionModel, getSelectionPath, getSelectionPaths, getSelectionRows, getShowsRootHandles, getToggleClickCount, getToolTipText, getTreeExpansionListeners, getTreeSelectionListeners, getTreeWillExpandListeners, getUI, getUIClassID, getVisibleRowCount, hasBeenExpanded, isCollapsed, isCollapsed, isEditable, isEditing, isExpanded, isExpanded, isFixedRowHeight, isLargeModel, isPathEditable, isPathSelected, isRootVisible, isRowSelected, isSelectionEmpty, isVisible, makeVisible, paramString, removeDescendantSelectedPaths, removeDescendantToggledPaths, removeSelectionInterval, removeSelectionPath, removeSelectionPaths, removeSelectionRow, removeSelectionRows, removeTreeExpansionListener, removeTreeSelectionListener, removeTreeWillExpandListener, scrollPathToVisible, scrollRowToVisible, setAnchorSelectionPath, setCellEditor, setCellRenderer, setDragEnabled, setEditable, setExpandedState, setExpandsSelectedPaths, setInvokesStopCellEditing, setLargeModel, setLeadSelectionPath, setModel, setRootVisible, setRowHeight, setScrollsOnExpand, setSelectionInterval, setSelectionModel, setSelectionPath, setSelectionPaths, setSelectionRow, setSelectionRows, setShowsRootHandles, setToggleClickCount, setUI, setVisibleRowCount, startEditingAtPath, stopEditing, treeDidChange, updateUI
 
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
 
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusBackward, transferFocusDownCycle, validate, validateTree
 
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusUpCycle
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

NavigationTree

public NavigationTree(Project35UIFactory project35UIFactory)
Method Detail

nodesAddedOrDeleted

public boolean nodesAddedOrDeleted()

getNodeFromRecordNameProvider

public NavigationTreeNode getNodeFromRecordNameProvider(RecordNameProvider recordNameProvider)

getRecordModels

public java.util.ArrayList getRecordModels()

addChangeListener

public void addChangeListener(javax.swing.event.ChangeListener changeListener)

acknowledgeChangesMade

public void acknowledgeChangesMade()

setNodesAddedOrDeleted

public void setNodesAddedOrDeleted(boolean nodesAddedOrDeleted)

getRoot

public NavigationTreeNode getRoot()

showChanges

public void showChanges()

resetDisplay

public void resetDisplay()

updateDateFields

public void updateDateFields()

pasteNode

public void pasteNode(RecordNameProvider targetRecordNameProvider,
                      RecordNameProvider pasteRecordNameProvider)

pasteNode

public void pasteNode(RecordNameProvider targetRecordNameProvider,
                      RecordNameProvider pasteRecordNameProvider,
                      boolean promptUserForAcceptingChanges)
the idea here is to "paste" pasteModel in place of targetModel in the tree. Updates to the display will be signalled within the call.


shiftSelectedNodeUp

public void shiftSelectedNodeUp()

shiftSelectedNodeDown

public void shiftSelectedNodeDown()

shiftSelectedNode

public void shiftSelectedNode(boolean directionIsUp)

applySearch

public java.util.ArrayList applySearch(java.lang.String searchMask)

setRecordView

public void setRecordView(RecordView recordView)

showNode

public void showNode(RecordNameProvider recordNameProvider)
Specified by:
showNode in interface NavigationView

markNodeWithComments

public void markNodeWithComments(RecordNameProvider recordNameProvider)

showNode

public void showNode(NavigationTreeNode node)

updateNode

public void updateNode(RecordNameProvider recordNameProvider)

updateNode

public void updateNode(NavigationTreeNode node)

setRoot

public void setRoot(RecordModel rootRecordModel)

getActiveNode

public NavigationTreeNode getActiveNode()

setRoot

public void setRoot(NavigationTreeNode rootNode)

addToKeyList

public void addToKeyList(NavigationTreeNode node)

addSubTrees

public void addSubTrees(RecordModel parentRecordNameProvider,
                        java.util.ArrayList subTreeRoots)

addSubTree

public void addSubTree(RecordModel parentRecordNameProvider,
                       RecordNameProvider childSubTreeRecordNameProvider)

addSubTreeNode

public NavigationTreeNode addSubTreeNode(NavigationTreeNode parentNode,
                                         RecordNameProvider childRecordNameProvider,
                                         java.util.ArrayList changeListeners)

addNode

public void addNode(RecordNameProvider parentRecordNameProvider,
                    RecordNameProvider childRecordNameProvider)

deleteNode

public void deleteNode(RecordNameProvider recordNameProvider)

setActiveNode

public void setActiveNode(RecordNameProvider recordNameProvider)
Specified by:
setActiveNode in interface NavigationView

setSelectedNode

public void setSelectedNode(NavigationTreeNode node)

stateChanged

public void stateChanged(javax.swing.event.ChangeEvent event)
Specified by:
stateChanged in interface javax.swing.event.ChangeListener

showError

public void showError(RecordModel recordModel)
tells the tree to paint the node associated with a recordModel so that it indicates an error.

Parameters:
recordModel - the record model object that holds information for a single record.

fileHasErrors

public boolean fileHasErrors()
indicates whether the current file has errors

Returns:
true if the file has errors

changeFont

public void changeFont(java.awt.Font font)