< prev index next >

src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolder2.java

Print this page

        

*** 27,36 **** --- 27,37 ---- import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.File; + import java.io.FileNotFoundException; import java.io.IOException; import java.util.*; import java.util.concurrent.*; import javax.swing.SwingConstants;
*** 231,240 **** --- 232,242 ---- private String folderType = null; private String displayName = null; private Image smallIcon = null; private Image largeIcon = null; private Boolean isDir = null; + private final boolean isLib; /* * The following is to identify the My Documents folder as being special */ private boolean isPersonal;
*** 252,261 **** --- 254,264 ---- */ Win32ShellFolder2(final int csidl) throws IOException, InterruptedException { // Desktop is parent of DRIVES and NETWORK, not necessarily // other special shell folders. super(null, composePathForCsidl(csidl)); + isLib = false; invoke(new Callable<Void>() { public Void call() throws InterruptedException { if (csidl == DESKTOP) { initDesktop();
*** 277,287 **** pIDL = getNextPIDLEntry(pIDL); if (pIDL != 0) { // Now we know that parent isn't immediate to 'this' because it // has a continued ID list. Create a shell folder for this child // pidl and make it the new 'parent'. ! parent = new Win32ShellFolder2((Win32ShellFolder2) parent, childPIDL); } else { // No grandchildren means we have arrived at the parent of 'this', // and childPIDL is directly relative to parent. disposer.relativePIDL = childPIDL; } --- 280,290 ---- pIDL = getNextPIDLEntry(pIDL); if (pIDL != 0) { // Now we know that parent isn't immediate to 'this' because it // has a continued ID list. Create a shell folder for this child // pidl and make it the new 'parent'. ! parent = createShellFolder((Win32ShellFolder2) parent, childPIDL); } else { // No grandchildren means we have arrived at the parent of 'this', // and childPIDL is directly relative to parent. disposer.relativePIDL = childPIDL; }
*** 299,329 **** /** * Create a system shell folder */ ! Win32ShellFolder2(Win32ShellFolder2 parent, long pIShellFolder, long relativePIDL, String path) { super(parent, (path != null) ? path : "ShellFolder: "); this.disposer.pIShellFolder = pIShellFolder; this.disposer.relativePIDL = relativePIDL; sun.java2d.Disposer.addRecord(this, disposer); } /** * Creates a shell folder with a parent and relative PIDL */ ! Win32ShellFolder2(final Win32ShellFolder2 parent, final long relativePIDL) throws InterruptedException { ! super(parent, ! invoke(new Callable<String>() { public String call() { ! return getFileSystemPath(parent.getIShellFolder(), relativePIDL); } - }, RuntimeException.class) - ); - this.disposer.relativePIDL = relativePIDL; - sun.java2d.Disposer.addRecord(this, disposer); } // Initializes the desktop shell folder // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native void initDesktop(); --- 302,336 ---- /** * Create a system shell folder */ ! Win32ShellFolder2(Win32ShellFolder2 parent, long pIShellFolder, long relativePIDL, String path, boolean isLib) { super(parent, (path != null) ? path : "ShellFolder: "); + this.isLib = isLib; this.disposer.pIShellFolder = pIShellFolder; this.disposer.relativePIDL = relativePIDL; sun.java2d.Disposer.addRecord(this, disposer); } /** * Creates a shell folder with a parent and relative PIDL */ ! static Win32ShellFolder2 createShellFolder(Win32ShellFolder2 parent, long pIDL) ! throws InterruptedException { ! String path = invoke(new Callable<String>() { public String call() { ! return getFileSystemPath(parent.getIShellFolder(), pIDL); ! } ! }, RuntimeException.class); ! String libPath = resolveLibrary(path); ! if (libPath == null) { ! return new Win32ShellFolder2(parent, 0, pIDL, path, false); ! } else { ! return new Win32ShellFolder2(parent, 0, pIDL, libPath, true); } } // Initializes the desktop shell folder // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native void initDesktop();
*** 599,622 **** return s; } } String path = getDisplayNameOf(parentIShellFolder, relativePIDL, SHGDN_FORPARSING); // if this is a library its default save location is taken as a path // this is a temp fix until java.io starts support Libraries if( path != null && path.startsWith("::{") && path.toLowerCase().endsWith(".library-ms")) { for (KnownFolderDefinition kf : KnownFolderDefinition.libraries) { ! if( path.toLowerCase().endsWith( ! kf.relativePath.toLowerCase()) && path.toUpperCase().startsWith( ! kf.parsingName.substring(0, 40).toUpperCase()) ) { return kf.saveLocation; } } } ! return path; } // Needs to be accessible to Win32ShellFolderManager2 static String getFileSystemPath(final int csidl) throws IOException, InterruptedException { String path = invoke(new Callable<String>() { --- 606,633 ---- return s; } } String path = getDisplayNameOf(parentIShellFolder, relativePIDL, SHGDN_FORPARSING); + return path; + } + + private static String resolveLibrary(String path) { // if this is a library its default save location is taken as a path // this is a temp fix until java.io starts support Libraries if( path != null && path.startsWith("::{") && path.toLowerCase().endsWith(".library-ms")) { for (KnownFolderDefinition kf : KnownFolderDefinition.libraries) { ! if (path.toLowerCase().endsWith( ! "\\" + kf.relativePath.toLowerCase()) && path.toUpperCase().startsWith( ! kf.parsingName.substring(0, 40).toUpperCase())) { return kf.saveLocation; } } } ! return null; } // Needs to be accessible to Win32ShellFolderManager2 static String getFileSystemPath(final int csidl) throws IOException, InterruptedException { String path = invoke(new Callable<String>() {
*** 748,758 **** if (Win32ShellFolder2.this.equals(desktop) && personal != null && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { childFolder = personal; } else { ! childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL); releasePIDL = false; } list.add(childFolder); } if (releasePIDL) { --- 759,769 ---- if (Win32ShellFolder2.this.equals(desktop) && personal != null && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { childFolder = personal; } else { ! childFolder = createShellFolder(Win32ShellFolder2.this, childPIDL); releasePIDL = false; } list.add(childFolder); } if (releasePIDL) {
*** 788,801 **** long childPIDL; while ((childPIDL = getNextChild(pEnumObjects)) != 0) { if (getAttributes0(pIShellFolder, childPIDL, ATTRIB_FILESYSTEM) != 0) { String path = getFileSystemPath(pIShellFolder, childPIDL); if (path != null && path.equalsIgnoreCase(filePath)) { long childIShellFolder = bindToObject(pIShellFolder, childPIDL); child = new Win32ShellFolder2(Win32ShellFolder2.this, ! childIShellFolder, childPIDL, path); break; } } releasePIDL(childPIDL); } --- 799,813 ---- long childPIDL; while ((childPIDL = getNextChild(pEnumObjects)) != 0) { if (getAttributes0(pIShellFolder, childPIDL, ATTRIB_FILESYSTEM) != 0) { String path = getFileSystemPath(pIShellFolder, childPIDL); + if(isLib) path = resolveLibrary( path ); if (path != null && path.equalsIgnoreCase(filePath)) { long childIShellFolder = bindToObject(pIShellFolder, childPIDL); child = new Win32ShellFolder2(Win32ShellFolder2.this, ! childIShellFolder, childPIDL, path, isLib); break; } } releasePIDL(childPIDL); }
*** 1127,1136 **** --- 1139,1150 ---- private static final int LVCFMT_LEFT = 0; private static final int LVCFMT_RIGHT = 1; private static final int LVCFMT_CENTER = 2; public ShellFolderColumnInfo[] getFolderColumns() { + ShellFolder library = resolveLibrary(); + if (library != null) return library.getFolderColumns(); return invoke(new Callable<ShellFolderColumnInfo[]>() { public ShellFolderColumnInfo[] call() { ShellFolderColumnInfo[] columns = doGetColumnInfo(getIShellFolder()); if (columns != null) {
*** 1157,1173 **** --- 1171,1211 ---- } }); } public Object getFolderColumnValue(final int column) { + if(!isLibrary()) { + ShellFolder library = resolveLibrary(); + if (library != null) return library.getFolderColumnValue(column); + } return invoke(new Callable<Object>() { public Object call() { return doGetColumnValue(getParentIShellFolder(), getRelativePIDL(), column); } }); } + boolean isLibrary() { + return isLib; + } + + private ShellFolder resolveLibrary() { + for (ShellFolder f = this; f != null; f = f.parent) { + if (!f.isFileSystem()) { + if (f instanceof Win32ShellFolder2 && + ((Win32ShellFolder2)f).isLibrary()) { + try { + return getShellFolder(new File(getPath())); + } catch (FileNotFoundException e) { + } + } + break; + } + } + return null; + } + // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native ShellFolderColumnInfo[] doGetColumnInfo(long iShellFolder2); // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details private native Object doGetColumnValue(long parentIShellFolder2, long childPIDL, int columnIdx);
< prev index next >