org.jdesktop.swingx.tree.DefaultXTreeCellEditor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of swingx Show documentation
Show all versions of swingx Show documentation
Contains extensions to the Swing GUI toolkit, including new and enhanced components that provide functionality commonly required by rich client applications.
The newest version!
/*
* $Id: DefaultXTreeCellEditor.java 3691 2010-05-03 18:03:44Z kschaefe $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jdesktop.swingx.tree;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import org.jdesktop.swingx.plaf.UIDependent;
/**
* Subclassed to hack around core bug with RtoL editing (#4980473).
*
* The price to pay is currently is to guarantee a minimum size of the
* editing field (is only one char wide if the node value is null).
*
* PENDING: any possibility to position the editorContainer?
* BasicTreeUI adds it to the tree and positions at the node location.
* That's not a problem in LToR, only
* in RToL
*
*
* @author Jeanette Winzenburg
*/
public class DefaultXTreeCellEditor extends DefaultTreeCellEditor implements UIDependent {
public DefaultXTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
super(tree, renderer);
}
public DefaultXTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer,
TreeCellEditor editor) {
super(tree, renderer, editor);
}
public void setRenderer(DefaultTreeCellRenderer renderer) {
this.renderer = renderer;
}
public DefaultTreeCellRenderer getRenderer() {
return renderer;
}
public class XEditorContainer extends EditorContainer {
@Override
public Dimension getPreferredSize() {
if (isRightToLeft()) {
if(editingComponent != null) {
Dimension pSize = editingComponent.getPreferredSize();
pSize.width += offset + 5;
Dimension rSize = (renderer != null) ?
renderer.getPreferredSize() : null;
if(rSize != null)
pSize.height = Math.max(pSize.height, rSize.height);
if(editingIcon != null)
pSize.height = Math.max(pSize.height,
editingIcon.getIconHeight());
// trying to enforce a minimum size leads to field being painted over the icon
// Make sure width is at least 100.
// pSize.width = Math.max(pSize.width, 100);
return pSize;
}
return new Dimension(0, 0);
}
return super.getPreferredSize();
}
@Override
public void doLayout() {
if (isRightToLeft()) {
Dimension cSize = getSize();
editingComponent.getPreferredSize();
editingComponent.setLocation(0, 0);
editingComponent.setBounds(0, 0,
cSize.width - offset,
cSize.height);
} else {
super.doLayout();
}
}
@Override
public void paint(Graphics g) {
if (isRightToLeft()) {
Dimension size = getSize();
// Then the icon.
if (editingIcon != null) {
int yLoc = Math.max(0, (size.height - editingIcon
.getIconHeight()) / 2);
int xLoc = Math.max(0, size.width - offset);
editingIcon.paintIcon(this, g, xLoc, yLoc);
}
// need to prevent super from painting the icon
Icon rememberIcon = editingIcon;
editingIcon = null;
super.paint(g);
editingIcon = rememberIcon;
} else {
super.paint(g);
}
}
}
@Override
protected Container createContainer() {
return new XEditorContainer();
}
@Override
protected void prepareForEditing() {
super.prepareForEditing();
applyComponentOrientation();
}
protected void applyComponentOrientation() {
if (tree != null) {
editingContainer.applyComponentOrientation(tree.getComponentOrientation());
}
}
/**
* @return
*/
private boolean isRightToLeft() {
return (tree != null) && (!tree.getComponentOrientation().isLeftToRight());
}
/**
* Implement UIDependent. Quick hack for #1060-swingx: icons lost on laf toggle.
*/
public void updateUI() {
if (getRenderer() != null) {
SwingUtilities.updateComponentTreeUI(getRenderer());
}
if (realEditor instanceof JComponent) {
SwingUtilities.updateComponentTreeUI((JComponent) realEditor);
} else if (realEditor instanceof UIDependent) {
((UIDependent) realEditor).updateUI();
}
}
}