001 package org.springframework.richclient.components;
002
003 import javax.swing.*;
004 import java.awt.*;
005 import java.awt.event.MouseAdapter;
006 import java.awt.event.MouseEvent;
007
008 /**
009 * A component that shows a filesystem view and in which the user can either choose a file or a directory,
010 * depending on the mode set (standard is file).
011 */
012 public class FileChooser extends JComponent
013 {
014 private JTextField nameField;
015
016 private JButton openDialogButton;
017
018 private int openDialogButtonWidth = 20;
019
020 private FileChooserMode mode = FileChooserMode.FILE;
021
022 public FileChooser()
023 {
024 nameField = new JTextField();
025 /*
026 * nameField.addFocusListener(new FocusAdapter() { public void
027 * focusGained(FocusEvent e) { nameField.selectAll(); } });
028 */
029 Handler handler = new Handler();
030 openDialogButton = new JButton("...");
031 openDialogButton.setName("openDialogButton");
032 openDialogButton.setRolloverEnabled(false);
033 openDialogButton.setFocusable(false);
034 openDialogButton.addMouseListener(handler);
035
036 add(nameField);
037 add(openDialogButton);
038 }
039
040 /**
041 * {@inheritDoc}
042 */
043 public void doLayout()
044 {
045 int width = getWidth();
046 int height = getHeight();
047
048 Insets insets = getInsets();
049 nameField.setBounds(insets.left, insets.bottom, width - 3
050 - openDialogButtonWidth, height);
051 openDialogButton.setBounds(width - openDialogButtonWidth + insets.left,
052 insets.bottom, openDialogButtonWidth, height);
053 }
054
055 /**
056 * {@inheritDoc}
057 */
058 public Dimension getMinimumSize()
059 {
060 return getPreferredSize();
061 }
062
063 /**
064 * {@inheritDoc}
065 */
066 public Dimension getPreferredSize()
067 {
068 Dimension dim = nameField.getPreferredSize();
069 dim.width += openDialogButton.getPreferredSize().width;
070 Insets insets = getInsets();
071 dim.width += insets.left + insets.right;
072 dim.height += insets.top + insets.bottom;
073 return dim;
074 }
075
076 /**
077 * @param mode the mode to set
078 */
079 public void setMode(FileChooserMode mode)
080 {
081 this.mode = mode;
082 }
083
084 /**
085 * @return the mode
086 */
087 public FileChooserMode getMode()
088 {
089 return mode;
090 }
091
092 /**
093 * Set the text of the file textfield
094 *
095 * @param text
096 */
097 public void setText(String text)
098 {
099 nameField.setText(text);
100 }
101
102 /**
103 * Get the text of the file textfield
104 */
105 public String getText()
106 {
107 return nameField.getText();
108 }
109
110 public void setEditable(boolean editable)
111 {
112 if (editable)
113 {
114 nameField.setEditable(true);
115 openDialogButton.setEnabled(true);
116 }
117 else
118 {
119 nameField.setEditable(false);
120 openDialogButton.setEnabled(false);
121 }
122 }
123
124 /**
125 * Gets whether the control is editable or not
126 */
127 public boolean isEditable()
128 {
129 return nameField.isEditable();
130 }
131
132 /**
133 * Set whether the control is enabled or not
134 *
135 * @param enabled Whether the control is enabled or not
136 */
137 public void setEnabled(boolean enabled)
138 {
139 nameField.setEnabled(enabled);
140 openDialogButton.setEnabled(enabled);
141 }
142
143 /**
144 * Gets whether the control is enabled or not
145 */
146 public boolean isEnabled()
147 {
148 return nameField.isEnabled() & openDialogButton.isEnabled();
149 }
150
151 private class Handler extends MouseAdapter
152 {
153
154 @Override
155 public void mousePressed(MouseEvent ev)
156 {
157 if (isEnabled())
158 {
159 JFileChooser chooser = new JFileChooser();
160 switch (mode)
161 {
162 case FILE:
163 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
164 break;
165 case FOLDER:
166 chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
167 break;
168 }
169 int result = chooser.showOpenDialog(null);
170 if (result == JFileChooser.CANCEL_OPTION)
171 return;
172 nameField.setText(chooser.getSelectedFile().getAbsolutePath());
173 }
174 }
175 }
176
177 public enum FileChooserMode
178 {
179 FILE,
180 FOLDER
181 }
182 }