1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
25*b1cdbd2cSJim Jagielski // includes
26*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include "VistaFilePickerImpl.hxx"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ControlActions.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/StringPair.hpp>
34*b1cdbd2cSJim Jagielski #include <comphelper/sequenceasvector.hxx>
35*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
36*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
37*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
38*b1cdbd2cSJim Jagielski #include <limits.h>
39*b1cdbd2cSJim Jagielski #endif
40*b1cdbd2cSJim Jagielski #include "..\misc\WinImplHelper.hxx"
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <Shlguid.h>
43*b1cdbd2cSJim Jagielski 
is_current_process_window(HWND hwnd)44*b1cdbd2cSJim Jagielski  inline bool is_current_process_window(HWND hwnd)
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski     DWORD pid;
47*b1cdbd2cSJim Jagielski     GetWindowThreadProcessId(hwnd, &pid);
48*b1cdbd2cSJim Jagielski     return (pid == GetCurrentProcessId());
49*b1cdbd2cSJim Jagielski }
50*b1cdbd2cSJim Jagielski 
choose_parent_window()51*b1cdbd2cSJim Jagielski HWND choose_parent_window()
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski     HWND hwnd_parent = GetForegroundWindow();
54*b1cdbd2cSJim Jagielski     if (!is_current_process_window(hwnd_parent))
55*b1cdbd2cSJim Jagielski        hwnd_parent = GetDesktopWindow();
56*b1cdbd2cSJim Jagielski     return hwnd_parent;
57*b1cdbd2cSJim Jagielski }
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
60*b1cdbd2cSJim Jagielski // namespace
61*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski namespace fpicker{
64*b1cdbd2cSJim Jagielski namespace win32{
65*b1cdbd2cSJim Jagielski namespace vista{
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
70*b1cdbd2cSJim Jagielski // types, const etcpp.
71*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski static const ::sal_Int16 INVALID_CONTROL_ID     = -1;
75*b1cdbd2cSJim Jagielski static const ::sal_Int16 INVALID_CONTROL_ACTION = -1;
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski typedef ::comphelper::SequenceAsVector< ::rtl::OUString > TStringList;
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski // Guids used for IFileDialog::SetClientGuid
80*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILEDIALOG_SIMPLE		= {0xB8628FD3, 0xA3F5, 0x4845, 0x9B, 0x62, 0xD5, 0x1E, 0xDF, 0x97, 0xC4, 0x83};
81*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILEDIALOG_OPTIONS		= {0x93ED486F, 0x0D04, 0x4807, 0x8C, 0x44, 0xAC, 0x26, 0xCB, 0x6C, 0x5D, 0x36};
82*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILESAVE					= {0x3B2E2261, 0x402D, 0x4049, 0xB0, 0xC0, 0x91, 0x13, 0xF8, 0x6E, 0x84, 0x7C};
83*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILESAVE_PASSWORD		= {0xC12D4F4C, 0x4D41, 0x4D4F, 0x97, 0xEF, 0x87, 0xF9, 0x8D, 0xB6, 0x1E, 0xA6};
84*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILESAVE_SELECTION		= {0x5B2482B3, 0x0358, 0x4E09, 0xAA, 0x64, 0x2B, 0x76, 0xB2, 0xA0, 0xDD, 0xFE};
85*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILESAVE_TEMPLATE		= {0x9996D877, 0x20D5, 0x424B, 0x9C, 0x2E, 0xD3, 0xB6, 0x31, 0xEC, 0xF7, 0xCE};
86*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILEOPEN_LINK_TEMPLATE	= {0x32237796, 0x1509, 0x49D1, 0xBB, 0x7E, 0x63, 0xAD, 0x36, 0xAE, 0x86, 0x8C};
87*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILEOPEN_PLAY			= {0x32CFB147, 0xF5AE, 0x4F90, 0xA1, 0xF1, 0x81, 0x20, 0x72, 0xBB, 0x2F, 0xC5};
88*b1cdbd2cSJim Jagielski static const GUID CLIENTID_FILEOPEN_LINK			= {0x39AC4BAE, 0x7D2D, 0x46BC, 0xBE, 0x2E, 0xF8, 0x8C, 0xB5, 0x65, 0x5E, 0x6A};
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
lcl_getURLFromShellItem(IShellItem * pItem)91*b1cdbd2cSJim Jagielski ::rtl::OUString lcl_getURLFromShellItem (IShellItem* pItem)
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski     LPOLESTR pStr = NULL;
94*b1cdbd2cSJim Jagielski 	::rtl::OUString sURL;
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 	SIGDN   eConversion = SIGDN_FILESYSPATH;
97*b1cdbd2cSJim Jagielski     HRESULT hr          = pItem->GetDisplayName ( eConversion, &pStr );
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski     if ( FAILED(hr) )
100*b1cdbd2cSJim Jagielski 	{
101*b1cdbd2cSJim Jagielski 		eConversion = SIGDN_URL;
102*b1cdbd2cSJim Jagielski 		hr          = pItem->GetDisplayName ( eConversion, &pStr );
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 		if ( FAILED(hr) )
105*b1cdbd2cSJim Jagielski 			return ::rtl::OUString();
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 		sURL = ::rtl::OUString(reinterpret_cast<sal_Unicode*>(pStr));
108*b1cdbd2cSJim Jagielski 	}
109*b1cdbd2cSJim Jagielski 	else
110*b1cdbd2cSJim Jagielski 	{
111*b1cdbd2cSJim Jagielski 		::osl::FileBase::getFileURLFromSystemPath( reinterpret_cast<sal_Unicode*>(pStr), sURL );
112*b1cdbd2cSJim Jagielski 	}
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     CoTaskMemFree (pStr);
115*b1cdbd2cSJim Jagielski     return sURL;
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------------------
lcl_buildFilterList(CFilterContainer & rContainer)119*b1cdbd2cSJim Jagielski ::std::vector< COMDLG_FILTERSPEC > lcl_buildFilterList(CFilterContainer& rContainer)
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski     const sal_Int32                          c      = rContainer.numFilter();
122*b1cdbd2cSJim Jagielski           sal_Int32                          i      = 0;
123*b1cdbd2cSJim Jagielski           ::std::vector< COMDLG_FILTERSPEC > lList  ;
124*b1cdbd2cSJim Jagielski           CFilterContainer::FILTER_ENTRY_T   aFilter;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski     rContainer.beginEnumFilter( );
127*b1cdbd2cSJim Jagielski 	while( rContainer.getNextFilter(aFilter) )
128*b1cdbd2cSJim Jagielski     {
129*b1cdbd2cSJim Jagielski         COMDLG_FILTERSPEC aSpec;
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 		aSpec.pszName = reinterpret_cast<LPCTSTR>(aFilter.first.getStr()) ;
132*b1cdbd2cSJim Jagielski 		aSpec.pszSpec = reinterpret_cast<LPCTSTR>(aFilter.second.getStr());
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski         lList.push_back(aSpec);
135*b1cdbd2cSJim Jagielski     }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski     return lList;
138*b1cdbd2cSJim Jagielski }
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------------------
VistaFilePickerImpl()141*b1cdbd2cSJim Jagielski VistaFilePickerImpl::VistaFilePickerImpl()
142*b1cdbd2cSJim Jagielski     : m_iDialogOpen  ()
143*b1cdbd2cSJim Jagielski     , m_iDialogSave  ()
144*b1cdbd2cSJim Jagielski     , m_hLastResult  ()
145*b1cdbd2cSJim Jagielski     , m_lFilters     ()
146*b1cdbd2cSJim Jagielski     , m_lLastFiles   ()
147*b1cdbd2cSJim Jagielski     , m_iEventHandler(new VistaFilePickerEventHandler(this))
148*b1cdbd2cSJim Jagielski     , m_bInExecute   (sal_False)
149*b1cdbd2cSJim Jagielski     , m_bWasExecuted (sal_False)
150*b1cdbd2cSJim Jagielski 	, m_sDirectory   ()
151*b1cdbd2cSJim Jagielski 	, m_sFilename    ()
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski 	m_hParentWindow = choose_parent_window();
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
~VistaFilePickerImpl()157*b1cdbd2cSJim Jagielski VistaFilePickerImpl::~VistaFilePickerImpl()
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
before()162*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::before()
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
165*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     // TRICKY .-)
168*b1cdbd2cSJim Jagielski     // osl::Thread class initializes COm already in MTA mode because it's needed
169*b1cdbd2cSJim Jagielski     // by VCL and UNO so. There is no way to change that from outside ...
170*b1cdbd2cSJim Jagielski     // but we need a STA environment ...
171*b1cdbd2cSJim Jagielski     // So we make it by try-and-error ...
172*b1cdbd2cSJim Jagielski     // If first CoInitialize will fail .. we unitialize COM initialize it new .-)
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski     m_hLastResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
175*b1cdbd2cSJim Jagielski     if ( FAILED(m_hLastResult) )
176*b1cdbd2cSJim Jagielski     {
177*b1cdbd2cSJim Jagielski         CoUninitialize();
178*b1cdbd2cSJim Jagielski         m_hLastResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
179*b1cdbd2cSJim Jagielski     }
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
doRequest(const RequestRef & rRequest)183*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::doRequest(const RequestRef& rRequest)
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski     try
186*b1cdbd2cSJim Jagielski     {
187*b1cdbd2cSJim Jagielski         switch(rRequest->getRequest())
188*b1cdbd2cSJim Jagielski         {
189*b1cdbd2cSJim Jagielski             case E_ADD_PICKER_LISTENER :
190*b1cdbd2cSJim Jagielski                     impl_sta_addFilePickerListener(rRequest);
191*b1cdbd2cSJim Jagielski                     break;
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski             case E_REMOVE_PICKER_LISTENER :
194*b1cdbd2cSJim Jagielski                     impl_sta_removeFilePickerListener(rRequest);
195*b1cdbd2cSJim Jagielski                     break;
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski             case E_APPEND_FILTER :
198*b1cdbd2cSJim Jagielski                     impl_sta_appendFilter(rRequest);
199*b1cdbd2cSJim Jagielski                     break;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 			case E_APPEND_FILTERGROUP :
202*b1cdbd2cSJim Jagielski 					impl_sta_appendFilterGroup(rRequest);
203*b1cdbd2cSJim Jagielski 					break;
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 			case E_SET_CURRENT_FILTER :
206*b1cdbd2cSJim Jagielski                     impl_sta_setCurrentFilter(rRequest);
207*b1cdbd2cSJim Jagielski                     break;
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski             case E_GET_CURRENT_FILTER :
210*b1cdbd2cSJim Jagielski                     impl_sta_getCurrentFilter(rRequest);
211*b1cdbd2cSJim Jagielski                     break;
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski             case E_CREATE_OPEN_DIALOG :
214*b1cdbd2cSJim Jagielski                     impl_sta_CreateOpenDialog(rRequest);
215*b1cdbd2cSJim Jagielski                     break;
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski             case E_CREATE_SAVE_DIALOG :
218*b1cdbd2cSJim Jagielski                     impl_sta_CreateSaveDialog(rRequest);
219*b1cdbd2cSJim Jagielski                     break;
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski             case E_SET_MULTISELECTION_MODE :
222*b1cdbd2cSJim Jagielski                     impl_sta_SetMultiSelectionMode(rRequest);
223*b1cdbd2cSJim Jagielski                     break;
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski             case E_SET_TITLE :
226*b1cdbd2cSJim Jagielski                     impl_sta_SetTitle(rRequest);
227*b1cdbd2cSJim Jagielski                     break;
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 			case E_SET_FILENAME:
230*b1cdbd2cSJim Jagielski 				impl_sta_SetFileName(rRequest);
231*b1cdbd2cSJim Jagielski 				break;
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski             case E_SET_DIRECTORY :
234*b1cdbd2cSJim Jagielski                     impl_sta_SetDirectory(rRequest);
235*b1cdbd2cSJim Jagielski                     break;
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 			case E_GET_DIRECTORY :
238*b1cdbd2cSJim Jagielski 					impl_sta_GetDirectory(rRequest);
239*b1cdbd2cSJim Jagielski 					break;
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 			case E_SET_DEFAULT_NAME :
242*b1cdbd2cSJim Jagielski 					impl_sta_SetDefaultName(rRequest);
243*b1cdbd2cSJim Jagielski 					break;
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski             case E_GET_SELECTED_FILES :
246*b1cdbd2cSJim Jagielski                     impl_sta_getSelectedFiles(rRequest);
247*b1cdbd2cSJim Jagielski                     break;
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski             case E_SHOW_DIALOG_MODAL :
250*b1cdbd2cSJim Jagielski                     impl_sta_ShowDialogModal(rRequest);
251*b1cdbd2cSJim Jagielski                     break;
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski             case E_SET_CONTROL_VALUE :
254*b1cdbd2cSJim Jagielski                     impl_sta_SetControlValue(rRequest);
255*b1cdbd2cSJim Jagielski                     break;
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski             case E_GET_CONTROL_VALUE :
258*b1cdbd2cSJim Jagielski                     impl_sta_GetControlValue(rRequest);
259*b1cdbd2cSJim Jagielski                     break;
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski             case E_SET_CONTROL_LABEL :
262*b1cdbd2cSJim Jagielski                     impl_sta_SetControlLabel(rRequest);
263*b1cdbd2cSJim Jagielski                     break;
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski             case E_GET_CONTROL_LABEL :
266*b1cdbd2cSJim Jagielski                     impl_sta_GetControlLabel(rRequest);
267*b1cdbd2cSJim Jagielski                     break;
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski             case E_ENABLE_CONTROL :
270*b1cdbd2cSJim Jagielski                     impl_sta_EnableControl(rRequest);
271*b1cdbd2cSJim Jagielski                     break;
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski             // no default: let the compiler detect changes on enum ERequest !
274*b1cdbd2cSJim Jagielski         }
275*b1cdbd2cSJim Jagielski     }
276*b1cdbd2cSJim Jagielski     catch(...)
277*b1cdbd2cSJim Jagielski     {}
278*b1cdbd2cSJim Jagielski }
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
after()281*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::after()
282*b1cdbd2cSJim Jagielski {
283*b1cdbd2cSJim Jagielski     CoUninitialize();
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_addFilePickerListener(const RequestRef & rRequest)287*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_addFilePickerListener(const RequestRef& rRequest)
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski     // SYNCHRONIZED outside !
290*b1cdbd2cSJim Jagielski     const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest->getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >());
291*b1cdbd2cSJim Jagielski     if ( ! xListener.is())
292*b1cdbd2cSJim Jagielski         return;
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
295*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
296*b1cdbd2cSJim Jagielski     TFileDialogEvents iHandler = m_iEventHandler;
297*b1cdbd2cSJim Jagielski     aLock.clear();
298*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski     VistaFilePickerEventHandler* pHandlerImpl = (VistaFilePickerEventHandler*)iHandler.get();
301*b1cdbd2cSJim Jagielski     if (pHandlerImpl)
302*b1cdbd2cSJim Jagielski         pHandlerImpl->addFilePickerListener(xListener);
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_removeFilePickerListener(const RequestRef & rRequest)306*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_removeFilePickerListener(const RequestRef& rRequest)
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski     // SYNCHRONIZED outside !
309*b1cdbd2cSJim Jagielski     const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest->getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >());
310*b1cdbd2cSJim Jagielski     if ( ! xListener.is())
311*b1cdbd2cSJim Jagielski         return;
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
314*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
315*b1cdbd2cSJim Jagielski     TFileDialogEvents iHandler = m_iEventHandler;
316*b1cdbd2cSJim Jagielski     aLock.clear();
317*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski     VistaFilePickerEventHandler* pHandlerImpl = (VistaFilePickerEventHandler*)iHandler.get();
320*b1cdbd2cSJim Jagielski     if (pHandlerImpl)
321*b1cdbd2cSJim Jagielski         pHandlerImpl->removeFilePickerListener(xListener);
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_appendFilter(const RequestRef & rRequest)325*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_appendFilter(const RequestRef& rRequest)
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski     const ::rtl::OUString sTitle  = rRequest->getArgumentOrDefault(PROP_FILTER_TITLE, ::rtl::OUString());
328*b1cdbd2cSJim Jagielski     const ::rtl::OUString sFilter = rRequest->getArgumentOrDefault(PROP_FILTER_VALUE, ::rtl::OUString());
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
331*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski     m_lFilters.addFilter(sTitle, sFilter);
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_appendFilterGroup(const RequestRef & rRequest)337*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_appendFilterGroup(const RequestRef& rRequest)
338*b1cdbd2cSJim Jagielski {
339*b1cdbd2cSJim Jagielski 	const css::uno::Sequence< css::beans::StringPair > aFilterGroup  =
340*b1cdbd2cSJim Jagielski 		rRequest->getArgumentOrDefault(PROP_FILTER_GROUP, css::uno::Sequence< css::beans::StringPair >());
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
343*b1cdbd2cSJim Jagielski 	::rtl::OUString aEmpty;
344*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski     if ( m_lFilters.numFilter() > 0 && aFilterGroup.getLength() > 0 )
347*b1cdbd2cSJim Jagielski 		m_lFilters.addFilter( STRING_SEPARATOR, aEmpty, sal_True );
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 	::sal_Int32 c = aFilterGroup.getLength();
350*b1cdbd2cSJim Jagielski     ::sal_Int32 i = 0;
351*b1cdbd2cSJim Jagielski     for (i=0; i<c; ++i)
352*b1cdbd2cSJim Jagielski     {
353*b1cdbd2cSJim Jagielski         const css::beans::StringPair& rFilter = aFilterGroup[i];
354*b1cdbd2cSJim Jagielski         m_lFilters.addFilter(rFilter.First, rFilter.Second);
355*b1cdbd2cSJim Jagielski     }
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_setCurrentFilter(const RequestRef & rRequest)359*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_setCurrentFilter(const RequestRef& rRequest)
360*b1cdbd2cSJim Jagielski {
361*b1cdbd2cSJim Jagielski     const ::rtl::OUString sTitle  = rRequest->getArgumentOrDefault(PROP_FILTER_TITLE, ::rtl::OUString());
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
364*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski     m_lFilters.setCurrentFilter(sTitle);
367*b1cdbd2cSJim Jagielski }
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_getCurrentFilter(const RequestRef & rRequest)370*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_getCurrentFilter(const RequestRef& rRequest)
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski     TFileDialog iDialog = impl_getBaseDialogInterface();
373*b1cdbd2cSJim Jagielski     UINT        nIndex  = UINT_MAX;
374*b1cdbd2cSJim Jagielski     HRESULT     hResult = iDialog->GetFileTypeIndex(&nIndex);
375*b1cdbd2cSJim Jagielski     if (
376*b1cdbd2cSJim Jagielski         ( FAILED(hResult)    ) ||
377*b1cdbd2cSJim Jagielski         ( nIndex == UINT_MAX )      // COM dialog sometimes return S_OK for empty filter lists .-(
378*b1cdbd2cSJim Jagielski        )
379*b1cdbd2cSJim Jagielski         return;
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
382*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     ::rtl::OUString sTitle;
385*b1cdbd2cSJim Jagielski     ::sal_Int32     nRealIndex = (nIndex-1); // COM dialog base on 1 ... filter container on 0 .-)
386*b1cdbd2cSJim Jagielski     if (
387*b1cdbd2cSJim Jagielski         (nRealIndex >= 0                         ) &&
388*b1cdbd2cSJim Jagielski         (m_lFilters.getFilter(nRealIndex, sTitle))
389*b1cdbd2cSJim Jagielski        )
390*b1cdbd2cSJim Jagielski         rRequest->setArgument(PROP_FILTER_TITLE, sTitle);
391*b1cdbd2cSJim Jagielski 	else if ( nRealIndex == -1 ) // Dialog not visible yet
392*b1cdbd2cSJim Jagielski 	{
393*b1cdbd2cSJim Jagielski 		sTitle = m_lFilters.getCurrentFilter();
394*b1cdbd2cSJim Jagielski         rRequest->setArgument(PROP_FILTER_TITLE, sTitle);
395*b1cdbd2cSJim Jagielski 	}
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski     aLock.clear();
398*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_CreateOpenDialog(const RequestRef & rRequest)402*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_CreateOpenDialog(const RequestRef& rRequest)
403*b1cdbd2cSJim Jagielski {
404*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
405*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski     m_hLastResult = m_iDialogOpen.create();
408*b1cdbd2cSJim Jagielski     if (FAILED(m_hLastResult))
409*b1cdbd2cSJim Jagielski         return;
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski     TFileDialog iDialog;
412*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
413*b1cdbd2cSJim Jagielski     m_iDialogOpen->QueryInterface(IID_IFileDialog, (void **)(&iDialog));
414*b1cdbd2cSJim Jagielski #else
415*b1cdbd2cSJim Jagielski     m_iDialogOpen.query(&iDialog);
416*b1cdbd2cSJim Jagielski #endif
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski     TFileDialogEvents iHandler = m_iEventHandler;
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski     aLock.clear();
421*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski 	DWORD nFlags = 0;
424*b1cdbd2cSJim Jagielski     iDialog->GetOptions ( &nFlags );
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski     nFlags &= ~FOS_FORCESHOWHIDDEN;
427*b1cdbd2cSJim Jagielski     nFlags |=  FOS_PATHMUSTEXIST;
428*b1cdbd2cSJim Jagielski     nFlags |=  FOS_FILEMUSTEXIST;
429*b1cdbd2cSJim Jagielski     nFlags |=  FOS_OVERWRITEPROMPT;
430*b1cdbd2cSJim Jagielski     nFlags |=  FOS_DONTADDTORECENT;
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski     iDialog->SetOptions ( nFlags );
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski     ::sal_Int32 nFeatures = rRequest->getArgumentOrDefault(PROP_FEATURES, (::sal_Int32)0);
435*b1cdbd2cSJim Jagielski 	::sal_Int32 nTemplate = rRequest->getArgumentOrDefault(PROP_TEMPLATE_DESCR, (::sal_Int32)0);
436*b1cdbd2cSJim Jagielski     impl_sta_enableFeatures(nFeatures, nTemplate);
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski     VistaFilePickerEventHandler* pHandlerImpl = (VistaFilePickerEventHandler*)iHandler.get();
439*b1cdbd2cSJim Jagielski     if (pHandlerImpl)
440*b1cdbd2cSJim Jagielski         pHandlerImpl->startListening(iDialog);
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_CreateSaveDialog(const RequestRef & rRequest)444*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_CreateSaveDialog(const RequestRef& rRequest)
445*b1cdbd2cSJim Jagielski {
446*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
447*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski     m_hLastResult = m_iDialogSave.create();
450*b1cdbd2cSJim Jagielski     if (FAILED(m_hLastResult))
451*b1cdbd2cSJim Jagielski         return;
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski     TFileDialogEvents  iHandler = m_iEventHandler;
454*b1cdbd2cSJim Jagielski     TFileDialog        iDialog;
455*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
456*b1cdbd2cSJim Jagielski     m_iDialogSave->QueryInterface(IID_IFileDialog, (void **)(&iDialog));
457*b1cdbd2cSJim Jagielski #else
458*b1cdbd2cSJim Jagielski     m_iDialogSave.query(&iDialog);
459*b1cdbd2cSJim Jagielski #endif
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski     aLock.clear();
462*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	DWORD nFlags = 0;
465*b1cdbd2cSJim Jagielski     iDialog->GetOptions ( &nFlags );
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski     nFlags &= ~FOS_FORCESHOWHIDDEN;
468*b1cdbd2cSJim Jagielski     nFlags |=  FOS_PATHMUSTEXIST;
469*b1cdbd2cSJim Jagielski     nFlags |=  FOS_FILEMUSTEXIST;
470*b1cdbd2cSJim Jagielski     nFlags |=  FOS_OVERWRITEPROMPT;
471*b1cdbd2cSJim Jagielski     nFlags |=  FOS_DONTADDTORECENT;
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski     iDialog->SetOptions ( nFlags );
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski     ::sal_Int32 nFeatures = rRequest->getArgumentOrDefault(PROP_FEATURES, (::sal_Int32)0);
476*b1cdbd2cSJim Jagielski 	::sal_Int32 nTemplate = rRequest->getArgumentOrDefault(PROP_TEMPLATE_DESCR, (::sal_Int32)0);
477*b1cdbd2cSJim Jagielski     impl_sta_enableFeatures(nFeatures, nTemplate);
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski     VistaFilePickerEventHandler* pHandlerImpl = (VistaFilePickerEventHandler*)iHandler.get();
480*b1cdbd2cSJim Jagielski     if (pHandlerImpl)
481*b1cdbd2cSJim Jagielski         pHandlerImpl->startListening(iDialog);
482*b1cdbd2cSJim Jagielski }
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
485*b1cdbd2cSJim Jagielski static const ::sal_Int32 GROUP_VERSION         =   1;
486*b1cdbd2cSJim Jagielski static const ::sal_Int32 GROUP_TEMPLATE        =   2;
487*b1cdbd2cSJim Jagielski static const ::sal_Int32 GROUP_IMAGETEMPLATE   =   3;
488*b1cdbd2cSJim Jagielski static const ::sal_Int32 GROUP_CHECKBOXES      =   4;
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
setLabelToControl(CResourceProvider & rResourceProvider,TFileDialogCustomize iCustom,sal_uInt16 nControlId)491*b1cdbd2cSJim Jagielski static void setLabelToControl(CResourceProvider& rResourceProvider, TFileDialogCustomize iCustom, sal_uInt16 nControlId)
492*b1cdbd2cSJim Jagielski {
493*b1cdbd2cSJim Jagielski     ::rtl::OUString aLabel = rResourceProvider.getResString(nControlId);
494*b1cdbd2cSJim Jagielski     aLabel = SOfficeToWindowsLabel(aLabel);
495*b1cdbd2cSJim Jagielski     iCustom->SetControlLabel(nControlId, reinterpret_cast<LPCWSTR>(aLabel.getStr()) );
496*b1cdbd2cSJim Jagielski }
497*b1cdbd2cSJim Jagielski 
498*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_enableFeatures(::sal_Int32 nFeatures,::sal_Int32 nTemplate)499*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_enableFeatures(::sal_Int32 nFeatures, ::sal_Int32 nTemplate)
500*b1cdbd2cSJim Jagielski {
501*b1cdbd2cSJim Jagielski 	GUID aGUID = {};
502*b1cdbd2cSJim Jagielski 	switch (nTemplate)
503*b1cdbd2cSJim Jagielski 	{
504*b1cdbd2cSJim Jagielski         case css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE :
505*b1cdbd2cSJim Jagielski         case css::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE :
506*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILEDIALOG_SIMPLE;
507*b1cdbd2cSJim Jagielski 			break;
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski 		case css::ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION :
510*b1cdbd2cSJim Jagielski         case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS :
511*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILEDIALOG_OPTIONS;
512*b1cdbd2cSJim Jagielski 			break;
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 		case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION :
515*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILESAVE;
516*b1cdbd2cSJim Jagielski 			break;
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski 		case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD :
519*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILESAVE_PASSWORD;
520*b1cdbd2cSJim Jagielski 			break;
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski         case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_SELECTION :
523*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILESAVE_SELECTION;
524*b1cdbd2cSJim Jagielski 			break;
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski         case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_TEMPLATE :
527*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILESAVE_TEMPLATE;
528*b1cdbd2cSJim Jagielski 			break;
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski         case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE :
531*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILEOPEN_LINK_TEMPLATE;
532*b1cdbd2cSJim Jagielski 			break;
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski         case css::ui::dialogs::TemplateDescription::FILEOPEN_PLAY :
535*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILEOPEN_PLAY;
536*b1cdbd2cSJim Jagielski 			break;
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski         case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW :
539*b1cdbd2cSJim Jagielski 			aGUID = CLIENTID_FILEOPEN_LINK;
540*b1cdbd2cSJim Jagielski 			break;
541*b1cdbd2cSJim Jagielski     }
542*b1cdbd2cSJim Jagielski 	TFileDialog iDialog = impl_getBaseDialogInterface();
543*b1cdbd2cSJim Jagielski 	iDialog->SetClientGuid ( aGUID );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski     TFileDialogCustomize iCustom = impl_getCustomizeInterface();
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_VERSION) == FEATURE_VERSION)
548*b1cdbd2cSJim Jagielski     {
549*b1cdbd2cSJim Jagielski         iCustom->StartVisualGroup (GROUP_VERSION, L"Version");
550*b1cdbd2cSJim Jagielski         iCustom->AddComboBox      (css::ui::dialogs::ExtendedFilePickerElementIds::LISTBOX_VERSION);
551*b1cdbd2cSJim Jagielski         iCustom->EndVisualGroup   ();
552*b1cdbd2cSJim Jagielski         iCustom->MakeProminent    (GROUP_VERSION);
553*b1cdbd2cSJim Jagielski     }
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_TEMPLATE) == FEATURE_TEMPLATE)
556*b1cdbd2cSJim Jagielski     {
557*b1cdbd2cSJim Jagielski         iCustom->StartVisualGroup (GROUP_TEMPLATE, L"Template");
558*b1cdbd2cSJim Jagielski         iCustom->AddComboBox      (css::ui::dialogs::ExtendedFilePickerElementIds::LISTBOX_TEMPLATE);
559*b1cdbd2cSJim Jagielski         iCustom->EndVisualGroup   ();
560*b1cdbd2cSJim Jagielski         iCustom->MakeProminent    (GROUP_TEMPLATE);
561*b1cdbd2cSJim Jagielski     }
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_IMAGETEMPLATE) == FEATURE_IMAGETEMPLATE)
564*b1cdbd2cSJim Jagielski     {
565*b1cdbd2cSJim Jagielski         iCustom->StartVisualGroup (GROUP_IMAGETEMPLATE, L"Style");
566*b1cdbd2cSJim Jagielski         iCustom->AddComboBox      (css::ui::dialogs::ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE);
567*b1cdbd2cSJim Jagielski         iCustom->EndVisualGroup   ();
568*b1cdbd2cSJim Jagielski         iCustom->MakeProminent    (GROUP_IMAGETEMPLATE);
569*b1cdbd2cSJim Jagielski     }
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski 	iCustom->StartVisualGroup (GROUP_CHECKBOXES, L"");
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski     sal_uInt16 nControlId(0);
574*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_AUTOEXTENSION) == FEATURE_AUTOEXTENSION)
575*b1cdbd2cSJim Jagielski     {
576*b1cdbd2cSJim Jagielski         nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION;
577*b1cdbd2cSJim Jagielski         iCustom->AddCheckButton (nControlId, L"Auto Extension", true);
578*b1cdbd2cSJim Jagielski         setLabelToControl(m_ResProvider, iCustom, nControlId);
579*b1cdbd2cSJim Jagielski     }
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_PASSWORD) == FEATURE_PASSWORD)
582*b1cdbd2cSJim Jagielski     {
583*b1cdbd2cSJim Jagielski         nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PASSWORD;
584*b1cdbd2cSJim Jagielski         iCustom->AddCheckButton (nControlId, L"Password", false);
585*b1cdbd2cSJim Jagielski         setLabelToControl(m_ResProvider, iCustom, nControlId);
586*b1cdbd2cSJim Jagielski     }
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_READONLY) == FEATURE_READONLY)
589*b1cdbd2cSJim Jagielski     {
590*b1cdbd2cSJim Jagielski         nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY;
591*b1cdbd2cSJim Jagielski         iCustom->AddCheckButton (nControlId, L"Readonly", false);
592*b1cdbd2cSJim Jagielski         setLabelToControl(m_ResProvider, iCustom, nControlId);
593*b1cdbd2cSJim Jagielski     }
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_FILTEROPTIONS) == FEATURE_FILTEROPTIONS)
596*b1cdbd2cSJim Jagielski     {
597*b1cdbd2cSJim Jagielski         nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS;
598*b1cdbd2cSJim Jagielski         iCustom->AddCheckButton (nControlId, L"Filter Options", false);
599*b1cdbd2cSJim Jagielski         setLabelToControl(m_ResProvider, iCustom, nControlId);
600*b1cdbd2cSJim Jagielski     }
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_LINK) == FEATURE_LINK)
603*b1cdbd2cSJim Jagielski     {
604*b1cdbd2cSJim Jagielski         nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK;
605*b1cdbd2cSJim Jagielski         iCustom->AddCheckButton (nControlId, L"Link", false);
606*b1cdbd2cSJim Jagielski         setLabelToControl(m_ResProvider, iCustom, nControlId);
607*b1cdbd2cSJim Jagielski     }
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_SELECTION) == FEATURE_SELECTION)
610*b1cdbd2cSJim Jagielski     {
611*b1cdbd2cSJim Jagielski         nControlId = css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION;
612*b1cdbd2cSJim Jagielski         iCustom->AddCheckButton (nControlId, L"Selection", false);
613*b1cdbd2cSJim Jagielski         setLabelToControl(m_ResProvider, iCustom, nControlId);
614*b1cdbd2cSJim Jagielski     }
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski     /* can be ignored ... new COM dialog supports preview native now  !
617*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_PREVIEW) == FEATURE_PREVIEW)
618*b1cdbd2cSJim Jagielski         iCustom->AddCheckButton (css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, L"Preview", false);
619*b1cdbd2cSJim Jagielski     */
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski 	iCustom->EndVisualGroup();
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski     if ((nFeatures & FEATURE_PLAY) == FEATURE_PLAY)
624*b1cdbd2cSJim Jagielski         iCustom->AddPushButton (css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, L"Play");
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski }
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_SetMultiSelectionMode(const RequestRef & rRequest)629*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_SetMultiSelectionMode(const RequestRef& rRequest)
630*b1cdbd2cSJim Jagielski {
631*b1cdbd2cSJim Jagielski     const ::sal_Bool bMultiSelection = rRequest->getArgumentOrDefault(PROP_MULTISELECTION_MODE, (::sal_Bool)sal_True);
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
634*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
635*b1cdbd2cSJim Jagielski     TFileDialog iDialog = impl_getBaseDialogInterface();
636*b1cdbd2cSJim Jagielski     aLock.clear();
637*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski 	DWORD nFlags = 0;
640*b1cdbd2cSJim Jagielski     m_hLastResult = iDialog->GetOptions ( &nFlags );
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski     if (bMultiSelection)
643*b1cdbd2cSJim Jagielski         nFlags |=  FOS_ALLOWMULTISELECT;
644*b1cdbd2cSJim Jagielski     else
645*b1cdbd2cSJim Jagielski         nFlags &= ~FOS_ALLOWMULTISELECT;
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski     iDialog->SetOptions ( nFlags );
648*b1cdbd2cSJim Jagielski }
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_SetTitle(const RequestRef & rRequest)651*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_SetTitle(const RequestRef& rRequest)
652*b1cdbd2cSJim Jagielski {
653*b1cdbd2cSJim Jagielski     ::rtl::OUString sTitle = rRequest->getArgumentOrDefault(PROP_TITLE, ::rtl::OUString());
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
656*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
657*b1cdbd2cSJim Jagielski     TFileDialog iDialog = impl_getBaseDialogInterface();
658*b1cdbd2cSJim Jagielski     aLock.clear();
659*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski     iDialog->SetTitle(reinterpret_cast<LPCTSTR>(sTitle.getStr()));
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_SetFileName(const RequestRef & rRequest)665*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_SetFileName(const RequestRef& rRequest)
666*b1cdbd2cSJim Jagielski {
667*b1cdbd2cSJim Jagielski     ::rtl::OUString sFileName = rRequest->getArgumentOrDefault(PROP_FILENAME, ::rtl::OUString());
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
670*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
671*b1cdbd2cSJim Jagielski     TFileDialog iDialog = impl_getBaseDialogInterface();
672*b1cdbd2cSJim Jagielski     aLock.clear();
673*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski     iDialog->SetFileName(reinterpret_cast<LPCTSTR>(sFileName.getStr()));
676*b1cdbd2cSJim Jagielski }
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_SetDirectory(const RequestRef & rRequest)679*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_SetDirectory(const RequestRef& rRequest)
680*b1cdbd2cSJim Jagielski {
681*b1cdbd2cSJim Jagielski     ::rtl::OUString sDirectory = rRequest->getArgumentOrDefault(PROP_DIRECTORY, ::rtl::OUString());
682*b1cdbd2cSJim Jagielski     bool            bForce     = rRequest->getArgumentOrDefault(PROP_FORCE, false);
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 	if( !m_bInExecute)
685*b1cdbd2cSJim Jagielski 	{
686*b1cdbd2cSJim Jagielski 		// Vista stores last used folders for file dialogs
687*b1cdbd2cSJim Jagielski 		// so we don't want the application to change the folder
688*b1cdbd2cSJim Jagielski 		// in most cases.
689*b1cdbd2cSJim Jagielski 		// Store the requested folder in the mean time and decide later
690*b1cdbd2cSJim Jagielski 		// what to do
691*b1cdbd2cSJim Jagielski 		m_sDirectory = sDirectory;
692*b1cdbd2cSJim Jagielski 	}
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
695*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
696*b1cdbd2cSJim Jagielski     TFileDialog iDialog = impl_getBaseDialogInterface();
697*b1cdbd2cSJim Jagielski     aLock.clear();
698*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski     ComPtr< IShellItem > pFolder;
701*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
702*b1cdbd2cSJim Jagielski     HRESULT hResult = SHCreateItemFromParsingName ( reinterpret_cast<LPCTSTR>(sDirectory.getStr()), NULL, IID_IShellItem, reinterpret_cast<void**>(&pFolder) );
703*b1cdbd2cSJim Jagielski #else
704*b1cdbd2cSJim Jagielski     HRESULT hResult = SHCreateItemFromParsingName( sDirectory.getStr(), NULL, IID_PPV_ARGS(&pFolder) );
705*b1cdbd2cSJim Jagielski #endif
706*b1cdbd2cSJim Jagielski     if ( FAILED(hResult) )
707*b1cdbd2cSJim Jagielski         return;
708*b1cdbd2cSJim Jagielski 
709*b1cdbd2cSJim Jagielski     if ( m_bInExecute || bForce )
710*b1cdbd2cSJim Jagielski         iDialog->SetFolder(pFolder);
711*b1cdbd2cSJim Jagielski     else
712*b1cdbd2cSJim Jagielski     {
713*b1cdbd2cSJim Jagielski         // Use set default folder as Microsoft recommends in the IFileDialog documentation.
714*b1cdbd2cSJim Jagielski         iDialog->SetDefaultFolder(pFolder);
715*b1cdbd2cSJim Jagielski     }
716*b1cdbd2cSJim Jagielski }
717*b1cdbd2cSJim Jagielski 
impl_sta_GetDirectory(const RequestRef & rRequest)718*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_GetDirectory(const RequestRef& rRequest)
719*b1cdbd2cSJim Jagielski {
720*b1cdbd2cSJim Jagielski     TFileDialog iDialog = impl_getBaseDialogInterface();
721*b1cdbd2cSJim Jagielski     ComPtr< IShellItem > pFolder;
722*b1cdbd2cSJim Jagielski 	HRESULT hResult = iDialog->GetFolder( &pFolder );
723*b1cdbd2cSJim Jagielski 	if ( FAILED(hResult) )
724*b1cdbd2cSJim Jagielski         return;
725*b1cdbd2cSJim Jagielski 	::rtl::OUString sFolder = lcl_getURLFromShellItem ( pFolder );
726*b1cdbd2cSJim Jagielski 	if( sFolder.getLength())
727*b1cdbd2cSJim Jagielski 		rRequest->setArgument( PROP_DIRECTORY, sFolder );
728*b1cdbd2cSJim Jagielski }
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_SetDefaultName(const RequestRef & rRequest)731*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_SetDefaultName(const RequestRef& rRequest)
732*b1cdbd2cSJim Jagielski {
733*b1cdbd2cSJim Jagielski 	::rtl::OUString sFilename = rRequest->getArgumentOrDefault(PROP_FILENAME, ::rtl::OUString());
734*b1cdbd2cSJim Jagielski 	TFileDialog iDialog = impl_getBaseDialogInterface();
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski     TFileDialogCustomize iCustom = impl_getCustomizeInterface();
737*b1cdbd2cSJim Jagielski     if ( ! iCustom.is())
738*b1cdbd2cSJim Jagielski         return;
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski     // if we have the autoextension check box set, remove (or change ???) the extension of the filename
741*b1cdbd2cSJim Jagielski     // so that the autoextension mechanism can do its job
742*b1cdbd2cSJim Jagielski     BOOL bValue = FALSE;
743*b1cdbd2cSJim Jagielski     HRESULT hResult = iCustom->GetCheckButtonState( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, &bValue);
744*b1cdbd2cSJim Jagielski     if ( bValue )
745*b1cdbd2cSJim Jagielski     {
746*b1cdbd2cSJim Jagielski         sal_Int32 nSepPos = sFilename.lastIndexOf( '.' );
747*b1cdbd2cSJim Jagielski         if ( -1 != nSepPos )
748*b1cdbd2cSJim Jagielski             sFilename = sFilename.copy(0, nSepPos);
749*b1cdbd2cSJim Jagielski     }
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski 	iDialog->SetFileName ( reinterpret_cast<LPCTSTR>(sFilename.getStr()));
752*b1cdbd2cSJim Jagielski 	m_sFilename = sFilename;
753*b1cdbd2cSJim Jagielski }
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_setFiltersOnDialog()756*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_setFiltersOnDialog()
757*b1cdbd2cSJim Jagielski {
758*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
759*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski     ::std::vector< COMDLG_FILTERSPEC > lFilters       = lcl_buildFilterList(m_lFilters);
762*b1cdbd2cSJim Jagielski     ::rtl::OUString                    sCurrentFilter = m_lFilters.getCurrentFilter();
763*b1cdbd2cSJim Jagielski     sal_Int32                          nCurrentFilter = m_lFilters.getFilterPos(sCurrentFilter);
764*b1cdbd2cSJim Jagielski     TFileDialog                        iDialog        = impl_getBaseDialogInterface();
765*b1cdbd2cSJim Jagielski 	TFileDialogCustomize               iCustomize     = impl_getCustomizeInterface();
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski     aLock.clear();
768*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski     if (lFilters.empty())
771*b1cdbd2cSJim Jagielski         return;
772*b1cdbd2cSJim Jagielski 
773*b1cdbd2cSJim Jagielski 	COMDLG_FILTERSPEC	*pFilt = &lFilters[0];
774*b1cdbd2cSJim Jagielski     iDialog->SetFileTypes(lFilters.size(), pFilt/*&lFilters[0]*/);
775*b1cdbd2cSJim Jagielski     iDialog->SetFileTypeIndex(nCurrentFilter + 1);
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski 	BOOL bValue = FALSE;
778*b1cdbd2cSJim Jagielski 	HRESULT hResult = iCustomize->GetCheckButtonState( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, &bValue);
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 	if ( bValue )
781*b1cdbd2cSJim Jagielski 	{
782*b1cdbd2cSJim Jagielski 		LPCWSTR lpFilterExt = lFilters[0].pszSpec;
783*b1cdbd2cSJim Jagielski 
784*b1cdbd2cSJim Jagielski 		lpFilterExt = wcsrchr( lpFilterExt, '.' );
785*b1cdbd2cSJim Jagielski 		if ( lpFilterExt )
786*b1cdbd2cSJim Jagielski 			lpFilterExt++;
787*b1cdbd2cSJim Jagielski 		iDialog->SetDefaultExtension( lpFilterExt );
788*b1cdbd2cSJim Jagielski 	}
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski }
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_getSelectedFiles(const RequestRef & rRequest)793*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_getSelectedFiles(const RequestRef& rRequest)
794*b1cdbd2cSJim Jagielski {
795*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
796*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
797*b1cdbd2cSJim Jagielski 
798*b1cdbd2cSJim Jagielski     TFileOpenDialog iOpen      = m_iDialogOpen;
799*b1cdbd2cSJim Jagielski     TFileSaveDialog iSave      = m_iDialogSave;
800*b1cdbd2cSJim Jagielski     ::sal_Bool      bInExecute = m_bInExecute;
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski     aLock.clear();
803*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski     // ask dialog for results
806*b1cdbd2cSJim Jagielski     // Note        : we must differ between single/multi selection !
807*b1cdbd2cSJim Jagielski     // Note further: we must react different if dialog is in execute or not .-(
808*b1cdbd2cSJim Jagielski     ComPtr< IShellItem >      iItem;
809*b1cdbd2cSJim Jagielski     ComPtr< IShellItemArray > iItems;
810*b1cdbd2cSJim Jagielski     HRESULT                   hResult = E_FAIL;
811*b1cdbd2cSJim Jagielski 
812*b1cdbd2cSJim Jagielski     if (iOpen.is())
813*b1cdbd2cSJim Jagielski     {
814*b1cdbd2cSJim Jagielski         if (bInExecute)
815*b1cdbd2cSJim Jagielski             hResult = iOpen->GetSelectedItems(&iItems);
816*b1cdbd2cSJim Jagielski         else
817*b1cdbd2cSJim Jagielski         {
818*b1cdbd2cSJim Jagielski             hResult = iOpen->GetResults(&iItems);
819*b1cdbd2cSJim Jagielski             if (FAILED(hResult))
820*b1cdbd2cSJim Jagielski                 hResult = iOpen->GetResult(&iItem);
821*b1cdbd2cSJim Jagielski         }
822*b1cdbd2cSJim Jagielski     }
823*b1cdbd2cSJim Jagielski     else
824*b1cdbd2cSJim Jagielski     if (iSave.is())
825*b1cdbd2cSJim Jagielski     {
826*b1cdbd2cSJim Jagielski         if (bInExecute)
827*b1cdbd2cSJim Jagielski             hResult = iSave->GetCurrentSelection(&iItem);
828*b1cdbd2cSJim Jagielski         else
829*b1cdbd2cSJim Jagielski             hResult = iSave->GetResult(&iItem);
830*b1cdbd2cSJim Jagielski     }
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski     if (FAILED(hResult))
833*b1cdbd2cSJim Jagielski         return;
834*b1cdbd2cSJim Jagielski 
835*b1cdbd2cSJim Jagielski     // convert and pack results
836*b1cdbd2cSJim Jagielski     TStringList lFiles;
837*b1cdbd2cSJim Jagielski     if (iItem.is())
838*b1cdbd2cSJim Jagielski     {
839*b1cdbd2cSJim Jagielski         const ::rtl::OUString sURL = lcl_getURLFromShellItem(iItem);
840*b1cdbd2cSJim Jagielski         if (sURL.getLength() > 0)
841*b1cdbd2cSJim Jagielski             lFiles.push_back(sURL);
842*b1cdbd2cSJim Jagielski     }
843*b1cdbd2cSJim Jagielski 
844*b1cdbd2cSJim Jagielski     if (iItems.is())
845*b1cdbd2cSJim Jagielski     {
846*b1cdbd2cSJim Jagielski         DWORD nCount;
847*b1cdbd2cSJim Jagielski         hResult = iItems->GetCount(&nCount);
848*b1cdbd2cSJim Jagielski         if ( SUCCEEDED(hResult) )
849*b1cdbd2cSJim Jagielski         {
850*b1cdbd2cSJim Jagielski             for (DWORD i=0; i<nCount; ++i)
851*b1cdbd2cSJim Jagielski             {
852*b1cdbd2cSJim Jagielski                 hResult = iItems->GetItemAt(i, &iItem);
853*b1cdbd2cSJim Jagielski                 if ( SUCCEEDED(hResult) )
854*b1cdbd2cSJim Jagielski                 {
855*b1cdbd2cSJim Jagielski                     const ::rtl::OUString sURL = lcl_getURLFromShellItem(iItem);
856*b1cdbd2cSJim Jagielski                     if (sURL.getLength() > 0)
857*b1cdbd2cSJim Jagielski                         lFiles.push_back(sURL);
858*b1cdbd2cSJim Jagielski                 }
859*b1cdbd2cSJim Jagielski             }
860*b1cdbd2cSJim Jagielski         }
861*b1cdbd2cSJim Jagielski     }
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski     rRequest->setArgument(PROP_SELECTED_FILES, lFiles.getAsConstList());
864*b1cdbd2cSJim Jagielski }
865*b1cdbd2cSJim Jagielski 
866*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_ShowDialogModal(const RequestRef & rRequest)867*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_ShowDialogModal(const RequestRef& rRequest)
868*b1cdbd2cSJim Jagielski {
869*b1cdbd2cSJim Jagielski     impl_sta_setFiltersOnDialog();
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
872*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski     TFileDialog iDialog = impl_getBaseDialogInterface();
875*b1cdbd2cSJim Jagielski     TFileOpenDialog iOpen = m_iDialogOpen;
876*b1cdbd2cSJim Jagielski     TFileSaveDialog iSave = m_iDialogSave;
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 	// it's important to know if we are showing the dialog.
879*b1cdbd2cSJim Jagielski     // Some dialog interface methods cant be called then or some
880*b1cdbd2cSJim Jagielski     // tasks must be done differently .-) (e.g. see impl_sta_getSelectedFiles())
881*b1cdbd2cSJim Jagielski     m_bInExecute = sal_True;
882*b1cdbd2cSJim Jagielski 
883*b1cdbd2cSJim Jagielski     m_bWasExecuted = sal_True;
884*b1cdbd2cSJim Jagielski 
885*b1cdbd2cSJim Jagielski     aLock.clear();
886*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
887*b1cdbd2cSJim Jagielski 
888*b1cdbd2cSJim Jagielski 	// we set the directory only if we have a save dialog and a filename
889*b1cdbd2cSJim Jagielski 	// for the other cases, the file dialog remembers its last location
890*b1cdbd2cSJim Jagielski 	// according to its client guid.
891*b1cdbd2cSJim Jagielski 	if( m_sDirectory.getLength())
892*b1cdbd2cSJim Jagielski 	{
893*b1cdbd2cSJim Jagielski 		ComPtr< IShellItem > pFolder;
894*b1cdbd2cSJim Jagielski 		#ifdef __MINGW32__
895*b1cdbd2cSJim Jagielski 			HRESULT hResult = SHCreateItemFromParsingName ( reinterpret_cast<LPCTSTR>(m_sDirectory.getStr()), NULL, IID_IShellItem, reinterpret_cast<void**>(&pFolder) );
896*b1cdbd2cSJim Jagielski 		#else
897*b1cdbd2cSJim Jagielski 			HRESULT hResult = SHCreateItemFromParsingName( m_sDirectory.getStr(), NULL, IID_PPV_ARGS(&pFolder) );
898*b1cdbd2cSJim Jagielski 		#endif
899*b1cdbd2cSJim Jagielski 		if ( SUCCEEDED(hResult) )
900*b1cdbd2cSJim Jagielski         {
901*b1cdbd2cSJim Jagielski 		    if (m_sFilename.getLength())
902*b1cdbd2cSJim Jagielski             {
903*b1cdbd2cSJim Jagielski                 ::rtl::OUString aFileURL(m_sDirectory);
904*b1cdbd2cSJim Jagielski                 sal_Int32 nIndex = aFileURL.lastIndexOf('/');
905*b1cdbd2cSJim Jagielski                 if (nIndex != aFileURL.getLength()-1)
906*b1cdbd2cSJim Jagielski                     aFileURL += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/"));
907*b1cdbd2cSJim Jagielski                 aFileURL += m_sFilename;
908*b1cdbd2cSJim Jagielski 
909*b1cdbd2cSJim Jagielski                 TFileDialogCustomize iCustom = impl_getCustomizeInterface();
910*b1cdbd2cSJim Jagielski 
911*b1cdbd2cSJim Jagielski                 BOOL bValue = FALSE;
912*b1cdbd2cSJim Jagielski                 HRESULT hResult = iCustom->GetCheckButtonState( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, &bValue);
913*b1cdbd2cSJim Jagielski                 if ( bValue )
914*b1cdbd2cSJim Jagielski                 {
915*b1cdbd2cSJim Jagielski                     ::rtl::OUString aExt;
916*b1cdbd2cSJim Jagielski                     UINT nFileType;
917*b1cdbd2cSJim Jagielski                     hResult = iDialog->GetFileTypeIndex(&nFileType);
918*b1cdbd2cSJim Jagielski                     if ( SUCCEEDED(hResult) && nFileType > 0 )
919*b1cdbd2cSJim Jagielski                     {
920*b1cdbd2cSJim Jagielski                         ::sal_Int32 nRealIndex = (nFileType-1); // COM dialog base on 1 ... filter container on 0 .-)
921*b1cdbd2cSJim Jagielski                         ::std::vector< COMDLG_FILTERSPEC > lFilters = lcl_buildFilterList(m_lFilters);
922*b1cdbd2cSJim Jagielski                         if ( nRealIndex < lFilters.size() )
923*b1cdbd2cSJim Jagielski                         {
924*b1cdbd2cSJim Jagielski                             LPCWSTR lpFilterExt = lFilters[nRealIndex].pszSpec;
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski                             lpFilterExt = wcsrchr( lpFilterExt, '.' );
927*b1cdbd2cSJim Jagielski                             if ( lpFilterExt )
928*b1cdbd2cSJim Jagielski                                 aFileURL += reinterpret_cast<const sal_Unicode*>(lpFilterExt);
929*b1cdbd2cSJim Jagielski                         }
930*b1cdbd2cSJim Jagielski                     }
931*b1cdbd2cSJim Jagielski                 }
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski                 // Check existence of file. Set folder only for this special case
934*b1cdbd2cSJim Jagielski                 ::rtl::OUString aSystemPath;
935*b1cdbd2cSJim Jagielski                 osl_getSystemPathFromFileURL( aFileURL.pData, &aSystemPath.pData );
936*b1cdbd2cSJim Jagielski 
937*b1cdbd2cSJim Jagielski 			    WIN32_FIND_DATA	aFindFileData;
938*b1cdbd2cSJim Jagielski                 HANDLE	hFind = FindFirstFile( reinterpret_cast<LPCWSTR>(aSystemPath.getStr()), &aFindFileData );
939*b1cdbd2cSJim Jagielski                 if (hFind != INVALID_HANDLE_VALUE)
940*b1cdbd2cSJim Jagielski                     iDialog->SetFolder(pFolder);
941*b1cdbd2cSJim Jagielski                 else
942*b1cdbd2cSJim Jagielski                     hResult = iDialog->AddPlace(pFolder, FDAP_TOP);
943*b1cdbd2cSJim Jagielski 
944*b1cdbd2cSJim Jagielski                 FindClose( hFind );
945*b1cdbd2cSJim Jagielski             }
946*b1cdbd2cSJim Jagielski 			else
947*b1cdbd2cSJim Jagielski 				hResult = iDialog->AddPlace(pFolder, FDAP_TOP);
948*b1cdbd2cSJim Jagielski 		}
949*b1cdbd2cSJim Jagielski 	}
950*b1cdbd2cSJim Jagielski 
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski     HRESULT hResult = E_FAIL;
953*b1cdbd2cSJim Jagielski     try
954*b1cdbd2cSJim Jagielski     {
955*b1cdbd2cSJim Jagielski         // show dialog and wait for user decision
956*b1cdbd2cSJim Jagielski         if (iOpen.is())
957*b1cdbd2cSJim Jagielski             hResult = iOpen->Show( m_hParentWindow ); // parent window needed
958*b1cdbd2cSJim Jagielski         else
959*b1cdbd2cSJim Jagielski         if (iSave.is())
960*b1cdbd2cSJim Jagielski             hResult = iSave->Show( m_hParentWindow ); // parent window needed
961*b1cdbd2cSJim Jagielski     }
962*b1cdbd2cSJim Jagielski     catch(...)
963*b1cdbd2cSJim Jagielski     {}
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
966*b1cdbd2cSJim Jagielski     aLock.reset();
967*b1cdbd2cSJim Jagielski     m_bInExecute = sal_False;
968*b1cdbd2cSJim Jagielski     aLock.clear();
969*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
970*b1cdbd2cSJim Jagielski 
971*b1cdbd2cSJim Jagielski     if ( FAILED(hResult) )
972*b1cdbd2cSJim Jagielski         return;
973*b1cdbd2cSJim Jagielski 
974*b1cdbd2cSJim Jagielski     impl_sta_getSelectedFiles(rRequest);
975*b1cdbd2cSJim Jagielski     rRequest->setArgument(PROP_DIALOG_SHOW_RESULT, sal_True);
976*b1cdbd2cSJim Jagielski }
977*b1cdbd2cSJim Jagielski 
978*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_getBaseDialogInterface()979*b1cdbd2cSJim Jagielski TFileDialog VistaFilePickerImpl::impl_getBaseDialogInterface()
980*b1cdbd2cSJim Jagielski {
981*b1cdbd2cSJim Jagielski     TFileDialog iDialog;
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
984*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
985*b1cdbd2cSJim Jagielski 
986*b1cdbd2cSJim Jagielski     if (m_iDialogOpen.is())
987*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
988*b1cdbd2cSJim Jagielski         m_iDialogOpen->QueryInterface(IID_IFileDialog, (void**)(&iDialog));
989*b1cdbd2cSJim Jagielski #else
990*b1cdbd2cSJim Jagielski         m_iDialogOpen.query(&iDialog);
991*b1cdbd2cSJim Jagielski #endif
992*b1cdbd2cSJim Jagielski     if (m_iDialogSave.is())
993*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
994*b1cdbd2cSJim Jagielski         m_iDialogSave->QueryInterface(IID_IFileDialog, (void**)(&iDialog));
995*b1cdbd2cSJim Jagielski #else
996*b1cdbd2cSJim Jagielski         m_iDialogSave.query(&iDialog);
997*b1cdbd2cSJim Jagielski #endif
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski     return iDialog;
1000*b1cdbd2cSJim Jagielski }
1001*b1cdbd2cSJim Jagielski 
1002*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_getCustomizeInterface()1003*b1cdbd2cSJim Jagielski TFileDialogCustomize VistaFilePickerImpl::impl_getCustomizeInterface()
1004*b1cdbd2cSJim Jagielski {
1005*b1cdbd2cSJim Jagielski     TFileDialogCustomize iCustom;
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
1008*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski     if (m_iDialogOpen.is())
1011*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
1012*b1cdbd2cSJim Jagielski         m_iDialogOpen->QueryInterface(IID_IFileDialogCustomize, (void**)(&iCustom));
1013*b1cdbd2cSJim Jagielski #else
1014*b1cdbd2cSJim Jagielski         m_iDialogOpen.query(&iCustom);
1015*b1cdbd2cSJim Jagielski #endif
1016*b1cdbd2cSJim Jagielski     else
1017*b1cdbd2cSJim Jagielski     if (m_iDialogSave.is())
1018*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
1019*b1cdbd2cSJim Jagielski         m_iDialogSave->QueryInterface(IID_IFileDialogCustomize, (void**)(&iCustom));
1020*b1cdbd2cSJim Jagielski #else
1021*b1cdbd2cSJim Jagielski         m_iDialogSave.query(&iCustom);
1022*b1cdbd2cSJim Jagielski #endif
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski     return iCustom;
1025*b1cdbd2cSJim Jagielski }
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
lcl_removeControlItemsWorkaround(const TFileDialogCustomize & iCustom,::sal_Int16 nControlId)1028*b1cdbd2cSJim Jagielski void lcl_removeControlItemsWorkaround(const TFileDialogCustomize& iCustom   ,
1029*b1cdbd2cSJim Jagielski                                             ::sal_Int16           nControlId)
1030*b1cdbd2cSJim Jagielski {
1031*b1cdbd2cSJim Jagielski     ::sal_Int32 i       = 0;
1032*b1cdbd2cSJim Jagielski     HRESULT   hResult;
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski     hResult = iCustom->SetSelectedControlItem(nControlId, 1000);
1035*b1cdbd2cSJim Jagielski 	hResult = S_OK;
1036*b1cdbd2cSJim Jagielski     while ( SUCCEEDED(hResult) )
1037*b1cdbd2cSJim Jagielski         hResult = iCustom->RemoveControlItem(nControlId, i++);
1038*b1cdbd2cSJim Jagielski }
1039*b1cdbd2cSJim Jagielski 
1040*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_SetControlValue(const RequestRef & rRequest)1041*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_SetControlValue(const RequestRef& rRequest)
1042*b1cdbd2cSJim Jagielski {
1043*b1cdbd2cSJim Jagielski     ::sal_Int16   nId     = rRequest->getArgumentOrDefault(PROP_CONTROL_ID    , INVALID_CONTROL_ID    );
1044*b1cdbd2cSJim Jagielski     ::sal_Int16   nAction = rRequest->getArgumentOrDefault(PROP_CONTROL_ACTION, INVALID_CONTROL_ACTION);
1045*b1cdbd2cSJim Jagielski     css::uno::Any aValue  = rRequest->getArgumentOrDefault(PROP_CONTROL_VALUE , css::uno::Any()       );
1046*b1cdbd2cSJim Jagielski 
1047*b1cdbd2cSJim Jagielski     // dont check for right values here ...
1048*b1cdbd2cSJim Jagielski     // most parameters are optional !
1049*b1cdbd2cSJim Jagielski 
1050*b1cdbd2cSJim Jagielski     TFileDialogCustomize iCustom = impl_getCustomizeInterface();
1051*b1cdbd2cSJim Jagielski     if ( ! iCustom.is())
1052*b1cdbd2cSJim Jagielski         return;
1053*b1cdbd2cSJim Jagielski 
1054*b1cdbd2cSJim Jagielski     switch (nId)
1055*b1cdbd2cSJim Jagielski     {
1056*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION :
1057*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PASSWORD :
1058*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY :
1059*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS :
1060*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK :
1061*b1cdbd2cSJim Jagielski         //case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PREVIEW : // can be ignored ... preview is supported native now !
1062*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION :
1063*b1cdbd2cSJim Jagielski             {
1064*b1cdbd2cSJim Jagielski                 ::sal_Bool bValue   = sal_False;
1065*b1cdbd2cSJim Jagielski                            aValue >>= bValue;
1066*b1cdbd2cSJim Jagielski                 iCustom->SetCheckButtonState(nId, bValue);
1067*b1cdbd2cSJim Jagielski             }
1068*b1cdbd2cSJim Jagielski             break;
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::LISTBOX_VERSION :
1071*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::LISTBOX_TEMPLATE :
1072*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE :
1073*b1cdbd2cSJim Jagielski             {
1074*b1cdbd2cSJim Jagielski                 HRESULT hResult;
1075*b1cdbd2cSJim Jagielski                 switch (nAction)
1076*b1cdbd2cSJim Jagielski                 {
1077*b1cdbd2cSJim Jagielski                     case css::ui::dialogs::ControlActions::DELETE_ITEMS :
1078*b1cdbd2cSJim Jagielski                         {
1079*b1cdbd2cSJim Jagielski                             hResult = iCustom->RemoveAllControlItems(nId);
1080*b1cdbd2cSJim Jagielski                             if ( FAILED(hResult) )
1081*b1cdbd2cSJim Jagielski                                 lcl_removeControlItemsWorkaround(iCustom, nId);
1082*b1cdbd2cSJim Jagielski                         }
1083*b1cdbd2cSJim Jagielski                         break;
1084*b1cdbd2cSJim Jagielski 
1085*b1cdbd2cSJim Jagielski                     case css::ui::dialogs::ControlActions::ADD_ITEMS :
1086*b1cdbd2cSJim Jagielski                         {
1087*b1cdbd2cSJim Jagielski                             css::uno::Sequence< ::rtl::OUString > lItems;
1088*b1cdbd2cSJim Jagielski                                                        aValue >>= lItems;
1089*b1cdbd2cSJim Jagielski                             for (::sal_Int32 i=0; i<lItems.getLength(); ++i)
1090*b1cdbd2cSJim Jagielski                             {
1091*b1cdbd2cSJim Jagielski                                 const ::rtl::OUString& sItem = lItems[i];
1092*b1cdbd2cSJim Jagielski                                 hResult = iCustom->AddControlItem(nId, i, reinterpret_cast<LPCTSTR>(sItem.getStr()));
1093*b1cdbd2cSJim Jagielski                             }
1094*b1cdbd2cSJim Jagielski                         }
1095*b1cdbd2cSJim Jagielski                         break;
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski                     case css::ui::dialogs::ControlActions::SET_SELECT_ITEM :
1098*b1cdbd2cSJim Jagielski                         {
1099*b1cdbd2cSJim Jagielski                             ::sal_Int32 nItem    = 0;
1100*b1cdbd2cSJim Jagielski                                         aValue >>= nItem;
1101*b1cdbd2cSJim Jagielski                             hResult = iCustom->SetSelectedControlItem(nId, nItem);
1102*b1cdbd2cSJim Jagielski                         }
1103*b1cdbd2cSJim Jagielski                         break;
1104*b1cdbd2cSJim Jagielski                 }
1105*b1cdbd2cSJim Jagielski             }
1106*b1cdbd2cSJim Jagielski             break;
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY :
1109*b1cdbd2cSJim Jagielski             {
1110*b1cdbd2cSJim Jagielski             }
1111*b1cdbd2cSJim Jagielski             break;
1112*b1cdbd2cSJim Jagielski         }
1113*b1cdbd2cSJim Jagielski }
1114*b1cdbd2cSJim Jagielski 
1115*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_GetControlValue(const RequestRef & rRequest)1116*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_GetControlValue(const RequestRef& rRequest)
1117*b1cdbd2cSJim Jagielski {
1118*b1cdbd2cSJim Jagielski     ::sal_Int16 nId     = rRequest->getArgumentOrDefault(PROP_CONTROL_ID    , INVALID_CONTROL_ID    );
1119*b1cdbd2cSJim Jagielski     ::sal_Int16 nAction = rRequest->getArgumentOrDefault(PROP_CONTROL_ACTION, INVALID_CONTROL_ACTION);
1120*b1cdbd2cSJim Jagielski 
1121*b1cdbd2cSJim Jagielski     // dont check for right values here ...
1122*b1cdbd2cSJim Jagielski     // most parameters are optional !
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski     TFileDialogCustomize iCustom = impl_getCustomizeInterface();
1125*b1cdbd2cSJim Jagielski     if ( ! iCustom.is())
1126*b1cdbd2cSJim Jagielski         return;
1127*b1cdbd2cSJim Jagielski 
1128*b1cdbd2cSJim Jagielski     css::uno::Any aValue;
1129*b1cdbd2cSJim Jagielski     if( m_bWasExecuted )
1130*b1cdbd2cSJim Jagielski     switch (nId)
1131*b1cdbd2cSJim Jagielski     {
1132*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PASSWORD :
1133*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_READONLY :
1134*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS :
1135*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK :
1136*b1cdbd2cSJim Jagielski         //case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PREVIEW : // can be ignored ... preview is supported native now !
1137*b1cdbd2cSJim Jagielski         case css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION :
1138*b1cdbd2cSJim Jagielski             {
1139*b1cdbd2cSJim Jagielski                 BOOL    bValue  = FALSE;
1140*b1cdbd2cSJim Jagielski                 HRESULT hResult = iCustom->GetCheckButtonState(nId, &bValue);
1141*b1cdbd2cSJim Jagielski                 if ( SUCCEEDED(hResult) )
1142*b1cdbd2cSJim Jagielski                     aValue = css::uno::makeAny((sal_Bool)bValue);
1143*b1cdbd2cSJim Jagielski             }
1144*b1cdbd2cSJim Jagielski             break;
1145*b1cdbd2cSJim Jagielski     }
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski     if (aValue.hasValue())
1148*b1cdbd2cSJim Jagielski         rRequest->setArgument(PROP_CONTROL_VALUE, aValue);
1149*b1cdbd2cSJim Jagielski }
1150*b1cdbd2cSJim Jagielski 
1151*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_SetControlLabel(const RequestRef & rRequest)1152*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_SetControlLabel(const RequestRef& rRequest)
1153*b1cdbd2cSJim Jagielski {
1154*b1cdbd2cSJim Jagielski 	::sal_Int16     nId    = rRequest->getArgumentOrDefault(PROP_CONTROL_ID   , INVALID_CONTROL_ID  );
1155*b1cdbd2cSJim Jagielski 	::rtl::OUString sLabel = rRequest->getArgumentOrDefault(PROP_CONTROL_LABEL, ::rtl::OUString() );
1156*b1cdbd2cSJim Jagielski 
1157*b1cdbd2cSJim Jagielski     // dont check for right values here ...
1158*b1cdbd2cSJim Jagielski     // most parameters are optional !
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski     TFileDialogCustomize iCustom = impl_getCustomizeInterface();
1161*b1cdbd2cSJim Jagielski     if ( ! iCustom.is())
1162*b1cdbd2cSJim Jagielski         return;
1163*b1cdbd2cSJim Jagielski 	iCustom->SetControlLabel ( nId, reinterpret_cast<LPCTSTR>(sLabel.getStr()));
1164*b1cdbd2cSJim Jagielski }
1165*b1cdbd2cSJim Jagielski 
1166*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_GetControlLabel(const RequestRef &)1167*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_GetControlLabel(const RequestRef& /*rRequest*/)
1168*b1cdbd2cSJim Jagielski {
1169*b1cdbd2cSJim Jagielski }
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_sta_EnableControl(const RequestRef & rRequest)1172*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_sta_EnableControl(const RequestRef& rRequest)
1173*b1cdbd2cSJim Jagielski {
1174*b1cdbd2cSJim Jagielski     ::sal_Int16 nId      = rRequest->getArgumentOrDefault(PROP_CONTROL_ID    , INVALID_CONTROL_ID  );
1175*b1cdbd2cSJim Jagielski     ::sal_Bool  bEnabled = rRequest->getArgumentOrDefault(PROP_CONTROL_ENABLE, (::sal_Bool)sal_True);
1176*b1cdbd2cSJim Jagielski 
1177*b1cdbd2cSJim Jagielski     // dont check for right values here ...
1178*b1cdbd2cSJim Jagielski     // most parameters are optional !
1179*b1cdbd2cSJim Jagielski 
1180*b1cdbd2cSJim Jagielski     TFileDialogCustomize iCustom = impl_getCustomizeInterface();
1181*b1cdbd2cSJim Jagielski     if ( ! iCustom.is())
1182*b1cdbd2cSJim Jagielski         return;
1183*b1cdbd2cSJim Jagielski 
1184*b1cdbd2cSJim Jagielski     CDCONTROLSTATEF eState = CDCS_VISIBLE;
1185*b1cdbd2cSJim Jagielski     if (bEnabled)
1186*b1cdbd2cSJim Jagielski         eState |= CDCS_ENABLED;
1187*b1cdbd2cSJim Jagielski     else
1188*b1cdbd2cSJim Jagielski         eState |= CDCS_INACTIVE;
1189*b1cdbd2cSJim Jagielski 
1190*b1cdbd2cSJim Jagielski     iCustom->SetControlState(nId, eState);
1191*b1cdbd2cSJim Jagielski }
1192*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
impl_SetDefaultExtension(const rtl::OUString & currentFilter)1193*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::impl_SetDefaultExtension( const rtl::OUString& currentFilter )
1194*b1cdbd2cSJim Jagielski {
1195*b1cdbd2cSJim Jagielski    TFileDialog iDialog = impl_getBaseDialogInterface();
1196*b1cdbd2cSJim Jagielski    if (currentFilter.getLength())
1197*b1cdbd2cSJim Jagielski    {
1198*b1cdbd2cSJim Jagielski 		rtl::OUString FilterExt;
1199*b1cdbd2cSJim Jagielski 		m_lFilters.getFilter(currentFilter, FilterExt);
1200*b1cdbd2cSJim Jagielski 
1201*b1cdbd2cSJim Jagielski 		sal_Int32 posOfPoint = FilterExt.indexOf(L'.');
1202*b1cdbd2cSJim Jagielski 		const sal_Unicode* pFirstExtStart = FilterExt.getStr() + posOfPoint + 1;
1203*b1cdbd2cSJim Jagielski 
1204*b1cdbd2cSJim Jagielski 		sal_Int32 posOfSemiColon = FilterExt.indexOf(L';') - 1;
1205*b1cdbd2cSJim Jagielski 		if (posOfSemiColon < 0)
1206*b1cdbd2cSJim Jagielski 			posOfSemiColon = FilterExt.getLength() - 1;
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski 		FilterExt = rtl::OUString(pFirstExtStart, posOfSemiColon - posOfPoint);
1209*b1cdbd2cSJim Jagielski 		iDialog->SetDefaultExtension ( reinterpret_cast<LPCTSTR>(FilterExt.getStr()) );
1210*b1cdbd2cSJim Jagielski    }
1211*b1cdbd2cSJim Jagielski }
1212*b1cdbd2cSJim Jagielski 
impl_refreshFileDialog(TFileDialog iDialog)1213*b1cdbd2cSJim Jagielski static void impl_refreshFileDialog( TFileDialog iDialog )
1214*b1cdbd2cSJim Jagielski {
1215*b1cdbd2cSJim Jagielski 	if ( SUCCEEDED(iDialog->SetFileName(L"")) &&
1216*b1cdbd2cSJim Jagielski 	     SUCCEEDED(iDialog->SetFileName(L"*.*")) )
1217*b1cdbd2cSJim Jagielski 	{
1218*b1cdbd2cSJim Jagielski 		IOleWindow* iOleWindow;
1219*b1cdbd2cSJim Jagielski #ifdef __MINGW32__
1220*b1cdbd2cSJim Jagielski 		if (SUCCEEDED(iDialog->QueryInterface(IID_IOleWindow, reinterpret_cast<void**>(&iOleWindow))))
1221*b1cdbd2cSJim Jagielski #else
1222*b1cdbd2cSJim Jagielski 		if (SUCCEEDED(iDialog->QueryInterface(IID_PPV_ARGS(&iOleWindow))))
1223*b1cdbd2cSJim Jagielski #endif
1224*b1cdbd2cSJim Jagielski 		{
1225*b1cdbd2cSJim Jagielski 			HWND hwnd;
1226*b1cdbd2cSJim Jagielski 			if (SUCCEEDED(iOleWindow->GetWindow(&hwnd)))
1227*b1cdbd2cSJim Jagielski 			{
1228*b1cdbd2cSJim Jagielski 				PostMessage(hwnd, WM_COMMAND, IDOK, 0);
1229*b1cdbd2cSJim Jagielski 			}
1230*b1cdbd2cSJim Jagielski 			iOleWindow->Release();
1231*b1cdbd2cSJim Jagielski 		}
1232*b1cdbd2cSJim Jagielski 	}
1233*b1cdbd2cSJim Jagielski }
1234*b1cdbd2cSJim Jagielski 
1235*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------------
onAutoExtensionChanged(bool bChecked)1236*b1cdbd2cSJim Jagielski void VistaFilePickerImpl::onAutoExtensionChanged (bool bChecked)
1237*b1cdbd2cSJim Jagielski {
1238*b1cdbd2cSJim Jagielski     // SYNCHRONIZED->
1239*b1cdbd2cSJim Jagielski     ::osl::ResettableMutexGuard aLock(m_aMutex);
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski 	const ::rtl::OUString sFilter = m_lFilters.getCurrentFilter ();
1242*b1cdbd2cSJim Jagielski 		  ::rtl::OUString sExt    ;
1243*b1cdbd2cSJim Jagielski 	if ( !m_lFilters.getFilter (sFilter, sExt))
1244*b1cdbd2cSJim Jagielski 		return;
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski     TFileDialog iDialog = impl_getBaseDialogInterface();
1247*b1cdbd2cSJim Jagielski 
1248*b1cdbd2cSJim Jagielski     aLock.clear();
1249*b1cdbd2cSJim Jagielski     // <- SYNCHRONIZED
1250*b1cdbd2cSJim Jagielski 
1251*b1cdbd2cSJim Jagielski 	LPCWSTR pExt = 0;
1252*b1cdbd2cSJim Jagielski 	if ( bChecked )
1253*b1cdbd2cSJim Jagielski 	{
1254*b1cdbd2cSJim Jagielski 		pExt = reinterpret_cast<LPCTSTR>(sExt.getStr());
1255*b1cdbd2cSJim Jagielski 		pExt = wcsrchr( pExt, '.' );
1256*b1cdbd2cSJim Jagielski 		if ( pExt )
1257*b1cdbd2cSJim Jagielski 			pExt++;
1258*b1cdbd2cSJim Jagielski 	}
1259*b1cdbd2cSJim Jagielski 	iDialog->SetDefaultExtension( pExt );
1260*b1cdbd2cSJim Jagielski }
1261*b1cdbd2cSJim Jagielski 
onFileTypeChanged(UINT)1262*b1cdbd2cSJim Jagielski bool VistaFilePickerImpl::onFileTypeChanged( UINT /*nTypeIndex*/ )
1263*b1cdbd2cSJim Jagielski {
1264*b1cdbd2cSJim Jagielski 	return true;
1265*b1cdbd2cSJim Jagielski }
1266*b1cdbd2cSJim Jagielski 
1267*b1cdbd2cSJim Jagielski } // namespace vista
1268*b1cdbd2cSJim Jagielski } // namespace win32
1269*b1cdbd2cSJim Jagielski } // namespace fpicker
1270