Merge
This commit is contained in:
commit
687f9dd406
@ -175,7 +175,7 @@ LookupProcessor::LookupProcessor(const LETableReference &baseAddress,
|
|||||||
LEReferenceTo<LangSysTable> langSysTable;
|
LEReferenceTo<LangSysTable> langSysTable;
|
||||||
le_uint16 featureCount = 0;
|
le_uint16 featureCount = 0;
|
||||||
le_uint16 lookupListCount = 0;
|
le_uint16 lookupListCount = 0;
|
||||||
le_uint16 requiredFeatureIndex;
|
le_uint16 requiredFeatureIndex = 0xFFFF;
|
||||||
|
|
||||||
if (LE_FAILURE(success)) {
|
if (LE_FAILURE(success)) {
|
||||||
return;
|
return;
|
||||||
|
@ -851,14 +851,14 @@ final class Win32ShellFolder2 extends ShellFolder {
|
|||||||
return getLinkLocation(true);
|
return getLinkLocation(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ShellFolder getLinkLocation(final boolean resolve) {
|
private Win32ShellFolder2 getLinkLocation(final boolean resolve) {
|
||||||
return invoke(new Callable<ShellFolder>() {
|
return invoke(new Callable<Win32ShellFolder2>() {
|
||||||
public ShellFolder call() {
|
public Win32ShellFolder2 call() {
|
||||||
if (!isLink()) {
|
if (!isLink()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShellFolder location = null;
|
Win32ShellFolder2 location = null;
|
||||||
long linkLocationPIDL = getLinkLocation(getParentIShellFolder(),
|
long linkLocationPIDL = getLinkLocation(getParentIShellFolder(),
|
||||||
getRelativePIDL(), resolve);
|
getRelativePIDL(), resolve);
|
||||||
if (linkLocationPIDL != 0) {
|
if (linkLocationPIDL != 0) {
|
||||||
@ -968,7 +968,7 @@ final class Win32ShellFolder2 extends ShellFolder {
|
|||||||
|
|
||||||
// NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
|
// 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,
|
private static native long extractIcon(long parentIShellFolder, long relativePIDL,
|
||||||
boolean getLargeIcon);
|
boolean getLargeIcon, boolean getDefaultIcon);
|
||||||
|
|
||||||
// Returns an icon from the Windows system icon list in the form of an HICON
|
// 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 getSystemIcon(int iconID);
|
||||||
@ -1019,7 +1019,13 @@ final class Win32ShellFolder2 extends ShellFolder {
|
|||||||
invoke(new Callable<Image>() {
|
invoke(new Callable<Image>() {
|
||||||
public Image call() {
|
public Image call() {
|
||||||
Image newIcon = null;
|
Image newIcon = null;
|
||||||
if (isFileSystem()) {
|
if (isLink()) {
|
||||||
|
Win32ShellFolder2 folder = getLinkLocation(false);
|
||||||
|
if (folder != null && folder.isLibrary()) {
|
||||||
|
return folder.getIcon(getLargeIcon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isFileSystem() || isLibrary()) {
|
||||||
long parentIShellIcon = (parent != null)
|
long parentIShellIcon = (parent != null)
|
||||||
? ((Win32ShellFolder2) parent).getIShellIcon()
|
? ((Win32ShellFolder2) parent).getIShellIcon()
|
||||||
: 0L;
|
: 0L;
|
||||||
@ -1049,7 +1055,19 @@ final class Win32ShellFolder2 extends ShellFolder {
|
|||||||
if (newIcon == null) {
|
if (newIcon == null) {
|
||||||
// These are only cached per object
|
// These are only cached per object
|
||||||
long hIcon = extractIcon(getParentIShellFolder(),
|
long hIcon = extractIcon(getParentIShellFolder(),
|
||||||
getRelativePIDL(), getLargeIcon);
|
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);
|
newIcon = makeIcon(hIcon, getLargeIcon);
|
||||||
disposeIcon(hIcon);
|
disposeIcon(hIcon);
|
||||||
}
|
}
|
||||||
|
@ -868,10 +868,11 @@ JNIEXPORT jint JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconIndex
|
|||||||
/*
|
/*
|
||||||
* Class: sun_awt_shell_Win32ShellFolder2
|
* Class: sun_awt_shell_Win32ShellFolder2
|
||||||
* Method: extractIcon
|
* Method: extractIcon
|
||||||
* Signature: (JJZ)J
|
* Signature: (JJZZ)J
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
|
JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
|
||||||
(JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL, jboolean getLargeIcon)
|
(JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL,
|
||||||
|
jboolean getLargeIcon, jboolean getDefaultIcon)
|
||||||
{
|
{
|
||||||
IShellFolder* pIShellFolder = (IShellFolder*)pIShellFolderL;
|
IShellFolder* pIShellFolder = (IShellFolder*)pIShellFolderL;
|
||||||
LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL;
|
LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL;
|
||||||
@ -889,7 +890,8 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
|
|||||||
WCHAR szBuf[MAX_PATH];
|
WCHAR szBuf[MAX_PATH];
|
||||||
INT index;
|
INT index;
|
||||||
UINT flags;
|
UINT flags;
|
||||||
hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags);
|
UINT uFlags = getDefaultIcon ? GIL_DEFAULTICON : GIL_FORSHELL | GIL_ASYNC;
|
||||||
|
hres = pIcon->GetIconLocation(uFlags, szBuf, MAX_PATH, &index, &flags);
|
||||||
if (SUCCEEDED(hres)) {
|
if (SUCCEEDED(hres)) {
|
||||||
HICON hIconLarge;
|
HICON hIconLarge;
|
||||||
hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32);
|
hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32);
|
||||||
@ -901,6 +903,9 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
|
|||||||
fn_DestroyIcon((HICON)hIconLarge);
|
fn_DestroyIcon((HICON)hIconLarge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (hres == E_PENDING) {
|
||||||
|
pIcon->Release();
|
||||||
|
return E_PENDING;
|
||||||
}
|
}
|
||||||
pIcon->Release();
|
pIcon->Release();
|
||||||
}
|
}
|
||||||
@ -1284,7 +1289,6 @@ JNIEXPORT jint JNICALL
|
|||||||
JNIEXPORT jobjectArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_loadKnownFolders
|
JNIEXPORT jobjectArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_loadKnownFolders
|
||||||
(JNIEnv* env, jclass cls )
|
(JNIEnv* env, jclass cls )
|
||||||
{
|
{
|
||||||
CoInitialize(NULL);
|
|
||||||
IKnownFolderManager* pkfm = NULL;
|
IKnownFolderManager* pkfm = NULL;
|
||||||
HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager, NULL,
|
HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager, NULL,
|
||||||
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pkfm));
|
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pkfm));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user