/*
* @(#)DirectoryComboBoxEditor.java 1.25 03/01/23
*
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.glub.secureftp.client.gui;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.Method;
/**
* The default editor for editable combo boxes. The editor is implemented as a JTextField.
*
* @version 1.25 01/23/03
* @author Arnaud Weber
* @author Mark Davidson
*/
public class DirectoryComboBoxEditor implements ComboBoxEditor, FocusListener {
protected JTextField editor;
private Object oldValue;
private JPanel panel;
public DirectoryComboBoxEditor() {
editor = new BorderlessTextField("", 9);
editor.setBorder( new EmptyBorder(2, 2, 2, 2) );
editor.setBackground( Color.white );
Icon icon = UIManager.getIcon("FileView.directoryIcon" );
panel = new JPanel();
panel.setBackground( Color.white );
panel.setLayout( new BorderLayout() );
panel.setOpaque(true);
JPanel subPanel = new JPanel();
subPanel.setLayout( new BorderLayout() );
subPanel.setBackground( Color.white );
subPanel.setOpaque(true);
JLabel iconLabel = new JLabel(icon);
subPanel.add( Box.createHorizontalStrut(3), BorderLayout.WEST );
subPanel.add( iconLabel, BorderLayout.CENTER );
subPanel.add( Box.createHorizontalStrut(3), BorderLayout.EAST );
panel.add( subPanel, BorderLayout.WEST );
panel.add( editor, BorderLayout.CENTER );
}
public Component getEditorComponent() {
//return editor;
return panel;
}
/**
* Sets the item that should be edited.
*
* @param anObject the displayed value of the editor
*/
public void setItem(Object anObject) {
if ( anObject != null ) {
String item = anObject.toString();
editor.setText(item);
oldValue = anObject;
} else {
editor.setText("");
}
}
public Object getItem() {
Object newValue = editor.getText();
if (oldValue != null && !(oldValue instanceof String)) {
// The original value is not a string. Should return the value in it's
// original type.
if (newValue.equals(oldValue.toString())) {
return oldValue;
} else {
// Must take the value from the editor and get the value and cast it to the new type.
Class cls = oldValue.getClass();
try {
Method method = cls.getMethod("valueOf", new Class[]{String.class});
newValue = method.invoke(oldValue, new Object[] { editor.getText()});
} catch (Exception ex) {
// Fail silently and return the newValue (a String object)
}
}
}
return newValue;
}
public void selectAll() {
editor.selectAll();
editor.requestFocus();
}
// This used to do something but now it doesn't. It couldn't be
// removed because it would be an API change to do so.
public void focusGained(FocusEvent e) {}
// This used to do something but now it doesn't. It couldn't be
// removed because it would be an API change to do so.
public void focusLost(FocusEvent e) {}
public void addActionListener(ActionListener l) {
editor.addActionListener(l);
}
public void removeActionListener(ActionListener l) {
editor.removeActionListener(l);
}
static class BorderlessTextField extends JTextField {
protected static final long serialVersionUID = 1L;
public BorderlessTextField(String value,int n) {
super(value,n);
}
// workaround for 4530952
public void setText(String s) {
if (getText().equals(s)) {
return;
}
super.setText(s);
}
public void setBorder(Border b) {}
}
/**
* A subclass of DirectoryComboBoxEditor that implements UIResource.
* DirectoryComboBoxEditor doesn't implement UIResource
* directly so that applications can safely override the
* cellRenderer property with BasicListCellRenderer subclasses.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is
* appropriate for short term storage or RMI between applications running
* the same version of Swing. As of 1.4, support for long term storage
* of all JavaBeans<sup><font size="-2">TM</font></sup>
* has been added to the <code>java.beans</code> package.
* Please see {@link java.beans.XMLEncoder}.
*/
public static class UIResource extends DirectoryComboBoxEditor
implements javax.swing.plaf.UIResource {
}
}