org.gjt.sp.util

## Class EnhancedTreeCellRenderer

- java.lang.Object
- - java.awt.Component
  - - java.awt.Container
    - - javax.swing.JComponent
      - - javax.swing.JLabel
        - - javax.swing.tree.DefaultTreeCellRenderer
          - - org.gjt.sp.util.EnhancedTreeCellRenderer

- All Implemented Interfaces:
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.SwingConstants, javax.swing.tree.TreeCellRenderer
  Direct Known Subclasses:
    OptionsDialog.PaneNameRenderer

      public abstract class EnhancedTreeCellRenderer
      extends javax.swing.tree.DefaultTreeCellRenderer

  An enhancement of the `DefaultTreeCellRenderer` to be used as superclass for custom tree cell renderers. Using `DefaultTreeCellRenderer` as superclass for a custom tree cell renderer without further measures is not stable in regards to on-the-fly Look and Feel changes, at least not with Java 6. For Java 7 it should be tested again.

  With Java 6 the `DefaultTreeCellRenderer` initializes some values according to the Look and Feel in its constructor. If the `DefaultTreeCellRenderer` is created by the `JTree` code, it is recreated on a Look and Feel change. This way all works fine. But if a tree cell renderer is set explicitly on the `JTree`, no matter whether `DefaultTreeCellRenderer`, a subclass of it or a complete own implementation, the set instance is used beyond Look and Feel boundaries and this causes two problems.

  1. The values that were initialized in the constructor of `DefaultTreeCellRenderer` are not reset according to the new Look and Feel. Some values are partly set by the `JTree` code, but this is not complete and reliable and thus the renderer paints the tree cells wrongly.
  2. The Look and Feel change is first applied to the `JTree`, then the sizes of the tree cells which are saved in a cache are recalculated. Only after that, the children of the `JTree` get the new Look and Feel applied, amongst them also the tree cell renderer.
     So even if a custom tree cell renderer is aware of on-the-fly Look and Feel changes by reinitializing values from the Look and Feel if it changes, those cached sizes are still calculated for the old Look and Feel. The only way to work around this is to cause the cached sizes to be recalculated. This can be done by changing any significant property of the `JTree` which influences size calculations.

  To work around the described problems this enhanced tree cell renderer listens for Look and Feel changes on the `JTree` where this renderer is used, requests a subclass to create a new instance of the renderer and sets it on the `JTree`. By doing so the `DefaultTreeCellRenderer` reinitializes to the new Look and Feel in its constructor and the `JTree` recalculates the cached size values because a different object is set as tree cell renderer.

  See Also:
    Serialized Form

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from class javax.swing.JLabel

      `javax.swing.JLabel.AccessibleJLabel`

    - ### 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.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy`

  - ### Field Summary

    - ### Fields inherited from class javax.swing.tree.DefaultTreeCellRenderer

      `backgroundNonSelectionColor, backgroundSelectionColor, borderSelectionColor, closedIcon, hasFocus, leafIcon, openIcon, selected, textNonSelectionColor, textSelectionColor`

    - ### Fields inherited from class javax.swing.JLabel

      `labelFor`

    - ### Fields inherited from class javax.swing.JComponent

      `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

      `accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT`

    - ### Fields inherited from interface javax.swing.SwingConstants

      `BOTTOM, CENTER, EAST, HORIZONTAL, LEADING, LEFT, NEXT, NORTH, NORTH_EAST, NORTH_WEST, PREVIOUS, RIGHT, SOUTH, SOUTH_EAST, SOUTH_WEST, TOP, TRAILING, VERTICAL, WEST`

    - ### Fields inherited from interface java.awt.image.ImageObserver

      `ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `EnhancedTreeCellRenderer()`

  - ### Method Summary

    All Methods Instance Methods Abstract Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected abstract void` | `configureTreeCellRendererComponent(javax.swing.JTree tree, java.lang.Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)` Configures this instance of the renderer component based on the passed in components.
    `java.awt.Component` | `getTreeCellRendererComponent(javax.swing.JTree tree, java.lang.Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)`
    `protected abstract javax.swing.tree.TreeCellRenderer` | `newInstance()` Creates a new instance of the tree cell renderer.

    - ### Methods inherited from class javax.swing.tree.DefaultTreeCellRenderer

      `firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackgroundNonSelectionColor, getBackgroundSelectionColor, getBorderSelectionColor, getClosedIcon, getDefaultClosedIcon, getDefaultLeafIcon, getDefaultOpenIcon, getFont, getLeafIcon, getOpenIcon, getPreferredSize, getTextNonSelectionColor, getTextSelectionColor, invalidate, paint, repaint, repaint, repaint, revalidate, setBackground, setBackgroundNonSelectionColor, setBackgroundSelectionColor, setBorderSelectionColor, setClosedIcon, setFont, setLeafIcon, setOpenIcon, setTextNonSelectionColor, setTextSelectionColor, updateUI, validate`

    - ### Methods inherited from class javax.swing.JLabel

      `checkHorizontalKey, checkVerticalKey, getAccessibleContext, getDisabledIcon, getDisplayedMnemonic, getDisplayedMnemonicIndex, getHorizontalAlignment, getHorizontalTextPosition, getIcon, getIconTextGap, getLabelFor, getText, getUI, getUIClassID, getVerticalAlignment, getVerticalTextPosition, imageUpdate, paramString, setDisabledIcon, setDisplayedMnemonic, setDisplayedMnemonic, setDisplayedMnemonicIndex, setHorizontalAlignment, setHorizontalTextPosition, setIcon, setIconTextGap, setLabelFor, setText, setUI, setVerticalAlignment, setVerticalTextPosition`

    - ### Methods inherited from class javax.swing.JComponent

      `addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, 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, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, 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, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, 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, 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, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Constructor Detail

    - #### EnhancedTreeCellRenderer

          public EnhancedTreeCellRenderer()

  - ### Method Detail

    - #### getTreeCellRendererComponent

          public final java.awt.Component getTreeCellRendererComponent(javax.swing.JTree tree,
                                                                       java.lang.Object value,
                                                                       boolean selected,
                                                                       boolean expanded,
                                                                       boolean leaf,
                                                                       int row,
                                                                       boolean hasFocus)

      Specified by:
        `getTreeCellRendererComponent` in interface `javax.swing.tree.TreeCellRenderer`
      Overrides:
        `getTreeCellRendererComponent` in class `javax.swing.tree.DefaultTreeCellRenderer`

    - #### newInstance

          protected abstract javax.swing.tree.TreeCellRenderer newInstance()

      Creates a new instance of the tree cell renderer. Each invocation has to return a different object. Saving a reference and returning the same instance from different calls of this method is not appropriate.

      Any one-time initializations that are necessary and are not made in the constructor should be made in this method. The simplest implementation of this method will just call the constructor and return the result.

      This is an instance method so that the new instance can be set up with information from the current instance.

      Returns:
        a new readily initialized instance of this class

    - #### configureTreeCellRendererComponent

          protected abstract void configureTreeCellRendererComponent(javax.swing.JTree tree,
                                                                     java.lang.Object value,
                                                                     boolean selected,
                                                                     boolean expanded,
                                                                     boolean leaf,
                                                                     int row,
                                                                     boolean hasFocus)

      Configures this instance of the renderer component based on the passed in components. The value is set from messaging the tree with convertValueToText, which ultimately invokes toString on value. The foreground color is set based on the selection and the icon is set based on the leaf and expanded parameters. The parameters of this method are the same as the ones of `getTreeCellRendererComponent(JTree, Object, boolean, boolean, boolean, int, boolean)`.
      Parameters:
        `tree` - The tree in which this renderer component is used currently
        `value` - The value to be displayed for the tree cell to be rendered
        `selected` - Whether the tree cell to be rendered is selected
        `expanded` - Whether the tree cell to be rendered is expanded
        `leaf` - Whether the tree cell to be rendered is a leaf
        `row` - The row index of the tree cell to be rendered
        `hasFocus` - Whether the tree cell to be rendered has the focus