From dbde2228e63fb05578eaf7a21923c40565ca6db2 Mon Sep 17 00:00:00 2001 From: Grant Gayed Date: Tue, 9 Mar 2004 21:01:02 +0000 Subject: TrayIcon initial --- .../Eclipse SWT PI/win32/library/os.c | 30 ++ .../Eclipse SWT PI/win32/library/os_custom.c | 12 + .../Eclipse SWT PI/win32/library/os_structs.c | 210 +++++++++++ .../Eclipse SWT PI/win32/library/os_structs.h | 30 ++ .../eclipse/swt/internal/win32/NOTIFYICONDATA.java | 51 +++ .../swt/internal/win32/NOTIFYICONDATAA.java | 18 + .../swt/internal/win32/NOTIFYICONDATAW.java | 18 + .../win32/org/eclipse/swt/internal/win32/OS.java | 23 ++ .../win32/org/eclipse/swt/widgets/Display.java | 84 +++++ .../win32/org/eclipse/swt/widgets/TrayIcon.java | 389 +++++++++++++++++++++ 10 files changed, 865 insertions(+) create mode 100644 bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATA.java create mode 100644 bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAA.java create mode 100644 bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAW.java create mode 100644 bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TrayIcon.java 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; irun() 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. *

@@ -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; iEvents: + *

Selection, DefaultSelection
+ * + *

+ * IMPORTANT: This class is not intended to be subclassed. + *

+ */ +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 + * @exception SWTException + */ +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 SelectionListener + * interface. + *

+ * widgetSelected is called when the receiver is selected + * widgetDefaultSelected is called when the receiver is double-clicked + *

+ * + * @param listener the listener which should be notified + * + * @exception IllegalArgumentException + * @exception SWTException + * + * @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 + */ +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 + */ +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 + */ +public String getToolTipText (String value) { + checkWidget (); + return toolTipText; +} + +/** + * Returns true if the receiver is visible and + * false otherwise. + * + * @return the receiver's visibility + * + * @exception SWTException + */ +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 + * @exception SWTException + * + * @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 + * @exception SWTException + */ +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 + */ +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 + */ +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 true, + * and makes it invisible otherwise. + * + * @param visible the new visibility state + * + * @exception SWTException + */ +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; +} +} -- cgit