summaryrefslogtreecommitdiff
path: root/fpicker
diff options
context:
space:
mode:
authorRĂ¼diger Timm <rt@openoffice.org>2008-12-11 16:34:19 +0000
committerRĂ¼diger Timm <rt@openoffice.org>2008-12-11 16:34:19 +0000
commit87255f7093f10a019eb2153f1a9b4e5ccf897baf (patch)
tree2636b89744a7a1a5985a33ef57f049b92ce0ccad /fpicker
parent3d38a29a12a892ecf127f9cff1b265b6bace1985 (diff)
CWS-TOOLING: integrate CWS hrovista3_DEV300
Diffstat (limited to 'fpicker')
-rw-r--r--fpicker/source/win32/filepicker/VistaFilePicker.cxx15
-rw-r--r--fpicker/source/win32/filepicker/VistaFilePickerEventHandler.cxx10
-rw-r--r--fpicker/source/win32/filepicker/VistaFilePickerImpl.cxx198
-rw-r--r--fpicker/source/win32/filepicker/VistaFilePickerImpl.hxx26
-rw-r--r--fpicker/source/win32/filepicker/asyncrequests.cxx59
-rw-r--r--fpicker/source/win32/filepicker/asyncrequests.hxx15
6 files changed, 264 insertions, 59 deletions
diff --git a/fpicker/source/win32/filepicker/VistaFilePicker.cxx b/fpicker/source/win32/filepicker/VistaFilePicker.cxx
index 0a70ba4510..b5f9d4b3be 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;
}
//-----------------------------------------------------------------------------------------
@@ -342,8 +347,10 @@ css::uno::Sequence< ::rtl::OUString > SAL_CALL VistaFilePicker::getSelectedFiles
{
RequestRef rRequest(new Request());
rRequest->setRequest (VistaFilePickerImpl::E_SHOW_DIALOG_MODAL);
+
+ // if we want to show a modal window, the calling thread needs to process messages
+ m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::PROCESS_MESSAGES);
- m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED);
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 34f890a6c7..56500cdc1a 100644
--- a/fpicker/source/win32/filepicker/VistaFilePickerEventHandler.cxx
+++ b/fpicker/source/win32/filepicker/VistaFilePickerEventHandler.cxx
@@ -42,6 +42,7 @@
#include <com/sun/star/embed/XStorage.hpp>
#include <com/sun/star/document/XDocumentRevisionListPersistence.hpp>
#include <com/sun/star/util/RevisionTag.hpp>
+#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
#include <comphelper/processfactory.hxx>
@@ -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 38cbc2eb97..37732bfcf4 100644
--- a/fpicker/source/win32/filepicker/VistaFilePickerImpl.cxx
+++ b/fpicker/source/win32/filepicker/VistaFilePickerImpl.cxx
@@ -36,10 +36,26 @@
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
#include <com/sun/star/ui/dialogs/ControlActions.hpp>
-
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
#include <comphelper/sequenceasvector.hxx>
#include <osl/file.hxx>
#include <osl/mutex.hxx>
+#include <Guiddef.h>
+
+ 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();
}
//-------------------------------------------------------------------------------
@@ -199,6 +229,14 @@ void VistaFilePickerImpl::doRequest(const RequestRef& rRequest)
case E_SET_DIRECTORY :
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);
@@ -324,7 +362,12 @@ 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<LPCTSTR>(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<LPCTSTR>(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<LPCTSTR>(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<LPCTSTR>(FilterExt.getStr()) );
+ }
+}
+
//-------------------------------------------------------------------------------
void VistaFilePickerImpl::onAutoExtensionChanged (bool bChecked)
@@ -934,7 +1106,7 @@ void VistaFilePickerImpl::onAutoExtensionChanged (bool bChecked)
if ( bChecked )
{
pExt = reinterpret_cast<LPCTSTR>(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 006db6b1a5..4a0145a241 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,
@@ -210,6 +213,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
@@ -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 7c57b2caa1..486d86a554 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 e9183197d5..0a7e5c2c15 100644
--- a/fpicker/source/win32/filepicker/asyncrequests.hxx
+++ b/fpicker/source/win32/filepicker/asyncrequests.hxx
@@ -121,6 +121,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.
@@ -175,6 +177,11 @@ class AsyncRequests : private ::cppu::BaseMutex
/** does nothing special / excepting to make sure our class wont be inline .-)
*/
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: