comparison org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/widgets/FileDialog.d @ 0:6dd524f61e62

add dwt win and basic java stuff
author Frank Benoit <benoit@tionex.de>
date Mon, 02 Mar 2009 14:44:16 +0100
parents
children 2e09b0e6857a
comparison
equal deleted inserted replaced
-1:000000000000 0:6dd524f61e62
1 /*******************************************************************************
2 * Copyright (c) 2000, 2008 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM Corporation - initial API and implementation
10 * Port to the D programming language:
11 * Frank Benoit <benoit@tionex.de>
12 *******************************************************************************/
13 module org.eclipse.swt.widgets.FileDialog;
14
15
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.SWTException;
18 import org.eclipse.swt.internal.win32.OS;
19 import org.eclipse.swt.widgets.Dialog;
20 import org.eclipse.swt.widgets.Shell;
21 import org.eclipse.swt.widgets.Display;
22
23 import java.lang.all;
24
25 /**
26 * Instances of this class allow the user to navigate
27 * the file system and select or enter a file name.
28 * <dl>
29 * <dt><b>Styles:</b></dt>
30 * <dd>SAVE, OPEN, MULTI</dd>
31 * <dt><b>Events:</b></dt>
32 * <dd>(none)</dd>
33 * </dl>
34 * <p>
35 * Note: Only one of the styles SAVE and OPEN may be specified.
36 * </p><p>
37 * IMPORTANT: This class is intended to be subclassed <em>only</em>
38 * within the SWT implementation.
39 * </p>
40 *
41 * @see <a href="http://www.eclipse.org/swt/snippets/#filedialog">FileDialog snippets</a>
42 * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: ControlExample, Dialog tab</a>
43 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
44 */
45 public class FileDialog : Dialog {
46 String [] filterNames;
47 String [] filterExtensions;
48 String [] fileNames;
49 String filterPath = "", fileName = "";
50 int filterIndex = 0;
51 bool overwrite = false;
52 static const String FILTER = "*.*";
53 static int BUFFER_SIZE = 1024 * 32;
54 static bool USE_HOOK = true;
55 static this() {
56 /*
57 * Feature in Vista. When OFN_ENABLEHOOK is set in the
58 * save or open file dialog, Vista uses the old XP look
59 * and feel. OFN_ENABLEHOOK is used to grow the file
60 * name buffer in a multi-select file dialog. The fix
61 * is to only use OFN_ENABLEHOOK when the buffer has
62 * overrun.
63 */
64 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) {
65 USE_HOOK = false;
66 }
67 }
68
69 /**
70 * Constructs a new instance of this class given only its parent.
71 *
72 * @param parent a shell which will be the parent of the new instance
73 *
74 * @exception IllegalArgumentException <ul>
75 * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
76 * </ul>
77 * @exception SWTException <ul>
78 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
79 * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
80 * </ul>
81 */
82 public this (Shell parent) {
83 this (parent, SWT.APPLICATION_MODAL);
84 }
85
86 /**
87 * Constructs a new instance of this class given its parent
88 * and a style value describing its behavior and appearance.
89 * <p>
90 * The style value is either one of the style constants defined in
91 * class <code>SWT</code> which is applicable to instances of this
92 * class, or must be built by <em>bitwise OR</em>'ing together
93 * (that is, using the <code>int</code> "|" operator) two or more
94 * of those <code>SWT</code> style constants. The class description
95 * lists the style constants that are applicable to the class.
96 * Style bits are also inherited from superclasses.
97 * </p>
98 *
99 * @param parent a shell which will be the parent of the new instance
100 * @param style the style of dialog to construct
101 *
102 * @exception IllegalArgumentException <ul>
103 * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
104 * </ul>
105 * @exception SWTException <ul>
106 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
107 * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
108 * </ul>
109 */
110 public this (Shell parent, int style) {
111 super (parent, checkStyle (parent, style));
112 checkSubclass ();
113 }
114
115 /**
116 * Returns the path of the first file that was
117 * selected in the dialog relative to the filter path, or an
118 * empty string if no such file has been selected.
119 *
120 * @return the relative path of the file
121 */
122 public String getFileName () {
123 return fileName;
124 }
125
126 /**
127 * Returns a (possibly empty) array with the paths of all files
128 * that were selected in the dialog relative to the filter path.
129 *
130 * @return the relative paths of the files
131 */
132 public String [] getFileNames () {
133 return fileNames;
134 }
135
136 /**
137 * Returns the file extensions which the dialog will
138 * use to filter the files it shows.
139 *
140 * @return the file extensions filter
141 */
142 public String [] getFilterExtensions () {
143 return filterExtensions;
144 }
145
146 /**
147 * Get the 0-based index of the file extension filter
148 * which was selected by the user, or -1 if no filter
149 * was selected.
150 * <p>
151 * This is an index into the FilterExtensions array and
152 * the FilterNames array.
153 * </p>
154 *
155 * @return index the file extension filter index
156 *
157 * @see #getFilterExtensions
158 * @see #getFilterNames
159 *
160 * @since 3.4
161 */
162 public int getFilterIndex () {
163 return filterIndex;
164 }
165
166 /**
167 * Returns the names that describe the filter extensions
168 * which the dialog will use to filter the files it shows.
169 *
170 * @return the list of filter names
171 */
172 public String [] getFilterNames () {
173 return filterNames;
174 }
175
176 /**
177 * Returns the directory path that the dialog will use, or an empty
178 * string if this is not set. File names in this path will appear
179 * in the dialog, filtered according to the filter extensions.
180 *
181 * @return the directory path string
182 *
183 * @see #setFilterExtensions
184 */
185 public String getFilterPath () {
186 return filterPath;
187 }
188
189 /**
190 * Returns the flag that the dialog will use to
191 * determine whether to prompt the user for file
192 * overwrite if the selected file already exists.
193 *
194 * @return true if the dialog will prompt for file overwrite, false otherwise
195 *
196 * @since 3.4
197 */
198 public bool getOverwrite () {
199 return overwrite;
200 }
201
202 private static extern(Windows) uint OFNHookProc (HWND hdlg, uint uiMsg, uint wParam, int lParam) {
203 switch (uiMsg) {
204 case OS.WM_NOTIFY:
205 OFNOTIFY* ofn = cast(OFNOTIFY*)lParam;
206 //OS.MoveMemory (ofn, lParam, OFNOTIFY.sizeof);
207 if (ofn.hdr.code is OS.CDN_SELCHANGE) {
208 int lResult = OS.SendMessage (ofn.hdr.hwndFrom, OS.CDM_GETSPEC, 0, 0);
209 if (lResult > 0) {
210 lResult += OS.MAX_PATH;
211 OPENFILENAME* lpofn = ofn.lpOFN;
212 //OS.MoveMemory (lpofn, ofn.lpOFN, OS.OPENFILENAME_sizeof);
213 if (lpofn.nMaxFile < lResult) {
214 auto hHeap = OS.GetProcessHeap ();
215 auto lpstrFile = cast(TCHAR*) OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, lResult * TCHAR.sizeof);
216 if (lpstrFile !is null) {
217 if (lpofn.lpstrFile !is null) OS.HeapFree (hHeap, 0, lpofn.lpstrFile);
218 lpofn.lpstrFile = lpstrFile;
219 lpofn.nMaxFile = lResult;
220 //OS.MoveMemory (ofn.lpOFN, lpofn, OS.OPENFILENAME_sizeof);
221 }
222 }
223 }
224 }
225 break;
226 default:
227 }
228 return 0;
229 }
230
231 /**
232 * Makes the dialog visible and brings it to the front
233 * of the display.
234 *
235 * @return a string describing the absolute path of the first selected file,
236 * or null if the dialog was cancelled or an error occurred
237 *
238 * @exception SWTException <ul>
239 * <li>ERROR_WIDGET_DISPOSED - if the dialog has been disposed</li>
240 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the dialog</li>
241 * </ul>
242 */
243 public String open () {
244 auto hHeap = OS.GetProcessHeap ();
245
246 /* Get the owner HWND for the dialog */
247 HWND hwndOwner;
248 auto hwndParent = parent.handle;
249
250 /*
251 * Feature in Windows. There is no API to set the orientation of a
252 * file dialog. It is always inherited from the parent. The fix is
253 * to create a hidden parent and set the orientation in the hidden
254 * parent for the dialog to inherit.
255 */
256 bool enabled = false;
257 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION(4, 10)) {
258 int dialogOrientation = style & (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT);
259 int parentOrientation = parent.style & (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT);
260 if (dialogOrientation !is parentOrientation) {
261 int exStyle = OS.WS_EX_NOINHERITLAYOUT;
262 if (dialogOrientation is SWT.RIGHT_TO_LEFT) exStyle |= OS.WS_EX_LAYOUTRTL;
263 hwndOwner = OS.CreateWindowEx (
264 exStyle,
265 Shell.DialogClass.ptr,
266 null,
267 0,
268 OS.CW_USEDEFAULT, 0, OS.CW_USEDEFAULT, 0,
269 hwndParent,
270 null,
271 OS.GetModuleHandle (null),
272 null);
273 enabled = OS.IsWindowEnabled (hwndParent) !is 0;
274 if (enabled) OS.EnableWindow (hwndParent, false);
275 }
276 }
277
278 /* Convert the title and copy it into lpstrTitle */
279 if (title is null) title = "";
280 /* Use the character encoding for the default locale */
281 TCHAR[] buffer3 = StrToTCHARs (0, title, true);
282 int byteCount3 = buffer3.length * TCHAR.sizeof;
283 auto lpstrTitle = cast(TCHAR*) OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount3);
284 OS.MoveMemory (lpstrTitle, buffer3.ptr, byteCount3);
285
286 /* Compute filters and copy into lpstrFilter */
287 String strFilter = "";
288 if (filterNames is null) filterNames = null;
289 if (filterExtensions is null) filterExtensions = null;
290 for (int i=0; i<filterExtensions.length; i++) {
291 String filterName = filterExtensions [i];
292 if (i < filterNames.length) filterName = filterNames [i];
293 strFilter = strFilter ~ filterName ~ '\0' ~ filterExtensions [i] ~ '\0';
294 }
295 if (filterExtensions.length is 0) {
296 strFilter = strFilter ~ FILTER ~ '\0' ~ FILTER ~ '\0';
297 }
298 /* Use the character encoding for the default locale */
299 TCHAR[] buffer4 = StrToTCHARs (0, strFilter, true);
300 int byteCount4 = buffer4.length * TCHAR.sizeof;
301 auto lpstrFilter = cast(TCHAR*) OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount4);
302 OS.MoveMemory (lpstrFilter, buffer4.ptr, byteCount4);
303
304 /* Convert the fileName and filterName to C strings */
305 if (fileName is null) fileName = "";
306 /* Use the character encoding for the default locale */
307 TCHAR[] name = StrToTCHARs (0, fileName, true);
308
309 /*
310 * Copy the name into lpstrFile and ensure that the
311 * last byte is NULL and the buffer does not overrun.
312 */
313 int nMaxFile = OS.MAX_PATH;
314 if ((style & SWT.MULTI) !is 0) nMaxFile = Math.max (nMaxFile, BUFFER_SIZE);
315 int byteCount = nMaxFile * TCHAR.sizeof;
316 auto lpstrFile = cast(TCHAR*) OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
317 int byteCountFile = Math.min (name.length * TCHAR.sizeof, byteCount - TCHAR.sizeof);
318 OS.MoveMemory (lpstrFile, name.ptr, byteCountFile);
319
320 /*
321 * Copy the path into lpstrInitialDir and ensure that
322 * the last byte is NULL and the buffer does not overrun.
323 */
324 if (filterPath is null) filterPath = "";
325 /* Use the character encoding for the default locale */
326 TCHAR[] path = StrToTCHARs (0, filterPath.replace ('/', '\\'), true);
327 int byteCount5 = OS.MAX_PATH * TCHAR.sizeof;
328 auto lpstrInitialDir = cast(TCHAR*) OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount5);
329 int byteCountDir = Math.min (path.length * TCHAR.sizeof, byteCount5 - TCHAR.sizeof);
330 OS.MoveMemory (lpstrInitialDir, path.ptr, byteCountDir);
331
332 /* Create the file dialog struct */
333 OPENFILENAME struct_;
334 struct_.lStructSize = OS.OPENFILENAME_sizeof;
335 struct_.Flags = OS.OFN_HIDEREADONLY | OS.OFN_NOCHANGEDIR;
336 bool save = (style & SWT.SAVE) !is 0;
337 if (save && overwrite) struct_.Flags |= OS.OFN_OVERWRITEPROMPT;
338 if ((style & SWT.MULTI) !is 0) {
339 struct_.Flags |= OS.OFN_ALLOWMULTISELECT | OS.OFN_EXPLORER;
340 if (!OS.IsWinCE && USE_HOOK) {
341 //callback = new Callback (this, "OFNHookProc", 4); //$NON-NLS-1$
342 //int lpfnHook = callback.getAddress ();
343 //if (lpfnHook is 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
344 struct_.lCustData = cast(uint) cast(void*) this;
345 struct_.lpfnHook = &OFNHookProc;
346 struct_.Flags |= OS.OFN_ENABLEHOOK;
347 }
348 }
349 struct_.hwndOwner = hwndOwner;
350 struct_.lpstrTitle = lpstrTitle;
351 struct_.lpstrFile = lpstrFile;
352 struct_.nMaxFile = nMaxFile;
353 struct_.lpstrInitialDir = lpstrInitialDir;
354 struct_.lpstrFilter = lpstrFilter;
355 struct_.nFilterIndex = filterIndex is 0 ? filterIndex : filterIndex + 1;
356
357 /*
358 * Set the default extension to an empty string. If the
359 * user fails to type an extension and this extension is
360 * empty, Windows uses the current value of the filter
361 * extension at the time that the dialog is closed.
362 */
363 TCHAR* lpstrDefExt;
364 if (save) {
365 lpstrDefExt = cast(TCHAR*) OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, TCHAR.sizeof);
366 struct_.lpstrDefExt = lpstrDefExt;
367 }
368
369 /* Make the parent shell be temporary modal */
370 Dialog oldModal = null;
371 Display display = parent.getDisplay ();
372 if ((style & (SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL)) !is 0) {
373 oldModal = display.getModalDialog ();
374 display.setModalDialog (this);
375 }
376
377 /*
378 * Feature in Windows. For some reason, the WH_MSGFILTER filter
379 * does not run for GetSaveFileName() or GetOpenFileName(). The
380 * fix is to allow async messages to run in the WH_FOREGROUNDIDLE
381 * hook instead.
382 *
383 * Bug in Windows 98. For some reason, when certain operating
384 * system calls such as Shell_NotifyIcon(), GetOpenFileName()
385 * and GetSaveFileName() are made during the WH_FOREGROUNDIDLE
386 * hook, Windows hangs. The fix is to disallow async messages
387 * during WH_FOREGROUNDIDLE.
388 */
389 bool oldRunMessagesInIdle = display.runMessagesInIdle;
390 display.runMessagesInIdle = !OS.IsWin95;
391 /*
392 * Open the dialog. If the open fails due to an invalid
393 * file name, use an empty file name and open it again.
394 */
395 bool success = cast(bool)( (save) ? OS.GetSaveFileName (&struct_) : OS.GetOpenFileName (&struct_));
396 switch (OS.CommDlgExtendedError ()) {
397 case OS.FNERR_INVALIDFILENAME:
398 OS.MoveMemory (lpstrFile, StrToTCHARz ( "" ), TCHAR.sizeof);
399 success = cast(bool)((save) ? OS.GetSaveFileName (&struct_) : OS.GetOpenFileName (&struct_));
400 break;
401 case OS.FNERR_BUFFERTOOSMALL:
402 USE_HOOK = true;
403 break;
404 default:
405 }
406 display.runMessagesInIdle = oldRunMessagesInIdle;
407
408 /* Clear the temporary dialog modal parent */
409 if ((style & (SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL)) !is 0) {
410 display.setModalDialog (oldModal);
411 }
412
413 /* Dispose the callback and reassign the buffer */
414 //if (callback !is null) callback.dispose ();
415 lpstrFile = struct_.lpstrFile;
416
417 /* Set the new path, file name and filter */
418 fileNames = null;
419 String fullPath = null;
420 if (success) {
421
422 /* Use the character encoding for the default locale */
423 TCHAR[] buffer = NewTCHARs (0, struct_.nMaxFile);
424 int byteCount1 = buffer.length * TCHAR.sizeof;
425 OS.MoveMemory (buffer.ptr, lpstrFile, byteCount1);
426
427 /*
428 * Bug in WinCE. For some reason, nFileOffset and nFileExtension
429 * are always zero on WinCE HPC. nFileOffset is always zero on
430 * WinCE PPC when using GetSaveFileName(). nFileOffset is correctly
431 * set on WinCE PPC when using OpenFileName(). The fix is to parse
432 * lpstrFile to calculate nFileOffset.
433 *
434 * Note: WinCE does not support multi-select file dialogs.
435 */
436 int nFileOffset = struct_.nFileOffset;
437 static if (OS.IsWinCE) {
438 if (nFileOffset is 0) {
439 int index = 0;
440 while (index < buffer.length ) {
441 int ch = buffer[index];
442 if (ch is 0) break;
443 if (ch is '\\') nFileOffset = index + 1;
444 index++;
445 }
446 }
447 }
448 if (nFileOffset > 0) {
449
450 /* Use the character encoding for the default locale */
451 TCHAR[] prefix = NewTCHARs (0, nFileOffset - 1);
452 int byteCount2 = prefix.length * TCHAR.sizeof;
453 OS.MoveMemory (prefix.ptr, lpstrFile, byteCount2);
454 filterPath = TCHARsToStr( prefix );
455
456 /*
457 * Get each file from the buffer. Files are delimited
458 * by a NULL character with 2 NULL characters at the end.
459 */
460 int count = 0;
461 fileNames = new String[]( (style & SWT.MULTI) !is 0 ? 4 : 1 );
462 int start = nFileOffset;
463 do {
464 int end = start;
465 while (end < buffer.length && buffer[end] !is 0) end++;
466 String string = TCHARsToStr( buffer[ start .. end ] );
467 start = end;
468 if (count is fileNames.length) {
469 String [] newFileNames = new String[]( fileNames.length + 4 );
470 System.arraycopy (fileNames, 0, newFileNames, 0, fileNames.length);
471 fileNames = newFileNames;
472 }
473 fileNames [count++] = string;
474 if ((style & SWT.MULTI) is 0) break;
475 start++;
476 } while (start < buffer.length && buffer[start] !is 0);
477
478 if (fileNames.length > 0) fileName = fileNames [0];
479 String separator = "";
480 int length_ = filterPath.length;
481 if (length_ > 0 && filterPath[length_ - 1] !is '\\') {
482 separator = "\\";
483 }
484 fullPath = filterPath ~ separator ~ fileName;
485 if (count < fileNames.length) {
486 String [] newFileNames = new String[]( count );
487 System.arraycopy (fileNames, 0, newFileNames, 0, count);
488 fileNames = newFileNames;
489 }
490 }
491 filterIndex = struct_.nFilterIndex - 1;
492 }
493
494 /* Free the memory that was allocated. */
495 OS.HeapFree (hHeap, 0, lpstrFile);
496 OS.HeapFree (hHeap, 0, lpstrFilter);
497 OS.HeapFree (hHeap, 0, lpstrInitialDir);
498 OS.HeapFree (hHeap, 0, lpstrTitle);
499 if (lpstrDefExt !is null) OS.HeapFree (hHeap, 0, lpstrDefExt);
500
501 /* Destroy the BIDI orientation window */
502 if (hwndParent !is hwndOwner) {
503 if (enabled) OS.EnableWindow (hwndParent, true);
504 OS.SetActiveWindow (hwndParent);
505 OS.DestroyWindow (hwndOwner);
506 }
507
508 /*
509 * This code is intentionally commented. On some
510 * platforms, the owner window is repainted right
511 * away when a dialog window exits. This behavior
512 * is currently unspecified.
513 */
514 // if (hwndOwner !is 0) OS.UpdateWindow (hwndOwner);
515
516 /* Answer the full path or null */
517 return fullPath;
518 }
519
520 /**
521 * Set the initial filename which the dialog will
522 * select by default when opened to the argument,
523 * which may be null. The name will be prefixed with
524 * the filter path when one is supplied.
525 *
526 * @param string the file name
527 */
528 public void setFileName (String string) {
529 fileName = string;
530 }
531
532 /**
533 * Set the file extensions which the dialog will
534 * use to filter the files it shows to the argument,
535 * which may be null.
536 * <p>
537 * The strings are platform specific. For example, on
538 * some platforms, an extension filter string is typically
539 * of the form "*.extension", where "*.*" matches all files.
540 * For filters with multiple extensions, use semicolon as
541 * a separator, e.g. "*.jpg;*.png".
542 * </p>
543 *
544 * @param extensions the file extension filter
545 *
546 * @see #setFilterNames to specify the user-friendly
547 * names corresponding to the extensions
548 */
549 public void setFilterExtensions (String [] extensions) {
550 filterExtensions = extensions;
551 }
552
553 /**
554 * Set the 0-based index of the file extension filter
555 * which the dialog will use initially to filter the files
556 * it shows to the argument.
557 * <p>
558 * This is an index into the FilterExtensions array and
559 * the FilterNames array.
560 * </p>
561 *
562 * @param index the file extension filter index
563 *
564 * @see #setFilterExtensions
565 * @see #setFilterNames
566 *
567 * @since 3.4
568 */
569 public void setFilterIndex (int index) {
570 filterIndex = index;
571 }
572
573 /**
574 * Sets the names that describe the filter extensions
575 * which the dialog will use to filter the files it shows
576 * to the argument, which may be null.
577 * <p>
578 * Each name is a user-friendly short description shown for
579 * its corresponding filter. The <code>names</code> array must
580 * be the same length as the <code>extensions</code> array.
581 * </p>
582 *
583 * @param names the list of filter names, or null for no filter names
584 *
585 * @see #setFilterExtensions
586 */
587 public void setFilterNames (String [] names) {
588 filterNames = names;
589 }
590
591 /**
592 * Sets the directory path that the dialog will use
593 * to the argument, which may be null. File names in this
594 * path will appear in the dialog, filtered according
595 * to the filter extensions. If the string is null,
596 * then the operating system's default filter path
597 * will be used.
598 * <p>
599 * Note that the path string is platform dependent.
600 * For convenience, either '/' or '\' can be used
601 * as a path separator.
602 * </p>
603 *
604 * @param string the directory path
605 *
606 * @see #setFilterExtensions
607 */
608 public void setFilterPath (String string) {
609 filterPath = string;
610 }
611
612 /**
613 * Sets the flag that the dialog will use to
614 * determine whether to prompt the user for file
615 * overwrite if the selected file already exists.
616 *
617 * @param overwrite true if the dialog will prompt for file overwrite, false otherwise
618 *
619 * @since 3.4
620 */
621 public void setOverwrite (bool overwrite) {
622 this.overwrite = overwrite;
623 }
624 }
625