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();