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 #include "OfficeFolderPicker.hxx" 28 29 #include "iodlg.hxx" 30 31 #include <list> 32 #include <tools/urlobj.hxx> 33 34 #define _SVSTDARR_STRINGSDTOR 35 #include "svl/svstdarr.hxx" 36 #include <com/sun/star/container/XContentEnumerationAccess.hpp> 37 #include <com/sun/star/container/XSet.hpp> 38 #include <com/sun/star/uno/Any.hxx> 39 #include <cppuhelper/factory.hxx> 40 #include <com/sun/star/beans/XPropertySet.hpp> 41 #include <unotools/pathoptions.hxx> 42 43 // using ---------------------------------------------------------------- 44 45 using namespace ::com::sun::star::container; 46 using namespace ::com::sun::star::lang; 47 using namespace ::com::sun::star::uno; 48 using namespace ::com::sun::star::beans; 49 50 //------------------------------------------------------------------------------------ 51 // class SvtFolderPicker 52 //------------------------------------------------------------------------------------ 53 54 //------------------------------------------------------------------------------------ 55 SvtFolderPicker::SvtFolderPicker( const Reference < XMultiServiceFactory >& _rxFactory ) 56 :OCommonPicker( _rxFactory ) 57 { 58 } 59 60 //------------------------------------------------------------------------------------ 61 SvtFolderPicker::~SvtFolderPicker() 62 { 63 } 64 65 //------------------------------------------------------------------------------------ 66 // disambiguate XInterface 67 //------------------------------------------------------------------------------------ 68 IMPLEMENT_FORWARD_XINTERFACE2( SvtFolderPicker, OCommonPicker, SvtFolderPicker_Base ) 69 70 //------------------------------------------------------------------------------------ 71 // disambiguate XTypeProvider 72 //------------------------------------------------------------------------------------ 73 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvtFolderPicker, OCommonPicker, SvtFolderPicker_Base ) 74 75 //------------------------------------------------------------------------------------ 76 // XExecutableDialog functions 77 //------------------------------------------------------------------------------------ 78 79 //------------------------------------------------------------------------------------ 80 void SAL_CALL SvtFolderPicker::setTitle( const ::rtl::OUString& _rTitle ) throw (RuntimeException) 81 { 82 OCommonPicker::setTitle( _rTitle ); 83 } 84 85 //------------------------------------------------------------------------------------ 86 sal_Int16 SAL_CALL SvtFolderPicker::execute( ) throw (RuntimeException) 87 { 88 return OCommonPicker::execute(); 89 } 90 91 //------------------------------------------------------------------------------------ 92 // XAsynchronousExecutableDialog functions 93 //------------------------------------------------------------------------------------ 94 95 //------------------------------------------------------------------------------------ 96 void SAL_CALL SvtFolderPicker::setDialogTitle( const ::rtl::OUString& _rTitle) throw (RuntimeException) 97 { 98 setTitle( _rTitle ); 99 } 100 101 //------------------------------------------------------------------------------------ 102 void SAL_CALL SvtFolderPicker::startExecuteModal( const Reference< ::com::sun::star::ui::dialogs::XDialogClosedListener >& xListener ) throw (RuntimeException) 103 { 104 m_xListener = xListener; 105 prepareDialog(); 106 prepareExecute(); 107 getDialog()->EnableAutocompletion( sal_True ); 108 getDialog()->StartExecuteModal( LINK( this, SvtFolderPicker, DialogClosedHdl ) ); 109 } 110 111 //------------------------------------------------------------------------------------ 112 SvtFileDialog* SvtFolderPicker::implCreateDialog( Window* _pParent ) 113 { 114 return new SvtFileDialog( _pParent, SFXWB_PATHDIALOG ); 115 } 116 117 //------------------------------------------------------------------------------------ 118 sal_Int16 SvtFolderPicker::implExecutePicker( ) 119 { 120 prepareExecute(); 121 122 // now we are ready to execute the dialog 123 getDialog()->EnableAutocompletion( sal_False ); 124 sal_Int16 nRet = getDialog()->Execute(); 125 126 return nRet; 127 } 128 129 //------------------------------------------------------------------------------------ 130 void SvtFolderPicker::prepareExecute() 131 { 132 // set the default directory 133 if ( m_aDisplayDirectory.getLength() > 0 ) 134 getDialog()->SetPath( m_aDisplayDirectory ); 135 else 136 { 137 // Default-Standard-Dir setzen 138 INetURLObject aStdDirObj( SvtPathOptions().GetWorkPath() ); 139 getDialog()->SetPath( aStdDirObj.GetMainURL( INetURLObject::NO_DECODE) ); 140 } 141 } 142 143 //----------------------------------------------------------------------------- 144 IMPL_LINK( SvtFolderPicker, DialogClosedHdl, Dialog*, pDlg ) 145 { 146 if ( m_xListener.is() ) 147 { 148 sal_Int16 nRet = static_cast< sal_Int16 >( pDlg->GetResult() ); 149 ::com::sun::star::ui::dialogs::DialogClosedEvent aEvent( *this, nRet ); 150 m_xListener->dialogClosed( aEvent ); 151 m_xListener.clear(); 152 } 153 return 0; 154 } 155 156 //------------------------------------------------------------------------------------ 157 // XFolderPicker functions 158 //------------------------------------------------------------------------------------ 159 160 void SAL_CALL SvtFolderPicker::setDisplayDirectory( const ::rtl::OUString& aDirectory ) 161 throw( IllegalArgumentException, RuntimeException ) 162 { 163 m_aDisplayDirectory = aDirectory; 164 } 165 166 //------------------------------------------------------------------------------------ 167 ::rtl::OUString SAL_CALL SvtFolderPicker::getDisplayDirectory() throw( RuntimeException ) 168 { 169 ::rtl::OUString aResult; 170 171 if ( ! getDialog() ) 172 return m_aDisplayDirectory; 173 174 SvStringsDtor* pPathList = getDialog()->GetPathList(); 175 176 if ( pPathList->Count() ) 177 aResult = ::rtl::OUString( *pPathList->GetObject( 0 ) ); 178 179 delete pPathList; 180 181 return aResult; 182 } 183 184 //------------------------------------------------------------------------------------ 185 ::rtl::OUString SAL_CALL SvtFolderPicker::getDirectory() throw( RuntimeException ) 186 { 187 ::rtl::OUString aResult; 188 189 if ( ! getDialog() ) 190 return m_aDisplayDirectory; 191 192 SvStringsDtor* pPathList = getDialog()->GetPathList(); 193 194 if ( pPathList->Count() ) 195 aResult = ::rtl::OUString( *pPathList->GetObject( 0 ) ); 196 197 delete pPathList; 198 199 return aResult; 200 } 201 202 //------------------------------------------------------------------------------------ 203 void SAL_CALL SvtFolderPicker::setDescription( const ::rtl::OUString& aDescription ) 204 throw( RuntimeException ) 205 { 206 m_aDescription = aDescription; 207 } 208 209 //------------------------------------------------------------------------------------ 210 // XServiceInfo 211 //------------------------------------------------------------------------------------ 212 213 /* XServiceInfo */ 214 ::rtl::OUString SAL_CALL SvtFolderPicker::getImplementationName() throw( RuntimeException ) 215 { 216 return impl_getStaticImplementationName(); 217 } 218 219 /* XServiceInfo */ 220 sal_Bool SAL_CALL SvtFolderPicker::supportsService( const ::rtl::OUString& sServiceName ) throw( RuntimeException ) 221 { 222 Sequence< ::rtl::OUString > seqServiceNames = getSupportedServiceNames(); 223 const ::rtl::OUString* pArray = seqServiceNames.getConstArray(); 224 for ( sal_Int32 i = 0; i < seqServiceNames.getLength(); i++ ) 225 { 226 if ( sServiceName == pArray[i] ) 227 { 228 return sal_True ; 229 } 230 } 231 return sal_False ; 232 } 233 234 /* XServiceInfo */ 235 Sequence< ::rtl::OUString > SAL_CALL SvtFolderPicker::getSupportedServiceNames() throw( RuntimeException ) 236 { 237 return impl_getStaticSupportedServiceNames(); 238 } 239 240 /* Helper for XServiceInfo */ 241 Sequence< ::rtl::OUString > SvtFolderPicker::impl_getStaticSupportedServiceNames() 242 { 243 Sequence< ::rtl::OUString > seqServiceNames(1); 244 seqServiceNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.OfficeFolderPicker" ); 245 return seqServiceNames ; 246 } 247 248 /* Helper for XServiceInfo */ 249 ::rtl::OUString SvtFolderPicker::impl_getStaticImplementationName() 250 { 251 return ::rtl::OUString::createFromAscii( "com.sun.star.svtools.OfficeFolderPicker" ); 252 } 253 254 /* Helper for registry */ 255 Reference< XInterface > SAL_CALL SvtFolderPicker::impl_createInstance( const Reference< XComponentContext >& rxContext ) 256 throw( Exception ) 257 { 258 Reference< XMultiServiceFactory > xServiceManager (rxContext->getServiceManager(), UNO_QUERY_THROW); 259 return Reference< XInterface >( *new SvtFolderPicker( xServiceManager ) ); 260 } 261 262