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