jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java
changeset 1302 ac8b63707542
parent 1299 027d966d5658
child 1840 984ba55ac827
equal deleted inserted replaced
1301:15e81207e1f2 1302:ac8b63707542
    34 import java.awt.event.*;
    34 import java.awt.event.*;
    35 import java.awt.datatransfer.*;
    35 import java.awt.datatransfer.*;
    36 import java.beans.*;
    36 import java.beans.*;
    37 import java.io.*;
    37 import java.io.*;
    38 import java.util.*;
    38 import java.util.*;
       
    39 import java.util.List;
    39 import java.util.regex.*;
    40 import java.util.regex.*;
    40 import sun.awt.shell.ShellFolder;
    41 import sun.awt.shell.ShellFolder;
    41 import sun.swing.*;
    42 import sun.swing.*;
    42 import sun.swing.SwingUtilities2;
    43 import sun.swing.SwingUtilities2;
    43 
    44 
   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                     }