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