827 String filename = getFileName(); |
828 String filename = getFileName(); |
828 FileSystemView fs = chooser.getFileSystemView(); |
829 FileSystemView fs = chooser.getFileSystemView(); |
829 File dir = chooser.getCurrentDirectory(); |
830 File dir = chooser.getCurrentDirectory(); |
830 |
831 |
831 if (filename != null) { |
832 if (filename != null) { |
832 // Remove whitespace from beginning and end of filename |
833 // Remove whitespaces from end of filename |
833 filename = filename.trim(); |
834 int i = filename.length() - 1; |
834 } |
835 |
835 |
836 while (i >=0 && filename.charAt(i) <= ' ') { |
836 if (filename == null || filename.equals("")) { |
837 i--; |
|
838 } |
|
839 |
|
840 filename = filename.substring(0, i + 1); |
|
841 } |
|
842 |
|
843 if (filename == null || filename.length() == 0) { |
837 // no file selected, multiple selection off, therefore cancel the approve action |
844 // no file selected, multiple selection off, therefore cancel the approve action |
838 resetGlobFilter(); |
845 resetGlobFilter(); |
839 return; |
846 return; |
840 } |
847 } |
841 |
848 |
842 File selectedFile = null; |
849 File selectedFile = null; |
843 File[] selectedFiles = null; |
850 File[] selectedFiles = null; |
844 |
851 |
845 if (filename != null && !filename.equals("")) { |
852 // Unix: Resolve '~' to user's home directory |
846 // Unix: Resolve '~' to user's home directory |
853 if (File.separatorChar == '/') { |
847 if (File.separatorChar == '/') { |
854 if (filename.startsWith("~/")) { |
848 if (filename.startsWith("~/")) { |
855 filename = System.getProperty("user.home") + filename.substring(1); |
849 filename = System.getProperty("user.home") + filename.substring(1); |
856 } else if (filename.equals("~")) { |
850 } else if (filename.equals("~")) { |
857 filename = System.getProperty("user.home"); |
851 filename = System.getProperty("user.home"); |
858 } |
852 } |
859 } |
853 } |
860 |
854 |
861 if (chooser.isMultiSelectionEnabled() && filename.length() > 1 && |
855 if (chooser.isMultiSelectionEnabled() && filename.startsWith("\"")) { |
862 filename.charAt(0) == '"' && filename.charAt(filename.length() - 1) == '"') { |
856 ArrayList<File> fList = new ArrayList<File>(); |
863 List<File> fList = new ArrayList<File>(); |
857 |
864 |
858 filename = filename.substring(1); |
865 String[] files = filename.substring(1, filename.length() - 1).split("\" \""); |
859 if (filename.endsWith("\"")) { |
866 // Optimize searching files by names in "children" array |
860 filename = filename.substring(0, filename.length()-1); |
867 Arrays.sort(files); |
861 } |
868 |
862 File[] children = null; |
869 File[] children = null; |
863 int childIndex = 0; |
870 int childIndex = 0; |
864 do { |
871 |
865 String str; |
872 for (String str : files) { |
866 int i = filename.indexOf("\" \""); |
873 File file = fs.createFileObject(str); |
867 if (i > 0) { |
874 if (!file.isAbsolute()) { |
868 str = filename.substring(0, i); |
875 if (children == null) { |
869 filename = filename.substring(i+3); |
876 children = fs.getFiles(dir, false); |
870 } else { |
877 Arrays.sort(children); |
871 str = filename; |
|
872 filename = ""; |
|
873 } |
878 } |
874 File file = fs.createFileObject(str); |
879 for (int k = 0; k < children.length; k++) { |
875 if (!file.isAbsolute()) { |
880 int l = (childIndex + k) % children.length; |
876 if (children == null) { |
881 if (children[l].getName().equals(str)) { |
877 children = fs.getFiles(dir, false); |
882 file = children[l]; |
878 Arrays.sort(children); |
883 childIndex = l + 1; |
879 } |
884 break; |
880 for (int k = 0; k < children.length; k++) { |
|
881 int l = (childIndex + k) % children.length; |
|
882 if (children[l].getName().equals(str)) { |
|
883 file = children[l]; |
|
884 childIndex = l + 1; |
|
885 break; |
|
886 } |
|
887 } |
885 } |
888 } |
886 } |
889 fList.add(file); |
|
890 } while (filename.length() > 0); |
|
891 if (fList.size() > 0) { |
|
892 selectedFiles = fList.toArray(new File[fList.size()]); |
|
893 } |
887 } |
894 resetGlobFilter(); |
888 fList.add(file); |
895 } else { |
889 } |
896 selectedFile = fs.createFileObject(filename); |
890 |
897 if(!selectedFile.isAbsolute()) { |
891 if (!fList.isEmpty()) { |
898 selectedFile = fs.getChild(dir, filename); |
892 selectedFiles = fList.toArray(new File[fList.size()]); |
|
893 } |
|
894 resetGlobFilter(); |
|
895 } else { |
|
896 selectedFile = fs.createFileObject(filename); |
|
897 if (!selectedFile.isAbsolute()) { |
|
898 selectedFile = fs.getChild(dir, filename); |
|
899 } |
|
900 // check for wildcard pattern |
|
901 FileFilter currentFilter = chooser.getFileFilter(); |
|
902 if (!selectedFile.exists() && isGlobPattern(filename)) { |
|
903 changeDirectory(selectedFile.getParentFile()); |
|
904 if (globFilter == null) { |
|
905 globFilter = new GlobFilter(); |
899 } |
906 } |
900 // check for wildcard pattern |
907 try { |
901 FileFilter currentFilter = chooser.getFileFilter(); |
908 globFilter.setPattern(selectedFile.getName()); |
902 if (!selectedFile.exists() && isGlobPattern(filename)) { |
909 if (!(currentFilter instanceof GlobFilter)) { |
903 changeDirectory(selectedFile.getParentFile()); |
910 actualFileFilter = currentFilter; |
904 if (globFilter == null) { |
|
905 globFilter = new GlobFilter(); |
|
906 } |
911 } |
907 try { |
912 chooser.setFileFilter(null); |
908 globFilter.setPattern(selectedFile.getName()); |
913 chooser.setFileFilter(globFilter); |
909 if (!(currentFilter instanceof GlobFilter)) { |
914 return; |
910 actualFileFilter = currentFilter; |
915 } catch (PatternSyntaxException pse) { |
911 } |
916 // Not a valid glob pattern. Abandon filter. |
912 chooser.setFileFilter(null); |
|
913 chooser.setFileFilter(globFilter); |
|
914 return; |
|
915 } catch (PatternSyntaxException pse) { |
|
916 // Not a valid glob pattern. Abandon filter. |
|
917 } |
|
918 } |
917 } |
919 |
918 } |
920 resetGlobFilter(); |
919 |
921 |
920 resetGlobFilter(); |
922 // Check for directory change action |
921 |
923 boolean isDir = (selectedFile != null && selectedFile.isDirectory()); |
922 // Check for directory change action |
924 boolean isTrav = (selectedFile != null && chooser.isTraversable(selectedFile)); |
923 boolean isDir = (selectedFile != null && selectedFile.isDirectory()); |
925 boolean isDirSelEnabled = chooser.isDirectorySelectionEnabled(); |
924 boolean isTrav = (selectedFile != null && chooser.isTraversable(selectedFile)); |
926 boolean isFileSelEnabled = chooser.isFileSelectionEnabled(); |
925 boolean isDirSelEnabled = chooser.isDirectorySelectionEnabled(); |
927 boolean isCtrl = (e != null && (e.getModifiers() & ActionEvent.CTRL_MASK) != 0); |
926 boolean isFileSelEnabled = chooser.isFileSelectionEnabled(); |
928 |
927 boolean isCtrl = (e != null && (e.getModifiers() & ActionEvent.CTRL_MASK) != 0); |
929 if (isDir && isTrav && (isCtrl || !isDirSelEnabled)) { |
928 |
930 changeDirectory(selectedFile); |
929 if (isDir && isTrav && (isCtrl || !isDirSelEnabled)) { |
931 return; |
930 changeDirectory(selectedFile); |
932 } else if ((isDir || !isFileSelEnabled) |
931 return; |
933 && (!isDir || !isDirSelEnabled) |
932 } else if ((isDir || !isFileSelEnabled) |
934 && (!isDirSelEnabled || selectedFile.exists())) { |
933 && (!isDir || !isDirSelEnabled) |
935 selectedFile = null; |
934 && (!isDirSelEnabled || selectedFile.exists())) { |
936 } |
935 selectedFile = null; |
937 } |
936 } |
938 } |
937 } |
|
938 |
939 if (selectedFiles != null || selectedFile != null) { |
939 if (selectedFiles != null || selectedFile != null) { |
940 if (selectedFiles != null || chooser.isMultiSelectionEnabled()) { |
940 if (selectedFiles != null || chooser.isMultiSelectionEnabled()) { |
941 if (selectedFiles == null) { |
941 if (selectedFiles == null) { |
942 selectedFiles = new File[] { selectedFile }; |
942 selectedFiles = new File[] { selectedFile }; |
943 } |
943 } |