This fixes a regression in JTree/BasicTreeUI as pointed out in http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28534 .

A mauve test for the regression has also been committed. Please merge this to the release branch.

2006-07-31  Roman Kennke  <[EMAIL PROTECTED]>

        PR 28534
        * javax/swing/JTree.java
        (JTree(TreeModel)): Set cell renderer to null.
        * javax/swing/plaf/basic/BasicTreeUI.java
        (setCellRenderer): Finish editing before setting the
        cell renderer. Refresh the layout. Don't set the
        currentCellRenderer field here (that's done in updateRenderer).
        (updateRenderer): Handle createdRenderer field here too.
        Set renderer to a default handler when the current renderer
        in the JTree is null.

/Roman
Index: javax/swing/JTree.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/JTree.java,v
retrieving revision 1.70
diff -u -1 -2 -r1.70 JTree.java
--- javax/swing/JTree.java	3 Jul 2006 22:28:31 -0000	1.70
+++ javax/swing/JTree.java	1 Aug 2006 14:40:29 -0000
@@ -1506,24 +1506,27 @@
    * 
    * @param model the model to use
    */
   public JTree(TreeModel model)
   {
     setRootVisible(true);
     setSelectionModel(new EmptySelectionModel());
     selectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
     
     // The root node appears expanded by default.
     nodeStates = new Hashtable();
 
+    // The cell renderer gets set by the UI.
+    cellRenderer = null;
+
     // 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);
   }
 
   /**
    * Creates a new <code>JTree</code> object.
    * 
    * @param root the root node
Index: javax/swing/plaf/basic/BasicTreeUI.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTreeUI.java,v
retrieving revision 1.150
diff -u -1 -2 -r1.150 BasicTreeUI.java
--- javax/swing/plaf/basic/BasicTreeUI.java	4 Jul 2006 19:23:14 -0000	1.150
+++ javax/swing/plaf/basic/BasicTreeUI.java	1 Aug 2006 14:40:29 -0000
@@ -468,26 +468,36 @@
   {
     return tree.getRowHeight();
   }
 
   /**
    * Sets the TreeCellRenderer to <code>tcr</code>. This invokes
    * <code>updateRenderer</code>.
    * 
    * @param tcr is the new TreeCellRenderer.
    */
   protected void setCellRenderer(TreeCellRenderer tcr)
   {
-    currentCellRenderer = tcr;
+    // Finish editing before changing the renderer.
+    completeEditing();
+
+    // The renderer is set in updateRenderer.
     updateRenderer();
+
+    // Refresh the layout if necessary.
+    if (treeState != null)
+      {
+	treeState.invalidateSizes();
+	updateSize();
+      }
   }
 
   /**
    * Return currentCellRenderer, which will either be the trees renderer, or
    * defaultCellRenderer, which ever was not null.
    * 
    * @return the current Cell Renderer
    */
   protected TreeCellRenderer getCellRenderer()
   {
     if (currentCellRenderer != null)
       return currentCellRenderer;
@@ -1163,28 +1173,44 @@
   {
     if (tree.isEditable() && cellEditor == null)
       setCellEditor(createDefaultCellEditor());
     createdCellEditor = true;
   }
 
   /**
    * Messaged from the tree we're in when the renderer has changed.
    */
   protected void updateRenderer()
   {
     if (tree != null)
-      currentCellRenderer = tree.getCellRenderer();
-
-    if (currentCellRenderer == null)
-      currentCellRenderer = createDefaultCellRenderer();
+      {
+	TreeCellRenderer rend = tree.getCellRenderer();
+	if (rend != null)
+	  {
+	    createdRenderer = false;
+	    currentCellRenderer = rend;
+	    if (createdCellEditor)
+	      tree.setCellEditor(null);
+	  }
+	else
+	  {
+	    tree.setCellRenderer(createDefaultCellRenderer());
+	    createdRenderer = true;
+	  }
+      }
+    else
+      {
+	currentCellRenderer = null;
+	createdRenderer = false;
+      }
 
     updateCellEditor();
   }
 
   /**
    * Resets the treeState instance based on the tree we're providing the look
    * and feel for. The node dimensions handler is required and must be created
    * in advance.
    */
   protected void configureLayoutCache()
   {
     treeState = createLayoutCache();

Reply via email to