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_sfx2.hxx" 26 #include <com/sun/star/embed/XStorage.hpp> 27 #include <com/sun/star/embed/ElementModes.hpp> 28 #include <com/sun/star/beans/XPropertySet.hpp> 29 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp" 30 31 #include <stdio.h> 32 33 #ifndef _SV_PRNSETUP_HXX //autogen 34 #include <svtools/prnsetup.hxx> 35 #endif 36 #include <vcl/cmdevt.hxx> 37 #include <vcl/menubtn.hxx> 38 #include <vcl/msgbox.hxx> 39 #include <vcl/print.hxx> 40 #include <svl/style.hxx> 41 #include <svl/stritem.hxx> 42 #include <svl/eitem.hxx> 43 #include <svtools/sfxecode.hxx> 44 #include <svtools/ehdl.hxx> 45 #include <svtools/imagemgr.hxx> 46 #include <vcl/waitobj.hxx> 47 #include <tools/urlobj.hxx> 48 #include <tools/color.hxx> 49 #include <unotools/pathoptions.hxx> 50 #include <unotools/moduleoptions.hxx> 51 #include <sot/exchange.hxx> 52 #include <comphelper/storagehelper.hxx> 53 54 #include "helpid.hrc" 55 #include "docvor.hxx" 56 #include <sfx2/docfac.hxx> 57 #include "orgmgr.hxx" 58 #include <sfx2/doctempl.hxx> 59 #include <sfx2/templdlg.hxx> 60 #include "sfxtypes.hxx" 61 #include <sfx2/app.hxx> 62 #include <sfx2/dispatch.hxx> 63 #include "sfx2/sfxresid.hxx" 64 #include "doc.hrc" 65 #include <sfx2/sfx.hrc> 66 #include "docvor.hrc" 67 #include <sfx2/docfilt.hxx> 68 #include <sfx2/filedlghelper.hxx> 69 #include <sfx2/docfilt.hxx> 70 #include <sfx2/fcontnr.hxx> 71 #include <svtools/localresaccess.hxx> 72 #ifndef _SVT_DOC_ADDRESSTEMPLATE_HXX_ 73 #include <svtools/addresstemplate.hxx> 74 #endif 75 #include <comphelper/processfactory.hxx> 76 #define _SVSTDARR_STRINGSDTOR 77 #include <svl/svstdarr.hxx> 78 79 static const char cDelim = ':'; 80 sal_Bool SfxOrganizeListBox_Impl::bDropMoveOk = sal_True; 81 82 using namespace ::com::sun::star; 83 84 //========================================================================= 85 86 class SuspendAccel 87 { 88 public: 89 Accelerator* pAccel; 90 91 SuspendAccel( Accelerator* pA ) 92 { 93 pAccel=pA; 94 GetpApp()->RemoveAccel( pAccel ); 95 } 96 ~SuspendAccel() 97 { 98 GetpApp()->InsertAccel( pAccel ); 99 } 100 }; 101 102 //========================================================================= 103 104 105 inline void SfxOrganizeListBox_Impl::SetBitmaps( 106 const Image &rOFolder, const Image &rCFolder, const Image &rODoc, const Image &rCDoc, 107 const Image &rOFolderHC, const Image &rCFolderHC, const Image &rODocHC, const Image &rCDocHC ) 108 { 109 aOpenedFolderBmp = rOFolder; 110 aClosedFolderBmp = rCFolder; 111 aOpenedDocBmp = rODoc; 112 aClosedDocBmp = rCDoc; 113 114 aOpenedFolderBmpHC = rOFolderHC; 115 aClosedFolderBmpHC = rCFolderHC; 116 aOpenedDocBmpHC = rODocHC; 117 aClosedDocBmpHC = rCDocHC; 118 119 } 120 121 //========================================================================= 122 123 #define NO_DROP_ACTION ((sal_Int8)-1) 124 125 class SfxOrganizeDlg_Impl 126 { 127 friend class SfxTemplateOrganizeDlg; 128 friend class SfxOrganizeListBox_Impl; 129 130 SuspendAccel* pSuspend; 131 SfxTemplateOrganizeDlg* pDialog; 132 133 SfxOrganizeListBox_Impl* pFocusBox; 134 Printer* pPrt; 135 136 // save pointer for asynchronous D&D 137 SvLBox* pSourceView; 138 SvLBoxEntry* pTargetEntry; 139 SfxOrganizeListBox_Impl* pFinishedBox; 140 sal_Int8 nDropAction; 141 bool bExecDropFinished; 142 143 // save some variables for the asynchronous file dialog 144 sal_uInt16 m_nRegion; 145 sal_uInt16 m_nIndex; 146 String m_sExtension4Save; 147 148 SfxOrganizeListBox_Impl aLeftLb; 149 ListBox aLeftTypLb; 150 151 SfxOrganizeListBox_Impl aRightLb; 152 ListBox aRightTypLb; 153 154 OKButton aOkBtn; 155 MenuButton aEditBtn; 156 HelpButton aHelpBtn; 157 PushButton aAddressTemplateBtn; 158 PushButton aFilesBtn; 159 160 Accelerator aEditAcc; 161 162 String aLastDir; 163 SfxOrganizeMgr aMgr; 164 sfx2::FileDialogHelper* pFileDlg; 165 166 SvStringsDtor* GetAllFactoryURLs_Impl() const; 167 sal_Bool GetServiceName_Impl( String& rFactoryURL, String& rFileURL ) const; 168 long Dispatch_Impl( sal_uInt16 nId, Menu* _pMenu ); 169 String GetPath_Impl( sal_Bool bOpen, const String& rFileName ); 170 ::com::sun::star::uno::Sequence< ::rtl::OUString > 171 GetPaths_Impl( const String& rFileName ); 172 void InitBitmaps( void ); 173 174 DECL_LINK( GetFocus_Impl, SfxOrganizeListBox_Impl * ); 175 DECL_LINK( LeftListBoxSelect_Impl, ListBox * ); 176 DECL_LINK( RightListBoxSelect_Impl, ListBox * ); 177 DECL_LINK( AccelSelect_Impl, Accelerator * ); 178 DECL_LINK( MenuSelect_Impl, Menu * ); 179 DECL_LINK( MenuActivate_Impl, Menu * ); 180 DECL_LINK( AddFiles_Impl, Button * ); 181 DECL_LINK( OnAddressTemplateClicked, Button * ); 182 183 DECL_LINK( ImportHdl, sfx2::FileDialogHelper* ); 184 DECL_LINK( ExportHdl, sfx2::FileDialogHelper* ); 185 DECL_LINK( AddFilesHdl, sfx2::FileDialogHelper* ); 186 187 sal_Bool DontDelete_Impl( SvLBoxEntry* pEntry ); 188 void OkHdl( Button* ); 189 190 public: 191 SfxOrganizeDlg_Impl( SfxTemplateOrganizeDlg* pParent, SfxDocumentTemplates* pTempl ); 192 ~SfxOrganizeDlg_Impl(); 193 }; 194 195 //------------------------------------------------------------------------- 196 197 SfxOrganizeDlg_Impl::SfxOrganizeDlg_Impl( SfxTemplateOrganizeDlg* pParent, 198 SfxDocumentTemplates* pTempl ) : 199 200 pSuspend ( NULL ), 201 pDialog ( pParent ), 202 pFocusBox ( NULL ), 203 pPrt ( NULL ), 204 pSourceView ( NULL ), 205 pTargetEntry ( NULL ), 206 pFinishedBox ( NULL ), 207 nDropAction ( NO_DROP_ACTION ), 208 bExecDropFinished ( true ), 209 210 aLeftLb ( this, pParent, WB_BORDER | WB_TABSTOP | WB_HSCROLL, SfxOrganizeListBox_Impl::VIEW_TEMPLATES ), 211 aLeftTypLb ( pParent, SfxResId( LB_LEFT_TYP ) ), 212 213 aRightLb ( this, pParent, WB_BORDER | WB_TABSTOP | WB_HSCROLL, SfxOrganizeListBox_Impl::VIEW_FILES ), 214 aRightTypLb ( pParent, SfxResId( LB_RIGHT_TYP ) ), 215 216 aOkBtn ( pParent, SfxResId( BTN_OK ) ), 217 aEditBtn ( pParent, SfxResId( BTN_EDIT ) ), 218 aHelpBtn ( pParent, SfxResId( BTN_HELP ) ), 219 aAddressTemplateBtn ( pParent, SfxResId( BTN_ADDRESSTEMPLATE ) ), 220 aFilesBtn ( pParent, SfxResId( BTN_FILES ) ), 221 222 aEditAcc ( SfxResId( ACC_EDIT ) ), 223 aMgr ( &aLeftLb, &aRightLb, pTempl ), 224 pFileDlg ( NULL ) 225 226 { 227 // update the SfxDocumentTemplates the manager works with 228 if ( aMgr.GetTemplates() ) // should never fail, but who knows .... 229 { 230 // for this, show a wait cursor (it may take a while) 231 Window* pWaitObjectRange = pDialog ? pDialog->GetParent() : NULL; 232 if ( !pWaitObjectRange ) 233 pWaitObjectRange = pDialog; 234 235 WaitObject aWaitCursor( pWaitObjectRange ); 236 const_cast< SfxDocumentTemplates* >( aMgr.GetTemplates() )->Update( sal_True /* be smart */ ); 237 // this const_cast is a hack - but the alternative would be to 238 // * have a method which returns the templates non-const 239 // * use a new SfxDocumentTemplates instance for the update (knowing that they all share the same 240 // implementation class) 241 // * always work with an own instance, even if we get only NULL in this ctor 242 } 243 244 aLeftLb.SetHelpId( HID_CTL_ORGANIZER_LEFT ); 245 aRightLb.SetHelpId( HID_CTL_ORGANIZER_RIGHT ); 246 247 String aWorkPath = SvtPathOptions().GetWorkPath(); 248 if ( aWorkPath.Len() ) 249 { 250 INetURLObject aObj( aWorkPath ); 251 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Illegal URL !" ); 252 aObj.setFinalSlash(); 253 aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); 254 } 255 else 256 { 257 // fallback 258 String aProgURL = SvtPathOptions().SubstituteVariable( String::CreateFromAscii("$(PROGURL)") ); 259 INetURLObject aObj( aProgURL ); 260 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Illegal URL !" ); 261 aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); 262 } 263 264 InitBitmaps(); 265 266 aEditBtn.GetPopupMenu()->SetSelectHdl( LINK( this, SfxOrganizeDlg_Impl, MenuSelect_Impl ) ); 267 aEditBtn.GetPopupMenu()->SetActivateHdl( LINK( this, SfxOrganizeDlg_Impl, MenuActivate_Impl ) ); 268 aEditAcc.SetSelectHdl( LINK( this, SfxOrganizeDlg_Impl, AccelSelect_Impl ) ); 269 GetpApp()->InsertAccel( &aEditAcc ); 270 271 aFilesBtn.SetClickHdl( 272 LINK(this,SfxOrganizeDlg_Impl, AddFiles_Impl)); 273 aAddressTemplateBtn.SetClickHdl( 274 LINK(this,SfxOrganizeDlg_Impl, OnAddressTemplateClicked)); 275 aLeftTypLb.SetSelectHdl( 276 LINK(this, SfxOrganizeDlg_Impl, LeftListBoxSelect_Impl)); 277 aRightTypLb.SetSelectHdl( 278 LINK(this, SfxOrganizeDlg_Impl, RightListBoxSelect_Impl)); 279 aLeftLb.SetGetFocusHdl( 280 LINK(this, SfxOrganizeDlg_Impl, GetFocus_Impl)); 281 aRightLb.SetGetFocusHdl( 282 LINK(this, SfxOrganizeDlg_Impl, GetFocus_Impl)); 283 aLeftLb.SetPosSizePixel(pParent->LogicToPixel(Point(3, 6), MAP_APPFONT), 284 pParent->LogicToPixel(Size(94, 132), MAP_APPFONT)); 285 aRightLb.SetPosSizePixel(pParent->LogicToPixel(Point(103, 6), MAP_APPFONT), 286 pParent->LogicToPixel(Size(94, 132), MAP_APPFONT)); 287 288 if ( !SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE) ) 289 aAddressTemplateBtn.Hide(); 290 Font aFont(aLeftLb.GetFont()); 291 aFont.SetWeight(WEIGHT_NORMAL); 292 aLeftLb.SetFont(aFont); 293 aRightLb.SetFont(aFont); 294 const long nIndent = aLeftLb.GetIndent() / 2; 295 aLeftLb.SetIndent( (short)nIndent ); 296 aRightLb.SetIndent( (short)nIndent ); 297 298 aLeftLb.SetMgr(&aMgr); 299 aRightLb.SetMgr(&aMgr); 300 aLeftLb.Reset(); 301 aRightLb.Reset();//SetModel(aLeftLb.GetModel()); 302 303 aLeftLb.Show(); 304 aRightLb.Show(); 305 306 aLeftLb.SelectAll( sal_False ); 307 aRightLb.SelectAll( sal_False ); 308 aRightLb.GrabFocus(); 309 } 310 311 //------------------------------------------------------------------------- 312 313 SfxOrganizeDlg_Impl::~SfxOrganizeDlg_Impl() 314 { 315 delete pFileDlg; 316 } 317 318 //------------------------------------------------------------------------- 319 320 void SfxOrganizeDlg_Impl::InitBitmaps( void ) 321 { 322 Image aOpenedFolderBmp( SfxResId( IMG_OPENED_FOLDER ) ); 323 Image aClosedFolderBmp( SfxResId( IMG_CLOSED_FOLDER ) ); 324 Image aOpenedDocBmp( SfxResId( IMG_OPENED_DOC ) ); 325 Image aClosedDocBmp( SfxResId( IMG_CLOSED_DOC ) ); 326 327 Image aOpenedFolderBmpHC( SfxResId( IMG_OPENED_FOLDER_HC ) ); 328 Image aClosedFolderBmpHC( SfxResId( IMG_CLOSED_FOLDER_HC ) ); 329 Image aOpenedDocBmpHC( SfxResId( IMG_OPENED_DOC_HC ) ); 330 Image aClosedDocBmpHC( SfxResId( IMG_CLOSED_DOC_HC ) ); 331 332 aLeftLb.SetBitmaps( aOpenedFolderBmp, aClosedFolderBmp, aOpenedDocBmp, aClosedDocBmp, 333 aOpenedFolderBmpHC, aClosedFolderBmpHC, aOpenedDocBmpHC, aClosedDocBmpHC ); 334 aRightLb.SetBitmaps( aOpenedFolderBmp, aClosedFolderBmp, aOpenedDocBmp, aClosedDocBmp, 335 aOpenedFolderBmpHC, aClosedFolderBmpHC, aOpenedDocBmpHC, aClosedDocBmpHC ); 336 } 337 338 //========================================================================= 339 340 sal_Bool QueryDelete_Impl(Window *pParent, // Parent der QueryBox 341 sal_uInt16 nId, // Resource Id 342 const String &rTemplateName) // Name der zu l"oschenden Vorlage 343 /* [Beschreibung] 344 345 "oschabfrage 346 347 */ 348 { 349 SfxResId aResId( nId ); 350 String aEntryText( aResId ); 351 aEntryText.SearchAndReplaceAscii( "$1", rTemplateName ); 352 QueryBox aBox( pParent, WB_YES_NO | WB_DEF_NO, aEntryText ); 353 return RET_NO != aBox.Execute(); 354 } 355 356 //------------------------------------------------------------------------- 357 358 void ErrorDelete_Impl(Window *pParent, const String &rName, sal_Bool bFolder = sal_False ) 359 360 /* [Beschreibung] 361 362 Benutzerinformation, da"s die Vorlage rName nicht gel"oscht werden konnte 363 364 */ 365 { 366 if ( bFolder ) 367 { 368 String aText( SfxResId( STR_ERROR_DELETE_TEMPLATE_DIR ) ); 369 ErrorBox( pParent, WB_OK, aText ).Execute(); 370 } 371 else 372 { 373 String aText( SfxResId( STR_ERROR_DELETE_TEMPLATE ) ); 374 aText.SearchAndReplaceAscii( "$1", rName ); 375 ErrorBox( pParent, WB_OK, aText ).Execute(); 376 } 377 } 378 379 380 //========================================================================= 381 382 /* [Beschreibung] 383 384 Implementierungsklasse; Referenzklasse f"ur USHORT-Array 385 386 */ 387 388 struct ImpPath_Impl 389 { 390 SvUShorts aUS; 391 sal_uInt16 nRef; 392 393 ImpPath_Impl(); 394 ImpPath_Impl( const ImpPath_Impl& rCopy ); 395 }; 396 397 //------------------------------------------------------------------------- 398 399 ImpPath_Impl::ImpPath_Impl() : aUS(5), nRef(1) 400 { 401 } 402 403 //------------------------------------------------------------------------- 404 405 ImpPath_Impl::ImpPath_Impl( const ImpPath_Impl& rCopy ) : 406 407 aUS ( (sal_uInt8)rCopy.aUS.Count() ), 408 nRef( 1 ) 409 410 { 411 const sal_uInt16 nCount = rCopy.aUS.Count(); 412 413 for ( sal_uInt16 i = 0; i < nCount; ++i ) 414 aUS.Insert( rCopy.aUS[i], i ); 415 } 416 417 //========================================================================== 418 419 /* [Beschreibung] 420 421 Implementierungsklasse; Darstellung einer Position in der Outline- 422 Listbox als sal_uInt16-Array; dieses beschreibt die Position jeweil 423 als relative Position zum "ubergeordneten Eintrag 424 425 */ 426 class Path 427 { 428 ImpPath_Impl *pData; 429 void NewImp(); 430 public: 431 Path(SvLBox *pBox, SvLBoxEntry *pEntry); 432 Path(const Path &rPath): 433 pData(rPath.pData) 434 { 435 ++pData->nRef; 436 } 437 const Path &operator=(const Path &rPath) 438 { 439 if(&rPath != this) 440 { 441 if(!--pData->nRef) 442 delete pData; 443 pData = rPath.pData; 444 pData->nRef++; 445 } 446 return *this; 447 } 448 ~Path() 449 { 450 if(!--pData->nRef) 451 delete pData; 452 } 453 sal_uInt16 Count() const { return pData->aUS.Count(); } 454 sal_uInt16 operator[]( sal_uInt16 i ) const 455 { 456 return i < Count()? pData->aUS[i]: INDEX_IGNORE; 457 } 458 }; 459 460 //------------------------------------------------------------------------- 461 462 Path::Path(SvLBox *pBox, SvLBoxEntry *pEntry) : 463 pData(new ImpPath_Impl) 464 { 465 DBG_ASSERT(pEntry != 0, "EntryPtr ist NULL"); 466 if(!pEntry) 467 return; 468 SvLBoxEntry *pParent = pBox->GetParent(pEntry); 469 do { 470 pData->aUS.Insert((sal_uInt16)pBox->GetModel()->GetRelPos(pEntry), 0); 471 if(0 == pParent) 472 break; 473 pEntry = pParent; 474 pParent = pBox->GetParent(pEntry); 475 } while(1); 476 } 477 478 //------------------------------------------------------------------------- 479 480 void Path::NewImp() 481 { 482 if(pData->nRef != 1) 483 { 484 pData->nRef--; 485 pData = new ImpPath_Impl(*pData); 486 } 487 } 488 489 //------------------------------------------------------------------------- 490 491 SvLBoxEntry *GetIndices_Impl(SvLBox *pBox, 492 SvLBoxEntry *pEntry, 493 sal_uInt16 &rRegion, 494 sal_uInt16 &rOffset) 495 /* [Beschreibung] 496 497 Bereich und Position innerhalb eines Bereiches f"ur eine 498 Dokumentvorlage wird ermittelt. 499 500 [Parameter] 501 502 SvLBox *pBox Listbox, an der das Ereignis auftrat 503 SvLBoxEntry *pEntry Eintrag, dessen Position ermittelt werden soll 504 sal_uInt16 &rRegion der Bereich innerhalb der Bereiche der 505 Dokumentvorlagen (Out-Parameter) 506 sal_uInt16 &rOffset die Position innerhalb des Bereiches 507 Dokumentvorlagen (Out-Parameter) 508 509 [Querverweise] 510 511 <class Path> (unter Umst"anden kann auf diese Funktion zugunsten 512 von Path verzichtet werden.) 513 514 */ 515 516 { 517 if(!pEntry) 518 { 519 rRegion = rOffset = 0; 520 return pEntry; 521 } 522 if(0 == pBox->GetModel()->GetDepth(pEntry)) 523 { 524 rRegion = (sal_uInt16)pBox->GetModel()->GetRelPos(pEntry); 525 rOffset = USHRT_MAX; 526 return pEntry; 527 } 528 SvLBoxEntry *pParent = pBox->GetParent(pEntry); 529 rRegion = (sal_uInt16)pBox->GetModel()->GetRelPos(pParent); 530 rOffset = (sal_uInt16)pBox->GetModel()->GetRelPos(pEntry); 531 return pEntry; 532 } 533 534 //------------------------------------------------------------------------- 535 536 sal_Bool SfxOrganizeListBox_Impl::Select( SvLBoxEntry* pEntry, sal_Bool bSelect ) 537 { 538 if(!bSelect) 539 return SvTreeListBox::Select(pEntry,bSelect); 540 sal_uInt16 nLevel = GetDocLevel(); 541 if(GetModel()->GetDepth(pEntry)+nLevel<3) 542 return SvTreeListBox::Select(pEntry,bSelect); 543 544 Path aPath(this, pEntry); 545 546 // it is ok to use the SfxObjectShellRef here since the object that 547 // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it 548 GetObjectShell(aPath)->TriggerHelpPI( 549 aPath[nLevel+1], aPath[nLevel+2], aPath[nLevel+3]); 550 return SvTreeListBox::Select(pEntry,bSelect); 551 } 552 553 //------------------------------------------------------------------------- 554 555 sal_Bool SfxOrganizeListBox_Impl::MoveOrCopyTemplates(SvLBox *pSourceBox, 556 SvLBoxEntry *pSource, 557 SvLBoxEntry* pTarget, 558 SvLBoxEntry *&pNewParent, 559 sal_uIntPtr &rIdx, 560 sal_Bool bCopy) 561 /* [Beschreibung] 562 563 Verschieben oder Kopieren von Dokumentvorlagen 564 565 [Parameter] 566 567 SvLBox *pSourceBox Quell-Listbox, an der das Ereignis auftrat 568 SvLBoxEntry *pSource Quell-Eintrag, der kopiert / verschoben werden soll 569 SvLBoxEntry* pTarget Ziel-Eintrag, auf den verschoben werden soll 570 SvLBoxEntry *&pNewParent der Parent der an der Zielposition erzeugten 571 Eintrags (Out-Parameter) 572 sal_uIntPtr &rIdx Index des Zieleintrags 573 sal_Bool bCopy Flag f"ur Kopieren / Verschieben 574 575 576 [Returnwert] sal_Bool: Erfolg oder Mi"serfolg 577 578 [Querverweise] 579 580 <SfxOrganizeListBox_Impl::MoveOrCopyContents(SvLBox *pSourceBox, 581 SvLBoxEntry *pSource, 582 SvLBoxEntry* pTarget, 583 SvLBoxEntry *&pNewParent, 584 sal_uIntPtr &rIdx, 585 sal_Bool bCopy)> 586 <sal_Bool SfxOrganizeListBox_Impl::NotifyMoving(SvLBoxEntry *pTarget, 587 SvLBoxEntry* pSource, 588 SvLBoxEntry *&pNewParent, 589 sal_uIntPtr &rIdx)> 590 <sal_Bool SfxOrganizeListBox_Impl::NotifyCopying(SvLBoxEntry *pTarget, 591 SvLBoxEntry* pSource, 592 SvLBoxEntry *&pNewParent, 593 sal_uIntPtr &rIdx)> 594 */ 595 596 { 597 sal_Bool bOk = sal_False; 598 599 if(pSource) 600 { 601 sal_uInt16 nTargetRegion = 0, nTargetIndex = 0; 602 GetIndices_Impl(this, pTarget, nTargetRegion, nTargetIndex); 603 604 sal_uInt16 nSourceRegion = 0, nSourceIndex = 0; 605 GetIndices_Impl(pSourceBox, pSource, nSourceRegion, nSourceIndex); 606 607 bOk = bCopy ? 608 pMgr->Copy(nTargetRegion, nTargetIndex+1, 609 nSourceRegion, nSourceIndex): 610 pMgr->Move(nTargetRegion, nTargetIndex+1, 611 nSourceRegion, nSourceIndex); 612 613 if(bOk) 614 { 615 if(pSourceBox->GetModel()->GetDepth(pSource) == GetModel()->GetDepth(pTarget)) 616 { 617 pNewParent = GetParent(pTarget); 618 rIdx = GetModel()->GetRelPos(pTarget)+1; 619 } 620 else 621 { 622 if(nTargetIndex == USHRT_MAX) 623 { 624 pNewParent = pTarget; 625 rIdx = 0; 626 } 627 else 628 SvLBox::NotifyCopying( 629 pTarget, pSource, pNewParent, rIdx); 630 } 631 } 632 else if ( bCopy ) 633 { 634 // the template organizer always tries copy after the move, so no error is required for move case 635 String aText( SfxResId( bCopy ? STR_ERROR_COPY_TEMPLATE : STR_ERROR_MOVE_TEMPLATE ) ); 636 aText.SearchAndReplaceAscii( "$1", 637 ( (SvTreeListBox *)pSourceBox )->GetEntryText( pSource ) ); 638 ErrorBox( this, WB_OK, aText ).Execute(); 639 } 640 } 641 return bOk; 642 } 643 644 //------------------------------------------------------------------------- 645 646 sal_Bool SfxOrganizeListBox_Impl::MoveOrCopyContents(SvLBox *pSourceBox, 647 SvLBoxEntry *pSource, 648 SvLBoxEntry* pTarget, 649 SvLBoxEntry *&pNewParent, 650 sal_uIntPtr &rIdx, 651 sal_Bool bCopy) 652 /* [Beschreibung] 653 654 Verschieben oder Kopieren von Dokumentinhalten 655 656 [Parameter] 657 658 SvLBox *pSourceBox Quell-Listbox, an der das Ereignis auftrat 659 SvLBoxEntry *pSource Quell-Eintrag, der kopiert / verschoben werden soll 660 SvLBoxEntry* pTarget Ziel-Eintrag, auf den verschoben werden soll 661 SvLBoxEntry *&pNewParent der Parent der an der Zielposition erzeugten 662 Eintrags (Out-Parameter) 663 sal_uIntPtr &rIdx Index des Zieleintrags 664 sal_Bool bCopy Flag f"ur Kopieren / Verschieben 665 666 667 [Returnwert] sal_Bool: Erfolg oder Mi"serfolg 668 669 [Querverweise] 670 671 <SfxOrganizeListBox_Impl::MoveOrCopyTemplates(SvLBox *pSourceBox, 672 SvLBoxEntry *pSource, 673 SvLBoxEntry* pTarget, 674 SvLBoxEntry *&pNewParent, 675 sal_uIntPtr &rIdx, 676 sal_Bool bCopy)> 677 <sal_Bool SfxOrganizeListBox_Impl::NotifyMoving(SvLBoxEntry *pTarget, 678 SvLBoxEntry* pSource, 679 SvLBoxEntry *&pNewParent, 680 sal_uIntPtr &rIdx)> 681 <sal_Bool SfxOrganizeListBox_Impl::NotifyCopying(SvLBoxEntry *pTarget, 682 SvLBoxEntry* pSource, 683 SvLBoxEntry *&pNewParent, 684 sal_uIntPtr &rIdx)> 685 */ 686 687 { 688 SfxErrorContext aEc( ERRCTX_SFX_MOVEORCOPYCONTENTS, this); 689 sal_Bool bOk = sal_False, bKeepExpansion = sal_False; 690 sal_Bool bRemovedFromSource = sal_False; 691 Path aSource(pSourceBox, pSource); 692 Path aTarget(this, pTarget); 693 694 // it is ok to use the SfxObjectShellRef here since the object that 695 // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it 696 SfxObjectShellRef aSourceDoc = ((SfxOrganizeListBox_Impl *)pSourceBox)->GetObjectShell(aSource); 697 SfxObjectShellRef aTargetDoc = GetObjectShell(aTarget); 698 699 const sal_uInt16 nSLevel = 700 ((SfxOrganizeListBox_Impl *)pSourceBox)->GetDocLevel(); 701 const sal_uInt16 nTLevel = GetDocLevel(); 702 703 if(aSourceDoc.Is() && aTargetDoc.Is()) 704 { 705 if (aSourceDoc->GetStyleSheetPool()) 706 aSourceDoc->GetStyleSheetPool()->SetSearchMask( 707 SFX_STYLE_FAMILY_ALL, SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED); 708 709 if (aTargetDoc->GetStyleSheetPool()) 710 aTargetDoc->GetStyleSheetPool()->SetSearchMask( 711 SFX_STYLE_FAMILY_ALL, SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED); 712 sal_uInt16 p[3]; 713 sal_uInt16 nIdxDeleted = INDEX_IGNORE; 714 p[0]=aTarget[nTLevel+1]; 715 p[1]=aTarget[nTLevel+2]; 716 if(p[1]!=INDEX_IGNORE)p[1]++; 717 p[2]=aTarget[nTLevel+3]; 718 719 bOk = aTargetDoc->Insert( 720 *aSourceDoc, aSource[nSLevel+1], 721 aSource[nSLevel+2], aSource[nSLevel+3], 722 p[0], p[1], p[2], nIdxDeleted); 723 // Positionskorrektur auswerten 724 // a = Dokumentinhalt 725 // b = Position Sub-Inhalt 1 726 // c = Position Sub-Inhalt 2 727 // doppelte Eintraege loeschen 728 if(bOk) 729 { 730 SvLBoxEntry *pParentIter = pTarget; 731 // bis auf die DokumentEbene nach oben als 732 // allgemeiner Bezugspunkt 733 while(GetModel()->GetDepth(pParentIter) != nTLevel) 734 pParentIter = GetParent(pParentIter); 735 if(pParentIter->HasChildsOnDemand() && 736 !GetModel()->HasChilds(pParentIter)) 737 RequestingChilds(pParentIter); 738 SvLBoxEntry *pChildIter = 0; 739 740 sal_uInt16 i = 0; 741 while(i < 2 && p[i+1] != INDEX_IGNORE) 742 { 743 pChildIter = FirstChild(pParentIter); 744 // bis zum Index der aktuellen Ebene 745 for(sal_uInt16 j = 0; j < p[i]; ++j) 746 pChildIter = NextSibling(pChildIter); 747 // gfs Fuellen bei Items onDemand 748 ++i; 749 if((i < 2) && p[i+1] != INDEX_IGNORE && 750 pChildIter->HasChildsOnDemand() && 751 !GetModel()->HasChilds(pChildIter)) 752 RequestingChilds(pChildIter); 753 pParentIter = pChildIter; 754 } 755 rIdx = p[i]; 756 pNewParent = pParentIter; 757 if(!IsExpanded(pNewParent) && 758 pNewParent->HasChildsOnDemand() && 759 !GetModel()->HasChilds(pNewParent)) 760 { 761 bOk = sal_False; 762 if(!bCopy) 763 pSourceBox->GetModel()->Remove(pSource); 764 } 765 // Geloeschte Eintraege entfernen 766 // (kann durch Ueberschreiben geschehen) 767 if(nIdxDeleted != INDEX_IGNORE) 768 { 769 pChildIter = FirstChild(pParentIter); 770 for(sal_uInt16 j = 0; j < nIdxDeleted; ++j) 771 pChildIter = NextSibling(pChildIter); 772 if( pChildIter && pChildIter != pSource ) 773 { 774 bKeepExpansion = IsExpanded(pParentIter); 775 GetModel()->Remove(pChildIter); 776 } 777 else 778 bOk = sal_False; 779 } 780 if(!bCopy && &aSourceDoc != &aTargetDoc) 781 { 782 //#109566# pool styles that are moved produce 783 //an rIdx == INDEX_IGNORE 784 //the method has to return true to keep the box content consistent 785 bRemovedFromSource = aSourceDoc->Remove(aSource[nSLevel+1], 786 aSource[nSLevel+2], 787 aSource[nSLevel+3]); 788 } 789 } 790 } 791 // rIdx++; 792 return (((rIdx != INDEX_IGNORE)|| bRemovedFromSource) && bOk ) 793 ? bKeepExpansion? (sal_Bool)2: sal_True: sal_False; 794 } 795 796 //------------------------------------------------------------------------- 797 798 sal_Bool SfxOrganizeListBox_Impl::NotifyMoving(SvLBoxEntry *pTarget, 799 SvLBoxEntry* pSource, 800 SvLBoxEntry *&pNewParent, 801 sal_uIntPtr &rIdx) 802 803 /* [Beschreibung] 804 805 Benachrichtigung, da"s ein Eintrag verschoben werden soll 806 (SV-Handler) 807 808 [Parameter] 809 810 SvLBoxEntry* pTarget Ziel-Eintrag, auf den verschoben werden soll 811 SvLBoxEntry *pSource Quell-Eintrag, der verschoben werden soll 812 SvLBoxEntry *&pNewParent der Parent der an der Zielposition erzeugten 813 Eintrags (Out-Parameter) 814 sal_uIntPtr &rIdx Index des Zieleintrags 815 816 817 [Returnwert] sal_Bool: Erfolg oder Mi"serfolg 818 819 [Querverweise] 820 821 <SfxOrganizeListBox_Impl::MoveOrCopyTemplates(SvLBox *pSourceBox, 822 SvLBoxEntry *pSource, 823 SvLBoxEntry* pTarget, 824 SvLBoxEntry *&pNewParent, 825 sal_uIntPtr &rIdx, 826 sal_Bool bCopy)> 827 <SfxOrganizeListBox_Impl::MoveOrCopyContents(SvLBox *pSourceBox, 828 SvLBoxEntry *pSource, 829 SvLBoxEntry* pTarget, 830 SvLBoxEntry *&pNewParent, 831 sal_uIntPtr &rIdx, 832 sal_Bool bCopy)> 833 <sal_Bool SfxOrganizeListBox_Impl::NotifyCopying(SvLBoxEntry *pTarget, 834 SvLBoxEntry* pSource, 835 SvLBoxEntry *&pNewParent, 836 sal_uIntPtr &rIdx)> 837 */ 838 839 { 840 sal_Bool bOk = sal_False; 841 SvLBox* pSourceBox = GetSourceView(); 842 if ( !pSourceBox ) 843 pSourceBox = pDlg->pSourceView; 844 DBG_ASSERT( pSourceBox, "no source view" ); 845 if ( !pTarget ) 846 pTarget = pDlg->pTargetEntry; 847 848 if ( pSourceBox->GetModel()->GetDepth( pSource ) <= GetDocLevel() && 849 GetModel()->GetDepth( pTarget ) <= GetDocLevel() ) 850 bOk = MoveOrCopyTemplates( pSourceBox, pSource, pTarget, pNewParent, rIdx, sal_False ); 851 else 852 bOk = MoveOrCopyContents(pSourceBox, pSource, pTarget, pNewParent, rIdx, sal_False ); 853 854 return bOk; 855 } 856 857 //------------------------------------------------------------------------- 858 859 sal_Bool SfxOrganizeListBox_Impl::NotifyCopying(SvLBoxEntry *pTarget, 860 SvLBoxEntry* pSource, 861 SvLBoxEntry *&pNewParent, 862 sal_uIntPtr &rIdx) 863 /* [Beschreibung] 864 865 Benachrichtigung, da"s ein Eintrag kopiert werden soll 866 (SV-Handler) 867 868 [Parameter] 869 870 SvLBoxEntry* pTarget Ziel-Eintrag, auf den kopiert werden soll 871 SvLBoxEntry *pSource Quell-Eintrag, der kopiert werden soll 872 SvLBoxEntry *&pNewParent der Parent der an der Zielposition erzeugten 873 Eintrags (Out-Parameter) 874 sal_uIntPtr &rIdx Index des Zieleintrags 875 876 877 [Returnwert] sal_Bool: Erfolg oder Mi"serfolg 878 879 [Querverweise] 880 881 <SfxOrganizeListBox_Impl::MoveOrCopyTemplates(SvLBox *pSourceBox, 882 SvLBoxEntry *pSource, 883 SvLBoxEntry* pTarget, 884 SvLBoxEntry *&pNewParent, 885 sal_uIntPtr &rIdx, 886 sal_Bool bCopy)> 887 <SfxOrganizeListBox_Impl::MoveOrCopyContents(SvLBox *pSourceBox, 888 SvLBoxEntry *pSource, 889 SvLBoxEntry* pTarget, 890 SvLBoxEntry *&pNewParent, 891 sal_uIntPtr &rIdx, 892 sal_Bool bCopy)> 893 <sal_Bool SfxOrganizeListBox_Impl::NotifyMoving(SvLBoxEntry *pTarget, 894 SvLBoxEntry* pSource, 895 SvLBoxEntry *&pNewParent, 896 sal_uIntPtr &rIdx)> 897 */ 898 { 899 sal_Bool bOk = sal_False; 900 SvLBox* pSourceBox = GetSourceView(); 901 if ( !pSourceBox ) 902 pSourceBox = pDlg->pSourceView; 903 DBG_ASSERT( pSourceBox, "no source view" ); 904 if ( !pTarget ) 905 pTarget = pDlg->pTargetEntry; 906 if ( pSourceBox->GetModel()->GetDepth( pSource ) <= GetDocLevel() && 907 GetModel()->GetDepth( pTarget ) <= GetDocLevel() ) 908 bOk = MoveOrCopyTemplates( pSourceBox, pSource, pTarget, pNewParent, rIdx, sal_True ); 909 else 910 bOk = MoveOrCopyContents( pSourceBox, pSource, pTarget, pNewParent, rIdx, sal_True ); 911 912 return bOk; 913 } 914 915 //------------------------------------------------------------------------- 916 917 sal_Bool SfxOrganizeListBox_Impl::EditingEntry( SvLBoxEntry* pEntry, Selection& ) 918 919 /* [Beschreibung] 920 921 Nachfrage, ob ein Eintrag editierbar ist 922 (SV-Handler) 923 924 [Querverweise] 925 <SfxOrganizeListBox_Impl::EditedEntry(SvLBoxEntry* pEntry, const String& rText)> 926 */ 927 928 { 929 if( VIEW_TEMPLATES == eViewType && 930 GetModel()->GetDepth(pEntry) < 2 ) 931 { 932 pDlg->pSuspend = new SuspendAccel( &pDlg->aEditAcc ); 933 return sal_True; 934 } 935 return sal_False; 936 } 937 938 //------------------------------------------------------------------------- 939 940 sal_Bool SfxOrganizeListBox_Impl::EditedEntry(SvLBoxEntry* pEntry, const String& rText) 941 942 /* [Beschreibung] 943 944 Der Name eines Eintrags wurde bearbeitet; ist der eingegebene Name 945 ein g"ultiger Name ("ange > 0), wird das Model aktualisiert. 946 (SV-Handler) 947 948 [Returnwert] 949 950 sal_Bool sal_True: der Name soll in der Anzeige ge"andert werden 951 sal_False:der Name soll nicht ge"andert werden 952 953 [Querverweise] 954 <SfxOrganizeListBox_Impl::EditingEntry(SvLBoxEntry* pEntry, const String& rText)> 955 */ 956 957 { 958 DBG_ASSERT(pEntry, "kein Entry selektiert"); 959 delete pDlg->pSuspend; 960 pDlg->pSuspend = NULL; 961 SvLBoxEntry* pParent = GetParent(pEntry); 962 if( !rText.Len() ) 963 { 964 ErrorBox aBox( this, SfxResId( MSG_ERROR_EMPTY_NAME ) ); 965 aBox.GrabFocus(); 966 aBox.Execute(); 967 return sal_False; 968 } 969 if ( !IsUniqName_Impl( rText, pParent, pEntry ) ) 970 { 971 ErrorBox aBox( this, SfxResId( MSG_ERROR_UNIQ_NAME ) ); 972 aBox.GrabFocus(); 973 aBox.Execute(); 974 return sal_False; 975 } 976 sal_uInt16 nRegion = 0, nIndex = 0; 977 GetIndices_Impl( this, pEntry, nRegion, nIndex ); 978 String aOldName; 979 if ( USHRT_MAX != nIndex ) 980 aOldName = pMgr->GetTemplates()->GetName( nRegion, nIndex ); 981 else 982 aOldName = pMgr->GetTemplates()->GetRegionName( nRegion ); 983 984 if ( !pMgr->SetName( rText, nRegion, nIndex ) ) 985 { 986 SfxResId aResId( USHRT_MAX != nIndex ? MSG_ERROR_RENAME_TEMPLATE 987 : MSG_ERROR_RENAME_TEMPLATE_REGION ); 988 ErrorBox( this, aResId ).Execute(); 989 return sal_False; 990 } 991 /* 992 else 993 { 994 SfxTemplateOrganizeDlg* pDlg = (SfxTemplateOrganizeDlg*)Window::GetParent(); 995 } 996 */ 997 return sal_True; 998 } 999 1000 //------------------------------------------------------------------------- 1001 1002 DragDropMode SfxOrganizeListBox_Impl::NotifyStartDrag( TransferDataContainer&, SvLBoxEntry* pEntry ) 1003 { 1004 sal_uInt16 nSourceLevel = GetModel()->GetDepth( pEntry ); 1005 if ( VIEW_FILES == GetViewType() ) 1006 ++nSourceLevel; 1007 if ( nSourceLevel >= 2 ) 1008 bDropMoveOk = sal_False; 1009 else 1010 bDropMoveOk = sal_True; 1011 1012 return GetDragDropMode(); 1013 } 1014 1015 //------------------------------------------------------------------------- 1016 1017 sal_Bool SfxOrganizeListBox_Impl::NotifyAcceptDrop( SvLBoxEntry* pEntry ) 1018 { 1019 if(!pEntry) 1020 return sal_False; 1021 SvLBox *pSource = GetSourceView(); 1022 SvLBoxEntry *pSourceEntry = pSource->FirstSelected(); 1023 if(pEntry == pSourceEntry) 1024 return sal_False; 1025 sal_uInt16 nSourceLevel = pSource->GetModel()->GetDepth(pSourceEntry); 1026 if(VIEW_FILES == ((SfxOrganizeListBox_Impl *)pSource)->GetViewType()) 1027 ++nSourceLevel; 1028 sal_uInt16 nTargetLevel = GetModel()->GetDepth(pEntry); 1029 if(VIEW_FILES == GetViewType()) 1030 ++nTargetLevel; 1031 Path aSource(pSource, pSourceEntry); 1032 Path aTarget(this, pEntry); 1033 const sal_uInt16 SL = ((SfxOrganizeListBox_Impl *)pSource)->GetDocLevel(); 1034 const sal_uInt16 TL = GetDocLevel(); 1035 1036 return( (nSourceLevel == 1 && nTargetLevel == 0 && 1037 VIEW_TEMPLATES == 1038 ((SfxOrganizeListBox_Impl *)pSource)->GetViewType()) || 1039 (nSourceLevel == 1 && nTargetLevel == 1 && 1040 VIEW_TEMPLATES == 1041 ((SfxOrganizeListBox_Impl *)pSource)->GetViewType() && 1042 VIEW_TEMPLATES == GetViewType()) || 1043 (nSourceLevel == 3 && nTargetLevel == 1) || 1044 (nSourceLevel == 3 && nTargetLevel == 2 && 1045 aSource[1+SL] == aTarget[1+TL]) || 1046 (nSourceLevel == 3 && nTargetLevel == 3 && 1047 aSource[1+SL] == aTarget[1+TL]) || 1048 (nSourceLevel == 4 && nTargetLevel == 3 && 1049 aSource[1+SL] == aTarget[1+TL] && 1050 aSource[2+SL] == aTarget[2+TL]) || 1051 (nSourceLevel == 4 && nTargetLevel == 4 && 1052 aSource[1+SL] == aTarget[1+TL] && 1053 aSource[2+SL] == aTarget[2+TL])); 1054 } 1055 1056 //------------------------------------------------------------------------- 1057 1058 sal_Int8 SfxOrganizeListBox_Impl::AcceptDrop( const AcceptDropEvent& rEvt ) 1059 { 1060 sal_Bool bAccept = ( eViewType == VIEW_FILES && IsDropFormatSupported( SOT_FORMAT_FILE ) ); 1061 if ( bAccept ) 1062 return rEvt.mnAction; 1063 else 1064 return SvTreeListBox::AcceptDrop( rEvt ); 1065 } 1066 1067 //------------------------------------------------------------------------- 1068 1069 sal_Int8 SfxOrganizeListBox_Impl::ExecuteDrop( const ExecuteDropEvent& rEvt ) 1070 { 1071 TransferableDataHelper aHelper( rEvt.maDropEvent.Transferable ); 1072 sal_uInt32 nFormatCount = aHelper.GetFormatCount(); 1073 sal_Bool bSuccess = sal_False; 1074 for ( sal_uInt32 i = 0; i < nFormatCount; ++i ) 1075 { 1076 String aFileName; 1077 SotFormatStringId nId = aHelper.GetFormat(i); 1078 1079 if ( SOT_FORMAT_FILE == nId && aHelper.GetString( nId, aFileName ) ) 1080 { 1081 INetURLObject aObj( aFileName, INET_PROT_FILE ); 1082 bSuccess |= pMgr->InsertFile( this, aObj.GetMainURL(INetURLObject::DECODE_TO_IURI) ); 1083 } 1084 } 1085 bDropMoveOk = sal_True; 1086 sal_Int8 nRet = rEvt.mnAction; 1087 if ( !bSuccess ) 1088 { 1089 // asynchronous, because of MessBoxes 1090 pDlg->pSourceView = GetSourceView(); 1091 pDlg->pTargetEntry = pTargetEntry; 1092 pDlg->pFinishedBox = NULL; 1093 pDlg->nDropAction = NO_DROP_ACTION; 1094 PostUserEvent( LINK( this, SfxOrganizeListBox_Impl, OnAsyncExecuteDrop ), 1095 new ExecuteDropEvent( rEvt ) ); 1096 } 1097 1098 return nRet; 1099 } 1100 1101 //------------------------------------------------------------------------- 1102 1103 void SfxOrganizeListBox_Impl::DragFinished( sal_Int8 nDropAction ) 1104 { 1105 if ( pDlg->bExecDropFinished ) 1106 { 1107 if ( pDlg->nDropAction != NO_DROP_ACTION ) 1108 nDropAction = pDlg->nDropAction; 1109 SvTreeListBox::DragFinished( nDropAction ); 1110 pDlg->nDropAction = NO_DROP_ACTION; 1111 } 1112 else 1113 pDlg->pFinishedBox = this; 1114 } 1115 1116 //------------------------------------------------------------------------- 1117 1118 inline sal_uInt16 SfxOrganizeListBox_Impl::GetDocLevel() const 1119 1120 /* [Beschreibung] 1121 1122 Ermittelt, auf welche Ebene sich Dokumente befinden (unterschiedlich 1123 in der Dokumentvorlagensicht und der Dokumentensicht) 1124 1125 [Returnwert] 1126 1127 sal_uInt16 Die Ebene der Dokumente 1128 1129 */ 1130 1131 { 1132 return eViewType == VIEW_FILES? 0: 1; 1133 } 1134 1135 //------------------------------------------------------------------------- 1136 1137 SfxObjectShellRef SfxOrganizeListBox_Impl::GetObjectShell(const Path &rPath) 1138 1139 /* [Beschreibung] 1140 1141 Zugriff auf die ObjectShell, die dem aktuellen Eintrag zugeordnet 1142 ist. 1143 1144 [Parameter] 1145 1146 const Path &rPath Beschreibung des aktuellen Eintrags 1147 1148 [Returnwert] 1149 1150 SfxObjectShellRef Referenz auf die ObjectShell 1151 1152 [Querverweise] 1153 1154 <class Path> 1155 1156 */ 1157 1158 { 1159 SfxObjectShellRef aDoc; 1160 if(eViewType == VIEW_FILES) 1161 aDoc = pMgr->CreateObjectShell(rPath[0]); 1162 else 1163 aDoc = pMgr->CreateObjectShell(rPath[0], rPath[1]); 1164 return aDoc; 1165 } 1166 1167 //------------------------------------------------------------------------- 1168 1169 void SfxOrganizeListBox_Impl::RequestingChilds( SvLBoxEntry* pEntry ) 1170 1171 /* [Beschreibung] 1172 1173 Aufforderung, der Childs eines Eintrags einzuf"ugen 1174 ist. 1175 (SV-Handler) 1176 1177 [Parameter] 1178 1179 SvLBoxEntry* pEntry der Eintrag, dessen Childs erfragt werden 1180 1181 1182 */ 1183 1184 { 1185 // wenn keine Childs vorhanden sind, gfs. Childs 1186 // einfuegen 1187 BmpColorMode eColorMode = BMP_COLOR_NORMAL; 1188 1189 if ( GetSettings().GetStyleSettings().GetHighContrastMode() ) 1190 eColorMode = BMP_COLOR_HIGHCONTRAST; 1191 1192 1193 if ( !GetModel()->HasChilds( pEntry ) ) 1194 { 1195 WaitObject aWaitCursor( this ); 1196 1197 // Choose the correct mask color dependent from eColorMode. This must be adopted if 1198 // we change the mask color for normal images, too! 1199 Color aMaskColor( COL_LIGHTMAGENTA ); 1200 1201 // hier sind alle initial eingefuegt 1202 SfxErrorContext aEc(ERRCTX_SFX_CREATEOBJSH, pDlg->pDialog); 1203 if(VIEW_TEMPLATES == GetViewType() && 0 == GetModel()->GetDepth(pEntry)) 1204 { 1205 sal_uInt16 i = (sal_uInt16)GetModel()->GetRelPos(pEntry); 1206 const sal_uInt16 nEntryCount = pMgr->GetTemplates()->GetCount(i); 1207 for(sal_uInt16 j = 0; j < nEntryCount; ++j) 1208 InsertEntryByBmpType( pMgr->GetTemplates()->GetName( i, j ), BMPTYPE_DOC, pEntry, sal_True ); 1209 } 1210 else 1211 { 1212 const sal_uInt16 nDocLevel = GetDocLevel(); 1213 Path aPath(this, pEntry); 1214 1215 // it is ok to use the SfxObjectShellRef here since the object that 1216 // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it 1217 SfxObjectShellRef aRef = GetObjectShell(aPath); 1218 if(aRef.Is()) 1219 { 1220 const sal_uInt16 nCount = aRef->GetContentCount( 1221 aPath[nDocLevel+1], aPath[nDocLevel+2]); 1222 String aText; 1223 Bitmap aClosedBmp, aOpenedBmp; 1224 const sal_Bool bCanHaveChilds = 1225 aRef->CanHaveChilds(aPath[nDocLevel+1], 1226 aPath[nDocLevel+2]); 1227 for(sal_uInt16 i = 0; i < nCount; ++i) 1228 { 1229 sal_Bool bDeletable; 1230 aRef->GetContent( 1231 aText, aClosedBmp, aOpenedBmp, eColorMode, bDeletable, 1232 i, aPath[nDocLevel+1], aPath[nDocLevel+2]); 1233 1234 // Create image with the correct mask color 1235 Image aClosedImage( aClosedBmp, aMaskColor ); 1236 Image aOpenedImage( aOpenedBmp, aMaskColor ); 1237 1238 SvLBoxEntry *pNew = SvTreeListBox::InsertEntry( 1239 aText, aOpenedImage, aClosedImage, 1240 pEntry, bCanHaveChilds); 1241 pNew->SetUserData(bDeletable ? &bDeletable : 0); 1242 } 1243 } 1244 } 1245 } 1246 } 1247 1248 //------------------------------------------------------------------------- 1249 1250 long SfxOrganizeListBox_Impl::ExpandingHdl() 1251 1252 /* [Beschreibung] 1253 1254 SV-Handler, der nach dem und vor dem Aufklappen eines Eintrags 1255 gerufen wird. 1256 Wird verwendet, um gfs. die ObjectShell wieder zu schlie"sen; 1257 die Eintr"age mit den Inhalten dieser Shell werden ebenfalls 1258 entfernt. 1259 1260 */ 1261 1262 { 1263 if ( !(nImpFlags & SVLBOX_IS_EXPANDING) ) 1264 { 1265 SvLBoxEntry* pEntry = GetHdlEntry(); 1266 const sal_uInt16 nLevel = GetModel()->GetDepth(pEntry); 1267 if((eViewType == VIEW_FILES && nLevel == 0) || 1268 (eViewType == VIEW_TEMPLATES && nLevel == 1)) 1269 { 1270 Path aPath(this, pEntry); 1271 // Beim Schliessen des Files die ObjectShell freigeben 1272 if(eViewType == VIEW_FILES && nLevel == 0) 1273 pMgr->DeleteObjectShell(aPath[0]); 1274 else 1275 pMgr->DeleteObjectShell(aPath[0], aPath[1]); 1276 // alle SubEntries loeschen 1277 SvLBoxEntry *pToDel = SvLBox::GetEntry(pEntry, 0); 1278 while(pToDel) 1279 { 1280 GetModel()->Remove(pToDel); 1281 pToDel = SvLBox::GetEntry(pEntry, 0); 1282 } 1283 } 1284 } 1285 return sal_True; 1286 } 1287 1288 //------------------------------------------------------------------------- 1289 1290 sal_Bool SfxOrganizeListBox_Impl::IsUniqName_Impl(const String &rText, 1291 SvLBoxEntry* pParent, SvLBoxEntry *pEntry) const 1292 1293 /* [Beschreibung] 1294 1295 Pr"uft, ob eine Name auf seiner Ebene eindeutig ist. 1296 1297 [Parameter] 1298 1299 const String & Name des zu suchenden Eintrags 1300 SvLBoxEntry* pSibling Geschwister (bezeichnet die Ebene) 1301 1302 [Returnwert] 1303 1304 sal_Bool sal_True, wenn der Name eindeutig ist, sonst sal_False 1305 */ 1306 1307 { 1308 SvLBoxEntry* pChild = FirstChild(pParent); 1309 while(pChild) { 1310 const String aEntryText(GetEntryText(pChild)); 1311 if(COMPARE_EQUAL == aEntryText.CompareIgnoreCaseToAscii(rText)&&(!pEntry || pEntry!=pChild)) 1312 return sal_False; 1313 pChild = NextSibling(pChild); 1314 } 1315 return sal_True; 1316 } 1317 1318 //------------------------------------------------------------------------- 1319 1320 sal_uInt16 SfxOrganizeListBox_Impl::GetLevelCount_Impl(SvLBoxEntry* pParent) const 1321 { 1322 SvLBoxEntry* pChild = FirstChild(pParent); 1323 sal_uInt16 nCount = 0; 1324 while(pChild) { 1325 pChild = NextSibling(pChild); 1326 ++nCount; 1327 } 1328 return nCount; 1329 } 1330 1331 //------------------------------------------------------------------------- 1332 1333 SvLBoxEntry* SfxOrganizeListBox_Impl::InsertEntryByBmpType( const XubString& rText, BMPTYPE eBmpType, 1334 SvLBoxEntry* pParent, sal_Bool bChildsOnDemand, sal_uIntPtr nPos, void* pUserData ) 1335 { 1336 SvLBoxEntry* pEntry = NULL; 1337 const Image* pExp = NULL; 1338 const Image* pCol = NULL; 1339 const Image* pExpHC = NULL; 1340 const Image* pColHC = NULL; 1341 1342 switch( eBmpType ) 1343 { 1344 case BMPTYPE_FOLDER: 1345 pExp = &aOpenedFolderBmp; 1346 pCol = &aClosedFolderBmp; 1347 pExpHC = &aOpenedFolderBmpHC; 1348 pColHC = &aClosedFolderBmpHC; 1349 break; 1350 default: 1351 DBG_ERROR( "SfxOrganizeListBox_Impl::InsertEntryByBmpType(): something forgotten?!" ); 1352 1353 case BMPTYPE_DOC: 1354 pExp = &aOpenedDocBmp; 1355 pCol = &aClosedDocBmp; 1356 pExpHC = &aOpenedDocBmpHC; 1357 pColHC = &aClosedDocBmpHC; 1358 break; 1359 } 1360 1361 pEntry = SvTreeListBox::InsertEntry( rText, *pExp, *pCol, pParent, bChildsOnDemand, nPos, pUserData ); 1362 1363 SetExpandedEntryBmp( pEntry, *pExpHC, BMP_COLOR_HIGHCONTRAST ); 1364 SetCollapsedEntryBmp( pEntry, *pColHC, BMP_COLOR_HIGHCONTRAST ); 1365 1366 return pEntry; 1367 } 1368 1369 //------------------------------------------------------------------------- 1370 1371 SfxOrganizeListBox_Impl::SfxOrganizeListBox_Impl 1372 ( 1373 SfxOrganizeDlg_Impl* pArgDlg, 1374 Window* pParent, 1375 WinBits nBits, 1376 DataEnum eType 1377 ) : 1378 1379 SvTreeListBox( pParent, nBits ), 1380 1381 pMgr ( NULL ), 1382 pDlg ( pArgDlg ), 1383 eViewType ( eType ) 1384 1385 /* [Beschreibung] 1386 1387 Konstruktor SfxOrganizeListBox 1388 1389 */ 1390 1391 { 1392 SetDragDropMode( 1393 SV_DRAGDROP_CTRL_MOVE | SV_DRAGDROP_CTRL_COPY | 1394 SV_DRAGDROP_APP_MOVE | SV_DRAGDROP_APP_COPY | SV_DRAGDROP_APP_DROP ); 1395 SetEntryHeight( 16 ); 1396 SetSelectionMode( SINGLE_SELECTION ); 1397 GetModel()->SetSortMode( SortNone ); 1398 1399 EnableContextMenuHandling(); 1400 } 1401 1402 //------------------------------------------------------------------------- 1403 1404 IMPL_LINK( SfxOrganizeListBox_Impl, OnAsyncExecuteDrop, ExecuteDropEvent*, pEvent ) 1405 { 1406 DBG_ASSERT( pEvent, "invalid DropEvent" ); 1407 if ( pEvent ) 1408 { 1409 SvLBox* pSourceView = GetSourceView(); 1410 if ( !pSourceView ) 1411 pSourceView = pDlg->pSourceView; 1412 pDlg->bExecDropFinished = false; 1413 // if a template can not be moved it should be copied 1414 if ( pEvent->mnAction == DND_ACTION_MOVE ) 1415 pEvent->mnAction = DND_ACTION_COPYMOVE; 1416 pDlg->nDropAction = SvTreeListBox::ExecuteDrop( *pEvent, pSourceView ); 1417 delete pEvent; 1418 pDlg->pSourceView = NULL; 1419 pDlg->pTargetEntry = NULL; 1420 pDlg->bExecDropFinished = true; 1421 if ( pDlg->pFinishedBox ) 1422 { 1423 pDlg->pFinishedBox->DragFinished( pDlg->nDropAction ); 1424 pDlg->pFinishedBox = NULL; 1425 } 1426 } 1427 return 0; 1428 } 1429 1430 //------------------------------------------------------------------------- 1431 1432 void SfxOrganizeListBox_Impl::Reset() 1433 1434 /* [Beschreibung] 1435 1436 Einf"ugen der Elemente in die ListBox 1437 1438 */ 1439 1440 { 1441 DBG_ASSERT( pMgr != 0, "kein Manager" ); 1442 // Inhalte l"oschen 1443 SetUpdateMode(sal_False); 1444 Clear(); 1445 if ( VIEW_TEMPLATES == eViewType ) 1446 { 1447 const sal_uInt16 nCount = pMgr->GetTemplates()->GetRegionCount(); 1448 for ( sal_uInt16 i = 0; i < nCount; ++i ) 1449 InsertEntryByBmpType( pMgr->GetTemplates()->GetFullRegionName(i), BMPTYPE_FOLDER, 0, sal_True ); 1450 } 1451 else 1452 { 1453 const SfxObjectList& rList = pMgr->GetObjectList(); 1454 const sal_uInt16 nCount = rList.Count(); 1455 for ( sal_uInt16 i = 0; i < nCount; ++i ) 1456 InsertEntryByBmpType( rList.GetBaseName(i), BMPTYPE_DOC, 0, sal_True ); 1457 1458 } 1459 SetUpdateMode(sal_True); 1460 Invalidate(); 1461 Update(); 1462 } 1463 1464 //------------------------------------------------------------------------- 1465 1466 const Image &SfxOrganizeListBox_Impl::GetClosedBmp(sal_uInt16 nLevel) const 1467 1468 /* [Beschreibung] 1469 1470 Zugriff auf die Bitmap f"ur einen geschlossenen Eintrag 1471 der jeweiligen Ebene 1472 1473 [Parameter] 1474 1475 sal_uInt16 nLevel Angabe der Ebene, 2 Ebenen sind erlaubt 1476 1477 [Returnwert] 1478 1479 const Image & das Image auf der Ebenen nLevel 1480 1481 */ 1482 1483 { 1484 sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); 1485 const Image* pRet = NULL; 1486 1487 switch( nLevel ) 1488 { 1489 default: DBG_ERROR( "Bitmaps ueberindiziert" ); 1490 1491 case 0: pRet = bHC? &aClosedFolderBmpHC : &aClosedFolderBmp; break; 1492 case 1: pRet = bHC? &aClosedDocBmpHC : &aClosedDocBmp; break; 1493 } 1494 1495 return *pRet; 1496 } 1497 1498 //------------------------------------------------------------------------- 1499 1500 const Image &SfxOrganizeListBox_Impl::GetOpenedBmp(sal_uInt16 nLevel) const 1501 1502 /* [Beschreibung] 1503 1504 Zugriff auf die Bitmap f"ur einen ge"offneten Eintrag 1505 der jeweiligen Ebene 1506 1507 [Parameter] 1508 1509 sal_uInt16 nLevel Angabe der Ebene, 2 Ebenen sind erlaubt 1510 1511 [Returnwert] 1512 1513 const Image & das Image auf der Ebenen nLevel 1514 1515 */ 1516 1517 { 1518 sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); 1519 const Image* pRet = NULL; 1520 1521 switch( nLevel ) 1522 { 1523 case 0: 1524 pRet = bHC ? &aOpenedFolderBmpHC : &aOpenedFolderBmp; break; 1525 case 1: 1526 pRet = bHC ? &aOpenedDocBmpHC : &aOpenedDocBmp; break; 1527 default: 1528 pRet = bHC ? &aClosedFolderBmpHC : &aClosedFolderBmp; break; 1529 } 1530 1531 return *pRet; 1532 } 1533 1534 //------------------------------------------------------------------------- 1535 1536 PopupMenu* SfxOrganizeListBox_Impl::CreateContextMenu() 1537 { 1538 return new PopupMenu( *( pDlg->aEditBtn.GetPopupMenu() ) ); 1539 } 1540 1541 //------------------------------------------------------------------------- 1542 1543 String SfxOrganizeDlg_Impl::GetPath_Impl( sal_Bool bOpen, const String& rFileName ) 1544 1545 /* [Beschreibung] 1546 1547 Pfad per FileDialog erfragen, f"ur Import / Export von 1548 Dokumentvorlagen 1549 1550 [Parameter] 1551 1552 sal_Bool bOpen Flag: "Offnen / Speichern 1553 const String& rFileName aktueller Dateiname als Vorschlag 1554 1555 [R"uckgabewert] Dateiname mit Pfad oder Leerstring, wenn 1556 der Benutzer 'Abbrechen' gedr"uckt hat 1557 */ 1558 1559 { 1560 String aPath; 1561 m_sExtension4Save = DEFINE_CONST_UNICODE( "vor" ); 1562 sal_Int16 nDialogType = bOpen 1563 ? com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE 1564 : com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE; 1565 if ( pFileDlg ) 1566 delete pFileDlg; 1567 pFileDlg = new sfx2::FileDialogHelper( nDialogType, 0L ); 1568 1569 // add "All" filter 1570 pFileDlg->AddFilter( String( SfxResId( STR_SFX_FILTERNAME_ALL ) ), 1571 DEFINE_CONST_UNICODE( FILEDIALOG_FILTER_ALL ) ); 1572 // add template filter 1573 String sFilterName( SfxResId( STR_TEMPLATE_FILTER ) ); 1574 String sFilterExt; 1575 // add filters of modules which are installed 1576 SvtModuleOptions aModuleOpt; 1577 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) 1578 sFilterExt += DEFINE_CONST_UNICODE( "*.ott;*.stw;*.oth" ); 1579 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) ) 1580 { 1581 if ( sFilterExt.Len() > 0 ) 1582 sFilterExt += ';'; 1583 sFilterExt += DEFINE_CONST_UNICODE( "*.ots;*.stc" ); 1584 } 1585 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) ) 1586 { 1587 if ( sFilterExt.Len() > 0 ) 1588 sFilterExt += ';'; 1589 sFilterExt += DEFINE_CONST_UNICODE( "*.otp;*.sti" ); 1590 } 1591 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) ) 1592 { 1593 if ( sFilterExt.Len() > 0 ) 1594 sFilterExt += ';'; 1595 sFilterExt += DEFINE_CONST_UNICODE( "*.otg;*.std" ); 1596 } 1597 if ( sFilterExt.Len() > 0 ) 1598 sFilterExt += ';'; 1599 sFilterExt += DEFINE_CONST_UNICODE( "*.vor" ); 1600 1601 sFilterName += DEFINE_CONST_UNICODE( " (" ); 1602 sFilterName += sFilterExt; 1603 sFilterName += ')'; 1604 pFileDlg->AddFilter( sFilterName, sFilterExt ); 1605 pFileDlg->SetCurrentFilter( sFilterName ); 1606 1607 if ( aLastDir.Len() || rFileName.Len() ) 1608 { 1609 INetURLObject aObj; 1610 if ( aLastDir.Len() ) 1611 { 1612 aObj.SetURL( aLastDir ); 1613 if ( rFileName.Len() ) 1614 aObj.insertName( rFileName ); 1615 } 1616 else 1617 aObj.SetURL( rFileName ); 1618 1619 if ( aObj.hasExtension() ) 1620 { 1621 m_sExtension4Save = aObj.getExtension( 1622 INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET ); 1623 aObj.removeExtension(); 1624 } 1625 1626 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" ); 1627 pFileDlg->SetDisplayDirectory( aObj.GetMainURL( INetURLObject::NO_DECODE ) ); 1628 } 1629 1630 pFileDlg->StartExecuteModal( LINK( this, SfxOrganizeDlg_Impl, ImportHdl ) ); 1631 1632 return aPath; 1633 } 1634 1635 //------------------------------------------------------------------------- 1636 1637 ::com::sun::star::uno::Sequence< ::rtl::OUString > 1638 SfxOrganizeDlg_Impl::GetPaths_Impl( const String& rFileName ) 1639 1640 /* [Description] 1641 1642 Query plural paths by FileDialog, for Import / Export from document 1643 templates 1644 1645 [Parameter] 1646 1647 const String& rFileName The default file name when dialog executes 1648 1649 [Return value] Empty sequence when users have clicked 1650 'Cancel', a sequence just containing one 1651 file name with path when they have 1652 choosed one file or a sequence containing 1653 path and file names without path 1654 */ 1655 1656 { 1657 ::com::sun::star::uno::Sequence< ::rtl::OUString > aPaths; 1658 m_sExtension4Save = DEFINE_CONST_UNICODE( "vor" ); 1659 if ( pFileDlg ) 1660 delete pFileDlg; 1661 pFileDlg = new sfx2::FileDialogHelper( 1662 com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, SFXWB_MULTISELECTION ); 1663 1664 // add "All" filter 1665 pFileDlg->AddFilter( String( SfxResId( STR_SFX_FILTERNAME_ALL ) ), 1666 DEFINE_CONST_UNICODE( FILEDIALOG_FILTER_ALL ) ); 1667 1668 // add template filter 1669 String sFilterName( SfxResId( STR_TEMPLATE_FILTER ) ); 1670 String sFilterExt; 1671 // add filters of modules which are installed 1672 SvtModuleOptions aModuleOpt; 1673 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) 1674 sFilterExt += DEFINE_CONST_UNICODE( "*.ott;*.stw;*.oth" ); 1675 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) ) 1676 { 1677 if ( sFilterExt.Len() > 0 ) 1678 sFilterExt += ';'; 1679 sFilterExt += DEFINE_CONST_UNICODE( "*.ots;*.stc" ); 1680 } 1681 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) ) 1682 { 1683 if ( sFilterExt.Len() > 0 ) 1684 sFilterExt += ';'; 1685 sFilterExt += DEFINE_CONST_UNICODE( "*.otp;*.sti" ); 1686 } 1687 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) ) 1688 { 1689 if ( sFilterExt.Len() > 0 ) 1690 sFilterExt += ';'; 1691 sFilterExt += DEFINE_CONST_UNICODE( "*.otg;*.std" ); 1692 } 1693 if ( sFilterExt.Len() > 0 ) 1694 sFilterExt += ';'; 1695 sFilterExt += DEFINE_CONST_UNICODE( "*.vor" ); 1696 1697 sFilterName += DEFINE_CONST_UNICODE( " (" ); 1698 sFilterName += sFilterExt; 1699 sFilterName += ')'; 1700 pFileDlg->AddFilter( sFilterName, sFilterExt ); 1701 pFileDlg->SetCurrentFilter( sFilterName ); 1702 1703 if ( aLastDir.Len() || rFileName.Len() ) 1704 { 1705 INetURLObject aObj; 1706 if ( aLastDir.Len() ) 1707 { 1708 aObj.SetURL( aLastDir ); 1709 if ( rFileName.Len() ) 1710 aObj.insertName( rFileName ); 1711 } 1712 else 1713 aObj.SetURL( rFileName ); 1714 1715 if ( aObj.hasExtension() ) 1716 { 1717 m_sExtension4Save = aObj.getExtension( 1718 INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET ); 1719 aObj.removeExtension(); 1720 } 1721 1722 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" ); 1723 pFileDlg->SetDisplayDirectory( aObj.GetMainURL( INetURLObject::NO_DECODE ) ); 1724 } 1725 1726 pFileDlg->StartExecuteModal( LINK( this, SfxOrganizeDlg_Impl, ExportHdl ) ); 1727 1728 return aPaths; 1729 } 1730 1731 //------------------------------------------------------------------------- 1732 1733 sal_Bool SfxOrganizeDlg_Impl::DontDelete_Impl( SvLBoxEntry* pEntry ) 1734 { 1735 sal_uInt16 nDepth = pFocusBox->GetModel()->GetDepth(pEntry); 1736 if(SfxOrganizeListBox_Impl::VIEW_FILES == 1737 pFocusBox->GetViewType()) 1738 nDepth++; 1739 if( (nDepth > 2 && !pEntry->GetUserData()) || 1740 //Delete ueber GetContent verboten 1741 nDepth==2 || //Vorlage / Konfigurtionsrubrik nicht loeshcen 1742 (nDepth==1 && SfxOrganizeListBox_Impl::VIEW_FILES == 1743 pFocusBox->GetViewType()) || //Files nicht loeschen 1744 (0 == nDepth && pFocusBox->GetLevelCount_Impl(0) < 2)) 1745 //Mindestens eine Vorlage behalten 1746 { 1747 return sal_True; 1748 } 1749 1750 sal_uInt16 nRegion = 0, nIndex = 0; 1751 GetIndices_Impl( pFocusBox, pEntry, nRegion, nIndex ); 1752 const SfxDocumentTemplates* pTemplates = aMgr.GetTemplates(); 1753 if ( !pTemplates || !pTemplates->HasUserContents( nRegion, nIndex ) ) 1754 return sal_True; 1755 1756 return sal_False; 1757 } 1758 1759 SvStringsDtor* SfxOrganizeDlg_Impl::GetAllFactoryURLs_Impl( ) const 1760 { 1761 SvtModuleOptions aModOpt; 1762 const ::com::sun::star::uno::Sequence < ::rtl::OUString >& aServiceNames = aModOpt.GetAllServiceNames() ; 1763 SvStringsDtor* pList = new SvStringsDtor; 1764 sal_Int32 nCount = aServiceNames.getLength(); 1765 for( sal_Int32 i=0; i<nCount; ++i ) 1766 { 1767 if ( SfxObjectFactory::GetStandardTemplate( aServiceNames[i] ).Len() > 0 ) 1768 { 1769 SvtModuleOptions::EFactory eFac = SvtModuleOptions::E_WRITER; 1770 SvtModuleOptions::ClassifyFactoryByName( aServiceNames[i], eFac ); 1771 String* pURL = new String( aModOpt.GetFactoryEmptyDocumentURL( eFac ) ); 1772 pList->Insert( pURL, pList->Count() ); 1773 } 1774 } 1775 1776 return pList; 1777 } 1778 1779 sal_Bool SfxOrganizeDlg_Impl::GetServiceName_Impl( String& rName, String& rFileURL ) const 1780 { 1781 sal_Bool bRet = sal_False; 1782 const SfxDocumentTemplates* pTemplates = aMgr.GetTemplates(); 1783 SvLBoxEntry* pEntry = pFocusBox ? pFocusBox->FirstSelected() : NULL; 1784 sal_uInt16 nRegion = 0, nIndex = 0; 1785 GetIndices_Impl( pFocusBox, pEntry, nRegion, nIndex ); 1786 rFileURL = pTemplates->GetPath( nRegion, nIndex ); 1787 if ( rFileURL.Len() > 0 ) 1788 { 1789 try 1790 { 1791 uno::Reference< embed::XStorage > xStorage = ::comphelper::OStorageHelper::GetStorageFromURL( 1792 rFileURL, 1793 embed::ElementModes::READ ); 1794 sal_uIntPtr nFormat = SotStorage::GetFormatID( xStorage ); 1795 const SfxFilter* pFilter = 1796 SFX_APP()->GetFilterMatcher().GetFilter4ClipBoardId( nFormat ); 1797 if ( pFilter ) 1798 { 1799 rName = pFilter->GetServiceName(); 1800 bRet = sal_True; 1801 } 1802 } 1803 catch( uno::Exception& ) 1804 {} 1805 } 1806 1807 return bRet; 1808 } 1809 1810 long SfxOrganizeDlg_Impl::Dispatch_Impl( sal_uInt16 nId, Menu* _pMenu ) 1811 1812 /* [Beschreibung] 1813 1814 Verarbeiten der Events aus MenuButton oder Accelerator 1815 1816 [Parameter] 1817 1818 sal_uInt16 nId ID des Events 1819 1820 [R"uckgabewert] 1: Event wurde verarbeitet, 1821 0: Event wurde nicht verarbeitet (SV-Menu) 1822 1823 */ 1824 1825 { 1826 SuspendAccel aTmp(&aEditAcc); 1827 SvLBoxEntry *pEntry = pFocusBox? pFocusBox->FirstSelected(): 0; 1828 sal_Bool bHandled = sal_True; 1829 switch(nId) 1830 { 1831 case ID_NEW: 1832 { 1833 if(!pEntry) 1834 return 1; 1835 if(pFocusBox->GetViewType() == SfxOrganizeListBox_Impl::VIEW_TEMPLATES) 1836 { 1837 if(0 == pFocusBox->GetModel()->GetDepth(pEntry)) 1838 { 1839 const String aNoName( SfxResId(STR_NONAME) ); 1840 SvLBoxEntry* pParent = pFocusBox->GetParent(pEntry); 1841 String aName(aNoName); 1842 sal_uInt16 n = 1; 1843 while(!pFocusBox->IsUniqName_Impl(aName, pParent)) 1844 { 1845 aName = aNoName; 1846 aName += String::CreateFromInt32( n++ ); 1847 } 1848 aMgr.InsertDir( pFocusBox, aName, 1849 (sal_uInt16)pFocusBox->GetModel()->GetRelPos(pEntry)+1); 1850 } 1851 } 1852 break; 1853 } 1854 1855 case ID_DELETE: 1856 { 1857 if(!pEntry || DontDelete_Impl(pEntry)) 1858 return 1; 1859 const sal_uInt16 nDepth = pFocusBox->GetModel()->GetDepth(pEntry); 1860 if(nDepth < 2) 1861 { 1862 if(0 == nDepth && pFocusBox->GetLevelCount_Impl(0) < 2) return 1; 1863 if(SfxOrganizeListBox_Impl::VIEW_TEMPLATES == pFocusBox->GetViewType()) 1864 { 1865 sal_uInt16 nResId = nDepth? STR_DELETE_TEMPLATE : 1866 STR_DELETE_REGION; 1867 if( !QueryDelete_Impl( 1868 pDialog, nResId, pFocusBox->GetEntryText(pEntry))) 1869 return 1; 1870 if ( STR_DELETE_REGION == nResId && 1871 pFocusBox->GetChildCount(pEntry)) 1872 { 1873 QueryBox aQBox(pDialog, SfxResId(MSG_REGION_NOTEMPTY)); 1874 if(RET_NO == aQBox.Execute()) 1875 return 1; 1876 } 1877 sal_uInt16 nRegion = 0, nIndex = 0; 1878 GetIndices_Impl(pFocusBox, pEntry, nRegion, nIndex); 1879 1880 sal_uInt16 nDeleteInd = ( STR_DELETE_REGION == nResId? USHRT_MAX: nIndex ); 1881 if ( !aMgr.Delete( pFocusBox, nRegion, nDeleteInd ) ) 1882 ErrorDelete_Impl( 1883 pDialog, 1884 pFocusBox->GetEntryText(pEntry), 1885 ( nDeleteInd == USHRT_MAX && pFocusBox->GetChildCount(pEntry) ) ); 1886 } 1887 } 1888 // Inhaltsformen 1889 else if(nDepth + pFocusBox->GetDocLevel() >= 2) 1890 { 1891 if(!QueryDelete_Impl(pDialog, STR_DELETE_TEMPLATE, pFocusBox->GetEntryText(pEntry))) 1892 return 1; 1893 Path aPath(pFocusBox, pEntry); 1894 1895 // it is ok to use the SfxObjectShellRef here since the object that 1896 // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it 1897 SfxObjectShellRef aRef = pFocusBox->GetObjectShell(aPath); 1898 if(aRef.Is() && 1899 aRef->Remove(aPath[1+pFocusBox->GetDocLevel()], 1900 aPath[2+pFocusBox->GetDocLevel()], 1901 aPath[3+pFocusBox->GetDocLevel()])) 1902 pFocusBox->GetModel()->Remove(pEntry); 1903 else 1904 ErrorDelete_Impl(pDialog, pFocusBox->GetEntryText(pEntry), sal_False ); 1905 } 1906 break; 1907 } 1908 1909 case ID_EDIT: 1910 { 1911 if(!pEntry) 1912 return 1; 1913 sal_uInt16 nRegion = 0, nIndex = 0; 1914 GetIndices_Impl( pFocusBox, pEntry, nRegion, nIndex ); 1915 const SfxStringItem aName( SID_FILE_NAME, aMgr.GetTemplates()->GetPath( nRegion, nIndex ) ); 1916 const SfxStringItem aLongName( SID_FILE_LONGNAME, pFocusBox->GetEntryText( pEntry ) ); 1917 const SfxStringItem aReferer( SID_REFERER, DEFINE_CONST_UNICODE( "private:user" ) ); 1918 const SfxStringItem aTargetName( SID_TARGETNAME, DEFINE_CONST_UNICODE( "_default" ) ); 1919 const SfxBoolItem aTemplateIndicator( SID_TEMPLATE, sal_False ); 1920 1921 SFX_APP()->GetAppDispatcher_Impl()->Execute( SID_OPENTEMPLATE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 1922 &aName, &aLongName, &aReferer, &aTargetName, &aTemplateIndicator, 0L ); 1923 pDialog->EndDialog( RET_EDIT_STYLE ); 1924 break; 1925 } 1926 1927 case ID_COPY_FROM: 1928 { 1929 if ( !pEntry ) 1930 return 1; 1931 m_nRegion = 0; 1932 m_nIndex = 0; 1933 GetIndices_Impl( pFocusBox, pEntry, m_nRegion, m_nIndex ); 1934 GetPaths_Impl( String() ); 1935 break; 1936 } 1937 1938 case ID_COPY_TO: 1939 { 1940 if ( !pEntry ) 1941 return 1; 1942 m_nRegion = 0; 1943 m_nIndex = 0; 1944 GetIndices_Impl( pFocusBox, pEntry, m_nRegion, m_nIndex ); 1945 GetPath_Impl( sal_False, aMgr.GetTemplates()->GetFileName( m_nRegion, m_nIndex ) ); 1946 break; 1947 } 1948 1949 case ID_RESCAN: 1950 if ( !aMgr.Rescan() ) 1951 ErrorBox( pDialog, SfxResId( MSG_ERROR_RESCAN ) ).Execute(); 1952 if ( SfxOrganizeListBox_Impl::VIEW_TEMPLATES == aLeftLb.GetViewType() ) 1953 aLeftLb.Reset(); 1954 if ( SfxOrganizeListBox_Impl::VIEW_TEMPLATES == aRightLb.GetViewType() ) 1955 aRightLb.Reset(); 1956 break; 1957 1958 case ID_PRINT: 1959 { 1960 if ( !pEntry ) 1961 return 1; 1962 Path aPath( pFocusBox, pEntry ); 1963 1964 // it is ok to use the SfxObjectShellRef here since the object that 1965 // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it 1966 SfxObjectShellRef aRef = pFocusBox->GetObjectShell( aPath ); 1967 if ( aRef.Is() ) 1968 { 1969 const sal_uInt16 nDocLevel = pFocusBox->GetDocLevel(); 1970 if ( !pPrt ) 1971 pPrt = new Printer; 1972 SvLBoxEntry *pDocEntry = pEntry; 1973 while ( pFocusBox->GetModel()->GetDepth( pDocEntry ) > nDocLevel ) 1974 pDocEntry = pFocusBox->GetParent( pDocEntry ); 1975 const String aName(pFocusBox->GetEntryText(pDocEntry)); 1976 if ( !aRef->Print( *pPrt, aPath[1+nDocLevel], 1977 aPath[2+nDocLevel], aPath[3+nDocLevel], &aName ) ) 1978 ErrorBox( pDialog, SfxResId( MSG_PRINT_ERROR ) ).Execute(); 1979 } 1980 break; 1981 } 1982 1983 case ID_PRINTER_SETUP: 1984 { 1985 PrinterSetupDialog* pDlg = new PrinterSetupDialog( pDialog ); 1986 if ( !pPrt ) 1987 pPrt = new Printer; 1988 pDlg->SetPrinter( pPrt ); 1989 pDlg->Execute(); 1990 delete pDlg; 1991 break; 1992 } 1993 1994 case ID_DEFAULT_TEMPLATE: 1995 { 1996 String aServiceName, aFileURL; 1997 if ( GetServiceName_Impl( aServiceName, aFileURL ) ) 1998 SfxObjectFactory::SetStandardTemplate( aServiceName, aFileURL ); 1999 break; 2000 } 2001 2002 default: 2003 bHandled = sal_False; 2004 } 2005 2006 if ( !bHandled && ( nId > ID_RESET_DEFAULT_TEMPLATE || nId <= ID_RESET_DEFAULT_TEMPLATE_END ) ) 2007 { 2008 Menu* pSubMenu = _pMenu ? _pMenu : aEditBtn.GetPopupMenu()->GetPopupMenu( ID_RESET_DEFAULT_TEMPLATE ); 2009 if ( pSubMenu ) 2010 { 2011 String aServiceName = SfxObjectShell::GetServiceNameFromFactory( pSubMenu->GetItemCommand( nId ) ); 2012 SfxObjectFactory::SetStandardTemplate( aServiceName, String() ); 2013 bHandled = sal_True; 2014 } 2015 } 2016 2017 return bHandled ? 1 : 0; 2018 } 2019 2020 //------------------------------------------------------------------------- 2021 2022 IMPL_LINK_INLINE_START( SfxOrganizeDlg_Impl, MenuSelect_Impl, Menu *, pMenu ) 2023 2024 /* [Beschreibung] 2025 2026 SelectHandler des Men"us des Men"ubuttons (SV) 2027 2028 [Parameter] 2029 2030 MenuButton *pBtn der das Event ausl"osende Button 2031 2032 [R"uckgabewert] 1: Event wurde verarbeitet, 2033 0: Event wurde nicht verarbeitet (SV-Menu) 2034 2035 */ 2036 { 2037 return Dispatch_Impl( pMenu->GetCurItemId(), pMenu ); 2038 } 2039 IMPL_LINK_INLINE_END( SfxOrganizeDlg_Impl, MenuSelect_Impl, Menu *, pMenu ) 2040 2041 //------------------------------------------------------------------------- 2042 2043 IMPL_LINK( SfxOrganizeDlg_Impl, AccelSelect_Impl, Accelerator *, pAccel ) 2044 2045 /* [Beschreibung] 2046 2047 SelectHandler des Accelerators (SV) 2048 2049 [Parameter] 2050 2051 Accelerator *pAccel der das Event ausl"osende Accelerator 2052 2053 [R"uckgabewert] 1: Event wurde verarbeitet, 2054 0: Event wurde nicht verarbeitet (SV) 2055 2056 */ 2057 2058 { 2059 SvLBoxEntry* pEntry = pFocusBox && pFocusBox->GetSelectionCount() ? 2060 pFocusBox->FirstSelected() : NULL ; 2061 return pEntry && ( pAccel->GetCurItemId() == ID_NEW || !DontDelete_Impl( pEntry ) ) ? 2062 Dispatch_Impl( pAccel->GetCurItemId(), NULL ) : 0; 2063 } 2064 2065 //------------------------------------------------------------------------- 2066 2067 void SfxOrganizeDlg_Impl::OkHdl(Button *pButton) 2068 { 2069 if(pFocusBox && pFocusBox->IsEditingActive()) 2070 pFocusBox->EndEditing(sal_False); 2071 pButton->Click(); 2072 } 2073 2074 2075 2076 IMPL_LINK( SfxOrganizeDlg_Impl, MenuActivate_Impl, Menu *, pMenu ) 2077 2078 /* [Beschreibung] 2079 2080 ActivateHandler des Men"us des Men"ubuttons (SV) 2081 2082 [Parameter] 2083 2084 Menu *pMenu das das Event ausl"osende Men"u 2085 2086 [R"uckgabewert] 1: Event wurde verarbeitet, 2087 0: Event wurde nicht verarbeitet (SV-Menu) 2088 2089 */ 2090 { 2091 if ( pFocusBox && pFocusBox->IsEditingActive() ) 2092 pFocusBox->EndEditing( sal_False ); 2093 sal_Bool bEnable = ( pFocusBox && pFocusBox->GetSelectionCount() ); 2094 SvLBoxEntry* pEntry = bEnable ? pFocusBox->FirstSelected() : NULL; 2095 const sal_uInt16 nDepth = 2096 ( bEnable && pFocusBox->GetSelectionCount() ) ? pFocusBox->GetModel()->GetDepth( pEntry ) : 0; 2097 const sal_uInt16 nDocLevel = bEnable ? pFocusBox->GetDocLevel() : 0; 2098 int eVT = pFocusBox ? pFocusBox->GetViewType() : 0; 2099 // nur Vorlagen anlegen 2100 pMenu->EnableItem( ID_NEW, bEnable && 0 == nDepth && SfxOrganizeListBox_Impl::VIEW_TEMPLATES == eVT ); 2101 // Vorlagen: Loeschen Ebene 0,1,3ff 2102 // ein Bereich mu"s mindestens erhalten bleiben 2103 // Dateien : Loeschen Ebene > 2 2104 2105 pMenu->EnableItem( ID_DELETE, bEnable && !DontDelete_Impl( pEntry ) ); 2106 pMenu->EnableItem( ID_EDIT, 2107 bEnable && eVT == SfxOrganizeListBox_Impl::VIEW_TEMPLATES && nDepth == nDocLevel 2108 && !DontDelete_Impl( pEntry ) ); 2109 pMenu->EnableItem( ID_COPY_FROM, 2110 bEnable && eVT == SfxOrganizeListBox_Impl::VIEW_TEMPLATES && 2111 ( nDepth == nDocLevel || nDepth == nDocLevel - 1 ) ); 2112 pMenu->EnableItem( ID_COPY_TO, 2113 bEnable && eVT == SfxOrganizeListBox_Impl::VIEW_TEMPLATES && 2114 nDepth == nDocLevel ); 2115 pMenu->EnableItem( ID_RESCAN, 2116 SfxOrganizeListBox_Impl::VIEW_TEMPLATES == aRightLb.GetViewType() || 2117 SfxOrganizeListBox_Impl::VIEW_TEMPLATES == aLeftLb.GetViewType() ); 2118 sal_Bool bPrint = bEnable && nDepth > pFocusBox->GetDocLevel(); 2119 if ( bPrint && pPrt ) 2120 bPrint = !pPrt->IsPrinting() && !pPrt->IsJobActive(); 2121 if ( bPrint && bEnable ) 2122 { 2123 // only styles printable 2124 Path aPath( pFocusBox, pFocusBox->FirstSelected() ); 2125 sal_uInt16 nIndex = aPath[ nDocLevel + 1 ]; 2126 bPrint = ( nIndex == CONTENT_STYLE ); 2127 } 2128 pMenu->EnableItem( ID_PRINT, bPrint ); 2129 2130 if ( bEnable && eVT == SfxOrganizeListBox_Impl::VIEW_TEMPLATES && nDepth == nDocLevel ) 2131 { 2132 String aFactoryURL, aFileURL; 2133 bEnable = GetServiceName_Impl( aFactoryURL, aFileURL ); 2134 } 2135 else if ( bEnable ) 2136 bEnable = sal_False; 2137 pMenu->EnableItem( ID_DEFAULT_TEMPLATE, bEnable ); 2138 2139 bEnable = sal_True; 2140 SvStringsDtor* pList = GetAllFactoryURLs_Impl(); 2141 sal_uInt16 nCount = pList->Count(); 2142 if ( nCount > 0 ) 2143 { 2144 PopupMenu* pSubMenu = new PopupMenu; 2145 sal_uInt16 nItemId = ID_RESET_DEFAULT_TEMPLATE + 1; 2146 for ( sal_uInt16 i = 0; i < nCount; ++i ) 2147 { 2148 String aObjFacURL( *pList->GetObject(i) ); 2149 String aTitle = SvFileInformationManager::GetDescription( 2150 INetURLObject(aObjFacURL) ); 2151 pSubMenu->InsertItem( nItemId, aTitle, 2152 SvFileInformationManager::GetImage(INetURLObject(aObjFacURL)) ); 2153 pSubMenu->SetItemCommand( nItemId++, aObjFacURL ); 2154 DBG_ASSERT( nItemId <= ID_RESET_DEFAULT_TEMPLATE_END, "menu item id overflow" ); 2155 } 2156 pMenu->SetPopupMenu( ID_RESET_DEFAULT_TEMPLATE, pSubMenu ); 2157 } 2158 else 2159 bEnable = sal_False; 2160 2161 delete pList; 2162 pMenu->EnableItem( ID_RESET_DEFAULT_TEMPLATE, bEnable ); 2163 2164 return 1; 2165 } 2166 2167 //------------------------------------------------------------------------- 2168 2169 IMPL_LINK( SfxOrganizeDlg_Impl, GetFocus_Impl, SfxOrganizeListBox_Impl *, pBox ) 2170 2171 /* [Beschreibung] 2172 2173 GetFocus-Handler, wird aus den Select-Handler der Listboxen 2174 gerufen. 2175 Wird verwendet, im die Listbox, die den Focus besitzt sowie 2176 deren Zustand zu ermitteln. 2177 2178 [Parameter] 2179 2180 SfxOrganizeListBox *pBox die rufende Box 2181 2182 */ 2183 2184 { 2185 if(pFocusBox && pFocusBox != pBox) 2186 pFocusBox->SelectAll(sal_False); 2187 pFocusBox = pBox; 2188 aFilesBtn.Enable( SfxOrganizeListBox_Impl::VIEW_FILES == 2189 pFocusBox->GetViewType() ); 2190 return 0; 2191 } 2192 2193 //------------------------------------------------------------------------- 2194 2195 IMPL_LINK( SfxOrganizeDlg_Impl, LeftListBoxSelect_Impl, ListBox *, pBox ) 2196 2197 /* [Beschreibung] 2198 2199 Select-Handler, wird aus den Select-Handler der Listboxen 2200 gerufen. 2201 Wenn sich der Modus der Boxen (Dokumentsicht, Dokumentvorlagensicht) 2202 unterscheiden, werden die Models getrennt; andernfalls zusammengefa"st. 2203 2204 [Parameter] 2205 2206 ListBox *pBox die rufende Box 2207 2208 */ 2209 { 2210 const SfxOrganizeListBox_Impl::DataEnum 2211 eViewType = pBox->GetSelectEntryPos() == 0 ? 2212 SfxOrganizeListBox_Impl::VIEW_TEMPLATES : SfxOrganizeListBox_Impl::VIEW_FILES; 2213 if(eViewType!= aLeftLb.GetViewType()) { 2214 aLeftLb.SetViewType(eViewType); 2215 if(aRightLb.GetViewType() == eViewType) 2216 aLeftLb.SetModel(aRightLb.GetModel()); 2217 else { 2218 // Models trennen 2219 aLeftLb.DisconnectFromModel(); 2220 aLeftLb.Reset(); 2221 } 2222 } 2223 GetFocus_Impl(&aLeftLb); 2224 return 0; 2225 } 2226 2227 //------------------------------------------------------------------------- 2228 2229 IMPL_LINK( SfxOrganizeDlg_Impl, RightListBoxSelect_Impl, ListBox *, pBox ) 2230 2231 /* [Beschreibung] 2232 2233 Select-Handler, wird aus den Select-Handler der Listboxen 2234 gerufen. 2235 Wenn sich der Modus der Boxen (Dokumentsicht, Dokumentvorlagensicht) 2236 unterscheiden, werden die Models getrennt; andernfalls zusammengefa"st. 2237 2238 [Parameter] 2239 2240 ListBox *pBox die rufende Box 2241 2242 */ 2243 { 2244 const SfxOrganizeListBox_Impl::DataEnum eViewType = 2245 pBox->GetSelectEntryPos() == 0 ? 2246 SfxOrganizeListBox_Impl::VIEW_TEMPLATES : SfxOrganizeListBox_Impl::VIEW_FILES; 2247 if(eViewType!= aRightLb.GetViewType()) 2248 { 2249 aRightLb.SetViewType(eViewType); 2250 if(aLeftLb.GetViewType() == eViewType) 2251 aRightLb.SetModel(aLeftLb.GetModel()); 2252 else 2253 { 2254 // Models trennen 2255 aRightLb.DisconnectFromModel(); 2256 aRightLb.Reset(); 2257 } 2258 } 2259 aRightLb.GrabFocus(); 2260 GetFocus_Impl(&aRightLb); 2261 return 0; 2262 } 2263 2264 //------------------------------------------------------------------------- 2265 2266 IMPL_LINK( SfxOrganizeDlg_Impl, OnAddressTemplateClicked, Button *, pButton ) 2267 { 2268 (void)pButton; //unused 2269 svt::AddressBookSourceDialog aDialog(pDialog, ::comphelper::getProcessServiceFactory()); 2270 aDialog.Execute(); 2271 return 0L; 2272 } 2273 2274 //------------------------------------------------------------------------- 2275 2276 IMPL_LINK( SfxOrganizeDlg_Impl, AddFiles_Impl, Button *, pButton ) 2277 2278 /* [Beschreibung] 2279 2280 Handler des Buttons f"ur das Hinzuf"ugen von Dateien per Dialog. 2281 2282 [Parameter] 2283 2284 Button * der Button, der dieses Events ausgel"ost hat. 2285 2286 */ 2287 { 2288 (void)pButton; //unused 2289 if ( pFileDlg ) 2290 delete pFileDlg; 2291 pFileDlg = new sfx2::FileDialogHelper( WB_OPEN, String() ); 2292 2293 // add config and basic filter 2294 static String sOpenBracket( DEFINE_CONST_UNICODE( " (" ) ); 2295 static String sCloseBracket( DEFINE_CONST_UNICODE( ")" ) ); 2296 static String sConfigExt( DEFINE_CONST_UNICODE( "*.cfg" ) ); 2297 static String sBasicExt( DEFINE_CONST_UNICODE( "*.sbl" ) ); 2298 2299 String sFilterName( SfxResId( RID_STR_FILTCONFIG ) ); 2300 sFilterName += sOpenBracket; 2301 sFilterName += sConfigExt; 2302 sFilterName += sCloseBracket; 2303 pFileDlg->AddFilter( sFilterName, sConfigExt ); 2304 2305 sFilterName = String( SfxResId( RID_STR_FILTBASIC ) ); 2306 sFilterName += sOpenBracket; 2307 sFilterName += sBasicExt; 2308 sFilterName += sCloseBracket; 2309 pFileDlg->AddFilter( sFilterName, sBasicExt ); 2310 2311 // set "All" filter as current 2312 pFileDlg->SetCurrentFilter( String( SfxResId( STR_SFX_FILTERNAME_ALL ) ) ); 2313 2314 if ( aLastDir.Len() ) 2315 pFileDlg->SetDisplayDirectory( aLastDir ); 2316 2317 pFileDlg->StartExecuteModal( LINK( this, SfxOrganizeDlg_Impl, AddFilesHdl ) ); 2318 2319 return 0; 2320 } 2321 2322 //------------------------------------------------------------------------- 2323 2324 IMPL_LINK( SfxOrganizeDlg_Impl, ImportHdl, sfx2::FileDialogHelper *, EMPTYARG ) 2325 { 2326 DBG_ASSERT( pFileDlg, "SfxOrganizeDlg_Impl::ImportHdl(): no file dialog" ); 2327 2328 if ( ERRCODE_NONE == pFileDlg->GetError() ) 2329 { 2330 String aPath = pFileDlg->GetPath(); 2331 INetURLObject aObj( aPath ); 2332 2333 // we want to keep the original extension when exporting, the file open dialog 2334 // always sets the extension to *.vor 2335 if ( pFileDlg->GetDialogType() == 2336 com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE ) 2337 { 2338 if ( aObj.hasExtension() ) 2339 aObj.removeExtension(); 2340 2341 aObj.setExtension( m_sExtension4Save ); 2342 aPath = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); 2343 } 2344 2345 aObj.removeSegment(); 2346 aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); 2347 2348 if ( aPath.Len() && !aMgr.CopyTo( m_nRegion, m_nIndex, aPath ) ) 2349 { 2350 String aText( SfxResId( STR_ERROR_COPY_TEMPLATE ) ); 2351 aText.SearchAndReplaceAscii( "$1", aPath ); 2352 ErrorBox( pDialog, WB_OK, aText ).Execute(); 2353 } 2354 } 2355 2356 return 0L; 2357 } 2358 2359 //------------------------------------------------------------------------- 2360 2361 IMPL_LINK( SfxOrganizeDlg_Impl, ExportHdl, sfx2::FileDialogHelper *, EMPTYARG ) 2362 { 2363 DBG_ASSERT( pFileDlg, "SfxOrganizeDlg_Impl::ImportHdl(): no file dialog" ); 2364 ::com::sun::star::uno::Sequence< ::rtl::OUString > aPaths; 2365 2366 if ( ERRCODE_NONE == pFileDlg->GetError() ) 2367 { 2368 aPaths = pFileDlg->GetMPath(); 2369 sal_Int32 lastCount = aPaths.getLength() - 1; 2370 INetURLObject aObj( aPaths.getArray()[ lastCount ] ); 2371 2372 aObj.removeSegment(); 2373 aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); 2374 } 2375 2376 sal_Int32 nCount = aPaths.getLength(); 2377 if ( 1 == nCount ) 2378 { 2379 String aPath = String( aPaths.getArray()[0] ); 2380 if ( aPath.Len() && !aMgr.CopyFrom( pFocusBox, m_nRegion, m_nIndex, aPath ) ) 2381 { 2382 String aText( SfxResId( STR_ERROR_COPY_TEMPLATE ) ); 2383 aText.SearchAndReplaceAscii( "$1", aPath ); 2384 ErrorBox( pDialog, WB_OK, aText ).Execute(); 2385 } 2386 } 2387 else if ( nCount > 1 ) 2388 { 2389 INetURLObject aPathObj( aPaths[0] ); 2390 aPathObj.setFinalSlash(); 2391 for ( sal_uInt16 i = 1; i < nCount; ++i ) 2392 { 2393 if ( 1 == i ) 2394 aPathObj.Append( aPaths[i] ); 2395 else 2396 aPathObj.setName( aPaths[i] ); 2397 String aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE ); 2398 if ( aPath.Len() && !aMgr.CopyFrom( pFocusBox, m_nRegion, m_nIndex, aPath ) ) 2399 { 2400 String aText( SfxResId( STR_ERROR_COPY_TEMPLATE ) ); 2401 aText.SearchAndReplaceAscii( "$1", aPath ); 2402 ErrorBox( pDialog, WB_OK, aText ).Execute(); 2403 } 2404 } 2405 } 2406 2407 return 0L; 2408 } 2409 2410 //------------------------------------------------------------------------- 2411 2412 IMPL_LINK( SfxOrganizeDlg_Impl, AddFilesHdl, sfx2::FileDialogHelper *, EMPTYARG ) 2413 { 2414 if ( ERRCODE_NONE == pFileDlg->GetError() ) 2415 { 2416 String aPath = pFileDlg->GetPath(); 2417 aMgr.InsertFile( pFocusBox, aPath ); 2418 INetURLObject aObj( aPath ); 2419 aObj.removeSegment(); 2420 aObj.setFinalSlash(); 2421 aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); 2422 } 2423 2424 return 0L; 2425 } 2426 2427 //------------------------------------------------------------------------- 2428 2429 short SfxTemplateOrganizeDlg::Execute() 2430 2431 /* [Beschreibung] 2432 2433 "Uberladene Execute- Methode; speichert gfs. "Anderungen an den 2434 Dokumentvorlagen 2435 (SV-Methode) 2436 2437 */ 2438 2439 { 2440 const short nRet = ModalDialog::Execute(); 2441 if(RET_CANCEL != nRet) 2442 { 2443 pImp->aMgr.SaveAll(this); 2444 SfxTemplateDialog* pTemplDlg = SFX_APP()->GetTemplateDialog(); 2445 if(pTemplDlg) 2446 pTemplDlg->Update(); 2447 } 2448 return nRet; 2449 } 2450 2451 2452 //------------------------------------------------------------------------- 2453 2454 SfxTemplateOrganizeDlg::SfxTemplateOrganizeDlg(Window * pParent, 2455 SfxDocumentTemplates *pTempl) 2456 : ModalDialog( pParent, SfxResId(DLG_ORGANIZE)), 2457 pImp( new SfxOrganizeDlg_Impl(this, pTempl) ) 2458 2459 /* [Beschreibung] 2460 2461 Konstruktor 2462 2463 */ 2464 { 2465 FreeResource(); 2466 } 2467 2468 //------------------------------------------------------------------------- 2469 2470 SfxTemplateOrganizeDlg::~SfxTemplateOrganizeDlg() 2471 { 2472 GetpApp()->RemoveAccel(&pImp->aEditAcc); 2473 delete pImp->pPrt; 2474 delete pImp; 2475 } 2476 2477