< prev index next >
src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolder2.java
Print this page
*** 72,81 ****
--- 72,84 ----
* @author Kenneth Russell
* @since 1.4 */
@SuppressWarnings("serial") // JDK-implementation class
final class Win32ShellFolder2 extends ShellFolder {
+ static final int SMALL_ICON_SIZE = 16;
+ static final int LARGE_ICON_SIZE = 32;
+
private static native void initIDs();
static {
initIDs();
}
*** 975,985 ****
// Return the icon of a file system shell folder in the form of an HICON
private static native long getIcon(String absolutePath, boolean getLargeIcon);
// NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native long extractIcon(long parentIShellFolder, long relativePIDL,
! boolean getLargeIcon, boolean getDefaultIcon);
// Returns an icon from the Windows system icon list in the form of an HICON
private static native long getSystemIcon(int iconID);
private static native long getIconResource(String libName, int iconID,
int cxDesired, int cyDesired,
--- 978,988 ----
// Return the icon of a file system shell folder in the form of an HICON
private static native long getIcon(String absolutePath, boolean getLargeIcon);
// NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native long extractIcon(long parentIShellFolder, long relativePIDL,
! int size, boolean getDefaultIcon);
// Returns an icon from the Windows system icon list in the form of an HICON
private static native long getSystemIcon(int iconID);
private static native long getIconResource(String libName, int iconID,
int cxDesired, int cyDesired,
*** 1002,1035 ****
}
return pIShellIcon;
}
! private static Image makeIcon(long hIcon, boolean getLargeIcon) {
if (hIcon != 0L && hIcon != -1L) {
// Get the bits. This has the side effect of setting the imageHash value for this object.
final int[] iconBits = getIconBits(hIcon);
if (iconBits != null) {
// icons are always square
final int size = (int) Math.sqrt(iconBits.length);
- final int baseSize = getLargeIcon ? 32 : 16;
final BufferedImage img =
new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
img.setRGB(0, 0, size, size, iconBits, 0, size);
! return size == baseSize
? img
! : new MultiResolutionIconImage(baseSize, img);
}
}
return null;
}
/**
* @return The icon image used to display this shell folder
*/
public Image getIcon(final boolean getLargeIcon) {
Image icon = getLargeIcon ? largeIcon : smallIcon;
if (icon == null) {
icon =
invoke(new Callable<Image>() {
public Image call() {
--- 1005,1066 ----
}
return pIShellIcon;
}
! private static Image makeIcon(long hIcon, int bsize) {
if (hIcon != 0L && hIcon != -1L) {
// Get the bits. This has the side effect of setting the imageHash value for this object.
final int[] iconBits = getIconBits(hIcon);
if (iconBits != null) {
// icons are always square
final int size = (int) Math.sqrt(iconBits.length);
final BufferedImage img =
new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
img.setRGB(0, 0, size, size, iconBits, 0, size);
! return size == bsize
? img
! : new MultiResolutionIconImage(bsize, img);
}
}
return null;
}
+ public Image getIcon(int size) {
+ return invoke(() -> {
+ Image newIcon = null;
+ if (isLink()) {
+ Win32ShellFolder2 folder = getLinkLocation(false);
+ if (folder != null && folder.isLibrary()) {
+ return folder.getIcon(size);
+ }
+ }
+ long hIcon = extractIcon(getParentIShellFolder(),
+ getRelativePIDL(), size, false);
+ // E_PENDING: loading can take time so get the default
+ if(hIcon <= 0) {
+ hIcon = extractIcon(getParentIShellFolder(),
+ getRelativePIDL(), size, true);
+ if(hIcon <= 0) {
+ if (isDirectory()) {
+ return getShell32Icon(4, size);
+ } else {
+ return getShell32Icon(1, size);
+ }
+ }
+ }
+ newIcon = makeIcon(hIcon, size);
+ disposeIcon(hIcon);
+ return newIcon;
+ });
+ }
/**
* @return The icon image used to display this shell folder
*/
public Image getIcon(final boolean getLargeIcon) {
+ int size = getLargeIcon ? LARGE_ICON_SIZE : SMALL_ICON_SIZE;
Image icon = getLargeIcon ? largeIcon : smallIcon;
if (icon == null) {
icon =
invoke(new Callable<Image>() {
public Image call() {
*** 1056,1066 ****
imageCache = getLargeIcon ? largeSystemImages : smallSystemImages;
}
newIcon = imageCache.get(Integer.valueOf(index));
if (newIcon == null) {
long hIcon = getIcon(getAbsolutePath(), getLargeIcon);
! newIcon = makeIcon(hIcon, getLargeIcon);
disposeIcon(hIcon);
if (newIcon != null) {
imageCache.put(Integer.valueOf(index), newIcon);
}
}
--- 1087,1097 ----
imageCache = getLargeIcon ? largeSystemImages : smallSystemImages;
}
newIcon = imageCache.get(Integer.valueOf(index));
if (newIcon == null) {
long hIcon = getIcon(getAbsolutePath(), getLargeIcon);
! newIcon = makeIcon(hIcon, size);
disposeIcon(hIcon);
if (newIcon != null) {
imageCache.put(Integer.valueOf(index), newIcon);
}
}
*** 1068,1136 ****
}
if (newIcon == null) {
// These are only cached per object
long hIcon = extractIcon(getParentIShellFolder(),
! getRelativePIDL(), getLargeIcon, false);
// E_PENDING: loading can take time so get the default
if(hIcon <= 0) {
hIcon = extractIcon(getParentIShellFolder(),
! getRelativePIDL(), getLargeIcon, true);
if(hIcon <= 0) {
if (isDirectory()) {
! return getShell32Icon(4, getLargeIcon);
} else {
! return getShell32Icon(1, getLargeIcon);
}
}
}
! newIcon = makeIcon(hIcon, getLargeIcon);
disposeIcon(hIcon);
}
- if (newIcon == null) {
- newIcon = Win32ShellFolder2.super.getIcon(getLargeIcon);
- }
return newIcon;
}
});
- if (getLargeIcon) {
- largeIcon = icon;
- } else {
- smallIcon = icon;
- }
}
return icon;
}
/**
* Gets an icon from the Windows system icon list as an {@code Image}
*/
static Image getSystemIcon(SystemIcon iconType) {
long hIcon = getSystemIcon(iconType.getIconID());
! Image icon = makeIcon(hIcon, true);
disposeIcon(hIcon);
return icon;
}
/**
* Gets an icon from the Windows system icon list as an {@code Image}
*/
! static Image getShell32Icon(int iconID, boolean getLargeIcon) {
boolean useVGAColors = true; // Will be ignored on XP and later
- int size = getLargeIcon ? 32 : 16;
-
Toolkit toolkit = Toolkit.getDefaultToolkit();
String shellIconBPP = (String)toolkit.getDesktopProperty("win.icon.shellIconBPP");
if (shellIconBPP != null) {
useVGAColors = shellIconBPP.equals("4");
}
long hIcon = getIconResource("shell32.dll", iconID, size, size, useVGAColors);
if (hIcon != 0) {
! Image icon = makeIcon(hIcon, getLargeIcon);
disposeIcon(hIcon);
return icon;
}
return null;
}
--- 1099,1157 ----
}
if (newIcon == null) {
// These are only cached per object
long hIcon = extractIcon(getParentIShellFolder(),
! getRelativePIDL(), size, false);
// E_PENDING: loading can take time so get the default
if(hIcon <= 0) {
hIcon = extractIcon(getParentIShellFolder(),
! getRelativePIDL(), size, true);
if(hIcon <= 0) {
if (isDirectory()) {
! return getShell32Icon(4, size);
} else {
! return getShell32Icon(1, size);
}
}
}
! newIcon = makeIcon(hIcon, size);
disposeIcon(hIcon);
}
return newIcon;
}
});
}
return icon;
}
/**
* Gets an icon from the Windows system icon list as an {@code Image}
*/
static Image getSystemIcon(SystemIcon iconType) {
long hIcon = getSystemIcon(iconType.getIconID());
! Image icon = makeIcon(hIcon, LARGE_ICON_SIZE);
disposeIcon(hIcon);
return icon;
}
/**
* Gets an icon from the Windows system icon list as an {@code Image}
*/
! static Image getShell32Icon(int iconID, int size) {
boolean useVGAColors = true; // Will be ignored on XP and later
Toolkit toolkit = Toolkit.getDefaultToolkit();
String shellIconBPP = (String)toolkit.getDesktopProperty("win.icon.shellIconBPP");
if (shellIconBPP != null) {
useVGAColors = shellIconBPP.equals("4");
}
long hIcon = getIconResource("shell32.dll", iconID, size, size, useVGAColors);
if (hIcon != 0) {
! Image icon = makeIcon(hIcon, size);
disposeIcon(hIcon);
return icon;
}
return null;
}
< prev index next >