? .ChangeLog.swp Index: javax/swing/plaf/basic/BasicTreeUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTreeUI.java,v retrieving revision 1.64 diff -u -r1.64 BasicTreeUI.java --- javax/swing/plaf/basic/BasicTreeUI.java 18 Aug 2005 20:50:39 -0000 1.64 +++ javax/swing/plaf/basic/BasicTreeUI.java 19 Aug 2005 20:28:03 -0000 @@ -2515,7 +2515,7 @@ { String s = cell.toString(); Font f = tree.getFont(); - FontMetrics fm = tree.getToolkit().getFontMetrics(tree.getFont()); + FontMetrics fm = tree.getToolkit().getFontMetrics(f); if (s != null) return new Rectangle(x, y, Index: javax/swing/tree/DefaultTreeCellEditor.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/tree/DefaultTreeCellEditor.java,v retrieving revision 1.6 diff -u -r1.6 DefaultTreeCellEditor.java --- javax/swing/tree/DefaultTreeCellEditor.java 2 Jul 2005 20:32:52 -0000 1.6 +++ javax/swing/tree/DefaultTreeCellEditor.java 19 Aug 2005 20:28:04 -0000 @@ -43,7 +43,10 @@ import java.awt.Container; import java.awt.Dimension; import java.awt.Font; +import java.awt.FontMetrics; import java.awt.Graphics; +import java.awt.Insets; +import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; @@ -52,8 +55,13 @@ import java.util.EventObject; import javax.swing.Icon; +import javax.swing.JComponent; import javax.swing.JTextField; import javax.swing.JTree; +import javax.swing.SwingUtilities; +import javax.swing.TreeCellEditor; +import javax.swing.UIDefaults; +import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.event.CellEditorListener; import javax.swing.event.EventListenerList; @@ -90,29 +98,74 @@ } /** - * getPreferredSize - * @return Dimension + * Returns the preferred size for the Container. + * + * @return Dimension of EditorContainer */ public Dimension getPreferredSize() { - return null; // TODO + Dimension containerSize = super.getPreferredSize(); + containerSize.width += DefaultTreeCellEditor.this.offset; + return containerSize; } /** - * paint - * @param value0 TODO + * Overrides Container.paint to paint the node's icon and use + * the selection color for the background. + * + * @param g - the specified Graphics window */ - public void paint(Graphics value0) + public void paint(Graphics g) { - // TODO + int textIconGap = 4; // default value + Rectangle vr = new Rectangle(); + Rectangle ir = new Rectangle(); + Rectangle tr = new Rectangle(); + + FontMetrics fm = editingComponent.getToolkit().getFontMetrics(getFont()); + SwingUtilities.layoutCompoundLabel(((JComponent) editingComponent), fm, + ((JTextField) editingComponent).getText(), + editingIcon, (int) CENTER_ALIGNMENT, + (int) LEFT_ALIGNMENT, (int) CENTER_ALIGNMENT, + (int) LEFT_ALIGNMENT, vr, ir, tr, 4); + + Rectangle cr = tr.union(ir); + tr.width += offset; + // paint icon + DefaultTreeCellEditor.this.editingIcon.paintIcon(DefaultTreeCellEditor.this.editingComponent, + g, cr.x, cr.y); + + // paint background + Insets insets = new Insets(0, 0, 0, 0); + Border border = UIManager.getLookAndFeelDefaults(). + getBorder("Tree.editorBorder"); + if (border != null) + insets = border.getBorderInsets(this); + + g.setColor(UIManager.getLookAndFeelDefaults(). + getColor("Tree.selectionBackground")); + g.fillRect(cr.x, cr.y, cr.width, cr.height - insets.top - insets.bottom); + + // paint border + if (borderSelectionColor != null) + { + g.setColor(borderSelectionColor); + g.drawRect(cr.x, cr.y, cr.width, cr.height - insets.top + - insets.bottom); + } + + super.paint(g); } /** - * doLayout + * Lays out this Container. If editing, the editor will be placed + * at offset in the x direction and 0 for y. */ public void doLayout() { - // TODO + if (DefaultTreeCellEditor.this.tree.isEditing()) + setLocation(offset, 0); + super.doLayout(); } } @@ -137,12 +190,22 @@ } /** - * getFont - * @return Font + * Gets the font of this component. + * @return this component's font; if a font has not been set for + * this component, the font of its parent is returned (if the parent + * is not null, otherwise null is returned). */ public Font getFont() { - return null; // TODO + Font font = super.getFont(); + if (font == null) + { + Component parent = getParent(); + if (parent != null) + return parent.getFont(); + return null; + } + return font; } /** @@ -156,102 +219,123 @@ } /** - * getPreferredSize - * @return Dimension + * Overrides JTextField.getPreferredSize to return the preferred size + * based on current font, if set, or else use renderer's font. + * + * @return the Dimension of this textfield. */ public Dimension getPreferredSize() { - return null; // TODO + String s = getText(); + + Font f = getFont(); + FontMetrics fm = getToolkit().getFontMetrics(f); + + return new Dimension(SwingUtilities.computeStringWidth(fm, s), + fm.getHeight()); } } private EventListenerList listenerList = new EventListenerList(); /** - * realEditor + * Editor handling the editing. */ protected TreeCellEditor realEditor; /** - * renderer + * Renderer, used to get border and offsets from. */ protected DefaultTreeCellRenderer renderer; /** - * editingContainer + * Editing container, will contain the editorComponent. */ protected Container editingContainer; /** - * editingComponent + * Component used in editing, obtained from the editingContainer. */ protected transient Component editingComponent; /** - * canEdit + * As of Java 2 platform v1.4 this field should no longer be used. + * If you wish to provide similar behavior you should directly + * override isCellEditable. */ protected boolean canEdit; /** - * offset + * Used in editing. Indicates x position to place editingComponent. */ protected transient int offset; /** - * tree + * JTree instance listening too. */ protected transient JTree tree; /** - * lastPath + * Last path that was selected. */ protected transient TreePath lastPath; /** - * timer + * Used before starting the editing session. */ - protected transient javax.swing.Timer timer; // TODO + protected transient javax.swing.Timer timer; /** - * lastRow + * Row that was last passed into getTreeCellEditorComponent. */ protected transient int lastRow; /** - * borderSelectionColor + * True if the border selection color should be drawn. */ protected Color borderSelectionColor; /** - * editingIcon + * Icon to use when editing. */ protected transient Icon editingIcon; /** - * font + * Font to paint with, null indicates font of renderer is to be used. */ protected Font font; /** - * Constructor DefaultTreeCellEditor - * @param value0 TODO - * @param value1 TODO - */ - public DefaultTreeCellEditor(JTree value0, DefaultTreeCellRenderer value1) - { - // TODO + * Constructs a DefaultTreeCellEditor object for a JTree using the + * specified renderer and a default editor. (Use this constructor + * for normal editing.) + * + * @param tree - a JTree object + * @param renderer - a DefaultTreeCellRenderer object + */ + public DefaultTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) + { + this.tree = tree; + this.renderer = renderer; + // FIXME: Not fully implemented. } /** - * Constructor DefaultTreeCellEditor - * @param value0 TODO - * @param value1 TODO - * @param value2 TODO - */ - public DefaultTreeCellEditor(JTree value0, DefaultTreeCellRenderer value1, - TreeCellEditor value2) - { - // TODO + * Constructs a DefaultTreeCellEditor object for a JTree using the specified + * renderer and the specified editor. (Use this constructor + * for specialized editing.) + * + * @param tree - a JTree object + * @param renderer - a DefaultTreeCellRenderer object + * @param editor - a TreeCellEditor object + */ + public DefaultTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer, + TreeCellEditor editor) + { + this.tree = tree; + this.renderer = renderer; + this.realEditor = editor; + // FIXME: Not fully implemented. } /** @@ -277,61 +361,73 @@ } /** - * setBorderSelectionColor - * @param value0 TODO + * Sets the color to use for the border. + * @param newColor - the new border color */ - public void setBorderSelectionColor(Color value0) + public void setBorderSelectionColor(Color newColor) { - // TODO + this.borderSelectionColor = newColor; } /** - * getBorderSelectionColor + * Returns the color the border is drawn. * @return Color */ public Color getBorderSelectionColor() { - return null; // TODO + return borderSelectionColor; } /** - * setFont - * @param value0 TODO + * Sets the font to edit with. null indicates the renderers + * font should be used. This will NOT override any font you have + * set in the editor the receiver was instantied with. If null for + * an editor was passed in, a default editor will be created that + * will pick up this font. + * + * @param font - the editing Font */ - public void setFont(Font value0) + public void setFont(Font font) { - // TODO + if (font != null) + this.font = font; + else + this.font = renderer.getFont(); } /** - * getFont - * @return Font + * Gets the font used for editing. + * + * @return the editing font */ public Font getFont() { - return null; // TODO + return font; } /** - * getTreeCellEditorComponent - * @param value0 TODO - * @param value1 TODO - * @param value2 TODO - * @param value3 TODO - * @param value4 TODO - * @param value5 TODO - * @return Component - */ - public Component getTreeCellEditorComponent(JTree value0, Object value1, - boolean value2, boolean value3, - boolean value4, int value5) + * Configures the editor. Passed onto the realEditor. + * + * @param tree - the JTree that is asking the editor to edit; this parameter can be null + * @param value - the value of the cell to be edited + * @param isSelected - true is the cell is to be renderer with selection highlighting + * @param expanded - true if the node is expanded + * @param leaf - true if the node is a leaf node + * @param row - the row index of the node being edited + * + * @return the component for editing + */ + public Component getTreeCellEditorComponent(JTree tree, Object value, + boolean isSelected, boolean expanded, + boolean leaf, int row) { return null; // TODO } /** - * getCellEditorValue - * @return Object + * Returns the value currently being edited. + * + * @return the value currently being edited */ public Object getCellEditorValue() { @@ -339,28 +435,33 @@ } /** - * isCellEditable - * @param value0 TODO - * @return boolean + * If the realEditor returns true to this message, prepareForEditing + * is messaged and true is returned. + * + * @param event - the event the editor should use to consider whether to begin editing or not + * @return true if editing can be started */ - public boolean isCellEditable(EventObject value0) + public boolean isCellEditable(EventObject event) { return false; // TODO } /** - * shouldSelectCell - * @param value0 TODO - * @return boolean + * Messages the realEditor for the return value. + * + * @param event - the event the editor should use to start editing + * @return true if the editor would like the editing cell to be + * selected; otherwise returns false */ - public boolean shouldSelectCell(EventObject value0) + public boolean shouldSelectCell(EventObject event) { return false; // TODO } /** - * stopCellEditing - * @return boolean + * If the realEditor will allow editing to stop, the realEditor + * is removed and true is returned, otherwise false is returned. + * @return true if editing was stopped; false otherwise */ public boolean stopCellEditing() { @@ -368,7 +469,8 @@ } /** - * cancelCellEditing + * Messages cancelCellEditing to the realEditor and removes it + * from this instance. */ public void cancelCellEditing() { @@ -408,44 +510,49 @@ } /** - * valueChanged - * @param value0 TODO + * Resets lastPath. + * + * @param e - the event that characterizes the change. */ - public void valueChanged(TreeSelectionEvent value0) + public void valueChanged(TreeSelectionEvent e) { // TODO } /** - * actionPerformed - * @param value0 TODO + * Messaged when the timer fires, this will start the editing session. + * + * @param @param e - the event that characterizes the action. */ - public void actionPerformed(ActionEvent value0) + public void actionPerformed(ActionEvent e) { // TODO } /** - * setTree - * @param value0 TODO + * Sets the tree currently editing for. This is needed to add a + * selection listener. + * + * @param newTree - the new tree to be edited */ - protected void setTree(JTree value0) + protected void setTree(JTree newTree) { - // TODO + tree = newTree; } /** - * shouldStartEditingTimer - * @param value0 TODO - * @return boolean + * Returns true if event is a MouseEvent and the click count is 1. + * + * @param event - the event being studied + * @return true if editing should start */ - protected boolean shouldStartEditingTimer(EventObject value0) + protected boolean shouldStartEditingTimer(EventObject event) { return false; // TODO } /** - * startEditingTimer + * Starts the editing timer. */ protected void startEditingTimer() { @@ -453,9 +560,12 @@ } /** - * canEditImmediately - * @param value0 TODO - * @return boolean + * Returns true if event is null, or it is a MouseEvent with + * a click count > 2 and inHitRegion returns true. + * + * @param event - the event being studied + * @return true if event is null, or it is a MouseEvent with + * a click count > 2 and inHitRegion returns true */ protected boolean canEditImmediately(EventObject value0) { @@ -463,33 +573,41 @@ } /** - * inHitRegion - * @param value0 TODO - * @param value1 TODO - * @return boolean + * Returns true if the passed in location is a valid mouse location + * to start editing from. This is implemented to return false if x is + * less than or equal to the width of the icon and icon + * gap displayed by the renderer. In other words this returns true if + * the user clicks over the text part displayed by the renderer, and + * false otherwise. + * + * @param x - the x-coordinate of the point + * @param y - the y-coordinate of the point + * + * @return true if the passed in location is a valid mouse location */ - protected boolean inHitRegion(int value0, int value1) + protected boolean inHitRegion(int x, int y) { return false; // TODO } /** * determineOffset - * @param value0 TODO - * @param value1 TODO - * @param value2 TODO - * @param value3 TODO - * @param value4 TODO - * @param value5 TODO + * @param tree - + * @param value - + * @param isSelected - + * @param expanded - + * @param leaf - + * @param row - */ - protected void determineOffset(JTree value0, Object value1, boolean value2, - boolean value3, boolean value4, int value5) + protected void determineOffset(JTree tree, Object value, boolean isSelected, + boolean expanded, boolean leaf, int row) { // TODO } /** - * prepareForEditing + * Invoked just before editing is to start. Will add the + * editingComponent to the editingContainer. */ protected void prepareForEditing() { @@ -497,8 +615,9 @@ } /** - * createContainer - * @return Container + * Creates the container to manage placement of editingComponent. + * + * @return the container to manage the placement of the editingComponent. */ protected Container createContainer() { @@ -506,8 +625,10 @@ } /** - * createTreeCellEditor - * @return TreeCellEditor + * This is invoked if a TreeCellEditor is not supplied in the constructor. + * It returns a TextField editor. + * + * @return a new TextField editor */ protected TreeCellEditor createTreeCellEditor() {