OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [javax/] [swing/] [JFileChooser.java] - Blame information for rev 772

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 772 jeremybenn
/* JFileChooser.java --
2
   Copyright (C) 2002, 2004, 2005, 2006,  Free Software Foundation, Inc.
3
 
4
This file is part of GNU Classpath.
5
 
6
GNU Classpath is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2, or (at your option)
9
any later version.
10
 
11
GNU Classpath is distributed in the hope that it will be useful, but
12
WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GNU Classpath; see the file COPYING.  If not, write to the
18
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
02110-1301 USA.
20
 
21
Linking this library statically or dynamically with other modules is
22
making a combined work based on this library.  Thus, the terms and
23
conditions of the GNU General Public License cover the whole
24
combination.
25
 
26
As a special exception, the copyright holders of this library give you
27
permission to link this library with independent modules to produce an
28
executable, regardless of the license terms of these independent
29
modules, and to copy and distribute the resulting executable under
30
terms of your choice, provided that you also meet, for each linked
31
independent module, the terms and conditions of the license of that
32
module.  An independent module is a module which is not derived from
33
or based on this library.  If you modify this library, you may extend
34
this exception to your version of the library, but you are not
35
obligated to do so.  If you do not wish to do so, delete this
36
exception statement from your version. */
37
 
38
package javax.swing;
39
 
40
import gnu.java.lang.CPStringBuilder;
41
 
42
import java.awt.Component;
43
import java.awt.Frame;
44
import java.awt.GraphicsEnvironment;
45
import java.awt.HeadlessException;
46
import java.awt.event.ActionEvent;
47
import java.awt.event.ActionListener;
48
import java.awt.event.WindowEvent;
49
import java.awt.event.WindowAdapter;
50
import java.beans.PropertyChangeEvent;
51
import java.io.File;
52
import java.util.ArrayList;
53
 
54
import javax.accessibility.Accessible;
55
import javax.accessibility.AccessibleContext;
56
import javax.accessibility.AccessibleRole;
57
import javax.swing.filechooser.FileFilter;
58
import javax.swing.filechooser.FileSystemView;
59
import javax.swing.filechooser.FileView;
60
import javax.swing.plaf.FileChooserUI;
61
 
62
 
63
/**
64
 * A component that provides the user a dialog box to browse through a
65
 * filesystem and choose one or more files or directories.
66
 *
67
 * A JFileChooser can be configured to filter the displayed file list
68
 * by adding a {@link FileFilter} instance using
69
 * {@link #addChoosableFileFilter(FileFilter)}. Additional components can
70
 * be embedded in the file chooser using {@link #setAccessory(JComponent)}.
71
 * The JFileChooser properties also provide mechanisms to customize the
72
 * behaviour of the file chooser.
73
 *
74
 * @author Kim Ho (kho@luxsci.net)
75
 */
76
public class JFileChooser extends JComponent implements Accessible
77
{
78
  private static final long serialVersionUID = 3162921138695327837L;
79
 
80
  /**
81
   * A dialog type for selecting a file to open.
82
   * @see #setDialogType(int)
83
   */
84
  public static final int OPEN_DIALOG = 0;
85
 
86
  /**
87
   * A dialog type for selecting a file to save.
88
   * @see #setDialogType(int)
89
   */
90
  public static final int SAVE_DIALOG = 1;
91
 
92
  /**
93
   * A dialog type for some custom purpose.
94
   * @see #setDialogType(int)
95
   */
96
  public static final int CUSTOM_DIALOG = 2;
97
 
98
  /**
99
   * A return value indicating the file chooser has been closed by cancelling.
100
   *
101
   * @see #showOpenDialog(Component)
102
   * @see #showSaveDialog(Component)
103
   */
104
  public static final int CANCEL_OPTION = 1;
105
 
106
  /**
107
   * A return value indicating the file chooser has been closed by approving
108
   * the selection.
109
   * @see #showOpenDialog(Component)
110
   * @see #showSaveDialog(Component)
111
   */
112
  public static final int APPROVE_OPTION = 0;
113
 
114
  /**
115
   * A return value indicating the file chooser has been closed by some error.
116
   * @see #showOpenDialog(Component)
117
   * @see #showSaveDialog(Component)
118
   */
119
  public static final int ERROR_OPTION = -1;
120
 
121
  /**
122
   * A selection mode constant indicating acceptance of files only.
123
   * @see #setFileSelectionMode(int)
124
   */
125
  public static final int FILES_ONLY = 0;
126
 
127
  /**
128
   * A selection mode constant indicating acceptance of directories only.
129
   * @see #setFileSelectionMode(int)
130
   */
131
  public static final int DIRECTORIES_ONLY = 1;
132
 
133
  /**
134
   * A selection mode constant indicating acceptance of files and directories.
135
   * @see #setFileSelectionMode(int)
136
   */
137
  public static final int FILES_AND_DIRECTORIES = 2;
138
 
139
  /**
140
   * Action command string for cancelling the current selection.
141
   * @see #cancelSelection()
142
   */
143
  public static final String CANCEL_SELECTION = "CancelSelection";
144
 
145
  /**
146
   * Action command string for approving the current selection.
147
   * @see #cancelSelection()
148
   */
149
  public static final String APPROVE_SELECTION = "ApproveSelection";
150
 
151
  /**
152
   * The name of the property for the approve button text.
153
   * @see #setApproveButtonText(String)
154
   */
155
  public static final String APPROVE_BUTTON_TEXT_CHANGED_PROPERTY =
156
    "ApproveButtonTextChangedProperty";
157
 
158
  /**
159
   * The name of the property for the approve button tool tip text.
160
   * @see #setApproveButtonToolTipText(String)
161
   */
162
  public static final String APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY =
163
    "ApproveButtonToolTipTextChangedProperty";
164
 
165
  /**
166
   * The name of the property for the approve button mnemonic.
167
   * @see #setApproveButtonMnemonic(int)
168
   */
169
  public static final String APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY =
170
    "ApproveButtonMnemonicChangedProperty";
171
 
172
  /**
173
   * The name of the property for control button visibility.
174
   * @see #setControlButtonsAreShown(boolean)
175
   */
176
  public static final String CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY =
177
    "ControlButtonsAreShownChangedProperty";
178
 
179
  /**
180
   * The name of the property for the current directory.
181
   * @see #setCurrentDirectory(File)
182
   */
183
  public static final String DIRECTORY_CHANGED_PROPERTY = "directoryChanged";
184
 
185
  /**
186
   * The name of the property for the selected file.
187
   * @see #setSelectedFile(File)
188
   */
189
  public static final String SELECTED_FILE_CHANGED_PROPERTY =
190
    "SelectedFileChangedProperty";
191
 
192
  /**
193
   * The name of the property for the selected files.
194
   * @see #setSelectedFiles(File[])
195
   */
196
  public static final String SELECTED_FILES_CHANGED_PROPERTY =
197
    "SelectedFilesChangedProperty";
198
 
199
  /**
200
   * The name of the property for multi-selection.
201
   * @see #setMultiSelectionEnabled(boolean)
202
   */
203
  public static final String MULTI_SELECTION_ENABLED_CHANGED_PROPERTY =
204
    "MultiSelectionEnabledChangedProperty";
205
 
206
  /**
207
   * The name of the 'file system view' property.
208
   * @see #setFileSystemView(FileSystemView)
209
   */
210
  public static final String FILE_SYSTEM_VIEW_CHANGED_PROPERTY =
211
    "FileSystemViewChanged";
212
 
213
  /**
214
   * The name of the 'file view' property.
215
   * @see #setFileView(FileView)
216
   */
217
  public static final String FILE_VIEW_CHANGED_PROPERTY = "fileViewChanged";
218
 
219
  /**
220
   * The name of the 'file hiding enabled' property.
221
   * @see #setFileHidingEnabled(boolean)
222
   */
223
  public static final String FILE_HIDING_CHANGED_PROPERTY =
224
    "FileHidingChanged";
225
 
226
  /**
227
   * The name of the 'file filter' property.
228
   * @see #setFileFilter(FileFilter)
229
   */
230
  public static final String FILE_FILTER_CHANGED_PROPERTY =
231
    "fileFilterChanged";
232
 
233
  /**
234
   * The name of the 'file selection mode' property.
235
   * @see #setFileSelectionMode(int)
236
   */
237
  public static final String FILE_SELECTION_MODE_CHANGED_PROPERTY =
238
    "fileSelectionChanged";
239
 
240
  /**
241
   * The name of the 'accessory' property.
242
   * @see #setAccessory(JComponent)
243
   */
244
  public static final String ACCESSORY_CHANGED_PROPERTY =
245
    "AccessoryChangedProperty";
246
 
247
  /**
248
   * The name of the 'accept all file filter used' property.
249
   * @see #setAcceptAllFileFilterUsed(boolean)
250
   */
251
  public static final String ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY =
252
    "acceptAllFileFilterUsedChanged";
253
 
254
  /**
255
   * The name of the 'dialog title' property.
256
   * @see #setDialogTitle(String)
257
   */
258
  public static final String DIALOG_TITLE_CHANGED_PROPERTY =
259
    "DialogTitleChangedProperty";
260
 
261
  /**
262
   * The name of the 'dialog type' property.
263
   * @see #setDialogType(int)
264
   */
265
  public static final String DIALOG_TYPE_CHANGED_PROPERTY =
266
    "DialogTypeChangedProperty";
267
 
268
  /**
269
   * The name of the 'choosable file filters' property.
270
   * @see #addChoosableFileFilter(FileFilter)
271
   */
272
  public static final String CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY =
273
    "ChoosableFileFilterChangedProperty";
274
 
275
  /**
276
   * The accessible context.
277
   * @see #getAccessibleContext()
278
   */
279
  protected AccessibleContext accessibleContext;
280
 
281
  /**
282
   * The file system view.
283
   * @see #setFileSystemView(FileSystemView)
284
   */
285
  private FileSystemView fsv;
286
 
287
  /**
288
   * The accessory component.
289
   * @see #setAccessory(JComponent)
290
   */
291
  private JComponent accessory;
292
 
293
  /**
294
   * The approve button mnemonic.
295
   * @see #setApproveButtonMnemonic(int)
296
   */
297
  private int approveButtonMnemonic = 0;
298
 
299
  /**
300
   * The approve button text.
301
   * @see #setApproveButtonText(String)
302
   */
303
  private String approveButtonText;
304
 
305
  /**
306
   * The approve button tool tip text.
307
   * @see #setApproveButtonToolTipText(String)
308
   */
309
  private String approveButtonToolTipText;
310
 
311
  /**
312
   * The choosable file filters.
313
   * @see #addChoosableFileFilter(FileFilter)
314
   */
315
  private ArrayList choosableFilters = new ArrayList();
316
 
317
  /**
318
   * A flag controlling whether the accept all file filter is used.
319
   * @see #setAcceptAllFileFilterUsed(boolean)
320
   */
321
  private boolean isAcceptAll = true;
322
 
323
  /**
324
   * The dialog title.
325
   * @see #setDialogTitle(String)
326
   */
327
  private String dialogTitle;
328
 
329
  /**
330
   * The dialog type.
331
   * @see #setDialogType(int)
332
   */
333
  private int dialogType = OPEN_DIALOG;
334
 
335
  /**
336
   * The return value for the dialog.
337
   * @see #showOpenDialog(Component)
338
   * @see #showSaveDialog(Component)
339
   */
340
  private int retval = ERROR_OPTION;
341
 
342
  /**
343
   * A flag indicating whether the file chooser allows multiple selection.
344
   * @see #isMultiSelectionEnabled()
345
   */
346
  private boolean multiSelection = false;
347
 
348
  /**
349
   * A flag indicating whether file hiding is enabled.
350
   * @see #isFileHidingEnabled()
351
   */
352
  private boolean fileHiding = true;
353
 
354
  /**
355
   * The file selection mode.
356
   * @see #setFileSelectionMode(int)
357
   */
358
  private int fileSelectionMode = FILES_ONLY;
359
 
360
  /**
361
   * The file view.
362
   * @see #setFileView(FileView)
363
   */
364
  private FileView fv = null;
365
 
366
  /**
367
   * A flag controlling whether or not the control buttons are visible.
368
   * @see #setControlButtonsAreShown(boolean)
369
   */
370
  private boolean controlButtonsShown = true;
371
 
372
  /**
373
   * The current directory.
374
   * @see #setCurrentDirectory(File)
375
   */
376
  private File currentDir = null;
377
 
378
  /**
379
   * The current file filter.
380
   * @see #setFileFilter(FileFilter)
381
   */
382
  private FileFilter currentFilter = null;
383
 
384
  /**
385
   * An array of selected files.
386
   * @see #setSelectedFiles(File[])
387
   */
388
  private File[] selectedFiles;
389
 
390
  /**
391
   * The selected file.
392
   * @see #setSelectedFile(File)
393
   */
394
  private File selectedFile;
395
 
396
  /**
397
   * The drag enabled property.
398
   * @see #setDragEnabled(boolean)
399
   * @see #getDragEnabled()
400
   */
401
  private boolean dragEnabled;
402
 
403
  /**
404
   * Creates a new <code>JFileChooser</code> object.
405
   */
406
  public JFileChooser()
407
  {
408
    setup(null);
409
    setCurrentDirectory(null);
410
  }
411
 
412
  /**
413
   * Creates a new <code>JFileChooser</code> object.
414
   *
415
   * @param currentDirectoryPath the directory that should initially be
416
   *        shown in the filechooser (if <code>null</code>, the user's home
417
   *        directory is used).
418
   */
419
  public JFileChooser(String currentDirectoryPath)
420
  {
421
    this(currentDirectoryPath, null);
422
  }
423
 
424
  /**
425
   * Creates a new <code>JFileChooser</code> object with the specified
426
   * directory and {@link FileSystemView}.
427
   *
428
   * @param currentDirectoryPath  the directory that should initially be
429
   *        shown in the filechooser (if <code>null</code>, the user's home
430
   *        directory is used).
431
   * @param fsv  the file system view (if <code>null</code>, the default file
432
   *             system view is used).
433
   */
434
  public JFileChooser(String currentDirectoryPath, FileSystemView fsv)
435
  {
436
    setup(fsv);
437
    File dir = null;
438
    if (currentDirectoryPath != null)
439
      dir = getFileSystemView().createFileObject(currentDirectoryPath);
440
    setCurrentDirectory(dir);
441
  }
442
 
443
  /**
444
   * Creates a new <code>JFileChooser</code> object.
445
   *
446
   * @param currentDirectory  the directory that should initially be
447
   *        shown in the filechooser (if <code>null</code>, the user's home
448
   *        directory is used).
449
   */
450
  public JFileChooser(File currentDirectory)
451
  {
452
    setup(null);
453
    setCurrentDirectory(currentDirectory);
454
  }
455
 
456
  /**
457
   * Creates a new <code>JFileChooser</code> object.
458
   *
459
   * @param fsv  the file system view (if <code>null</code>, the default file
460
   *             system view is used).
461
   */
462
  public JFileChooser(FileSystemView fsv)
463
  {
464
    setup(fsv);
465
    setCurrentDirectory(null);
466
  }
467
 
468
  /**
469
   * Creates a new <code>JFileChooser</code> object.
470
   *
471
   * @param currentDirectory  the directory that should initially be
472
   *        shown in the filechooser (if <code>null</code>, the user's home
473
   *        directory is used).
474
   * @param fsv  the file system view (if <code>null</code>, the default file
475
   *             system view is used).
476
   */
477
  public JFileChooser(File currentDirectory, FileSystemView fsv)
478
  {
479
    setup(fsv);
480
    setCurrentDirectory(currentDirectory);
481
  }
482
 
483
  /**
484
   * Sets up the file chooser.  This method is called by all the constructors.
485
   *
486
   * @param view  the file system view (if <code>null</code>, the default file
487
   *              system view is used).
488
   *
489
   * @see FileSystemView#getFileSystemView()
490
   */
491
  protected void setup(FileSystemView view)
492
  {
493
    if (view == null)
494
      view = FileSystemView.getFileSystemView();
495
    setFileSystemView(view);
496
    updateUI();
497
  }
498
 
499
  /**
500
   * Sets the dragEnabled property, this disables/enables automatic drag
501
   * handling (drag and drop) on this component. The default value of the
502
   * dragEnabled property is false.
503
   *
504
   * Some look and feels might not support automatic drag and drop; they
505
   * will ignore this property.
506
   *
507
   * @param b - the new dragEnabled value
508
   */
509
  public void setDragEnabled(boolean b)
510
  {
511
    if (b && GraphicsEnvironment.isHeadless())
512
      throw new HeadlessException();
513
 
514
    dragEnabled = b;
515
  }
516
 
517
  /**
518
   * Returns true if dragging is enabled.
519
   *
520
   * @return true if dragging is enabled.
521
   */
522
  public boolean getDragEnabled()
523
  {
524
    return dragEnabled;
525
  }
526
 
527
  /**
528
   * Returns the selected file, if there is one.
529
   *
530
   * @return The selected file (possibly <code>null</code>).
531
   *
532
   * @see #setSelectedFile(File)
533
   */
534
  public File getSelectedFile()
535
  {
536
    return selectedFile;
537
  }
538
 
539
  /**
540
   * Sets the selected file and sends a {@link PropertyChangeEvent} to all
541
   * registered listeners.  The property name is
542
   * {@link #SELECTED_FILE_CHANGED_PROPERTY}.
543
   *
544
   * @param file  the file (<code>null</code> permitted).
545
   */
546
  public void setSelectedFile(File file)
547
  {
548
    if (selectedFile == null || !selectedFile.equals(file))
549
      {
550
        File old = selectedFile;
551
        selectedFile = file;
552
        firePropertyChange(SELECTED_FILE_CHANGED_PROPERTY, old, selectedFile);
553
      }
554
  }
555
 
556
  /**
557
   * Returns the selected file or files in an array.  If no files are selected,
558
   * an empty array is returned.
559
   *
560
   * @return An array of the selected files (possibly empty).
561
   */
562
  public File[] getSelectedFiles()
563
  {
564
    if (selectedFiles != null)
565
      return selectedFiles;
566
    if (selectedFile != null)
567
      return new File[] { selectedFile };
568
    return new File[0];
569
  }
570
 
571
  /**
572
   * Sets the selected files and sends a {@link PropertyChangeEvent} (with the
573
   * name {@link #SELECTED_FILES_CHANGED_PROPERTY}) to all registered
574
   * listeners.
575
   *
576
   * @param selectedFiles  the selected files (<code>null</code> permitted).
577
   */
578
  public void setSelectedFiles(File[] selectedFiles)
579
  {
580
    if (selectedFiles == null)
581
      selectedFiles = new File[0];
582
    if (selectedFiles.length > 0)
583
      setSelectedFile(selectedFiles[0]);
584
    else
585
      setSelectedFile(null);
586
    if (this.selectedFiles != selectedFiles)
587
      {
588
        File[] old = this.selectedFiles;
589
        this.selectedFiles = selectedFiles;
590
        firePropertyChange(SELECTED_FILES_CHANGED_PROPERTY, old, selectedFiles);
591
      }
592
 
593
  }
594
 
595
  /**
596
   * Returns the current directory.
597
   *
598
   * @return The current directory.
599
   */
600
  public File getCurrentDirectory()
601
  {
602
    return currentDir;
603
  }
604
 
605
  /**
606
   * Sets the current directory and fires a {@link PropertyChangeEvent} (with
607
   * the property name {@link #DIRECTORY_CHANGED_PROPERTY}) to all registered
608
   * listeners.  If <code>dir</code> is <code>null</code>, the current
609
   * directory is set to the default directory returned by the file system
610
   * view.
611
   *
612
   * @param dir  the new directory (<code>null</code> permitted).
613
   *
614
   * @see FileSystemView#getDefaultDirectory()
615
   */
616
  public void setCurrentDirectory(File dir)
617
  {
618
    if (currentDir != dir || dir == null)
619
      {
620
        if (dir == null)
621
          dir = fsv.getDefaultDirectory();
622
 
623
        File old = currentDir;
624
        currentDir = dir;
625
        firePropertyChange(DIRECTORY_CHANGED_PROPERTY, old, currentDir);
626
      }
627
  }
628
 
629
  /**
630
   * Called by the UI delegate when the parent directory is changed.
631
   */
632
  public void changeToParentDirectory()
633
  {
634
    setCurrentDirectory(fsv.getParentDirectory(currentDir));
635
  }
636
 
637
  /**
638
   * Rescans the current directory (this is handled by the UI delegate).
639
   */
640
  public void rescanCurrentDirectory()
641
  {
642
    getUI().rescanCurrentDirectory(this);
643
  }
644
 
645
  /**
646
   * Ensures the the specified file is visible (this is handled by the
647
   * UI delegate).
648
   *
649
   * @param f  the file.
650
   */
651
  public void ensureFileIsVisible(File f)
652
  {
653
    getUI().ensureFileIsVisible(this, f);
654
  }
655
 
656
  /**
657
   * Displays the file chooser in a modal dialog using the
658
   * {@link #OPEN_DIALOG} type.
659
   *
660
   * @param parent  the parent component.
661
   *
662
   * @return A return value indicating how the dialog was closed (one of
663
   *         {@link #APPROVE_OPTION}, {@link #CANCEL_OPTION} and
664
   *         {@link #ERROR_OPTION}).
665
   *
666
   * @throws HeadlessException DOCUMENT ME!
667
   */
668
  public int showOpenDialog(Component parent) throws HeadlessException
669
  {
670
    JDialog d = createDialog(parent);
671
 
672
    // FIXME: Remove when we get ancestor property
673
    d.setTitle("Open");
674
    setDialogType(OPEN_DIALOG);
675
 
676
    retval = ERROR_OPTION;
677
 
678
    d.pack();
679
    d.show();
680
    return retval;
681
  }
682
 
683
  /**
684
   * Displays the file chooser in a modal dialog using the
685
   * {@link #SAVE_DIALOG} type.
686
   *
687
   * @param parent  the parent component.
688
   *
689
   * @return A return value indicating how the dialog was closed (one of
690
   *         {@link #APPROVE_OPTION}, {@link #CANCEL_OPTION} and
691
   *         {@link #ERROR_OPTION}).
692
   *
693
   * @throws HeadlessException DOCUMENT ME!
694
   */
695
  public int showSaveDialog(Component parent) throws HeadlessException
696
  {
697
    JDialog d = createDialog(parent);
698
    setDialogType(SAVE_DIALOG);
699
 
700
    retval = ERROR_OPTION;
701
 
702
    d.pack();
703
    d.show();
704
    return retval;
705
  }
706
 
707
  /**
708
   * Displays the file chooser in a modal dialog using the
709
   * {@link #CUSTOM_DIALOG} type.
710
   *
711
   * @param parent  the parent component.
712
   *
713
   * @return A return value indicating how the dialog was closed (one of
714
   *         {@link #APPROVE_OPTION}, {@link #CANCEL_OPTION} and
715
   *         {@link #ERROR_OPTION}).
716
   *
717
   * @throws HeadlessException DOCUMENT ME!
718
   */
719
  public int showDialog(Component parent, String approveButtonText)
720
                 throws HeadlessException
721
  {
722
    JDialog d = createDialog(parent);
723
    setApproveButtonText(approveButtonText);
724
    setDialogType(CUSTOM_DIALOG);
725
 
726
    retval = ERROR_OPTION;
727
 
728
    d.pack();
729
    d.show();
730
    return retval;
731
  }
732
 
733
  /**
734
   * Creates a modal dialog in which to display the file chooser.
735
   *
736
   * @param parent  the parent component.
737
   *
738
   * @return The dialog.
739
   *
740
   * @throws HeadlessException DOCUMENT ME!
741
   */
742
  protected JDialog createDialog(Component parent) throws HeadlessException
743
  {
744
    Frame toUse = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent);
745
    if (toUse == null)
746
      toUse = (Frame) SwingUtilities.getOwnerFrame(null);
747
 
748
    JDialog dialog = new JDialog(toUse);
749
    setSelectedFile(null);
750
    dialog.getContentPane().add(this);
751
    dialog.addWindowListener( new WindowAdapter()
752
      {
753
        public void windowClosing(WindowEvent e)
754
        {
755
          cancelSelection();
756
        }
757
      });
758
    dialog.setModal(true);
759
    dialog.invalidate();
760
    dialog.repaint();
761
    return dialog;
762
  }
763
 
764
  /**
765
   * Returns the flag that controls whether or not the control buttons are
766
   * shown on the file chooser.
767
   *
768
   * @return A boolean.
769
   *
770
   * @see #setControlButtonsAreShown(boolean)
771
   */
772
  public boolean getControlButtonsAreShown()
773
  {
774
    return controlButtonsShown;
775
  }
776
 
777
  /**
778
   * Sets the flag that controls whether or not the control buttons are
779
   * shown and, if it changes, sends a {@link PropertyChangeEvent} (with the
780
   * property name {@link #CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY}) to
781
   * all registered listeners.
782
   *
783
   * @param b  the new value for the flag.
784
   */
785
  public void setControlButtonsAreShown(boolean b)
786
  {
787
    if (controlButtonsShown != b)
788
      {
789
        controlButtonsShown = b;
790
        firePropertyChange(CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY,
791
                           ! controlButtonsShown, controlButtonsShown);
792
      }
793
  }
794
 
795
  /**
796
   * Returns the type of file chooser.
797
   *
798
   * @return {@link #OPEN_DIALOG}, {@link #SAVE_DIALOG} or
799
   * {@link #CUSTOM_DIALOG}.
800
   *
801
   * @see #setDialogType(int)
802
   */
803
  public int getDialogType()
804
  {
805
    return dialogType;
806
  }
807
 
808
  /**
809
   * Sets the dialog type and fires a {@link PropertyChangeEvent} (with the
810
   * property name {@link #DIALOG_TYPE_CHANGED_PROPERTY}) to all
811
   * registered listeners.
812
   *
813
   * @param dialogType  the dialog type (one of: {@link #OPEN_DIALOG},
814
   * {@link #SAVE_DIALOG}, {@link #CUSTOM_DIALOG}).
815
   *
816
   * @throws IllegalArgumentException if <code>dialogType</code> is not valid.
817
   */
818
  public void setDialogType(int dialogType)
819
  {
820
    if (dialogType != OPEN_DIALOG && dialogType != SAVE_DIALOG
821
        && dialogType != CUSTOM_DIALOG)
822
      throw new IllegalArgumentException("Choose allowable dialogType.");
823
 
824
    if (this.dialogType != dialogType)
825
      {
826
        int old = this.dialogType;
827
        this.dialogType = dialogType;
828
        firePropertyChange(DIALOG_TYPE_CHANGED_PROPERTY, old, this.dialogType);
829
      }
830
  }
831
 
832
  /**
833
   * Sets the dialog title and sends a {@link PropertyChangeEvent} (with the
834
   * property name {@link #DIALOG_TITLE_CHANGED_PROPERTY}) to all
835
   * registered listeners.
836
   *
837
   * @param dialogTitle  the dialog title (<code>null</code> permitted).
838
   *
839
   * @see #getDialogTitle()
840
   */
841
  public void setDialogTitle(String dialogTitle)
842
  {
843
    if (this.dialogTitle != dialogTitle)
844
      {
845
        String old = this.dialogTitle;
846
        this.dialogTitle = dialogTitle;
847
        firePropertyChange(DIALOG_TITLE_CHANGED_PROPERTY, old, this.dialogTitle);
848
      }
849
  }
850
 
851
  /**
852
   * Returns the dialog title.
853
   *
854
   * @return The dialog title (possibly <code>null</code>).
855
   *
856
   * @see #setDialogTitle(String)
857
   */
858
  public String getDialogTitle()
859
  {
860
    return dialogTitle;
861
  }
862
 
863
  /**
864
   * Sets the tool tip text for the approve button and sends a
865
   * {@link PropertyChangeEvent} (with the property name
866
   * {@link #APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY}) to all
867
   * registered listeners.
868
   *
869
   * @param toolTipText  the text.
870
   */
871
  public void setApproveButtonToolTipText(String toolTipText)
872
  {
873
    if (approveButtonToolTipText != toolTipText)
874
      {
875
        String oldText = approveButtonToolTipText;
876
        approveButtonToolTipText = toolTipText;
877
        firePropertyChange(APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY,
878
                           oldText, approveButtonToolTipText);
879
      }
880
  }
881
 
882
  /**
883
   * Returns the tool tip text for the approve button.
884
   *
885
   * @return The tool tip text for the approve button.
886
   *
887
   * @see #setApproveButtonToolTipText(String)
888
   */
889
  public String getApproveButtonToolTipText()
890
  {
891
    return approveButtonToolTipText;
892
  }
893
 
894
  /**
895
   * Returns the approve button mnemonic, or zero if no mnemonic has been set.
896
   *
897
   * @return The approve button mnemonic.
898
   *
899
   * @see #setApproveButtonMnemonic(int)
900
   */
901
  public int getApproveButtonMnemonic()
902
  {
903
    return approveButtonMnemonic;
904
  }
905
 
906
  /**
907
   * Sets the mnemonic for the approve button and sends a
908
   * {@link PropertyChangeEvent} (with the property name
909
   * {@link #APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY}) to all registered
910
   * listeners.
911
   *
912
   * @param mnemonic  the mnemonic.
913
   *
914
   * @see #setApproveButtonMnemonic(char)
915
   */
916
  public void setApproveButtonMnemonic(int mnemonic)
917
  {
918
    if (approveButtonMnemonic != mnemonic)
919
      {
920
        int oldMnemonic = approveButtonMnemonic;
921
        approveButtonMnemonic = mnemonic;
922
        firePropertyChange(APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY,
923
                           oldMnemonic, approveButtonMnemonic);
924
      }
925
  }
926
 
927
  /**
928
   * Sets the mnemonic for the approve button and sends a
929
   * {@link PropertyChangeEvent} (with the property name
930
   * {@link #APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY}) to all registered
931
   * listeners.
932
   *
933
   * @param mnemonic  the mnemonic.
934
   *
935
   * @see #setApproveButtonMnemonic(int)
936
   */
937
  public void setApproveButtonMnemonic(char mnemonic)
938
  {
939
    setApproveButtonMnemonic((int) Character.toUpperCase(mnemonic));
940
  }
941
 
942
  /**
943
   * Sets the approve button text and fires a {@link PropertyChangeEvent}
944
   * (with the property name {@link #APPROVE_BUTTON_TEXT_CHANGED_PROPERTY}) to
945
   * all registered listeners.
946
   *
947
   * @param approveButtonText  the text (<code>null</code> permitted).
948
   *
949
   * @see #getApproveButtonText()
950
   */
951
  public void setApproveButtonText(String approveButtonText)
952
  {
953
    if (this.approveButtonText != approveButtonText)
954
      {
955
        String oldText = this.approveButtonText;
956
        this.approveButtonText = approveButtonText;
957
        firePropertyChange(APPROVE_BUTTON_TEXT_CHANGED_PROPERTY, oldText,
958
                           this.approveButtonText);
959
      }
960
  }
961
 
962
  /**
963
   * Returns the approve button text.
964
   *
965
   * @return The approve button text (possibly <code>null</code>).
966
   *
967
   * @see #setApproveButtonText(String)
968
   */
969
  public String getApproveButtonText()
970
  {
971
    return approveButtonText;
972
  }
973
 
974
  /**
975
   * Returns the available file filters for this file chooser.
976
   *
977
   * @return The available file filters.
978
   */
979
  public FileFilter[] getChoosableFileFilters()
980
  {
981
    return (FileFilter[]) choosableFilters.toArray(new FileFilter[choosableFilters.size()]);
982
  }
983
 
984
  /**
985
   * Adds a file filter to the list of available filters and sends a
986
   * {@link PropertyChangeEvent} (with the property name
987
   * {@link #CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY}) to all registered
988
   * listeners.
989
   *
990
   * @param filter  the filter (<code>null</code> permitted).
991
   */
992
  public void addChoosableFileFilter(FileFilter filter)
993
  {
994
    if (filter != null)
995
      {
996
        FileFilter[] old = getChoosableFileFilters();
997
        choosableFilters.add(filter);
998
        FileFilter[] newFilters = getChoosableFileFilters();
999
        firePropertyChange(CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY, old,
1000
              newFilters);
1001
      }
1002
    setFileFilter(filter);
1003
  }
1004
 
1005
  /**
1006
   * Removes a file filter from the list of available filters and sends a
1007
   * {@link PropertyChangeEvent} (with the property name
1008
   * {@link #CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY}) to all registered
1009
   * listeners.
1010
   *
1011
   * @param f  the file filter.
1012
   *
1013
   * @return <code>true</code> if the filter was removed and
1014
   *         <code>false</code> otherwise.
1015
   */
1016
  public boolean removeChoosableFileFilter(FileFilter f)
1017
  {
1018
    if (f == currentFilter)
1019
      setFileFilter(null);
1020
    FileFilter[] old = getChoosableFileFilters();
1021
    if (! choosableFilters.remove(f))
1022
      return false;
1023
    FileFilter[] newFilters = getChoosableFileFilters();
1024
    firePropertyChange(CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY, old, newFilters);
1025
    return true;
1026
  }
1027
 
1028
  /**
1029
   * Clears the list of choosable file filters and installs the 'accept all'
1030
   * filter from the UI delegate.
1031
   */
1032
  public void resetChoosableFileFilters()
1033
  {
1034
    choosableFilters.clear();
1035
    choosableFilters.add(getUI().getAcceptAllFileFilter(this));
1036
    setFileFilter((FileFilter) choosableFilters.get(0));
1037
  }
1038
 
1039
  /**
1040
   * Returns the 'accept all' file filter from the UI delegate.
1041
   *
1042
   * @return The 'accept all' file filter.
1043
   */
1044
  public FileFilter getAcceptAllFileFilter()
1045
  {
1046
    return getUI().getAcceptAllFileFilter(this);
1047
  }
1048
 
1049
  /**
1050
   * Returns the flag that controls whether or not the 'accept all' file
1051
   * filter is included in the list of filters.
1052
   *
1053
   * @return A boolean.
1054
   *
1055
   * @see #setAcceptAllFileFilterUsed(boolean)
1056
   */
1057
  public boolean isAcceptAllFileFilterUsed()
1058
  {
1059
    return isAcceptAll;
1060
  }
1061
 
1062
  /**
1063
   * Sets the flag that controls whether or not the 'accept all' file filter
1064
   * is included in the list of filters, and sends a
1065
   * {@link PropertyChangeEvent} (with the property name
1066
   * {@link #ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY}) to all registered
1067
   * listeners.
1068
   *
1069
   * @param b  the new value of the flag.
1070
   */
1071
  public void setAcceptAllFileFilterUsed(boolean b)
1072
  {
1073
    if (isAcceptAll != b)
1074
      {
1075
        isAcceptAll = b;
1076
        if (b)
1077
          addChoosableFileFilter(getAcceptAllFileFilter());
1078
        else
1079
          removeChoosableFileFilter(getAcceptAllFileFilter());
1080
        firePropertyChange(ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY,
1081
                           ! isAcceptAll, isAcceptAll);
1082
      }
1083
  }
1084
 
1085
  /**
1086
   * Returns the accessory component for the file chooser.  The default
1087
   * value is <code>null</code>.
1088
   *
1089
   * @return The accessory component (possibly <code>null</code>).
1090
   *
1091
   * @see #setAccessory(JComponent)
1092
   */
1093
  public JComponent getAccessory()
1094
  {
1095
    return accessory;
1096
  }
1097
 
1098
  /**
1099
   * Sets the accessory component for the file chooser and sends a
1100
   * {@link PropertyChangeEvent} to all registered listeners.  The property
1101
   * name is {@link #ACCESSORY_CHANGED_PROPERTY}.
1102
   *
1103
   * @param newAccessory  the accessory component.
1104
   */
1105
  public void setAccessory(JComponent newAccessory)
1106
  {
1107
    if (accessory != newAccessory)
1108
      {
1109
        JComponent old = accessory;
1110
        accessory = newAccessory;
1111
        firePropertyChange(ACCESSORY_CHANGED_PROPERTY, old, accessory);
1112
      }
1113
  }
1114
 
1115
  /**
1116
   * Sets the file selection mode and sends a {@link PropertyChangeEvent}
1117
   * to all registered listeners.  The property name is
1118
   * {@link #FILE_SELECTION_MODE_CHANGED_PROPERTY}.
1119
   *
1120
   * @param mode  the mode ({@link #FILES_ONLY}, {@link #DIRECTORIES_ONLY} or
1121
   *              {@link #FILES_AND_DIRECTORIES}).
1122
   *
1123
   * @throws IllegalArgumentException if the mode is invalid.
1124
   */
1125
  public void setFileSelectionMode(int mode)
1126
  {
1127
    if (mode != FILES_ONLY && mode != DIRECTORIES_ONLY
1128
        && mode != FILES_AND_DIRECTORIES)
1129
      throw new IllegalArgumentException("Choose a correct file selection mode.");
1130
    if (fileSelectionMode != mode)
1131
      {
1132
        int old = fileSelectionMode;
1133
        fileSelectionMode = mode;
1134
        firePropertyChange(FILE_SELECTION_MODE_CHANGED_PROPERTY, old,
1135
                           fileSelectionMode);
1136
      }
1137
  }
1138
 
1139
  /**
1140
   * Returns the file selection mode, one of: {@link #FILES_ONLY},
1141
   * {@link #DIRECTORIES_ONLY} or {@link #FILES_AND_DIRECTORIES}.  The
1142
   * default is {@link #FILES_ONLY}.
1143
   *
1144
   * @return The file selection mode.
1145
   *
1146
   * @see #setFileSelectionMode(int)
1147
   */
1148
  public int getFileSelectionMode()
1149
  {
1150
    return fileSelectionMode;
1151
  }
1152
 
1153
  /**
1154
   * Returns <code>true</code> if file selection is enabled, and
1155
   * <code>false</code> otherwise.  File selection is enabled when the
1156
   * file selection mode is {@link #FILES_ONLY} or
1157
   * {@link #FILES_AND_DIRECTORIES}.
1158
   *
1159
   * @return <code>true</code> if file selection is enabled.
1160
   *
1161
   * @see #getFileSelectionMode()
1162
   */
1163
  public boolean isFileSelectionEnabled()
1164
  {
1165
    return (fileSelectionMode == FILES_ONLY
1166
           || fileSelectionMode == FILES_AND_DIRECTORIES);
1167
  }
1168
 
1169
  /**
1170
   * Returns <code>true</code> if directory selection is enabled, and
1171
   * <code>false</code> otherwise.  Directory selection is enabled when the
1172
   * file selection mode is {@link #DIRECTORIES_ONLY} or
1173
   * {@link #FILES_AND_DIRECTORIES}.
1174
   *
1175
   * @return <code>true</code> if file selection is enabled.
1176
   *
1177
   * @see #getFileSelectionMode()
1178
   */
1179
  public boolean isDirectorySelectionEnabled()
1180
  {
1181
    return (fileSelectionMode == DIRECTORIES_ONLY
1182
           || fileSelectionMode == FILES_AND_DIRECTORIES);
1183
  }
1184
 
1185
  /**
1186
   * Sets the flag that controls whether multiple selections are allowed in
1187
   * this filechooser and sends a {@link PropertyChangeEvent} (with the
1188
   * property name {@link #MULTI_SELECTION_ENABLED_CHANGED_PROPERTY}) to all
1189
   * registered listeners.
1190
   *
1191
   * @param b  the new value of the flag.
1192
   */
1193
  public void setMultiSelectionEnabled(boolean b)
1194
  {
1195
    if (multiSelection != b)
1196
      {
1197
        multiSelection = b;
1198
        firePropertyChange(MULTI_SELECTION_ENABLED_CHANGED_PROPERTY,
1199
                           ! multiSelection, multiSelection);
1200
      }
1201
  }
1202
 
1203
  /**
1204
   * Returns <code>true</code> if multiple selections are allowed within this
1205
   * file chooser, and <code>false</code> otherwise.
1206
   *
1207
   * @return A boolean.
1208
   *
1209
   * @see #setMultiSelectionEnabled(boolean)
1210
   */
1211
  public boolean isMultiSelectionEnabled()
1212
  {
1213
    return multiSelection;
1214
  }
1215
 
1216
  /**
1217
   * Returns <code>true</code> if hidden files are to be hidden, and
1218
   * <code>false</code> otherwise.
1219
   *
1220
   * @return A boolean.
1221
   *
1222
   * @see #setFileHidingEnabled(boolean)
1223
   */
1224
  public boolean isFileHidingEnabled()
1225
  {
1226
    return fileHiding;
1227
  }
1228
 
1229
  /**
1230
   * Sets the flag that controls whether or not hidden files are displayed,
1231
   * and sends a {@link PropertyChangeEvent} (with the property name
1232
   * {@link #FILE_HIDING_CHANGED_PROPERTY}) to all registered listeners.
1233
   *
1234
   * @param b  the new value of the flag.
1235
   */
1236
  public void setFileHidingEnabled(boolean b)
1237
  {
1238
    if (fileHiding != b)
1239
      {
1240
        fileHiding = b;
1241
        firePropertyChange(FILE_HIDING_CHANGED_PROPERTY, ! fileHiding,
1242
                           fileHiding);
1243
      }
1244
  }
1245
 
1246
  /**
1247
   * Sets the file filter and sends a {@link PropertyChangeEvent} (with the
1248
   * property name {@link #FILE_FILTER_CHANGED_PROPERTY}) to all registered
1249
   * listeners.
1250
   *
1251
   * @param filter  the filter (<code>null</code> permitted).
1252
   */
1253
  public void setFileFilter(FileFilter filter)
1254
  {
1255
    if (currentFilter != filter)
1256
      {
1257
        if (filter != null && !choosableFilters.contains(filter))
1258
          addChoosableFileFilter(filter);
1259
        FileFilter old = currentFilter;
1260
        currentFilter = filter;
1261
        firePropertyChange(FILE_FILTER_CHANGED_PROPERTY, old, currentFilter);
1262
      }
1263
  }
1264
 
1265
  /**
1266
   * Returns the file filter.
1267
   *
1268
   * @return The file filter.
1269
   *
1270
   * @see #setFileFilter(FileFilter)
1271
   */
1272
  public FileFilter getFileFilter()
1273
  {
1274
    return currentFilter;
1275
  }
1276
 
1277
  /**
1278
   * Sets a custom {@link FileView} for the file chooser and sends a
1279
   * {@link PropertyChangeEvent} to all registered listeners.  The property
1280
   * name is {@link #FILE_VIEW_CHANGED_PROPERTY}.
1281
   *
1282
   * @param fileView  the file view (<code>null</code> permitted).
1283
   *
1284
   * @see #getFileView()
1285
   */
1286
  public void setFileView(FileView fileView)
1287
  {
1288
    if (fv != fileView)
1289
      {
1290
        FileView old = fv;
1291
        fv = fileView;
1292
        firePropertyChange(FILE_VIEW_CHANGED_PROPERTY, old, fv);
1293
      }
1294
  }
1295
 
1296
  /**
1297
   * Returns the custom {@link FileView} for the file chooser.
1298
   *
1299
   * @return The file view (possibly <code>null</code>).
1300
   */
1301
  public FileView getFileView()
1302
  {
1303
    return fv;
1304
  }
1305
 
1306
  /**
1307
   * Returns the name of the file, generated by the current (or default)
1308
   * {@link FileView}.
1309
   *
1310
   * @param f  the file.
1311
   *
1312
   * @return The file name.
1313
   */
1314
  public String getName(File f)
1315
  {
1316
    String name = null;
1317
    if (fv != null)
1318
      name = fv.getName(f);
1319
    if (name == null)
1320
      name = getUI().getFileView(this).getName(f);
1321
    return name;
1322
  }
1323
 
1324
  /**
1325
   * Returns the description of the file, generated by the current (or default)
1326
   * {@link FileView}.
1327
   *
1328
   * @param f  the file.
1329
   *
1330
   * @return The file description.
1331
   */
1332
  public String getDescription(File f)
1333
  {
1334
    String result = null;
1335
    if (fv != null)
1336
      result = fv.getDescription(f);
1337
    if (result == null)
1338
      result = getUI().getFileView(this).getDescription(f);
1339
    return result;
1340
  }
1341
 
1342
  /**
1343
   * Returns the type description for the file, generated by the current (or
1344
   * default) {@link FileView}.
1345
   *
1346
   * @param f  the file.
1347
   *
1348
   * @return The file type description.
1349
   */
1350
  public String getTypeDescription(File f)
1351
  {
1352
    String result = null;
1353
    if (fv != null)
1354
      result = getFileView().getTypeDescription(f);
1355
    if (result == null)
1356
      result = getUI().getFileView(this).getTypeDescription(f);
1357
    return result;
1358
  }
1359
 
1360
  /**
1361
   * Returns the icon provided by the current (or default) {@link FileView}.
1362
   *
1363
   * @param f  the file.
1364
   *
1365
   * @return An icon representing the file.
1366
   */
1367
  public Icon getIcon(File f)
1368
  {
1369
    Icon result = null;
1370
    if (fv != null)
1371
      result = fv.getIcon(f);
1372
    if (result == null)
1373
      result = getUI().getFileView(this).getIcon(f);
1374
    return result;
1375
  }
1376
 
1377
  /**
1378
   * Returns <code>true</code> if the file is traversable, and
1379
   * <code>false</code> otherwise.
1380
   *
1381
   * @param f  the file or directory.
1382
   *
1383
   * @return A boolean.
1384
   */
1385
  public boolean isTraversable(File f)
1386
  {
1387
    return getFileSystemView().isTraversable(f).booleanValue();
1388
  }
1389
 
1390
  /**
1391
   * Returns <code>true</code> if the file is accepted by the current
1392
   * file filter.
1393
   *
1394
   * @param f  the file.
1395
   *
1396
   * @return A boolean.
1397
   */
1398
  public boolean accept(File f)
1399
  {
1400
    if (f == null)
1401
      return true;
1402
    FileFilter ff = getFileFilter();
1403
    if (ff != null)
1404
      return ff.accept(f);
1405
    else
1406
      return true;
1407
  }
1408
 
1409
  /**
1410
   * Sets the file system view for the file chooser and sends a
1411
   * {@link PropertyChangeEvent} to all registered listeners.
1412
   *
1413
   * @param fsv  the file system view.
1414
   */
1415
  public void setFileSystemView(FileSystemView fsv)
1416
  {
1417
    if (this.fsv != fsv)
1418
      {
1419
        FileSystemView old = this.fsv;
1420
        this.fsv = fsv;
1421
        firePropertyChange(FILE_SYSTEM_VIEW_CHANGED_PROPERTY, old, this.fsv);
1422
      }
1423
  }
1424
 
1425
  /**
1426
   * Returns the file system view being used by this file chooser.
1427
   *
1428
   * @return The file system view.
1429
   *
1430
   * @see #setFileSystemView(FileSystemView)
1431
   */
1432
  public FileSystemView getFileSystemView()
1433
  {
1434
    return fsv;
1435
  }
1436
 
1437
  /**
1438
   * Approves the selection.  An {@link ActionEvent} is sent to all registered
1439
   * listeners.
1440
   */
1441
  public void approveSelection()
1442
  {
1443
    retval = APPROVE_OPTION;
1444
    fireActionPerformed(APPROVE_SELECTION);
1445
  }
1446
 
1447
  /**
1448
   * Cancels the selection. An {@link ActionEvent} is sent to all registered
1449
   * listeners.
1450
   */
1451
  public void cancelSelection()
1452
  {
1453
    retval = CANCEL_OPTION;
1454
    fireActionPerformed(CANCEL_SELECTION);
1455
  }
1456
 
1457
  /**
1458
   * Adds an {@link ActionListener} to the file chooser.
1459
   *
1460
   * @param l  the listener.
1461
   */
1462
  public void addActionListener(ActionListener l)
1463
  {
1464
    listenerList.add(ActionListener.class, l);
1465
  }
1466
 
1467
  /**
1468
   * Removes an {@link ActionListener} from this file chooser.
1469
   *
1470
   * @param l  the listener.
1471
   */
1472
  public void removeActionListener(ActionListener l)
1473
  {
1474
    try
1475
      {
1476
        listenerList.remove(ActionListener.class, l);
1477
      }
1478
    catch (IllegalArgumentException e)
1479
      {
1480
        e.printStackTrace();
1481
      }
1482
  }
1483
 
1484
  /**
1485
   * Returns the action listeners registered with this file chooser.
1486
   *
1487
   * @return An array of listeners.
1488
   */
1489
  public ActionListener[] getActionListeners()
1490
  {
1491
    return (ActionListener[]) getListeners(ActionListener.class);
1492
  }
1493
 
1494
  /**
1495
   * Sends an @link {ActionEvent} to all registered listeners.
1496
   *
1497
   * @param command  the action command.
1498
   */
1499
  protected void fireActionPerformed(String command)
1500
  {
1501
    ActionListener[] list = getActionListeners();
1502
    ActionEvent event = new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
1503
                                        command);
1504
 
1505
    for (int i = 0; i < list.length; i++)
1506
      list[i].actionPerformed(event);
1507
  }
1508
 
1509
  /**
1510
   * Installs the UI delegate for the current look and feel.
1511
   */
1512
  public void updateUI()
1513
  {
1514
    setUI((FileChooserUI) UIManager.getUI(this));
1515
  }
1516
 
1517
  /**
1518
   * Returns the UI delegate class identifier.
1519
   *
1520
   * @return <code>FileChooserUI</code>.
1521
   */
1522
  public String getUIClassID()
1523
  {
1524
    return "FileChooserUI";
1525
  }
1526
 
1527
  /**
1528
   * Returns the UI delegate for the component.
1529
   *
1530
   * @return The UI delegate.
1531
   */
1532
  public FileChooserUI getUI()
1533
  {
1534
    return (FileChooserUI) ui;
1535
  }
1536
 
1537
  /**
1538
   * Returns a string describing the attributes for the
1539
   * <code>JFileChooser</code> component, for use in debugging.  The return
1540
   * value is guaranteed to be non-<code>null</code>, but the format of the
1541
   * string may vary between implementations.
1542
   *
1543
   * @return A string describing the attributes of the
1544
   *     <code>JFileChooser</code>.
1545
   */
1546
  protected String paramString()
1547
  {
1548
    CPStringBuilder sb = new CPStringBuilder(super.paramString());
1549
    sb.append(",approveButtonText=");
1550
    if (approveButtonText != null)
1551
      sb.append(approveButtonText);
1552
    sb.append(",currentDirectory=");
1553
    if (currentDir != null)
1554
      sb.append(currentDir);
1555
    sb.append(",dialogTitle=");
1556
    if (dialogTitle != null)
1557
      sb.append(dialogTitle);
1558
    sb.append(",dialogType=");
1559
    if (dialogType == OPEN_DIALOG)
1560
      sb.append("OPEN_DIALOG");
1561
    if (dialogType == SAVE_DIALOG)
1562
      sb.append("SAVE_DIALOG");
1563
    if (dialogType == CUSTOM_DIALOG)
1564
      sb.append("CUSTOM_DIALOG");
1565
    sb.append(",fileSelectionMode=");
1566
    if (fileSelectionMode == FILES_ONLY)
1567
      sb.append("FILES_ONLY");
1568
    if (fileSelectionMode == DIRECTORIES_ONLY)
1569
      sb.append("DIRECTORIES_ONLY");
1570
    if (fileSelectionMode == FILES_AND_DIRECTORIES)
1571
      sb.append("FILES_AND_DIRECTORIES");
1572
    sb.append(",returnValue=");
1573
    if (retval == APPROVE_OPTION)
1574
      sb.append("APPROVE_OPTION");
1575
    if (retval == CANCEL_OPTION)
1576
      sb.append("CANCEL_OPTION");
1577
    if (retval == ERROR_OPTION)
1578
      sb.append("ERROR_OPTION");
1579
    sb.append(",selectedFile=");
1580
    if (selectedFile != null)
1581
      sb.append(selectedFile);
1582
    sb.append(",useFileHiding=").append(fileHiding);
1583
    return sb.toString();
1584
  }
1585
 
1586
  /**
1587
   * Returns the object that provides accessibility features for this
1588
   * <code>JFileChooser</code> component.
1589
   *
1590
   * @return The accessible context (an instance of
1591
   *     {@link AccessibleJFileChooser}).
1592
   */
1593
  public AccessibleContext getAccessibleContext()
1594
  {
1595
    if (accessibleContext == null)
1596
      accessibleContext = new AccessibleJFileChooser();
1597
    return accessibleContext;
1598
  }
1599
 
1600
  /**
1601
   * Provides the accessibility features for the <code>JFileChooser</code>
1602
   * component.
1603
   */
1604
  protected class AccessibleJFileChooser
1605
    extends JComponent.AccessibleJComponent
1606
  {
1607
    /**
1608
     * Creates a new instance of <code>AccessibleJFileChooser</code>.
1609
     */
1610
    protected AccessibleJFileChooser()
1611
    {
1612
      // Nothing to do here.
1613
    }
1614
 
1615
    /**
1616
     * Returns the accessible role for the <code>JFileChooser</code>
1617
     * component.
1618
     *
1619
     * @return {@link AccessibleRole#FILE_CHOOSER}.
1620
     */
1621
    public AccessibleRole getAccessibleRole()
1622
    {
1623
      return AccessibleRole.FILE_CHOOSER;
1624
    }
1625
  }
1626
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.