LCOV - code coverage report
Current view: top level - fpicker/source/office - OfficeFilePicker.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 497 0.0 %
Date: 2014-04-14 Functions: 0 75 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include "OfficeFilePicker.hxx"
      22             : #include "iodlg.hxx"
      23             : 
      24             : #include <list>
      25             : #include <functional>
      26             : #include <algorithm>
      27             : #include <tools/urlobj.hxx>
      28             : #include <com/sun/star/uno/Any.hxx>
      29             : #include <com/sun/star/ui/dialogs/FilePickerEvent.hpp>
      30             : #include <com/sun/star/ui/dialogs/FilePreviewImageFormats.hpp>
      31             : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
      32             : #include <com/sun/star/beans/PropertyValue.hpp>
      33             : #include <com/sun/star/beans/XPropertySet.hpp>
      34             : #include <com/sun/star/awt/XWindow.hpp>
      35             : #include <com/sun/star/beans/StringPair.hpp>
      36             : #include <com/sun/star/uno/Sequence.hxx>
      37             : #include <com/sun/star/beans/NamedValue.hpp>
      38             : #include <unotools/ucbhelper.hxx>
      39             : #include <unotools/pathoptions.hxx>
      40             : #include <comphelper/sequence.hxx>
      41             : #include <cppuhelper/supportsservice.hxx>
      42             : #include <cppuhelper/typeprovider.hxx>
      43             : #include "osl/mutex.hxx"
      44             : #include "vcl/svapp.hxx"
      45             : 
      46             : // using ----------------------------------------------------------------
      47             : 
      48             : using namespace     ::com::sun::star::container;
      49             : using namespace     ::com::sun::star::lang;
      50             : using namespace     ::com::sun::star::ui::dialogs;
      51             : using namespace     ::com::sun::star::uno;
      52             : using namespace     ::com::sun::star::beans;
      53             : using namespace     ::com::sun::star::awt;
      54             : using namespace     ::utl;
      55             : 
      56             : 
      57             : 
      58             : 
      59             : 
      60           0 : struct FilterEntry
      61             : {
      62             : protected:
      63             :     OUString     m_sTitle;
      64             :     OUString     m_sFilter;
      65             : 
      66             :     UnoFilterList       m_aSubFilters;
      67             : 
      68             : public:
      69           0 :     FilterEntry( const OUString& _rTitle, const OUString& _rFilter )
      70             :         :m_sTitle( _rTitle )
      71           0 :         ,m_sFilter( _rFilter )
      72             :     {
      73           0 :     }
      74             : 
      75             :     FilterEntry( const OUString& _rTitle, const UnoFilterList& _rSubFilters );
      76             : 
      77           0 :     OUString     getTitle() const { return m_sTitle; }
      78           0 :     OUString     getFilter() const { return m_sFilter; }
      79             : 
      80             :     /// determines if the filter has sub filter (i.e., the filter is a filter group in real)
      81             :     sal_Bool            hasSubFilters( ) const;
      82             : 
      83             :     /** retrieves the filters belonging to the entry
      84             :     @return
      85             :         the number of sub filters
      86             :     */
      87             :     sal_Int32           getSubFilters( UnoFilterList& _rSubFilterList );
      88             : 
      89             :     // helpers for iterating the sub filters
      90           0 :     const UnoFilterEntry*   beginSubFilters() const { return m_aSubFilters.getConstArray(); }
      91           0 :     const UnoFilterEntry*   endSubFilters() const { return m_aSubFilters.getConstArray() + m_aSubFilters.getLength(); }
      92             : };
      93             : 
      94             : 
      95             : 
      96             : 
      97           0 : FilterEntry::FilterEntry( const OUString& _rTitle, const UnoFilterList& _rSubFilters )
      98             :     :m_sTitle( _rTitle )
      99           0 :     ,m_aSubFilters( _rSubFilters )
     100             : {
     101           0 : }
     102             : 
     103             : 
     104           0 : sal_Bool FilterEntry::hasSubFilters( ) const
     105             : {
     106           0 :     return ( 0 < m_aSubFilters.getLength() );
     107             : }
     108             : 
     109             : 
     110           0 : sal_Int32 FilterEntry::getSubFilters( UnoFilterList& _rSubFilterList )
     111             : {
     112           0 :     _rSubFilterList = m_aSubFilters;
     113           0 :     return m_aSubFilters.getLength();
     114             : }
     115             : 
     116             : // struct ElementEntry_Impl ----------------------------------------------
     117             : 
     118           0 : struct ElementEntry_Impl
     119             : {
     120             :     sal_Int16       m_nElementID;
     121             :     sal_Int16       m_nControlAction;
     122             :     Any         m_aValue;
     123             :     OUString       m_aLabel;
     124             :     sal_Bool        m_bEnabled      : 1;
     125             : 
     126             :     sal_Bool        m_bHasValue     : 1;
     127             :     sal_Bool        m_bHasLabel     : 1;
     128             :     sal_Bool        m_bHasEnabled   : 1;
     129             : 
     130             :                     ElementEntry_Impl( sal_Int16 nId );
     131             : 
     132           0 :     void            setValue( const Any& rVal ) { m_aValue = rVal; m_bHasValue = sal_True; }
     133           0 :     void            setAction( sal_Int16 nAction ) { m_nControlAction = nAction; }
     134           0 :     void            setLabel( const OUString& rVal ) { m_aLabel = rVal; m_bHasLabel = sal_True; }
     135           0 :     void            setEnabled( sal_Bool bEnabled ) { m_bEnabled = bEnabled; m_bHasEnabled = sal_True; }
     136             : };
     137             : 
     138           0 : ElementEntry_Impl::ElementEntry_Impl( sal_Int16 nId )
     139             :     : m_nElementID( nId )
     140             :     , m_nControlAction( 0 )
     141             :     , m_bEnabled( sal_False )
     142             :     , m_bHasValue( sal_False )
     143             :     , m_bHasLabel( sal_False )
     144           0 :     , m_bHasEnabled( sal_False )
     145           0 : {}
     146             : 
     147             : 
     148           0 : void SvtFilePicker::prepareExecute()
     149             : {
     150             :     // set the default directory
     151             :     // --**-- doesn't match the spec yet
     152           0 :     if ( !m_aDisplayDirectory.isEmpty() || !m_aDefaultName.isEmpty() )
     153             :     {
     154           0 :         if ( !m_aDisplayDirectory.isEmpty() )
     155             :         {
     156             : 
     157           0 :             INetURLObject aPath( m_aDisplayDirectory );
     158           0 :             if ( !m_aDefaultName.isEmpty() )
     159             :             {
     160           0 :                 aPath.insertName( m_aDefaultName );
     161           0 :                 getDialog()->SetHasFilename( true );
     162             :             }
     163           0 :             getDialog()->SetPath( aPath.GetMainURL( INetURLObject::NO_DECODE ) );
     164             :         }
     165           0 :         else if ( !m_aDefaultName.isEmpty() )
     166             :         {
     167           0 :             getDialog()->SetPath( m_aDefaultName );
     168           0 :             getDialog()->SetHasFilename( true );
     169             :         }
     170             :     }
     171             :     else
     172             :     {
     173             :         // Default-Standard-Dir setzen
     174           0 :         INetURLObject aStdDirObj( SvtPathOptions().GetWorkPath() );
     175           0 :         getDialog()->SetPath( aStdDirObj.GetMainURL( INetURLObject::NO_DECODE ) );
     176             :     }
     177             : 
     178             :     // set the control values and set the control labels, too
     179           0 :     if ( m_pElemList && !m_pElemList->empty() )
     180             :     {
     181           0 :         ::svt::OControlAccess aAccess( getDialog(), getDialog()->GetView() );
     182             : 
     183           0 :         ElementList::iterator aListIter;
     184           0 :         for ( aListIter = m_pElemList->begin();
     185           0 :               aListIter != m_pElemList->end(); ++aListIter )
     186             :         {
     187           0 :             ElementEntry_Impl& rEntry = *aListIter;
     188           0 :             if ( rEntry.m_bHasValue )
     189           0 :                 aAccess.setValue( rEntry.m_nElementID, rEntry.m_nControlAction, rEntry.m_aValue );
     190           0 :             if ( rEntry.m_bHasLabel )
     191           0 :                 aAccess.setLabel( rEntry.m_nElementID, rEntry.m_aLabel );
     192           0 :             if ( rEntry.m_bHasEnabled )
     193           0 :                 aAccess.enableControl( rEntry.m_nElementID, rEntry.m_bEnabled );
     194             :         }
     195             : 
     196           0 :         getDialog()->updateListboxLabelSizes();
     197             :     }
     198             : 
     199           0 :     if ( m_pFilterList && !m_pFilterList->empty() )
     200             :     {
     201           0 :         for (   FilterList::iterator aListIter = m_pFilterList->begin();
     202           0 :                 aListIter != m_pFilterList->end();
     203             :                 ++aListIter
     204             :             )
     205             :         {
     206           0 :             if ( aListIter->hasSubFilters() )
     207             :             {   // it's a filter group
     208           0 :                 UnoFilterList aSubFilters;
     209           0 :                 aListIter->getSubFilters( aSubFilters );
     210             : 
     211           0 :                 getDialog()->AddFilterGroup( aListIter->getTitle(), aSubFilters );
     212             :              }
     213             :             else
     214             :                 // it's a single filter
     215           0 :                 getDialog()->AddFilter( aListIter->getTitle(), aListIter->getFilter() );
     216             :         }
     217             :     }
     218             : 
     219             :     // set the default filter
     220           0 :     if ( !m_aCurrentFilter.isEmpty() )
     221           0 :         getDialog()->SetCurFilter( m_aCurrentFilter );
     222             : 
     223           0 : }
     224             : 
     225             : 
     226           0 : IMPL_LINK( SvtFilePicker, DialogClosedHdl, Dialog*, pDlg )
     227             : {
     228           0 :     if ( m_xDlgClosedListener.is() )
     229             :     {
     230           0 :         sal_Int16 nRet = static_cast< sal_Int16 >( pDlg->GetResult() );
     231           0 :         ::com::sun::star::ui::dialogs::DialogClosedEvent aEvent( *this, nRet );
     232           0 :         m_xDlgClosedListener->dialogClosed( aEvent );
     233           0 :         m_xDlgClosedListener.clear();
     234             :     }
     235           0 :     return 0;
     236             : }
     237             : 
     238             : 
     239             : // SvtFilePicker
     240             : 
     241             : 
     242             : 
     243           0 : WinBits SvtFilePicker::getWinBits( WinBits& rExtraBits )
     244             : {
     245             :     // set the winbits for creating the filedialog
     246           0 :     WinBits nBits = 0L;
     247           0 :     rExtraBits = 0L;
     248             : 
     249             :     // set the standard bits according to the service name
     250           0 :     if ( m_nServiceType == TemplateDescription::FILEOPEN_SIMPLE )
     251             :     {
     252           0 :         nBits = WB_OPEN;
     253             :     }
     254           0 :     else if ( m_nServiceType == TemplateDescription::FILESAVE_SIMPLE )
     255             :     {
     256           0 :         nBits = WB_SAVEAS;
     257             :     }
     258           0 :     else if ( m_nServiceType == TemplateDescription::FILESAVE_AUTOEXTENSION )
     259             :     {
     260           0 :         nBits = WB_SAVEAS;
     261           0 :         rExtraBits = SFX_EXTRA_AUTOEXTENSION;
     262             :     }
     263           0 :     else if ( m_nServiceType == TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD )
     264             :     {
     265           0 :         nBits = WB_SAVEAS | SFXWB_PASSWORD;
     266           0 :         rExtraBits = SFX_EXTRA_AUTOEXTENSION;
     267             :     }
     268           0 :     else if ( m_nServiceType == TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS )
     269             :     {
     270           0 :         nBits = WB_SAVEAS | SFXWB_PASSWORD;
     271           0 :         rExtraBits = SFX_EXTRA_AUTOEXTENSION | SFX_EXTRA_FILTEROPTIONS;
     272             :     }
     273           0 :     else if ( m_nServiceType == TemplateDescription::FILESAVE_AUTOEXTENSION_TEMPLATE )
     274             :     {
     275           0 :         nBits = WB_SAVEAS;
     276           0 :         rExtraBits = SFX_EXTRA_AUTOEXTENSION | SFX_EXTRA_TEMPLATES;
     277             :     }
     278           0 :     else if ( m_nServiceType == TemplateDescription::FILESAVE_AUTOEXTENSION_SELECTION )
     279             :     {
     280           0 :         nBits = WB_SAVEAS;
     281           0 :         rExtraBits = SFX_EXTRA_AUTOEXTENSION | SFX_EXTRA_SELECTION;
     282             :     }
     283             : 
     284           0 :     else if ( m_nServiceType == TemplateDescription::FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE )
     285             :     {
     286           0 :         nBits = WB_OPEN;
     287           0 :         rExtraBits = SFX_EXTRA_INSERTASLINK | SFX_EXTRA_SHOWPREVIEW | SFX_EXTRA_IMAGE_TEMPLATE;
     288             :     }
     289           0 :     else if ( m_nServiceType == TemplateDescription::FILEOPEN_PLAY )
     290             :     {
     291           0 :         nBits = WB_OPEN;
     292           0 :         rExtraBits = SFX_EXTRA_PLAYBUTTON;
     293             :     }
     294           0 :     else if ( m_nServiceType == TemplateDescription::FILEOPEN_READONLY_VERSION )
     295             :     {
     296           0 :         nBits = WB_OPEN | SFXWB_READONLY;
     297           0 :         rExtraBits = SFX_EXTRA_SHOWVERSIONS;
     298             :     }
     299           0 :     else if ( m_nServiceType == TemplateDescription::FILEOPEN_LINK_PREVIEW )
     300             :     {
     301           0 :         nBits = WB_OPEN;
     302           0 :         rExtraBits = SFX_EXTRA_INSERTASLINK | SFX_EXTRA_SHOWPREVIEW;
     303             :     }
     304           0 :     if ( m_bMultiSelection && ( ( nBits & WB_OPEN ) == WB_OPEN ) )
     305           0 :         nBits |= SFXWB_MULTISELECTION;
     306             : 
     307           0 :     return nBits;
     308             : }
     309             : 
     310             : 
     311           0 : void SvtFilePicker::notify( sal_Int16 _nEventId, sal_Int16 _nControlId )
     312             : {
     313           0 :     if ( !m_xListener.is() )
     314           0 :         return;
     315             : 
     316           0 :     FilePickerEvent aEvent( *this, _nControlId );
     317             : 
     318           0 :     switch ( _nEventId )
     319             :     {
     320             :         case FILE_SELECTION_CHANGED:
     321           0 :             m_xListener->fileSelectionChanged( aEvent );
     322           0 :             break;
     323             :         case DIRECTORY_CHANGED:
     324           0 :             m_xListener->directoryChanged( aEvent );
     325           0 :             break;
     326             :         case HELP_REQUESTED:
     327           0 :             m_xListener->helpRequested( aEvent );
     328           0 :             break;
     329             :         case CTRL_STATE_CHANGED:
     330           0 :             m_xListener->controlStateChanged( aEvent );
     331           0 :             break;
     332             :         case DIALOG_SIZE_CHANGED:
     333           0 :             m_xListener->dialogSizeChanged();
     334           0 :             break;
     335             :         default:
     336             :             SAL_WARN( "fpicker.office", "SvtFilePicker::notify(): Unknown event id!" );
     337           0 :             break;
     338           0 :     }
     339             : }
     340             : 
     341             : 
     342             : namespace {
     343             : 
     344             :     struct FilterTitleMatch : public ::std::unary_function< FilterEntry, bool >
     345             :     {
     346             :     protected:
     347             :         const OUString& rTitle;
     348             : 
     349             :     public:
     350           0 :         FilterTitleMatch( const OUString& _rTitle ) : rTitle( _rTitle ) { }
     351             : 
     352             : 
     353           0 :         bool operator () ( const FilterEntry& _rEntry )
     354             :         {
     355             :             sal_Bool bMatch;
     356           0 :             if ( !_rEntry.hasSubFilters() )
     357             :                 // a real filter
     358           0 :                 bMatch = ( _rEntry.getTitle() == rTitle );
     359             :             else
     360             :                 // a filter group -> search the sub filters
     361             :                 bMatch =
     362           0 :                     _rEntry.endSubFilters() != ::std::find_if(
     363             :                         _rEntry.beginSubFilters(),
     364             :                         _rEntry.endSubFilters(),
     365             :                         *this
     366           0 :                     );
     367             : 
     368           0 :             return bMatch ? true : false;
     369             :         }
     370           0 :         bool operator () ( const UnoFilterEntry& _rEntry )
     371             :         {
     372           0 :             return _rEntry.First == rTitle ? true : false;
     373             :         }
     374             :     };
     375             : }
     376             : 
     377             : 
     378           0 : sal_Bool SvtFilePicker::FilterNameExists( const OUString& rTitle )
     379             : {
     380           0 :     sal_Bool bRet = sal_False;
     381             : 
     382           0 :     if ( m_pFilterList )
     383             :         bRet =
     384           0 :             m_pFilterList->end() != ::std::find_if(
     385             :                 m_pFilterList->begin(),
     386             :                 m_pFilterList->end(),
     387             :                 FilterTitleMatch( rTitle )
     388           0 :             );
     389             : 
     390           0 :     return bRet;
     391             : }
     392             : 
     393             : 
     394           0 : sal_Bool SvtFilePicker::FilterNameExists( const UnoFilterList& _rGroupedFilters )
     395             : {
     396           0 :     sal_Bool bRet = sal_False;
     397             : 
     398           0 :     if ( m_pFilterList )
     399             :     {
     400           0 :         const UnoFilterEntry* pStart = _rGroupedFilters.getConstArray();
     401           0 :         const UnoFilterEntry* pEnd = pStart + _rGroupedFilters.getLength();
     402           0 :         for ( ; pStart != pEnd; ++pStart )
     403           0 :             if ( m_pFilterList->end() != ::std::find_if( m_pFilterList->begin(), m_pFilterList->end(), FilterTitleMatch( pStart->First ) ) )
     404           0 :                 break;
     405             : 
     406           0 :         bRet = pStart != pEnd;
     407             :     }
     408             : 
     409           0 :     return bRet;
     410             : }
     411             : 
     412             : 
     413           0 : void SvtFilePicker::ensureFilterList( const OUString& _rInitialCurrentFilter )
     414             : {
     415           0 :     if ( !m_pFilterList )
     416             :     {
     417           0 :         m_pFilterList = new FilterList;
     418             : 
     419             :         // set the first filter to the current filter
     420           0 :         if ( m_aCurrentFilter.isEmpty() )
     421           0 :             m_aCurrentFilter = _rInitialCurrentFilter;
     422             :     }
     423           0 : }
     424             : 
     425             : 
     426             : // class SvtFilePicker
     427             : 
     428           0 : SvtFilePicker::SvtFilePicker( const Reference < XMultiServiceFactory >& xFactory )
     429             :     :OCommonPicker( xFactory )
     430             :     ,m_pFilterList      ( NULL )
     431             :     ,m_pElemList        ( NULL )
     432             :     ,m_bMultiSelection  ( sal_False )
     433           0 :     ,m_nServiceType     ( TemplateDescription::FILEOPEN_SIMPLE )
     434             : {
     435           0 : }
     436             : 
     437           0 : SvtFilePicker::~SvtFilePicker()
     438             : {
     439           0 :     if ( m_pFilterList && !m_pFilterList->empty() )
     440           0 :         m_pFilterList->erase( m_pFilterList->begin(), m_pFilterList->end() );
     441           0 :     delete m_pFilterList;
     442             : 
     443           0 :     if ( m_pElemList && !m_pElemList->empty() )
     444           0 :         m_pElemList->erase( m_pElemList->begin(), m_pElemList->end() );
     445           0 :     delete m_pElemList;
     446           0 : }
     447             : 
     448             : 
     449           0 : sal_Int16 SvtFilePicker::implExecutePicker( )
     450             : {
     451           0 :     getDialog()->SetFileCallback( this );
     452             : 
     453           0 :     prepareExecute();
     454             : 
     455           0 :     getDialog()->EnableAutocompletion( sal_True );
     456             :     // now we are ready to execute the dialog
     457           0 :     sal_Int16 nRet = getDialog()->Execute();
     458             : 
     459             :     // the execution of the dialog yields, so it is possible the at this point the window or the dialog is closed
     460           0 :     if ( getDialog() )
     461           0 :         getDialog()->SetFileCallback( NULL );
     462             : 
     463           0 :     return nRet;
     464             : }
     465             : 
     466             : 
     467           0 : SvtFileDialog* SvtFilePicker::implCreateDialog( Window* _pParent )
     468             : {
     469             :     WinBits nExtraBits;
     470           0 :     WinBits nBits = getWinBits( nExtraBits );
     471             : 
     472           0 :     SvtFileDialog* dialog = new SvtFileDialog( _pParent, nBits, nExtraBits );
     473             : 
     474             :     // Set StandardDir if present
     475           0 :     if ( !m_aStandardDir.isEmpty())
     476             :     {
     477           0 :         OUString sStandardDir = m_aStandardDir;
     478           0 :         dialog->SetStandardDir( sStandardDir );
     479           0 :         dialog->SetBlackList( m_aBlackList );
     480             :     }
     481             : 
     482           0 :     return dialog;
     483             : }
     484             : 
     485             : 
     486             : // disambiguate XInterface
     487             : 
     488           0 : IMPLEMENT_FORWARD_XINTERFACE2( SvtFilePicker, OCommonPicker, SvtFilePicker_Base )
     489             : 
     490             : 
     491             : // disambiguate XTypeProvider
     492             : 
     493           0 : IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvtFilePicker, OCommonPicker, SvtFilePicker_Base )
     494             : 
     495             : 
     496             : // XExecutableDialog functions
     497             : 
     498             : 
     499             : 
     500           0 : void SAL_CALL SvtFilePicker::setTitle( const OUString& _rTitle ) throw (RuntimeException, std::exception)
     501             : {
     502           0 :     OCommonPicker::setTitle( _rTitle );
     503           0 : }
     504             : 
     505             : 
     506           0 : sal_Int16 SAL_CALL SvtFilePicker::execute(  ) throw (RuntimeException, std::exception)
     507             : {
     508           0 :     return OCommonPicker::execute();
     509             : }
     510             : 
     511             : 
     512             : // XAsynchronousExecutableDialog functions
     513             : 
     514             : 
     515             : 
     516           0 : void SAL_CALL SvtFilePicker::setDialogTitle( const OUString& _rTitle ) throw (RuntimeException, std::exception)
     517             : {
     518           0 :     setTitle( _rTitle );
     519           0 : }
     520             : 
     521             : 
     522           0 : void SAL_CALL SvtFilePicker::startExecuteModal( const Reference< ::com::sun::star::ui::dialogs::XDialogClosedListener >& xListener )
     523             :     throw (RuntimeException,
     524             :            std::exception)
     525             : {
     526           0 :     m_xDlgClosedListener = xListener;
     527           0 :     prepareDialog();
     528           0 :     prepareExecute();
     529           0 :     getDialog()->EnableAutocompletion( sal_True );
     530           0 :     getDialog()->StartExecuteModal( LINK( this, SvtFilePicker, DialogClosedHdl ) );
     531           0 : }
     532             : 
     533             : 
     534             : // XFilePicker functions
     535             : 
     536             : 
     537           0 : void SAL_CALL SvtFilePicker::setMultiSelectionMode( sal_Bool bMode ) throw( RuntimeException, std::exception )
     538             : {
     539           0 :     checkAlive();
     540             : 
     541           0 :     SolarMutexGuard aGuard;
     542           0 :     m_bMultiSelection = bMode;
     543           0 : }
     544             : 
     545           0 : void SAL_CALL SvtFilePicker::setDefaultName( const OUString& aName ) throw( RuntimeException, std::exception )
     546             : {
     547           0 :     checkAlive();
     548             : 
     549           0 :     SolarMutexGuard aGuard;
     550           0 :     m_aDefaultName = aName;
     551           0 : }
     552             : 
     553           0 : void SAL_CALL SvtFilePicker::setDisplayDirectory( const OUString& aDirectory )
     554             :     throw( IllegalArgumentException, RuntimeException, std::exception )
     555             : {
     556           0 :     checkAlive();
     557             : 
     558           0 :     SolarMutexGuard aGuard;
     559           0 :     m_aDisplayDirectory = aDirectory;
     560           0 : }
     561             : 
     562           0 : OUString SAL_CALL SvtFilePicker::getDisplayDirectory() throw( RuntimeException, std::exception )
     563             : {
     564           0 :     checkAlive();
     565             : 
     566           0 :     SolarMutexGuard aGuard;
     567           0 :     if ( getDialog() )
     568             :     {
     569           0 :         OUString aPath = getDialog()->GetPath();
     570             : 
     571             :         // #97148# ----
     572           0 :         if( m_aOldHideDirectory == aPath )
     573           0 :             return m_aOldDisplayDirectory;
     574           0 :         m_aOldHideDirectory = aPath;
     575             : 
     576             :         // #102204# -----
     577           0 :         if( !getDialog()->ContentIsFolder( aPath ) )
     578             :         {
     579           0 :             INetURLObject aFolder( aPath );
     580           0 :             aFolder.CutLastName();
     581           0 :             aPath = aFolder.GetMainURL( INetURLObject::NO_DECODE );
     582             :         }
     583           0 :         m_aOldDisplayDirectory = aPath;
     584           0 :         return aPath;
     585             :     }
     586             :     else
     587           0 :         return m_aDisplayDirectory;
     588             : }
     589             : 
     590           0 : Sequence< OUString > SAL_CALL SvtFilePicker::getFiles() throw( RuntimeException, std::exception )
     591             : {
     592           0 :     checkAlive();
     593             : 
     594           0 :     SolarMutexGuard aGuard;
     595           0 :     if ( ! getDialog() )
     596             :     {
     597           0 :         Sequence< OUString > aEmpty;
     598           0 :         return aEmpty;
     599             :     }
     600             : 
     601             :     // if there is more than one path we have to return the path to the
     602             :     // files first and then the list of the selected entries
     603             : 
     604           0 :     std::vector<OUString> aPathList(getDialog()->GetPathList());
     605           0 :     size_t nCount = aPathList.size();
     606           0 :     size_t nTotal = nCount > 1 ? nCount+1: nCount;
     607             : 
     608           0 :     Sequence< OUString > aPath( nTotal );
     609             : 
     610           0 :     if ( nCount == 1 )
     611           0 :         aPath[0] = aPathList[0];
     612           0 :     else if ( nCount > 1 )
     613             :     {
     614           0 :         INetURLObject aObj(aPathList[0]);
     615           0 :         aObj.removeSegment();
     616           0 :         aPath[0] = aObj.GetMainURL( INetURLObject::NO_DECODE );
     617             : 
     618           0 :         for(size_t i = 0; i < aPathList.size(); ++i)
     619             :         {
     620           0 :             aObj.SetURL(aPathList[i]);
     621           0 :             aPath[i + 1] = aObj.getName();
     622           0 :         }
     623             :     }
     624             : 
     625           0 :     return aPath;
     626             : }
     627             : 
     628             : 
     629             : // XFilePickerControlAccess functions
     630             : 
     631             : 
     632           0 : void SAL_CALL SvtFilePicker::setValue( sal_Int16 nElementID,
     633             :                                        sal_Int16 nControlAction,
     634             :                                        const Any& rValue )
     635             :     throw( RuntimeException, std::exception )
     636             : {
     637           0 :     checkAlive();
     638             : 
     639           0 :     SolarMutexGuard aGuard;
     640           0 :     if ( getDialog() )
     641             :     {
     642           0 :         ::svt::OControlAccess aAccess( getDialog(), getDialog()->GetView() );
     643           0 :         aAccess.setValue( nElementID, nControlAction, rValue );
     644             :     }
     645             :     else
     646             :     {
     647           0 :         if ( !m_pElemList )
     648           0 :             m_pElemList = new ElementList;
     649             : 
     650           0 :         sal_Bool bFound = sal_False;
     651           0 :         ElementList::iterator aListIter;
     652             : 
     653           0 :         for ( aListIter = m_pElemList->begin();
     654           0 :               aListIter != m_pElemList->end(); ++aListIter )
     655             :         {
     656           0 :             ElementEntry_Impl& rEntry = *aListIter;
     657           0 :             if ( ( rEntry.m_nElementID == nElementID ) &&
     658           0 :                  ( !rEntry.m_bHasValue || ( rEntry.m_nControlAction == nControlAction ) ) )
     659             :             {
     660           0 :                 rEntry.setAction( nControlAction );
     661           0 :                 rEntry.setValue( rValue );
     662           0 :                 bFound = sal_True;
     663             :             }
     664             :         }
     665             : 
     666           0 :         if ( !bFound )
     667             :         {
     668           0 :             ElementEntry_Impl aNew( nElementID );
     669           0 :             aNew.setAction( nControlAction );
     670           0 :             aNew.setValue( rValue );
     671           0 :             m_pElemList->insert( m_pElemList->end(), aNew );
     672             :         }
     673           0 :     }
     674           0 : }
     675             : 
     676             : 
     677             : 
     678           0 : Any SAL_CALL SvtFilePicker::getValue( sal_Int16 nElementID, sal_Int16 nControlAction )
     679             :     throw( RuntimeException, std::exception )
     680             : {
     681           0 :     checkAlive();
     682             : 
     683           0 :     SolarMutexGuard aGuard;
     684           0 :     Any      aAny;
     685             : 
     686             :     // execute() called?
     687           0 :     if ( getDialog() )
     688             :     {
     689           0 :         ::svt::OControlAccess aAccess( getDialog(), getDialog()->GetView() );
     690           0 :         aAny = aAccess.getValue( nElementID, nControlAction );
     691             :     }
     692           0 :     else if ( m_pElemList && !m_pElemList->empty() )
     693             :     {
     694           0 :         ElementList::iterator aListIter;
     695           0 :         for ( aListIter = m_pElemList->begin();
     696           0 :               aListIter != m_pElemList->end(); ++aListIter )
     697             :         {
     698           0 :             ElementEntry_Impl& rEntry = *aListIter;
     699           0 :             if ( ( rEntry.m_nElementID == nElementID ) &&
     700           0 :                  ( rEntry.m_bHasValue ) &&
     701           0 :                  ( rEntry.m_nControlAction == nControlAction ) )
     702             :             {
     703           0 :                 aAny = rEntry.m_aValue;
     704           0 :                 break;
     705             :             }
     706             :         }
     707             :     }
     708             : 
     709           0 :     return aAny;
     710             : }
     711             : 
     712             : 
     713             : 
     714           0 : void SAL_CALL SvtFilePicker::setLabel( sal_Int16 nLabelID, const OUString& rValue )
     715             :     throw ( RuntimeException, std::exception )
     716             : {
     717           0 :     checkAlive();
     718             : 
     719           0 :     SolarMutexGuard aGuard;
     720           0 :     if ( getDialog() )
     721             :     {
     722           0 :         ::svt::OControlAccess aAccess( getDialog(), getDialog()->GetView() );
     723           0 :         aAccess.setLabel( nLabelID, rValue );
     724             :     }
     725             :     else
     726             :     {
     727           0 :         if ( !m_pElemList )
     728           0 :             m_pElemList = new ElementList;
     729             : 
     730           0 :         sal_Bool bFound = sal_False;
     731           0 :         ElementList::iterator aListIter;
     732             : 
     733           0 :         for ( aListIter = m_pElemList->begin();
     734           0 :               aListIter != m_pElemList->end(); ++aListIter )
     735             :         {
     736           0 :             ElementEntry_Impl& rEntry = *aListIter;
     737           0 :             if ( rEntry.m_nElementID == nLabelID )
     738             :             {
     739           0 :                 rEntry.setLabel( rValue );
     740           0 :                 bFound = sal_True;
     741             :             }
     742             :         }
     743             : 
     744           0 :         if ( !bFound )
     745             :         {
     746           0 :             ElementEntry_Impl aNew( nLabelID );
     747           0 :             aNew.setLabel( rValue );
     748           0 :             m_pElemList->insert( m_pElemList->end(), aNew );
     749             :         }
     750           0 :     }
     751           0 : }
     752             : 
     753             : 
     754           0 : OUString SAL_CALL SvtFilePicker::getLabel( sal_Int16 nLabelID )
     755             :     throw ( RuntimeException, std::exception )
     756             : {
     757           0 :     checkAlive();
     758             : 
     759           0 :     SolarMutexGuard aGuard;
     760           0 :     OUString aLabel;
     761             : 
     762           0 :     if ( getDialog() )
     763             :     {
     764           0 :         ::svt::OControlAccess aAccess( getDialog(), getDialog()->GetView() );
     765           0 :         aLabel = aAccess.getLabel( nLabelID );
     766             :     }
     767           0 :     else if ( m_pElemList && !m_pElemList->empty() )
     768             :     {
     769           0 :         ElementList::iterator aListIter;
     770           0 :         for ( aListIter = m_pElemList->begin();
     771           0 :               aListIter != m_pElemList->end(); ++aListIter )
     772             :         {
     773           0 :             ElementEntry_Impl& rEntry = *aListIter;
     774           0 :             if ( rEntry.m_nElementID == nLabelID )
     775             :             {
     776           0 :                 if ( rEntry.m_bHasLabel )
     777           0 :                     aLabel = rEntry.m_aLabel;
     778           0 :                 break;
     779             :             }
     780             :         }
     781             :     }
     782             : 
     783           0 :     return aLabel;
     784             : }
     785             : 
     786             : 
     787           0 : void SAL_CALL SvtFilePicker::enableControl( sal_Int16 nElementID, sal_Bool bEnable )
     788             :     throw( RuntimeException, std::exception )
     789             : {
     790           0 :     checkAlive();
     791             : 
     792           0 :     SolarMutexGuard aGuard;
     793           0 :     if ( getDialog() )
     794             :     {
     795           0 :         ::svt::OControlAccess aAccess( getDialog(), getDialog()->GetView() );
     796           0 :         aAccess.enableControl( nElementID, bEnable );
     797             :     }
     798             :     else
     799             :     {
     800           0 :         if ( !m_pElemList )
     801           0 :             m_pElemList = new ElementList;
     802             : 
     803           0 :         sal_Bool bFound = sal_False;
     804           0 :         ElementList::iterator aListIter;
     805             : 
     806           0 :         for ( aListIter = m_pElemList->begin();
     807           0 :               aListIter != m_pElemList->end(); ++aListIter )
     808             :         {
     809           0 :             ElementEntry_Impl& rEntry = *aListIter;
     810           0 :             if ( rEntry.m_nElementID == nElementID )
     811             :             {
     812           0 :                 rEntry.setEnabled( bEnable );
     813           0 :                 bFound = sal_True;
     814             :             }
     815             :         }
     816             : 
     817           0 :         if ( !bFound )
     818             :         {
     819           0 :             ElementEntry_Impl aNew( nElementID );
     820           0 :             aNew.setEnabled( bEnable );
     821           0 :             m_pElemList->insert( m_pElemList->end(), aNew );
     822             :         }
     823           0 :     }
     824           0 : }
     825             : 
     826             : 
     827             : // XFilePickerNotifier functions
     828             : 
     829             : 
     830           0 : void SAL_CALL SvtFilePicker::addFilePickerListener( const Reference< XFilePickerListener >& xListener ) throw ( RuntimeException, std::exception )
     831             : {
     832           0 :     checkAlive();
     833             : 
     834           0 :     SolarMutexGuard aGuard;
     835           0 :     m_xListener = xListener;
     836           0 : }
     837             : 
     838             : 
     839           0 : void SAL_CALL SvtFilePicker::removeFilePickerListener( const Reference< XFilePickerListener >& ) throw ( RuntimeException, std::exception )
     840             : {
     841           0 :     checkAlive();
     842             : 
     843           0 :     SolarMutexGuard aGuard;
     844           0 :     m_xListener.clear();
     845           0 : }
     846             : 
     847             : 
     848             : // XFilePreview functions
     849             : 
     850             : 
     851           0 : Sequence< sal_Int16 > SAL_CALL SvtFilePicker::getSupportedImageFormats()
     852             :     throw ( RuntimeException, std::exception )
     853             : {
     854           0 :     checkAlive();
     855             : 
     856           0 :     SolarMutexGuard aGuard;
     857           0 :     Sequence< sal_Int16 > aFormats( 1 );
     858             : 
     859           0 :     aFormats[0] = FilePreviewImageFormats::BITMAP;
     860             : 
     861           0 :     return aFormats;
     862             : }
     863             : 
     864             : 
     865           0 : sal_Int32 SAL_CALL SvtFilePicker::getTargetColorDepth() throw ( RuntimeException, std::exception )
     866             : {
     867           0 :     checkAlive();
     868             : 
     869           0 :     SolarMutexGuard aGuard;
     870           0 :     sal_Int32 nDepth = 0;
     871             : 
     872           0 :     if ( getDialog() )
     873           0 :         nDepth = getDialog()->getTargetColorDepth();
     874             : 
     875           0 :     return nDepth;
     876             : }
     877             : 
     878             : 
     879           0 : sal_Int32 SAL_CALL SvtFilePicker::getAvailableWidth() throw ( RuntimeException, std::exception )
     880             : {
     881           0 :     checkAlive();
     882             : 
     883           0 :     SolarMutexGuard aGuard;
     884           0 :     sal_Int32 nWidth = 0;
     885             : 
     886           0 :     if ( getDialog() )
     887           0 :         nWidth = getDialog()->getAvailableWidth();
     888             : 
     889           0 :     return nWidth;
     890             : }
     891             : 
     892             : 
     893           0 : sal_Int32 SAL_CALL SvtFilePicker::getAvailableHeight() throw ( RuntimeException, std::exception )
     894             : {
     895           0 :     checkAlive();
     896             : 
     897           0 :     SolarMutexGuard aGuard;
     898           0 :     sal_Int32 nHeight = 0;
     899             : 
     900           0 :     if ( getDialog() )
     901           0 :         nHeight = getDialog()->getAvailableHeight();
     902             : 
     903           0 :     return nHeight;
     904             : }
     905             : 
     906             : 
     907           0 : void SAL_CALL SvtFilePicker::setImage( sal_Int16 aImageFormat, const Any& rImage )
     908             :     throw ( IllegalArgumentException, RuntimeException, std::exception )
     909             : {
     910           0 :     checkAlive();
     911             : 
     912           0 :     SolarMutexGuard aGuard;
     913           0 :     if ( getDialog() )
     914           0 :         getDialog()->setImage( aImageFormat, rImage );
     915           0 : }
     916             : 
     917             : 
     918           0 : sal_Bool SAL_CALL SvtFilePicker::setShowState( sal_Bool bShowState )
     919             :     throw ( RuntimeException, std::exception )
     920             : {
     921           0 :     checkAlive();
     922             : 
     923           0 :     SolarMutexGuard aGuard;
     924           0 :     sal_Bool bRet = sal_False;
     925             : 
     926           0 :     if ( getDialog() )
     927           0 :         bRet = getDialog()->setShowState( bShowState );
     928             : 
     929           0 :     return bRet;
     930             : }
     931             : 
     932             : 
     933           0 : sal_Bool SAL_CALL SvtFilePicker::getShowState() throw ( RuntimeException, std::exception )
     934             : {
     935           0 :     checkAlive();
     936             : 
     937           0 :     SolarMutexGuard aGuard;
     938           0 :     sal_Bool bRet = sal_False;
     939             : 
     940           0 :     if ( getDialog() )
     941           0 :         bRet = getDialog()->getShowState();
     942             : 
     943           0 :     return bRet;
     944             : }
     945             : 
     946             : 
     947             : // XFilterGroupManager functions
     948             : 
     949             : 
     950           0 : void SAL_CALL SvtFilePicker::appendFilterGroup( const OUString& sGroupTitle,
     951             :                                                 const Sequence< StringPair >& aFilters )
     952             :     throw ( IllegalArgumentException, RuntimeException, std::exception )
     953             : {
     954           0 :     checkAlive();
     955             : 
     956           0 :     SolarMutexGuard aGuard;
     957             : 
     958             :     // check the names
     959           0 :     if ( FilterNameExists( aFilters ) )
     960             :         throw IllegalArgumentException(
     961             :             OUString("filter name exists"),
     962           0 :             static_cast< OWeakObject * >(this), 1);
     963             : 
     964             :     // ensure that we have a filter list
     965           0 :     OUString sInitialCurrentFilter;
     966           0 :     if ( aFilters.getLength() )
     967           0 :         sInitialCurrentFilter = aFilters[0].First;
     968           0 :     ensureFilterList( sInitialCurrentFilter );
     969             : 
     970             :     // append the filter
     971           0 :     m_pFilterList->insert( m_pFilterList->end(), FilterEntry( sGroupTitle, aFilters ) );
     972           0 : }
     973             : 
     974             : 
     975             : // XFilterManager functions
     976             : 
     977             : 
     978           0 : void SAL_CALL SvtFilePicker::appendFilter( const OUString& aTitle,
     979             :                                            const OUString& aFilter )
     980             :     throw( IllegalArgumentException, RuntimeException, std::exception )
     981             : {
     982           0 :     checkAlive();
     983             : 
     984           0 :     SolarMutexGuard aGuard;
     985             :     // check the name
     986           0 :     if ( FilterNameExists( aTitle ) )
     987             :         // TODO: a more precise exception message
     988           0 :         throw IllegalArgumentException();
     989             : 
     990             :     // ensure that we have a filter list
     991           0 :     ensureFilterList( aTitle );
     992             : 
     993             :     // append the filter
     994           0 :     m_pFilterList->insert( m_pFilterList->end(), FilterEntry( aTitle, aFilter ) );
     995           0 : }
     996             : 
     997             : 
     998           0 : void SAL_CALL SvtFilePicker::setCurrentFilter( const OUString& aTitle )
     999             :     throw( IllegalArgumentException, RuntimeException, std::exception )
    1000             : {
    1001           0 :     checkAlive();
    1002             : 
    1003           0 :     SolarMutexGuard aGuard;
    1004           0 :     if ( ! FilterNameExists( aTitle ) )
    1005           0 :         throw IllegalArgumentException();
    1006             : 
    1007           0 :     m_aCurrentFilter = aTitle;
    1008             : 
    1009           0 :     if ( getDialog() )
    1010           0 :         getDialog()->SetCurFilter( aTitle );
    1011           0 : }
    1012             : 
    1013             : 
    1014           0 : OUString SAL_CALL SvtFilePicker::getCurrentFilter()
    1015             :     throw( RuntimeException, std::exception )
    1016             : {
    1017           0 :     checkAlive();
    1018             : 
    1019           0 :     SolarMutexGuard aGuard;
    1020           0 :     OUString aFilter = getDialog() ? OUString( getDialog()->GetCurFilter() ) :
    1021           0 :                                             OUString( m_aCurrentFilter );
    1022           0 :     return aFilter;
    1023             : }
    1024             : 
    1025             : 
    1026             : 
    1027             : // XInitialization functions
    1028             : 
    1029             : 
    1030           0 : void SAL_CALL SvtFilePicker::initialize( const Sequence< Any >& _rArguments )
    1031             :     throw ( Exception, RuntimeException, std::exception )
    1032             : {
    1033           0 :     checkAlive();
    1034             : 
    1035           0 :     Sequence< Any > aArguments( _rArguments.getLength());
    1036             : 
    1037           0 :     m_nServiceType = TemplateDescription::FILEOPEN_SIMPLE;
    1038             : 
    1039           0 :     if ( _rArguments.getLength() >= 1 )
    1040             :     {
    1041             :         // compatibility: one argument, type sal_Int16 , specifies the service type
    1042           0 :         int index = 0;
    1043             : 
    1044           0 :         if (_rArguments[0] >>= m_nServiceType)
    1045             :         {
    1046             :             // skip the first entry if it was the ServiceType, because it's not needed in OCommonPicker::initialize and it's not a NamedValue
    1047           0 :             NamedValue emptyNamedValue;
    1048           0 :             aArguments[0] <<= emptyNamedValue;
    1049           0 :             index = 1;
    1050             : 
    1051             :         }
    1052           0 :         for ( int i = index; i < _rArguments.getLength(); i++)
    1053             :         {
    1054           0 :             NamedValue namedValue;
    1055           0 :             aArguments[i] <<= _rArguments[i];
    1056             : 
    1057           0 :             if (aArguments[i] >>= namedValue )
    1058             :             {
    1059             : 
    1060           0 :                 if ( namedValue.Name == "StandardDir" )
    1061             :                 {
    1062           0 :                     OUString sStandardDir;
    1063             : 
    1064           0 :                     namedValue.Value >>= sStandardDir;
    1065             : 
    1066             :                     // Set the directory for the "back to the default dir" button
    1067           0 :                         if ( !sStandardDir.isEmpty() )
    1068             :                     {
    1069           0 :                         m_aStandardDir = sStandardDir;
    1070           0 :                     }
    1071             :                 }
    1072           0 :                 else if ( namedValue.Name == "BlackList" )
    1073             :                 {
    1074           0 :                     namedValue.Value >>= m_aBlackList;
    1075             :                 }
    1076             :             }
    1077           0 :         }
    1078             :     }
    1079             : 
    1080             :     // let the base class analyze the sequence (will call into implHandleInitializationArgument)
    1081           0 :     OCommonPicker::initialize( aArguments );
    1082           0 : }
    1083             : 
    1084             : 
    1085           0 : sal_Bool SvtFilePicker::implHandleInitializationArgument( const OUString& _rName, const Any& _rValue ) SAL_THROW( ( Exception, RuntimeException ) )
    1086             : {
    1087           0 :     if ( _rName == "TemplateDescription" )
    1088             :     {
    1089           0 :         m_nServiceType = TemplateDescription::FILEOPEN_SIMPLE;
    1090           0 :         OSL_VERIFY( _rValue >>= m_nServiceType );
    1091           0 :         return sal_True;
    1092             :     }
    1093           0 :     if ( _rName == "StandardDir" )
    1094             :     {
    1095           0 :         OSL_VERIFY( _rValue >>= m_aStandardDir );
    1096           0 :         return sal_True;
    1097             :     }
    1098             : 
    1099           0 :     if ( _rName == "BlackList" )
    1100             :     {
    1101           0 :         OSL_VERIFY( _rValue >>= m_aBlackList );
    1102           0 :         return sal_True;
    1103             :     }
    1104             : 
    1105             : 
    1106             : 
    1107           0 :     return OCommonPicker::implHandleInitializationArgument( _rName, _rValue );
    1108             : }
    1109             : 
    1110             : 
    1111             : // XServiceInfo
    1112             : 
    1113             : 
    1114             : /* XServiceInfo */
    1115           0 : OUString SAL_CALL SvtFilePicker::getImplementationName() throw( RuntimeException, std::exception )
    1116             : {
    1117           0 :     return impl_getStaticImplementationName();
    1118             : }
    1119             : 
    1120             : /* XServiceInfo */
    1121           0 : sal_Bool SAL_CALL SvtFilePicker::supportsService( const OUString& sServiceName ) throw( RuntimeException, std::exception )
    1122             : {
    1123           0 :     return cppu::supportsService(this, sServiceName);
    1124             : }
    1125             : 
    1126             : /* XServiceInfo */
    1127           0 : Sequence< OUString > SAL_CALL SvtFilePicker::getSupportedServiceNames() throw( RuntimeException, std::exception )
    1128             : {
    1129           0 :     return impl_getStaticSupportedServiceNames();
    1130             : }
    1131             : 
    1132             : /* Helper for XServiceInfo */
    1133           0 : Sequence< OUString > SvtFilePicker::impl_getStaticSupportedServiceNames()
    1134             : {
    1135           0 :     Sequence< OUString > seqServiceNames( 1 );
    1136           0 :     OUString* pArray = seqServiceNames.getArray();
    1137           0 :     pArray[0] = "com.sun.star.ui.dialogs.OfficeFilePicker";
    1138           0 :     return seqServiceNames ;
    1139             : }
    1140             : 
    1141             : /* Helper for XServiceInfo */
    1142           0 : OUString SvtFilePicker::impl_getStaticImplementationName()
    1143             : {
    1144           0 :     return OUString( "com.sun.star.svtools.OfficeFilePicker" );
    1145             : }
    1146             : 
    1147             : /* Helper for registry */
    1148           0 : Reference< XInterface > SAL_CALL SvtFilePicker::impl_createInstance(
    1149             :     const Reference< XComponentContext >& rxContext) throw( Exception )
    1150             : {
    1151           0 :     Reference< XMultiServiceFactory > xServiceManager (rxContext->getServiceManager(), UNO_QUERY_THROW);
    1152           0 :     return Reference< XInterface >( *new SvtFilePicker( xServiceManager ) );
    1153           0 : }
    1154             : 
    1155             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10