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