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 //------------------------------------------------------------------------ 28cdf0e10cSrcweir // includes 29cdf0e10cSrcweir //------------------------------------------------------------------------ 30cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp> 31cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 32cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> 33cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp> 34cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp> 35cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp> 36cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.h> 37cdf0e10cSrcweir #include <osl/diagnose.h> 38cdf0e10cSrcweir #include <osl/process.h> 39cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/TemplateDescription.hpp> 40cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ControlActions.hpp> 41cdf0e10cSrcweir #include <com/sun/star/uno/Any.hxx> 42cdf0e10cSrcweir #include <FPServiceInfo.hxx> 43cdf0e10cSrcweir #include <vos/mutex.hxx> 44cdf0e10cSrcweir #include <vcl/svapp.hxx> 45cdf0e10cSrcweir #include <SalGtkFilePicker.hxx> 46cdf0e10cSrcweir 47cdf0e10cSrcweir #include <tools/urlobj.hxx> 48cdf0e10cSrcweir 49cdf0e10cSrcweir #include <iostream> 50cdf0e10cSrcweir #include <algorithm> 51e5d951fcSPedro Giffuni #include <set> 52cdf0e10cSrcweir #include "resourceprovider.hxx" 53cdf0e10cSrcweir #ifndef _SV_RC_H 54cdf0e10cSrcweir #include <tools/rc.hxx> 55cdf0e10cSrcweir #endif 56cdf0e10cSrcweir 57cdf0e10cSrcweir //------------------------------------------------------------------------ 58cdf0e10cSrcweir // namespace directives 59cdf0e10cSrcweir //------------------------------------------------------------------------ 60cdf0e10cSrcweir 61cdf0e10cSrcweir using namespace ::com::sun::star; 62cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs; 63cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs::TemplateDescription; 64cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds; 65cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs::CommonFilePickerElementIds; 66cdf0e10cSrcweir using namespace ::com::sun::star::lang; 67cdf0e10cSrcweir using namespace ::com::sun::star::beans; 68cdf0e10cSrcweir using namespace ::com::sun::star::uno; 69cdf0e10cSrcweir 70cdf0e10cSrcweir //------------------------------------------------------------------------ 71cdf0e10cSrcweir // helper functions 72cdf0e10cSrcweir //------------------------------------------------------------------------ 73cdf0e10cSrcweir 74cdf0e10cSrcweir namespace 75cdf0e10cSrcweir { 76cdf0e10cSrcweir // controling event notifications 77cdf0e10cSrcweir const bool STARTUP_SUSPENDED = true; 78cdf0e10cSrcweir const bool STARTUP_ALIVE = false; 79cdf0e10cSrcweir 80cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL FilePicker_getSupportedServiceNames() 81cdf0e10cSrcweir { 82cdf0e10cSrcweir uno::Sequence<rtl::OUString> aRet(3); 83cdf0e10cSrcweir aRet[0] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.FilePicker" ); 84cdf0e10cSrcweir aRet[1] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.SystemFilePicker" ); 85cdf0e10cSrcweir aRet[2] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.GtkFilePicker" ); 86cdf0e10cSrcweir return aRet; 87cdf0e10cSrcweir } 88cdf0e10cSrcweir } 89cdf0e10cSrcweir 90cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 91cdf0e10cSrcweir // constructor 92cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 93cdf0e10cSrcweir 94cdf0e10cSrcweir static void expandexpanders(GtkContainer *pWidget) 95cdf0e10cSrcweir { 96cdf0e10cSrcweir GdkThreadLock aLock; 97cdf0e10cSrcweir 98cdf0e10cSrcweir GList *pChildren = gtk_container_get_children(pWidget); 99cdf0e10cSrcweir for( GList *p = pChildren; p; p = p->next ) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir if GTK_IS_CONTAINER(GTK_WIDGET(p->data)) 102cdf0e10cSrcweir expandexpanders(GTK_CONTAINER(GTK_WIDGET(p->data))); 103cdf0e10cSrcweir if GTK_IS_EXPANDER(GTK_WIDGET(p->data)) 104cdf0e10cSrcweir gtk_expander_set_expanded(GTK_EXPANDER(GTK_WIDGET(p->data)), sal_True); 105cdf0e10cSrcweir } 106cdf0e10cSrcweir g_list_free(pChildren); 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir void SalGtkFilePicker::dialog_mapped_cb(GtkWidget *, SalGtkFilePicker *pobjFP) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir pobjFP->InitialMapping(); 112cdf0e10cSrcweir } 113cdf0e10cSrcweir 114cdf0e10cSrcweir void SalGtkFilePicker::InitialMapping() 115cdf0e10cSrcweir { 116cdf0e10cSrcweir GdkThreadLock aLock; 117cdf0e10cSrcweir 118cdf0e10cSrcweir if (!mbPreviewState ) 119cdf0e10cSrcweir { 120cdf0e10cSrcweir gtk_widget_hide( m_pPreview ); 121cdf0e10cSrcweir gtk_file_chooser_set_preview_widget_active( GTK_FILE_CHOOSER( m_pDialog ), false); 122cdf0e10cSrcweir } 123cdf0e10cSrcweir gtk_widget_set_size_request (m_pPreview, -1, -1); 124cdf0e10cSrcweir } 125cdf0e10cSrcweir 126cdf0e10cSrcweir SalGtkFilePicker::SalGtkFilePicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr ) : 127cdf0e10cSrcweir SalGtkPicker(xServiceMgr), 128cdf0e10cSrcweir cppu::WeakComponentImplHelper10< 129cdf0e10cSrcweir XFilterManager, 130cdf0e10cSrcweir XFilterGroupManager, 131cdf0e10cSrcweir XFilePickerControlAccess, 132cdf0e10cSrcweir XFilePickerNotifier, 133cdf0e10cSrcweir XFilePreview, 134cdf0e10cSrcweir XFilePicker2, 135cdf0e10cSrcweir lang::XInitialization, 136cdf0e10cSrcweir util::XCancellable, 137cdf0e10cSrcweir lang::XEventListener, 138cdf0e10cSrcweir lang::XServiceInfo>( m_rbHelperMtx ), 139cdf0e10cSrcweir m_xServiceMgr( xServiceMgr ), 140cdf0e10cSrcweir m_pFilterList( NULL ), 141cdf0e10cSrcweir m_pVBox ( NULL ), 142cdf0e10cSrcweir mnHID_FolderChange( 0 ), 143cdf0e10cSrcweir mnHID_SelectionChange( 0 ), 144cdf0e10cSrcweir bVersionWidthUnset( false ), 145cdf0e10cSrcweir mbPreviewState( sal_False ), 146cdf0e10cSrcweir mHID_Preview( 0 ), 147cdf0e10cSrcweir m_pPreview( NULL ), 148e5d951fcSPedro Giffuni m_pPseudoFilter( NULL ), 149cdf0e10cSrcweir m_PreviewImageWidth( 256 ), 150cdf0e10cSrcweir m_PreviewImageHeight( 256 ) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir int i; 153cdf0e10cSrcweir 154cdf0e10cSrcweir for( i = 0; i < TOGGLE_LAST; i++ ) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir m_pToggles[i] = NULL; 157cdf0e10cSrcweir mbToggleVisibility[i] = false; 158cdf0e10cSrcweir } 159cdf0e10cSrcweir 160cdf0e10cSrcweir for( i = 0; i < BUTTON_LAST; i++ ) 161cdf0e10cSrcweir { 162cdf0e10cSrcweir m_pButtons[i] = NULL; 163cdf0e10cSrcweir mbButtonVisibility[i] = false; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir for( i = 0; i < LIST_LAST; i++ ) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir m_pHBoxs[i] = NULL; 169cdf0e10cSrcweir m_pAligns[i] = NULL; 170cdf0e10cSrcweir m_pLists[i] = NULL; 171cdf0e10cSrcweir m_pListLabels[i] = NULL; 172cdf0e10cSrcweir mbListVisibility[i] = false; 173cdf0e10cSrcweir } 174cdf0e10cSrcweir 175cdf0e10cSrcweir CResourceProvider aResProvider; 176cdf0e10cSrcweir OUString aFilePickerTitle = aResProvider.getResString( FILE_PICKER_TITLE_OPEN ); 177cdf0e10cSrcweir 178cdf0e10cSrcweir GdkThreadLock aLock; 179cdf0e10cSrcweir 180cdf0e10cSrcweir m_pDialog = gtk_file_chooser_dialog_new( 181cdf0e10cSrcweir OUStringToOString( aFilePickerTitle, RTL_TEXTENCODING_UTF8 ).getStr(), 182cdf0e10cSrcweir NULL, 183cdf0e10cSrcweir GTK_FILE_CHOOSER_ACTION_OPEN, 184cdf0e10cSrcweir GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 185cdf0e10cSrcweir GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 186cdf0e10cSrcweir (char *)NULL ); 187cdf0e10cSrcweir 188cdf0e10cSrcweir gtk_dialog_set_default_response( GTK_DIALOG (m_pDialog), GTK_RESPONSE_ACCEPT ); 189cdf0e10cSrcweir 190cdf0e10cSrcweir gtk_file_chooser_set_local_only( GTK_FILE_CHOOSER( m_pDialog ), sal_False ); 191cdf0e10cSrcweir gtk_file_chooser_set_select_multiple( GTK_FILE_CHOOSER( m_pDialog ), sal_False ); 192cdf0e10cSrcweir 193cdf0e10cSrcweir m_pVBox = gtk_vbox_new( sal_False, 0 ); 194cdf0e10cSrcweir 195cdf0e10cSrcweir // We don't want clickable items to have a huge hit-area 196cdf0e10cSrcweir GtkWidget *pHBox = gtk_hbox_new( sal_False, 0 ); 197cdf0e10cSrcweir GtkWidget *pThinVBox = gtk_vbox_new( sal_False, 0 ); 198cdf0e10cSrcweir 199cdf0e10cSrcweir gtk_box_pack_end (GTK_BOX( m_pVBox ), pHBox, sal_False, sal_False, 0); 200cdf0e10cSrcweir gtk_box_pack_start (GTK_BOX( pHBox ), pThinVBox, sal_False, sal_False, 0); 201cdf0e10cSrcweir gtk_widget_show( pHBox ); 202cdf0e10cSrcweir gtk_widget_show( pThinVBox ); 203cdf0e10cSrcweir 204cdf0e10cSrcweir OUString aLabel; 205cdf0e10cSrcweir 206cdf0e10cSrcweir for( i = 0; i < TOGGLE_LAST; i++ ) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir m_pToggles[i] = gtk_check_button_new(); 209cdf0e10cSrcweir 210cdf0e10cSrcweir #define LABEL_TOGGLE( elem ) \ 211cdf0e10cSrcweir case elem : \ 212cdf0e10cSrcweir aLabel = aResProvider.getResString( CHECKBOX_##elem ); \ 213cdf0e10cSrcweir setLabel( CHECKBOX_##elem, aLabel ); \ 214cdf0e10cSrcweir break 215cdf0e10cSrcweir 216cdf0e10cSrcweir switch( i ) { 217cdf0e10cSrcweir 218cdf0e10cSrcweir LABEL_TOGGLE( AUTOEXTENSION ); 219cdf0e10cSrcweir LABEL_TOGGLE( PASSWORD ); 220cdf0e10cSrcweir LABEL_TOGGLE( FILTEROPTIONS ); 221cdf0e10cSrcweir LABEL_TOGGLE( READONLY ); 222cdf0e10cSrcweir LABEL_TOGGLE( LINK ); 223cdf0e10cSrcweir LABEL_TOGGLE( PREVIEW ); 224cdf0e10cSrcweir LABEL_TOGGLE( SELECTION ); 225cdf0e10cSrcweir default: 226cdf0e10cSrcweir OSL_TRACE("Handle unknown control %d\n", i); 227cdf0e10cSrcweir break; 228cdf0e10cSrcweir } 229cdf0e10cSrcweir 230cdf0e10cSrcweir gtk_box_pack_end( GTK_BOX( pThinVBox ), m_pToggles[i], sal_False, sal_False, 0 ); 231cdf0e10cSrcweir } 232cdf0e10cSrcweir 233cdf0e10cSrcweir for( i = 0; i < LIST_LAST; i++ ) 234cdf0e10cSrcweir { 235cdf0e10cSrcweir m_pHBoxs[i] = gtk_hbox_new( sal_False, 0 ); 236cdf0e10cSrcweir 237cdf0e10cSrcweir m_pAligns[i] = gtk_alignment_new(0, 0, 0, 1); 238cdf0e10cSrcweir 239cdf0e10cSrcweir m_pLists[i] = gtk_combo_box_new_text(); 240cdf0e10cSrcweir 241cdf0e10cSrcweir m_pListLabels[i] = gtk_label_new( "" ); 242cdf0e10cSrcweir 243cdf0e10cSrcweir #define LABEL_LIST( elem ) \ 244cdf0e10cSrcweir case elem : \ 245cdf0e10cSrcweir aLabel = aResProvider.getResString( LISTBOX_##elem##_LABEL ); \ 246cdf0e10cSrcweir setLabel( LISTBOX_##elem##_LABEL, aLabel ); \ 247cdf0e10cSrcweir break 248cdf0e10cSrcweir 249cdf0e10cSrcweir switch( i ) 250cdf0e10cSrcweir { 251cdf0e10cSrcweir LABEL_LIST( VERSION ); 252cdf0e10cSrcweir LABEL_LIST( TEMPLATE ); 253cdf0e10cSrcweir LABEL_LIST( IMAGE_TEMPLATE ); 254cdf0e10cSrcweir default: 255cdf0e10cSrcweir OSL_TRACE("Handle unknown control %d\n", i); 256cdf0e10cSrcweir break; 257cdf0e10cSrcweir } 258cdf0e10cSrcweir 259cdf0e10cSrcweir gtk_container_add( GTK_CONTAINER( m_pAligns[i]), m_pLists[i] ); 260cdf0e10cSrcweir gtk_box_pack_end( GTK_BOX( m_pHBoxs[i] ), m_pAligns[i], sal_False, sal_False, 0 ); 261cdf0e10cSrcweir 262cdf0e10cSrcweir gtk_box_pack_end( GTK_BOX( m_pHBoxs[i] ), m_pListLabels[i], sal_False, sal_False, 0 ); 263cdf0e10cSrcweir 264cdf0e10cSrcweir gtk_box_pack_end( GTK_BOX( m_pVBox ), m_pHBoxs[i], sal_False, sal_False, 0 ); 265cdf0e10cSrcweir } 266cdf0e10cSrcweir 267cdf0e10cSrcweir aLabel = aResProvider.getResString( FILE_PICKER_FILE_TYPE ); 268cdf0e10cSrcweir m_pFilterExpander = gtk_expander_new_with_mnemonic( 269cdf0e10cSrcweir OUStringToOString( aLabel, RTL_TEXTENCODING_UTF8 ).getStr()); 270cdf0e10cSrcweir 271cdf0e10cSrcweir gtk_box_pack_end( GTK_BOX( m_pVBox ), m_pFilterExpander, sal_False, sal_True, 0 ); 272cdf0e10cSrcweir 273cdf0e10cSrcweir GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL); 274cdf0e10cSrcweir gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), 275cdf0e10cSrcweir GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 276cdf0e10cSrcweir gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), 277cdf0e10cSrcweir GTK_SHADOW_IN); 278cdf0e10cSrcweir gtk_container_add (GTK_CONTAINER (m_pFilterExpander), scrolled_window); 279cdf0e10cSrcweir gtk_widget_show (scrolled_window); 280cdf0e10cSrcweir 281cdf0e10cSrcweir ByteString sExpand(getenv("SAL_EXPANDFPICKER")); 282cdf0e10cSrcweir sal_Int32 nExpand = sExpand.ToInt32(); 283cdf0e10cSrcweir switch (nExpand) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir default: 286cdf0e10cSrcweir case 0: 287cdf0e10cSrcweir break; 288cdf0e10cSrcweir case 1: 289cdf0e10cSrcweir gtk_expander_set_expanded(GTK_EXPANDER(m_pFilterExpander), sal_True); 290cdf0e10cSrcweir break; 291cdf0e10cSrcweir case 2: 292cdf0e10cSrcweir expandexpanders(GTK_CONTAINER(m_pDialog)); 293cdf0e10cSrcweir gtk_expander_set_expanded(GTK_EXPANDER(m_pFilterExpander), sal_True); 294cdf0e10cSrcweir break; 295cdf0e10cSrcweir } 296cdf0e10cSrcweir 297cdf0e10cSrcweir m_pFilterStore = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, 298cdf0e10cSrcweir G_TYPE_STRING, G_TYPE_STRING); 299cdf0e10cSrcweir m_pFilterView = gtk_tree_view_new_with_model (GTK_TREE_MODEL(m_pFilterStore)); 300cdf0e10cSrcweir gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(m_pFilterView), false); 301cdf0e10cSrcweir gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(m_pFilterView), true); 302cdf0e10cSrcweir 303cdf0e10cSrcweir GtkTreeViewColumn *column; 304cdf0e10cSrcweir GtkCellRenderer *cell; 305cdf0e10cSrcweir 306cdf0e10cSrcweir for (i = 0; i < 2; ++i) 307cdf0e10cSrcweir { 308cdf0e10cSrcweir column = gtk_tree_view_column_new (); 309cdf0e10cSrcweir cell = gtk_cell_renderer_text_new (); 310cdf0e10cSrcweir gtk_tree_view_column_set_expand (column, sal_True); 311cdf0e10cSrcweir gtk_tree_view_column_pack_start (column, cell, sal_False); 312cdf0e10cSrcweir gtk_tree_view_column_set_attributes (column, cell, "text", i, (char *)NULL); 313cdf0e10cSrcweir gtk_tree_view_append_column (GTK_TREE_VIEW(m_pFilterView), column); 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir gtk_container_add (GTK_CONTAINER (scrolled_window), m_pFilterView); 317cdf0e10cSrcweir gtk_widget_show (m_pFilterView); 318cdf0e10cSrcweir 319cdf0e10cSrcweir gtk_file_chooser_set_extra_widget( GTK_FILE_CHOOSER( m_pDialog ), m_pVBox ); 320cdf0e10cSrcweir 321cdf0e10cSrcweir m_pPreview = gtk_image_new(); 322cdf0e10cSrcweir gtk_file_chooser_set_preview_widget( GTK_FILE_CHOOSER( m_pDialog ), m_pPreview ); 323cdf0e10cSrcweir 324cdf0e10cSrcweir g_signal_connect( G_OBJECT( m_pToggles[PREVIEW] ), "toggled", 325cdf0e10cSrcweir G_CALLBACK( preview_toggled_cb ), this ); 326cdf0e10cSrcweir g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW(m_pFilterView)), "changed", 327cdf0e10cSrcweir G_CALLBACK ( type_changed_cb ), this); 328cdf0e10cSrcweir g_signal_connect( G_OBJECT( m_pDialog ), "notify::filter", 329cdf0e10cSrcweir G_CALLBACK( filter_changed_cb ), this); 330cdf0e10cSrcweir g_signal_connect( G_OBJECT( m_pFilterExpander ), "activate", 331cdf0e10cSrcweir G_CALLBACK( expander_changed_cb ), this); 332cdf0e10cSrcweir g_signal_connect (G_OBJECT( m_pDialog ), "map", 333cdf0e10cSrcweir G_CALLBACK (dialog_mapped_cb), this); 334cdf0e10cSrcweir 335cdf0e10cSrcweir gtk_widget_show( m_pVBox ); 336cdf0e10cSrcweir 337cdf0e10cSrcweir PangoLayout *layout = gtk_widget_create_pango_layout (m_pFilterView, NULL); 338cdf0e10cSrcweir guint ypad; 339cdf0e10cSrcweir PangoRectangle row_height; 340cdf0e10cSrcweir pango_layout_set_markup (layout, "All Files", -1); 341cdf0e10cSrcweir pango_layout_get_pixel_extents (layout, NULL, &row_height); 342cdf0e10cSrcweir g_object_get (cell, "ypad", &ypad, (char *)NULL); 343cdf0e10cSrcweir guint height = (row_height.height + 2*ypad) * 5; 344cdf0e10cSrcweir gtk_widget_set_size_request (m_pFilterView, -1, height); 345cdf0e10cSrcweir gtk_widget_set_size_request (m_pPreview, 1, height); 346cdf0e10cSrcweir 347cdf0e10cSrcweir gtk_file_chooser_set_preview_widget_active( GTK_FILE_CHOOSER( m_pDialog ), true); 348cdf0e10cSrcweir } 349cdf0e10cSrcweir 350cdf0e10cSrcweir //------------------------------------------------------------------------------------ 351cdf0e10cSrcweir // XFilePickerNotifier 352cdf0e10cSrcweir //------------------------------------------------------------------------------------ 353cdf0e10cSrcweir 354cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::addFilePickerListener( const uno::Reference<XFilePickerListener>& xListener ) 355cdf0e10cSrcweir throw( uno::RuntimeException ) 356cdf0e10cSrcweir { 357cdf0e10cSrcweir m_xListener = xListener; 358cdf0e10cSrcweir } 359cdf0e10cSrcweir 360cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::removeFilePickerListener( const uno::Reference<XFilePickerListener>& ) 361cdf0e10cSrcweir throw( uno::RuntimeException ) 362cdf0e10cSrcweir { 363cdf0e10cSrcweir m_xListener.clear(); 364cdf0e10cSrcweir } 365cdf0e10cSrcweir 366cdf0e10cSrcweir // ------------------------------------------------- 367cdf0e10cSrcweir // XEventListener 368cdf0e10cSrcweir // ------------------------------------------------- 369cdf0e10cSrcweir 370cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::disposing( const lang::EventObject& aEvent ) throw( uno::RuntimeException ) 371cdf0e10cSrcweir { 372cdf0e10cSrcweir uno::Reference<XFilePickerListener> xFilePickerListener( aEvent.Source, ::com::sun::star::uno::UNO_QUERY ); 373cdf0e10cSrcweir 374cdf0e10cSrcweir if( xFilePickerListener.is() ) 375cdf0e10cSrcweir removeFilePickerListener( xFilePickerListener ); 376cdf0e10cSrcweir } 377cdf0e10cSrcweir 378cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 379cdf0e10cSrcweir // FilePicker Event functions 380cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 381cdf0e10cSrcweir 382cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::fileSelectionChanged( FilePickerEvent aEvent ) 383cdf0e10cSrcweir { 384cdf0e10cSrcweir OSL_TRACE( "file selection changed"); 385cdf0e10cSrcweir if (m_xListener.is()) m_xListener->fileSelectionChanged( aEvent ); 386cdf0e10cSrcweir } 387cdf0e10cSrcweir 388cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::directoryChanged( FilePickerEvent aEvent ) 389cdf0e10cSrcweir { 390cdf0e10cSrcweir OSL_TRACE("directory changed"); 391cdf0e10cSrcweir if (m_xListener.is()) m_xListener->directoryChanged( aEvent ); 392cdf0e10cSrcweir } 393cdf0e10cSrcweir 394cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::controlStateChanged( FilePickerEvent aEvent ) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir OSL_TRACE("control state changed"); 397cdf0e10cSrcweir if (m_xListener.is()) m_xListener->controlStateChanged( aEvent ); 398cdf0e10cSrcweir } 399cdf0e10cSrcweir 400cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 401cdf0e10cSrcweir // If there are more then one listener the return value of the last one wins 402cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 403cdf0e10cSrcweir 404cdf0e10cSrcweir rtl::OUString SAL_CALL SalGtkFilePicker::helpRequested( FilePickerEvent aEvent ) const 405cdf0e10cSrcweir { 406cdf0e10cSrcweir rtl::OUString aHelpText; 407cdf0e10cSrcweir 408cdf0e10cSrcweir ::cppu::OInterfaceContainerHelper* pICHelper = 409cdf0e10cSrcweir rBHelper.getContainer( getCppuType( ( uno::Reference<XFilePickerListener> * )0 ) ); 410cdf0e10cSrcweir 411cdf0e10cSrcweir if( pICHelper ) 412cdf0e10cSrcweir { 413cdf0e10cSrcweir ::cppu::OInterfaceIteratorHelper iter( *pICHelper ); 414cdf0e10cSrcweir 415cdf0e10cSrcweir while( iter.hasMoreElements() ) 416cdf0e10cSrcweir { 417cdf0e10cSrcweir try 418cdf0e10cSrcweir { 419cdf0e10cSrcweir /* 420cdf0e10cSrcweir if there are multiple listeners responding 421cdf0e10cSrcweir to this notification the next response 422cdf0e10cSrcweir overwrittes the one before if it is not empty 423cdf0e10cSrcweir */ 424cdf0e10cSrcweir 425cdf0e10cSrcweir rtl::OUString aTempString; 426cdf0e10cSrcweir 427cdf0e10cSrcweir uno::Reference<XFilePickerListener> xFPListener( iter.next(), uno::UNO_QUERY ); 428cdf0e10cSrcweir if( xFPListener.is() ) 429cdf0e10cSrcweir { 430cdf0e10cSrcweir aTempString = xFPListener->helpRequested( aEvent ); 431cdf0e10cSrcweir if( aTempString.getLength() ) 432cdf0e10cSrcweir aHelpText = aTempString; 433cdf0e10cSrcweir } 434cdf0e10cSrcweir 435cdf0e10cSrcweir } 436cdf0e10cSrcweir catch( uno::RuntimeException& ) 437cdf0e10cSrcweir { 438cdf0e10cSrcweir OSL_ENSURE( false, "RuntimeException during event dispatching" ); 439cdf0e10cSrcweir } 440cdf0e10cSrcweir } 441cdf0e10cSrcweir } 442cdf0e10cSrcweir 443cdf0e10cSrcweir return aHelpText; 444cdf0e10cSrcweir } 445cdf0e10cSrcweir 446cdf0e10cSrcweir //===================================================================== 447cdf0e10cSrcweir 448cdf0e10cSrcweir struct FilterEntry 449cdf0e10cSrcweir { 450cdf0e10cSrcweir protected: 451cdf0e10cSrcweir ::rtl::OUString m_sTitle; 452cdf0e10cSrcweir ::rtl::OUString m_sFilter; 453cdf0e10cSrcweir 454cdf0e10cSrcweir UnoFilterList m_aSubFilters; 455cdf0e10cSrcweir 456cdf0e10cSrcweir public: 457cdf0e10cSrcweir FilterEntry( const ::rtl::OUString& _rTitle, const ::rtl::OUString& _rFilter ) 458cdf0e10cSrcweir :m_sTitle( _rTitle ) 459cdf0e10cSrcweir ,m_sFilter( _rFilter ) 460cdf0e10cSrcweir { 461cdf0e10cSrcweir } 462cdf0e10cSrcweir 463cdf0e10cSrcweir FilterEntry( const ::rtl::OUString& _rTitle, const UnoFilterList& _rSubFilters ); 464cdf0e10cSrcweir 465cdf0e10cSrcweir ::rtl::OUString getTitle() const { return m_sTitle; } 466cdf0e10cSrcweir ::rtl::OUString getFilter() const { return m_sFilter; } 467cdf0e10cSrcweir 468cdf0e10cSrcweir /// determines if the filter has sub filter (i.e., the filter is a filter group in real) 469cdf0e10cSrcweir sal_Bool hasSubFilters( ) const; 470cdf0e10cSrcweir 471cdf0e10cSrcweir /** retrieves the filters belonging to the entry 472cdf0e10cSrcweir @return 473cdf0e10cSrcweir the number of sub filters 474cdf0e10cSrcweir */ 475cdf0e10cSrcweir sal_Int32 getSubFilters( UnoFilterList& _rSubFilterList ); 476cdf0e10cSrcweir 477cdf0e10cSrcweir // helpers for iterating the sub filters 478cdf0e10cSrcweir const UnoFilterEntry* beginSubFilters() const { return m_aSubFilters.getConstArray(); } 479cdf0e10cSrcweir const UnoFilterEntry* endSubFilters() const { return m_aSubFilters.getConstArray() + m_aSubFilters.getLength(); } 480cdf0e10cSrcweir }; 481cdf0e10cSrcweir 482cdf0e10cSrcweir //===================================================================== 483cdf0e10cSrcweir 484cdf0e10cSrcweir //--------------------------------------------------------------------- 485cdf0e10cSrcweir FilterEntry::FilterEntry( const ::rtl::OUString& _rTitle, const UnoFilterList& _rSubFilters ) 486cdf0e10cSrcweir :m_sTitle( _rTitle ) 487cdf0e10cSrcweir ,m_aSubFilters( _rSubFilters ) 488cdf0e10cSrcweir { 489cdf0e10cSrcweir } 490cdf0e10cSrcweir 491cdf0e10cSrcweir //--------------------------------------------------------------------- 492cdf0e10cSrcweir sal_Bool FilterEntry::hasSubFilters() const 493cdf0e10cSrcweir { 494cdf0e10cSrcweir return( 0 < m_aSubFilters.getLength() ); 495cdf0e10cSrcweir } 496cdf0e10cSrcweir 497cdf0e10cSrcweir //--------------------------------------------------------------------- 498cdf0e10cSrcweir sal_Int32 FilterEntry::getSubFilters( UnoFilterList& _rSubFilterList ) 499cdf0e10cSrcweir { 500cdf0e10cSrcweir _rSubFilterList = m_aSubFilters; 501cdf0e10cSrcweir return m_aSubFilters.getLength(); 502cdf0e10cSrcweir } 503cdf0e10cSrcweir 504cdf0e10cSrcweir static bool 505cdf0e10cSrcweir isFilterString( const rtl::OUString &rFilterString, const char *pMatch ) 506cdf0e10cSrcweir { 507cdf0e10cSrcweir sal_Int32 nIndex = 0; 508cdf0e10cSrcweir rtl::OUString aToken; 509cdf0e10cSrcweir bool bIsFilter = true; 510cdf0e10cSrcweir 511cdf0e10cSrcweir rtl::OUString aMatch(rtl::OUString::createFromAscii(pMatch)); 512cdf0e10cSrcweir 513cdf0e10cSrcweir do 514cdf0e10cSrcweir { 515cdf0e10cSrcweir aToken = rFilterString.getToken( 0, ';', nIndex ); 516cdf0e10cSrcweir if( !aToken.match( aMatch ) ) 517cdf0e10cSrcweir { 518cdf0e10cSrcweir bIsFilter = false; 519cdf0e10cSrcweir break; 520cdf0e10cSrcweir } 521cdf0e10cSrcweir } 522cdf0e10cSrcweir while( nIndex >= 0 ); 523cdf0e10cSrcweir 524cdf0e10cSrcweir return bIsFilter; 525cdf0e10cSrcweir } 526cdf0e10cSrcweir 527cdf0e10cSrcweir static rtl::OUString 528cdf0e10cSrcweir shrinkFilterName( const rtl::OUString &rFilterName, bool bAllowNoStar = false ) 529cdf0e10cSrcweir { 530cdf0e10cSrcweir int i; 531cdf0e10cSrcweir int nBracketLen = -1; 532cdf0e10cSrcweir int nBracketEnd = -1; 533cdf0e10cSrcweir const sal_Unicode *pStr = rFilterName; 534cdf0e10cSrcweir OUString aRealName = rFilterName; 535cdf0e10cSrcweir 536cdf0e10cSrcweir for( i = aRealName.getLength() - 1; i > 0; i-- ) 537cdf0e10cSrcweir { 538cdf0e10cSrcweir if( pStr[i] == ')' ) 539cdf0e10cSrcweir nBracketEnd = i; 540cdf0e10cSrcweir else if( pStr[i] == '(' ) 541cdf0e10cSrcweir { 542cdf0e10cSrcweir nBracketLen = nBracketEnd - i; 543cdf0e10cSrcweir if( nBracketEnd <= 0 ) 544cdf0e10cSrcweir continue; 545cdf0e10cSrcweir if( isFilterString( rFilterName.copy( i + 1, nBracketLen - 1 ), "*." ) ) 546cdf0e10cSrcweir aRealName = aRealName.replaceAt( i, nBracketLen + 1, rtl::OUString() ); 547cdf0e10cSrcweir else if (bAllowNoStar) 548cdf0e10cSrcweir { 549cdf0e10cSrcweir if( isFilterString( rFilterName.copy( i + 1, nBracketLen - 1 ), ".") ) 550cdf0e10cSrcweir aRealName = aRealName.replaceAt( i, nBracketLen + 1, rtl::OUString() ); 551cdf0e10cSrcweir } 552cdf0e10cSrcweir } 553cdf0e10cSrcweir } 554cdf0e10cSrcweir 555cdf0e10cSrcweir return aRealName; 556cdf0e10cSrcweir } 557cdf0e10cSrcweir 558cdf0e10cSrcweir static void 559cdf0e10cSrcweir dialog_remove_buttons( GtkDialog *pDialog ) 560cdf0e10cSrcweir { 561cdf0e10cSrcweir GdkThreadLock aLock; 562cdf0e10cSrcweir 563cdf0e10cSrcweir g_return_if_fail( GTK_IS_DIALOG( pDialog ) ); 564cdf0e10cSrcweir 565cdf0e10cSrcweir GList *pChildren = 566cdf0e10cSrcweir gtk_container_get_children( GTK_CONTAINER( pDialog->action_area ) ); 567cdf0e10cSrcweir 568cdf0e10cSrcweir for( GList *p = pChildren; p; p = p->next ) 569cdf0e10cSrcweir gtk_widget_destroy( GTK_WIDGET( p->data ) ); 570cdf0e10cSrcweir 571cdf0e10cSrcweir g_list_free( pChildren ); 572cdf0e10cSrcweir } 573cdf0e10cSrcweir 574cdf0e10cSrcweir //------------------------------------------------------------------------------------ 575cdf0e10cSrcweir namespace { 576cdf0e10cSrcweir //................................................................................ 577cdf0e10cSrcweir struct FilterTitleMatch : public ::std::unary_function< FilterEntry, bool > 578cdf0e10cSrcweir { 579cdf0e10cSrcweir protected: 580cdf0e10cSrcweir const ::rtl::OUString& rTitle; 581cdf0e10cSrcweir 582cdf0e10cSrcweir public: 583cdf0e10cSrcweir FilterTitleMatch( const ::rtl::OUString& _rTitle ) : rTitle( _rTitle ) { } 584cdf0e10cSrcweir 585cdf0e10cSrcweir //............................................................................ 586cdf0e10cSrcweir bool operator () ( const FilterEntry& _rEntry ) 587cdf0e10cSrcweir { 588cdf0e10cSrcweir sal_Bool bMatch; 589cdf0e10cSrcweir if( !_rEntry.hasSubFilters() ) 590cdf0e10cSrcweir // a real filter 591cdf0e10cSrcweir bMatch = ( _rEntry.getTitle() == rTitle ); 592cdf0e10cSrcweir else 593cdf0e10cSrcweir // a filter group -> search the sub filters 594cdf0e10cSrcweir bMatch = 595cdf0e10cSrcweir _rEntry.endSubFilters() != ::std::find_if( 596cdf0e10cSrcweir _rEntry.beginSubFilters(), 597cdf0e10cSrcweir _rEntry.endSubFilters(), 598cdf0e10cSrcweir *this 599cdf0e10cSrcweir ); 600cdf0e10cSrcweir 601cdf0e10cSrcweir return bMatch ? true : false; 602cdf0e10cSrcweir } 603cdf0e10cSrcweir bool operator () ( const UnoFilterEntry& _rEntry ) 604cdf0e10cSrcweir { 605cdf0e10cSrcweir OUString aShrunkName = shrinkFilterName( _rEntry.First ); 606cdf0e10cSrcweir return aShrunkName == rTitle ? true : false; 607cdf0e10cSrcweir } 608cdf0e10cSrcweir }; 609cdf0e10cSrcweir } 610cdf0e10cSrcweir 611cdf0e10cSrcweir 612cdf0e10cSrcweir //------------------------------------------------------------------------------------ 613cdf0e10cSrcweir sal_Bool SalGtkFilePicker::FilterNameExists( const ::rtl::OUString& rTitle ) 614cdf0e10cSrcweir { 615cdf0e10cSrcweir sal_Bool bRet = sal_False; 616cdf0e10cSrcweir 617cdf0e10cSrcweir if( m_pFilterList ) 618cdf0e10cSrcweir bRet = 619cdf0e10cSrcweir m_pFilterList->end() != ::std::find_if( 620cdf0e10cSrcweir m_pFilterList->begin(), 621cdf0e10cSrcweir m_pFilterList->end(), 622cdf0e10cSrcweir FilterTitleMatch( rTitle ) 623cdf0e10cSrcweir ); 624cdf0e10cSrcweir 625cdf0e10cSrcweir return bRet; 626cdf0e10cSrcweir } 627cdf0e10cSrcweir 628cdf0e10cSrcweir //------------------------------------------------------------------------------------ 629cdf0e10cSrcweir sal_Bool SalGtkFilePicker::FilterNameExists( const UnoFilterList& _rGroupedFilters ) 630cdf0e10cSrcweir { 631cdf0e10cSrcweir sal_Bool bRet = sal_False; 632cdf0e10cSrcweir 633cdf0e10cSrcweir if( m_pFilterList ) 634cdf0e10cSrcweir { 635cdf0e10cSrcweir const UnoFilterEntry* pStart = _rGroupedFilters.getConstArray(); 636cdf0e10cSrcweir const UnoFilterEntry* pEnd = pStart + _rGroupedFilters.getLength(); 637cdf0e10cSrcweir for( ; pStart != pEnd; ++pStart ) 638cdf0e10cSrcweir if( m_pFilterList->end() != ::std::find_if( 639cdf0e10cSrcweir m_pFilterList->begin(), 640cdf0e10cSrcweir m_pFilterList->end(), 641cdf0e10cSrcweir FilterTitleMatch( pStart->First ) ) ) 642cdf0e10cSrcweir break; 643cdf0e10cSrcweir 644cdf0e10cSrcweir bRet = pStart != pEnd; 645cdf0e10cSrcweir } 646cdf0e10cSrcweir 647cdf0e10cSrcweir return bRet; 648cdf0e10cSrcweir } 649cdf0e10cSrcweir 650cdf0e10cSrcweir //------------------------------------------------------------------------------------ 651cdf0e10cSrcweir void SalGtkFilePicker::ensureFilterList( const ::rtl::OUString& _rInitialCurrentFilter ) 652cdf0e10cSrcweir { 653cdf0e10cSrcweir if( !m_pFilterList ) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir m_pFilterList = new FilterList; 656cdf0e10cSrcweir 657cdf0e10cSrcweir // set the first filter to the current filter 658e5d951fcSPedro Giffuni if ( !m_aCurrentFilter.getLength() ) 659cdf0e10cSrcweir m_aCurrentFilter = _rInitialCurrentFilter; 660cdf0e10cSrcweir } 661cdf0e10cSrcweir } 662cdf0e10cSrcweir 663cdf0e10cSrcweir 664cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 665cdf0e10cSrcweir // 666cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 667cdf0e10cSrcweir 668cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::appendFilter( const rtl::OUString& aTitle, const rtl::OUString& aFilter ) 669cdf0e10cSrcweir throw( lang::IllegalArgumentException, uno::RuntimeException ) 670cdf0e10cSrcweir { 671cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 672cdf0e10cSrcweir 673cdf0e10cSrcweir if( FilterNameExists( aTitle ) ) 674cdf0e10cSrcweir throw IllegalArgumentException(); 675cdf0e10cSrcweir 676cdf0e10cSrcweir // ensure that we have a filter list 677cdf0e10cSrcweir ensureFilterList( aTitle ); 678cdf0e10cSrcweir 679cdf0e10cSrcweir // append the filter 680cdf0e10cSrcweir m_pFilterList->insert( m_pFilterList->end(), FilterEntry( aTitle, aFilter ) ); 681cdf0e10cSrcweir } 682cdf0e10cSrcweir 683cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 684cdf0e10cSrcweir // 685cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 686cdf0e10cSrcweir 687cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::setCurrentFilter( const rtl::OUString& aTitle ) 688cdf0e10cSrcweir throw( lang::IllegalArgumentException, uno::RuntimeException ) 689cdf0e10cSrcweir { 690cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 691cdf0e10cSrcweir 692cdf0e10cSrcweir OSL_TRACE( "Setting current filter to %s\n", 693cdf0e10cSrcweir OUStringToOString( aTitle, RTL_TEXTENCODING_UTF8 ).getStr() ); 694cdf0e10cSrcweir 695cdf0e10cSrcweir if( aTitle != m_aCurrentFilter ) 696cdf0e10cSrcweir { 697cdf0e10cSrcweir m_aCurrentFilter = aTitle; 698cdf0e10cSrcweir SetCurFilter( m_aCurrentFilter ); 699cdf0e10cSrcweir OSL_TRACE( "REALLY Setting current filter to %s\n", 700cdf0e10cSrcweir OUStringToOString( aTitle, RTL_TEXTENCODING_UTF8 ).getStr() ); 701cdf0e10cSrcweir 702cdf0e10cSrcweir } 703cdf0e10cSrcweir 704cdf0e10cSrcweir // TODO m_pImpl->setCurrentFilter( aTitle ); 705cdf0e10cSrcweir } 706cdf0e10cSrcweir 707cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 708cdf0e10cSrcweir // 709cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 710cdf0e10cSrcweir 711cdf0e10cSrcweir void SalGtkFilePicker::updateCurrentFilterFromName(const gchar* filtername) 712cdf0e10cSrcweir { 713cdf0e10cSrcweir OUString aFilterName(filtername, strlen(filtername), RTL_TEXTENCODING_UTF8); 714cdf0e10cSrcweir FilterList::iterator aEnd = m_pFilterList->end(); 715cdf0e10cSrcweir for (FilterList::iterator aIter = m_pFilterList->begin(); aIter != aEnd; ++aIter) 716cdf0e10cSrcweir { 717cdf0e10cSrcweir if (aFilterName == shrinkFilterName( aIter->getTitle())) 718cdf0e10cSrcweir { 719cdf0e10cSrcweir m_aCurrentFilter = aIter->getTitle(); 720cdf0e10cSrcweir break; 721cdf0e10cSrcweir } 722cdf0e10cSrcweir } 723cdf0e10cSrcweir } 724cdf0e10cSrcweir 725cdf0e10cSrcweir void SalGtkFilePicker::UpdateFilterfromUI() 726cdf0e10cSrcweir { 727cdf0e10cSrcweir // Update the filtername from the users selection if they have had a chance to do so. 728cdf0e10cSrcweir // If the user explicitly sets a type then use that, if not then take the implicit type 729cdf0e10cSrcweir // from the filter of the files glob on which he is currently searching 730cdf0e10cSrcweir if (!mnHID_FolderChange || !mnHID_SelectionChange) 731cdf0e10cSrcweir return; 732cdf0e10cSrcweir 733cdf0e10cSrcweir GdkThreadLock aLock; 734cdf0e10cSrcweir 735cdf0e10cSrcweir GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(m_pFilterView)); 736cdf0e10cSrcweir GtkTreeIter iter; 737cdf0e10cSrcweir GtkTreeModel *model; 738cdf0e10cSrcweir if (gtk_tree_selection_get_selected (selection, &model, &iter)) 739cdf0e10cSrcweir { 740cdf0e10cSrcweir gchar *title; 741cdf0e10cSrcweir gtk_tree_model_get (model, &iter, 2, &title, -1); 742cdf0e10cSrcweir updateCurrentFilterFromName(title); 743cdf0e10cSrcweir g_free (title); 744cdf0e10cSrcweir } 745cdf0e10cSrcweir else if( GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(m_pDialog))) 746cdf0e10cSrcweir { 747e5d951fcSPedro Giffuni if (m_pPseudoFilter != filter) 748cdf0e10cSrcweir updateCurrentFilterFromName(gtk_file_filter_get_name( filter )); 749e5d951fcSPedro Giffuni else 750e5d951fcSPedro Giffuni updateCurrentFilterFromName(OUStringToOString( m_aInitialFilter, RTL_TEXTENCODING_UTF8 ).getStr()); 751cdf0e10cSrcweir } 752cdf0e10cSrcweir } 753cdf0e10cSrcweir 754cdf0e10cSrcweir rtl::OUString SAL_CALL SalGtkFilePicker::getCurrentFilter() throw( uno::RuntimeException ) 755cdf0e10cSrcweir { 756cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 757cdf0e10cSrcweir 758cdf0e10cSrcweir OSL_TRACE( "GetCURRENTfilter\n" ); 759cdf0e10cSrcweir 760cdf0e10cSrcweir UpdateFilterfromUI(); 761cdf0e10cSrcweir 762cdf0e10cSrcweir OSL_TRACE( "Returning current filter of %s\n", 763cdf0e10cSrcweir OUStringToOString( m_aCurrentFilter, RTL_TEXTENCODING_UTF8 ).getStr() ); 764cdf0e10cSrcweir 765cdf0e10cSrcweir return m_aCurrentFilter; 766cdf0e10cSrcweir } 767cdf0e10cSrcweir 768cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 769cdf0e10cSrcweir // XFilterGroupManager functions 770cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 771cdf0e10cSrcweir 772cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::appendFilterGroup( const rtl::OUString& /*sGroupTitle*/, const uno::Sequence<beans::StringPair>& aFilters ) 773cdf0e10cSrcweir throw( lang::IllegalArgumentException, uno::RuntimeException ) 774cdf0e10cSrcweir { 775cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 776cdf0e10cSrcweir 777cdf0e10cSrcweir // TODO m_pImpl->appendFilterGroup( sGroupTitle, aFilters ); 778cdf0e10cSrcweir // check the names 779cdf0e10cSrcweir if( FilterNameExists( aFilters ) ) 780cdf0e10cSrcweir // TODO: a more precise exception message 781cdf0e10cSrcweir throw IllegalArgumentException(); 782cdf0e10cSrcweir 783cdf0e10cSrcweir // ensure that we have a filter list 784cdf0e10cSrcweir ::rtl::OUString sInitialCurrentFilter; 785cdf0e10cSrcweir if( aFilters.getLength() ) 786cdf0e10cSrcweir sInitialCurrentFilter = aFilters[0].First; 787cdf0e10cSrcweir 788cdf0e10cSrcweir ensureFilterList( sInitialCurrentFilter ); 789cdf0e10cSrcweir 790cdf0e10cSrcweir // append the filter 791cdf0e10cSrcweir const StringPair* pSubFilters = aFilters.getConstArray(); 792cdf0e10cSrcweir const StringPair* pSubFiltersEnd = pSubFilters + aFilters.getLength(); 793cdf0e10cSrcweir for( ; pSubFilters != pSubFiltersEnd; ++pSubFilters ) 794cdf0e10cSrcweir m_pFilterList->insert( m_pFilterList->end(), FilterEntry( pSubFilters->First, pSubFilters->Second ) ); 795cdf0e10cSrcweir 796cdf0e10cSrcweir } 797cdf0e10cSrcweir 798cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 799cdf0e10cSrcweir // XFilePicker functions 800cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 801cdf0e10cSrcweir 802cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::setMultiSelectionMode( sal_Bool bMode ) throw( uno::RuntimeException ) 803cdf0e10cSrcweir { 804cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 805cdf0e10cSrcweir 806cdf0e10cSrcweir GdkThreadLock aLock; 807cdf0e10cSrcweir 808cdf0e10cSrcweir gtk_file_chooser_set_select_multiple( GTK_FILE_CHOOSER(m_pDialog), bMode ); 809cdf0e10cSrcweir } 810cdf0e10cSrcweir 811cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::setDefaultName( const rtl::OUString& aName ) 812cdf0e10cSrcweir throw( uno::RuntimeException ) 813cdf0e10cSrcweir { 814cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 815cdf0e10cSrcweir 816cdf0e10cSrcweir GdkThreadLock aLock; 817cdf0e10cSrcweir 818cdf0e10cSrcweir OString aStr = OUStringToOString( aName, RTL_TEXTENCODING_UTF8 ); 819cdf0e10cSrcweir GtkFileChooserAction eAction = gtk_file_chooser_get_action( GTK_FILE_CHOOSER( m_pDialog ) ); 820cdf0e10cSrcweir 821cdf0e10cSrcweir // set_current_name launches a Gtk critical error if called for other than save 822cdf0e10cSrcweir if( GTK_FILE_CHOOSER_ACTION_SAVE == eAction ) 823cdf0e10cSrcweir gtk_file_chooser_set_current_name( GTK_FILE_CHOOSER( m_pDialog ), aStr.getStr() ); 824cdf0e10cSrcweir } 825cdf0e10cSrcweir 826cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::setDisplayDirectory( const rtl::OUString& rDirectory ) 827cdf0e10cSrcweir throw( lang::IllegalArgumentException, uno::RuntimeException ) 828cdf0e10cSrcweir { 829cdf0e10cSrcweir implsetDisplayDirectory(rDirectory); 830cdf0e10cSrcweir } 831cdf0e10cSrcweir 832cdf0e10cSrcweir rtl::OUString SAL_CALL SalGtkFilePicker::getDisplayDirectory() throw( uno::RuntimeException ) 833cdf0e10cSrcweir { 834cdf0e10cSrcweir return implgetDisplayDirectory(); 835cdf0e10cSrcweir } 836cdf0e10cSrcweir 837cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL SalGtkFilePicker::getFiles() throw( uno::RuntimeException ) 838cdf0e10cSrcweir { 839cdf0e10cSrcweir uno::Sequence< rtl::OUString > aFiles = getSelectedFiles(); 840cdf0e10cSrcweir /* 841cdf0e10cSrcweir The previous multiselection API design was completely broken 842cdf0e10cSrcweir and unimplementable for some hetrogenous pseudo-URIs eg. search:// 843cdf0e10cSrcweir Thus crop unconditionally to a single selection. 844cdf0e10cSrcweir */ 845cdf0e10cSrcweir aFiles.realloc (1); 846cdf0e10cSrcweir return aFiles; 847cdf0e10cSrcweir } 848cdf0e10cSrcweir 849cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL SalGtkFilePicker::getSelectedFiles() throw( uno::RuntimeException ) 850cdf0e10cSrcweir { 851cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 852cdf0e10cSrcweir 853cdf0e10cSrcweir GdkThreadLock aLock; 854cdf0e10cSrcweir 855cdf0e10cSrcweir GSList* pPathList = gtk_file_chooser_get_uris( GTK_FILE_CHOOSER(m_pDialog) ); 856cdf0e10cSrcweir 857cdf0e10cSrcweir int nCount = g_slist_length( pPathList ); 858cdf0e10cSrcweir int nIndex = 0; 859cdf0e10cSrcweir OSL_TRACE( "GETFILES called %d files\n", nCount ); 860cdf0e10cSrcweir 861cdf0e10cSrcweir // get the current action setting 862cdf0e10cSrcweir GtkFileChooserAction eAction = gtk_file_chooser_get_action( 863cdf0e10cSrcweir GTK_FILE_CHOOSER( m_pDialog )); 864cdf0e10cSrcweir 865cdf0e10cSrcweir uno::Sequence< rtl::OUString > aSelectedFiles(nCount); 866cdf0e10cSrcweir 867cdf0e10cSrcweir // Convert to OOo 868cdf0e10cSrcweir for( GSList *pElem = pPathList; pElem; pElem = pElem->next) 869cdf0e10cSrcweir { 870cdf0e10cSrcweir gchar *pURI = reinterpret_cast<gchar*>(pElem->data); 871cdf0e10cSrcweir aSelectedFiles[ nIndex ] = uritounicode(pURI); 872cdf0e10cSrcweir 873cdf0e10cSrcweir if( GTK_FILE_CHOOSER_ACTION_SAVE == eAction ) 874cdf0e10cSrcweir { 875cdf0e10cSrcweir OUString sFilterName; 876cdf0e10cSrcweir sal_Int32 nTokenIndex = 0; 877cdf0e10cSrcweir bool bExtensionTypedIn = false; 878cdf0e10cSrcweir 879cdf0e10cSrcweir GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(m_pFilterView)); 880cdf0e10cSrcweir GtkTreeIter iter; 881cdf0e10cSrcweir GtkTreeModel *model; 882cdf0e10cSrcweir if (gtk_tree_selection_get_selected (selection, &model, &iter)) 883cdf0e10cSrcweir { 884cdf0e10cSrcweir gchar *title; 885cdf0e10cSrcweir gtk_tree_model_get (model, &iter, 2, &title, -1); 886cdf0e10cSrcweir sFilterName = OUString( title, strlen( title), RTL_TEXTENCODING_UTF8 ); 887cdf0e10cSrcweir g_free (title); 888cdf0e10cSrcweir } 889cdf0e10cSrcweir else 890cdf0e10cSrcweir { 891cdf0e10cSrcweir if( aSelectedFiles[nIndex].indexOf('.') > 0 ) 892cdf0e10cSrcweir { 893cdf0e10cSrcweir rtl::OUString sExtension; 894cdf0e10cSrcweir nTokenIndex = 0; 895cdf0e10cSrcweir do 896cdf0e10cSrcweir sExtension = aSelectedFiles[nIndex].getToken( 0, '.', nTokenIndex ); 897cdf0e10cSrcweir while( nTokenIndex >= 0 ); 898cdf0e10cSrcweir 899cdf0e10cSrcweir if( sExtension.getLength() >= 3 ) // 3 = typical/minimum extension length 900cdf0e10cSrcweir { 901cdf0e10cSrcweir static const OUString aStarDot = OUString::createFromAscii( "*." ); 902cdf0e10cSrcweir 903cdf0e10cSrcweir ::rtl::OUString aNewFilter; 904cdf0e10cSrcweir ::rtl::OUString aOldFilter = getCurrentFilter(); 905cdf0e10cSrcweir sal_Bool bChangeFilter = sal_True; 906cdf0e10cSrcweir for ( FilterList::iterator aListIter = m_pFilterList->begin(); 907cdf0e10cSrcweir aListIter != m_pFilterList->end(); 908cdf0e10cSrcweir ++aListIter 909cdf0e10cSrcweir ) 910cdf0e10cSrcweir { 911cdf0e10cSrcweir if( aListIter->getFilter().indexOf( aStarDot+sExtension ) >= 0 ) 912cdf0e10cSrcweir { 913cdf0e10cSrcweir if( !aNewFilter.getLength() ) 914cdf0e10cSrcweir aNewFilter = aListIter->getTitle(); 915cdf0e10cSrcweir 916cdf0e10cSrcweir if( aOldFilter == aListIter->getTitle() ) 917cdf0e10cSrcweir bChangeFilter = sal_False; 918cdf0e10cSrcweir 919cdf0e10cSrcweir bExtensionTypedIn = true; 920cdf0e10cSrcweir } 921cdf0e10cSrcweir } 922cdf0e10cSrcweir if( bChangeFilter ) 923cdf0e10cSrcweir setCurrentFilter( aNewFilter ); 924cdf0e10cSrcweir } 925cdf0e10cSrcweir } 926cdf0e10cSrcweir 927e5d951fcSPedro Giffuni GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(m_pDialog)); 928e5d951fcSPedro Giffuni if (m_pPseudoFilter != filter) 929e5d951fcSPedro Giffuni { 930cdf0e10cSrcweir const gchar* filtername = 931e5d951fcSPedro Giffuni gtk_file_filter_get_name( filter ); 932cdf0e10cSrcweir sFilterName = OUString( filtername, strlen( filtername ), RTL_TEXTENCODING_UTF8 ); 933cdf0e10cSrcweir } 934e5d951fcSPedro Giffuni else 935e5d951fcSPedro Giffuni sFilterName = m_aInitialFilter; 936e5d951fcSPedro Giffuni } 937cdf0e10cSrcweir 938cdf0e10cSrcweir OSL_TRACE( "2: current filter is %s\n", 939cdf0e10cSrcweir OUStringToOString( sFilterName, RTL_TEXTENCODING_UTF8 ).getStr() ); 940cdf0e10cSrcweir 941cdf0e10cSrcweir FilterList::iterator aListIter = ::std::find_if( 942cdf0e10cSrcweir m_pFilterList->begin(), m_pFilterList->end(), FilterTitleMatch(sFilterName) ); 943cdf0e10cSrcweir 944cdf0e10cSrcweir OUString aFilter; 945cdf0e10cSrcweir if (aListIter != m_pFilterList->end()) 946cdf0e10cSrcweir aFilter = aListIter->getFilter(); 947cdf0e10cSrcweir 948cdf0e10cSrcweir OSL_TRACE( "turned into %s\n", 949cdf0e10cSrcweir OUStringToOString( aFilter, RTL_TEXTENCODING_UTF8 ).getStr() ); 950cdf0e10cSrcweir 951cdf0e10cSrcweir nTokenIndex = 0; 952cdf0e10cSrcweir rtl::OUString sToken; 953cdf0e10cSrcweir // rtl::OUString strExt; 954cdf0e10cSrcweir do 955cdf0e10cSrcweir { 956cdf0e10cSrcweir sToken = aFilter.getToken( 0, '.', nTokenIndex ); 957cdf0e10cSrcweir 958cdf0e10cSrcweir if ( sToken.lastIndexOf( ';' ) != -1 ) 959cdf0e10cSrcweir { 960cdf0e10cSrcweir sal_Int32 nZero = 0; 961cdf0e10cSrcweir OUString aCurrentToken = sToken.getToken( 0, ';', nZero); 962cdf0e10cSrcweir 963cdf0e10cSrcweir sToken = aCurrentToken; 964cdf0e10cSrcweir break; 965cdf0e10cSrcweir } 966cdf0e10cSrcweir } 967cdf0e10cSrcweir while( nTokenIndex >= 0 ); 968cdf0e10cSrcweir 969cdf0e10cSrcweir if( !bExtensionTypedIn && ( !sToken.equalsAscii( "*" ) ) ) 970cdf0e10cSrcweir { 971cdf0e10cSrcweir //if the filename does not already have the auto extension, stick it on 972cdf0e10cSrcweir OUString sExtension = OUString::createFromAscii( "." ) + sToken; 973cdf0e10cSrcweir OUString &rBase = aSelectedFiles[nIndex]; 974cdf0e10cSrcweir sal_Int32 nExtensionIdx = rBase.getLength() - sExtension.getLength(); 975cdf0e10cSrcweir OSL_TRACE( "idx are %d %d\n", rBase.lastIndexOf( sExtension ), nExtensionIdx ); 976cdf0e10cSrcweir 977cdf0e10cSrcweir if( rBase.lastIndexOf( sExtension ) != nExtensionIdx ) 978cdf0e10cSrcweir rBase += sExtension; 979cdf0e10cSrcweir } 980cdf0e10cSrcweir 981cdf0e10cSrcweir } 982cdf0e10cSrcweir 983cdf0e10cSrcweir nIndex++; 984cdf0e10cSrcweir g_free( pURI ); 985cdf0e10cSrcweir } 986cdf0e10cSrcweir 987cdf0e10cSrcweir g_slist_free( pPathList ); 988cdf0e10cSrcweir 989cdf0e10cSrcweir return aSelectedFiles; 990cdf0e10cSrcweir } 991cdf0e10cSrcweir 992cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 993cdf0e10cSrcweir // XExecutableDialog functions 994cdf0e10cSrcweir //----------------------------------------------------------------------------------------- 995cdf0e10cSrcweir 996cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::setTitle( const rtl::OUString& rTitle ) throw( uno::RuntimeException ) 997cdf0e10cSrcweir { 998cdf0e10cSrcweir implsetTitle(rTitle); 999cdf0e10cSrcweir } 1000cdf0e10cSrcweir 1001cdf0e10cSrcweir sal_Int16 SAL_CALL SalGtkFilePicker::execute() throw( uno::RuntimeException ) 1002cdf0e10cSrcweir { 1003cdf0e10cSrcweir OSL_TRACE( "1: HERE WE ARE\n"); 1004cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1005cdf0e10cSrcweir 1006cdf0e10cSrcweir GdkThreadLock aLock; 1007cdf0e10cSrcweir 1008cdf0e10cSrcweir sal_Int16 retVal = 0; 1009cdf0e10cSrcweir 1010cdf0e10cSrcweir SetFilters(); 1011cdf0e10cSrcweir 1012cdf0e10cSrcweir mnHID_FolderChange = 1013cdf0e10cSrcweir g_signal_connect( GTK_FILE_CHOOSER( m_pDialog ), "current-folder-changed", 1014cdf0e10cSrcweir G_CALLBACK( folder_changed_cb ), ( gpointer )this ); 1015cdf0e10cSrcweir 1016cdf0e10cSrcweir mnHID_SelectionChange = 1017cdf0e10cSrcweir g_signal_connect( GTK_FILE_CHOOSER( m_pDialog ), "selection-changed", 1018cdf0e10cSrcweir G_CALLBACK( selection_changed_cb ), ( gpointer )this ); 1019cdf0e10cSrcweir 1020cdf0e10cSrcweir int btn = GTK_RESPONSE_NO; 1021cdf0e10cSrcweir 1022cdf0e10cSrcweir uno::Reference< awt::XExtendedToolkit > xToolkit( 1023cdf0e10cSrcweir m_xServiceMgr->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.awt.Toolkit") ), uno::UNO_QUERY); 1024cdf0e10cSrcweir 1025cdf0e10cSrcweir RunDialog* pRunDialog = new RunDialog(m_pDialog, xToolkit); 1026cdf0e10cSrcweir uno::Reference < awt::XTopWindowListener > xLifeCycle(pRunDialog); 1027cdf0e10cSrcweir while( GTK_RESPONSE_NO == btn ) 1028cdf0e10cSrcweir { 1029cdf0e10cSrcweir btn = GTK_RESPONSE_YES; // we dont want to repeat unless user clicks NO for file save. 1030cdf0e10cSrcweir 1031cdf0e10cSrcweir gint nStatus = pRunDialog->run(); 1032cdf0e10cSrcweir switch( nStatus ) 1033cdf0e10cSrcweir { 1034cdf0e10cSrcweir case GTK_RESPONSE_ACCEPT: 1035cdf0e10cSrcweir if( GTK_FILE_CHOOSER_ACTION_SAVE == gtk_file_chooser_get_action( GTK_FILE_CHOOSER( m_pDialog ) ) ) 1036cdf0e10cSrcweir { 1037cdf0e10cSrcweir Sequence < OUString > aPathSeq = getFiles(); 1038cdf0e10cSrcweir if( aPathSeq.getLength() == 1 ) 1039cdf0e10cSrcweir { 1040cdf0e10cSrcweir OString sFileName = unicodetouri( aPathSeq[0] ); 1041cdf0e10cSrcweir if( g_file_test( g_filename_from_uri( sFileName.getStr(), NULL, NULL ), G_FILE_TEST_IS_REGULAR ) ) 1042cdf0e10cSrcweir { 1043cdf0e10cSrcweir CResourceProvider aResProvider; 1044cdf0e10cSrcweir GtkWidget *dlg; 1045cdf0e10cSrcweir 1046cdf0e10cSrcweir dlg = gtk_message_dialog_new( NULL, 1047cdf0e10cSrcweir GTK_DIALOG_MODAL, 1048cdf0e10cSrcweir GTK_MESSAGE_QUESTION, 1049cdf0e10cSrcweir GTK_BUTTONS_YES_NO, 1050cdf0e10cSrcweir OUStringToOString( 1051cdf0e10cSrcweir aResProvider.getResString( FILE_PICKER_OVERWRITE ), 1052cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 1053cdf0e10cSrcweir 1054cdf0e10cSrcweir gtk_window_set_title( GTK_WINDOW( dlg ), 1055cdf0e10cSrcweir OUStringToOString(aResProvider.getResString(FILE_PICKER_TITLE_SAVE ), 1056cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ).getStr() ); 1057cdf0e10cSrcweir 1058cdf0e10cSrcweir RunDialog* pAnotherDialog = new RunDialog(dlg, xToolkit); 1059cdf0e10cSrcweir uno::Reference < awt::XTopWindowListener > xAnotherLifeCycle(pAnotherDialog); 1060cdf0e10cSrcweir btn = pAnotherDialog->run(); 1061cdf0e10cSrcweir 1062cdf0e10cSrcweir gtk_widget_destroy( dlg ); 1063cdf0e10cSrcweir } 1064cdf0e10cSrcweir 1065cdf0e10cSrcweir if( btn == GTK_RESPONSE_YES ) 1066cdf0e10cSrcweir retVal = ExecutableDialogResults::OK; 1067cdf0e10cSrcweir } 1068cdf0e10cSrcweir } 1069cdf0e10cSrcweir else 1070cdf0e10cSrcweir retVal = ExecutableDialogResults::OK; 1071cdf0e10cSrcweir break; 1072cdf0e10cSrcweir 1073cdf0e10cSrcweir case GTK_RESPONSE_CANCEL: 1074cdf0e10cSrcweir retVal = ExecutableDialogResults::CANCEL; 1075cdf0e10cSrcweir break; 1076cdf0e10cSrcweir 1077cdf0e10cSrcweir case 1: //PLAY 1078cdf0e10cSrcweir { 1079cdf0e10cSrcweir FilePickerEvent evt; 1080cdf0e10cSrcweir evt.ElementId = PUSHBUTTON_PLAY; 1081cdf0e10cSrcweir OSL_TRACE( "filter_changed, isn't it great %x\n", this); 1082cdf0e10cSrcweir controlStateChanged( evt ); 1083cdf0e10cSrcweir btn = GTK_RESPONSE_NO; 1084cdf0e10cSrcweir } 1085cdf0e10cSrcweir break; 1086cdf0e10cSrcweir 1087cdf0e10cSrcweir default: 1088cdf0e10cSrcweir retVal = 0; 1089cdf0e10cSrcweir break; 1090cdf0e10cSrcweir } 1091cdf0e10cSrcweir } 1092cdf0e10cSrcweir 1093cdf0e10cSrcweir if (mnHID_FolderChange) 1094cdf0e10cSrcweir g_signal_handler_disconnect(GTK_FILE_CHOOSER( m_pDialog ), mnHID_FolderChange); 1095cdf0e10cSrcweir if (mnHID_SelectionChange) 1096cdf0e10cSrcweir g_signal_handler_disconnect(GTK_FILE_CHOOSER( m_pDialog ), mnHID_SelectionChange); 1097cdf0e10cSrcweir 1098cdf0e10cSrcweir return retVal; 1099cdf0e10cSrcweir } 1100cdf0e10cSrcweir 1101cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1102cdf0e10cSrcweir 1103cdf0e10cSrcweir // cf. offapi/com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.idl 1104cdf0e10cSrcweir GtkWidget *SalGtkFilePicker::getWidget( sal_Int16 nControlId, GType *pType ) 1105cdf0e10cSrcweir { 1106cdf0e10cSrcweir OSL_TRACE("control id is %d", nControlId); 1107cdf0e10cSrcweir GType tType = GTK_TYPE_TOGGLE_BUTTON; //prevent waring by initializing 1108cdf0e10cSrcweir GtkWidget *pWidget = 0; 1109cdf0e10cSrcweir 1110cdf0e10cSrcweir #define MAP_TOGGLE( elem ) \ 1111cdf0e10cSrcweir case ExtendedFilePickerElementIds::CHECKBOX_##elem: \ 1112cdf0e10cSrcweir pWidget = m_pToggles[elem]; tType = GTK_TYPE_TOGGLE_BUTTON; \ 1113cdf0e10cSrcweir break 1114cdf0e10cSrcweir #define MAP_BUTTON( elem ) \ 1115cdf0e10cSrcweir case ExtendedFilePickerElementIds::PUSHBUTTON_##elem: \ 1116cdf0e10cSrcweir pWidget = m_pButtons[elem]; tType = GTK_TYPE_BUTTON; \ 1117cdf0e10cSrcweir break 1118cdf0e10cSrcweir #define MAP_LIST( elem ) \ 1119cdf0e10cSrcweir case ExtendedFilePickerElementIds::LISTBOX_##elem: \ 1120cdf0e10cSrcweir pWidget = m_pLists[elem]; tType = GTK_TYPE_COMBO_BOX; \ 1121cdf0e10cSrcweir break 1122cdf0e10cSrcweir #define MAP_LIST_LABEL( elem ) \ 1123cdf0e10cSrcweir case ExtendedFilePickerElementIds::LISTBOX_##elem##_LABEL: \ 1124cdf0e10cSrcweir pWidget = m_pListLabels[elem]; tType = GTK_TYPE_LABEL; \ 1125cdf0e10cSrcweir break 1126cdf0e10cSrcweir 1127cdf0e10cSrcweir switch( nControlId ) 1128cdf0e10cSrcweir { 1129cdf0e10cSrcweir MAP_TOGGLE( AUTOEXTENSION ); 1130cdf0e10cSrcweir MAP_TOGGLE( PASSWORD ); 1131cdf0e10cSrcweir MAP_TOGGLE( FILTEROPTIONS ); 1132cdf0e10cSrcweir MAP_TOGGLE( READONLY ); 1133cdf0e10cSrcweir MAP_TOGGLE( LINK ); 1134cdf0e10cSrcweir MAP_TOGGLE( PREVIEW ); 1135cdf0e10cSrcweir MAP_TOGGLE( SELECTION ); 1136cdf0e10cSrcweir MAP_BUTTON( PLAY ); 1137cdf0e10cSrcweir MAP_LIST( VERSION ); 1138cdf0e10cSrcweir MAP_LIST( TEMPLATE ); 1139cdf0e10cSrcweir MAP_LIST( IMAGE_TEMPLATE ); 1140cdf0e10cSrcweir MAP_LIST_LABEL( VERSION ); 1141cdf0e10cSrcweir MAP_LIST_LABEL( TEMPLATE ); 1142cdf0e10cSrcweir MAP_LIST_LABEL( IMAGE_TEMPLATE ); 1143cdf0e10cSrcweir default: 1144cdf0e10cSrcweir OSL_TRACE("Handle unknown control %d\n", nControlId); 1145cdf0e10cSrcweir break; 1146cdf0e10cSrcweir } 1147cdf0e10cSrcweir #undef MAP 1148cdf0e10cSrcweir 1149cdf0e10cSrcweir if( pType ) 1150cdf0e10cSrcweir *pType = tType; 1151cdf0e10cSrcweir return pWidget; 1152cdf0e10cSrcweir } 1153cdf0e10cSrcweir 1154cdf0e10cSrcweir 1155cdf0e10cSrcweir 1156cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1157cdf0e10cSrcweir // XFilePickerControlAccess functions 1158cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1159cdf0e10cSrcweir namespace 1160cdf0e10cSrcweir { 1161cdf0e10cSrcweir void HackWidthToFirst(GtkComboBox *pWidget) 1162cdf0e10cSrcweir { 1163cdf0e10cSrcweir GdkThreadLock aLock; 1164cdf0e10cSrcweir 1165cdf0e10cSrcweir GtkRequisition requisition; 1166cdf0e10cSrcweir gtk_widget_size_request(GTK_WIDGET(pWidget), &requisition); 1167cdf0e10cSrcweir gtk_widget_set_size_request(GTK_WIDGET(pWidget), requisition.width, -1); 1168cdf0e10cSrcweir } 1169cdf0e10cSrcweir } 1170cdf0e10cSrcweir 1171cdf0e10cSrcweir void SalGtkFilePicker::HandleSetListValue(GtkComboBox *pWidget, sal_Int16 nControlAction, const uno::Any& rValue) 1172cdf0e10cSrcweir { 1173cdf0e10cSrcweir GdkThreadLock aLock; 1174cdf0e10cSrcweir 1175cdf0e10cSrcweir switch (nControlAction) 1176cdf0e10cSrcweir { 1177cdf0e10cSrcweir case ControlActions::ADD_ITEM: 1178cdf0e10cSrcweir { 1179cdf0e10cSrcweir OUString sItem; 1180cdf0e10cSrcweir rValue >>= sItem; 1181cdf0e10cSrcweir gtk_combo_box_append_text(pWidget, rtl::OUStringToOString(sItem, RTL_TEXTENCODING_UTF8).getStr()); 1182cdf0e10cSrcweir if (!bVersionWidthUnset) 1183cdf0e10cSrcweir { 1184cdf0e10cSrcweir HackWidthToFirst(pWidget); 1185cdf0e10cSrcweir bVersionWidthUnset = true; 1186cdf0e10cSrcweir } 1187cdf0e10cSrcweir } 1188cdf0e10cSrcweir break; 1189cdf0e10cSrcweir case ControlActions::ADD_ITEMS: 1190cdf0e10cSrcweir { 1191cdf0e10cSrcweir Sequence< OUString > aStringList; 1192cdf0e10cSrcweir rValue >>= aStringList; 1193cdf0e10cSrcweir sal_Int32 nItemCount = aStringList.getLength(); 1194cdf0e10cSrcweir for (sal_Int32 i = 0; i < nItemCount; ++i) 1195cdf0e10cSrcweir { 1196cdf0e10cSrcweir gtk_combo_box_append_text(pWidget, 1197cdf0e10cSrcweir rtl::OUStringToOString(aStringList[i], RTL_TEXTENCODING_UTF8).getStr()); 1198cdf0e10cSrcweir if (!bVersionWidthUnset) 1199cdf0e10cSrcweir { 1200cdf0e10cSrcweir HackWidthToFirst(pWidget); 1201cdf0e10cSrcweir bVersionWidthUnset = true; 1202cdf0e10cSrcweir } 1203cdf0e10cSrcweir } 1204cdf0e10cSrcweir } 1205cdf0e10cSrcweir break; 1206cdf0e10cSrcweir case ControlActions::DELETE_ITEM: 1207cdf0e10cSrcweir { 1208cdf0e10cSrcweir sal_Int32 nPos=0; 1209cdf0e10cSrcweir rValue >>= nPos; 1210cdf0e10cSrcweir gtk_combo_box_remove_text(pWidget, nPos); 1211cdf0e10cSrcweir } 1212cdf0e10cSrcweir break; 1213cdf0e10cSrcweir case ControlActions::DELETE_ITEMS: 1214cdf0e10cSrcweir { 1215cdf0e10cSrcweir gtk_combo_box_set_active(pWidget, -1); 1216cdf0e10cSrcweir gint nItems = 0; 1217cdf0e10cSrcweir do 1218cdf0e10cSrcweir { 1219cdf0e10cSrcweir nItems = 1220cdf0e10cSrcweir gtk_tree_model_iter_n_children( 1221cdf0e10cSrcweir gtk_combo_box_get_model(pWidget), NULL); 1222cdf0e10cSrcweir for (gint nI = 0; nI < nItems; ++nI) 1223cdf0e10cSrcweir gtk_combo_box_remove_text(pWidget, nI); 1224cdf0e10cSrcweir } 1225cdf0e10cSrcweir while (nItems); 1226cdf0e10cSrcweir } 1227cdf0e10cSrcweir break; 1228cdf0e10cSrcweir case ControlActions::SET_SELECT_ITEM: 1229cdf0e10cSrcweir { 1230cdf0e10cSrcweir sal_Int32 nPos=0; 1231cdf0e10cSrcweir rValue >>= nPos; 1232cdf0e10cSrcweir gtk_combo_box_set_active(pWidget, nPos); 1233cdf0e10cSrcweir } 1234cdf0e10cSrcweir break; 1235cdf0e10cSrcweir default: 1236cdf0e10cSrcweir OSL_TRACE("undocumented/unimplemented ControlAction for a list"); 1237cdf0e10cSrcweir break; 1238cdf0e10cSrcweir } 1239cdf0e10cSrcweir 1240cdf0e10cSrcweir //I think its best to make it insensitive unless there is the chance to 1241cdf0e10cSrcweir //actually select something from the list. 1242cdf0e10cSrcweir gint nItems = gtk_tree_model_iter_n_children( 1243cdf0e10cSrcweir gtk_combo_box_get_model(pWidget), NULL); 1244cdf0e10cSrcweir gtk_widget_set_sensitive(GTK_WIDGET(pWidget), nItems > 1 ? true : false); 1245cdf0e10cSrcweir } 1246cdf0e10cSrcweir 1247cdf0e10cSrcweir uno::Any SalGtkFilePicker::HandleGetListValue(GtkComboBox *pWidget, sal_Int16 nControlAction) const 1248cdf0e10cSrcweir { 1249cdf0e10cSrcweir GdkThreadLock aLock; 1250cdf0e10cSrcweir 1251cdf0e10cSrcweir uno::Any aAny; 1252cdf0e10cSrcweir switch (nControlAction) 1253cdf0e10cSrcweir { 1254cdf0e10cSrcweir case ControlActions::GET_ITEMS: 1255cdf0e10cSrcweir { 1256cdf0e10cSrcweir Sequence< OUString > aItemList; 1257cdf0e10cSrcweir 1258cdf0e10cSrcweir GtkTreeModel *pTree = gtk_combo_box_get_model(pWidget); 1259cdf0e10cSrcweir GtkTreeIter iter; 1260cdf0e10cSrcweir if (gtk_tree_model_get_iter_first(pTree, &iter)) 1261cdf0e10cSrcweir { 1262cdf0e10cSrcweir sal_Int32 nSize = gtk_tree_model_iter_n_children( 1263cdf0e10cSrcweir pTree, NULL); 1264cdf0e10cSrcweir 1265cdf0e10cSrcweir aItemList.realloc(nSize); 1266cdf0e10cSrcweir for (sal_Int32 i=0; i < nSize; ++i) 1267cdf0e10cSrcweir { 1268cdf0e10cSrcweir gchar *item; 1269cdf0e10cSrcweir gtk_tree_model_get(gtk_combo_box_get_model(pWidget), 1270cdf0e10cSrcweir &iter, 0, &item, -1); 1271cdf0e10cSrcweir aItemList[i] = OUString(item, strlen(item), RTL_TEXTENCODING_UTF8); 1272cdf0e10cSrcweir g_free(item); 1273cdf0e10cSrcweir gtk_tree_model_iter_next(pTree, &iter); 1274cdf0e10cSrcweir } 1275cdf0e10cSrcweir } 1276cdf0e10cSrcweir aAny <<= aItemList; 1277cdf0e10cSrcweir } 1278cdf0e10cSrcweir break; 1279cdf0e10cSrcweir case ControlActions::GET_SELECTED_ITEM: 1280cdf0e10cSrcweir { 1281cdf0e10cSrcweir GtkTreeIter iter; 1282cdf0e10cSrcweir if (gtk_combo_box_get_active_iter(pWidget, &iter)) 1283cdf0e10cSrcweir { 1284cdf0e10cSrcweir gchar *item; 1285cdf0e10cSrcweir gtk_tree_model_get(gtk_combo_box_get_model(pWidget), 1286cdf0e10cSrcweir &iter, 0, &item, -1); 1287cdf0e10cSrcweir OUString sItem(item, strlen(item), RTL_TEXTENCODING_UTF8); 1288cdf0e10cSrcweir aAny <<= sItem; 1289cdf0e10cSrcweir g_free(item); 1290cdf0e10cSrcweir } 1291cdf0e10cSrcweir } 1292cdf0e10cSrcweir break; 1293cdf0e10cSrcweir case ControlActions::GET_SELECTED_ITEM_INDEX: 1294cdf0e10cSrcweir { 1295cdf0e10cSrcweir gint nActive = gtk_combo_box_get_active(pWidget); 1296cdf0e10cSrcweir aAny <<= static_cast< sal_Int32 >(nActive); 1297cdf0e10cSrcweir } 1298cdf0e10cSrcweir break; 1299cdf0e10cSrcweir default: 1300cdf0e10cSrcweir OSL_TRACE("undocumented/unimplemented ControlAction for a list"); 1301cdf0e10cSrcweir break; 1302cdf0e10cSrcweir } 1303cdf0e10cSrcweir return aAny; 1304cdf0e10cSrcweir } 1305cdf0e10cSrcweir 1306cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const uno::Any& rValue ) 1307cdf0e10cSrcweir throw( uno::RuntimeException ) 1308cdf0e10cSrcweir { 1309cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1310cdf0e10cSrcweir 1311cdf0e10cSrcweir OSL_TRACE( "SETTING VALUE %d\n", nControlAction ); 1312cdf0e10cSrcweir GType tType; 1313cdf0e10cSrcweir GtkWidget *pWidget; 1314cdf0e10cSrcweir 1315cdf0e10cSrcweir GdkThreadLock aLock; 1316cdf0e10cSrcweir 1317cdf0e10cSrcweir if( !( pWidget = getWidget( nControlId, &tType ) ) ) 1318cdf0e10cSrcweir OSL_TRACE("enable unknown control %d\n", nControlId); 1319cdf0e10cSrcweir else if( tType == GTK_TYPE_TOGGLE_BUTTON ) 1320cdf0e10cSrcweir { 1321cdf0e10cSrcweir sal_Bool bChecked = false; 1322cdf0e10cSrcweir rValue >>= bChecked; 1323cdf0e10cSrcweir gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( pWidget ), bChecked ); 1324cdf0e10cSrcweir } 1325cdf0e10cSrcweir else if( tType == GTK_TYPE_COMBO_BOX ) 1326cdf0e10cSrcweir HandleSetListValue(GTK_COMBO_BOX(pWidget), nControlAction, rValue); 1327cdf0e10cSrcweir else 1328cdf0e10cSrcweir { 1329cdf0e10cSrcweir OSL_TRACE("Can't set value on button / list %d %d\n", 1330cdf0e10cSrcweir nControlId, nControlAction); 1331cdf0e10cSrcweir } 1332cdf0e10cSrcweir } 1333cdf0e10cSrcweir 1334cdf0e10cSrcweir uno::Any SAL_CALL SalGtkFilePicker::getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) 1335cdf0e10cSrcweir throw( uno::RuntimeException ) 1336cdf0e10cSrcweir { 1337cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1338cdf0e10cSrcweir 1339cdf0e10cSrcweir uno::Any aRetval; 1340cdf0e10cSrcweir 1341cdf0e10cSrcweir GType tType; 1342cdf0e10cSrcweir GtkWidget *pWidget; 1343cdf0e10cSrcweir 1344cdf0e10cSrcweir GdkThreadLock aLock; 1345cdf0e10cSrcweir 1346cdf0e10cSrcweir if( !( pWidget = getWidget( nControlId, &tType ) ) ) 1347cdf0e10cSrcweir OSL_TRACE("enable unknown control %d\n", nControlId); 1348cdf0e10cSrcweir else if( tType == GTK_TYPE_TOGGLE_BUTTON ) 1349cdf0e10cSrcweir aRetval <<= (sal_Bool) gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( pWidget ) ); 1350cdf0e10cSrcweir else if( tType == GTK_TYPE_COMBO_BOX ) 1351cdf0e10cSrcweir aRetval = HandleGetListValue(GTK_COMBO_BOX(pWidget), nControlAction); 1352cdf0e10cSrcweir else 1353cdf0e10cSrcweir OSL_TRACE("Can't get value on button / list %d %d\n", 1354cdf0e10cSrcweir nControlId, nControlAction ); 1355cdf0e10cSrcweir 1356cdf0e10cSrcweir return aRetval; 1357cdf0e10cSrcweir } 1358cdf0e10cSrcweir 1359cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::enableControl( sal_Int16 nControlId, sal_Bool bEnable ) 1360cdf0e10cSrcweir throw( uno::RuntimeException ) 1361cdf0e10cSrcweir { 1362cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1363cdf0e10cSrcweir 1364cdf0e10cSrcweir GtkWidget *pWidget; 1365cdf0e10cSrcweir 1366cdf0e10cSrcweir GdkThreadLock aLock; 1367cdf0e10cSrcweir 1368cdf0e10cSrcweir if ( nControlId == ExtendedFilePickerElementIds::LISTBOX_FILTER_SELECTOR ) 1369cdf0e10cSrcweir gtk_expander_set_expanded( GTK_EXPANDER( m_pFilterExpander ), bEnable ); 1370cdf0e10cSrcweir else if( ( pWidget = getWidget( nControlId ) ) ) 1371cdf0e10cSrcweir { 1372cdf0e10cSrcweir if( bEnable ) 1373cdf0e10cSrcweir { 1374cdf0e10cSrcweir OSL_TRACE( "enable\n" ); 1375cdf0e10cSrcweir gtk_widget_set_sensitive( pWidget, sal_True ); 1376cdf0e10cSrcweir } 1377cdf0e10cSrcweir else 1378cdf0e10cSrcweir { 1379cdf0e10cSrcweir OSL_TRACE( "disable\n" ); 1380cdf0e10cSrcweir gtk_widget_set_sensitive( pWidget, sal_False ); 1381cdf0e10cSrcweir } 1382cdf0e10cSrcweir } 1383cdf0e10cSrcweir else 1384cdf0e10cSrcweir OSL_TRACE("enable unknown control %d\n", nControlId ); 1385cdf0e10cSrcweir } 1386cdf0e10cSrcweir 1387cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::setLabel( sal_Int16 nControlId, const ::rtl::OUString& rLabel ) 1388cdf0e10cSrcweir throw( uno::RuntimeException ) 1389cdf0e10cSrcweir { 1390cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1391cdf0e10cSrcweir 1392cdf0e10cSrcweir GType tType; 1393cdf0e10cSrcweir GtkWidget *pWidget; 1394cdf0e10cSrcweir 1395cdf0e10cSrcweir GdkThreadLock aLock; 1396cdf0e10cSrcweir 1397cdf0e10cSrcweir if( !( pWidget = getWidget( nControlId, &tType ) ) ) 1398cdf0e10cSrcweir { 1399cdf0e10cSrcweir OSL_TRACE("Set label on unknown control %d\n", nControlId); 1400cdf0e10cSrcweir return; 1401cdf0e10cSrcweir } 1402cdf0e10cSrcweir 1403cdf0e10cSrcweir OString aTxt = OUStringToOString( rLabel.replace('~', '_'), RTL_TEXTENCODING_UTF8 ); 1404cdf0e10cSrcweir if (nControlId == ExtendedFilePickerElementIds::PUSHBUTTON_PLAY) 1405cdf0e10cSrcweir { 1406cdf0e10cSrcweir #ifdef GTK_STOCK_MEDIA_PLAY 1407cdf0e10cSrcweir if (!msPlayLabel.getLength()) 1408cdf0e10cSrcweir msPlayLabel = rLabel; 1409cdf0e10cSrcweir if (msPlayLabel == rLabel) 1410cdf0e10cSrcweir gtk_button_set_label(GTK_BUTTON(pWidget), GTK_STOCK_MEDIA_PLAY); 1411cdf0e10cSrcweir else 1412cdf0e10cSrcweir gtk_button_set_label(GTK_BUTTON(pWidget), GTK_STOCK_MEDIA_STOP); 1413cdf0e10cSrcweir #else 1414cdf0e10cSrcweir gtk_button_set_label(GTK_BUTTON(pWidget), aTxt.getStr()); 1415cdf0e10cSrcweir #endif 1416cdf0e10cSrcweir } 1417cdf0e10cSrcweir else if( tType == GTK_TYPE_TOGGLE_BUTTON || tType == GTK_TYPE_BUTTON || tType == GTK_TYPE_LABEL ) 1418cdf0e10cSrcweir g_object_set( pWidget, "label", aTxt.getStr(), 1419cdf0e10cSrcweir "use_underline", sal_True, (char *)NULL ); 1420cdf0e10cSrcweir else 1421cdf0e10cSrcweir OSL_TRACE("Can't set label on list\n"); 1422cdf0e10cSrcweir } 1423cdf0e10cSrcweir 1424cdf0e10cSrcweir rtl::OUString SAL_CALL SalGtkFilePicker::getLabel( sal_Int16 nControlId ) 1425cdf0e10cSrcweir throw( uno::RuntimeException ) 1426cdf0e10cSrcweir { 1427cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1428cdf0e10cSrcweir 1429cdf0e10cSrcweir GType tType; 1430cdf0e10cSrcweir OString aTxt; 1431cdf0e10cSrcweir GtkWidget *pWidget; 1432cdf0e10cSrcweir 1433cdf0e10cSrcweir GdkThreadLock aLock; 1434cdf0e10cSrcweir 1435cdf0e10cSrcweir if( !( pWidget = getWidget( nControlId, &tType ) ) ) 1436cdf0e10cSrcweir OSL_TRACE("Get label on unknown control %d\n", nControlId); 1437cdf0e10cSrcweir else if( tType == GTK_TYPE_TOGGLE_BUTTON || tType == GTK_TYPE_BUTTON || tType == GTK_TYPE_LABEL ) 1438cdf0e10cSrcweir aTxt = gtk_button_get_label( GTK_BUTTON( pWidget ) ); 1439cdf0e10cSrcweir else 1440cdf0e10cSrcweir OSL_TRACE("Can't get label on list\n"); 1441cdf0e10cSrcweir 1442cdf0e10cSrcweir return OStringToOUString( aTxt, RTL_TEXTENCODING_UTF8 ); 1443cdf0e10cSrcweir } 1444cdf0e10cSrcweir 1445cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1446cdf0e10cSrcweir // XFilePreview functions 1447cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1448cdf0e10cSrcweir 1449cdf0e10cSrcweir uno::Sequence<sal_Int16> SAL_CALL SalGtkFilePicker::getSupportedImageFormats() throw( uno::RuntimeException ) 1450cdf0e10cSrcweir { 1451cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1452cdf0e10cSrcweir 1453cdf0e10cSrcweir // TODO return m_pImpl->getSupportedImageFormats(); 1454cdf0e10cSrcweir return uno::Sequence<sal_Int16>(); 1455cdf0e10cSrcweir } 1456cdf0e10cSrcweir 1457cdf0e10cSrcweir sal_Int32 SAL_CALL SalGtkFilePicker::getTargetColorDepth() throw( uno::RuntimeException ) 1458cdf0e10cSrcweir { 1459cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1460cdf0e10cSrcweir 1461cdf0e10cSrcweir // TODO return m_pImpl->getTargetColorDepth(); 1462cdf0e10cSrcweir return 0; 1463cdf0e10cSrcweir } 1464cdf0e10cSrcweir 1465cdf0e10cSrcweir sal_Int32 SAL_CALL SalGtkFilePicker::getAvailableWidth() throw( uno::RuntimeException ) 1466cdf0e10cSrcweir { 1467cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1468cdf0e10cSrcweir 1469cdf0e10cSrcweir return m_PreviewImageWidth; 1470cdf0e10cSrcweir } 1471cdf0e10cSrcweir 1472cdf0e10cSrcweir sal_Int32 SAL_CALL SalGtkFilePicker::getAvailableHeight() throw( uno::RuntimeException ) 1473cdf0e10cSrcweir { 1474cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1475cdf0e10cSrcweir 1476cdf0e10cSrcweir return m_PreviewImageHeight; 1477cdf0e10cSrcweir } 1478cdf0e10cSrcweir 1479cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::setImage( sal_Int16 /*aImageFormat*/, const uno::Any& /*aImage*/ ) 1480cdf0e10cSrcweir throw( lang::IllegalArgumentException, uno::RuntimeException ) 1481cdf0e10cSrcweir { 1482cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1483cdf0e10cSrcweir 1484cdf0e10cSrcweir // TODO m_pImpl->setImage( aImageFormat, aImage ); 1485cdf0e10cSrcweir } 1486cdf0e10cSrcweir 1487cdf0e10cSrcweir void SalGtkFilePicker::implChangeType( GtkTreeSelection *selection ) 1488cdf0e10cSrcweir { 1489cdf0e10cSrcweir CResourceProvider aResProvider; 1490cdf0e10cSrcweir OUString aLabel = aResProvider.getResString( FILE_PICKER_FILE_TYPE ); 1491cdf0e10cSrcweir 1492cdf0e10cSrcweir GdkThreadLock aLock; 1493cdf0e10cSrcweir 1494cdf0e10cSrcweir GtkTreeIter iter; 1495cdf0e10cSrcweir GtkTreeModel *model; 1496cdf0e10cSrcweir if (gtk_tree_selection_get_selected (selection, &model, &iter)) 1497cdf0e10cSrcweir { 1498cdf0e10cSrcweir gchar *title; 1499cdf0e10cSrcweir gtk_tree_model_get (model, &iter, 2, &title, -1); 1500cdf0e10cSrcweir aLabel += rtl::OUString::createFromAscii( ": " ); 1501cdf0e10cSrcweir aLabel += rtl::OUString( title, strlen(title), RTL_TEXTENCODING_UTF8 ); 1502cdf0e10cSrcweir g_free (title); 1503cdf0e10cSrcweir } 1504cdf0e10cSrcweir gtk_expander_set_label (GTK_EXPANDER (m_pFilterExpander), 1505cdf0e10cSrcweir OUStringToOString( aLabel, RTL_TEXTENCODING_UTF8 ).getStr()); 1506cdf0e10cSrcweir FilePickerEvent evt; 1507cdf0e10cSrcweir evt.ElementId = LISTBOX_FILTER; 1508cdf0e10cSrcweir controlStateChanged( evt ); 1509cdf0e10cSrcweir } 1510cdf0e10cSrcweir 1511cdf0e10cSrcweir void SalGtkFilePicker::type_changed_cb( GtkTreeSelection *selection, SalGtkFilePicker *pobjFP ) 1512cdf0e10cSrcweir { 1513cdf0e10cSrcweir pobjFP->implChangeType(selection); 1514cdf0e10cSrcweir } 1515cdf0e10cSrcweir 1516cdf0e10cSrcweir void SalGtkFilePicker::unselect_type() 1517cdf0e10cSrcweir { 1518cdf0e10cSrcweir GdkThreadLock aLock; 1519cdf0e10cSrcweir 1520cdf0e10cSrcweir gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(m_pFilterView))); 1521cdf0e10cSrcweir } 1522cdf0e10cSrcweir 1523cdf0e10cSrcweir void SalGtkFilePicker::expander_changed_cb( GtkExpander *expander, SalGtkFilePicker *pobjFP ) 1524cdf0e10cSrcweir { 1525cdf0e10cSrcweir if (gtk_expander_get_expanded(expander)) 1526cdf0e10cSrcweir pobjFP->unselect_type(); 1527cdf0e10cSrcweir } 1528cdf0e10cSrcweir 1529cdf0e10cSrcweir void SalGtkFilePicker::filter_changed_cb( GtkFileChooser *, GParamSpec *, 1530cdf0e10cSrcweir SalGtkFilePicker *pobjFP ) 1531cdf0e10cSrcweir { 1532cdf0e10cSrcweir FilePickerEvent evt; 1533cdf0e10cSrcweir evt.ElementId = LISTBOX_FILTER; 1534cdf0e10cSrcweir OSL_TRACE( "filter_changed, isn't it great %x\n", pobjFP ); 1535cdf0e10cSrcweir pobjFP->controlStateChanged( evt ); 1536cdf0e10cSrcweir } 1537cdf0e10cSrcweir 1538cdf0e10cSrcweir void SalGtkFilePicker::folder_changed_cb( GtkFileChooser *, SalGtkFilePicker *pobjFP ) 1539cdf0e10cSrcweir { 1540cdf0e10cSrcweir FilePickerEvent evt; 1541cdf0e10cSrcweir OSL_TRACE( "folder_changed, isn't it great %x\n", pobjFP ); 1542cdf0e10cSrcweir pobjFP->directoryChanged( evt ); 1543cdf0e10cSrcweir } 1544cdf0e10cSrcweir 1545cdf0e10cSrcweir void SalGtkFilePicker::selection_changed_cb( GtkFileChooser *, SalGtkFilePicker *pobjFP ) 1546cdf0e10cSrcweir { 1547cdf0e10cSrcweir FilePickerEvent evt; 1548cdf0e10cSrcweir OSL_TRACE( "selection_changed, isn't it great %x\n", pobjFP ); 1549cdf0e10cSrcweir pobjFP->fileSelectionChanged( evt ); 1550cdf0e10cSrcweir } 1551cdf0e10cSrcweir 1552cdf0e10cSrcweir void SalGtkFilePicker::update_preview_cb( GtkFileChooser *file_chooser, SalGtkFilePicker* pobjFP ) 1553cdf0e10cSrcweir { 1554cdf0e10cSrcweir GtkWidget *preview; 1555cdf0e10cSrcweir char *filename; 1556cdf0e10cSrcweir GdkPixbuf *pixbuf; 1557cdf0e10cSrcweir gboolean have_preview = sal_False; 1558cdf0e10cSrcweir 1559cdf0e10cSrcweir preview = pobjFP->m_pPreview; 1560cdf0e10cSrcweir filename = gtk_file_chooser_get_preview_filename( file_chooser ); 1561cdf0e10cSrcweir 1562cdf0e10cSrcweir if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( pobjFP->m_pToggles[PREVIEW] ) ) && g_file_test( filename, G_FILE_TEST_IS_REGULAR ) ) 1563cdf0e10cSrcweir { 1564cdf0e10cSrcweir pixbuf = gdk_pixbuf_new_from_file_at_size( 1565cdf0e10cSrcweir filename, 1566cdf0e10cSrcweir pobjFP->m_PreviewImageWidth, 1567cdf0e10cSrcweir pobjFP->m_PreviewImageHeight, NULL ); 1568cdf0e10cSrcweir 1569cdf0e10cSrcweir have_preview = ( pixbuf != NULL ); 1570cdf0e10cSrcweir 1571cdf0e10cSrcweir gtk_image_set_from_pixbuf( GTK_IMAGE( preview ), pixbuf ); 1572cdf0e10cSrcweir if( pixbuf ) 1573cdf0e10cSrcweir gdk_pixbuf_unref( pixbuf ); 1574cdf0e10cSrcweir 1575cdf0e10cSrcweir } 1576cdf0e10cSrcweir 1577cdf0e10cSrcweir gtk_file_chooser_set_preview_widget_active( file_chooser, have_preview ); 1578cdf0e10cSrcweir 1579cdf0e10cSrcweir if( filename ) 1580cdf0e10cSrcweir g_free( filename ); 1581cdf0e10cSrcweir } 1582cdf0e10cSrcweir 1583cdf0e10cSrcweir sal_Bool SAL_CALL SalGtkFilePicker::setShowState( sal_Bool bShowState ) throw( uno::RuntimeException ) 1584cdf0e10cSrcweir { 1585cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1586cdf0e10cSrcweir 1587cdf0e10cSrcweir // TODO return m_pImpl->setShowState( bShowState ); 1588cdf0e10cSrcweir if( bShowState != mbPreviewState ) 1589cdf0e10cSrcweir { 1590cdf0e10cSrcweir GdkThreadLock aLock; 1591cdf0e10cSrcweir 1592cdf0e10cSrcweir if( bShowState ) 1593cdf0e10cSrcweir { 1594cdf0e10cSrcweir // Show 1595cdf0e10cSrcweir if( !mHID_Preview ) 1596cdf0e10cSrcweir { 1597cdf0e10cSrcweir mHID_Preview = g_signal_connect( 1598cdf0e10cSrcweir GTK_FILE_CHOOSER( m_pDialog ), "update-preview", 1599cdf0e10cSrcweir G_CALLBACK( update_preview_cb ), ( gpointer )this ); 1600cdf0e10cSrcweir } 1601cdf0e10cSrcweir gtk_widget_show( m_pPreview ); 1602cdf0e10cSrcweir } 1603cdf0e10cSrcweir else 1604cdf0e10cSrcweir { 1605cdf0e10cSrcweir // Hide 1606cdf0e10cSrcweir gtk_widget_hide( m_pPreview ); 1607cdf0e10cSrcweir } 1608cdf0e10cSrcweir 1609cdf0e10cSrcweir // also emit the signal 1610cdf0e10cSrcweir g_signal_emit_by_name( GTK_OBJECT( m_pDialog ), "update-preview" ); 1611cdf0e10cSrcweir 1612cdf0e10cSrcweir mbPreviewState = bShowState; 1613cdf0e10cSrcweir } 1614cdf0e10cSrcweir return true; 1615cdf0e10cSrcweir } 1616cdf0e10cSrcweir 1617cdf0e10cSrcweir sal_Bool SAL_CALL SalGtkFilePicker::getShowState() throw( uno::RuntimeException ) 1618cdf0e10cSrcweir { 1619cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1620cdf0e10cSrcweir 1621cdf0e10cSrcweir return mbPreviewState; 1622cdf0e10cSrcweir } 1623cdf0e10cSrcweir 1624cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1625cdf0e10cSrcweir // XInitialization 1626cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1627cdf0e10cSrcweir 1628cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::initialize( const uno::Sequence<uno::Any>& aArguments ) 1629cdf0e10cSrcweir throw( uno::Exception, uno::RuntimeException ) 1630cdf0e10cSrcweir { 1631cdf0e10cSrcweir // parameter checking 1632cdf0e10cSrcweir uno::Any aAny; 1633cdf0e10cSrcweir if( 0 == aArguments.getLength() ) 1634cdf0e10cSrcweir throw lang::IllegalArgumentException( 1635cdf0e10cSrcweir rtl::OUString::createFromAscii( "no arguments" ), 1636cdf0e10cSrcweir static_cast<XFilePicker2*>( this ), 1 ); 1637cdf0e10cSrcweir 1638cdf0e10cSrcweir aAny = aArguments[0]; 1639cdf0e10cSrcweir 1640cdf0e10cSrcweir if( ( aAny.getValueType() != ::getCppuType( ( sal_Int16* )0 ) ) && 1641cdf0e10cSrcweir (aAny.getValueType() != ::getCppuType( ( sal_Int8* )0 ) ) ) 1642cdf0e10cSrcweir throw lang::IllegalArgumentException( 1643cdf0e10cSrcweir rtl::OUString::createFromAscii( "invalid argument type" ), 1644cdf0e10cSrcweir static_cast<XFilePicker2*>( this ), 1 ); 1645cdf0e10cSrcweir 1646cdf0e10cSrcweir sal_Int16 templateId = -1; 1647cdf0e10cSrcweir aAny >>= templateId; 1648cdf0e10cSrcweir 1649cdf0e10cSrcweir GtkFileChooserAction eAction = GTK_FILE_CHOOSER_ACTION_OPEN; 1650cdf0e10cSrcweir const gchar *first_button_text = GTK_STOCK_OPEN; 1651cdf0e10cSrcweir 1652cdf0e10cSrcweir 1653cdf0e10cSrcweir // TODO: extract full semantic from 1654cdf0e10cSrcweir // svtools/source/filepicker/filepicker.cxx (getWinBits) 1655cdf0e10cSrcweir switch( templateId ) 1656cdf0e10cSrcweir { 1657cdf0e10cSrcweir case FILEOPEN_SIMPLE: 1658cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_OPEN; 1659cdf0e10cSrcweir first_button_text = GTK_STOCK_OPEN; 1660cdf0e10cSrcweir OSL_TRACE( "3all true\n" ); 1661cdf0e10cSrcweir break; 1662cdf0e10cSrcweir case FILESAVE_SIMPLE: 1663cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_SAVE; 1664cdf0e10cSrcweir first_button_text = GTK_STOCK_SAVE; 1665cdf0e10cSrcweir OSL_TRACE( "2all true\n" ); 1666cdf0e10cSrcweir break; 1667cdf0e10cSrcweir case FILESAVE_AUTOEXTENSION_PASSWORD: 1668cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_SAVE; 1669cdf0e10cSrcweir first_button_text = GTK_STOCK_SAVE; 1670cdf0e10cSrcweir mbToggleVisibility[PASSWORD] = true; 1671cdf0e10cSrcweir OSL_TRACE( "1all true\n" ); 1672cdf0e10cSrcweir // TODO 1673cdf0e10cSrcweir break; 1674cdf0e10cSrcweir case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS: 1675cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_SAVE; 1676cdf0e10cSrcweir first_button_text = GTK_STOCK_SAVE; 1677cdf0e10cSrcweir mbToggleVisibility[PASSWORD] = true; 1678cdf0e10cSrcweir mbToggleVisibility[FILTEROPTIONS] = true; 1679cdf0e10cSrcweir OSL_TRACE( "4all true\n" ); 1680cdf0e10cSrcweir // TODO 1681cdf0e10cSrcweir break; 1682cdf0e10cSrcweir case FILESAVE_AUTOEXTENSION_SELECTION: 1683cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_SAVE; // SELECT_FOLDER ? 1684cdf0e10cSrcweir first_button_text = GTK_STOCK_SAVE; 1685cdf0e10cSrcweir mbToggleVisibility[SELECTION] = true; 1686cdf0e10cSrcweir OSL_TRACE( "5all true\n" ); 1687cdf0e10cSrcweir // TODO 1688cdf0e10cSrcweir break; 1689cdf0e10cSrcweir case FILESAVE_AUTOEXTENSION_TEMPLATE: 1690cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_SAVE; 1691cdf0e10cSrcweir first_button_text = GTK_STOCK_SAVE; 1692cdf0e10cSrcweir mbListVisibility[TEMPLATE] = true; 1693cdf0e10cSrcweir OSL_TRACE( "6all true\n" ); 1694cdf0e10cSrcweir // TODO 1695cdf0e10cSrcweir break; 1696cdf0e10cSrcweir case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE: 1697cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_OPEN; 1698cdf0e10cSrcweir first_button_text = GTK_STOCK_OPEN; 1699cdf0e10cSrcweir mbToggleVisibility[LINK] = true; 1700cdf0e10cSrcweir mbToggleVisibility[PREVIEW] = true; 1701cdf0e10cSrcweir mbListVisibility[IMAGE_TEMPLATE] = true; 1702cdf0e10cSrcweir // TODO 1703cdf0e10cSrcweir break; 1704cdf0e10cSrcweir case FILEOPEN_PLAY: 1705cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_OPEN; 1706cdf0e10cSrcweir first_button_text = GTK_STOCK_OPEN; 1707cdf0e10cSrcweir mbButtonVisibility[PLAY] = true; 1708cdf0e10cSrcweir // TODO 1709cdf0e10cSrcweir break; 1710cdf0e10cSrcweir case FILEOPEN_READONLY_VERSION: 1711cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_OPEN; 1712cdf0e10cSrcweir first_button_text = GTK_STOCK_OPEN; 1713cdf0e10cSrcweir mbToggleVisibility[READONLY] = true; 1714cdf0e10cSrcweir mbListVisibility[VERSION] = true; 1715cdf0e10cSrcweir break; 1716cdf0e10cSrcweir case FILEOPEN_LINK_PREVIEW: 1717cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_OPEN; 1718cdf0e10cSrcweir first_button_text = GTK_STOCK_OPEN; 1719cdf0e10cSrcweir mbToggleVisibility[LINK] = true; 1720cdf0e10cSrcweir mbToggleVisibility[PREVIEW] = true; 1721cdf0e10cSrcweir // TODO 1722cdf0e10cSrcweir break; 1723cdf0e10cSrcweir case FILESAVE_AUTOEXTENSION: 1724cdf0e10cSrcweir eAction = GTK_FILE_CHOOSER_ACTION_SAVE; 1725cdf0e10cSrcweir first_button_text = GTK_STOCK_SAVE; 1726cdf0e10cSrcweir OSL_TRACE( "7all true\n" ); 1727cdf0e10cSrcweir // TODO 1728cdf0e10cSrcweir break; 1729cdf0e10cSrcweir default: 1730cdf0e10cSrcweir throw lang::IllegalArgumentException( 1731cdf0e10cSrcweir rtl::OUString::createFromAscii( "Unknown template" ), 1732cdf0e10cSrcweir static_cast< XFilePicker2* >( this ), 1733cdf0e10cSrcweir 1 ); 1734cdf0e10cSrcweir } 1735cdf0e10cSrcweir 1736cdf0e10cSrcweir GdkThreadLock aLock; 1737cdf0e10cSrcweir 1738cdf0e10cSrcweir if( GTK_FILE_CHOOSER_ACTION_SAVE == eAction ) 1739cdf0e10cSrcweir { 1740cdf0e10cSrcweir CResourceProvider aResProvider; 1741cdf0e10cSrcweir OUString aFilePickerTitle(aResProvider.getResString( FILE_PICKER_TITLE_SAVE )); 1742cdf0e10cSrcweir gtk_window_set_title ( GTK_WINDOW( m_pDialog ), 1743cdf0e10cSrcweir OUStringToOString( aFilePickerTitle, RTL_TEXTENCODING_UTF8 ).getStr() ); 1744cdf0e10cSrcweir } 1745cdf0e10cSrcweir 1746cdf0e10cSrcweir gtk_file_chooser_set_action( GTK_FILE_CHOOSER( m_pDialog ), eAction); 1747cdf0e10cSrcweir dialog_remove_buttons( GTK_DIALOG( m_pDialog ) ); 1748cdf0e10cSrcweir gtk_dialog_add_button( GTK_DIALOG( m_pDialog ), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL ); 1749cdf0e10cSrcweir for( int nTVIndex = 0; nTVIndex < BUTTON_LAST; nTVIndex++ ) 1750cdf0e10cSrcweir { 1751cdf0e10cSrcweir if( mbButtonVisibility[nTVIndex] ) 1752cdf0e10cSrcweir { 1753cdf0e10cSrcweir #ifdef GTK_STOCK_MEDIA_PLAY 1754cdf0e10cSrcweir m_pButtons[ nTVIndex ] = gtk_dialog_add_button( GTK_DIALOG( m_pDialog ), GTK_STOCK_MEDIA_PLAY, 1 ); 1755cdf0e10cSrcweir #else 1756cdf0e10cSrcweir CResourceProvider aResProvider; 1757cdf0e10cSrcweir OString aPlay = OUStringToOString( aResProvider.getResString( PUSHBUTTON_PLAY ), RTL_TEXTENCODING_UTF8 ); 1758cdf0e10cSrcweir m_pButtons[ nTVIndex ] = gtk_dialog_add_button( GTK_DIALOG( m_pDialog ), aPlay.getStr(), 1 ); 1759cdf0e10cSrcweir #endif 1760cdf0e10cSrcweir } 1761cdf0e10cSrcweir } 1762cdf0e10cSrcweir gtk_dialog_add_button( GTK_DIALOG( m_pDialog ), first_button_text, GTK_RESPONSE_ACCEPT ); 1763cdf0e10cSrcweir 1764cdf0e10cSrcweir gtk_dialog_set_default_response( GTK_DIALOG (m_pDialog), GTK_RESPONSE_ACCEPT ); 1765cdf0e10cSrcweir 1766cdf0e10cSrcweir // Setup special flags 1767cdf0e10cSrcweir for( int nTVIndex = 0; nTVIndex < TOGGLE_LAST; nTVIndex++ ) 1768cdf0e10cSrcweir { 1769cdf0e10cSrcweir if( mbToggleVisibility[nTVIndex] ) 1770cdf0e10cSrcweir gtk_widget_show( m_pToggles[ nTVIndex ] ); 1771cdf0e10cSrcweir } 1772cdf0e10cSrcweir 1773cdf0e10cSrcweir for( int nTVIndex = 0; nTVIndex < LIST_LAST; nTVIndex++ ) 1774cdf0e10cSrcweir { 1775cdf0e10cSrcweir if( mbListVisibility[nTVIndex] ) 1776cdf0e10cSrcweir { 1777cdf0e10cSrcweir gtk_widget_set_sensitive( m_pLists[ nTVIndex ], false ); 1778cdf0e10cSrcweir gtk_widget_show( m_pLists[ nTVIndex ] ); 1779cdf0e10cSrcweir gtk_widget_show( m_pListLabels[ nTVIndex ] ); 1780cdf0e10cSrcweir gtk_widget_show( m_pAligns[ nTVIndex ] ); 1781cdf0e10cSrcweir gtk_widget_show( m_pHBoxs[ nTVIndex ] ); 1782cdf0e10cSrcweir } 1783cdf0e10cSrcweir } 1784cdf0e10cSrcweir } 1785cdf0e10cSrcweir 1786cdf0e10cSrcweir void SalGtkFilePicker::preview_toggled_cb( GtkObject *cb, SalGtkFilePicker* pobjFP ) 1787cdf0e10cSrcweir { 1788cdf0e10cSrcweir if( pobjFP->mbToggleVisibility[PREVIEW] ) 1789cdf0e10cSrcweir pobjFP->setShowState( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( cb ) ) ); 1790cdf0e10cSrcweir } 1791cdf0e10cSrcweir 1792cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1793cdf0e10cSrcweir // XCancellable 1794cdf0e10cSrcweir //------------------------------------------------------------------------------------ 1795cdf0e10cSrcweir 1796cdf0e10cSrcweir void SAL_CALL SalGtkFilePicker::cancel() throw( uno::RuntimeException ) 1797cdf0e10cSrcweir { 1798cdf0e10cSrcweir OSL_ASSERT( m_pDialog != NULL ); 1799cdf0e10cSrcweir 1800cdf0e10cSrcweir // TODO m_pImpl->cancel(); 1801cdf0e10cSrcweir } 1802cdf0e10cSrcweir 1803cdf0e10cSrcweir // ------------------------------------------------- 1804cdf0e10cSrcweir // XServiceInfo 1805cdf0e10cSrcweir // ------------------------------------------------- 1806cdf0e10cSrcweir 1807cdf0e10cSrcweir rtl::OUString SAL_CALL SalGtkFilePicker::getImplementationName() 1808cdf0e10cSrcweir throw( uno::RuntimeException ) 1809cdf0e10cSrcweir { 1810cdf0e10cSrcweir return rtl::OUString::createFromAscii( FILE_PICKER_IMPL_NAME ); 1811cdf0e10cSrcweir } 1812cdf0e10cSrcweir 1813cdf0e10cSrcweir // ------------------------------------------------- 1814cdf0e10cSrcweir // XServiceInfo 1815cdf0e10cSrcweir // ------------------------------------------------- 1816cdf0e10cSrcweir 1817cdf0e10cSrcweir sal_Bool SAL_CALL SalGtkFilePicker::supportsService( const rtl::OUString& ServiceName ) 1818cdf0e10cSrcweir throw( uno::RuntimeException ) 1819cdf0e10cSrcweir { 1820cdf0e10cSrcweir uno::Sequence <rtl::OUString> SupportedServicesNames = FilePicker_getSupportedServiceNames(); 1821cdf0e10cSrcweir 1822cdf0e10cSrcweir for( sal_Int32 n = SupportedServicesNames.getLength(); n--; ) 1823cdf0e10cSrcweir if( SupportedServicesNames[n].compareTo( ServiceName ) == 0) 1824cdf0e10cSrcweir return sal_True; 1825cdf0e10cSrcweir 1826cdf0e10cSrcweir return sal_False; 1827cdf0e10cSrcweir } 1828cdf0e10cSrcweir 1829cdf0e10cSrcweir // ------------------------------------------------- 1830cdf0e10cSrcweir // XServiceInfo 1831cdf0e10cSrcweir // ------------------------------------------------- 1832cdf0e10cSrcweir 1833cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL SalGtkFilePicker::getSupportedServiceNames() 1834cdf0e10cSrcweir throw( uno::RuntimeException ) 1835cdf0e10cSrcweir { 1836cdf0e10cSrcweir return FilePicker_getSupportedServiceNames(); 1837cdf0e10cSrcweir } 1838cdf0e10cSrcweir 1839cdf0e10cSrcweir 1840cdf0e10cSrcweir //-------------------------------------------------- 1841cdf0e10cSrcweir // Misc 1842cdf0e10cSrcweir //------------------------------------------------- 1843cdf0e10cSrcweir void SalGtkFilePicker::SetCurFilter( const OUString& rFilter ) 1844cdf0e10cSrcweir { 1845cdf0e10cSrcweir GdkThreadLock aLock; 1846cdf0e10cSrcweir 1847cdf0e10cSrcweir // Get all the filters already added 1848cdf0e10cSrcweir GSList *filters = gtk_file_chooser_list_filters ( GTK_FILE_CHOOSER( m_pDialog ) ); 1849cdf0e10cSrcweir bool bFound = false; 1850cdf0e10cSrcweir 1851cdf0e10cSrcweir for( GSList *iter = filters; !bFound && iter; iter = iter->next ) 1852cdf0e10cSrcweir { 1853cdf0e10cSrcweir GtkFileFilter* pFilter = reinterpret_cast<GtkFileFilter *>( iter->data ); 1854cdf0e10cSrcweir G_CONST_RETURN gchar * filtername = gtk_file_filter_get_name( pFilter ); 1855cdf0e10cSrcweir OUString sFilterName( filtername, strlen( filtername ), RTL_TEXTENCODING_UTF8 ); 1856cdf0e10cSrcweir 1857cdf0e10cSrcweir OUString aShrunkName = shrinkFilterName( rFilter ); 1858cdf0e10cSrcweir if( aShrunkName.equals( sFilterName) ) 1859cdf0e10cSrcweir { 1860cdf0e10cSrcweir OSL_TRACE( "actually setting %s\n", filtername ); 1861cdf0e10cSrcweir gtk_file_chooser_set_filter( GTK_FILE_CHOOSER( m_pDialog ), pFilter ); 1862cdf0e10cSrcweir bFound = true; 1863cdf0e10cSrcweir } 1864cdf0e10cSrcweir } 1865cdf0e10cSrcweir 1866cdf0e10cSrcweir g_slist_free( filters ); 1867cdf0e10cSrcweir } 1868cdf0e10cSrcweir 1869cdf0e10cSrcweir extern "C" 1870cdf0e10cSrcweir { 1871cdf0e10cSrcweir static gboolean 1872cdf0e10cSrcweir case_insensitive_filter (const GtkFileFilterInfo *filter_info, gpointer data) 1873cdf0e10cSrcweir { 1874cdf0e10cSrcweir gboolean bRetval = sal_False; 1875cdf0e10cSrcweir const char *pFilter = (const char *) data; 1876cdf0e10cSrcweir 1877cdf0e10cSrcweir g_return_val_if_fail( data != NULL, sal_False ); 1878cdf0e10cSrcweir g_return_val_if_fail( filter_info != NULL, sal_False ); 1879cdf0e10cSrcweir 1880cdf0e10cSrcweir if( !filter_info->uri ) 1881cdf0e10cSrcweir return sal_False; 1882cdf0e10cSrcweir 1883cdf0e10cSrcweir const char *pExtn = strrchr( filter_info->uri, '.' ); 1884cdf0e10cSrcweir if( !pExtn ) 1885cdf0e10cSrcweir return sal_False; 1886cdf0e10cSrcweir pExtn++; 1887cdf0e10cSrcweir 1888cdf0e10cSrcweir if( !g_ascii_strcasecmp( pFilter, pExtn ) ) 1889cdf0e10cSrcweir bRetval = sal_True; 1890cdf0e10cSrcweir 1891cdf0e10cSrcweir #ifdef DEBUG 1892cdf0e10cSrcweir fprintf( stderr, "'%s' match extn '%s' vs '%s' yeilds %d\n", 1893cdf0e10cSrcweir filter_info->uri, pExtn, pFilter, bRetval ); 1894cdf0e10cSrcweir #endif 1895cdf0e10cSrcweir 1896cdf0e10cSrcweir return bRetval; 1897cdf0e10cSrcweir } 1898cdf0e10cSrcweir } 1899cdf0e10cSrcweir 1900e5d951fcSPedro Giffuni GtkFileFilter* SalGtkFilePicker::implAddFilter( const OUString& rFilter, const OUString& rType ) 1901cdf0e10cSrcweir { 1902cdf0e10cSrcweir GdkThreadLock aLock; 1903cdf0e10cSrcweir 1904cdf0e10cSrcweir GtkFileFilter *filter = gtk_file_filter_new(); 1905cdf0e10cSrcweir 1906cdf0e10cSrcweir OUString aShrunkName = shrinkFilterName( rFilter ); 1907cdf0e10cSrcweir OString aFilterName = rtl::OUStringToOString( aShrunkName, RTL_TEXTENCODING_UTF8 ); 1908cdf0e10cSrcweir gtk_file_filter_set_name( filter, aFilterName ); 1909cdf0e10cSrcweir 1910cdf0e10cSrcweir static const OUString aStarDot = OUString::createFromAscii( "*." ); 1911cdf0e10cSrcweir OUString aTokens; 1912cdf0e10cSrcweir 1913cdf0e10cSrcweir bool bAllGlob = !rType.compareToAscii( "*.*" ) || !rType.compareToAscii( "*" ); 1914cdf0e10cSrcweir if (bAllGlob) 1915cdf0e10cSrcweir gtk_file_filter_add_pattern( filter, "*" ); 1916cdf0e10cSrcweir else 1917cdf0e10cSrcweir { 1918cdf0e10cSrcweir sal_Int32 nIndex = 0; 1919cdf0e10cSrcweir rtl::OUString aToken; 1920cdf0e10cSrcweir do 1921cdf0e10cSrcweir { 1922cdf0e10cSrcweir aToken = rType.getToken( 0, ';', nIndex ); 1923cdf0e10cSrcweir // Assume all have the "*.<extn>" syntax 1924cdf0e10cSrcweir aToken = aToken.copy( aToken.lastIndexOf( aStarDot ) + 2 ); 1925cdf0e10cSrcweir if (aToken.getLength()) 1926cdf0e10cSrcweir { 1927cdf0e10cSrcweir if (aTokens.getLength()) 1928cdf0e10cSrcweir aTokens += OUString::createFromAscii(","); 1929cdf0e10cSrcweir aTokens = aTokens += aToken; 1930cdf0e10cSrcweir gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_URI, 1931cdf0e10cSrcweir case_insensitive_filter, 1932cdf0e10cSrcweir g_strdup( rtl::OUStringToOString( aToken, RTL_TEXTENCODING_UTF8 ) ), 1933cdf0e10cSrcweir (GDestroyNotify) g_free ); 1934cdf0e10cSrcweir 1935cdf0e10cSrcweir OSL_TRACE( "fustering with %s\n", rtl::OUStringToOString( aToken, RTL_TEXTENCODING_UTF8 ).getStr()); 1936cdf0e10cSrcweir } 1937cdf0e10cSrcweir #ifdef DEBUG 1938cdf0e10cSrcweir else 1939cdf0e10cSrcweir { 1940cdf0e10cSrcweir g_warning( "Duff filter token '%s'\n", 1941cdf0e10cSrcweir (const sal_Char *) rtl::OUStringToOString( 1942cdf0e10cSrcweir rType.getToken( 0, ';', nIndex ), RTL_TEXTENCODING_UTF8 ) ); 1943cdf0e10cSrcweir } 1944cdf0e10cSrcweir #endif 1945cdf0e10cSrcweir } 1946cdf0e10cSrcweir while( nIndex >= 0 ); 1947cdf0e10cSrcweir } 1948cdf0e10cSrcweir 1949cdf0e10cSrcweir gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( m_pDialog ), filter ); 1950cdf0e10cSrcweir 1951cdf0e10cSrcweir if (!bAllGlob) 1952cdf0e10cSrcweir { 1953cdf0e10cSrcweir GtkTreeIter iter; 1954cdf0e10cSrcweir gtk_list_store_append (m_pFilterStore, &iter); 1955cdf0e10cSrcweir gtk_list_store_set (m_pFilterStore, &iter, 1956cdf0e10cSrcweir 0, OUStringToOString(shrinkFilterName( rFilter, true ), RTL_TEXTENCODING_UTF8).getStr(), 1957cdf0e10cSrcweir 1, OUStringToOString(aTokens, RTL_TEXTENCODING_UTF8).getStr(), 1958cdf0e10cSrcweir 2, aFilterName.getStr(), 1959cdf0e10cSrcweir 3, OUStringToOString(rType, RTL_TEXTENCODING_UTF8).getStr(), 1960cdf0e10cSrcweir -1); 1961cdf0e10cSrcweir } 1962e5d951fcSPedro Giffuni return filter; 1963cdf0e10cSrcweir } 1964cdf0e10cSrcweir 1965e5d951fcSPedro Giffuni void SalGtkFilePicker::implAddFilterGroup( const OUString& /*_rFilter*/, const Sequence< StringPair >& _rFilters ) 1966cdf0e10cSrcweir { 1967cdf0e10cSrcweir // Gtk+ has no filter group concept I think so ... 1968cdf0e10cSrcweir // implAddFilter( _rFilter, String() ); 1969cdf0e10cSrcweir const StringPair* pSubFilters = _rFilters.getConstArray(); 1970cdf0e10cSrcweir const StringPair* pSubFiltersEnd = pSubFilters + _rFilters.getLength(); 1971cdf0e10cSrcweir for( ; pSubFilters != pSubFiltersEnd; ++pSubFilters ) 1972e5d951fcSPedro Giffuni implAddFilter( pSubFilters->First, pSubFilters->Second ); 1973cdf0e10cSrcweir } 1974cdf0e10cSrcweir 1975cdf0e10cSrcweir void SalGtkFilePicker::SetFilters() 1976cdf0e10cSrcweir { 1977cdf0e10cSrcweir GdkThreadLock aLock; 1978cdf0e10cSrcweir 1979e5d951fcSPedro Giffuni if (!m_aInitialFilter.getLength()) 1980e5d951fcSPedro Giffuni m_aInitialFilter = m_aCurrentFilter; 1981e5d951fcSPedro Giffuni 1982e5d951fcSPedro Giffuni rtl::OUString sPseudoFilter; 1983e5d951fcSPedro Giffuni if( GTK_FILE_CHOOSER_ACTION_SAVE == gtk_file_chooser_get_action( GTK_FILE_CHOOSER( m_pDialog ) ) ) 1984e5d951fcSPedro Giffuni { 1985e5d951fcSPedro Giffuni std::set<OUString> aAllFormats; 1986e5d951fcSPedro Giffuni if( m_pFilterList && !m_pFilterList->empty() ) 1987e5d951fcSPedro Giffuni { 1988e5d951fcSPedro Giffuni for ( FilterList::iterator aListIter = m_pFilterList->begin(); 1989e5d951fcSPedro Giffuni aListIter != m_pFilterList->end(); 1990e5d951fcSPedro Giffuni ++aListIter 1991e5d951fcSPedro Giffuni ) 1992e5d951fcSPedro Giffuni { 1993e5d951fcSPedro Giffuni if( aListIter->hasSubFilters() ) 1994e5d951fcSPedro Giffuni { // it's a filter group 1995e5d951fcSPedro Giffuni UnoFilterList aSubFilters; 1996e5d951fcSPedro Giffuni aListIter->getSubFilters( aSubFilters ); 1997e5d951fcSPedro Giffuni const StringPair* pSubFilters = aSubFilters.getConstArray(); 1998e5d951fcSPedro Giffuni const StringPair* pSubFiltersEnd = pSubFilters + aSubFilters.getLength(); 1999e5d951fcSPedro Giffuni for( ; pSubFilters != pSubFiltersEnd; ++pSubFilters ) 2000e5d951fcSPedro Giffuni aAllFormats.insert(pSubFilters->Second); 2001e5d951fcSPedro Giffuni } 2002e5d951fcSPedro Giffuni else 2003e5d951fcSPedro Giffuni aAllFormats.insert(aListIter->getFilter()); 2004e5d951fcSPedro Giffuni } 2005e5d951fcSPedro Giffuni } 2006e5d951fcSPedro Giffuni if (aAllFormats.size() > 1) 2007e5d951fcSPedro Giffuni { 2008e5d951fcSPedro Giffuni rtl::OUString sAllFilter; 2009e5d951fcSPedro Giffuni std::set<OUString>::const_iterator aEnd = aAllFormats.end(); 2010e5d951fcSPedro Giffuni for (std::set<OUString>::const_iterator aIter = aAllFormats.begin(); aIter != aEnd; ++aIter) 2011e5d951fcSPedro Giffuni { 2012e5d951fcSPedro Giffuni if (sAllFilter.getLength()) 2013e5d951fcSPedro Giffuni sAllFilter += OUString(sal_Unicode(';')); 2014e5d951fcSPedro Giffuni sAllFilter += *aIter; 2015e5d951fcSPedro Giffuni } 2016e5d951fcSPedro Giffuni CResourceProvider aResProvider; 2017e5d951fcSPedro Giffuni sPseudoFilter = aResProvider.getResString(FILE_PICKER_ALLFORMATS); 2018e5d951fcSPedro Giffuni m_pPseudoFilter = implAddFilter( sPseudoFilter, sAllFilter ); 2019e5d951fcSPedro Giffuni } 2020e5d951fcSPedro Giffuni } 2021e5d951fcSPedro Giffuni 2022cdf0e10cSrcweir if( m_pFilterList && !m_pFilterList->empty() ) 2023cdf0e10cSrcweir { 2024cdf0e10cSrcweir for ( FilterList::iterator aListIter = m_pFilterList->begin(); 2025cdf0e10cSrcweir aListIter != m_pFilterList->end(); 2026cdf0e10cSrcweir ++aListIter 2027cdf0e10cSrcweir ) 2028cdf0e10cSrcweir { 2029cdf0e10cSrcweir if( aListIter->hasSubFilters() ) 2030cdf0e10cSrcweir { // it's a filter group 2031cdf0e10cSrcweir 2032cdf0e10cSrcweir UnoFilterList aSubFilters; 2033cdf0e10cSrcweir aListIter->getSubFilters( aSubFilters ); 2034cdf0e10cSrcweir 2035e5d951fcSPedro Giffuni implAddFilterGroup( aListIter->getTitle(), aSubFilters ); 2036cdf0e10cSrcweir } 2037cdf0e10cSrcweir else 2038cdf0e10cSrcweir { 2039cdf0e10cSrcweir // it's a single filter 2040cdf0e10cSrcweir 2041e5d951fcSPedro Giffuni implAddFilter( aListIter->getTitle(), aListIter->getFilter() ); 2042cdf0e10cSrcweir } 2043cdf0e10cSrcweir } 2044cdf0e10cSrcweir } 2045cdf0e10cSrcweir 2046e5d951fcSPedro Giffuni if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_pFilterStore), NULL)) //If m_pFilterStore is not empty 2047cdf0e10cSrcweir gtk_widget_show( m_pFilterExpander ); 2048cdf0e10cSrcweir else 2049cdf0e10cSrcweir gtk_widget_hide( m_pFilterExpander ); 2050cdf0e10cSrcweir 2051cdf0e10cSrcweir // set the default filter 2052e5d951fcSPedro Giffuni if (sPseudoFilter.getLength()) 2053e5d951fcSPedro Giffuni SetCurFilter( sPseudoFilter ); 2054e5d951fcSPedro Giffuni else if(m_aCurrentFilter.getLength()) 2055cdf0e10cSrcweir SetCurFilter( m_aCurrentFilter ); 2056cdf0e10cSrcweir 2057cdf0e10cSrcweir OSL_TRACE( "end setting filters\n"); 2058cdf0e10cSrcweir } 2059cdf0e10cSrcweir 2060cdf0e10cSrcweir SalGtkFilePicker::~SalGtkFilePicker() 2061cdf0e10cSrcweir { 2062cdf0e10cSrcweir int i; 2063cdf0e10cSrcweir 2064cdf0e10cSrcweir for( i = 0; i < TOGGLE_LAST; i++ ) 2065cdf0e10cSrcweir gtk_widget_destroy( m_pToggles[i] ); 2066cdf0e10cSrcweir 2067cdf0e10cSrcweir for( i = 0; i < LIST_LAST; i++ ) 2068cdf0e10cSrcweir { 2069cdf0e10cSrcweir gtk_widget_destroy( m_pListLabels[i] ); 2070cdf0e10cSrcweir gtk_widget_destroy( m_pAligns[i] ); //m_pAligns[i] owns m_pLists[i] 2071cdf0e10cSrcweir gtk_widget_destroy( m_pHBoxs[i] ); 2072cdf0e10cSrcweir } 2073cdf0e10cSrcweir 2074cdf0e10cSrcweir delete m_pFilterList; 2075cdf0e10cSrcweir 2076cdf0e10cSrcweir gtk_widget_destroy( m_pVBox ); 2077cdf0e10cSrcweir } 2078cdf0e10cSrcweir 2079cdf0e10cSrcweir /* vi:set tabstop=4 shiftwidth=4 expandtab: */ 2080