90 91 LRESULT CALLBACK FileDialogWndProc(HWND hWnd, UINT message, 92 WPARAM wParam, LPARAM lParam) 93 { 94 JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); 95 96 switch (message) { 97 case WM_COMMAND: { 98 if (LOWORD(wParam) == IDCANCEL) 99 { 100 // Unlike Print/Page dialogs, we only handle IDCANCEL here and 101 // don't handle IDOK. This is because user can press OK button 102 // when no file is selected, and the dialog is not closed. So 103 // OK button is handled in the CDN_FILEOK notification handler 104 // (see FileDialogHookProc below) 105 jobject peer = (jobject)(::GetProp(hWnd, ModalDialogPeerProp)); 106 env->CallVoidMethod(peer, AwtFileDialog::setHWndMID, (jlong)0); 107 } 108 break; 109 } 110 } 111 112 WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp)); 113 return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam); 114 } 115 116 static UINT_PTR CALLBACK 117 FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) 118 { 119 JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); 120 121 TRY; 122 123 HWND parent = ::GetParent(hdlg); 124 125 switch(uiMsg) { 126 case WM_INITDIALOG: { 127 OPENFILENAME *ofn = (OPENFILENAME *)lParam; 128 jobject peer = (jobject)(ofn->lCustData); 129 env->CallVoidMethod(peer, AwtFileDialog::setHWndMID, 130 (jlong)parent); 131 ::SetProp(parent, ModalDialogPeerProp, reinterpret_cast<HANDLE>(peer)); 132 133 // fix for 4508670 - disable CS_SAVEBITS 134 DWORD style = ::GetClassLong(hdlg,GCL_STYLE); 135 ::SetClassLong(hdlg,GCL_STYLE,style & ~CS_SAVEBITS); 136 137 // set appropriate icon for parentless dialogs 138 jobject awtParent = env->GetObjectField(peer, AwtFileDialog::parentID); 139 if (awtParent == NULL) { 140 ::SendMessage(parent, WM_SETICON, (WPARAM)ICON_BIG, 141 (LPARAM)AwtToolkit::GetInstance().GetAwtIcon()); 142 } else { 143 env->DeleteLocalRef(awtParent); 144 } 145 146 // subclass dialog's parent to receive additional messages 147 WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(parent, 148 FileDialogWndProc); 149 ::SetProp(parent, NativeDialogWndProcProp, reinterpret_cast<HANDLE>(lpfnWndProc)); 150 151 ::SetProp(parent, OpenFileNameProp, (void *)lParam); 152 153 break; 154 } 155 case WM_DESTROY: { 156 HIMC hIMC = ::ImmGetContext(hdlg); 157 if (hIMC != NULL) { 158 ::ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); 159 ::ImmReleaseContext(hdlg, hIMC); 160 } 161 162 WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(parent, NativeDialogWndProcProp)); 625 { 626 TRY; 627 628 AwtToolkit::GetInstance().SyncCall(AwtFileDialog::_ToFront, 629 (void *)(env->NewGlobalRef(peer))); 630 // global ref is deleted in _ToFront 631 632 CATCH_BAD_ALLOC; 633 } 634 635 JNIEXPORT void JNICALL 636 Java_sun_awt_windows_WFileDialogPeer_toBack(JNIEnv *env, jobject peer) 637 { 638 TRY; 639 640 AwtToolkit::GetInstance().SyncCall(AwtFileDialog::_ToBack, 641 (void *)(env->NewGlobalRef(peer))); 642 // global ref is deleted in _ToBack 643 644 CATCH_BAD_ALLOC; 645 } 646 647 } /* extern "C" */ | 90 91 LRESULT CALLBACK FileDialogWndProc(HWND hWnd, UINT message, 92 WPARAM wParam, LPARAM lParam) 93 { 94 JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); 95 96 switch (message) { 97 case WM_COMMAND: { 98 if (LOWORD(wParam) == IDCANCEL) 99 { 100 // Unlike Print/Page dialogs, we only handle IDCANCEL here and 101 // don't handle IDOK. This is because user can press OK button 102 // when no file is selected, and the dialog is not closed. So 103 // OK button is handled in the CDN_FILEOK notification handler 104 // (see FileDialogHookProc below) 105 jobject peer = (jobject)(::GetProp(hWnd, ModalDialogPeerProp)); 106 env->CallVoidMethod(peer, AwtFileDialog::setHWndMID, (jlong)0); 107 } 108 break; 109 } 110 case WM_SETICON: { 111 return 0; 112 } 113 } 114 115 WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp)); 116 return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam); 117 } 118 119 static UINT_PTR CALLBACK 120 FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) 121 { 122 JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); 123 124 TRY; 125 126 HWND parent = ::GetParent(hdlg); 127 128 switch(uiMsg) { 129 case WM_INITDIALOG: { 130 OPENFILENAME *ofn = (OPENFILENAME *)lParam; 131 jobject peer = (jobject)(ofn->lCustData); 132 env->CallVoidMethod(peer, AwtFileDialog::setHWndMID, 133 (jlong)parent); 134 ::SetProp(parent, ModalDialogPeerProp, reinterpret_cast<HANDLE>(peer)); 135 136 // fix for 4508670 - disable CS_SAVEBITS 137 DWORD style = ::GetClassLong(hdlg,GCL_STYLE); 138 ::SetClassLong(hdlg,GCL_STYLE,style & ~CS_SAVEBITS); 139 140 // set appropriate icon for parentless dialogs 141 jobject awtParent = env->GetObjectField(peer, AwtFileDialog::parentID); 142 if (awtParent == NULL) { 143 ::SendMessage(parent, WM_SETICON, (WPARAM)ICON_BIG, 144 (LPARAM)AwtToolkit::GetInstance().GetAwtIcon()); 145 } else { 146 AwtWindow *awtWindow = (AwtWindow *)JNI_GET_PDATA(awtParent); 147 ::SendMessage(parent, WM_SETICON, (WPARAM)ICON_BIG, 148 (LPARAM)(awtWindow->GetHIcon())); 149 ::SendMessage(parent, WM_SETICON, (WPARAM)ICON_SMALL, 150 (LPARAM)(awtWindow->GetHIconSm())); 151 env->DeleteLocalRef(awtParent); 152 } 153 154 // subclass dialog's parent to receive additional messages 155 WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(parent, 156 FileDialogWndProc); 157 ::SetProp(parent, NativeDialogWndProcProp, reinterpret_cast<HANDLE>(lpfnWndProc)); 158 159 ::SetProp(parent, OpenFileNameProp, (void *)lParam); 160 161 break; 162 } 163 case WM_DESTROY: { 164 HIMC hIMC = ::ImmGetContext(hdlg); 165 if (hIMC != NULL) { 166 ::ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); 167 ::ImmReleaseContext(hdlg, hIMC); 168 } 169 170 WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(parent, NativeDialogWndProcProp)); 633 { 634 TRY; 635 636 AwtToolkit::GetInstance().SyncCall(AwtFileDialog::_ToFront, 637 (void *)(env->NewGlobalRef(peer))); 638 // global ref is deleted in _ToFront 639 640 CATCH_BAD_ALLOC; 641 } 642 643 JNIEXPORT void JNICALL 644 Java_sun_awt_windows_WFileDialogPeer_toBack(JNIEnv *env, jobject peer) 645 { 646 TRY; 647 648 AwtToolkit::GetInstance().SyncCall(AwtFileDialog::_ToBack, 649 (void *)(env->NewGlobalRef(peer))); 650 // global ref is deleted in _ToBack 651 652 CATCH_BAD_ALLOC; 653 } 654 655 int ScaleDownX(int x, HWND hwnd) { 656 int screen = AwtWin32GraphicsDevice::DeviceIndexForWindow(hwnd); 657 Devices::InstanceAccess devices; 658 AwtWin32GraphicsDevice* device = devices->GetDevice(screen); 659 return device == NULL ? x : device->ScaleDownX(x); 660 } 661 662 int ScaleDownY(int y, HWND hwnd) { 663 int screen = AwtWin32GraphicsDevice::DeviceIndexForWindow(hwnd); 664 Devices::InstanceAccess devices; 665 AwtWin32GraphicsDevice* device = devices->GetDevice(screen); 666 return device == NULL ? y : device->ScaleDownY(y); 667 } 668 669 jobject AwtFileDialog::_GetLocationOnScreen(void *param) 670 { 671 JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); 672 673 jobject result = NULL; 674 HWND hwnd = (HWND)env->GetLongField((jobject)param, AwtComponent::hwndID); 675 676 if (hwnd) 677 { 678 RECT rect; 679 VERIFY(::GetWindowRect(hwnd,&rect)); 680 result = JNU_NewObjectByName(env, "java/awt/Point", "(II)V", 681 ScaleDownX(rect.left, hwnd), ScaleDownY(rect.top, hwnd)); 682 } 683 684 if (result != NULL) 685 { 686 jobject resultRef = env->NewGlobalRef(result); 687 env->DeleteLocalRef(result); 688 return resultRef; 689 } 690 else 691 { 692 return NULL; 693 } 694 } 695 696 /* 697 * Class: sun_awt_windows_WFileDialogPeer 698 * Method: getLocationOnScreen 699 * Signature: ()Ljava/awt/Point; 700 */ 701 JNIEXPORT jobject JNICALL 702 Java_sun_awt_windows_WFileDialogPeer_getLocationOnScreen(JNIEnv *env, 703 jobject peer) { 704 TRY; 705 706 jobject peerRef = env->NewGlobalRef(peer); 707 jobject resultRef = (jobject)AwtToolkit::GetInstance().SyncCall( 708 (void*(*)(void*))AwtFileDialog::_GetLocationOnScreen, (void *)peerRef); 709 env->DeleteLocalRef(peerRef); 710 711 if (resultRef != NULL) 712 { 713 jobject result = env->NewLocalRef(resultRef); 714 env->DeleteGlobalRef(resultRef); 715 return result; 716 } 717 718 return NULL; 719 720 CATCH_BAD_ALLOC_RET(NULL); 721 } 722 723 } /* extern "C" */ |