commit-classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commit-cp] classpath/javax/swing JTree.java plaf/basic/Bas...


From: Roman Kennke
Subject: [commit-cp] classpath/javax/swing JTree.java plaf/basic/Bas...
Date: Wed, 07 Jun 2006 14:36:03 +0000

CVSROOT:        /cvsroot/classpath
Module name:    classpath
Changes by:     Roman Kennke <rabbit78> 06/06/07 14:36:03

Modified files:
        javax/swing    : JTree.java 
        javax/swing/plaf/basic: BasicTreeUI.java 
        javax/swing/tree: DefaultTreeCellEditor.java TreePath.java 
                          VariableHeightLayoutCache.java 

Log message:
        2006-06-06  Roman Kennke  <address@hidden>
        
                PR 27920
                * javax/swing/JTree.java
                (JTree()): Initialize with default model.
                (JTree(TreeModel)): Clear expanded state hashtable. Added 
comment
                on the updateUI() / setModel() order.
                (setModel): Correctly (un-)setup the listeners. Clear the 
expanded
                paths.
                * javax/swing/plaf/basic/BasicTreeUI.java
                (BasicTreeUI()): Initialize listeners in installListeners().
                (setModel): Complete editing on model change. Correctly resetup
                the listeners. Update the layout cache accordingly.
                (setShowRootHandles): Complete editing and update layout. Do not
                call back into the JTree, this could cause cycles.
                (prepareForUIInstall): Implemented. Moved some init code from
                installUI() to this method.
                (completeUIInstall): Implemented. Moved some init code from
                installUI() to this method.
                (createDefaultCellEditor): Check for type of renderer, and 
install
                with null renderer when not DefaultTreeCellRenderer.
                (updateLayoutCacheExpandedNodes): Added null check for tree root
                to avoid NPE.
                (updateRenderer): Call updateEditor().
                (installListeners): Initialize the listeners here. Added some 
null
                checks to avoid NPEs.
                (installUI): Moved some init code to prepareForUIInstall() and
                completeUIInstall().
                (completeEditing): Return immediately if editing component is 
null
                or if the setting is to not stop editing on complete editing.
                (checkForClickInExpandControl): Call handleExpandControlClick()
                instead of toggleExpandState() directly.
                (isLocationInExpandControl): Rewritten to correctly determine 
the
                expand click location.
                (MouseHandler.mousePressed): Rewritten to make better use of the
                instance methods of BasicTreeUI to handle the click.
                (PropertyHandler.propertyChange): Handle model and cell renderer
                updates.
                * javax/swing/tree/DefaultTreeCellEditor.java
                (DefaultTreeCellEditor): Removed initialization of the icon. 
This
                is done so that the constructor can deal with null renderer as 
the
                RI does. Maybe this needs more fixing.
                * javax/swing/tree/TreePath.java
                (isDescendant): Fixed this method. The previous version did too
                much and compared the wrong things, which lead to a 
ClassCastException
                in equals().
                * javax/swing/tree/VariableHeightLayoutCache.java
                (update): Do nothing when model is null.
                (setModel): Clear the tables and update the layout. Added null
                check to prevent NPE.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/JTree.java?cvsroot=classpath&r1=1.68&r2=1.69
http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/plaf/basic/BasicTreeUI.java?cvsroot=classpath&r1=1.139&r2=1.140
http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/tree/DefaultTreeCellEditor.java?cvsroot=classpath&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/tree/TreePath.java?cvsroot=classpath&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/tree/VariableHeightLayoutCache.java?cvsroot=classpath&r1=1.15&r2=1.16

Patches:
Index: JTree.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/JTree.java,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -b -r1.68 -r1.69
--- JTree.java  6 Jun 2006 15:34:56 -0000       1.68
+++ JTree.java  7 Jun 2006 14:36:02 -0000       1.69
@@ -1478,7 +1478,7 @@
    */
   public JTree()
   {
-    this(createTreeModel(null));
+    this(getDefaultTreeModel());
   }
 
   /**
@@ -1513,7 +1513,12 @@
     selectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
     
     // The root node appears expanded by default.
-    nodeStates.put(new TreePath(model.getRoot()), EXPANDED);
+    nodeStates = new Hashtable();
+
+    // Install the UI before installing the model. This way we avoid double
+    // initialization of lots of UI and model stuff inside the UI and related
+    // classes. The necessary UI updates are performed via property change
+    // events to the UI.
     updateUI();
     setModel(model);
   }
@@ -1897,6 +1902,10 @@
     if (treeModel == model)
       return;
 
+    // Remove listeners from old model.
+    if (treeModel != null && treeModelListener != null)
+      treeModel.removeTreeModelListener(treeModelListener);
+
     // add treeModelListener to the new model
     if (treeModelListener == null)
       treeModelListener = createTreeModelListener();
@@ -1905,6 +1914,20 @@
 
     TreeModel oldValue = treeModel;
     treeModel = model;
+    clearToggledPaths();
+
+    if (treeModel != null)
+      {
+        if (treeModelListener == null)
+          treeModelListener = createTreeModelListener();
+        if (treeModelListener != null)
+          treeModel.addTreeModelListener(treeModelListener);
+        Object root = treeModel.getRoot();
+        if (root != null && !treeModel.isLeaf(root))
+          {
+            nodeStates.put(new TreePath(root), Boolean.TRUE);
+          }
+      }
 
     firePropertyChange(TREE_MODEL_PROPERTY, oldValue, model);
   }

Index: plaf/basic/BasicTreeUI.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTreeUI.java,v
retrieving revision 1.139
retrieving revision 1.140
diff -u -b -r1.139 -r1.140
--- plaf/basic/BasicTreeUI.java 25 May 2006 08:51:13 -0000      1.139
+++ plaf/basic/BasicTreeUI.java 7 Jun 2006 14:36:03 -0000       1.140
@@ -49,7 +49,6 @@
 import java.awt.Graphics;
 import java.awt.Insets;
 import java.awt.Label;
-import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -307,17 +306,6 @@
     nodeDimensions = createNodeDimensions();
     configureLayoutCache();
 
-    propertyChangeListener = createPropertyChangeListener();
-    focusListener = createFocusListener();
-    treeSelectionListener = createTreeSelectionListener();
-    mouseListener = createMouseListener();
-    keyListener = createKeyListener();
-    selectionModelPropertyChangeListener = 
createSelectionModelPropertyChangeListener();
-    componentListener = createComponentListener();
-    cellEditorListener = createCellEditorListener();
-    treeExpansionListener = createTreeExpansionListener();
-    treeModelListener = createTreeModelListener();
-
     editingRow = - 1;
     lastSelectedRow = - 1;
   }
@@ -513,9 +501,22 @@
    */
   protected void setModel(TreeModel model)
   {
-    tree.setModel(model);
+    completeEditing();
+
+    if (treeModel != null && treeModelListener != null)
+      treeModel.removeTreeModelListener(treeModelListener);
+
     treeModel = tree.getModel();
+
+    if (treeModel != null && treeModelListener != null)
+      treeModel.addTreeModelListener(treeModelListener);
+
+    if (treeState != null)
+      {
     treeState.setModel(treeModel);
+        updateLayoutCacheExpandedNodes();
+        updateSize();
+      }
   }
 
   /**
@@ -555,7 +556,13 @@
    */
   protected void setShowsRootHandles(boolean newValue)
   {
-    tree.setShowsRootHandles(newValue);
+    completeEditing();
+    updateDepthOffset();
+    if (treeState != null)
+      {
+        treeState.invalidateSizes();
+        updateSize();
+      }
   }
 
   /**
@@ -822,9 +829,12 @@
    * default/listeners have been installed.
    */
   protected void prepareForUIInstall()
-  throws NotImplementedException
   {
-    // TODO: Implement this properly.
+    lastSelectedRow = -1;
+    preferredSize = new Dimension();
+    largeModel = tree.isLargeModel();
+    preferredSize = new Dimension();
+    setModel(tree.getModel());
   }
 
   /**
@@ -832,9 +842,15 @@
    * installed.
    */
   protected void completeUIInstall()
-  throws NotImplementedException
   {
-    // TODO: Implement this properly.
+    setShowsRootHandles(tree.getShowsRootHandles());
+    updateRenderer();
+    updateDepthOffset();
+    setSelectionModel(tree.getSelectionModel());
+    treeState = createLayoutCache();
+    treeSelectionModel.setRowMapper(treeState);
+    configureLayoutCache();
+    updateSize();
   }
 
   /**
@@ -997,15 +1013,14 @@
    */
   protected TreeCellEditor createDefaultCellEditor()
   {
-    if (currentCellRenderer != null)
-      return new DefaultTreeCellEditor(
-                                       tree,
-                                       (DefaultTreeCellRenderer) 
currentCellRenderer,
-                                       cellEditor);
-    return new DefaultTreeCellEditor(
-                                     tree,
-                                     (DefaultTreeCellRenderer) 
createDefaultCellRenderer(),
-                                     cellEditor);
+    DefaultTreeCellEditor ed;
+    if (currentCellRenderer != null
+        && currentCellRenderer instanceof DefaultTreeCellRenderer)
+      ed = new DefaultTreeCellEditor(tree,
+                                (DefaultTreeCellRenderer) currentCellRenderer);
+    else
+      ed = new DefaultTreeCellEditor(tree, null);
+    return ed;
   }
 
   /**
@@ -1102,7 +1117,7 @@
    */
   protected void updateLayoutCacheExpandedNodes()
   {
-    if (treeModel != null)
+    if (treeModel != null && treeModel.getRoot() != null)
       updateExpandedDescendants(new TreePath(treeModel.getRoot()));
   }
 
@@ -1161,6 +1176,8 @@
 
     if (currentCellRenderer == null)
       currentCellRenderer = createDefaultCellRenderer();
+
+    updateCellEditor();
   }
 
   /**
@@ -1317,16 +1334,41 @@
    */
   protected void installListeners()
   {
+    propertyChangeListener = createPropertyChangeListener();
     tree.addPropertyChangeListener(propertyChangeListener);
+
+    focusListener = createFocusListener();
     tree.addFocusListener(focusListener);
+
+    treeSelectionListener = createTreeSelectionListener();
     tree.addTreeSelectionListener(treeSelectionListener);
+
+    mouseListener = createMouseListener();
     tree.addMouseListener(mouseListener);
+
+    keyListener = createKeyListener();
     tree.addKeyListener(keyListener);
-    tree.addPropertyChangeListener(selectionModelPropertyChangeListener);
+
+    selectionModelPropertyChangeListener =
+      createSelectionModelPropertyChangeListener();
+    if (treeSelectionModel != null
+        && selectionModelPropertyChangeListener != null)
+      {
+        treeSelectionModel.addPropertyChangeListener
+                                        (selectionModelPropertyChangeListener);
+      }
+
+    componentListener = createComponentListener();
     tree.addComponentListener(componentListener);
+
+    treeExpansionListener = createTreeExpansionListener();
     tree.addTreeExpansionListener(treeExpansionListener);
+
+    treeModelListener = createTreeModelListener();
     if (treeModel != null)
       treeModel.addTreeModelListener(treeModelListener);
+
+    cellEditorListener = createCellEditorListener();
   }
 
   /**
@@ -1337,25 +1379,12 @@
   public void installUI(JComponent c)
   {
     tree = (JTree) c;
-    treeModel = tree.getModel();
 
     prepareForUIInstall();
-    super.installUI(c);
     installDefaults();
     installComponents();
     installKeyboardActions();
     installListeners();
-
-    setCellEditor(createDefaultCellEditor());
-    createdCellEditor = true;
-    isEditing = false;
-
-    setModel(tree.getModel());
-    treeSelectionModel = tree.getSelectionModel();
-    setRootVisible(tree.isRootVisible());
-    treeState.setRootVisible(tree.isRootVisible());
-    updateExpandedDescendants(new TreePath(new Object[] { treeModel.getRoot() 
}));
-
     completeUIInstall();
   }
   
@@ -1613,6 +1642,9 @@
   protected void completeEditing(boolean messageStop, boolean messageCancel,
                                  boolean messageTree)
   {
+    if (! stopEditingInCompleteEditing || editingComponent == null)
+      return;
+
     if (messageStop)
       {
         getCellEditor().stopCellEditing();
@@ -1698,7 +1730,7 @@
                                               int mouseY)
   {
     if (isLocationInExpandControl(path, mouseX, mouseY))
-      toggleExpandState(path);
+      handleExpandControlClick(path, mouseX, mouseY);
   }
 
   /**
@@ -1717,16 +1749,17 @@
                                               int mouseY)
   {
     boolean cntlClick = false;
-    int row = getRowForPath(tree, path);
-
-    if (! isLeaf(row))
+    if (! treeModel.isLeaf(path.getLastPathComponent()))
       {
-        Rectangle bounds = getPathBounds(tree, path);
-
-        if (hasControlIcons()
-            && (mouseX < bounds.x)
-            && (mouseX > (bounds.x - 
getCurrentControlIcon(path).getIconWidth() - gap)))
-          cntlClick = true;
+        int width = 8; // Only guessing.
+        Icon expandedIcon = getExpandedIcon();
+        if (expandedIcon != null)
+          width = expandedIcon.getIconWidth();
+
+        Insets i = tree.getInsets();
+        int left = getRowX(tree.getRowForPath(path), path.getPathCount() - 1)
+                   -getRightChildIndent() - width / 2 + i.left;
+        cntlClick = mouseX >= left && mouseX <= left + width;
       }
     return cntlClick;
   }
@@ -2203,95 +2236,30 @@
      */
     public void mousePressed(MouseEvent e)
     {
-      // Any mouse click cancels the previous waiting edit action, initiated
-      // by the single click on the selected node.
-      if (startEditTimer != null)
+
+      if (tree != null && tree.isEnabled())
         {
-          startEditTimer.stop();
-          startEditTimer = null;
-        }
+          // Maybe stop editing and return.
+          if (isEditing(tree) && tree.getInvokesStopCellEditing()
+              && !stopEditing(tree))
+            return;
 
-      Point click = e.getPoint();
-      TreePath path = getClosestPathForLocation(tree, click.x, click.y);
+          int x = e.getX();
+          int y = e.getY();
+          TreePath path = getClosestPathForLocation(tree, x, y);
 
       if (path != null)
         {
           Rectangle bounds = getPathBounds(tree, path);
-          int row = getRowForPath(tree, path);
+              if (SwingUtilities.isLeftMouseButton(e))
+                checkForClickInExpandControl(path, x, y);
           
-          // Cancel the editing session if clicked on the different row.
-          if (tree.isEditing() && row != editingRow)
-            cancelEditing(tree);
-          
-          boolean cntlClick = isLocationInExpandControl(path, click.x, 
click.y);
-
-          boolean isLeaf = isLeaf(row);
-
-          TreeCellRenderer tcr = getCellRenderer();
-          Icon icon;
-          if (isLeaf)
-            icon = UIManager.getIcon("Tree.leafIcon");
-          else if (tree.isExpanded(path))
-            icon = UIManager.getIcon("Tree.openIcon");
-          else
-            icon = UIManager.getIcon("Tree.closedIcon");
-
-          if (tcr instanceof DefaultTreeCellRenderer)
+              if (x > bounds.x && x <= (bounds.x + bounds.width))
             {
-              Icon tmp = ((DefaultTreeCellRenderer) tcr).getIcon();
-              if (tmp != null)
-                icon = tmp;
-            }
-
-          // add gap*2 for the space before and after the text
-          if (icon != null)
-            bounds.width += icon.getIconWidth() + gap * 2;
-
-          boolean inBounds = bounds.contains(click.x, click.y);
-          if ((inBounds || cntlClick) && tree.isVisible(path))
-            {
-              if (inBounds)
-                {
-                  TreePath currentLead = tree.getLeadSelectionPath();
-                  if (currentLead != null && currentLead.equals(path)
-                      && e.getClickCount() == 1 && tree.isEditable())
-                    {
-                      // Schedule the editing session.
-                      final TreePath editPath = path;
-
-                      if (startEditTimer != null)
-                        startEditTimer.stop();
-
-                      startEditTimer = new Timer(WAIT_TILL_EDITING,
-                        new ActionListener()
-                          {
-                            public void actionPerformed(ActionEvent e)
-                              {
-                                startEditing(editPath, EDIT);
-                              }
-                          });
-                      startEditTimer.setRepeats(false);
-                      startEditTimer.start();
-                    }
-                  else
-                    {
-                      if (e.getClickCount() == 2 && ! isLeaf(row))
-                        toggleExpandState(path);
-                      else
+                  if (! startEditing(path, e))
                         selectPathForEvent(path, e);
                     }
                 }
-
-              if (cntlClick)
-                {
-                  handleExpandControlClick(path, click.x, click.y);
-                  if (cellEditor != null)
-                    cellEditor.cancelCellEditing();
-                  tree.scrollPathToVisible(path);
-                }
-              else if (tree.isEditable())
-                startEditing(path, e);
-            }
         }
     }
 
@@ -2555,8 +2523,14 @@
         }
       else if (property.equals(JTree.TREE_MODEL_PROPERTY))
         {
-          treeModel = tree.getModel();
-          treeModel.addTreeModelListener(treeModelListener);
+          setModel(tree.getModel());
+        }
+      else if (property.equals(JTree.CELL_RENDERER_PROPERTY))
+        {
+          setCellRenderer(tree.getCellRenderer());
+          // Update layout.
+          if (treeState != null)
+            treeState.invalidateSizes();
         }
     }
   }

Index: tree/DefaultTreeCellEditor.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/swing/tree/DefaultTreeCellEditor.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- tree/DefaultTreeCellEditor.java     20 Apr 2006 11:57:47 -0000      1.21
+++ tree/DefaultTreeCellEditor.java     7 Jun 2006 14:36:03 -0000       1.22
@@ -382,7 +382,6 @@
     editingContainer = createContainer();
     setFont(UIManager.getFont("Tree.font"));
     setBorderSelectionColor(UIManager.getColor("Tree.selectionBorderColor"));
-    editingIcon = renderer.getIcon();
   }
 
   /**

Index: tree/TreePath.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/tree/TreePath.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- tree/TreePath.java  27 Apr 2006 08:23:45 -0000      1.11
+++ tree/TreePath.java  7 Jun 2006 14:36:03 -0000       1.12
@@ -262,14 +262,16 @@
     if (path == null)
       return false;
     int count = getPathCount();
-    if (path.getPathCount() < count)
+    int otherPathLength = path.getPathCount();
+    if (otherPathLength < count)
       return false;
-    for (int i = 0; i < count; i++)
+    while (otherPathLength > count)
     {
-      if (!this.path[i].equals(path.getPathComponent(i)))
-        return false;
+        otherPathLength--;
+        path = path.getParentPath();
     }
-    return true;
+    
+    return equals(path);
   }
 
   /**

Index: tree/VariableHeightLayoutCache.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/swing/tree/VariableHeightLayoutCache.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- tree/VariableHeightLayoutCache.java 23 May 2006 16:01:38 -0000      1.15
+++ tree/VariableHeightLayoutCache.java 7 Jun 2006 14:36:03 -0000       1.16
@@ -232,6 +232,9 @@
     
     totalHeight = maximalWidth = 0;
 
+    if (treeModel == null)
+      return;
+
     Object root = treeModel.getRoot();
 
     if (rootVisible)
@@ -555,10 +558,17 @@
   public void setModel(TreeModel newModel)
   {
     treeModel = newModel;
+    // We need to clear the table and update the layout,
+    // so that we don't end up with wrong data in the tables.
+    expanded.clear();
+    update();
+    if (treeModel != null)
+      {
     // The root node is expanded by default.
     expanded.add(treeModel.getRoot());
     dirty = true;
   }
+  }
   
   /**
    * Inform the instance if the tree root node is visible. If this method




reply via email to

[Prev in Thread] Current Thread [Next in Thread]