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