diff options
author | Grant Gayed <ggayed> | 2004-03-09 21:01:02 +0000 |
---|---|---|
committer | Grant Gayed <ggayed> | 2004-03-09 21:01:02 +0000 |
commit | dbde2228e63fb05578eaf7a21923c40565ca6db2 (patch) | |
tree | d63cd69ad9c8229666bf021e7c42d8a01aaf55a1 | |
parent | ad4a0cf5741d6d1ebd3aa7aa442fce51f0f137a4 (diff) | |
download | eclipse.platform.swt-dbde2228e63fb05578eaf7a21923c40565ca6db2.tar.gz eclipse.platform.swt-dbde2228e63fb05578eaf7a21923c40565ca6db2.tar.xz eclipse.platform.swt-dbde2228e63fb05578eaf7a21923c40565ca6db2.zip |
TrayIcon initial
10 files changed, 865 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os.c b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os.c index 6c58c698b5..7e290b0c3b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os.c @@ -7061,6 +7061,36 @@ JNIEXPORT jboolean JNICALL OS_NATIVE(ShellExecuteExW) } #endif +#ifndef NO_Shell_1NotifyIconA +JNIEXPORT jboolean JNICALL OS_NATIVE(Shell_1NotifyIconA) + (JNIEnv *env, jclass that, jint arg0, jobject arg1) +{ + NOTIFYICONDATAA _arg1, *lparg1=NULL; + jboolean rc; + NATIVE_ENTER(env, that, "Shell_1NotifyIconA\n") + if (arg1) lparg1 = getNOTIFYICONDATAAFields(env, arg1, &_arg1); + rc = (jboolean)Shell_NotifyIconA(arg0, lparg1); + if (arg1) setNOTIFYICONDATAAFields(env, arg1, lparg1); + NATIVE_EXIT(env, that, "Shell_1NotifyIconA\n") + return rc; +} +#endif + +#ifndef NO_Shell_1NotifyIconW +JNIEXPORT jboolean JNICALL OS_NATIVE(Shell_1NotifyIconW) + (JNIEnv *env, jclass that, jint arg0, jobject arg1) +{ + NOTIFYICONDATAW _arg1, *lparg1=NULL; + jboolean rc; + NATIVE_ENTER(env, that, "Shell_1NotifyIconW\n") + if (arg1) lparg1 = getNOTIFYICONDATAWFields(env, arg1, &_arg1); + rc = (jboolean)Shell_NotifyIconW(arg0, lparg1); + if (arg1) setNOTIFYICONDATAWFields(env, arg1, lparg1); + NATIVE_EXIT(env, that, "Shell_1NotifyIconW\n") + return rc; +} +#endif + #ifndef NO_ShowCaret JNIEXPORT jboolean JNICALL OS_NATIVE(ShowCaret) (JNIEnv *env, jclass that, jint arg0) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_custom.c b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_custom.c index 0e23284ea2..3fae7e1824 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_custom.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_custom.c @@ -77,6 +77,18 @@ JNIEXPORT jboolean JNICALL OS_NATIVE(IsSP) } #endif +#ifndef NO_NOTIFYICONDATA_1sizeof +JNIEXPORT jint JNICALL OS_NATIVE(NOTIFYICONDATA_1sizeof) + (JNIEnv *env, jclass that) +{ + jint rc; + NATIVE_ENTER(env, that, "NOTIFYICONDATA_1sizeof\n") + rc = (jint)sizeof(NOTIFYICONDATA); + NATIVE_EXIT(env, that, "NOTIFYICONDATA_1sizeof\n") + return rc; +} +#endif + #ifndef NO_SendMessageW__II_3I_3I JNIEXPORT jint JNICALL OS_NATIVE(SendMessageW__II_3I_3I) (JNIEnv *env, jclass that, jint arg0, jint arg1, jintArray arg2, jintArray arg3) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.c b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.c index 434108be95..1ffe7108f0 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.c @@ -2798,6 +2798,216 @@ void setNONCLIENTMETRICSWFields(JNIEnv *env, jobject lpObject, NONCLIENTMETRICSW } #endif +#ifndef NO_NOTIFYICONDATA +typedef struct NOTIFYICONDATA_FID_CACHE { + int cached; + jclass clazz; + jfieldID cbSize, hWnd, uID, uFlags, uCallbackMessage, hIcon, dwState, dwStateMask, uVersion, dwInfoFlags; +} NOTIFYICONDATA_FID_CACHE; + +NOTIFYICONDATA_FID_CACHE NOTIFYICONDATAFc; + +void cacheNOTIFYICONDATAFields(JNIEnv *env, jobject lpObject) +{ + if (NOTIFYICONDATAFc.cached) return; + NOTIFYICONDATAFc.clazz = (*env)->GetObjectClass(env, lpObject); + NOTIFYICONDATAFc.cbSize = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "cbSize", "I"); + NOTIFYICONDATAFc.hWnd = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "hWnd", "I"); + NOTIFYICONDATAFc.uID = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "uID", "I"); + NOTIFYICONDATAFc.uFlags = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "uFlags", "I"); + NOTIFYICONDATAFc.uCallbackMessage = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "uCallbackMessage", "I"); + NOTIFYICONDATAFc.hIcon = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "hIcon", "I"); + NOTIFYICONDATAFc.dwState = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "dwState", "I"); + NOTIFYICONDATAFc.dwStateMask = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "dwStateMask", "I"); + NOTIFYICONDATAFc.uVersion = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "uVersion", "I"); + NOTIFYICONDATAFc.dwInfoFlags = (*env)->GetFieldID(env, NOTIFYICONDATAFc.clazz, "dwInfoFlags", "I"); + NOTIFYICONDATAFc.cached = 1; +} + +NOTIFYICONDATA *getNOTIFYICONDATAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATA *lpStruct) +{ + if (!NOTIFYICONDATAFc.cached) cacheNOTIFYICONDATAFields(env, lpObject); + lpStruct->cbSize = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.cbSize); + lpStruct->hWnd = (HWND)(*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.hWnd); + lpStruct->uID = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uID); + lpStruct->uFlags = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uFlags); + lpStruct->uCallbackMessage = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uCallbackMessage); + lpStruct->hIcon = (HICON)(*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.hIcon); + lpStruct->dwState = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwState); + lpStruct->dwStateMask = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwStateMask); + lpStruct->uVersion = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uVersion); + lpStruct->dwInfoFlags = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwInfoFlags); + return lpStruct; +} + +void setNOTIFYICONDATAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATA *lpStruct) +{ + if (!NOTIFYICONDATAFc.cached) cacheNOTIFYICONDATAFields(env, lpObject); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.cbSize, (jint)lpStruct->cbSize); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.hWnd, (jint)lpStruct->hWnd); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uID, (jint)lpStruct->uID); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uFlags, (jint)lpStruct->uFlags); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uCallbackMessage, (jint)lpStruct->uCallbackMessage); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.hIcon, (jint)lpStruct->hIcon); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwState, (jint)lpStruct->dwState); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwStateMask, (jint)lpStruct->dwStateMask); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uVersion, (jint)lpStruct->uVersion); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwInfoFlags, (jint)lpStruct->dwInfoFlags); +} +#endif + +#ifndef NO_NOTIFYICONDATAA +typedef struct NOTIFYICONDATAA_FID_CACHE { + int cached; + jclass clazz; + jfieldID szTip, szInfo, szInfoTitle; +} NOTIFYICONDATAA_FID_CACHE; + +NOTIFYICONDATAA_FID_CACHE NOTIFYICONDATAAFc; + +void cacheNOTIFYICONDATAAFields(JNIEnv *env, jobject lpObject) +{ + if (NOTIFYICONDATAAFc.cached) return; + cacheNOTIFYICONDATAFields(env, lpObject); + NOTIFYICONDATAAFc.clazz = (*env)->GetObjectClass(env, lpObject); + NOTIFYICONDATAAFc.szTip = (*env)->GetFieldID(env, NOTIFYICONDATAAFc.clazz, "szTip", "[B"); + NOTIFYICONDATAAFc.szInfo = (*env)->GetFieldID(env, NOTIFYICONDATAAFc.clazz, "szInfo", "[B"); + NOTIFYICONDATAAFc.szInfoTitle = (*env)->GetFieldID(env, NOTIFYICONDATAAFc.clazz, "szInfoTitle", "[B"); + NOTIFYICONDATAAFc.cached = 1; +} + +NOTIFYICONDATAA *getNOTIFYICONDATAAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATAA *lpStruct) +{ + if (!NOTIFYICONDATAAFc.cached) cacheNOTIFYICONDATAAFields(env, lpObject); + lpStruct->cbSize = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.cbSize); + lpStruct->hWnd = (HWND)(*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.hWnd); + lpStruct->uID = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uID); + lpStruct->uFlags = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uFlags); + lpStruct->uCallbackMessage = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uCallbackMessage); + lpStruct->hIcon = (HICON)(*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.hIcon); + lpStruct->dwState = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwState); + lpStruct->dwStateMask = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwStateMask); + lpStruct->uVersion = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uVersion); + lpStruct->dwInfoFlags = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwInfoFlags); + { + jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAAFc.szTip); + (*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szTip), (void *)lpStruct->szTip); + } + { + jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAAFc.szInfo); + (*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szInfo), (void *)lpStruct->szInfo); + } + { + jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAAFc.szInfoTitle); + (*env)->GetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szInfoTitle), (void *)lpStruct->szInfoTitle); + } + return lpStruct; +} + +void setNOTIFYICONDATAAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATAA *lpStruct) +{ + if (!NOTIFYICONDATAAFc.cached) cacheNOTIFYICONDATAAFields(env, lpObject); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.cbSize, (jint)lpStruct->cbSize); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.hWnd, (jint)lpStruct->hWnd); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uID, (jint)lpStruct->uID); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uFlags, (jint)lpStruct->uFlags); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uCallbackMessage, (jint)lpStruct->uCallbackMessage); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.hIcon, (jint)lpStruct->hIcon); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwState, (jint)lpStruct->dwState); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwStateMask, (jint)lpStruct->dwStateMask); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uVersion, (jint)lpStruct->uVersion); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwInfoFlags, (jint)lpStruct->dwInfoFlags); + { + jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAAFc.szTip); + (*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szTip), (void *)lpStruct->szTip); + } + { + jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAAFc.szInfo); + (*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szInfo), (void *)lpStruct->szInfo); + } + { + jbyteArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAAFc.szInfoTitle); + (*env)->SetByteArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szInfoTitle), (void *)lpStruct->szInfoTitle); + } +} +#endif + +#ifndef NO_NOTIFYICONDATAW +typedef struct NOTIFYICONDATAW_FID_CACHE { + int cached; + jclass clazz; + jfieldID szTip, szInfo, szInfoTitle; +} NOTIFYICONDATAW_FID_CACHE; + +NOTIFYICONDATAW_FID_CACHE NOTIFYICONDATAWFc; + +void cacheNOTIFYICONDATAWFields(JNIEnv *env, jobject lpObject) +{ + if (NOTIFYICONDATAWFc.cached) return; + cacheNOTIFYICONDATAFields(env, lpObject); + NOTIFYICONDATAWFc.clazz = (*env)->GetObjectClass(env, lpObject); + NOTIFYICONDATAWFc.szTip = (*env)->GetFieldID(env, NOTIFYICONDATAWFc.clazz, "szTip", "[C"); + NOTIFYICONDATAWFc.szInfo = (*env)->GetFieldID(env, NOTIFYICONDATAWFc.clazz, "szInfo", "[C"); + NOTIFYICONDATAWFc.szInfoTitle = (*env)->GetFieldID(env, NOTIFYICONDATAWFc.clazz, "szInfoTitle", "[C"); + NOTIFYICONDATAWFc.cached = 1; +} + +NOTIFYICONDATAW *getNOTIFYICONDATAWFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATAW *lpStruct) +{ + if (!NOTIFYICONDATAWFc.cached) cacheNOTIFYICONDATAWFields(env, lpObject); + lpStruct->cbSize = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.cbSize); + lpStruct->hWnd = (HWND)(*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.hWnd); + lpStruct->uID = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uID); + lpStruct->uFlags = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uFlags); + lpStruct->uCallbackMessage = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uCallbackMessage); + lpStruct->hIcon = (HICON)(*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.hIcon); + lpStruct->dwState = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwState); + lpStruct->dwStateMask = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwStateMask); + lpStruct->uVersion = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.uVersion); + lpStruct->dwInfoFlags = (*env)->GetIntField(env, lpObject, NOTIFYICONDATAFc.dwInfoFlags); + { + jcharArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAWFc.szTip); + (*env)->GetCharArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szTip) / 2, (void *)lpStruct->szTip); + } + { + jcharArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAWFc.szInfo); + (*env)->GetCharArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szInfo) / 2, (void *)lpStruct->szInfo); + } + { + jcharArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAWFc.szInfoTitle); + (*env)->GetCharArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szInfoTitle) / 2, (void *)lpStruct->szInfoTitle); + } + return lpStruct; +} + +void setNOTIFYICONDATAWFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATAW *lpStruct) +{ + if (!NOTIFYICONDATAWFc.cached) cacheNOTIFYICONDATAWFields(env, lpObject); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.cbSize, (jint)lpStruct->cbSize); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.hWnd, (jint)lpStruct->hWnd); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uID, (jint)lpStruct->uID); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uFlags, (jint)lpStruct->uFlags); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uCallbackMessage, (jint)lpStruct->uCallbackMessage); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.hIcon, (jint)lpStruct->hIcon); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwState, (jint)lpStruct->dwState); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwStateMask, (jint)lpStruct->dwStateMask); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.uVersion, (jint)lpStruct->uVersion); + (*env)->SetIntField(env, lpObject, NOTIFYICONDATAFc.dwInfoFlags, (jint)lpStruct->dwInfoFlags); + { + jcharArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAWFc.szTip); + (*env)->SetCharArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szTip) / 2, (void *)lpStruct->szTip); + } + { + jcharArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAWFc.szInfo); + (*env)->SetCharArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szInfo) / 2, (void *)lpStruct->szInfo); + } + { + jcharArray lpObject1 = (*env)->GetObjectField(env, lpObject, NOTIFYICONDATAWFc.szInfoTitle); + (*env)->SetCharArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szInfoTitle) / 2, (void *)lpStruct->szInfoTitle); + } +} +#endif + #ifndef NO_OPENFILENAME typedef struct OPENFILENAME_FID_CACHE { int cached; diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.h b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.h index fc04cb55d2..6fc7f2d238 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.h +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.h @@ -531,6 +531,36 @@ void setNONCLIENTMETRICSWFields(JNIEnv *env, jobject lpObject, NONCLIENTMETRICSW #define NONCLIENTMETRICSW_sizeof() 0 #endif +#ifndef NO_NOTIFYICONDATA +NOTIFYICONDATA *getNOTIFYICONDATAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATA *lpStruct); +void setNOTIFYICONDATAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATA *lpStruct); +#define NOTIFYICONDATA_sizeof() sizeof(NOTIFYICONDATA) +#else +#define getNOTIFYICONDATAFields(a,b,c) NULL +#define setNOTIFYICONDATAFields(a,b,c) +#define NOTIFYICONDATA_sizeof() 0 +#endif + +#ifndef NO_NOTIFYICONDATAA +NOTIFYICONDATAA *getNOTIFYICONDATAAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATAA *lpStruct); +void setNOTIFYICONDATAAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATAA *lpStruct); +#define NOTIFYICONDATAA_sizeof() sizeof(NOTIFYICONDATAA) +#else +#define getNOTIFYICONDATAAFields(a,b,c) NULL +#define setNOTIFYICONDATAAFields(a,b,c) +#define NOTIFYICONDATAA_sizeof() 0 +#endif + +#ifndef NO_NOTIFYICONDATAW +NOTIFYICONDATAW *getNOTIFYICONDATAWFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATAW *lpStruct); +void setNOTIFYICONDATAWFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATAW *lpStruct); +#define NOTIFYICONDATAW_sizeof() sizeof(NOTIFYICONDATAW) +#else +#define getNOTIFYICONDATAWFields(a,b,c) NULL +#define setNOTIFYICONDATAWFields(a,b,c) +#define NOTIFYICONDATAW_sizeof() 0 +#endif + #ifndef NO_OPENFILENAME OPENFILENAME *getOPENFILENAMEFields(JNIEnv *env, jobject lpObject, OPENFILENAME *lpStruct); void setOPENFILENAMEFields(JNIEnv *env, jobject lpObject, OPENFILENAME *lpStruct); diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATA.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATA.java new file mode 100644 index 0000000000..552da775b1 --- /dev/null +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATA.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.internal.win32; + +public abstract class NOTIFYICONDATA { + static { + /* Get the Shell32.DLL version */ + DLLVERSIONINFO dvi = new DLLVERSIONINFO (); + dvi.cbSize = DLLVERSIONINFO.sizeof; + dvi.dwMajorVersion = 4; + TCHAR lpLibFileName = new TCHAR (0, "Shell32.dll", true); //$NON-NLS-1$ + int hModule = OS.LoadLibrary (lpLibFileName); + if (hModule != 0) { + String name = "DllGetVersion\0"; //$NON-NLS-1$ + byte [] lpProcName = new byte [name.length ()]; + for (int i=0; i<lpProcName.length; i++) { + lpProcName [i] = (byte) name.charAt (i); + } + int DllGetVersion = OS.GetProcAddress (hModule, lpProcName); + if (DllGetVersion != 0) OS.Call (DllGetVersion, dvi); + OS.FreeLibrary (hModule); + } + if (dvi.dwMajorVersion < 5) { + sizeof = OS.NOTIFYICONDATA_V1_SIZE; + } else if (dvi.dwMajorVersion == 5) { + sizeof = OS.NOTIFYICONDATA_V2_SIZE; + } else { + sizeof = OS.NOTIFYICONDATA_sizeof (); + } + } + + public int cbSize; + public int hWnd; + public int uID; + public int uFlags; + public int uCallbackMessage; + public int hIcon; + public int dwState; + public int dwStateMask; + public int uVersion; + public int dwInfoFlags; + public static final int sizeof; +}
\ No newline at end of file diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAA.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAA.java new file mode 100644 index 0000000000..863b85b6d5 --- /dev/null +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAA.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.internal.win32; + +public class NOTIFYICONDATAA extends NOTIFYICONDATA { + public byte szTip[] = new byte [128]; // TCHAR szTip + public byte szInfo[] = new byte [512]; // TCHAR szInfo + public byte szInfoTitle[] = new byte [128]; // TCHAR szInfoTitle +// public static final int sizeof = 504; +} diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAW.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAW.java new file mode 100644 index 0000000000..20ef3f4917 --- /dev/null +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAW.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.internal.win32; + +public class NOTIFYICONDATAW extends NOTIFYICONDATA { + public char szTip[] = new char [128]; // TCHAR szTip + public char szInfo[] = new char [512]; // TCHAR szInfo + public char szInfoTitle[] = new char [128]; // TCHAR szInfoTitle +// public static final int sizeof = 952; +} diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java index 24002ea454..906dd81783 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java @@ -671,12 +671,27 @@ public class OS { public static final int MONITOR_DEFAULTTONEAREST = 0x2; public static final int MONITORINFOF_PRIMARY = 0x1; public static final int MWMO_INPUTAVAILABLE = 0x4; + public static final int NIF_ICON = 0x00000002; + public static final int NIF_INFO = 0x00000010; + public static final int NIF_MESSAGE = 0x00000001; + public static final int NIF_STATE = 0x00000008; + public static final int NIF_TIP = 0x00000004; + public static final int NIIF_ERROR = 0x00000003; + public static final int NIIF_INFO = 0x00000001; + public static final int NIIF_NONE = 0x00000000; + public static final int NIIF_WARNING = 0x00000002; + public static final int NIM_ADD = 0x00000000; + public static final int NIM_DELETE = 0x00000002; + public static final int NIM_MODIFY = 0x00000001; + public static final int NIS_HIDDEN = 0x00000001; public static final int NM_FIRST = 0x0; public static final int NM_CLICK = 0xfffffffe; public static final int NM_CUSTOMDRAW = NM_FIRST - 12; public static final int NM_DBLCLK = 0xfffffffd; public static final int NM_RECOGNIZEGESTURE = NM_FIRST - 16; public static final int NM_RETURN = 0xfffffffc; + public static final int NOTIFYICONDATA_V1_SIZE = 88; + public static final int NOTIFYICONDATA_V2_SIZE = 488; public static final int NOTSRCCOPY = 0x330008; public static final int NULLREGION = 0x1; public static final int NULL_BRUSH = 0x5; @@ -1958,6 +1973,11 @@ public static final boolean ShellExecuteEx (SHELLEXECUTEINFO lpExecInfo) { return ShellExecuteExA (lpExecInfo); } +public static final boolean Shell_NotifyIcon (int dwMessage, NOTIFYICONDATA lpData) { + if (IsUnicode) return Shell_NotifyIconW (dwMessage, (NOTIFYICONDATAW)lpData); + return Shell_NotifyIconA (dwMessage, (NOTIFYICONDATAA)lpData); +} + public static final boolean SHGetPathFromIDList (int pidl, TCHAR pszPath) { if (IsUnicode) { char [] pszPath1 = pszPath == null ? null : pszPath.chars; @@ -2372,6 +2392,7 @@ public static final native boolean MoveToEx (int hdc,int x1, int x2, int lPoint) public static final native int MsgWaitForMultipleObjectsEx (int nCount, int pHandles, int dwMilliseconds, int dwWakeMask, int dwFlags); public static final native int MultiByteToWideChar (int CodePage, int dwFlags, byte [] lpMultiByteStr, int cchMultiByte, char [] lpWideCharStr, int cchWideChar); public static final native int MultiByteToWideChar (int CodePage, int dwFlags, int lpMultiByteStr, int cchMultiByte, char [] lpWideCharStr, int cchWideChar); +public static final native int NOTIFYICONDATA_sizeof (); public static final native int OffsetRgn (int hrgn, int nXOffset, int nYOffset); public static final native int OleInitialize (int pvReserved); public static final native void OleUninitialize (); @@ -2501,6 +2522,8 @@ public static final native void SHSendBackToFocusWindow (int uMsg, int wp, int l public static final native boolean SHSipPreference (int hwnd, int st); public static final native boolean ShellExecuteExW (SHELLEXECUTEINFO lpExecInfo); public static final native boolean ShellExecuteExA (SHELLEXECUTEINFO lpExecInfo); +public static final native boolean Shell_NotifyIconA (int dwMessage, NOTIFYICONDATAA lpData); +public static final native boolean Shell_NotifyIconW (int dwMessage, NOTIFYICONDATAW lpData); public static final native int SHGetMalloc (int [] ppMalloc); public static final native boolean SHGetPathFromIDListW (int pidl, char [] pszPath); public static final native boolean SHGetPathFromIDListA (int pidl, byte [] pszPath); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java index 65fc9fc735..d90ad56c35 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java @@ -134,6 +134,10 @@ public class Display extends Device { /* Display Shutdown */ Runnable [] disposeList; + /* TrayIcons */ + TrayIcon [] trayIcons; + int nextTrayId = 0; + /* Timers */ int timerCount; int [] timerIds; @@ -266,6 +270,7 @@ public class Display extends Device { static final int SWT_KEYMSG = OS.WM_APP + 2; static final int SWT_DESTROY = OS.WM_APP + 3; static final int SWT_RESIZE = OS.WM_APP + 4; + static final int SWT_TRAYICONMSG = OS.WM_APP + 5; /* Package Name */ static final String PACKAGE_PREFIX = "org.eclipse.swt.widgets."; @@ -467,6 +472,26 @@ void addPopup (Menu menu) { popups [index] = menu; } +void addTrayIcon (TrayIcon icon) { + if (trayIcons == null) trayIcons = new TrayIcon [4]; + int length = trayIcons.length; + for (int i = 0; i < length; i++) { + if (trayIcons [i] == icon) return; + } + int index = 0; + while (index < length) { + if (trayIcons [index] == null) break; + index++; + } + if (index == length) { + TrayIcon [] newTrayIcons = new TrayIcon [length + 4]; + System.arraycopy (trayIcons, 0, newTrayIcons, 0, length); + trayIcons = newTrayIcons; + } + trayIcons [index] = icon; + icon.id = nextTrayId++; +} + /** * Causes the <code>run()</code> method of the runnable to * be invoked by the user-interface thread at the next @@ -1532,6 +1557,26 @@ public Thread getThread () { return thread; } +TrayIcon getTrayIcon (int id) { + if (trayIcons == null) return null; + for (int i = 0; i < trayIcons.length; i++) { + TrayIcon current = trayIcons [i]; + if (current != null && current.id == id) return current; + } + return null; +} + +/** + * Returns an array of tray icons that are active on the display. + * + * @return the array of tray icons + * + * @since 3.0 + */ +public TrayIcon [] getTrayIcons () { + return trayIcons; +} + /** * Invokes platform specific functionality to allocate a new GC handle. * <p> @@ -1932,6 +1977,28 @@ int messageProc (int hwnd, int msg, int wParam, int lParam) { case OS.WM_TIMER: runTimer (wParam); break; + case SWT_TRAYICONMSG: + TrayIcon trayIcon = getTrayIcon (wParam); + if (trayIcon == null) return 0; + switch (lParam) { + case OS.WM_LBUTTONDOWN: + trayIcon.WM_LBUTTONDOWN (wParam, lParam); + break; + case OS.WM_LBUTTONDBLCLK: + trayIcon.WM_LBUTTONDBLCLK (wParam, lParam); + break; + case OS.WM_RBUTTONDOWN: + trayIcon.WM_RBUTTONDOWN (wParam, lParam); + break; + case OS.WM_RBUTTONDBLCLK: + trayIcon.WM_RBUTTONDBLCLK (wParam, lParam); + break; + case OS.WM_CONTEXTMENU: + // TODO why isn't this ever invoked? + trayIcon.WM_CONTEXTMENU (wParam, lParam); + break; + } + break; } return OS.DefWindowProc (hwnd, msg, wParam, lParam); } @@ -2095,6 +2162,13 @@ protected void release () { Shell shell = shells [i]; if (!shell.isDisposed ()) shell.dispose (); } + /* Release the tray icons*/ + if (trayIcons != null) { + for (int i = 0; i < trayIcons.length; i++) { + if (trayIcons [i] != null) trayIcons [i].dispose (); + } + } + trayIcons = null; while (readAndDispatch ()) {} if (disposeList != null) { for (int i=0; i<disposeList.length; i++) { @@ -2340,6 +2414,16 @@ void removePopup (Menu menu) { } } +void removeTrayIcon (TrayIcon icon) { + if (trayIcons == null) return; + for (int i = 0; i < trayIcons.length; i++) { + if (trayIcons [i] == icon) { + trayIcons [i] = null; + return; + } + } +} + boolean runAsyncMessages () { return synchronizer.runAsyncMessages (); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TrayIcon.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TrayIcon.java new file mode 100644 index 0000000000..893651f676 --- /dev/null +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TrayIcon.java @@ -0,0 +1,389 @@ +package org.eclipse.swt.widgets; + +import org.eclipse.swt.*; +import org.eclipse.swt.events.*; +import org.eclipse.swt.graphics.*; +import org.eclipse.swt.internal.win32.*; + +/** + * Instances of this class represent icons that can be placed on the + * platform's system tray or task bar status area. + * + * <dt><b>Events:</b></dt> + * <dd>Selection, DefaultSelection</dd> + * </dl> + * <p> + * IMPORTANT: This class is <em>not</em> intended to be subclassed. + * </p> + */ +public class TrayIcon extends Widget { + int id; + boolean isVisible = false; + Image iconImage; + Image image; + Menu menu; + String toolTipText; + +/** + * Constructs a new instance of this class given its Display. + * + * @param display the parent display + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the display is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> + * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li> + * </ul> + */ +public TrayIcon (Display display) { + if (display == null) error (SWT.ERROR_NULL_ARGUMENT); + if (!display.isValidThread ()) { + error (SWT.ERROR_THREAD_INVALID_ACCESS); + } + this.display = display; + display.addTrayIcon (this); + createWidget (); +} + +/** + * Adds the listener to the collection of listeners who will + * be notified when the receiver is selected, by sending + * it one of the messages defined in the <code>SelectionListener</code> + * interface. + * <p> + * <code>widgetSelected</code> is called when the receiver is selected + * <code>widgetDefaultSelected</code> is called when the receiver is double-clicked + * </p> + * + * @param listener the listener which should be notified + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + * + * @see SelectionListener + * @see #removeSelectionListener + * @see SelectionEvent + */ +public void addSelectionListener(SelectionListener listener) { + checkWidget (); + if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); + TypedListener typedListener = new TypedListener (listener); + addListener (SWT.Selection,typedListener); + addListener (SWT.DefaultSelection,typedListener); +} + +void createWidget () { + NOTIFYICONDATA iconData = OS.IsUnicode ? (NOTIFYICONDATA) + new NOTIFYICONDATAW () : + new NOTIFYICONDATAA (); + iconData.cbSize = NOTIFYICONDATA.sizeof; + iconData.uID = id; + iconData.hWnd = display.hwndMessage; + iconData.uFlags = OS.NIF_MESSAGE; + iconData.uCallbackMessage = Display.SWT_TRAYICONMSG; + OS.Shell_NotifyIcon (OS.NIM_ADD, iconData); +} + +void destroyWidget () { + NOTIFYICONDATA iconData = OS.IsUnicode ? (NOTIFYICONDATA) + new NOTIFYICONDATAW () : + new NOTIFYICONDATAA (); + iconData.cbSize = NOTIFYICONDATA.sizeof; + iconData.uID = id; + iconData.hWnd = display.hwndMessage; + OS.Shell_NotifyIcon (OS.NIM_DELETE, iconData); + display.removeTrayIcon (this); + super.destroyWidget (); +} + +/** + * Returns the receiver's image, or null if the image has not been set. + * + * @return the receiver's image + * + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public Image getImage () { + checkWidget (); + return image; +} + +/** + * Returns the receiver's context menu, or null if the menu has not been set. + * + * @return the receiver's context menu + * + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public Menu getMenu () { + checkWidget (); + return menu; +} + +/** + * Returns the receiver's tool tip text, or null if it has + * not been set. + * + * @return the receiver's tool tip text + * + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public String getToolTipText (String value) { + checkWidget (); + return toolTipText; +} + +/** + * Returns <code>true</code> if the receiver is visible and + * <code>false</code> otherwise. + * + * @return the receiver's visibility + * + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public boolean isVisible () { + checkWidget (); + return isVisible; +} + +void releaseWidget () { + super.releaseWidget (); + if (iconImage != null) { + iconImage.dispose (); + iconImage = null; + } + image = null; + toolTipText = null; + menu = null; +} + +/** + * Removes the listener from the collection of listeners who will + * be notified when the receiver is selected. + * + * @param listener the listener which should no longer be notified + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + * + * @see SelectionListener + * @see #addSelectionListener + */ +public void removeSelectionListener(SelectionListener listener) { + checkWidget (); + if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); + if (eventTable == null) return; + eventTable.unhook (SWT.Selection, listener); + eventTable.unhook (SWT.DefaultSelection,listener); +} + +/** + * Sets the receiver's image. + * + * @param image the new image + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public void setImage (Image image) { + checkWidget (); + if (image != null && image.isDisposed ()) error (SWT.ERROR_INVALID_ARGUMENT); + this.image = image; + if (iconImage != null) iconImage.dispose (); + iconImage = null; + int hIcon = 0; + Image icon = image; + if (icon != null) { + switch (icon.type) { + case SWT.BITMAP: + ImageData data = icon.getImageData (); + ImageData mask = data.getTransparencyMask (); + iconImage = new Image (display, data, mask); + hIcon = iconImage.handle; + break; + case SWT.ICON: + hIcon = icon.handle; + break; + } + } + NOTIFYICONDATA iconData = OS.IsUnicode ? (NOTIFYICONDATA) + new NOTIFYICONDATAW () : + new NOTIFYICONDATAA (); + iconData.cbSize = NOTIFYICONDATA.sizeof; + iconData.uID = id; + iconData.hIcon = hIcon; + iconData.hWnd = display.hwndMessage; + iconData.uFlags = OS.NIF_ICON; + OS.Shell_NotifyIcon (OS.NIM_MODIFY, iconData); +} + +/** + * Sets the receiver's context menu. This argument may be null to indicate + * that the receiver should have no context menu. + * + * @param menu the new menu, or null + * + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public void setMenu (Menu menu) { + checkWidget (); + if (menu != null && menu.isDisposed ()) error (SWT.ERROR_INVALID_ARGUMENT); + this.menu = menu; +} + +/** + * Sets the receiver's tool tip text to the argument, which + * may be null indicating that no tool tip text should be shown. + * + * @param string the new tool tip text (or null) + * + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public void setToolTipText (String value) { + checkWidget (); + toolTipText = value; + NOTIFYICONDATA iconData = OS.IsUnicode ? (NOTIFYICONDATA) + new NOTIFYICONDATAW () : + new NOTIFYICONDATAA (); + TCHAR buffer = new TCHAR (0, toolTipText == null ? "" : toolTipText, true); + if (OS.IsUnicode) { + int length = Math.min (((NOTIFYICONDATAW) iconData).szTip.length - 1, buffer.length ()); + char [] szTip = ((NOTIFYICONDATAW) iconData).szTip; + for (int i = length; i < szTip.length; i++) szTip [i] = 0; + System.arraycopy (buffer.toString ().toCharArray (), 0, szTip, 0, length); + } else { + int length = Math.min (((NOTIFYICONDATAA) iconData).szTip.length - 1, buffer.length ()); + byte [] szTip = ((NOTIFYICONDATAA) iconData).szTip; + for (int i = length; i < szTip.length; i++) szTip [i] = 0; + System.arraycopy (buffer.toString ().getBytes (), 0, szTip, 0, length); + } + iconData.cbSize = NOTIFYICONDATA.sizeof; + iconData.uID = id; + iconData.hWnd = display.hwndMessage; + iconData.uFlags = OS.NIF_TIP; + OS.Shell_NotifyIcon (OS.NIM_MODIFY, iconData); +} + +/** + * Makes the receiver visible if the argument is <code>true</code>, + * and makes it invisible otherwise. + * + * @param visible the new visibility state + * + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +public void setVisible (boolean visible) { + checkWidget (); + if (isVisible == visible) return; + isVisible = visible; + if (visible) { + /* + * It is possible (but unlikely), that application + * code could have disposed the widget in the show + * event. If this happens, just return. + */ + sendEvent (SWT.Show); + if (isDisposed ()) return; + } + NOTIFYICONDATA iconData = OS.IsUnicode ? (NOTIFYICONDATA) + new NOTIFYICONDATAW () : + new NOTIFYICONDATAA (); + iconData.cbSize = NOTIFYICONDATA.sizeof; + iconData.uID = id; + iconData.hWnd = display.hwndMessage; + iconData.uFlags = OS.NIF_STATE; + iconData.dwState = visible ? 0 : OS.NIS_HIDDEN; + iconData.dwStateMask = OS.NIS_HIDDEN; + OS.Shell_NotifyIcon (OS.NIM_MODIFY, iconData); + if (!visible) { + sendEvent (SWT.Hide); + } +} + +LRESULT WM_LBUTTONDBLCLK (int wParam, int lParam) { + Event event = new Event (); + POINT pos = new POINT (); + OS.GetCursorPos (pos); + event.x = pos.x; + event.y = pos.y; + sendEvent (SWT.DefaultSelection, event); + return null; +} + +LRESULT WM_LBUTTONDOWN (int wParam, int lParam) { + Event event = new Event (); + POINT pos = new POINT (); + OS.GetCursorPos (pos); + event.x = pos.x; + event.y = pos.y; + sendEvent (SWT.Selection, event); + return null; +} + +LRESULT WM_RBUTTONDBLCLK (int wParam, int lParam) { + Event event = new Event (); + POINT pos = new POINT (); + OS.GetCursorPos (pos); + event.x = pos.x; + event.y = pos.y; + sendEvent (SWT.DefaultSelection, event); + return null; +} + +LRESULT WM_RBUTTONDOWN (int wParam, int lParam) { + if (menu == null) return null; + POINT pos = new POINT (); + OS.GetCursorPos (pos); + menu.setLocation (pos.x, pos.y); + Event event = new Event (); + event.x = pos.x; + event.y = pos.y; + sendEvent (SWT.MenuDetect, event); + menu.setVisible(true); + return null; +} + +LRESULT WM_CONTEXTMENU (int wParam, int lParam) { + // TODO why can't get this to be invoked? + System.out.println("CONTEXT MENU!!!"); + return null; +} +} |