1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_fpicker.hxx"
30 
31 //------------------------------------------------------------------------
32 // includes
33 //------------------------------------------------------------------------
34 #include <osl/diagnose.h>
35 
36 #ifndef _FOLDERPICKER_HXX_
37 #include "folderpicker.hxx"
38 #endif
39 #include <com/sun/star/lang/DisposedException.hpp>
40 #include "WinFOPImpl.hxx"
41 
42 //------------------------------------------------------------------------
43 // namespace directives
44 //------------------------------------------------------------------------
45 
46 using com::sun::star::uno::Reference;
47 using com::sun::star::uno::RuntimeException;
48 using com::sun::star::uno::Sequence;
49 using com::sun::star::uno::XInterface;
50 using com::sun::star::lang::XMultiServiceFactory;
51 using com::sun::star::lang::XServiceInfo;
52 using com::sun::star::lang::DisposedException;
53 using com::sun::star::lang::IllegalArgumentException;
54 using rtl::OUString;
55 using osl::MutexGuard;
56 
57 using namespace cppu;
58 using namespace com::sun::star::ui::dialogs;
59 
60 //------------------------------------------------------------------------
61 // defines
62 //------------------------------------------------------------------------
63 
64 #define FOLDERPICKER_IMPL_NAME  "com.sun.star.ui.dialogs.Win32FolderPicker"
65 
66 //------------------------------------------------------------------------
67 // helper functions
68 //------------------------------------------------------------------------
69 
70 namespace
71 {
72 	Sequence< OUString > SAL_CALL FolderPicker_getSupportedServiceNames()
73 	{
74         Sequence< OUString > aRet(1);
75         aRet[0] = OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFolderPicker");
76 		return aRet;
77 	}
78 }
79 
80 //-----------------------------------------------------------------------------------------
81 //
82 //-----------------------------------------------------------------------------------------
83 
84 CFolderPicker::CFolderPicker( const Reference< XMultiServiceFactory >& xServiceMgr ) :
85 	m_xServiceMgr( xServiceMgr )
86 {
87 	m_pFolderPickerImpl = std::auto_ptr< CWinFolderPickerImpl > ( new CWinFolderPickerImpl( this ) );
88 }
89 
90 //-----------------------------------------------------------------------------------------
91 //
92 //-----------------------------------------------------------------------------------------
93 
94 void SAL_CALL CFolderPicker::setTitle( const OUString& aTitle ) throw( RuntimeException )
95 {
96 	OSL_ASSERT( m_pFolderPickerImpl.get( ) );
97 	MutexGuard aGuard( m_aMutex );
98 	m_pFolderPickerImpl->setTitle( aTitle );
99 }
100 
101 //-----------------------------------------------------------------------------------------
102 //
103 //-----------------------------------------------------------------------------------------
104 
105 void SAL_CALL CFolderPicker::setDisplayDirectory( const OUString& aDirectory )
106 	throw( IllegalArgumentException, RuntimeException )
107 {
108 	OSL_ASSERT( m_pFolderPickerImpl.get( ) );
109 	MutexGuard aGuard( m_aMutex );
110 	m_pFolderPickerImpl->setDisplayDirectory( aDirectory );
111 }
112 
113 //-----------------------------------------------------------------------------------------
114 //
115 //-----------------------------------------------------------------------------------------
116 
117 OUString SAL_CALL CFolderPicker::getDisplayDirectory( )
118 	throw( RuntimeException )
119 {
120 	OSL_ASSERT( m_pFolderPickerImpl.get( ) );
121 	MutexGuard aGuard( m_aMutex );
122 	return m_pFolderPickerImpl->getDisplayDirectory( );
123 }
124 
125 //-----------------------------------------------------------------------------------------
126 //
127 //-----------------------------------------------------------------------------------------
128 
129 OUString SAL_CALL CFolderPicker::getDirectory( ) throw( RuntimeException )
130 {
131     OSL_ASSERT( m_pFolderPickerImpl.get( ) );
132 	MutexGuard aGuard( m_aMutex );
133 	return m_pFolderPickerImpl->getDirectory( );
134 }
135 
136 //-----------------------------------------------------------------------------------------
137 //
138 //-----------------------------------------------------------------------------------------
139 
140 void SAL_CALL CFolderPicker::setDescription( const OUString& aDescription ) throw( RuntimeException )
141 {
142     OSL_ASSERT( m_pFolderPickerImpl.get( ) );
143     MutexGuard aGuard( m_aMutex );
144     m_pFolderPickerImpl->setDescription( aDescription );
145 }
146 
147 //-----------------------------------------------------------------------------------------
148 //
149 //-----------------------------------------------------------------------------------------
150 
151 sal_Int16 SAL_CALL CFolderPicker::execute( )
152 	throw( RuntimeException )
153 {
154 	OSL_ASSERT( m_pFolderPickerImpl.get( ) );
155 
156 	// we should not block in this call else
157 	// in the case of an event the client can'tgetPImplFromHandle( hWnd )
158 	// call another function an we run into a
159 	// deadlock !!!!!
160 	return m_pFolderPickerImpl->execute( );
161 }
162 
163 // -------------------------------------------------
164 // XServiceInfo
165 // -------------------------------------------------
166 
167 OUString SAL_CALL CFolderPicker::getImplementationName(  )
168 	throw( RuntimeException )
169 {
170 	return OUString::createFromAscii( FOLDERPICKER_IMPL_NAME );
171 }
172 
173 // -------------------------------------------------
174 //	XServiceInfo
175 // -------------------------------------------------
176 
177 sal_Bool SAL_CALL CFolderPicker::supportsService( const OUString& ServiceName )
178 	throw( RuntimeException )
179 {
180 	Sequence < OUString > SupportedServicesNames = FolderPicker_getSupportedServiceNames();
181 
182 	for ( sal_Int32 n = SupportedServicesNames.getLength(); n--; )
183 		if (SupportedServicesNames[n].compareTo(ServiceName) == 0)
184 			return sal_True;
185 
186 	return sal_False;
187 }
188 
189 // -------------------------------------------------
190 //	XServiceInfo
191 // -------------------------------------------------
192 
193 Sequence< OUString > SAL_CALL CFolderPicker::getSupportedServiceNames(	 )
194 	throw( RuntimeException )
195 {
196 	return FolderPicker_getSupportedServiceNames();
197 }
198 
199 // -------------------------------------------------
200 //	XCancellable
201 // -------------------------------------------------
202 
203 void SAL_CALL CFolderPicker::cancel( )
204 	throw(RuntimeException)
205 {
206     OSL_ASSERT( m_pFolderPickerImpl.get( ) );
207     MutexGuard aGuard( m_aMutex );
208     m_pFolderPickerImpl->cancel( );
209 }
210 
211 //------------------------------------------------
212 // overwrite base class method, which is called
213 // by base class dispose function
214 //------------------------------------------------
215 
216 void SAL_CALL CFolderPicker::disposing()
217 {
218 }
219 
220