From 60665ef5d2fd8e3df4509c723dbad5393b6eb0b2 Mon Sep 17 00:00:00 2001 From: RĂ¼diger Timm Date: Thu, 11 Dec 2008 16:34:19 +0000 Subject: CWS-TOOLING: integrate CWS hrovista3_DEV300 --- .../source/win32/filepicker/VistaFilePicker.cxx | 15 +- .../filepicker/VistaFilePickerEventHandler.cxx | 10 +- .../win32/filepicker/VistaFilePickerImpl.cxx | 196 +++++++++++++++++++-- .../win32/filepicker/VistaFilePickerImpl.hxx | 26 ++- fpicker/source/win32/filepicker/asyncrequests.cxx | 57 +++--- fpicker/source/win32/filepicker/asyncrequests.hxx | 15 +- 6 files changed, 262 insertions(+), 57 deletions(-) (limited to 'fpicker/source') diff --git a/fpicker/source/win32/filepicker/VistaFilePicker.cxx b/fpicker/source/win32/filepicker/VistaFilePicker.cxx index 80446a745a0a..1fe559c74282 100644 --- a/fpicker/source/win32/filepicker/VistaFilePicker.cxx +++ b/fpicker/source/win32/filepicker/VistaFilePicker.cxx @@ -282,7 +282,7 @@ void SAL_CALL VistaFilePicker::setDefaultName(const ::rtl::OUString& sName ) throw(css::uno::RuntimeException) { RequestRef rRequest(new Request()); - rRequest->setRequest (VistaFilePickerImpl::E_SET_FILENAME); + rRequest->setRequest (VistaFilePickerImpl::E_SET_DEFAULT_NAME); rRequest->setArgument(PROP_FILENAME, sName); m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); @@ -304,7 +304,12 @@ void SAL_CALL VistaFilePicker::setDisplayDirectory(const ::rtl::OUString& sDirec ::rtl::OUString SAL_CALL VistaFilePicker::getDisplayDirectory() throw(css::uno::RuntimeException) { - return ::rtl::OUString(); + RequestRef rRequest(new Request()); + rRequest->setRequest (VistaFilePickerImpl::E_GET_DIRECTORY); + m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + const ::rtl::OUString sDirectory = rRequest->getArgumentOrDefault(PROP_FILENAME, ::rtl::OUString()); + + return sDirectory; } //----------------------------------------------------------------------------------------- @@ -343,7 +348,9 @@ css::uno::Sequence< ::rtl::OUString > SAL_CALL VistaFilePicker::getSelectedFiles RequestRef rRequest(new Request()); rRequest->setRequest (VistaFilePickerImpl::E_SHOW_DIALOG_MODAL); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); + // if we want to show a modal window, the calling thread needs to process messages + m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::PROCESS_MESSAGES); + const ::sal_Bool bOK = rRequest->getArgumentOrDefault(PROP_DIALOG_SHOW_RESULT, (::sal_Bool)sal_False ); m_lLastFiles = rRequest->getArgumentOrDefault(PROP_SELECTED_FILES , css::uno::Sequence< ::rtl::OUString >()); @@ -629,7 +636,7 @@ void SAL_CALL VistaFilePicker::initialize(const css::uno::Sequence< css::uno::An else rRequest->setRequest (VistaFilePickerImpl::E_CREATE_SAVE_DIALOG); rRequest->setArgument(PROP_FEATURES, nFeatures); - + rRequest->setArgument(PROP_TEMPLATE_DESCR, nTemplate); if ( ! m_aAsyncExecute.isRunning()) m_aAsyncExecute.create(); m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); diff --git a/fpicker/source/win32/filepicker/VistaFilePickerEventHandler.cxx b/fpicker/source/win32/filepicker/VistaFilePickerEventHandler.cxx index dd1e2c5b8def..ff673c2345a8 100644 --- a/fpicker/source/win32/filepicker/VistaFilePickerEventHandler.cxx +++ b/fpicker/source/win32/filepicker/VistaFilePickerEventHandler.cxx @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -264,7 +265,8 @@ STDMETHODIMP VistaFilePickerEventHandler::OnShareViolation(IFileDialog* IShellItem* pItem , FDE_SHAREVIOLATION_RESPONSE* pResponse) { - return E_NOTIMPL; + impl_sendEvent(E_CONTROL_STATE_CHANGED, css::ui::dialogs::CommonFilePickerElementIds::LISTBOX_FILTER); + return S_OK; } //----------------------------------------------------------------------------------------- @@ -294,7 +296,9 @@ STDMETHODIMP VistaFilePickerEventHandler::OnTypeChange(IFileDialog* pDialog) */ - return E_NOTIMPL; + impl_sendEvent(E_CONTROL_STATE_CHANGED, css::ui::dialogs::CommonFilePickerElementIds::LISTBOX_FILTER); + + return S_OK; } //----------------------------------------------------------------------------------------- @@ -480,6 +484,8 @@ void VistaFilePickerEventHandler::impl_sendEvent( EEventType eEventType, RequestRef rRequest(new Request()); rRequest->setRequest (eEventType); rRequest->setArgument(PROP_PICKER_LISTENER, xListener); + if ( nControlID ) + rRequest->setArgument(PROP_CONTROL_ID, nControlID); aNotify.triggerRequestDirectly(rRequest); //aNotify.triggerRequestNonBlocked(rRequest); diff --git a/fpicker/source/win32/filepicker/VistaFilePickerImpl.cxx b/fpicker/source/win32/filepicker/VistaFilePickerImpl.cxx index 623d4d9d922e..4ea9dedf7d14 100644 --- a/fpicker/source/win32/filepicker/VistaFilePickerImpl.cxx +++ b/fpicker/source/win32/filepicker/VistaFilePickerImpl.cxx @@ -36,10 +36,26 @@ #include #include - +#include #include #include #include +#include + + inline bool is_current_process_window(HWND hwnd) +{ + DWORD pid; + GetWindowThreadProcessId(hwnd, &pid); + return (pid == GetCurrentProcessId()); +} + +HWND choose_parent_window() +{ + HWND hwnd_parent = GetForegroundWindow(); + if (!is_current_process_window(hwnd_parent)) + hwnd_parent = GetDesktopWindow(); + return hwnd_parent; +} //----------------------------------------------------------------------------- // namespace @@ -61,6 +77,17 @@ static const ::sal_Int16 INVALID_CONTROL_ACTION = -1; typedef ::comphelper::SequenceAsVector< ::rtl::OUString > TStringList; +// Guids used for IFileDialog::SetClientGuid +static const GUID CLIENTID_FILEDIALOG_SIMPLE = {0xB8628FD3, 0xA3F5, 0x4845, 0x9B, 0x62, 0xD5, 0x1E, 0xDF, 0x97, 0xC4, 0x83}; +static const GUID CLIENTID_FILEDIALOG_OPTIONS = {0x93ED486F, 0x0D04, 0x4807, 0x8C, 0x44, 0xAC, 0x26, 0xCB, 0x6C, 0x5D, 0x36}; +static const GUID CLIENTID_FILESAVE = {0x3B2E2261, 0x402D, 0x4049, 0xB0, 0xC0, 0x91, 0x13, 0xF8, 0x6E, 0x84, 0x7C}; +static const GUID CLIENTID_FILESAVE_PASSWORD = {0xC12D4F4C, 0x4D41, 0x4D4F, 0x97, 0xEF, 0x87, 0xF9, 0x8D, 0xB6, 0x1E, 0xA6}; +static const GUID CLIENTID_FILESAVE_SELECTION = {0x5B2482B3, 0x0358, 0x4E09, 0xAA, 0x64, 0x2B, 0x76, 0xB2, 0xA0, 0xDD, 0xFE}; +static const GUID CLIENTID_FILESAVE_TEMPLATE = {0x9996D877, 0x20D5, 0x424B, 0x9C, 0x2E, 0xD3, 0xB6, 0x31, 0xEC, 0xF7, 0xCE}; +static const GUID CLIENTID_FILEOPEN_LINK_TEMPLATE = {0x32237796, 0x1509, 0x49D1, 0xBB, 0x7E, 0x63, 0xAD, 0x36, 0xAE, 0x86, 0x8C}; +static const GUID CLIENTID_FILEOPEN_PLAY = {0x32CFB147, 0xF5AE, 0x4F90, 0xA1, 0xF1, 0x81, 0x20, 0x72, 0xBB, 0x2F, 0xC5}; +static const GUID CLIENTID_FILEOPEN_LINK = {0x39AC4BAE, 0x7D2D, 0x46BC, 0xBE, 0x2E, 0xF8, 0x8C, 0xB5, 0x65, 0x5E, 0x6A}; + //----------------------------------------------------------------------------- ::rtl::OUString lcl_getURLFromShellItem (IShellItem* pItem) { @@ -120,7 +147,10 @@ VistaFilePickerImpl::VistaFilePickerImpl() , m_lLastFiles () , m_iEventHandler(new VistaFilePickerEventHandler(this)) , m_bInExecute (sal_False) + , m_sDirectory () + , m_sFilename () { + m_hParentWindow = choose_parent_window(); } //------------------------------------------------------------------------------- @@ -200,6 +230,14 @@ void VistaFilePickerImpl::doRequest(const RequestRef& rRequest) impl_sta_SetDirectory(rRequest); break; + case E_GET_DIRECTORY : + impl_sta_GetDirectory(rRequest); + break; + + case E_SET_DEFAULT_NAME : + impl_sta_SetDefaultName(rRequest); + break; + case E_GET_SELECTED_FILES : impl_sta_getSelectedFiles(rRequest); break; @@ -324,6 +362,11 @@ void VistaFilePickerImpl::impl_sta_getCurrentFilter(const RequestRef& rRequest) (m_lFilters.getFilter(nRealIndex, sTitle)) ) rRequest->setArgument(PROP_FILTER_TITLE, sTitle); + else if ( nRealIndex == -1 ) // Dialog not visible yet + { + sTitle = m_lFilters.getCurrentFilter(); + rRequest->setArgument(PROP_FILTER_TITLE, sTitle); + } aLock.clear(); // <- SYNCHRONIZED @@ -364,7 +407,8 @@ void VistaFilePickerImpl::impl_sta_CreateOpenDialog(const RequestRef& rRequest) iDialog->SetOptions ( nFlags ); ::sal_Int32 nFeatures = rRequest->getArgumentOrDefault(PROP_FEATURES, (::sal_Int32)0); - impl_sta_enableFeatures(nFeatures); + ::sal_Int32 nTemplate = rRequest->getArgumentOrDefault(PROP_TEMPLATE_DESCR, (::sal_Int32)0); + impl_sta_enableFeatures(nFeatures, nTemplate); VistaFilePickerEventHandler* pHandlerImpl = (VistaFilePickerEventHandler*)iHandler.get(); if (pHandlerImpl) @@ -404,7 +448,8 @@ void VistaFilePickerImpl::impl_sta_CreateSaveDialog(const RequestRef& rRequest) iDialog->SetOptions ( nFlags ); ::sal_Int32 nFeatures = rRequest->getArgumentOrDefault(PROP_FEATURES, (::sal_Int32)0); - impl_sta_enableFeatures(nFeatures); + ::sal_Int32 nTemplate = rRequest->getArgumentOrDefault(PROP_TEMPLATE_DESCR, (::sal_Int32)0); + impl_sta_enableFeatures(nFeatures, nTemplate); VistaFilePickerEventHandler* pHandlerImpl = (VistaFilePickerEventHandler*)iHandler.get(); if (pHandlerImpl) @@ -418,8 +463,52 @@ static const ::sal_Int32 GROUP_IMAGETEMPLATE = 3; static const ::sal_Int32 GROUP_CHECKBOXES = 4; //------------------------------------------------------------------------------- -void VistaFilePickerImpl::impl_sta_enableFeatures(::sal_Int32 nFeatures) +void VistaFilePickerImpl::impl_sta_enableFeatures(::sal_Int32 nFeatures, ::sal_Int32 nTemplate) { + GUID aGUID = {}; + switch (nTemplate) + { + case css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE : + case css::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE : + aGUID = CLIENTID_FILEDIALOG_SIMPLE; + break; + + case css::ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION : + case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS : + aGUID = CLIENTID_FILEDIALOG_OPTIONS; + break; + + case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION : + aGUID = CLIENTID_FILESAVE; + break; + + case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD : + aGUID = CLIENTID_FILESAVE_PASSWORD; + break; + + case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_SELECTION : + aGUID = CLIENTID_FILESAVE_SELECTION; + break; + + case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_TEMPLATE : + aGUID = CLIENTID_FILESAVE_TEMPLATE; + break; + + case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE : + aGUID = CLIENTID_FILEOPEN_LINK_TEMPLATE; + break; + + case css::ui::dialogs::TemplateDescription::FILEOPEN_PLAY : + aGUID = CLIENTID_FILEOPEN_PLAY; + break; + + case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW : + aGUID = CLIENTID_FILEOPEN_LINK; + break; + } + TFileDialog iDialog = impl_getBaseDialogInterface(); + iDialog->SetClientGuid ( aGUID ); + TFileDialogCustomize iCustom = impl_getCustomizeInterface(); if ((nFeatures & FEATURE_VERSION) == FEATURE_VERSION) @@ -451,8 +540,8 @@ void VistaFilePickerImpl::impl_sta_enableFeatures(::sal_Int32 nFeatures) if ((nFeatures & FEATURE_AUTOEXTENSION) == FEATURE_AUTOEXTENSION) iCustom->AddCheckButton (css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, L"Auto Extension", true); - // if ((nFeatures & FEATURE_PASSWORD) == FEATURE_PASSWORD) - // iCustom->AddCheckButton (css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, L"Password", true); + if ((nFeatures & FEATURE_PASSWORD) == FEATURE_PASSWORD) + iCustom->AddCheckButton (css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, L"Password", false); if ((nFeatures & FEATURE_READONLY) == FEATURE_READONLY) iCustom->AddCheckButton (css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY, L"Readonly", false); @@ -475,6 +564,7 @@ void VistaFilePickerImpl::impl_sta_enableFeatures(::sal_Int32 nFeatures) if ((nFeatures & FEATURE_PLAY) == FEATURE_PLAY) iCustom->AddPushButton (css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, L"Play"); + } //------------------------------------------------------------------------------- @@ -532,6 +622,17 @@ void VistaFilePickerImpl::impl_sta_SetDirectory(const RequestRef& rRequest) { ::rtl::OUString sDirectory = rRequest->getArgumentOrDefault(PROP_DIRECTORY, ::rtl::OUString()); + if( !m_bInExecute ) + { + // Vista stores last used folders for file dialogs + // so we don't want the application to change the folder + // in most cases. + // Store the requested folder in the mean time and decide later + // what to do + m_sDirectory = sDirectory; + return; + } + // SYNCHRONIZED-> ::osl::ResettableMutexGuard aLock(m_aMutex); TFileDialog iDialog = impl_getBaseDialogInterface(); @@ -550,6 +651,27 @@ void VistaFilePickerImpl::impl_sta_SetDirectory(const RequestRef& rRequest) iDialog->SetFolder(pFolder); } +void VistaFilePickerImpl::impl_sta_GetDirectory(const RequestRef& rRequest) +{ + TFileDialog iDialog = impl_getBaseDialogInterface(); + ComPtr< IShellItem > pFolder; + HRESULT hResult = iDialog->GetFolder( &pFolder ); + if ( FAILED(hResult) ) + return; + ::rtl::OUString sFolder = lcl_getURLFromShellItem ( pFolder ); + if( sFolder.getLength()) + rRequest->setArgument( PROP_DIRECTORY, sFolder ); +} + +//------------------------------------------------------------------------------- +void VistaFilePickerImpl::impl_sta_SetDefaultName(const RequestRef& rRequest) +{ + ::rtl::OUString sFilename = rRequest->getArgumentOrDefault(PROP_FILENAME, ::rtl::OUString()); + TFileDialog iDialog = impl_getBaseDialogInterface(); + iDialog->SetFileName ( reinterpret_cast(sFilename.getStr())); + m_sFilename = sFilename; +} + //------------------------------------------------------------------------------- void VistaFilePickerImpl::impl_sta_setFiltersOnDialog() { @@ -582,7 +704,7 @@ void VistaFilePickerImpl::impl_sta_setFiltersOnDialog() { LPCWSTR lpFilterExt = lFilters[0].pszSpec; - lpFilterExt = wcschr( lpFilterExt, '.' ); + lpFilterExt = wcsrchr( lpFilterExt, '.' ); if ( lpFilterExt ) lpFilterExt++; iDialog->SetDefaultExtension( lpFilterExt ); @@ -684,15 +806,34 @@ void VistaFilePickerImpl::impl_sta_ShowDialogModal(const RequestRef& rRequest) aLock.clear(); // <- SYNCHRONIZED + if( m_sDirectory.getLength()) + { + // we set the directory only if we have a save dialog and a filename + // for the other cases, the file dialog remembers its last location + // according to its client guid. + if (iSave.is() && m_sFilename.getLength()) + { + ComPtr< IShellItem > pFolder; + #ifdef __MINGW32__ + HRESULT hResult = SHCreateItemFromParsingName ( reinterpret_cast(m_sDirectory.getStr()), NULL, IID_IShellItem, (void**)(&pFolder) ); + #else + HRESULT hResult = SHCreateItemFromParsingName ( m_sDirectory, NULL, IID_PPV_ARGS(&pFolder) ); + #endif + if ( SUCCEEDED(hResult) ) + iDialog->SetFolder(pFolder); + } + } + + HRESULT hResult; try { // show dialog and wait for user decision if (iOpen.is()) - hResult = iOpen->Show(0); + hResult = iOpen->Show( m_hParentWindow ); // parent window needed else if (iSave.is()) - hResult = iSave->Show(0); + hResult = iSave->Show( m_hParentWindow ); // parent window needed } catch(...) {} @@ -764,9 +905,10 @@ void lcl_removeControlItemsWorkaround(const TFileDialogCustomize& iCustom , ::sal_Int16 nControlId) { ::sal_Int32 i = 0; - HRESULT hResult = S_OK; + HRESULT hResult; hResult = iCustom->SetSelectedControlItem(nControlId, 1000); + hResult = S_OK; while ( SUCCEEDED(hResult) ) hResult = iCustom->RemoveControlItem(nControlId, i++); } @@ -862,7 +1004,6 @@ void VistaFilePickerImpl::impl_sta_GetControlValue(const RequestRef& rRequest) css::uno::Any aValue; switch (nId) { - case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION : case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PASSWORD : case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY : case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS : @@ -885,6 +1026,16 @@ void VistaFilePickerImpl::impl_sta_GetControlValue(const RequestRef& rRequest) //------------------------------------------------------------------------------- void VistaFilePickerImpl::impl_sta_SetControlLabel(const RequestRef& rRequest) { + ::sal_Int16 nId = rRequest->getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); + ::rtl::OUString sLabel = rRequest->getArgumentOrDefault(PROP_CONTROL_LABEL, ::rtl::OUString() ); + + // dont check for right values here ... + // most parameters are optional ! + + TFileDialogCustomize iCustom = impl_getCustomizeInterface(); + if ( ! iCustom.is()) + return; + iCustom->SetControlLabel ( nId, reinterpret_cast(sLabel.getStr())); } //------------------------------------------------------------------------------- @@ -913,6 +1064,27 @@ void VistaFilePickerImpl::impl_sta_EnableControl(const RequestRef& rRequest) iCustom->SetControlState(nId, eState); } +//------------------------------------------------------------------------------- +void VistaFilePickerImpl::impl_SetDefaultExtension( const rtl::OUString& currentFilter ) +{ + TFileDialog iDialog = impl_getBaseDialogInterface(); + if (currentFilter.getLength()) + { + rtl::OUString FilterExt; + m_lFilters.getFilter(currentFilter, FilterExt); + + sal_Int32 posOfPoint = FilterExt.indexOf(L'.'); + const sal_Unicode* pFirstExtStart = FilterExt.getStr() + posOfPoint + 1; + + sal_Int32 posOfSemiColon = FilterExt.indexOf(L';') - 1; + if (posOfSemiColon < 0) + posOfSemiColon = FilterExt.getLength() - 1; + + FilterExt = rtl::OUString(pFirstExtStart, posOfSemiColon - posOfPoint); + iDialog->SetDefaultExtension ( reinterpret_cast(FilterExt.getStr()) ); + } +} + //------------------------------------------------------------------------------- void VistaFilePickerImpl::onAutoExtensionChanged (bool bChecked) @@ -934,7 +1106,7 @@ void VistaFilePickerImpl::onAutoExtensionChanged (bool bChecked) if ( bChecked ) { pExt = reinterpret_cast(sExt.getStr()); - pExt = wcschr( pExt, '.' ); + pExt = wcsrchr( pExt, '.' ); if ( pExt ) pExt++; } diff --git a/fpicker/source/win32/filepicker/VistaFilePickerImpl.hxx b/fpicker/source/win32/filepicker/VistaFilePickerImpl.hxx index 7550e977811e..6046876207fc 100644 --- a/fpicker/source/win32/filepicker/VistaFilePickerImpl.hxx +++ b/fpicker/source/win32/filepicker/VistaFilePickerImpl.hxx @@ -95,9 +95,10 @@ static const ::rtl::OUString PROP_DIALOG_SHOW_RESULT = ::rtl::OUString::createF static const ::rtl::OUString PROP_SELECTED_FILES = ::rtl::OUString::createFromAscii("selected_files" ); // [seq< OUString >] contains all user selected files (can be empty!) static const ::rtl::OUString PROP_MULTISELECTION_MODE = ::rtl::OUString::createFromAscii("multiselection_mode"); // [sal_Bool] true=ON, false=OFF static const ::rtl::OUString PROP_TITLE = ::rtl::OUString::createFromAscii("title" ); // [OUString] -static const ::rtl::OUString PROP_FILENAME = ::rtl::OUString::createFromAscii("filename" ); // [OUString] +static const ::rtl::OUString PROP_FILENAME = ::rtl::OUString::createFromAscii("filename" ); // [OUString] static const ::rtl::OUString PROP_DIRECTORY = ::rtl::OUString::createFromAscii("directory" ); // [OUString] static const ::rtl::OUString PROP_FEATURES = ::rtl::OUString::createFromAscii("features" ); // [sal_Int32] +static const ::rtl::OUString PROP_TEMPLATE_DESCR = ::rtl::OUString::createFromAscii("templatedescription"); // [sal_Int32] static const ::rtl::OUString PROP_FILTER_TITLE = ::rtl::OUString::createFromAscii("filter_title" ); // [OUString] static const ::rtl::OUString PROP_FILTER_VALUE = ::rtl::OUString::createFromAscii("filter_value" ); // [OUString] @@ -136,7 +137,9 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex E_SET_MULTISELECTION_MODE, E_SET_TITLE, E_SET_FILENAME, + E_GET_DIRECTORY, E_SET_DIRECTORY, + E_SET_DEFAULT_NAME, E_GET_SELECTED_FILES, E_SHOW_DIALOG_MODAL, E_SET_CONTROL_VALUE, @@ -211,6 +214,14 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex /// implementation of request E_SET_DIRECTORY void impl_sta_SetDirectory(const RequestRef& rRequest); + //--------------------------------------------------------------------- + /// implementation of request E_GET_DIRECTORY + void impl_sta_GetDirectory(const RequestRef& rRequest); + + //--------------------------------------------------------------------- + /// implementation of request E_SET_DEFAULT_NAME + void impl_sta_SetDefaultName(const RequestRef& rRequest); + //--------------------------------------------------------------------- /// implementation of request E_GET_SELECTED_FILES void impl_sta_getSelectedFiles(const RequestRef& rRequest); @@ -257,7 +268,7 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex * @param nFeatures * flag field(!) knows all features wich must be enabled. */ - void impl_sta_enableFeatures(::sal_Int32 nFeatures); + void impl_sta_enableFeatures(::sal_Int32 nFeatures, ::sal_Int32 nTemplate); //--------------------------------------------------------------------- /** returns an interface, which can be used to customize the internaly used @@ -276,6 +287,8 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex /// fill filter list of internal used dialog. void impl_sta_setFiltersOnDialog(); + void impl_SetDefaultExtension( const rtl::OUString& currentFilter ); + private: //--------------------------------------------------------------------- @@ -312,6 +325,15 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex //--------------------------------------------------------------------- /// @todo document me ::sal_Bool m_bInExecute; + + // handle to parent window + HWND m_hParentWindow; + + // + ::rtl::OUString m_sDirectory; + + // + ::rtl::OUString m_sFilename; }; } // namespace vista diff --git a/fpicker/source/win32/filepicker/asyncrequests.cxx b/fpicker/source/win32/filepicker/asyncrequests.cxx index cc7de0bdcc3b..4e277899e1cc 100644 --- a/fpicker/source/win32/filepicker/asyncrequests.cxx +++ b/fpicker/source/win32/filepicker/asyncrequests.cxx @@ -66,6 +66,12 @@ void Request::wait(::sal_Int32 nMilliSeconds) lcl_sleep(m_aJoiner, nMilliSeconds); } +void Request::waitProcessMessages() +{ + while (!m_aJoiner.check()) + Application::Yield(); +} + //----------------------------------------------------------------------------- void Request::notify() { @@ -94,6 +100,20 @@ AsyncRequests::~AsyncRequests() join(); } +void AsyncRequests::triggerRequestProcessMessages (const RequestRef& rRequest) +{ + // SYNCHRONIZED -> + ::osl::ResettableMutexGuard aLock(m_aMutex); + m_lRequests.push(rRequest); + aLock.clear(); + // <- SYNCHRONIZED + + if ( ! isRunning()) + create(); + + rRequest->waitProcessMessages(); +} + //----------------------------------------------------------------------------- void AsyncRequests::triggerRequestBlocked(const RequestRef& rRequest) { @@ -137,47 +157,22 @@ void AsyncRequests::triggerRequestDirectly(const RequestRef& rRequest) //----------------------------------------------------------------------------- void AsyncRequests::triggerRequestThreadAware(const RequestRef& rRequest, - ::sal_Bool bWait ) + ::sal_Int16 nWait ) { oslThreadIdentifier nOurThreadId = getIdentifier(); oslThreadIdentifier nCallerThreadId = ::osl::Thread::getCurrentIdentifier(); - if (nOurThreadId == nCallerThreadId) triggerRequestDirectly(rRequest); - else - if (bWait) + else if (nWait == BLOCKED) triggerRequestBlocked(rRequest); + else if (nWait == PROCESS_MESSAGES) + triggerRequestProcessMessages(rRequest); else triggerRequestNonBlocked(rRequest); } //----------------------------------------------------------------------------- -class SmallAsyncThread : private ::cppu::BaseMutex - , public ::osl::Thread -{ - public: - - SmallAsyncThread(const RequestHandlerRef& rHandler, - const RequestRef& rRequest) - : m_rHandler(rHandler) - , m_rRequest(rRequest) - {}; - - virtual ~SmallAsyncThread() {}; - - private: - - virtual void SAL_CALL run() - { - m_rHandler->doRequest(m_rRequest); - m_rRequest->notify(); - } - - private: - RequestHandlerRef m_rHandler; - RequestRef m_rRequest; -}; //----------------------------------------------------------------------------- void SAL_CALL AsyncRequests::run() @@ -222,10 +217,6 @@ void SAL_CALL AsyncRequests::run() { rHandler->doRequest(rRequest); rRequest->notify(); - /* - SmallAsyncThread* pThread = new SmallAsyncThread(rHandler, rRequest); - pThread->create(); - */ } } diff --git a/fpicker/source/win32/filepicker/asyncrequests.hxx b/fpicker/source/win32/filepicker/asyncrequests.hxx index 3234e7732111..0c726d8caa2d 100644 --- a/fpicker/source/win32/filepicker/asyncrequests.hxx +++ b/fpicker/source/win32/filepicker/asyncrequests.hxx @@ -122,6 +122,8 @@ class Request //--------------------------------------------------------------------- void wait(::sal_Int32 nMilliSeconds = WAIT_INFINITE); + void waitProcessMessages(); + //--------------------------------------------------------------------- void notify(); @@ -157,9 +159,9 @@ class AsyncRequests : private ::cppu::BaseMutex , public ::osl::Thread { public: - - static const ::sal_Bool BLOCKED = sal_True; - static const ::sal_Bool NON_BLOCKED = sal_False; + static const ::sal_Int16 PROCESS_MESSAGES = 2; + static const ::sal_Int16 BLOCKED = 1; + static const ::sal_Int16 NON_BLOCKED = 0; //--------------------------------------------------------------------- /** creates the new asynchronous request executor. @@ -176,6 +178,11 @@ class AsyncRequests : private ::cppu::BaseMutex */ virtual ~AsyncRequests(); + //--------------------------------------------------------------------- + /** @todo document me + */ + void triggerRequestProcessMessages (const RequestRef& rRequest); + //--------------------------------------------------------------------- /** @todo document me */ @@ -195,7 +202,7 @@ class AsyncRequests : private ::cppu::BaseMutex /** @todo document me */ void triggerRequestThreadAware(const RequestRef& rRequest, - ::sal_Bool bWait ); + ::sal_Int16 nWait ); private: -- cgit