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