< prev index next >

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

Print this page




 332             ofn.Flags |= OFN_ENABLEINCLUDENOTIFY;
 333         }
 334         ofn.lCustData = (LPARAM)peer;
 335         ofn.lpfnHook = (LPOFNHOOKPROC)FileDialogHookProc;
 336 
 337         if (multipleMode == JNI_TRUE) {
 338             ofn.Flags |= OFN_ALLOWMULTISELECT;
 339         }
 340 
 341         // Save current directory, so we can reset if it changes.
 342         currentDirectory = new TCHAR[MAX_PATH+1];
 343 
 344         VERIFY(::GetCurrentDirectory(MAX_PATH, currentDirectory) > 0);
 345 
 346         mode = env->GetIntField(target, AwtFileDialog::modeID);
 347 
 348         AwtDialog::CheckInstallModalHook();
 349 
 350         // show the Win32 file dialog
 351         if (mode == java_awt_FileDialog_LOAD) {
 352             result = AwtFileDialog::GetOpenFileName(&ofn);
 353         } else {
 354             result = AwtFileDialog::GetSaveFileName(&ofn);
 355         }
 356         // Fix for 4181310: FileDialog does not show up.
 357         // If the dialog is not shown because of invalid file name
 358         // replace the file name by empty string.
 359         if (!result) {
 360             dlgerr = ::CommDlgExtendedError();
 361             if (dlgerr == FNERR_INVALIDFILENAME) {
 362                 _tcscpy_s(fileBuffer, bufferLimit, TEXT(""));
 363                 if (mode == java_awt_FileDialog_LOAD) {
 364                     result = AwtFileDialog::GetOpenFileName(&ofn);
 365                 } else {
 366                     result = AwtFileDialog::GetSaveFileName(&ofn);
 367                 }
 368             }
 369         }
 370 
 371         AwtDialog::CheckUninstallModalHook();
 372 
 373         DASSERT(env->GetLongField(peer, AwtComponent::hwndID) == 0L);
 374 
 375         AwtDialog::ModalActivateNextWindow(NULL, target, peer);
 376 
 377         VERIFY(::SetCurrentDirectory(currentDirectory));
 378 
 379         // Report result to peer.
 380         if (result) {
 381             jint length = multipleMode
 382                     ? (jint)GetBufferLength(ofn.lpstrFile, ofn.nMaxFile)
 383                     : (jint)_tcslen(ofn.lpstrFile);
 384             jcharArray jnames = env->NewCharArray(length);
 385             if (jnames == NULL) {
 386                 throw std::bad_alloc();


 405 
 406         delete[] currentDirectory;
 407         if (ofn.lpstrFile)
 408             delete[] ofn.lpstrFile;
 409         throw;
 410     }
 411 
 412     env->DeleteLocalRef(target);
 413     env->DeleteLocalRef(parent);
 414     env->DeleteLocalRef(title);
 415     env->DeleteLocalRef(directory);
 416     env->DeleteLocalRef(file);
 417     env->DeleteLocalRef(fileFilter);
 418     env->DeleteGlobalRef(peer);
 419 
 420     delete[] currentDirectory;
 421     if (ofn.lpstrFile)
 422         delete[] ofn.lpstrFile;
 423 }
 424 
 425 BOOL
 426 AwtFileDialog::GetOpenFileName(LPOPENFILENAME data) {
 427     return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
 428         AwtToolkit::GetInstance().InvokeFunction((void*(*)(void*))
 429                      ::GetOpenFileName, data)));
 430 
 431 }
 432 
 433 BOOL
 434 AwtFileDialog::GetSaveFileName(LPOPENFILENAME data) {
 435     return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
 436         AwtToolkit::GetInstance().InvokeFunction((void *(*)(void *))
 437                      ::GetSaveFileName, data)));
 438 
 439 }
 440 
 441 BOOL AwtFileDialog::InheritsNativeMouseWheelBehavior() {return true;}
 442 
 443 void AwtFileDialog::_DisposeOrHide(void *param)
 444 {
 445     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
 446 
 447     jobject self = (jobject)param;
 448 
 449     HWND hdlg = (HWND)(env->GetLongField(self, AwtComponent::hwndID));
 450     if (::IsWindow(hdlg))
 451     {
 452         ::SendMessage(hdlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0),
 453                       (LPARAM)hdlg);
 454     }
 455 
 456     env->DeleteGlobalRef(self);
 457 }
 458 
 459 void AwtFileDialog::_ToFront(void *param)
 460 {


 568                                                      jstring filterDescription)
 569 {
 570     TRY;
 571 
 572     AwtFileDialog::Initialize(env, filterDescription);
 573 
 574     CATCH_BAD_ALLOC;
 575 }
 576 
 577 JNIEXPORT void JNICALL
 578 Java_sun_awt_windows_WFileDialogPeer__1show(JNIEnv *env, jobject peer)
 579 {
 580     TRY;
 581 
 582     /*
 583      * Fix for 4906972.
 584      * 'peer' reference has to be global as it's used further in another thread.
 585      */
 586     jobject peerGlobal = env->NewGlobalRef(peer);
 587 
 588     AwtToolkit::GetInstance().InvokeFunction(AwtFileDialog::Show, peerGlobal);
 589 
 590     env->DeleteGlobalRef(peerGlobal);

 591 
 592     CATCH_BAD_ALLOC;
 593 }
 594 
 595 JNIEXPORT void JNICALL
 596 Java_sun_awt_windows_WFileDialogPeer__1dispose(JNIEnv *env, jobject peer)
 597 {
 598     TRY_NO_VERIFY;
 599 
 600     jobject peerGlobal = env->NewGlobalRef(peer);
 601 
 602     AwtToolkit::GetInstance().SyncCall(AwtFileDialog::_DisposeOrHide,
 603         (void *)peerGlobal);
 604     // peerGlobal ref is deleted in _DisposeOrHide
 605 
 606     CATCH_BAD_ALLOC;
 607 }
 608 
 609 JNIEXPORT void JNICALL
 610 Java_sun_awt_windows_WFileDialogPeer__1hide(JNIEnv *env, jobject peer)




 332             ofn.Flags |= OFN_ENABLEINCLUDENOTIFY;
 333         }
 334         ofn.lCustData = (LPARAM)peer;
 335         ofn.lpfnHook = (LPOFNHOOKPROC)FileDialogHookProc;
 336 
 337         if (multipleMode == JNI_TRUE) {
 338             ofn.Flags |= OFN_ALLOWMULTISELECT;
 339         }
 340 
 341         // Save current directory, so we can reset if it changes.
 342         currentDirectory = new TCHAR[MAX_PATH+1];
 343 
 344         VERIFY(::GetCurrentDirectory(MAX_PATH, currentDirectory) > 0);
 345 
 346         mode = env->GetIntField(target, AwtFileDialog::modeID);
 347 
 348         AwtDialog::CheckInstallModalHook();
 349 
 350         // show the Win32 file dialog
 351         if (mode == java_awt_FileDialog_LOAD) {
 352             result = ::GetOpenFileName(&ofn);
 353         } else {
 354             result = ::GetSaveFileName(&ofn);
 355         }
 356         // Fix for 4181310: FileDialog does not show up.
 357         // If the dialog is not shown because of invalid file name
 358         // replace the file name by empty string.
 359         if (!result) {
 360             dlgerr = ::CommDlgExtendedError();
 361             if (dlgerr == FNERR_INVALIDFILENAME) {
 362                 _tcscpy_s(fileBuffer, bufferLimit, TEXT(""));
 363                 if (mode == java_awt_FileDialog_LOAD) {
 364                     result = ::GetOpenFileName(&ofn);
 365                 } else {
 366                     result = ::GetSaveFileName(&ofn);
 367                 }
 368             }
 369         }
 370 
 371         AwtDialog::CheckUninstallModalHook();
 372 
 373         DASSERT(env->GetLongField(peer, AwtComponent::hwndID) == 0L);
 374 
 375         AwtDialog::ModalActivateNextWindow(NULL, target, peer);
 376 
 377         VERIFY(::SetCurrentDirectory(currentDirectory));
 378 
 379         // Report result to peer.
 380         if (result) {
 381             jint length = multipleMode
 382                     ? (jint)GetBufferLength(ofn.lpstrFile, ofn.nMaxFile)
 383                     : (jint)_tcslen(ofn.lpstrFile);
 384             jcharArray jnames = env->NewCharArray(length);
 385             if (jnames == NULL) {
 386                 throw std::bad_alloc();


 405 
 406         delete[] currentDirectory;
 407         if (ofn.lpstrFile)
 408             delete[] ofn.lpstrFile;
 409         throw;
 410     }
 411 
 412     env->DeleteLocalRef(target);
 413     env->DeleteLocalRef(parent);
 414     env->DeleteLocalRef(title);
 415     env->DeleteLocalRef(directory);
 416     env->DeleteLocalRef(file);
 417     env->DeleteLocalRef(fileFilter);
 418     env->DeleteGlobalRef(peer);
 419 
 420     delete[] currentDirectory;
 421     if (ofn.lpstrFile)
 422         delete[] ofn.lpstrFile;
 423 }
 424 
















 425 BOOL AwtFileDialog::InheritsNativeMouseWheelBehavior() {return true;}
 426 
 427 void AwtFileDialog::_DisposeOrHide(void *param)
 428 {
 429     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
 430 
 431     jobject self = (jobject)param;
 432 
 433     HWND hdlg = (HWND)(env->GetLongField(self, AwtComponent::hwndID));
 434     if (::IsWindow(hdlg))
 435     {
 436         ::SendMessage(hdlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0),
 437                       (LPARAM)hdlg);
 438     }
 439 
 440     env->DeleteGlobalRef(self);
 441 }
 442 
 443 void AwtFileDialog::_ToFront(void *param)
 444 {


 552                                                      jstring filterDescription)
 553 {
 554     TRY;
 555 
 556     AwtFileDialog::Initialize(env, filterDescription);
 557 
 558     CATCH_BAD_ALLOC;
 559 }
 560 
 561 JNIEXPORT void JNICALL
 562 Java_sun_awt_windows_WFileDialogPeer__1show(JNIEnv *env, jobject peer)
 563 {
 564     TRY;
 565 
 566     /*
 567      * Fix for 4906972.
 568      * 'peer' reference has to be global as it's used further in another thread.
 569      */
 570     jobject peerGlobal = env->NewGlobalRef(peer);
 571 
 572     if (!AwtToolkit::GetInstance().PostMessage(WM_AWT_INVOKE_METHOD,
 573                              (WPARAM)AwtFileDialog::Show, (LPARAM)peerGlobal)) {
 574         env->DeleteGlobalRef(peerGlobal);
 575     }
 576 
 577     CATCH_BAD_ALLOC;
 578 }
 579 
 580 JNIEXPORT void JNICALL
 581 Java_sun_awt_windows_WFileDialogPeer__1dispose(JNIEnv *env, jobject peer)
 582 {
 583     TRY_NO_VERIFY;
 584 
 585     jobject peerGlobal = env->NewGlobalRef(peer);
 586 
 587     AwtToolkit::GetInstance().SyncCall(AwtFileDialog::_DisposeOrHide,
 588         (void *)peerGlobal);
 589     // peerGlobal ref is deleted in _DisposeOrHide
 590 
 591     CATCH_BAD_ALLOC;
 592 }
 593 
 594 JNIEXPORT void JNICALL
 595 Java_sun_awt_windows_WFileDialogPeer__1hide(JNIEnv *env, jobject peer)


< prev index next >