xref: /trunk/main/fpicker/source/unx/gnome/SalGtkFilePicker.hxx (revision 1c78a5d6c0093dece4c096ba53051800fbad6e33)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _SALGTKFILEPICKER_HXX_
29 #define _SALGTKFILEPICKER_HXX_
30 
31 //_______________________________________________________________________________________________________________________
32 //  includes of other projects
33 //_______________________________________________________________________________________________________________________
34 
35 #include <cppuhelper/compbase10.hxx>
36 #include <com/sun/star/lang/XInitialization.hpp>
37 #include <com/sun/star/ui/dialogs/XFilePickerNotifier.hpp>
38 #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
39 #include <com/sun/star/ui/dialogs/XFilterGroupManager.hpp>
40 #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
41 #include <com/sun/star/ui/dialogs/XFilePreview.hpp>
42 #include <com/sun/star/beans/StringPair.hpp>
43 
44 #ifndef _SALGTKPICKER_HXX_
45 #include "SalGtkPicker.hxx"
46 #endif
47 
48 #include <memory>
49 
50 #ifndef _RTL_USTRING_H_
51 #include <rtl/ustring.hxx>
52 #endif
53 
54 #include <list>
55 
56 //----------------------------------------------------------
57 // Implementation class for the XFilePicker Interface
58 //----------------------------------------------------------
59 
60 //----------------------------------------------------------
61 // forward declarations
62 //----------------------------------------------------------
63 
64 using namespace rtl;
65 
66 struct FilterEntry;
67 struct ElementEntry_Impl;
68 
69 typedef ::std::list < FilterEntry >     FilterList;
70 typedef ::std::list < ElementEntry_Impl >   ElementList;
71 typedef ::com::sun::star::beans::StringPair UnoFilterEntry;
72 typedef ::com::sun::star::uno::Sequence< UnoFilterEntry >   UnoFilterList;  // can be transported more effectively
73 
74 
75 //----------------------------------------------------------
76 // class declaration
77 //----------------------------------------------------------
78 
79 class SalGtkFilePicker :
80         public SalGtkPicker,
81     public cppu::WeakComponentImplHelper10<
82         ::com::sun::star::ui::dialogs::XFilterManager,
83         ::com::sun::star::ui::dialogs::XFilterGroupManager,
84         ::com::sun::star::ui::dialogs::XFilePickerControlAccess,
85         ::com::sun::star::ui::dialogs::XFilePickerNotifier,
86         ::com::sun::star::ui::dialogs::XFilePreview,
87         ::com::sun::star::ui::dialogs::XFilePicker2,
88     ::com::sun::star::lang::XInitialization,
89         ::com::sun::star::util::XCancellable,
90     ::com::sun::star::lang::XEventListener,
91     ::com::sun::star::lang::XServiceInfo >
92 {
93     public:
94 
95         // constructor
96         SalGtkFilePicker( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceMgr );
97 
98         //------------------------------------------------------------------------------------
99         // XFilePickerNotifier
100         //------------------------------------------------------------------------------------
101 
102         virtual void SAL_CALL addFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener )
103             throw( ::com::sun::star::uno::RuntimeException );
104         virtual void SAL_CALL removeFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener )
105             throw( ::com::sun::star::uno::RuntimeException );
106 
107         //------------------------------------------------------------------------------------
108         // XExecutableDialog functions
109         //------------------------------------------------------------------------------------
110 
111         virtual void SAL_CALL setTitle( const ::rtl::OUString& aTitle )
112             throw( ::com::sun::star::uno::RuntimeException );
113 
114         virtual sal_Int16 SAL_CALL execute(  )
115             throw( ::com::sun::star::uno::RuntimeException );
116 
117         //------------------------------------------------------------------------------------
118         // XFilePicker functions
119         //------------------------------------------------------------------------------------
120 
121         virtual void SAL_CALL setMultiSelectionMode( sal_Bool bMode )
122             throw( ::com::sun::star::uno::RuntimeException );
123 
124         virtual void SAL_CALL setDefaultName( const ::rtl::OUString& aName )
125             throw( ::com::sun::star::uno::RuntimeException );
126 
127         virtual void SAL_CALL setDisplayDirectory( const ::rtl::OUString& aDirectory )
128             throw( com::sun::star::lang::IllegalArgumentException,
129                 ::com::sun::star::uno::RuntimeException );
130 
131         virtual ::rtl::OUString SAL_CALL getDisplayDirectory(  )
132             throw( ::com::sun::star::uno::RuntimeException );
133 
134         virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getFiles(  )
135             throw( ::com::sun::star::uno::RuntimeException );
136 
137         //------------------------------------------------------------------------------------
138         // XFilePicker2 functions
139         //------------------------------------------------------------------------------------
140 
141         virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSelectedFiles()
142                 throw (::com::sun::star::uno::RuntimeException);
143 
144         //------------------------------------------------------------------------------------
145         // XFilterManager functions
146         //------------------------------------------------------------------------------------
147 
148         virtual void SAL_CALL appendFilter( const ::rtl::OUString& aTitle, const ::rtl::OUString& aFilter )
149             throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
150 
151         virtual void SAL_CALL setCurrentFilter( const ::rtl::OUString& aTitle )
152             throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
153 
154         virtual ::rtl::OUString SAL_CALL getCurrentFilter(  )
155             throw( ::com::sun::star::uno::RuntimeException );
156 
157         //------------------------------------------------------------------------------------
158         // XFilterGroupManager functions
159         //------------------------------------------------------------------------------------
160 
161         virtual void SAL_CALL appendFilterGroup( const ::rtl::OUString& sGroupTitle, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::StringPair >& aFilters )
162                 throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
163 
164         //------------------------------------------------------------------------------------
165         // XFilePickerControlAccess functions
166         //------------------------------------------------------------------------------------
167 
168         virtual void SAL_CALL setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const ::com::sun::star::uno::Any& aValue )
169                 throw (::com::sun::star::uno::RuntimeException);
170 
171         virtual ::com::sun::star::uno::Any SAL_CALL getValue( sal_Int16 aControlId, sal_Int16 aControlAction )
172                 throw (::com::sun::star::uno::RuntimeException);
173 
174         virtual void SAL_CALL enableControl( sal_Int16 nControlId, sal_Bool bEnable )
175             throw(::com::sun::star::uno::RuntimeException );
176 
177         virtual void SAL_CALL setLabel( sal_Int16 nControlId, const ::rtl::OUString& aLabel )
178             throw (::com::sun::star::uno::RuntimeException);
179 
180         virtual ::rtl::OUString SAL_CALL getLabel( sal_Int16 nControlId )
181             throw (::com::sun::star::uno::RuntimeException);
182 
183         //------------------------------------------------
184         // XFilePreview
185         //------------------------------------------------
186 
187         virtual ::com::sun::star::uno::Sequence< sal_Int16 > SAL_CALL getSupportedImageFormats(  )
188             throw (::com::sun::star::uno::RuntimeException);
189 
190         virtual sal_Int32 SAL_CALL getTargetColorDepth(  )
191             throw (::com::sun::star::uno::RuntimeException);
192 
193         virtual sal_Int32 SAL_CALL getAvailableWidth(  )
194             throw (::com::sun::star::uno::RuntimeException);
195 
196         virtual sal_Int32 SAL_CALL getAvailableHeight(  )
197             throw (::com::sun::star::uno::RuntimeException);
198 
199         virtual void SAL_CALL setImage( sal_Int16 aImageFormat, const ::com::sun::star::uno::Any& aImage )
200             throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
201 
202         virtual sal_Bool SAL_CALL setShowState( sal_Bool bShowState )
203             throw (::com::sun::star::uno::RuntimeException);
204 
205         virtual sal_Bool SAL_CALL getShowState(  )
206             throw (::com::sun::star::uno::RuntimeException);
207 
208         //------------------------------------------------
209         // XInitialization
210         //------------------------------------------------
211 
212         virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
213             throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
214 
215         //------------------------------------------------
216         // XCancellable
217         //------------------------------------------------
218 
219         virtual void SAL_CALL cancel( )
220             throw( ::com::sun::star::uno::RuntimeException );
221 
222         //------------------------------------------------
223         // XEventListener
224         //------------------------------------------------
225 
226         using cppu::WeakComponentImplHelperBase::disposing;
227         virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& aEvent )
228             throw(::com::sun::star::uno::RuntimeException);
229 
230         //------------------------------------------------
231         // XServiceInfo
232         //------------------------------------------------
233 
234         virtual ::rtl::OUString SAL_CALL getImplementationName(  )
235             throw(::com::sun::star::uno::RuntimeException);
236 
237         virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
238             throw(::com::sun::star::uno::RuntimeException);
239 
240         virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  )
241             throw(::com::sun::star::uno::RuntimeException);
242 
243         //------------------------------------------------------------------------------------
244         // FilePicker Event functions
245         //------------------------------------------------------------------------------------
246 
247         void SAL_CALL fileSelectionChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent );
248         void SAL_CALL directoryChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent );
249         rtl::OUString SAL_CALL helpRequested( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent ) const;
250         void SAL_CALL controlStateChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent );
251 
252     private:
253         // prevent copy and assignment
254         SalGtkFilePicker( const SalGtkFilePicker& );
255         SalGtkFilePicker& operator=( const SalGtkFilePicker& );
256 
257         sal_Bool FilterNameExists( const ::rtl::OUString& rTitle );
258         sal_Bool FilterNameExists( const UnoFilterList& _rGroupedFilters );
259 
260         void ensureFilterList( const ::rtl::OUString& _rInitialCurrentFilter );
261 
262         // to instanciate own services
263         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceMgr;
264 
265     private:
266         ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >
267             m_xListener;
268         ::rtl::OUString msPlayLabel;
269         FilterList *m_pFilterList;
270         GtkWidget  *m_pVBox;
271 
272         GtkWidget  *m_pFilterExpander;
273         GtkWidget  *m_pFilterView;
274         GtkListStore *m_pFilterStore;
275 
276         enum {
277             AUTOEXTENSION,
278             PASSWORD,
279             FILTEROPTIONS,
280             READONLY,
281             LINK,
282             PREVIEW,
283             SELECTION,
284             TOGGLE_LAST
285               };
286 
287         GtkWidget  *m_pToggles[ TOGGLE_LAST ];
288 
289         bool mbToggleVisibility[TOGGLE_LAST];
290         bool mbToggleChecked[TOGGLE_LAST];
291 
292         static const rtl::OString m_ToggleLabels[TOGGLE_LAST];
293 
294         enum {
295             PLAY,
296             BUTTON_LAST };
297 
298         GtkWidget  *m_pButtons[ BUTTON_LAST ];
299 
300         enum {
301             VERSION,
302             TEMPLATE,
303             IMAGE_TEMPLATE,
304             LIST_LAST
305               };
306 
307         GtkWidget *m_pHBoxs[ LIST_LAST ];
308         GtkWidget *m_pAligns[ LIST_LAST ];
309         GtkWidget *m_pLists[ LIST_LAST ];
310         GtkWidget *m_pListLabels[ LIST_LAST ];
311         bool mbListVisibility[ LIST_LAST ];
312         bool mbButtonVisibility[ BUTTON_LAST ];
313         gulong mnHID_FolderChange;
314         gulong mnHID_SelectionChange;
315 
316         ::rtl::OUString m_aCurrentFilter;
317         ::rtl::OUString m_aInitialFilter;
318 
319         bool bVersionWidthUnset;
320         sal_Bool mbPreviewState;
321         gulong mHID_Preview;
322         GtkWidget* m_pPreview;
323         GtkFileFilter* m_pPseudoFilter;
324         sal_Int32 m_PreviewImageWidth;
325         sal_Int32 m_PreviewImageHeight;
326 
327         GtkWidget  *getWidget( sal_Int16 nControlId, GType *pType = NULL);
328 
329         void SetCurFilter( const OUString& rFilter );
330         void SetFilters();
331         void UpdateFilterfromUI();
332 
333         void implChangeType( GtkTreeSelection *selection );
334         GtkFileFilter * implAddFilter( const OUString& rFilter, const OUString& rType );
335         void implAddFilterGroup( const OUString& rFilter,
336                      const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::StringPair>& _rFilters );
337         void updateCurrentFilterFromName(const gchar* filtername);
338         void unselect_type();
339         void InitialMapping();
340 
341         void HandleSetListValue(GtkComboBox *pWidget, sal_Int16 nControlAction,
342             const ::com::sun::star::uno::Any& rValue);
343         ::com::sun::star::uno::Any HandleGetListValue(GtkComboBox *pWidget, sal_Int16 nControlAction) const;
344 
345         static void expander_changed_cb( GtkExpander *expander, SalGtkFilePicker *pobjFP );
346         static void preview_toggled_cb (GtkObject *cb, SalGtkFilePicker *pobjFP);
347         static void filter_changed_cb (GtkFileChooser *file_chooser, GParamSpec *pspec, SalGtkFilePicker *pobjFP);
348         static void type_changed_cb( GtkTreeSelection *selection, SalGtkFilePicker *pobjFP );
349         static void folder_changed_cb (GtkFileChooser *file_chooser, SalGtkFilePicker *pobjFP);
350         static void selection_changed_cb (GtkFileChooser *file_chooser, SalGtkFilePicker *pobjFP);
351         static void update_preview_cb (GtkFileChooser *file_chooser, SalGtkFilePicker *pobjFP);
352         static void dialog_mapped_cb(GtkWidget *widget, SalGtkFilePicker *pobjFP);
353     public:
354          virtual ~SalGtkFilePicker();
355 
356 };
357 /* vi:set tabstop=4 shiftwidth=4 expandtab: */
358 #endif // _SALGTKFILEPICKER_HXX_
359