diff -r e8e63152f320 -r 2a9601315dfc javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/FileDialog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/FileDialog.java Mon May 03 12:27:20 2010 +0300 @@ -0,0 +1,479 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 IBM Corporation and others. + * Portion Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Nokia Corporation - Qt implementation + *******************************************************************************/ +package org.eclipse.swt.widgets; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.SWTException; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.internal.qt.OS; + +/** + * Instances of this class allow the user to navigate the file system and select + * or enter a file name. + *
+ *
Styles:
+ *
SAVE, OPEN, MULTI
+ *
Events:
+ *
(none)
+ *
+ *

+ * Note: Only one of the styles SAVE and OPEN may be specified. + *

+ *

+ * IMPORTANT: This class is intended to be subclassed only within the + * SWT implementation. + *

+ */ +public class FileDialog extends Dialog { + String[] filterNames; + String[] filterExtensions; + String filterPath = ""; + String fileName; + String[] fileNames = new String[] {}; + int filterIndex = -1; + static final char SEPARATOR = System.getProperty("file.separator") + .charAt(0); + static final String EXTENSION_SEPARATOR = ";;"; + String dialogID; + static int dialogCount; + + /** + * Constructs a new instance of this class given only its parent. + * + * @param parent + * a shell which will be the parent of the new instance + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + */ + public FileDialog(Shell parent) { + this(parent, SWT.NULL); + } + + /** + * Constructs a new instance of this class given its parent and a style + * value describing its behavior and appearance. + *

+ * The style value is either one of the style constants defined in class + * SWT which is applicable to instances of this class, or must + * be built by bitwise OR'ing together (that is, using the + * int "|" operator) two or more of those SWT + * style constants. The class description lists the style constants that are + * applicable to the class. Style bits are also inherited from superclasses. + *

+ * + * @param parent + * a shell which will be the parent of the new instance + * @param style + * the style of dialog to construct + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + */ + public FileDialog(Shell parent, int style) { + super(parent, checkStyle(parent, style)); + checkSubclass(); + dialogCount++; + dialogID = toString() + String.valueOf(dialogCount); + } + + static int checkStyle(Shell parent, int style) { + style &= ~SWT.MIRRORED; + if ((style & SWT.RIGHT_TO_LEFT) == 0) { + if (parent != null) { + if ((parent.style & SWT.RIGHT_TO_LEFT) != 0) + style |= SWT.RIGHT_TO_LEFT; + } + } + + if ((style & SWT.OPEN) != 0 && (style & SWT.SAVE) != 0) { + style &= ~SWT.OPEN; + } + + if ((style & SWT.SAVE) != 0 && (style & SWT.MULTI) != 0) { + style &= ~SWT.MULTI; + } + + if ((style & SWT.LEFT_TO_RIGHT) != 0 + && (style & SWT.RIGHT_TO_LEFT) != 0) { + style &= ~SWT.LEFT_TO_RIGHT; + } + return style; + } + + /** + * Returns the path of the first file that was selected in the dialog + * relative to the filter path, or an empty string if no such file has been + * selected. + * + * @return the relative path of the file + */ + public String getFileName() { + return fileName; + } + + /** + * Returns a (possibly empty) array with the paths of all files that were + * selected in the dialog relative to the filter path. + * + * @return the relative paths of the files + */ + public String[] getFileNames() { + return fileNames; + } + + /** + * Returns the file extensions which the dialog will use to filter the files + * it shows. + * + * @return the file extensions filter + */ + public String[] getFilterExtensions() { + return filterExtensions; + } + + /** + * Get the 0-based index of the file extension filter which was selected by + * the user, or -1 if no filter was selected. + *

+ * This is an index into the FilterExtensions array and the FilterNames + * array. + *

+ * + * @return index the file extension filter index + * + * @see #getFilterExtensions + * @see #getFilterNames + * + * @since 3.4 + */ + public int getFilterIndex() { + return filterIndex; + } + + /** + * Returns the names that describe the filter extensions which the dialog + * will use to filter the files it shows. + * + * @return the list of filter names + */ + public String[] getFilterNames() { + return filterNames; + } + + /** + * Returns the directory path that the dialog will use, or an empty string + * if this is not set. File names in this path will appear in the dialog, + * filtered according to the filter extensions. + * + * @return the directory path string + * + * @see #setFilterExtensions + */ + public String getFilterPath() { + return filterPath; + } + + /** + * Makes the dialog visible and brings it to the front of the display. + * + * @return a string describing the absolute path of the first selected file, + * or null if the dialog was cancelled or an error occurred + * + * @exception SWTException + * + */ + public String open() { + checkDialog(); + + /* + * put filters and filter names into single string + */ + String filter = ""; + int filterCount = filterExtensions != null ? filterExtensions.length + : -1; + int filterNameCount = filterNames != null ? filterNames.length : -1; + if (filterCount > 0) { + filter += (filterNameCount > 0 ? filterNames[0] + " " : "") + "(" + + filterExtensions[0] + ")"; + for (int i = 1; i < filterCount; i++) { + filter += EXTENSION_SEPARATOR + + (i < filterNameCount ? filterNames[i] + " " : "") + + "(" + filterExtensions[i] + ")"; + } + } + + /* + * get selected filter + */ + String selectedFilter = filterIndex > -1 && filterIndex < filterCount ? filterExtensions[filterIndex] + : ""; + + /* + * form full path + */ + int filterPathLength = filterPath != null ? filterPath.length() : 0; + String fullPath = filterPathLength > 0 ? filterPath : ""; + int fileNameLength = fileName != null ? fileName.length() : 0; + if (filterPathLength > 0 && fileNameLength > 0 + && filterPath.charAt(filterPathLength - 1) != SEPARATOR) { + /* + * adding a separator between filterPath and file name + */ + fullPath += SEPARATOR; + } + if (fileNameLength > 0) { + fullPath += fileName; + } + + DisposeListener listener = new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + if (e.widget == parent) { + /* + * close dialogs which opened on top of parent + */ + OS.QDialog_swt_closeDialogs(parent.handle, + dialogID); + } + + } + }; + + /* + * listen to parent dispose event + */ + parent.addDisposeListener(listener); + + /* + * open dialog + */ + int qtLayoutDirection = (style & SWT.RIGHT_TO_LEFT) != 0 ? OS.QT_RIGHTTOLEFT + : OS.QT_LEFTTORIGHT; + String[] resultStrings; + if ((style & SWT.SAVE) != 0) { + resultStrings = OS.QFileDialog_swt_getSaveFileName(parent.handle, + title, fullPath, filter, selectedFilter, dialogID, + qtLayoutDirection); + } else { + if ((style & SWT.MULTI) != 0) { + resultStrings = OS.QFileDialog_swt_getOpenFileNames( + parent.handle, title, fullPath, filter, selectedFilter, + dialogID, qtLayoutDirection); + } else { + resultStrings = OS.QFileDialog_swt_getOpenFileName( + parent.handle, title, fullPath, filter, selectedFilter, + dialogID, qtLayoutDirection); + } + } + + if (parent != null && !parent.isDisposed()) { + parent.removeDisposeListener(listener); + } + + parseResult(resultStrings); + return resultStrings != null && resultStrings.length > 0 ? resultStrings[0] + : null; + } + + /* + * Array Parameter 'result' stores full paths of selected files with the + * last one in the array storing the selected filter + */ + private void parseResult(String[] result) { + + filterPath = null; + fileNames = null; + fileName = null; + filterIndex = -1; + + if (result == null) { + return; + } + int count = result.length; + if (count < 1) { + return; + } + + /* + * get the first file name and filter path from dialog result + */ + fileNames = new String[count - 1]; + String fullPath = result[0]; + int separatorPos = -1; + if (fullPath != null && fullPath.length() > 0) { + separatorPos = fullPath.lastIndexOf(SEPARATOR); + fileName = fullPath.substring(separatorPos + 1); + fileNames[0] = fileName; + filterPath = fullPath.substring(0, separatorPos); + } + + /* + * get rest file names from dialog result + */ + for (int i = 1; i < count - 1; i++) { + fullPath = result[i]; + if (fullPath != null && fullPath.length() > 0) { + separatorPos = fullPath.lastIndexOf(SEPARATOR); + fileNames[i] = fullPath.substring(separatorPos + 1); + } else { + fileNames[i] = null; + } + } + + /* + * get filter index + */ + int filterCount = filterExtensions.length; + String selectedFilter = result[count - 1]; + filterIndex = -1; + if (filterCount > 0 && selectedFilter != null) { + selectedFilter = selectedFilter.substring(selectedFilter + .indexOf('(') + 1); + selectedFilter = selectedFilter.substring(0, selectedFilter + .indexOf(')')); + for (int i = 0; i < filterCount; i++) { + if (filterExtensions[i].equals(selectedFilter)) { + filterIndex = i; + break; + } + } + + } + + } + + /** + * Set the initial filename which the dialog will select by default when + * opened to the argument, which may be null. The name will be prefixed with + * the filter path when one is supplied. + * + * @param string + * the file name + */ + public void setFileName(String string) { + fileName = string; + } + + /** + * Set the file extensions which the dialog will use to filter the files it + * shows to the argument, which may be null. + *

+ * The strings are platform specific. For example, on Windows, an extension + * filter string is typically of the form "*.extension", where "*.*" matches + * all files. + *

+ * + * @param extensions + * the file extension filter + * + * @see #setFilterNames to specify the user-friendly names corresponding to + * the extensions + */ + public void setFilterExtensions(String[] extensions) { + filterExtensions = extensions; + } + + /** + * Set the 0-based index of the file extension filter which the dialog will + * use initially to filter the files it shows to the argument. + *

+ * This is an index into the FilterExtensions array and the FilterNames + * array. + *

+ * + * @param index + * the file extension filter index + * + * @see #setFilterExtensions + * @see #setFilterNames + * + * @since 3.4 + */ + public void setFilterIndex(int index) { + filterIndex = index; + } + + /** + * Sets the the names that describe the filter extensions which the dialog + * will use to filter the files it shows to the argument, which may be null. + *

+ * Each name is a user-friendly short description shown for its + * corresponding filter. The names array must be the same + * length as the extensions array. + *

+ * + * @param names + * the list of filter names, or null for no filter names + * + * @see #setFilterExtensions + */ + public void setFilterNames(String[] names) { + filterNames = names; + } + + /** + * Sets the directory path that the dialog will use to the argument, which + * may be null. File names in this path will appear in the dialog, filtered + * according to the filter extensions. If the string is null, then the + * operating system's default filter path will be used. + *

+ * Note that the path string is platform dependent. For convenience, either + * '/' or '\' can be used as a path separator. + *

+ * + * @param string + * the directory path + * + * @see #setFilterExtensions + */ + public void setFilterPath(String string) { + filterPath = string; + } + + void checkDialog() { + if (parent == null) + error(SWT.ERROR_WIDGET_DISPOSED); + if (parent.isDisposed()) + error(SWT.ERROR_WIDGET_DISPOSED); + Display display = parent.display; + if (display == null) + error(SWT.ERROR_WIDGET_DISPOSED); + if (display.thread != Thread.currentThread()) + error(SWT.ERROR_THREAD_INVALID_ACCESS); + } + +}