1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_fpicker.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
28*b1cdbd2cSJim Jagielski // includes
29*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
30*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
36*b1cdbd2cSJim Jagielski #include <cppuhelper/interfacecontainer.h>
37*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.hxx>
40*b1cdbd2cSJim Jagielski #include <FPServiceInfo.hxx>
41*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
42*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
43*b1cdbd2cSJim Jagielski #include "SalGtkFolderPicker.hxx"
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <iostream>
48*b1cdbd2cSJim Jagielski #include "resourceprovider.hxx"
49*b1cdbd2cSJim Jagielski #ifndef _SV_RC_H
50*b1cdbd2cSJim Jagielski #include <tools/rc.hxx>
51*b1cdbd2cSJim Jagielski #endif
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
54*b1cdbd2cSJim Jagielski // namespace directives
55*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski using namespace ::rtl;
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui::dialogs;
60*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
61*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
64*b1cdbd2cSJim Jagielski // helper functions
65*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski namespace
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski 	// controling event notifications
FolderPicker_getSupportedServiceNames()70*b1cdbd2cSJim Jagielski 	uno::Sequence<rtl::OUString> SAL_CALL FolderPicker_getSupportedServiceNames()
71*b1cdbd2cSJim Jagielski 	{
72*b1cdbd2cSJim Jagielski         uno::Sequence<rtl::OUString> aRet(2);
73*b1cdbd2cSJim Jagielski         aRet[0] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.SystemFolderPicker" );
74*b1cdbd2cSJim Jagielski         aRet[1] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.GtkFolderPicker" );
75*b1cdbd2cSJim Jagielski 		return aRet;
76*b1cdbd2cSJim Jagielski 	}
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------------------
80*b1cdbd2cSJim Jagielski // constructor
81*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------------------
SalGtkFolderPicker(const uno::Reference<lang::XMultiServiceFactory> & xServiceMgr)82*b1cdbd2cSJim Jagielski SalGtkFolderPicker::SalGtkFolderPicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr ) :
83*b1cdbd2cSJim Jagielski 	SalGtkPicker(xServiceMgr),
84*b1cdbd2cSJim Jagielski 	m_xServiceMgr(xServiceMgr)
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski     CResourceProvider aResProvider;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski     GdkThreadLock aLock;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     m_pDialog = gtk_file_chooser_dialog_new(
91*b1cdbd2cSJim Jagielski     	OUStringToOString( aResProvider.getResString( FOLDERPICKER_TITLE ), RTL_TEXTENCODING_UTF8 ).getStr(),
92*b1cdbd2cSJim Jagielski 		NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
93*b1cdbd2cSJim Jagielski 		GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, (char *)NULL );
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski     gtk_dialog_set_default_response( GTK_DIALOG (m_pDialog), GTK_RESPONSE_ACCEPT );
96*b1cdbd2cSJim Jagielski     gtk_file_chooser_set_local_only( GTK_FILE_CHOOSER( m_pDialog ), sal_False );
97*b1cdbd2cSJim Jagielski     gtk_file_chooser_set_select_multiple( GTK_FILE_CHOOSER( m_pDialog ), sal_False );
98*b1cdbd2cSJim Jagielski }
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski // -------------------------------------------------
101*b1cdbd2cSJim Jagielski // XEventListener
102*b1cdbd2cSJim Jagielski // -------------------------------------------------
103*b1cdbd2cSJim Jagielski 
disposing(const lang::EventObject &)104*b1cdbd2cSJim Jagielski void SAL_CALL SalGtkFolderPicker::disposing( const lang::EventObject& )
105*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski }
108*b1cdbd2cSJim Jagielski 
setDisplayDirectory(const rtl::OUString & aDirectory)109*b1cdbd2cSJim Jagielski void SAL_CALL SalGtkFolderPicker::setDisplayDirectory( const rtl::OUString& aDirectory )
110*b1cdbd2cSJim Jagielski 	throw( lang::IllegalArgumentException, uno::RuntimeException )
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski     OSL_ASSERT( m_pDialog != NULL );
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     OString aTxt = unicodetouri( aDirectory );
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     if( aTxt.lastIndexOf('/') == aTxt.getLength() - 1 )
117*b1cdbd2cSJim Jagielski         aTxt = aTxt.copy( 0, aTxt.getLength() - 1 );
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski     OSL_TRACE( "setting path to %s\n", aTxt.getStr() );
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski     GdkThreadLock aLock;
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski     gtk_file_chooser_set_current_folder_uri( GTK_FILE_CHOOSER( m_pDialog ),
124*b1cdbd2cSJim Jagielski         aTxt.getStr() );
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski 
getDisplayDirectory()127*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL SalGtkFolderPicker::getDisplayDirectory() throw( uno::RuntimeException )
128*b1cdbd2cSJim Jagielski {
129*b1cdbd2cSJim Jagielski     OSL_ASSERT( m_pDialog != NULL );
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski     GdkThreadLock aLock;
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski     gchar* pCurrentFolder =
134*b1cdbd2cSJim Jagielski         gtk_file_chooser_get_current_folder_uri( GTK_FILE_CHOOSER( m_pDialog ) );
135*b1cdbd2cSJim Jagielski     ::rtl::OUString aCurrentFolderName = uritounicode(pCurrentFolder);
136*b1cdbd2cSJim Jagielski     g_free( pCurrentFolder );
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     return aCurrentFolderName;
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
getDirectory()141*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL SalGtkFolderPicker::getDirectory() throw( uno::RuntimeException )
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski 	return getDisplayDirectory();
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
setDescription(const rtl::OUString & rDescription)146*b1cdbd2cSJim Jagielski void SAL_CALL SalGtkFolderPicker::setDescription( const rtl::OUString& rDescription )
147*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
148*b1cdbd2cSJim Jagielski {
149*b1cdbd2cSJim Jagielski 	::rtl::OString aDescription = OUStringToOString( rDescription, RTL_TEXTENCODING_UTF8 );
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------------------
155*b1cdbd2cSJim Jagielski // XExecutableDialog functions
156*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------------------
157*b1cdbd2cSJim Jagielski 
setTitle(const rtl::OUString & aTitle)158*b1cdbd2cSJim Jagielski void SAL_CALL SalGtkFolderPicker::setTitle( const rtl::OUString& aTitle ) throw( uno::RuntimeException )
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski     OSL_ASSERT( m_pDialog != NULL );
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski     ::rtl::OString aWindowTitle = OUStringToOString( aTitle, RTL_TEXTENCODING_UTF8 );
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     GdkThreadLock aLock;
165*b1cdbd2cSJim Jagielski     gtk_window_set_title( GTK_WINDOW( m_pDialog ), aWindowTitle.getStr() );
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski 
execute()168*b1cdbd2cSJim Jagielski sal_Int16 SAL_CALL SalGtkFolderPicker::execute() throw( uno::RuntimeException )
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski 	OSL_TRACE( "1: HERE WE ARE\n");
171*b1cdbd2cSJim Jagielski 	OSL_ASSERT( m_pDialog != NULL );
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	sal_Int16 retVal = 0;
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski     uno::Reference< awt::XExtendedToolkit > xToolkit(
176*b1cdbd2cSJim Jagielski         m_xServiceMgr->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.awt.Toolkit") ), uno::UNO_QUERY);
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski     RunDialog* pRunDialog = new RunDialog(m_pDialog, xToolkit);
179*b1cdbd2cSJim Jagielski     uno::Reference < awt::XTopWindowListener > xLifeCycle(pRunDialog);
180*b1cdbd2cSJim Jagielski     gint nStatus = pRunDialog->run();
181*b1cdbd2cSJim Jagielski 	switch( nStatus )
182*b1cdbd2cSJim Jagielski 	{
183*b1cdbd2cSJim Jagielski 		case GTK_RESPONSE_ACCEPT:
184*b1cdbd2cSJim Jagielski 			retVal = ExecutableDialogResults::OK;
185*b1cdbd2cSJim Jagielski 			break;
186*b1cdbd2cSJim Jagielski 		case GTK_RESPONSE_CANCEL:
187*b1cdbd2cSJim Jagielski 			retVal = ExecutableDialogResults::CANCEL;
188*b1cdbd2cSJim Jagielski 			break;
189*b1cdbd2cSJim Jagielski 		default:
190*b1cdbd2cSJim Jagielski 			retVal = 0;
191*b1cdbd2cSJim Jagielski 			break;
192*b1cdbd2cSJim Jagielski 	}
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 	return retVal;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------
198*b1cdbd2cSJim Jagielski // XCancellable
199*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------
200*b1cdbd2cSJim Jagielski 
cancel()201*b1cdbd2cSJim Jagielski void SAL_CALL SalGtkFolderPicker::cancel() throw( uno::RuntimeException )
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski 	OSL_ASSERT( m_pDialog != NULL );
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 	// TODO m_pImpl->cancel();
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski // -------------------------------------------------
209*b1cdbd2cSJim Jagielski // XServiceInfo
210*b1cdbd2cSJim Jagielski // -------------------------------------------------
211*b1cdbd2cSJim Jagielski 
getImplementationName()212*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL SalGtkFolderPicker::getImplementationName()
213*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski 	return rtl::OUString::createFromAscii( FOLDER_PICKER_IMPL_NAME );
216*b1cdbd2cSJim Jagielski }
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski // -------------------------------------------------
219*b1cdbd2cSJim Jagielski //	XServiceInfo
220*b1cdbd2cSJim Jagielski // -------------------------------------------------
221*b1cdbd2cSJim Jagielski 
supportsService(const rtl::OUString & ServiceName)222*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL SalGtkFolderPicker::supportsService( const rtl::OUString& ServiceName )
223*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski 	uno::Sequence <rtl::OUString> SupportedServicesNames = FolderPicker_getSupportedServiceNames();
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 	for( sal_Int32 n = SupportedServicesNames.getLength(); n--; )
228*b1cdbd2cSJim Jagielski 		if( SupportedServicesNames[n].compareTo( ServiceName ) == 0)
229*b1cdbd2cSJim Jagielski 			return sal_True;
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 	return sal_False;
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski // -------------------------------------------------
235*b1cdbd2cSJim Jagielski //	XServiceInfo
236*b1cdbd2cSJim Jagielski // -------------------------------------------------
237*b1cdbd2cSJim Jagielski 
getSupportedServiceNames()238*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString> SAL_CALL SalGtkFolderPicker::getSupportedServiceNames()
239*b1cdbd2cSJim Jagielski 	throw( uno::RuntimeException )
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski 	return FolderPicker_getSupportedServiceNames();
242*b1cdbd2cSJim Jagielski }
243