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 }