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