< prev index next >

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

Print this page




  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" */
< prev index next >