1 | /* |
2 | * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
3 | * |
4 | * Redistribution and use in source and binary forms, with or without |
5 | * modification, are permitted provided that the following conditions |
6 | * are met: |
7 | * |
8 | * -Redistributions of source code must retain the above copyright |
9 | * notice, this list of conditions and the following disclaimer. |
10 | * |
11 | * -Redistribution in binary form must reproduct the above copyright |
12 | * notice, this list of conditions and the following disclaimer in |
13 | * the documentation and/or other materials provided with the distribution. |
14 | * |
15 | * Neither the name of Sun Microsystems, Inc. or the names of contributors |
16 | * may be used to endorse or promote products derived from this software |
17 | * without specific prior written permission. |
18 | * |
19 | * This software is provided "AS IS," without a warranty of any kind. ALL |
20 | * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
21 | * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
22 | * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT |
23 | * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT |
24 | * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS |
25 | * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
26 | * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
27 | * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
28 | * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN |
29 | * IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
30 | * |
31 | * You acknowledge that Software is not designed, licensed or intended for |
32 | * use in the design, construction, operation or maintenance of any nuclear |
33 | * facility. |
34 | */ |
35 | |
36 | /* |
37 | * @(#)FileChooserDemo.java 1.13 03/01/23 |
38 | */ |
39 | |
40 | |
41 | import javax.swing.*; |
42 | import javax.swing.event.*; |
43 | import javax.swing.text.*; |
44 | import javax.swing.border.*; |
45 | import javax.swing.colorchooser.*; |
46 | import javax.swing.filechooser.*; |
47 | import javax.accessibility.*; |
48 | |
49 | import java.awt.*; |
50 | import java.awt.event.*; |
51 | import java.beans.*; |
52 | import java.util.*; |
53 | import java.io.*; |
54 | import java.applet.*; |
55 | import java.net.*; |
56 | |
57 | /** |
58 | * JFileChooserDemo |
59 | * |
60 | * @version 1.1 07/16/99 |
61 | * @author Jeff Dinkins |
62 | */ |
63 | public class FileChooserDemo extends DemoModule { |
64 | JLabel theImage; |
65 | Icon jpgIcon; |
66 | Icon gifIcon; |
67 | |
68 | /** |
69 | * main method allows us to run as a standalone demo. |
70 | */ |
71 | public static void main(String[] args) { |
72 | FileChooserDemo demo = new FileChooserDemo(null); |
73 | demo.mainImpl(); |
74 | } |
75 | |
76 | /** |
77 | * FileChooserDemo Constructor |
78 | */ |
79 | public FileChooserDemo(SwingSet2 swingset) { |
80 | // Set the title for this demo, and an icon used to represent this |
81 | // demo inside the SwingSet2 app. |
82 | super(swingset, "FileChooserDemo", "toolbar/JFileChooser.gif"); |
83 | createFileChooserDemo(); |
84 | } |
85 | |
86 | public void createFileChooserDemo() { |
87 | theImage = new JLabel(""); |
88 | jpgIcon = createImageIcon("filechooser/jpgIcon.jpg", "jpg image"); |
89 | gifIcon = createImageIcon("filechooser/gifIcon.gif", "gif image"); |
90 | |
91 | JPanel demoPanel = getDemoPanel(); |
92 | demoPanel.setLayout(new BoxLayout(demoPanel, BoxLayout.Y_AXIS)); |
93 | |
94 | JPanel innerPanel = new JPanel(); |
95 | innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS)); |
96 | |
97 | demoPanel.add(Box.createRigidArea(VGAP20)); |
98 | demoPanel.add(innerPanel); |
99 | demoPanel.add(Box.createRigidArea(VGAP20)); |
100 | |
101 | innerPanel.add(Box.createRigidArea(HGAP20)); |
102 | |
103 | // Create a panel to hold buttons |
104 | JPanel buttonPanel = new JPanel() { |
105 | public Dimension getMaximumSize() { |
106 | return new Dimension(getPreferredSize().width, super.getMaximumSize().height); |
107 | } |
108 | }; |
109 | buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS)); |
110 | |
111 | buttonPanel.add(Box.createRigidArea(VGAP15)); |
112 | buttonPanel.add(createPlainFileChooserButton()); |
113 | buttonPanel.add(Box.createRigidArea(VGAP15)); |
114 | buttonPanel.add(createPreviewFileChooserButton()); |
115 | buttonPanel.add(Box.createRigidArea(VGAP15)); |
116 | buttonPanel.add(createCustomFileChooserButton()); |
117 | buttonPanel.add(Box.createVerticalGlue()); |
118 | |
119 | // Create a panel to hold the image |
120 | JPanel imagePanel = new JPanel(); |
121 | imagePanel.setLayout(new BorderLayout()); |
122 | imagePanel.setBorder(new BevelBorder(BevelBorder.LOWERED)); |
123 | JScrollPane scroller = new JScrollPane(theImage); |
124 | scroller.getVerticalScrollBar().setUnitIncrement(10); |
125 | scroller.getHorizontalScrollBar().setUnitIncrement(10); |
126 | imagePanel.add(scroller, BorderLayout.CENTER); |
127 | |
128 | // add buttons and image panels to inner panel |
129 | innerPanel.add(buttonPanel); |
130 | innerPanel.add(Box.createRigidArea(HGAP30)); |
131 | innerPanel.add(imagePanel); |
132 | innerPanel.add(Box.createRigidArea(HGAP20)); |
133 | } |
134 | |
135 | public JFileChooser createFileChooser() { |
136 | // create a filechooser |
137 | JFileChooser fc = new JFileChooser(); |
138 | |
139 | // set the current directory to be the images directory |
140 | File swingFile = new File("resources/images/About.jpg"); |
141 | if(swingFile.exists()) { |
142 | fc.setCurrentDirectory(swingFile); |
143 | fc.setSelectedFile(swingFile); |
144 | } |
145 | |
146 | return fc; |
147 | } |
148 | |
149 | |
150 | public JButton createPlainFileChooserButton() { |
151 | Action a = new AbstractAction(getString("FileChooserDemo.plainbutton")) { |
152 | public void actionPerformed(ActionEvent e) { |
153 | JFileChooser fc = createFileChooser(); |
154 | |
155 | // show the filechooser |
156 | int result = fc.showOpenDialog(getDemoPanel()); |
157 | |
158 | // if we selected an image, load the image |
159 | if(result == JFileChooser.APPROVE_OPTION) { |
160 | loadImage(fc.getSelectedFile().getPath()); |
161 | } |
162 | } |
163 | }; |
164 | return createButton(a); |
165 | } |
166 | |
167 | public JButton createPreviewFileChooserButton() { |
168 | Action a = new AbstractAction(getString("FileChooserDemo.previewbutton")) { |
169 | public void actionPerformed(ActionEvent e) { |
170 | JFileChooser fc = createFileChooser(); |
171 | |
172 | // Add filefilter & fileview |
173 | ExampleFileFilter filter = new ExampleFileFilter( |
174 | new String[] {"jpg", "gif"}, getString("FileChooserDemo.filterdescription") |
175 | ); |
176 | ExampleFileView fileView = new ExampleFileView(); |
177 | fileView.putIcon("jpg", jpgIcon); |
178 | fileView.putIcon("gif", gifIcon); |
179 | fc.setFileView(fileView); |
180 | fc.addChoosableFileFilter(filter); |
181 | fc.setFileFilter(filter); |
182 | |
183 | // add preview accessory |
184 | fc.setAccessory(new FilePreviewer(fc)); |
185 | |
186 | // show the filechooser |
187 | int result = fc.showOpenDialog(getDemoPanel()); |
188 | |
189 | // if we selected an image, load the image |
190 | if(result == JFileChooser.APPROVE_OPTION) { |
191 | loadImage(fc.getSelectedFile().getPath()); |
192 | } |
193 | } |
194 | }; |
195 | return createButton(a); |
196 | } |
197 | |
198 | JDialog dialog; |
199 | JFileChooser fc; |
200 | |
201 | public JButton createCustomFileChooserButton() { |
202 | Action a = new AbstractAction(getString("FileChooserDemo.custombutton")) { |
203 | public void actionPerformed(ActionEvent e) { |
204 | fc = createFileChooser(); |
205 | |
206 | // Add filefilter & fileview |
207 | ExampleFileFilter filter = new ExampleFileFilter( |
208 | new String[] {"jpg", "gif"}, getString("FileChooserDemo.filterdescription") |
209 | ); |
210 | ExampleFileView fileView = new ExampleFileView(); |
211 | fileView.putIcon("jpg", jpgIcon); |
212 | fileView.putIcon("gif", gifIcon); |
213 | fc.setFileView(fileView); |
214 | fc.addChoosableFileFilter(filter); |
215 | |
216 | // add preview accessory |
217 | fc.setAccessory(new FilePreviewer(fc)); |
218 | |
219 | // remove the approve/cancel buttons |
220 | fc.setControlButtonsAreShown(false); |
221 | |
222 | // make custom controls |
223 | //wokka |
224 | JPanel custom = new JPanel(); |
225 | custom.setLayout(new BoxLayout(custom, BoxLayout.Y_AXIS)); |
226 | custom.add(Box.createRigidArea(VGAP10)); |
227 | JLabel description = new JLabel(getString("FileChooserDemo.description")); |
228 | description.setAlignmentX(JLabel.CENTER_ALIGNMENT); |
229 | custom.add(description); |
230 | custom.add(Box.createRigidArea(VGAP10)); |
231 | custom.add(fc); |
232 | |
233 | Action okAction = createOKAction(); |
234 | fc.addActionListener(okAction); |
235 | |
236 | JPanel buttons = new JPanel(); |
237 | buttons.setLayout(new BoxLayout(buttons, BoxLayout.X_AXIS)); |
238 | buttons.add(Box.createRigidArea(HGAP10)); |
239 | buttons.add(createImageButton(createFindAction())); |
240 | buttons.add(Box.createRigidArea(HGAP10)); |
241 | buttons.add(createButton(createAboutAction())); |
242 | buttons.add(Box.createRigidArea(HGAP10)); |
243 | buttons.add(createButton(okAction)); |
244 | buttons.add(Box.createRigidArea(HGAP10)); |
245 | buttons.add(createButton(createCancelAction())); |
246 | buttons.add(Box.createRigidArea(HGAP10)); |
247 | buttons.add(createImageButton(createHelpAction())); |
248 | buttons.add(Box.createRigidArea(HGAP10)); |
249 | |
250 | custom.add(buttons); |
251 | custom.add(Box.createRigidArea(VGAP10)); |
252 | |
253 | // show the filechooser |
254 | Frame parent = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, getDemoPanel()); |
255 | dialog = new JDialog(parent, getString("FileChooserDemo.dialogtitle"), true); |
256 | dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
257 | dialog.getContentPane().add(custom, BorderLayout.CENTER); |
258 | dialog.pack(); |
259 | dialog.setLocationRelativeTo(getDemoPanel()); |
260 | dialog.show(); |
261 | } |
262 | }; |
263 | return createButton(a); |
264 | } |
265 | |
266 | public Action createAboutAction() { |
267 | return new AbstractAction(getString("FileChooserDemo.about")) { |
268 | public void actionPerformed(ActionEvent e) { |
269 | File file = fc.getSelectedFile(); |
270 | String text; |
271 | if(file == null) { |
272 | text = getString("FileChooserDemo.nofileselected"); |
273 | } else { |
274 | text = "<html>" + getString("FileChooserDemo.thefile"); |
275 | text += "<br><font color=green>" + file.getName() + "</font><br>"; |
276 | text += getString("FileChooserDemo.isprobably") + "</html>"; |
277 | } |
278 | JOptionPane.showMessageDialog(getDemoPanel(), text); |
279 | } |
280 | }; |
281 | } |
282 | |
283 | public Action createOKAction() { |
284 | return new AbstractAction(getString("FileChooserDemo.ok")) { |
285 | public void actionPerformed(ActionEvent e) { |
286 | dialog.dispose(); |
287 | if (!e.getActionCommand().equals(JFileChooser.CANCEL_SELECTION) |
288 | && fc.getSelectedFile() != null) { |
289 | |
290 | loadImage(fc.getSelectedFile().getPath()); |
291 | } |
292 | } |
293 | }; |
294 | } |
295 | |
296 | public Action createCancelAction() { |
297 | return new AbstractAction(getString("FileChooserDemo.cancel")) { |
298 | public void actionPerformed(ActionEvent e) { |
299 | dialog.dispose(); |
300 | } |
301 | }; |
302 | } |
303 | |
304 | public Action createFindAction() { |
305 | Icon icon = createImageIcon("filechooser/find.gif", getString("FileChooserDemo.find")); |
306 | return new AbstractAction("", icon) { |
307 | public void actionPerformed(ActionEvent e) { |
308 | String result = JOptionPane.showInputDialog(getDemoPanel(), getString("FileChooserDemo.findquestion")); |
309 | if (result != null) { |
310 | JOptionPane.showMessageDialog(getDemoPanel(), getString("FileChooserDemo.findresponse")); |
311 | } |
312 | } |
313 | }; |
314 | } |
315 | |
316 | public Action createHelpAction() { |
317 | Icon icon = createImageIcon("filechooser/help.gif", getString("FileChooserDemo.help")); |
318 | return new AbstractAction("", icon) { |
319 | public void actionPerformed(ActionEvent e) { |
320 | JOptionPane.showMessageDialog(getDemoPanel(), getString("FileChooserDemo.helptext")); |
321 | } |
322 | }; |
323 | } |
324 | |
325 | class MyImageIcon extends ImageIcon { |
326 | public MyImageIcon(String filename) { |
327 | super(filename); |
328 | }; |
329 | public synchronized void paintIcon(Component c, Graphics g, int x, int y) { |
330 | g.setColor(Color.white); |
331 | g.fillRect(0,0, c.getWidth(), c.getHeight()); |
332 | if(getImageObserver() == null) { |
333 | g.drawImage( |
334 | getImage(), |
335 | c.getWidth()/2 - getIconWidth()/2, |
336 | c.getHeight()/2 - getIconHeight()/2, |
337 | c |
338 | ); |
339 | } else { |
340 | g.drawImage( |
341 | getImage(), |
342 | c.getWidth()/2 - getIconWidth()/2, |
343 | c.getHeight()/2 - getIconHeight()/2, |
344 | getImageObserver() |
345 | ); |
346 | } |
347 | } |
348 | } |
349 | |
350 | public void loadImage(String filename) { |
351 | theImage.setIcon(new MyImageIcon(filename)); |
352 | } |
353 | |
354 | public JButton createButton(Action a) { |
355 | JButton b = new JButton(a) { |
356 | public Dimension getMaximumSize() { |
357 | int width = Short.MAX_VALUE; |
358 | int height = super.getMaximumSize().height; |
359 | return new Dimension(width, height); |
360 | } |
361 | }; |
362 | return b; |
363 | } |
364 | |
365 | public JButton createImageButton(Action a) { |
366 | JButton b = new JButton(a); |
367 | b.setMargin(new Insets(0,0,0,0)); |
368 | return b; |
369 | } |
370 | } |
371 | |
372 | class FilePreviewer extends JComponent implements PropertyChangeListener { |
373 | ImageIcon thumbnail = null; |
374 | |
375 | public FilePreviewer(JFileChooser fc) { |
376 | setPreferredSize(new Dimension(100, 50)); |
377 | fc.addPropertyChangeListener(this); |
378 | setBorder(new BevelBorder(BevelBorder.LOWERED)); |
379 | } |
380 | |
381 | public void loadImage(File f) { |
382 | if (f == null) { |
383 | thumbnail = null; |
384 | } else { |
385 | ImageIcon tmpIcon = new ImageIcon(f.getPath()); |
386 | if(tmpIcon.getIconWidth() > 90) { |
387 | thumbnail = new ImageIcon( |
388 | tmpIcon.getImage().getScaledInstance(90, -1, Image.SCALE_DEFAULT)); |
389 | } else { |
390 | thumbnail = tmpIcon; |
391 | } |
392 | } |
393 | } |
394 | |
395 | public void propertyChange(PropertyChangeEvent e) { |
396 | String prop = e.getPropertyName(); |
397 | if(prop == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) { |
398 | if(isShowing()) { |
399 | loadImage((File) e.getNewValue()); |
400 | repaint(); |
401 | } |
402 | } |
403 | } |
404 | |
405 | public void paint(Graphics g) { |
406 | super.paint(g); |
407 | if(thumbnail != null) { |
408 | int x = getWidth()/2 - thumbnail.getIconWidth()/2; |
409 | int y = getHeight()/2 - thumbnail.getIconHeight()/2; |
410 | if(y < 0) { |
411 | y = 0; |
412 | } |
413 | |
414 | if(x < 5) { |
415 | x = 5; |
416 | } |
417 | thumbnail.paintIcon(this, g, x, y); |
418 | } |
419 | } |
420 | } |
421 | |