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