summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrant Gayed <ggayed>2004-03-09 21:01:02 +0000
committerGrant Gayed <ggayed>2004-03-09 21:01:02 +0000
commitdbde2228e63fb05578eaf7a21923c40565ca6db2 (patch)
treed63cd69ad9c8229666bf021e7c42d8a01aaf55a1
parentad4a0cf5741d6d1ebd3aa7aa442fce51f0f137a4 (diff)
downloadeclipse.platform.swt-dbde2228e63fb05578eaf7a21923c40565ca6db2.tar.gz
eclipse.platform.swt-dbde2228e63fb05578eaf7a21923c40565ca6db2.tar.xz
eclipse.platform.swt-dbde2228e63fb05578eaf7a21923c40565ca6db2.zip
TrayIcon initial
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os.c30
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_custom.c12
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.c210
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.h30
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATA.java51
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAA.java18
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/NOTIFYICONDATAW.java18
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java23
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java84
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TrayIcon.java389
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;
+}
+}