< prev index next >
src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolder2.java
Print this page
*** 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,
--- 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,
! 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,1025 ****
}
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;
}
--- 1002,1024 ----
}
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;
}
*** 1027,1036 ****
--- 1026,1036 ----
/**
* @return The icon image used to display this shell folder
*/
public Image getIcon(final boolean getLargeIcon) {
Image icon = getLargeIcon ? largeIcon : smallIcon;
+ int size = getLargeIcon ? 32 : 16; // large icon is 32 pixels else 16 pixels
if (icon == null) {
icon =
invoke(new Callable<Image>() {
public Image call() {
Image newIcon = null;
*** 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);
}
}
--- 1056,1066 ----
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;
}
--- 1068,1158 ----
}
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); // pick folder icon
} else {
! return getShell32Icon(1, size); // pick file icon
}
}
}
! newIcon = makeIcon(hIcon, size);
disposeIcon(hIcon);
}
if (newIcon == null) {
newIcon = Win32ShellFolder2.super.getIcon(getLargeIcon);
}
return newIcon;
}
});
! }
! return icon;
! }
!
! 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;
! });
}
/**
* 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, 32);
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 >