This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 171928
Collapse All | Expand All

(-)a/openide.filesystems/apichanges.xml (+28 lines)
Lines 46-51 Link Here
46
        <apidef name="filesystems">Filesystems API</apidef>
46
        <apidef name="filesystems">Filesystems API</apidef>
47
    </apidefs>
47
    </apidefs>
48
    <changes>
48
    <changes>
49
        <change id="FileChooserBuilder.SelectionApprover">
50
            <api name="filesystems"/>
51
            <summary>Added FileChooserBuilder.setSelectionApprover(FileChooserBuilder.SelectionApprover) and FileChooserBuilder.addFileFilter()</summary>
52
            <version major="7" minor="26"/>
53
            <date day="16" month="9" year="2009"/>
54
            <author login="tboudreau"/>
55
            <compatibility modification="yes">
56
                <p>
57
                    Added FileChooserBuilder.setSelectionApprover(),
58
                    FileChooserBuilder.addFileFilter() and the interface
59
                    FileChooserBuilder.SelectionApprover.
60
                </p>
61
            </compatibility>
62
            <description>
63
                <p>
64
                    Added FileChooserBuilder.setSelectionApprover() which enables
65
                    JFileChoosers created by a FileChooserBuilder to intercept
66
                    JFileChooser.approveSelection() (for example, to ask the user
67
                    if it is ok to overwrite a file);  added
68
                    FileChooserBuilder.addFileFilter() which operates similarly
69
                    to JFileChooser.addChoosableFileFilter(), so JFileChoosers
70
                    created by a FileChooserBuilder can be given user-selectable
71
                    file filters.
72
                </p>
73
            </description>
74
            <class package="org.openide.filesystems" name="FileChooserBuilder"/>
75
            <issue number="171928"/>
76
        </change>
49
        <change id="Repository.defaultFileSystem.status">
77
        <change id="Repository.defaultFileSystem.status">
50
            <api name="filesystems"/>
78
            <api name="filesystems"/>
51
            <summary>System filesystem label/icon annotations work without full module system</summary>
79
            <summary>System filesystem label/icon annotations work without full module system</summary>
(-)a/openide.filesystems/nbproject/project.properties (-1 / +1 lines)
Lines 44-47 Link Here
44
javadoc.main.page=org/openide/filesystems/doc-files/api.html
44
javadoc.main.page=org/openide/filesystems/doc-files/api.html
45
javadoc.arch=${basedir}/arch.xml
45
javadoc.arch=${basedir}/arch.xml
46
javadoc.apichanges=${basedir}/apichanges.xml
46
javadoc.apichanges=${basedir}/apichanges.xml
47
spec.version.base=7.25.0
47
spec.version.base=7.26.0
(-)a/openide.filesystems/src/org/openide/filesystems/FileChooserBuilder.java (-2 / +76 lines)
Lines 46-51 Link Here
46
import java.awt.HeadlessException;
46
import java.awt.HeadlessException;
47
import java.awt.KeyboardFocusManager;
47
import java.awt.KeyboardFocusManager;
48
import java.io.File;
48
import java.io.File;
49
import java.util.ArrayList;
50
import java.util.List;
49
import javax.swing.Icon;
51
import javax.swing.Icon;
50
import javax.swing.JFileChooser;
52
import javax.swing.JFileChooser;
51
import javax.swing.filechooser.FileFilter;
53
import javax.swing.filechooser.FileFilter;
Lines 113-118 Link Here
113
    private boolean filesOnly;
115
    private boolean filesOnly;
114
    private static final boolean DONT_STORE_DIRECTORIES =
116
    private static final boolean DONT_STORE_DIRECTORIES =
115
            Boolean.getBoolean("forget.recent.dirs");
117
            Boolean.getBoolean("forget.recent.dirs");
118
    private SelectionApprover approver;
119
    private final List<FileFilter> filters = new ArrayList<FileFilter>(3);
116
    /**
120
    /**
117
     * Create a new FileChooserBuilder using the name of the passed class
121
     * Create a new FileChooserBuilder using the name of the passed class
118
     * as the metadata for looking up a starting directory from previous
122
     * as the metadata for looking up a starting directory from previous
Lines 248-254 Link Here
248
     * @return A file chooser
252
     * @return A file chooser
249
     */
253
     */
250
    public JFileChooser createFileChooser() {
254
    public JFileChooser createFileChooser() {
251
        JFileChooser result = new SavedDirFileChooser(dirKey, failoverDir, force);
255
        JFileChooser result = new SavedDirFileChooser(dirKey, failoverDir,
256
                force, approver);
252
        prepareFileChooser(result);
257
        prepareFileChooser(result);
253
        return result;
258
        return result;
254
    }
259
    }
Lines 362-373 Link Here
362
        if (aDescription != null) {
367
        if (aDescription != null) {
363
            chooser.getAccessibleContext().setAccessibleDescription(aDescription);
368
            chooser.getAccessibleContext().setAccessibleDescription(aDescription);
364
        }
369
        }
370
        if (!filters.isEmpty()) {
371
            for (FileFilter f : filters) {
372
                chooser.addChoosableFileFilter(f);
373
            }
374
        }
375
    }
376
377
    /**
378
     * Equivalent to calling <code>JFileChooser.addChoosableFileFilter(filter)</code>.
379
     * Adds another file filter that can be displayed in the file filters combo
380
     * box in the file chooser.
381
     *
382
     * @param filter The file filter to add
383
     * @return this
384
     * @since 7.26.0
385
     */
386
    public FileChooserBuilder addFileFilter (FileFilter filter) {
387
        filters.add (filter);
388
        return this;
389
    }
390
391
    /**
392
     * Set a selection approver which can display an &quot;Overwrite file?&quot;
393
     * or similar dialog if necessary, when the user presses the accept button
394
     * in the file chooser dialog.
395
     *
396
     * @param approver A SelectionApprover which will determine if the selection
397
     * is valid
398
     * @return this
399
     * @since 7.26.0
400
     */
401
    public FileChooserBuilder setSelectionApprover (SelectionApprover approver) {
402
        this.approver = approver;
403
        return this;
404
    }
405
406
    /**
407
     * Object which can approve the selection (enabling the OK button or
408
     * equivalent) in a JFileChooser.  Equivalent to overriding
409
     * <code>JFileChooser.approveSelection()</code>
410
     * @since 7.26.0
411
     */
412
    public interface SelectionApprover {
413
        /**
414
         * Approve the selection, enabling the dialog to be closed.  Called by
415
         * the JFileChooser's <code>approveSelection()</code> method.  Use this
416
         * interface if you want to, for example, show a dialog asking
417
         * &quot;Overwrite File X?&quot; or similar.
418
         *
419
         * @param selection The selected file(s) at the time the user presses
420
         * the Open, Save or OK button
421
         * @return true if the selection is accepted, false if it is not and
422
         * the dialog should not be closed
423
         */
424
        public boolean approve (File[] selection);
365
    }
425
    }
366
426
367
    private static final class SavedDirFileChooser extends JFileChooser {
427
    private static final class SavedDirFileChooser extends JFileChooser {
368
        private final String dirKey;
428
        private final String dirKey;
369
        SavedDirFileChooser(String dirKey, File failoverDir, boolean force) {
429
        private final SelectionApprover approver;
430
        SavedDirFileChooser(String dirKey, File failoverDir, boolean force, SelectionApprover approver) {
370
            this.dirKey = dirKey;
431
            this.dirKey = dirKey;
432
            this.approver = approver;
371
            if (force && failoverDir != null && failoverDir.exists() && failoverDir.isDirectory()) {
433
            if (force && failoverDir != null && failoverDir.exists() && failoverDir.isDirectory()) {
372
                setCurrentDirectory(failoverDir);
434
                setCurrentDirectory(failoverDir);
373
            } else {
435
            } else {
Lines 387-392 Link Here
387
        }
449
        }
388
450
389
        @Override
451
        @Override
452
        public void approveSelection() {
453
            if (approver != null) {
454
                boolean approved = approver.approve(getSelectedFiles());
455
                if (approved) {
456
                    super.approveSelection();
457
                }
458
            } else {
459
                super.approveSelection();
460
            }
461
        }
462
463
        @Override
390
        public int showOpenDialog(Component parent) throws HeadlessException {
464
        public int showOpenDialog(Component parent) throws HeadlessException {
391
            int result = super.showOpenDialog(parent);
465
            int result = super.showOpenDialog(parent);
392
            if (result == APPROVE_OPTION) {
466
            if (result == APPROVE_OPTION) {
(-)a/openide.filesystems/test/unit/src/org/openide/filesystems/FileChooserBuilderTest.java (+63 lines)
Lines 44-49 Link Here
44
import java.awt.EventQueue;
44
import java.awt.EventQueue;
45
import java.io.File;
45
import java.io.File;
46
import java.io.IOException;
46
import java.io.IOException;
47
import java.util.Arrays;
48
import java.util.HashSet;
49
import java.util.Set;
47
import javax.swing.AbstractButton;
50
import javax.swing.AbstractButton;
48
import javax.swing.JButton;
51
import javax.swing.JButton;
49
import javax.swing.JFileChooser;
52
import javax.swing.JFileChooser;
Lines 178-183 Link Here
178
        assertNotNull(instance.createFileChooser());
181
        assertNotNull(instance.createFileChooser());
179
    }
182
    }
180
183
184
    public void testSetSelectionApprover() throws Exception {
185
        FileChooserBuilder instance = new FileChooserBuilder("i");
186
        File tmp = new File(System.getProperty("java.io.tmpdir"));
187
        assertTrue ("Environment is insane", tmp.exists() && tmp.isDirectory());
188
        File sel = new File("tmp" + System.currentTimeMillis());
189
        if (!sel.exists()) {
190
            assertTrue (sel.createNewFile());
191
        }
192
        instance.setDefaultWorkingDirectory(tmp);
193
        SA sa = new SA();
194
        instance.setSelectionApprover(sa);
195
        JFileChooser ch = instance.createFileChooser();
196
        ch.approveSelection();
197
        sa.assertApproveInvoked();
198
    }
199
200
    public void testAddFileFilter() {
201
        FileChooserBuilder instance = new FileChooserBuilder("j");
202
        FF one = new FF ("a");
203
        FF two = new FF ("b");
204
        instance.addFileFilter(one);
205
        instance.addFileFilter(two);
206
        JFileChooser ch = instance.createFileChooser();
207
        Set<FileFilter> ff = new HashSet<FileFilter>(Arrays.asList(one, two));
208
        Set<FileFilter> actual = new HashSet<FileFilter>(Arrays.asList(ch.getChoosableFileFilters()));
209
        assertTrue (actual.containsAll(ff));
210
        //actual should also contain JFileChooser.getAcceptAllFileFilter()
211
        assertEquals (ff.size() + 1, actual.size());
212
    }
213
214
    private static final class FF extends FileFilter {
215
        private String x;
216
        FF(String x) {
217
            this.x = x;
218
        }
219
220
        @Override
221
        public boolean accept(File f) {
222
            return f.getName().endsWith(x);
223
        }
224
225
        @Override
226
        public String getDescription() {
227
            return x;
228
        }
229
230
    }
231
232
    private static final class SA implements FileChooserBuilder.SelectionApprover {
233
        private boolean approveInvoked;
234
        public boolean approve(File[] selection) {
235
            approveInvoked = true;
236
            return true;
237
        }
238
239
        void assertApproveInvoked() {
240
            assertTrue (approveInvoked);
241
        }
242
    }
243
181
    private static AbstractButton findDefaultButton(Container c) {
244
    private static AbstractButton findDefaultButton(Container c) {
182
        if (c instanceof AbstractButton && "Snorkelbreath".equals(((AbstractButton) c).getText())) {
245
        if (c instanceof AbstractButton && "Snorkelbreath".equals(((AbstractButton) c).getText())) {
183
            return (JButton) c;
246
            return (JButton) c;

Return to bug 171928