1*b557fc96SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b557fc96SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b557fc96SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b557fc96SAndrew Rist  * distributed with this work for additional information
6*b557fc96SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b557fc96SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b557fc96SAndrew Rist  * "License"); you may not use this file except in compliance
9*b557fc96SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*b557fc96SAndrew Rist  *
11*b557fc96SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*b557fc96SAndrew Rist  *
13*b557fc96SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b557fc96SAndrew Rist  * software distributed under the License is distributed on an
15*b557fc96SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b557fc96SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b557fc96SAndrew Rist  * specific language governing permissions and limitations
18*b557fc96SAndrew Rist  * under the License.
19*b557fc96SAndrew Rist  *
20*b557fc96SAndrew Rist  *************************************************************/
21*b557fc96SAndrew Rist 
22*b557fc96SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_fpicker.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir //------------------------------------------------------------------------
28cdf0e10cSrcweir // includes
29cdf0e10cSrcweir //------------------------------------------------------------------------
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include "VistaFilePickerEventHandler.hxx"
32cdf0e10cSrcweir #include "asyncrequests.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35cdf0e10cSrcweir #include <com/sun/star/embed/XStorage.hpp>
36cdf0e10cSrcweir #include <com/sun/star/document/XDocumentRevisionListPersistence.hpp>
37cdf0e10cSrcweir #include <com/sun/star/util/RevisionTag.hpp>
38cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
39cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
42cdf0e10cSrcweir #include <comphelper/storagehelper.hxx>
43cdf0e10cSrcweir //#include <tools/urlobj.hxx>
44cdf0e10cSrcweir //#include <unotools/ucbhelper.hxx>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #include <osl/file.hxx>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir //------------------------------------------------------------------------
49cdf0e10cSrcweir // namespace directives
50cdf0e10cSrcweir //------------------------------------------------------------------------
51cdf0e10cSrcweir 
52cdf0e10cSrcweir namespace css = ::com::sun::star;
53cdf0e10cSrcweir 
54cdf0e10cSrcweir namespace fpicker{
55cdf0e10cSrcweir namespace win32{
56cdf0e10cSrcweir namespace vista{
57cdf0e10cSrcweir 
58cdf0e10cSrcweir //------------------------------------------------------------------------
59cdf0e10cSrcweir // defines
60cdf0e10cSrcweir //------------------------------------------------------------------------
61cdf0e10cSrcweir 
62cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
VistaFilePickerEventHandler(IVistaFilePickerInternalNotify * pInternalNotify)63cdf0e10cSrcweir VistaFilePickerEventHandler::VistaFilePickerEventHandler(IVistaFilePickerInternalNotify* pInternalNotify)
64cdf0e10cSrcweir     : m_nRefCount           (0       )
65cdf0e10cSrcweir     , m_nListenerHandle     (0       )
66cdf0e10cSrcweir     , m_pDialog             (        )
67cdf0e10cSrcweir     , m_lListener           (m_aMutex)
68cdf0e10cSrcweir 	, m_pInternalNotify     (pInternalNotify)
69cdf0e10cSrcweir {
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
72cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
~VistaFilePickerEventHandler()73cdf0e10cSrcweir VistaFilePickerEventHandler::~VistaFilePickerEventHandler()
74cdf0e10cSrcweir {
75cdf0e10cSrcweir }
76cdf0e10cSrcweir 
77cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
QueryInterface(REFIID rIID,void ** ppObject)78cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE VistaFilePickerEventHandler::QueryInterface(REFIID rIID    ,
79cdf0e10cSrcweir                                                                       void** ppObject)
80cdf0e10cSrcweir {
81cdf0e10cSrcweir 	*ppObject=NULL;
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 	if ( rIID == IID_IUnknown )
84cdf0e10cSrcweir 		*ppObject = (IUnknown*)(IFileDialogEvents*)this;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir 	if ( rIID == IID_IFileDialogEvents )
87cdf0e10cSrcweir 		*ppObject = (IFileDialogEvents*)this;
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 	if ( rIID == IID_IFileDialogControlEvents )
90cdf0e10cSrcweir 		*ppObject = (IFileDialogControlEvents*)this;
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 	if ( *ppObject != NULL )
93cdf0e10cSrcweir 	{
94cdf0e10cSrcweir 		((IUnknown*)*ppObject)->AddRef();
95cdf0e10cSrcweir 		return S_OK;
96cdf0e10cSrcweir 	}
97cdf0e10cSrcweir 
98cdf0e10cSrcweir 	return E_NOINTERFACE;
99cdf0e10cSrcweir }
100cdf0e10cSrcweir 
101cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
AddRef()102cdf0e10cSrcweir ULONG STDMETHODCALLTYPE VistaFilePickerEventHandler::AddRef()
103cdf0e10cSrcweir {
104cdf0e10cSrcweir 	return osl_incrementInterlockedCount(&m_nRefCount);
105cdf0e10cSrcweir }
106cdf0e10cSrcweir 
107cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
Release()108cdf0e10cSrcweir ULONG STDMETHODCALLTYPE VistaFilePickerEventHandler::Release()
109cdf0e10cSrcweir {
110cdf0e10cSrcweir 	ULONG nReturn = --m_nRefCount;
111cdf0e10cSrcweir 	if ( m_nRefCount == 0 )
112cdf0e10cSrcweir 		delete this;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir     return nReturn;
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnFileOk(IFileDialog *)118cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnFileOk(IFileDialog* /*pDialog*/)
119cdf0e10cSrcweir {
120cdf0e10cSrcweir     return E_NOTIMPL;
121cdf0e10cSrcweir }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnFolderChanging(IFileDialog *,IShellItem *)124cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnFolderChanging(IFileDialog* /*pDialog*/,
125cdf0e10cSrcweir                                                            IShellItem*  /*pFolder*/)
126cdf0e10cSrcweir {
127cdf0e10cSrcweir     return E_NOTIMPL;
128cdf0e10cSrcweir }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnFolderChange(IFileDialog *)131cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnFolderChange(IFileDialog* /*pDialog*/)
132cdf0e10cSrcweir {
133cdf0e10cSrcweir     impl_sendEvent(E_DIRECTORY_CHANGED, 0);
134cdf0e10cSrcweir     return S_OK;
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir //-----------------------------------------------------------------------------
lcl_getURLFromShellItem2(IShellItem * pItem)138cdf0e10cSrcweir ::rtl::OUString lcl_getURLFromShellItem2 (IShellItem* pItem)
139cdf0e10cSrcweir {
140cdf0e10cSrcweir     LPOLESTR pStr = NULL;
141cdf0e10cSrcweir 	::rtl::OUString sURL;
142cdf0e10cSrcweir 
143cdf0e10cSrcweir 	SIGDN   eConversion = SIGDN_FILESYSPATH;
144cdf0e10cSrcweir     HRESULT hr          = pItem->GetDisplayName ( eConversion, &pStr );
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     if ( FAILED(hr) )
147cdf0e10cSrcweir 	{
148cdf0e10cSrcweir 		eConversion = SIGDN_URL;
149cdf0e10cSrcweir 		hr          = pItem->GetDisplayName ( eConversion, &pStr );
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 		if ( FAILED(hr) )
152cdf0e10cSrcweir 			return ::rtl::OUString();
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 		sURL = ::rtl::OUString(reinterpret_cast<sal_Unicode*>(pStr));
155cdf0e10cSrcweir 	}
156cdf0e10cSrcweir 	else
157cdf0e10cSrcweir 	{
158cdf0e10cSrcweir 		::osl::FileBase::getFileURLFromSystemPath( reinterpret_cast<sal_Unicode*>(pStr), sURL );
159cdf0e10cSrcweir 	}
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     CoTaskMemFree (pStr);
162cdf0e10cSrcweir     return sURL;
163cdf0e10cSrcweir }
164cdf0e10cSrcweir 
165cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
lcl_updateVersionListDirectly(IFileDialog * pDialog)166cdf0e10cSrcweir void lcl_updateVersionListDirectly(IFileDialog* pDialog)
167cdf0e10cSrcweir {
168cdf0e10cSrcweir     static const ::rtl::OUString SERVICENAME_REVISIONPERSISTENCE = ::rtl::OUString::createFromAscii("com.sun.star.document.DocumentRevisionListPersistence");
169cdf0e10cSrcweir     static const ::sal_Int16     CONTROL_VERSIONLIST             = css::ui::dialogs::ExtendedFilePickerElementIds::LISTBOX_VERSION;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     TFileDialog          iDialog   (pDialog);
172cdf0e10cSrcweir     TFileOpenDialog      iOpen     ;
173cdf0e10cSrcweir     TFileDialogCustomize iCustomize;
174cdf0e10cSrcweir 
175cdf0e10cSrcweir #ifdef __MINGW32__
176cdf0e10cSrcweir     iDialog->QueryInterface(IID_IFileOpenDialog, (void**)(&iOpen));
177cdf0e10cSrcweir     iDialog->QueryInterface(IID_IFileDialogCustomize, (void**)(&iCustomize));
178cdf0e10cSrcweir #else
179cdf0e10cSrcweir     iDialog.query(&iOpen     );
180cdf0e10cSrcweir     iDialog.query(&iCustomize);
181cdf0e10cSrcweir #endif
182cdf0e10cSrcweir 
183cdf0e10cSrcweir     // make sure version list match to the current selection always ...
184cdf0e10cSrcweir     // at least an empty version list will be better then the wrong one .-)
185cdf0e10cSrcweir     iCustomize->RemoveAllControlItems(CONTROL_VERSIONLIST);
186cdf0e10cSrcweir 
187cdf0e10cSrcweir     HRESULT                   hResult = E_FAIL;
188cdf0e10cSrcweir     ComPtr< IShellItemArray > iItems;
189cdf0e10cSrcweir     ComPtr< IShellItem >      iItem;
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     if (iOpen.is())
192cdf0e10cSrcweir     {
193cdf0e10cSrcweir         hResult = iOpen->GetSelectedItems(&iItems);
194cdf0e10cSrcweir         if (FAILED(hResult))
195cdf0e10cSrcweir             return;
196cdf0e10cSrcweir 
197cdf0e10cSrcweir         DWORD nCount;
198cdf0e10cSrcweir         hResult = iItems->GetCount(&nCount);
199cdf0e10cSrcweir         if ( FAILED(hResult) )
200cdf0e10cSrcweir             return;
201cdf0e10cSrcweir 
202cdf0e10cSrcweir         // we can show one version list only within control
203cdf0e10cSrcweir         if (nCount != 1)
204cdf0e10cSrcweir             return;
205cdf0e10cSrcweir 
206cdf0e10cSrcweir         hResult = iItems->GetItemAt(0, &iItem);
207cdf0e10cSrcweir     }
208cdf0e10cSrcweir     else
209cdf0e10cSrcweir     if (iDialog.is())
210cdf0e10cSrcweir         hResult = iDialog->GetCurrentSelection(&iItem);
211cdf0e10cSrcweir 
212cdf0e10cSrcweir     if ( FAILED(hResult) )
213cdf0e10cSrcweir         return;
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     const ::rtl::OUString sURL = lcl_getURLFromShellItem2(iItem);
216cdf0e10cSrcweir     if (sURL.getLength() < 1)
217cdf0e10cSrcweir         return;
218cdf0e10cSrcweir /*
219cdf0e10cSrcweir     INetURLObject aURL(sURL);
220cdf0e10cSrcweir     if (aURL.GetProtocol() != INET_PROT_FILE)
221cdf0e10cSrcweir         return;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     ::rtl::OUString sMain = aURL.GetMainURL(INetURLObject::NO_DECODE);
224cdf0e10cSrcweir     if ( ! ::utl::UCBContentHelper::IsDocument(sURL))
225cdf0e10cSrcweir         return;
226cdf0e10cSrcweir */
227cdf0e10cSrcweir     try
228cdf0e10cSrcweir     {
229cdf0e10cSrcweir         css::uno::Reference< css::embed::XStorage > xStorage = ::comphelper::OStorageHelper::GetStorageFromURL(sURL, css::embed::ElementModes::READ);
230cdf0e10cSrcweir         if ( ! xStorage.is() )
231cdf0e10cSrcweir             return;
232cdf0e10cSrcweir 
233cdf0e10cSrcweir         css::uno::Reference< css::lang::XMultiServiceFactory >                 xSMGR     = ::comphelper::getProcessServiceFactory();
234cdf0e10cSrcweir         css::uno::Reference< css::document::XDocumentRevisionListPersistence > xReader   (xSMGR->createInstance(SERVICENAME_REVISIONPERSISTENCE), css::uno::UNO_QUERY_THROW);
235cdf0e10cSrcweir         css::uno::Sequence< css::util::RevisionTag >                           lVersions = xReader->load(xStorage);
236cdf0e10cSrcweir 
237cdf0e10cSrcweir         for (::sal_Int32 i=0; i<lVersions.getLength(); ++i)
238cdf0e10cSrcweir         {
239cdf0e10cSrcweir             const css::util::RevisionTag& aTag = lVersions[i];
240cdf0e10cSrcweir             iCustomize->AddControlItem(CONTROL_VERSIONLIST, i, reinterpret_cast<LPCTSTR>(aTag.Identifier.getStr()));
241cdf0e10cSrcweir         }
242cdf0e10cSrcweir         iCustomize->SetSelectedControlItem(CONTROL_VERSIONLIST, 0);
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir     catch(const css::uno::Exception&)
245cdf0e10cSrcweir     {}
246cdf0e10cSrcweir }
247cdf0e10cSrcweir 
248cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnSelectionChange(IFileDialog *)249cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnSelectionChange(IFileDialog* /*pDialog*/)
250cdf0e10cSrcweir {
251cdf0e10cSrcweir     impl_sendEvent(E_FILE_SELECTION_CHANGED, 0);
252cdf0e10cSrcweir     //lcl_updateVersionListDirectly(pDialog);
253cdf0e10cSrcweir     return S_OK;
254cdf0e10cSrcweir }
255cdf0e10cSrcweir 
256cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnShareViolation(IFileDialog *,IShellItem *,FDE_SHAREVIOLATION_RESPONSE *)257cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnShareViolation(IFileDialog*                 /*pDialog*/  ,
258cdf0e10cSrcweir 
259cdf0e10cSrcweir                                                            IShellItem*                  /*pItem*/    ,
260cdf0e10cSrcweir 
261cdf0e10cSrcweir                                                            FDE_SHAREVIOLATION_RESPONSE* /*pResponse*/)
262cdf0e10cSrcweir {
263cdf0e10cSrcweir     impl_sendEvent(E_CONTROL_STATE_CHANGED, css::ui::dialogs::CommonFilePickerElementIds::LISTBOX_FILTER);
264cdf0e10cSrcweir     return S_OK;
265cdf0e10cSrcweir }
266cdf0e10cSrcweir 
267cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnTypeChange(IFileDialog * pDialog)268cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnTypeChange(IFileDialog* pDialog)
269cdf0e10cSrcweir {
270cdf0e10cSrcweir     UINT nFileTypeIndex;
271cdf0e10cSrcweir 	HRESULT hResult = pDialog->GetFileTypeIndex( &nFileTypeIndex );
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 	if ( hResult == S_OK )
274cdf0e10cSrcweir 	{
275cdf0e10cSrcweir 		if ( m_pInternalNotify->onFileTypeChanged( nFileTypeIndex ))
276cdf0e10cSrcweir 			impl_sendEvent(E_CONTROL_STATE_CHANGED, css::ui::dialogs::CommonFilePickerElementIds::LISTBOX_FILTER);
277cdf0e10cSrcweir 	}
278cdf0e10cSrcweir 
279cdf0e10cSrcweir     return S_OK;
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
282cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnOverwrite(IFileDialog *,IShellItem *,FDE_OVERWRITE_RESPONSE *)283cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnOverwrite(IFileDialog*            /*pDialog*/  ,
284cdf0e10cSrcweir                                                       IShellItem*             /*pItem*/    ,
285cdf0e10cSrcweir                                                       FDE_OVERWRITE_RESPONSE* /*pResponse*/)
286cdf0e10cSrcweir {
287cdf0e10cSrcweir     return E_NOTIMPL;
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnItemSelected(IFileDialogCustomize *,DWORD nIDCtl,DWORD)291cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnItemSelected(IFileDialogCustomize* /*pCustomize*/,
292cdf0e10cSrcweir 
293cdf0e10cSrcweir                                                          DWORD                   nIDCtl      ,
294cdf0e10cSrcweir 
295cdf0e10cSrcweir                                                          DWORD                 /*nIDItem*/   )
296cdf0e10cSrcweir {
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     impl_sendEvent(E_CONTROL_STATE_CHANGED, static_cast<sal_Int16>( nIDCtl ));
299cdf0e10cSrcweir     return S_OK;
300cdf0e10cSrcweir }
301cdf0e10cSrcweir 
302cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnButtonClicked(IFileDialogCustomize *,DWORD nIDCtl)303cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnButtonClicked(IFileDialogCustomize* /*pCustomize*/,
304cdf0e10cSrcweir                                                           DWORD                 nIDCtl    )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir 
307cdf0e10cSrcweir     impl_sendEvent(E_CONTROL_STATE_CHANGED, static_cast<sal_Int16>( nIDCtl));
308cdf0e10cSrcweir     return S_OK;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnCheckButtonToggled(IFileDialogCustomize *,DWORD nIDCtl,BOOL bChecked)312cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnCheckButtonToggled(IFileDialogCustomize* /*pCustomize*/,
313cdf0e10cSrcweir                                                                DWORD                 nIDCtl    ,
314cdf0e10cSrcweir                                                                BOOL                  bChecked  )
315cdf0e10cSrcweir {
316cdf0e10cSrcweir 	if (nIDCtl == css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION)
317cdf0e10cSrcweir 		m_pInternalNotify->onAutoExtensionChanged(bChecked);
318cdf0e10cSrcweir 
319cdf0e10cSrcweir     impl_sendEvent(E_CONTROL_STATE_CHANGED, static_cast<sal_Int16>( nIDCtl));
320cdf0e10cSrcweir 
321cdf0e10cSrcweir     return S_OK;
322cdf0e10cSrcweir }
323cdf0e10cSrcweir 
324cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
OnControlActivating(IFileDialogCustomize *,DWORD nIDCtl)325cdf0e10cSrcweir STDMETHODIMP VistaFilePickerEventHandler::OnControlActivating(IFileDialogCustomize* /*pCustomize*/,
326cdf0e10cSrcweir                                                               DWORD                 nIDCtl    )
327cdf0e10cSrcweir {
328cdf0e10cSrcweir     impl_sendEvent(E_CONTROL_STATE_CHANGED, static_cast<sal_Int16>( nIDCtl));
329cdf0e10cSrcweir     return S_OK;
330cdf0e10cSrcweir }
331cdf0e10cSrcweir 
332cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
addFilePickerListener(const css::uno::Reference<css::ui::dialogs::XFilePickerListener> & xListener)333cdf0e10cSrcweir void SAL_CALL VistaFilePickerEventHandler::addFilePickerListener( const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener )
334cdf0e10cSrcweir     throw( css::uno::RuntimeException )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir     m_lListener.addInterface(::getCppuType( (const css::uno::Reference< css::ui::dialogs::XFilePickerListener >*)NULL ), xListener);
337cdf0e10cSrcweir }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
removeFilePickerListener(const css::uno::Reference<css::ui::dialogs::XFilePickerListener> & xListener)340cdf0e10cSrcweir void SAL_CALL VistaFilePickerEventHandler::removeFilePickerListener( const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener )
341cdf0e10cSrcweir     throw( css::uno::RuntimeException )
342cdf0e10cSrcweir {
343cdf0e10cSrcweir     m_lListener.removeInterface(::getCppuType( (const css::uno::Reference< css::ui::dialogs::XFilePickerListener >*)NULL ), xListener);
344cdf0e10cSrcweir }
345cdf0e10cSrcweir 
346cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
startListening(const TFileDialog & pBroadcaster)347cdf0e10cSrcweir void VistaFilePickerEventHandler::startListening( const TFileDialog& pBroadcaster )
348cdf0e10cSrcweir {
349cdf0e10cSrcweir     static const sal_Bool STARTUP_SUSPENDED = sal_True;
350cdf0e10cSrcweir     static const sal_Bool STARTUP_WORKING   = sal_False;
351cdf0e10cSrcweir 
352cdf0e10cSrcweir     if (m_pDialog.is())
353cdf0e10cSrcweir         return;
354cdf0e10cSrcweir 
355cdf0e10cSrcweir     m_pDialog = pBroadcaster;
356cdf0e10cSrcweir     m_pDialog->Advise(this, &m_nListenerHandle);
357cdf0e10cSrcweir }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
stopListening()360cdf0e10cSrcweir void VistaFilePickerEventHandler::stopListening()
361cdf0e10cSrcweir {
362cdf0e10cSrcweir     if (m_pDialog.is())
363cdf0e10cSrcweir     {
364cdf0e10cSrcweir         m_pDialog->Unadvise(m_nListenerHandle);
365cdf0e10cSrcweir         m_pDialog.release();
366cdf0e10cSrcweir     }
367cdf0e10cSrcweir }
368cdf0e10cSrcweir 
369cdf0e10cSrcweir static const ::rtl::OUString PROP_CONTROL_ID      = ::rtl::OUString::createFromAscii("control_id");
370cdf0e10cSrcweir static const ::rtl::OUString PROP_PICKER_LISTENER = ::rtl::OUString::createFromAscii("picker_listener");
371cdf0e10cSrcweir 
372cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
373cdf0e10cSrcweir class AsyncPickerEvents : public RequestHandler
374cdf0e10cSrcweir {
375cdf0e10cSrcweir public:
376cdf0e10cSrcweir 
AsyncPickerEvents()377cdf0e10cSrcweir     AsyncPickerEvents()
378cdf0e10cSrcweir     {}
379cdf0e10cSrcweir 
~AsyncPickerEvents()380cdf0e10cSrcweir     virtual ~AsyncPickerEvents()
381cdf0e10cSrcweir     {}
382cdf0e10cSrcweir 
before()383cdf0e10cSrcweir     virtual void before()
384cdf0e10cSrcweir     {}
385cdf0e10cSrcweir 
doRequest(const RequestRef & rRequest)386cdf0e10cSrcweir     virtual void doRequest(const RequestRef& rRequest)
387cdf0e10cSrcweir     {
388cdf0e10cSrcweir         const ::sal_Int32 nEventID   = rRequest->getRequest();
389cdf0e10cSrcweir         const ::sal_Int16 nControlID = rRequest->getArgumentOrDefault(PROP_CONTROL_ID, (::sal_Int16)0);
390cdf0e10cSrcweir         const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest->getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >());
391cdf0e10cSrcweir 
392cdf0e10cSrcweir         if ( ! xListener.is())
393cdf0e10cSrcweir             return;
394cdf0e10cSrcweir 
395cdf0e10cSrcweir         css::ui::dialogs::FilePickerEvent aEvent;
396cdf0e10cSrcweir         aEvent.ElementId = nControlID;
397cdf0e10cSrcweir 
398cdf0e10cSrcweir         switch (nEventID)
399cdf0e10cSrcweir         {
400cdf0e10cSrcweir             case VistaFilePickerEventHandler::E_FILE_SELECTION_CHANGED :
401cdf0e10cSrcweir                     xListener->fileSelectionChanged(aEvent);
402cdf0e10cSrcweir                     break;
403cdf0e10cSrcweir 
404cdf0e10cSrcweir             case VistaFilePickerEventHandler::E_DIRECTORY_CHANGED :
405cdf0e10cSrcweir                     xListener->directoryChanged(aEvent);
406cdf0e10cSrcweir                     break;
407cdf0e10cSrcweir 
408cdf0e10cSrcweir             case VistaFilePickerEventHandler::E_HELP_REQUESTED :
409cdf0e10cSrcweir                     xListener->helpRequested(aEvent);
410cdf0e10cSrcweir                     break;
411cdf0e10cSrcweir 
412cdf0e10cSrcweir             case VistaFilePickerEventHandler::E_CONTROL_STATE_CHANGED :
413cdf0e10cSrcweir                     xListener->controlStateChanged(aEvent);
414cdf0e10cSrcweir                     break;
415cdf0e10cSrcweir 
416cdf0e10cSrcweir             case VistaFilePickerEventHandler::E_DIALOG_SIZE_CHANGED :
417cdf0e10cSrcweir                     xListener->dialogSizeChanged();
418cdf0e10cSrcweir                     break;
419cdf0e10cSrcweir 
420cdf0e10cSrcweir             // no default here. Let compiler detect changes on enum set !
421cdf0e10cSrcweir         }
422cdf0e10cSrcweir     }
423cdf0e10cSrcweir 
after()424cdf0e10cSrcweir     virtual void after()
425cdf0e10cSrcweir     {}
426cdf0e10cSrcweir };
427cdf0e10cSrcweir 
428cdf0e10cSrcweir //-----------------------------------------------------------------------------------------
impl_sendEvent(EEventType eEventType,::sal_Int16 nControlID)429cdf0e10cSrcweir void VistaFilePickerEventHandler::impl_sendEvent(  EEventType eEventType,
430cdf0e10cSrcweir                                                  ::sal_Int16  nControlID)
431cdf0e10cSrcweir {
432cdf0e10cSrcweir     static AsyncRequests aNotify(RequestHandlerRef(new AsyncPickerEvents()));
433cdf0e10cSrcweir 
434cdf0e10cSrcweir     ::cppu::OInterfaceContainerHelper* pContainer = m_lListener.getContainer( ::getCppuType( ( const css::uno::Reference< css::ui::dialogs::XFilePickerListener >*) NULL ) );
435cdf0e10cSrcweir     if ( ! pContainer)
436cdf0e10cSrcweir         return;
437cdf0e10cSrcweir 
438cdf0e10cSrcweir     ::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
439cdf0e10cSrcweir     while (pIterator.hasMoreElements())
440cdf0e10cSrcweir     {
441cdf0e10cSrcweir         try
442cdf0e10cSrcweir         {
443cdf0e10cSrcweir             css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener (pIterator.next(), css::uno::UNO_QUERY);
444cdf0e10cSrcweir 
445cdf0e10cSrcweir             RequestRef rRequest(new Request());
446cdf0e10cSrcweir             rRequest->setRequest (eEventType);
447cdf0e10cSrcweir             rRequest->setArgument(PROP_PICKER_LISTENER, xListener);
448cdf0e10cSrcweir 			if ( nControlID )
449cdf0e10cSrcweir 				rRequest->setArgument(PROP_CONTROL_ID, nControlID);
450cdf0e10cSrcweir 
451cdf0e10cSrcweir             aNotify.triggerRequestDirectly(rRequest);
452cdf0e10cSrcweir             //aNotify.triggerRequestNonBlocked(rRequest);
453cdf0e10cSrcweir         }
454cdf0e10cSrcweir         catch(const css::uno::RuntimeException&)
455cdf0e10cSrcweir         {
456cdf0e10cSrcweir             pIterator.remove();
457cdf0e10cSrcweir         }
458cdf0e10cSrcweir     }
459cdf0e10cSrcweir }
460cdf0e10cSrcweir 
461cdf0e10cSrcweir } // namespace vista
462cdf0e10cSrcweir } // namespace win32
463cdf0e10cSrcweir } // namespace fpicker
464