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    }