Index: javax/swing/JPasswordField.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/JPasswordField.java,v retrieving revision 1.13 diff -u -r1.13 JPasswordField.java --- javax/swing/JPasswordField.java 25 Aug 2005 14:37:11 -0000 1.13 +++ javax/swing/JPasswordField.java 29 Aug 2005 21:05:34 -0000 @@ -224,7 +224,8 @@ } catch (BadLocationException ble) { - throw new AssertionError("This should not happen"); + // This should never happen. + throw new AssertionError(ble); } } Index: javax/swing/plaf/basic/BasicTreeUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTreeUI.java,v retrieving revision 1.68 diff -u -r1.68 BasicTreeUI.java --- javax/swing/plaf/basic/BasicTreeUI.java 23 Aug 2005 21:17:39 -0000 1.68 +++ javax/swing/plaf/basic/BasicTreeUI.java 29 Aug 2005 21:05:34 -0000 @@ -71,6 +71,7 @@ import javax.swing.JComponent; import javax.swing.JScrollBar; import javax.swing.JScrollPane; +import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.Timer; @@ -516,7 +517,11 @@ */ protected void setCellEditor(TreeCellEditor editor) { - cellEditor = editor; + if (editor != null) + { + cellEditor = editor; + createdCellEditor = true; + } } /** @@ -737,10 +742,7 @@ public boolean stopEditing(JTree tree) { if (isEditing(tree)) - { - completeEditing(); return getCellEditor().stopCellEditing(); - } return true; } @@ -1092,7 +1094,10 @@ protected void updateCellEditor() { if (tree.isEditable() && cellEditor == null) - cellEditor = createDefaultCellEditor(); + { + cellEditor = createDefaultCellEditor(); + createdCellEditor = true; + } } /** @@ -1189,7 +1194,6 @@ tree.addKeyListener(keyListener); tree.addPropertyChangeListener(selectionModelPropertyChangeListener); tree.addComponentListener(componentListener); - cellEditor.addCellEditorListener(cellEditorListener); tree.addTreeExpansionListener(treeExpansionListener); if (treeModel != null) treeModel.addTreeModelListener(treeModelListener); @@ -1206,12 +1210,10 @@ installDefaults((JTree) c); tree = (JTree) c; - cellEditor = createDefaultCellEditor(); currentCellRenderer = createDefaultCellRenderer(); rendererPane = createCellRendererPane(); createdRenderer = true; - createdCellEditor = true; TreeModel mod = tree.getModel(); setModel(mod); @@ -1262,8 +1264,9 @@ * components */ public void paint(Graphics g, JComponent c) - { + { JTree tree = (JTree) c; + TreeModel mod = tree.getModel(); if (mod != null) { @@ -1282,8 +1285,10 @@ /** * Ensures that the rows identified by beginRow through endRow are visible. * - * @param beginRow is the first row - * @param endRow is the last row + * @param beginRow + * is the first row + * @param endRow + * is the last row */ protected void ensureRowsAreVisible(int beginRow, int endRow) { @@ -1450,33 +1455,43 @@ x = event.getX(); y = event.getY(); } - + + updateCellEditor(); TreeCellEditor ed = getCellEditor(); - if (ed == null) - updateCellEditor(); - if(ed != null && ed.isCellEditable(event) && ed.shouldSelectCell(event)) + if (ed != null && ed.shouldSelectCell(event) && ed.isCellEditable(event)) { editingPath = path; editingRow = tree.getRowForPath(editingPath); - Object val = editingPath.getLastPathComponent(); - boolean isLeaf = tree.getModel().isLeaf(val); - boolean expanded = tree.isExpanded(editingPath); - editingComponent = ed.getTreeCellEditorComponent( - tree, val, true, expanded, isLeaf, editingRow); cellEditor.addCellEditorListener(cellEditorListener); stopEditingInCompleteEditing = false; + Object val = editingPath.getLastPathComponent(); + boolean expanded = tree.isExpanded(editingPath); + + editingComponent = ed.getTreeCellEditorComponent(tree, val, true, + expanded, + isLeaf(editingRow), + editingRow); + + editingComponent.getParent().setVisible(true); + editingComponent.getParent().validate(); + tree.add(editingComponent.getParent()); + editingComponent.getParent().validate(); + ((JTextField) editingComponent).requestFocusInWindow(false); return true; } return false; } /** - * If the mouseX and mouseY are in the expand - * or collapse region of the row, this will toggle the row. + * If the mouseX and mouseY are in the expand or + * collapse region of the row, this will toggle the row. * - * @param path the path we are concerned with - * @param mouseX is the cursor's x position - * @param mouseY is the cursor's y position + * @param path + * the path we are concerned with + * @param mouseX + * is the cursor's x position + * @param mouseY + * is the cursor's y position */ protected void checkForClickInExpandControl(TreePath path, int mouseX, int mouseY) @@ -1688,9 +1703,12 @@ { BasicTreeUI.this.editingPath = null; BasicTreeUI.this.editingRow = -1; + if (editingComponent != null) + BasicTreeUI.this.tree.remove(editingComponent.getParent()); BasicTreeUI.this.editingComponent = null; + BasicTreeUI.this.cellEditor.removeCellEditorListener(cellEditorListener); BasicTreeUI.this.cellEditor = null; - BasicTreeUI.this.tree.repaint(); + BasicTreeUI.this.createdCellEditor = false; } /** @@ -1703,9 +1721,12 @@ { BasicTreeUI.this.editingPath = null; BasicTreeUI.this.editingRow = -1; + if (editingComponent != null) + BasicTreeUI.this.tree.remove(editingComponent.getParent()); BasicTreeUI.this.editingComponent = null; + BasicTreeUI.this.cellEditor.removeCellEditorListener(cellEditorListener); BasicTreeUI.this.cellEditor = null; - BasicTreeUI.this.tree.repaint(); + BasicTreeUI.this.createdCellEditor = false; } }// CellEditorHandler @@ -1995,53 +2024,57 @@ if (path != null) { - boolean inBounds = false; - boolean cntlClick = false; - Rectangle bounds = BasicTreeUI.this.getPathBounds( - BasicTreeUI.this.tree, - path); - - bounds.x -= rightChildIndent - 4; - bounds.width += rightChildIndent + 4; - - if (bounds.contains(click.x, click.y)) - inBounds = true; - else if (BasicTreeUI.this.hasControlIcons() - && (click.x < (bounds.x - rightChildIndent + 5) - && click.x > (bounds.x - rightChildIndent - 5))) - cntlClick = true; + if (!path.equals(BasicTreeUI.this.tree.getLeadSelectionPath())) + { + if (BasicTreeUI.this.tree.isEditing()) + BasicTreeUI.this.tree.stopEditing(); + } - if ((inBounds || cntlClick) && BasicTreeUI.this.tree.isVisible(path)) + if (!BasicTreeUI.this.tree.isEditing()) { - if (!cntlClick && !BasicTreeUI.this.isLeaf(row)) + boolean inBounds = false; + boolean cntlClick = false; + Rectangle bounds = BasicTreeUI.this. + getPathBounds(BasicTreeUI.this.tree, path); + + bounds.x -= rightChildIndent - 4; + bounds.width += rightChildIndent + 4; + + if (bounds.contains(click.x, click.y)) + inBounds = true; + else if (BasicTreeUI.this.hasControlIcons() + && (click.x < (bounds.x - rightChildIndent + 5) && + click.x > (bounds.x - rightChildIndent - 5))) + cntlClick = true; + + if ((inBounds || cntlClick) + && BasicTreeUI.this.tree.isVisible(path)) { - Object cell = path.getLastPathComponent(); - if (lastClicked != null && lastClicked.equals(cell)) - clickCount = 2; - else + if (!cntlClick && !BasicTreeUI.this.isLeaf(row)) { - lastClicked = cell; - clickCount = 1; + Object cell = path.getLastPathComponent(); + if (lastClicked != null && lastClicked.equals(cell)) + clickCount = 2; + else + { + lastClicked = cell; + clickCount = 1; + } } - } - if (clickCount == 2 || cntlClick == true) - { - clickCount = 0; - lastClicked = null; - BasicTreeUI.this.tree.getSelectionModel().clearSelection(); - if (BasicTreeUI.this.tree.isExpanded(path)) - BasicTreeUI.this.tree.collapsePath(path); - else - BasicTreeUI.this.tree.expandPath(path); - } + if (clickCount == 2 || cntlClick == true) + { + clickCount = 0; + lastClicked = null; + BasicTreeUI.this.tree.getSelectionModel().clearSelection(); + if (BasicTreeUI.this.tree.isExpanded(path)) + BasicTreeUI.this.tree.collapsePath(path); + else + BasicTreeUI.this.tree.expandPath(path); + } - BasicTreeUI.this.selectPath(BasicTreeUI.this.tree, path); - - // If editing, but the moved to another cell then stop editing - if (!path.equals(BasicTreeUI.this.tree.getLeadSelectionPath())) - if (BasicTreeUI.this.tree.isEditing()) - BasicTreeUI.this.tree.stopEditing(); + BasicTreeUI.this.selectPath(BasicTreeUI.this.tree, path); + } } } } @@ -2377,6 +2410,7 @@ */ public void treeNodesChanged(TreeModelEvent e) { + BasicTreeUI.this.tree.repaint(); } /** @@ -2388,6 +2422,7 @@ */ public void treeNodesInserted(TreeModelEvent e) { + BasicTreeUI.this.tree.repaint(); } /** @@ -2402,6 +2437,7 @@ */ public void treeNodesRemoved(TreeModelEvent e) { + BasicTreeUI.this.tree.repaint(); } /** @@ -2415,6 +2451,7 @@ */ public void treeStructureChanged(TreeModelEvent e) { + BasicTreeUI.this.tree.repaint(); } }// TreeModelHandler @@ -2646,18 +2683,30 @@ if (tree.isVisible(curr)) { - TreeCellRenderer dtcr = tree.getCellRenderer(); - if (dtcr == null) - dtcr = createDefaultCellRenderer(); - if (!isLeaf) expanded = tree.isExpanded(curr); - Component c = dtcr.getTreeCellRendererComponent(tree, node, selected, - expanded, isLeaf, 0, - false); - rendererPane.paintComponent(g, c, c.getParent(), getCellBounds(x, y, - node)); + if (editingComponent != null && editingPath != null && isEditing(tree) + && node.equals(editingPath.getLastPathComponent())) + { + Rectangle bounds = getPathBounds(tree, editingPath); + rendererPane.paintComponent(g, editingComponent.getParent(), null, + new Rectangle(0, 0, bounds.width, + bounds.height)); + } + else + { + TreeCellRenderer dtcr = tree.getCellRenderer(); + if (dtcr == null) + dtcr = createDefaultCellRenderer(); + + Component c = dtcr.getTreeCellRendererComponent(tree, node, + selected, expanded, + isLeaf, 0, false); + + rendererPane.paintComponent(g, c, c.getParent(), + getCellBounds(x, y, node)); + } } } @@ -2665,20 +2714,27 @@ * Recursively paints all elements of the tree Package private for use in * inner classes. * - * @param g the Graphics context in which to paint - * @param indentation of the current object - * @param descent is the number of elements drawn - * @param childNumber is the index of the current child in the tree - * @param depth is the depth of the current object in the tree - * @param tree is the tree to draw to - * @param mod is the TreeModel we are using to draw - * @param curr is the current object to draw - * + * @param g + * the Graphics context in which to paint + * @param indentation + * of the current object + * @param descent + * is the number of elements drawn + * @param childNumber + * is the index of the current child in the tree + * @param depth + * is the depth of the current object in the tree + * @param tree + * is the tree to draw to + * @param mod + * is the TreeModel we are using to draw + * @param curr + * is the current object to draw * @return int - current descent of the tree */ int paintRecursive(Graphics g, int indentation, int descent, int childNumber, int depth, JTree tree, TreeModel mod, Object curr) - { + { Rectangle clip = g.getClipBounds(); if (indentation > clip.x + clip.width + rightChildIndent || descent > clip.y + clip.height + getRowHeight()) Index: javax/swing/tree/DefaultTreeCellEditor.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/tree/DefaultTreeCellEditor.java,v retrieving revision 1.11 diff -u -r1.11 DefaultTreeCellEditor.java --- javax/swing/tree/DefaultTreeCellEditor.java 24 Aug 2005 20:37:37 -0000 1.11 +++ javax/swing/tree/DefaultTreeCellEditor.java 29 Aug 2005 21:05:34 -0000 @@ -115,39 +115,49 @@ } /** - * Overrides Container.paint to paint the node's icon and use - * the selection color for the background. + * Overrides Container.paint to paint the node's icon and use the selection + * color for the background. * - * @param g - the specified Graphics window + * @param g - + * the specified Graphics window */ public void paint(Graphics g) { - int textIconGap = 4; // default value - Rectangle vr = new Rectangle(); - Rectangle ir = new Rectangle(); - Rectangle tr = new Rectangle(); + lastPath = tree.getSelectionPath(); + Rectangle tr = tree.getPathBounds(lastPath); - FontMetrics fm = editingComponent.getToolkit().getFontMetrics(getFont()); - SwingUtilities.layoutCompoundLabel(((JComponent) editingComponent), fm, - ((JTextField) editingComponent).getText(), editingIcon, - JTextField.LEFT, JTextField.LEFT, JTextField.LEFT, JTextField.LEFT, - vr, ir, tr, 4); - - Rectangle cr = tr.union(ir); - cr.width += offset; - - // paint icon - if (DefaultTreeCellEditor.this.editingIcon != null) - DefaultTreeCellEditor.this.editingIcon.paintIcon(DefaultTreeCellEditor. - this.editingComponent, g, cr.x, cr.y); - + if (tr != null) + { + Insets i = ((DefaultTextField) editingComponent).getBorder() + .getBorderInsets(this); + int textIconGap = 3; + tr.height -= i.top; + tr.x -= i.left; + + // paints icon + if (editingIcon == null) + editingIcon = renderer.getIcon(); + if (editingIcon != null) + { + editingIcon.paintIcon(this, g, tr.x - editingIcon. + getIconWidth()/2, tr.y + i.top + i.bottom); + tr.x += editingIcon.getIconWidth()/2 + textIconGap; + } + + tr.width += offset; + + // paint background + g.translate(tr.x, tr.y); + editingComponent.setSize(new Dimension(tr.width, tr.height)); + editingComponent.paint(g); + g.translate(-tr.x, -tr.y); + } super.paint(g); - (new CellRendererPane()).paintComponent(g, editingComponent, this, cr); } /** - * Lays out this Container. If editing, the editor will be placed - * at offset in the x direction and 0 for y. + * Lays out this Container. If editing, the editor will be placed at offset + * in the x direction and 0 for y. */ public void doLayout() { @@ -330,8 +340,6 @@ editor = createTreeCellEditor(); realEditor = editor; - configureEditingComponent(tree, renderer, realEditor); - editingContainer = createContainer(); UIDefaults defaults = UIManager.getLookAndFeelDefaults(); setFont(defaults.getFont("Tree.font")); @@ -361,7 +369,18 @@ boolean isLeaf = tree.getModel().isLeaf(val); boolean expanded = tree.isExpanded(lastPath); determineOffset(tree, val, true, expanded, isLeaf, lastRow); - editingComponent = editor.getTreeCellEditorComponent(tree, val, + + // set up icon + if (isLeaf) + renderer.setIcon(renderer.getLeafIcon()); + else if (expanded) + renderer.setIcon(renderer.getOpenIcon()); + else + renderer.setIcon(renderer.getClosedIcon()); + + editingIcon = renderer.getIcon(); + + editingComponent = getTreeCellEditorComponent(tree, val, true, expanded, isLeaf, @@ -461,14 +480,9 @@ { if (realEditor == null) createTreeCellEditor(); - - Component c = realEditor.getTreeCellEditorComponent(tree, value, isSelected, - expanded, leaf, row); - if (tree != null && editingComponent != null) - if (tree.isEditing()) - tree.stopEditing(); - - return c; + + return realEditor.getTreeCellEditorComponent(tree, value, isSelected, + expanded, leaf, row); } /** @@ -556,7 +570,7 @@ */ public void addCellEditorListener(CellEditorListener listener) { - listenerList.add(CellEditorListener.class, listener); + realEditor.addCellEditorListener(listener); } /** @@ -566,7 +580,7 @@ */ public void removeCellEditorListener(CellEditorListener listener) { - listenerList.remove(CellEditorListener.class, listener); + realEditor.removeCellEditorListener(listener); } /**