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