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