< prev index next >

src/java.desktop/windows/native/libawt/windows/awt_FileDialog.cpp

Print this page

        

@@ -105,10 +105,13 @@
                 jobject peer = (jobject)(::GetProp(hWnd, ModalDialogPeerProp));
                 env->CallVoidMethod(peer, AwtFileDialog::setHWndMID, (jlong)0);
             }
             break;
         }
+        case WM_SETICON: {
+            return 0;
+        }
     }
 
     WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp));
     return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam);
 }

@@ -138,10 +141,15 @@
             jobject awtParent = env->GetObjectField(peer, AwtFileDialog::parentID);
             if (awtParent == NULL) {
                 ::SendMessage(parent, WM_SETICON, (WPARAM)ICON_BIG,
                               (LPARAM)AwtToolkit::GetInstance().GetAwtIcon());
             } else {
+                AwtWindow *awtWindow = (AwtWindow *)JNI_GET_PDATA(awtParent);
+                ::SendMessage(parent, WM_SETICON, (WPARAM)ICON_BIG,
+                                               (LPARAM)(awtWindow->GetHIcon()));
+                ::SendMessage(parent, WM_SETICON, (WPARAM)ICON_SMALL,
+                                             (LPARAM)(awtWindow->GetHIconSm()));
                 env->DeleteLocalRef(awtParent);
             }
 
             // subclass dialog's parent to receive additional messages
             WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(parent,

@@ -642,6 +650,74 @@
     // global ref is deleted in _ToBack
 
     CATCH_BAD_ALLOC;
 }
 
+int ScaleDownX(int x, HWND hwnd) {
+    int screen = AwtWin32GraphicsDevice::DeviceIndexForWindow(hwnd);
+    Devices::InstanceAccess devices;
+    AwtWin32GraphicsDevice* device = devices->GetDevice(screen);
+    return device == NULL ? x : device->ScaleDownX(x);
+}
+
+int ScaleDownY(int y, HWND hwnd) {
+    int screen = AwtWin32GraphicsDevice::DeviceIndexForWindow(hwnd);
+    Devices::InstanceAccess devices;
+    AwtWin32GraphicsDevice* device = devices->GetDevice(screen);
+    return device == NULL ? y : device->ScaleDownY(y);
+}
+
+jobject AwtFileDialog::_GetLocationOnScreen(void *param)
+{
+    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+    jobject result = NULL;
+    HWND hwnd = (HWND)env->GetLongField((jobject)param, AwtComponent::hwndID);
+
+    if (::IsWindow(hwnd))
+    {
+        RECT rect;
+        VERIFY(::GetWindowRect(hwnd, &rect));
+        result = JNU_NewObjectByName(env, "java/awt/Point", "(II)V",
+                       ScaleDownX(rect.left, hwnd), ScaleDownY(rect.top, hwnd));
+    }
+
+    if (result != NULL)
+    {
+        jobject resultRef = env->NewGlobalRef(result);
+        env->DeleteLocalRef(result);
+        return resultRef;
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+/*
+ * Class:     sun_awt_windows_WFileDialogPeer
+ * Method:    getLocationOnScreen
+ * Signature: ()Ljava/awt/Point;
+ */
+JNIEXPORT jobject JNICALL
+Java_sun_awt_windows_WFileDialogPeer_getLocationOnScreen(JNIEnv *env,
+                                                                 jobject peer) {
+    TRY;
+
+    jobject peerRef = env->NewGlobalRef(peer);
+    jobject resultRef = (jobject)AwtToolkit::GetInstance().SyncCall(
+        (void*(*)(void*))AwtFileDialog::_GetLocationOnScreen, (void *)peerRef);
+    env->DeleteLocalRef(peerRef);
+
+    if (resultRef != NULL)
+    {
+        jobject result = env->NewLocalRef(resultRef);
+        env->DeleteGlobalRef(resultRef);
+        return result;
+    }
+
+    return NULL;
+
+    CATCH_BAD_ALLOC_RET(NULL);
+}
+
 } /* extern "C" */
< prev index next >