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