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