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) |