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_sc.hxx" 26 27 28 29 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> 30 #include <tools/urlobj.hxx> 31 #include <vcl/msgbox.hxx> 32 #include <unotools/ucbstreamhelper.hxx> 33 34 #include "editutil.hxx" 35 #include "filtuno.hxx" 36 #include "miscuno.hxx" 37 #include "unoguard.hxx" 38 #include "scdll.hxx" 39 #include "imoptdlg.hxx" 40 #include "asciiopt.hxx" 41 #include "docsh.hxx" 42 #include "globstr.hrc" 43 44 45 #include "sc.hrc" //CHINA001 46 #include "scabstdlg.hxx" //CHINA001 47 #include "i18npool/lang.h" 48 49 #include <memory> 50 51 using namespace ::com::sun::star; 52 using ::rtl::OUStringBuffer; 53 54 //------------------------------------------------------------------------ 55 56 #define SCFILTEROPTIONSOBJ_SERVICE "com.sun.star.ui.dialogs.FilterOptionsDialog" 57 #define SCFILTEROPTIONSOBJ_IMPLNAME "com.sun.star.comp.Calc.FilterOptionsDialog" 58 SC_SIMPLE_SERVICE_INFO(ScFilterOptionsObj,SCFILTEROPTIONSOBJ_IMPLNAME,SCFILTEROPTIONSOBJ_SERVICE)59 SC_SIMPLE_SERVICE_INFO( ScFilterOptionsObj, SCFILTEROPTIONSOBJ_IMPLNAME, SCFILTEROPTIONSOBJ_SERVICE ) 60 61 #define SC_UNONAME_FILENAME "URL" 62 #define SC_UNONAME_FILTERNAME "FilterName" 63 #define SC_UNONAME_FILTEROPTIONS "FilterOptions" 64 #define SC_UNONAME_INPUTSTREAM "InputStream" 65 66 //------------------------------------------------------------------------ 67 68 ScFilterOptionsObj::ScFilterOptionsObj() : 69 bExport( sal_False ) 70 { 71 } 72 ~ScFilterOptionsObj()73 ScFilterOptionsObj::~ScFilterOptionsObj() 74 { 75 } 76 77 // stuff for exService_... 78 ScFilterOptionsObj_CreateInstance(const uno::Reference<lang::XMultiServiceFactory> &)79 uno::Reference<uno::XInterface> SAL_CALL ScFilterOptionsObj_CreateInstance( 80 const uno::Reference<lang::XMultiServiceFactory>& ) 81 { 82 ScUnoGuard aGuard; 83 ScDLL::Init(); 84 return (::cppu::OWeakObject*) new ScFilterOptionsObj; 85 } 86 getImplementationName_Static()87 rtl::OUString ScFilterOptionsObj::getImplementationName_Static() 88 { 89 return rtl::OUString::createFromAscii( SCFILTEROPTIONSOBJ_IMPLNAME ); 90 } 91 getSupportedServiceNames_Static()92 uno::Sequence<rtl::OUString> ScFilterOptionsObj::getSupportedServiceNames_Static() 93 { 94 uno::Sequence<rtl::OUString> aRet(1); 95 rtl::OUString* pArray = aRet.getArray(); 96 pArray[0] = rtl::OUString::createFromAscii( SCFILTEROPTIONSOBJ_SERVICE ); 97 return aRet; 98 } 99 100 // XPropertyAccess 101 getPropertyValues()102 uno::Sequence<beans::PropertyValue> SAL_CALL ScFilterOptionsObj::getPropertyValues() throw(uno::RuntimeException) 103 { 104 uno::Sequence<beans::PropertyValue> aRet(1); 105 beans::PropertyValue* pArray = aRet.getArray(); 106 107 pArray[0].Name = rtl::OUString::createFromAscii( SC_UNONAME_FILTEROPTIONS ); 108 pArray[0].Value <<= aFilterOptions; 109 110 return aRet; 111 } 112 setPropertyValues(const uno::Sequence<beans::PropertyValue> & aProps)113 void SAL_CALL ScFilterOptionsObj::setPropertyValues( const uno::Sequence<beans::PropertyValue>& aProps ) 114 throw(beans::UnknownPropertyException, beans::PropertyVetoException, 115 lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 116 { 117 const beans::PropertyValue* pPropArray = aProps.getConstArray(); 118 long nPropCount = aProps.getLength(); 119 for (long i = 0; i < nPropCount; i++) 120 { 121 const beans::PropertyValue& rProp = pPropArray[i]; 122 String aPropName(rProp.Name); 123 124 if ( aPropName.EqualsAscii( SC_UNONAME_FILENAME ) ) 125 rProp.Value >>= aFileName; 126 else if ( aPropName.EqualsAscii( SC_UNONAME_FILTERNAME ) ) 127 rProp.Value >>= aFilterName; 128 else if ( aPropName.EqualsAscii( SC_UNONAME_FILTEROPTIONS ) ) 129 rProp.Value >>= aFilterOptions; 130 else if ( aPropName.EqualsAscii( SC_UNONAME_INPUTSTREAM ) ) 131 rProp.Value >>= xInputStream; 132 } 133 } 134 135 // XExecutableDialog 136 setTitle(const::rtl::OUString &)137 void SAL_CALL ScFilterOptionsObj::setTitle( const ::rtl::OUString& /* aTitle */ ) throw(uno::RuntimeException) 138 { 139 // not used 140 } 141 execute()142 sal_Int16 SAL_CALL ScFilterOptionsObj::execute() throw(uno::RuntimeException) 143 { 144 sal_Int16 nRet = ui::dialogs::ExecutableDialogResults::CANCEL; 145 146 String aFilterString( aFilterName ); 147 148 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 149 DBG_ASSERT(pFact, "ScAbstractFactory create fail!"); 150 151 if ( !bExport && aFilterString == ScDocShell::GetAsciiFilterName() ) 152 { 153 // ascii import is special... 154 155 INetURLObject aURL( aFileName ); 156 String aExt(aURL.getExtension()); 157 String aPrivDatName(aURL.getName()); 158 sal_Unicode cAsciiDel; 159 if (aExt.EqualsIgnoreCaseAscii("CSV")) 160 cAsciiDel = ','; 161 else 162 cAsciiDel = '\t'; 163 164 SvStream* pInStream = NULL; 165 if ( xInputStream.is() ) 166 pInStream = utl::UcbStreamHelper::CreateStream( xInputStream ); 167 168 //CHINA001 ScImportAsciiDlg* pDlg = new ScImportAsciiDlg( NULL, aPrivDatName, pInStream, cAsciiDel ); 169 AbstractScImportAsciiDlg* pDlg = pFact->CreateScImportAsciiDlg( NULL, aPrivDatName, pInStream, RID_SCDLG_ASCII, cAsciiDel); 170 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 171 if ( pDlg->Execute() == RET_OK ) 172 { 173 ScAsciiOptions aOptions; 174 pDlg->GetOptions( aOptions ); 175 pDlg->SaveParameters(); 176 aFilterOptions = aOptions.WriteToString(); 177 nRet = ui::dialogs::ExecutableDialogResults::OK; 178 } 179 delete pDlg; 180 delete pInStream; 181 } 182 else if ( aFilterString == ScDocShell::GetWebQueryFilterName() || aFilterString == ScDocShell::GetHtmlFilterName() ) 183 { 184 if (bExport) 185 nRet = ui::dialogs::ExecutableDialogResults::OK; // export HTML without dialog 186 else 187 { 188 // HTML import. 189 ::std::auto_ptr<AbstractScTextImportOptionsDlg> pDlg( 190 pFact->CreateScTextImportOptionsDlg(NULL, RID_SCDLG_TEXT_IMPORT_OPTIONS)); 191 192 if (pDlg->Execute() == RET_OK) 193 { 194 LanguageType eLang = pDlg->GetLanguageType(); 195 OUStringBuffer aBuf; 196 197 aBuf.append(String::CreateFromInt32(static_cast<sal_Int32>(eLang))); 198 aBuf.append(sal_Unicode(' ')); 199 aBuf.append(pDlg->IsDateConversionSet() ? sal_Unicode('1') : sal_Unicode('0')); 200 aFilterOptions = aBuf.makeStringAndClear(); 201 nRet = ui::dialogs::ExecutableDialogResults::OK; 202 } 203 } 204 } 205 else 206 { 207 sal_Bool bMultiByte = sal_True; 208 sal_Bool bDBEnc = sal_False; 209 sal_Bool bAscii = sal_False; 210 211 sal_Unicode cStrDel = '"'; 212 sal_Unicode cAsciiDel = ';'; 213 rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW; 214 215 String aTitle; 216 217 if ( aFilterString == ScDocShell::GetAsciiFilterName() ) 218 { 219 // ascii export (import is handled above) 220 221 INetURLObject aURL( aFileName ); 222 String aExt(aURL.getExtension()); 223 if (aExt.EqualsIgnoreCaseAscii("CSV")) 224 cAsciiDel = ','; 225 else 226 cAsciiDel = '\t'; 227 228 aTitle = ScGlobal::GetRscString( STR_EXPORT_ASCII ); 229 bAscii = sal_True; 230 } 231 else if ( aFilterString == ScDocShell::GetLotusFilterName() ) 232 { 233 // lotus is only imported 234 DBG_ASSERT( !bExport, "Filter Options for Lotus Export is not implemented" ); 235 236 aTitle = ScGlobal::GetRscString( STR_IMPORT_LOTUS ); 237 eEncoding = RTL_TEXTENCODING_IBM_437; 238 } 239 else if ( aFilterString == ScDocShell::GetDBaseFilterName() ) 240 { 241 if ( bExport ) 242 { 243 // dBase export 244 aTitle = ScGlobal::GetRscString( STR_EXPORT_DBF ); 245 } 246 else 247 { 248 // dBase import 249 aTitle = ScGlobal::GetRscString( STR_IMPORT_DBF ); 250 } 251 // common for dBase import/export 252 eEncoding = RTL_TEXTENCODING_IBM_850; 253 bDBEnc = sal_True; 254 } 255 else if ( aFilterString == ScDocShell::GetDifFilterName() ) 256 { 257 if ( bExport ) 258 { 259 // DIF export 260 aTitle = ScGlobal::GetRscString( STR_EXPORT_DIF ); 261 } 262 else 263 { 264 // DIF import 265 aTitle = ScGlobal::GetRscString( STR_IMPORT_DIF ); 266 } 267 // common for DIF import/export 268 eEncoding = RTL_TEXTENCODING_MS_1252; 269 } 270 271 ScImportOptions aOptions( cAsciiDel, cStrDel, eEncoding); 272 //CHINA001 ScImportOptionsDlg* pDlg = new ScImportOptionsDlg( NULL, bAscii, 273 //CHINA001 &aOptions, &aTitle, bMultiByte, bDBEnc, 274 //CHINA001 !bExport ); 275 //CHINA001 276 277 AbstractScImportOptionsDlg* pDlg = pFact->CreateScImportOptionsDlg( NULL, RID_SCDLG_IMPORTOPT, 278 bAscii, &aOptions, &aTitle, bMultiByte, bDBEnc, 279 !bExport); 280 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 281 if ( pDlg->Execute() == RET_OK ) 282 { 283 pDlg->GetImportOptions( aOptions ); 284 if ( bAscii ) 285 aFilterOptions = aOptions.BuildString(); 286 else 287 aFilterOptions = aOptions.aStrFont; 288 nRet = ui::dialogs::ExecutableDialogResults::OK; 289 } 290 delete pDlg; 291 } 292 293 xInputStream.clear(); // don't hold the stream longer than necessary 294 295 return nRet; 296 } 297 298 // XImporter 299 setTargetDocument(const uno::Reference<lang::XComponent> &)300 void SAL_CALL ScFilterOptionsObj::setTargetDocument( const uno::Reference<lang::XComponent>& /* xDoc */ ) 301 throw(lang::IllegalArgumentException, uno::RuntimeException) 302 { 303 bExport = sal_False; 304 } 305 306 // XExporter 307 setSourceDocument(const uno::Reference<lang::XComponent> &)308 void SAL_CALL ScFilterOptionsObj::setSourceDocument( const uno::Reference<lang::XComponent>& /* xDoc */ ) 309 throw(lang::IllegalArgumentException, uno::RuntimeException) 310 { 311 bExport = sal_True; 312 } 313 314