1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sw.hxx" 30 31 #ifndef _SVSTDARR_HXX 32 #define _SVSTDARR_STRINGSDTOR 33 #include <svl/svstdarr.hxx> 34 #endif 35 #include <vcl/msgbox.hxx> 36 #include <svl/stritem.hxx> 37 #include <sfx2/fcontnr.hxx> 38 #include <sfx2/linkmgr.hxx> 39 #include <sfx2/dispatch.hxx> 40 #include <svl/urihelper.hxx> 41 #include <sfx2/docfile.hxx> 42 #include <vcl/help.hxx> 43 #include <sot/filelist.hxx> 44 #include <svl/eitem.hxx> 45 #include <svl/urlbmk.hxx> 46 #include <svtools/filter.hxx> 47 #include <sfx2/docinsert.hxx> 48 #include <sfx2/filedlghelper.hxx> 49 50 #include <sfx2/app.hxx> 51 #include <swmodule.hxx> 52 #include <wrtsh.hxx> 53 #include <view.hxx> 54 #include <errhdl.hxx> 55 #include <docsh.hxx> 56 #include <content.hxx> 57 #include <edglbldc.hxx> 58 #include <section.hxx> 59 #include <tox.hxx> 60 #include <cnttab.hxx> 61 #define NAVIPI_CXX 62 #include <navipi.hxx> 63 #include <navicont.hxx> 64 #include <edtwin.hxx> 65 #include <uitool.hxx> 66 67 #include <cmdid.h> 68 #include <helpid.h> 69 #ifndef _NAVIPI_HRC 70 #include <navipi.hrc> 71 #endif 72 #ifndef _UTLUI_HRC 73 #include <utlui.hrc> 74 #endif 75 #ifndef _COMCORE_HRC 76 #include <comcore.hrc> 77 #endif 78 #include <globals.hrc> 79 #include "swabstdlg.hxx" 80 81 using namespace ::com::sun::star::uno; 82 using ::rtl::OUString; 83 84 85 // Kontextmenue fuer GlobalTree 86 #define CTX_INSERT_ANY_INDEX 10 87 //#define CTX_INSERT_CNTIDX 11 88 //#define CTX_INSERT_USRIDX 12 89 #define CTX_INSERT_FILE 11 90 #define CTX_INSERT_NEW_FILE 12 91 #define CTX_INSERT_TEXT 13 92 93 #define CTX_UPDATE_SEL 20 94 #define CTX_UPDATE_INDEX 21 95 #define CTX_UPDATE_LINK 22 96 #define CTX_UPDATE_ALL 23 97 98 #define CTX_UPDATE 1 99 #define CTX_INSERT 2 100 #define CTX_EDIT 3 101 #define CTX_DELETE 4 102 #define CTX_EDIT_LINK 5 103 104 #define GLOBAL_UPDATE_TIMEOUT 2000 105 106 // Flags fuer PopupMenu-enable/disable 107 #define ENABLE_INSERT_IDX 0x0001 108 #define ENABLE_INSERT_FILE 0x0002 109 #define ENABLE_INSERT_TEXT 0x0004 110 #define ENABLE_EDIT 0x0008 111 #define ENABLE_DELETE 0x0010 112 #define ENABLE_UPDATE 0x0020 113 #define ENABLE_UPDATE_SEL 0x0040 114 #define ENABLE_EDIT_LINK 0x0080 115 116 // TabPos nach links schieben 117 #define GLBL_TABPOS_SUB 5 118 119 const SfxObjectShell* SwGlobalTree::pShowShell = 0; 120 static const char* __FAR_DATA aHelpForMenu[] = 121 { 122 0, // 123 HID_GLBLTREE_UPDATE, //CTX_UPDATE 124 HID_GLBLTREE_INSERT, //CTX_INSERT 125 HID_GLBLTREE_EDIT, //CTX_EDIT 126 HID_GLBLTREE_DEL, //CTX_DELETE 127 HID_GLBLTREE_EDIT_LINK, //CTX_EDIT_LINK 128 0, // 129 0, // 130 0, // 131 0, // 132 HID_GLBLTREE_INS_IDX, //CTX_INSERT_ANY_INDEX 133 HID_GLBLTREE_INS_FILE, //CTX_INSERT_FILE 134 HID_GLBLTREE_INS_NEW_FILE, //CTX_INSERT_NEW_FILE 135 HID_GLBLTREE_INS_TEXT, //CTX_INSERT_TEXT 136 0, // 137 0, // 138 0, // 139 0, // 140 0, // 141 0, // 142 HID_GLBLTREE_UPD_SEL, //CTX_UPDATE_SEL 143 HID_GLBLTREE_UPD_IDX, //CTX_UPDATE_INDEX 144 HID_GLBLTREE_UPD_LINK, //CTX_UPDATE_LINK 145 HID_GLBLTREEUPD_ALL //CTX_UPDATE_ALL 146 }; 147 148 /************************************************************************/ 149 /* */ 150 /************************************************************************/ 151 /* -----------------------------24.08.00 12:04-------------------------------- 152 153 ---------------------------------------------------------------------------*/ 154 class SwGlobalFrameListener_Impl : public SfxListener 155 { 156 sal_Bool bValid; 157 public: 158 SwGlobalFrameListener_Impl(SfxViewFrame& rFrame) : 159 bValid(sal_True) 160 { 161 StartListening(rFrame); 162 } 163 164 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 165 166 sal_Bool IsValid() const {return bValid;} 167 }; 168 /* -----------------------------24.08.00 12:05-------------------------------- 169 170 ---------------------------------------------------------------------------*/ 171 void SwGlobalFrameListener_Impl::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) 172 { 173 if( rHint.ISA(SfxSimpleHint) && 174 (((SfxSimpleHint&) rHint).GetId() == SFX_HINT_DYING)) 175 bValid = sal_False; 176 } 177 178 /*-----------------12.06.97 09:38------------------- 179 180 --------------------------------------------------*/ 181 SwGlobalTree::SwGlobalTree(Window* pParent, const ResId& rResId) : 182 183 SvTreeListBox(pParent, rResId), 184 185 pActiveShell ( NULL ), 186 pEmphasisEntry ( NULL ), 187 pDDSource ( NULL ), 188 pSwGlblDocContents ( NULL ), 189 pDefParentWin ( NULL ), 190 pDocContent ( NULL ), 191 pDocInserter ( NULL ), 192 193 bIsInternalDrag ( sal_False ), 194 bLastEntryEmphasis ( sal_False ), 195 bIsImageListInitialized ( sal_False ) 196 197 { 198 SetDragDropMode(SV_DRAGDROP_APP_COPY | 199 SV_DRAGDROP_CTRL_MOVE | 200 SV_DRAGDROP_ENABLE_TOP ); 201 202 aUpdateTimer.SetTimeout(GLOBAL_UPDATE_TIMEOUT); 203 aUpdateTimer.SetTimeoutHdl(LINK(this, SwGlobalTree, Timeout)); 204 aUpdateTimer.Start(); 205 for(sal_uInt16 i = 0; i < GLOBAL_CONTEXT_COUNT; i++) 206 { 207 aContextStrings[i] = SW_RESSTR(i+ ST_GLOBAL_CONTEXT_FIRST); 208 } 209 SetHelpId(HID_NAVIGATOR_GLOB_TREELIST); 210 SelectHdl(); 211 SetDoubleClickHdl(LINK(this, SwGlobalTree, DoubleClickHdl)); 212 EnableContextMenuHandling(); 213 } 214 215 /*-----------------12.06.97 09:38------------------- 216 217 --------------------------------------------------*/ 218 SwGlobalTree::~SwGlobalTree() 219 { 220 delete pSwGlblDocContents; 221 delete pDocInserter; 222 } 223 224 /*-----------------12.06.97 09:38------------------- 225 226 --------------------------------------------------*/ 227 sal_Int8 SwGlobalTree::ExecuteDrop( const ExecuteDropEvent& rEvt ) 228 { 229 sal_Int8 nRet = DND_ACTION_NONE; 230 SvLBoxEntry* pLast = (SvLBoxEntry*)LastVisible(); 231 if(pEmphasisEntry) 232 { 233 ImplShowTargetEmphasis( Prev(pEmphasisEntry), sal_False ); 234 pEmphasisEntry = 0; 235 } 236 else if(bLastEntryEmphasis && pLast) 237 { 238 ImplShowTargetEmphasis( pLast, sal_False); 239 } 240 241 SvLBoxEntry* pDropEntry = bLastEntryEmphasis ? 0 : GetEntry(rEvt.maPosPixel); 242 if( bIsInternalDrag ) 243 { 244 SvLBoxEntry* pDummy = 0; 245 sal_uLong nInsertionPos = LIST_APPEND; 246 NotifyMoving( pDropEntry, pDDSource, pDummy, nInsertionPos ); 247 } 248 else 249 { 250 TransferableDataHelper aData( rEvt.maDropEvent.Transferable ); 251 252 String sFileName; 253 const SwGlblDocContent* pCnt = pDropEntry ? 254 (const SwGlblDocContent*)pDropEntry->GetUserData() : 255 0; 256 if( aData.HasFormat( FORMAT_FILE_LIST )) 257 { 258 nRet = rEvt.mnAction; 259 SwGlblDocContents* pTempContents = new SwGlblDocContents; 260 int nAbsContPos = pDropEntry ? 261 (int) GetModel()->GetAbsPos(pDropEntry): 262 - 1; 263 sal_uInt16 nEntryCount = (sal_uInt16)GetEntryCount(); 264 265 // Daten holen 266 FileList aFileList; 267 aData.GetFileList( FORMAT_FILE_LIST, aFileList ); 268 for ( sal_uInt16 n = (sal_uInt16)aFileList.Count(); n--; ) 269 { 270 sFileName = aFileList.GetFile(n); 271 InsertRegion(pCnt, &sFileName); 272 // nach dem Einfuegen muss die Liste der Contents neu 273 // geholt werden, um nicht auf einem alten Content zu 274 // arbeiten 275 if(n) 276 { 277 pActiveShell->GetGlobalDocContent(*pTempContents); 278 // wenn das file erfolgreich eingefuegt wurde, 279 // dann muss auch der naechste Content geholt werden 280 if(nEntryCount < pTempContents->Count()) 281 { 282 nEntryCount++; 283 nAbsContPos++; 284 pCnt = pTempContents->GetObject( static_cast< sal_uInt16 >(nAbsContPos) ); 285 } 286 } 287 } 288 delete pTempContents; 289 } 290 else if( 0 != (sFileName = 291 SwNavigationPI::CreateDropFileName( aData )).Len()) 292 { 293 INetURLObject aTemp(sFileName); 294 GraphicDescriptor aDesc(aTemp); 295 if( !aDesc.Detect() ) // keine Grafiken annehmen 296 { 297 nRet = rEvt.mnAction; 298 InsertRegion(pCnt, &sFileName); 299 } 300 } 301 } 302 bLastEntryEmphasis = sal_False; 303 return nRet; 304 305 } 306 /*-----------------12.06.97 09:38------------------- 307 308 --------------------------------------------------*/ 309 sal_Int8 SwGlobalTree::AcceptDrop( const AcceptDropEvent& rEvt ) 310 { 311 sal_Int8 nRet = rEvt.mnAction; 312 313 //initiate scrolling 314 GetDropTarget( rEvt.maPosPixel ); 315 SvLBoxEntry* pLast = (SvLBoxEntry*)LastVisible(); 316 if( rEvt.mbLeaving ) 317 { 318 if( pEmphasisEntry ) 319 { 320 ImplShowTargetEmphasis( Prev(pEmphasisEntry), sal_False ); 321 pEmphasisEntry = 0; 322 } 323 else if(bLastEntryEmphasis && pLast) 324 { 325 ImplShowTargetEmphasis( pLast, sal_False); 326 } 327 bLastEntryEmphasis = sal_False; 328 } 329 else 330 { 331 SvLBoxEntry* pDropEntry = GetEntry( rEvt.maPosPixel ); 332 if(bIsInternalDrag) 333 { 334 if( pDDSource != pDropEntry ) 335 nRet = rEvt.mnAction; 336 } 337 else if( IsDropFormatSupported( FORMAT_FILE ) || 338 IsDropFormatSupported( FORMAT_STRING ) || 339 IsDropFormatSupported( FORMAT_FILE_LIST ) || 340 IsDropFormatSupported( SOT_FORMATSTR_ID_SOLK ) || 341 IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK )|| 342 IsDropFormatSupported( SOT_FORMATSTR_ID_FILECONTENT ) || 343 IsDropFormatSupported( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) || 344 IsDropFormatSupported( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) || 345 IsDropFormatSupported( SOT_FORMATSTR_ID_FILENAME )) 346 nRet = DND_ACTION_LINK; 347 348 if(pEmphasisEntry && pEmphasisEntry != pDropEntry) 349 ImplShowTargetEmphasis( Prev(pEmphasisEntry), sal_False ); 350 else if(pLast && bLastEntryEmphasis && pDropEntry) 351 { 352 ImplShowTargetEmphasis( pLast, sal_False); 353 bLastEntryEmphasis = sal_False; 354 } 355 356 if(pDropEntry) 357 ImplShowTargetEmphasis( Prev(pDropEntry), DND_ACTION_NONE != nRet ); 358 else if(pLast) 359 { 360 ImplShowTargetEmphasis( pLast, DND_ACTION_NONE != nRet ); 361 bLastEntryEmphasis = sal_True; 362 } 363 pEmphasisEntry = pDropEntry; 364 } 365 return nRet; 366 } 367 /*-----------------12.06.97 09:38------------------- 368 369 --------------------------------------------------*/ 370 PopupMenu* SwGlobalTree::CreateContextMenu() 371 { 372 PopupMenu* pPop = 0; 373 if(pActiveShell && 374 !pActiveShell->GetView().GetDocShell()->IsReadOnly()) 375 { 376 sal_uInt16 nEnableFlags = GetEnableFlags(); 377 pPop = new PopupMenu; 378 PopupMenu* pSubPop1 = new PopupMenu; 379 PopupMenu* pSubPop2 = new PopupMenu; 380 381 for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++) 382 { 383 pSubPop2->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] ); 384 pSubPop2->SetHelpId(i, aHelpForMenu[i]); 385 } 386 pSubPop2->EnableItem(CTX_UPDATE_SEL, 0 != (nEnableFlags & ENABLE_UPDATE_SEL)); 387 388 pSubPop1->InsertItem(CTX_INSERT_ANY_INDEX, aContextStrings[ST_INDEX - ST_GLOBAL_CONTEXT_FIRST]); 389 pSubPop1->SetHelpId(CTX_INSERT_ANY_INDEX, aHelpForMenu[CTX_INSERT_ANY_INDEX]); 390 pSubPop1->InsertItem(CTX_INSERT_FILE, aContextStrings[ST_FILE - ST_GLOBAL_CONTEXT_FIRST]); 391 pSubPop1->SetHelpId(CTX_INSERT_FILE, aHelpForMenu[CTX_INSERT_FILE]); 392 pSubPop1->InsertItem(CTX_INSERT_NEW_FILE, aContextStrings[ST_NEW_FILE - ST_GLOBAL_CONTEXT_FIRST]); 393 pSubPop1->SetHelpId(CTX_INSERT_NEW_FILE, aHelpForMenu[CTX_INSERT_NEW_FILE]); 394 pSubPop1->InsertItem(CTX_INSERT_TEXT, aContextStrings[ST_TEXT - ST_GLOBAL_CONTEXT_FIRST]); 395 pSubPop1->SetHelpId(CTX_INSERT_TEXT, aHelpForMenu[CTX_INSERT_TEXT]); 396 397 398 pPop->InsertItem(CTX_UPDATE, aContextStrings[ST_UPDATE - ST_GLOBAL_CONTEXT_FIRST]); 399 pPop->SetHelpId(CTX_UPDATE, aHelpForMenu[CTX_UPDATE]); 400 pPop->InsertItem(CTX_EDIT, aContextStrings[ST_EDIT_CONTENT - ST_GLOBAL_CONTEXT_FIRST]); 401 pPop->SetHelpId(CTX_EDIT, aHelpForMenu[CTX_EDIT]); 402 if(nEnableFlags&ENABLE_EDIT_LINK) 403 { 404 pPop->InsertItem(CTX_EDIT_LINK, aContextStrings[ST_EDIT_LINK - ST_GLOBAL_CONTEXT_FIRST]); 405 pPop->SetHelpId(CTX_EDIT_LINK, aHelpForMenu[CTX_EDIT_LINK]); 406 } 407 pPop->InsertItem(CTX_INSERT, aContextStrings[ST_INSERT - ST_GLOBAL_CONTEXT_FIRST]); 408 pPop->SetHelpId(CTX_INSERT, aHelpForMenu[CTX_INSERT]); 409 pPop->InsertSeparator() ; 410 pPop->InsertItem(CTX_DELETE, aContextStrings[ST_DELETE - ST_GLOBAL_CONTEXT_FIRST]); 411 pPop->SetHelpId(CTX_DELETE, aHelpForMenu[CTX_DELETE]); 412 413 //evtl. disablen 414 pSubPop1->EnableItem(CTX_INSERT_ANY_INDEX, 0 != (nEnableFlags & ENABLE_INSERT_IDX )); 415 pSubPop1->EnableItem(CTX_INSERT_TEXT, 0 != (nEnableFlags & ENABLE_INSERT_TEXT)); 416 pSubPop1->EnableItem(CTX_INSERT_FILE, 0 != (nEnableFlags & ENABLE_INSERT_FILE)); 417 pSubPop1->EnableItem(CTX_INSERT_NEW_FILE, 0 != (nEnableFlags & ENABLE_INSERT_FILE)); 418 419 pPop->EnableItem(CTX_UPDATE, 0 != (nEnableFlags & ENABLE_UPDATE)); 420 pPop->EnableItem(CTX_INSERT, 0 != (nEnableFlags & ENABLE_INSERT_IDX)); 421 pPop->EnableItem(CTX_EDIT, 0 != (nEnableFlags & ENABLE_EDIT)); 422 pPop->EnableItem(CTX_DELETE, 0 != (nEnableFlags & ENABLE_DELETE)); 423 424 425 pPop->SetPopupMenu( CTX_INSERT, pSubPop1 ); 426 pPop->SetPopupMenu( CTX_UPDATE, pSubPop2 ); 427 } 428 return pPop; 429 } 430 /*-----------------16.06.97 10:41------------------- 431 432 --------------------------------------------------*/ 433 void SwGlobalTree::TbxMenuHdl(sal_uInt16 nTbxId, ToolBox* pBox) 434 { 435 sal_uInt16 nEnableFlags = GetEnableFlags(); 436 if(FN_GLOBAL_OPEN == nTbxId) 437 { 438 PopupMenu *pMenu = new PopupMenu; 439 for (sal_uInt16 i = CTX_INSERT_ANY_INDEX; i <= CTX_INSERT_TEXT; i++) 440 { 441 pMenu->InsertItem( i, aContextStrings[ST_INDEX - ST_GLOBAL_CONTEXT_FIRST - CTX_INSERT_ANY_INDEX + i] ); 442 pMenu->SetHelpId(i, aHelpForMenu[i] ); 443 } 444 pMenu->EnableItem(CTX_INSERT_ANY_INDEX, 0 != (nEnableFlags & ENABLE_INSERT_IDX )); 445 // pMenu->EnableItem(CTX_INSERT_CNTIDX, 0 != (nEnableFlags & ENABLE_INSERT_IDX )); 446 // pMenu->EnableItem(CTX_INSERT_USRIDX, 0 != (nEnableFlags & ENABLE_INSERT_IDX )); 447 pMenu->EnableItem(CTX_INSERT_TEXT, 0 != (nEnableFlags & ENABLE_INSERT_TEXT)); 448 pMenu->EnableItem(CTX_INSERT_FILE, 0 != (nEnableFlags & ENABLE_INSERT_FILE)); 449 pMenu->EnableItem(CTX_INSERT_NEW_FILE, 0 != (nEnableFlags & ENABLE_INSERT_FILE)); 450 pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl)); 451 pMenu->Execute( pBox, pBox->GetItemRect(nTbxId).BottomLeft()); 452 delete pMenu; 453 pBox->EndSelection(); 454 pBox->Invalidate(); 455 } 456 else if(FN_GLOBAL_UPDATE == nTbxId) 457 { 458 PopupMenu *pMenu = new PopupMenu; 459 for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++) 460 { 461 pMenu->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] ); 462 pMenu->SetHelpId(i, aHelpForMenu[i] ); 463 } 464 pMenu->EnableItem(CTX_UPDATE_SEL, 0 != (nEnableFlags & ENABLE_UPDATE_SEL)); 465 pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl)); 466 pMenu->Execute( pBox, pBox->GetItemRect(nTbxId).BottomLeft()); 467 delete pMenu; 468 pBox->EndSelection(); 469 pBox->Invalidate(); 470 } 471 } 472 /*-----------------16.06.97 11:02------------------- 473 474 --------------------------------------------------*/ 475 sal_uInt16 SwGlobalTree::GetEnableFlags() const 476 { 477 SvLBoxEntry* pEntry = FirstSelected(); 478 sal_uInt16 nSelCount = (sal_uInt16)GetSelectionCount(); 479 sal_uInt16 nEntryCount = (sal_uInt16)GetEntryCount(); 480 SvLBoxEntry* pPrevEntry = pEntry ? Prev(pEntry) : 0; 481 482 sal_uInt16 nRet = 0; 483 if(nSelCount == 1 || !nEntryCount) 484 nRet |= ENABLE_INSERT_IDX|ENABLE_INSERT_FILE; 485 if(nSelCount == 1) 486 { 487 nRet |= ENABLE_EDIT; 488 if( ((SwGlblDocContent*)pEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN && 489 (!pPrevEntry || ((SwGlblDocContent*)pPrevEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN)) 490 nRet |= ENABLE_INSERT_TEXT; 491 if( GLBLDOC_SECTION == ((SwGlblDocContent*)pEntry->GetUserData())->GetType() ) 492 nRet |= ENABLE_EDIT_LINK; 493 } 494 else if(!nEntryCount) 495 { 496 nRet |= ENABLE_INSERT_TEXT; 497 } 498 if(nEntryCount) 499 nRet |= ENABLE_UPDATE|ENABLE_DELETE; 500 if(nSelCount) 501 nRet |= ENABLE_UPDATE_SEL; 502 return nRet; 503 } 504 505 /*-----------------12.06.97 09:38------------------- 506 507 --------------------------------------------------*/ 508 void SwGlobalTree::RequestHelp( const HelpEvent& rHEvt ) 509 { 510 sal_Bool bParent = sal_True; 511 Update(sal_True); 512 Display(sal_True); 513 if( rHEvt.GetMode() & HELPMODE_QUICK ) 514 { 515 Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() )); 516 SvLBoxEntry* pEntry = GetEntry( aPos ); 517 const SwGlblDocContent* pCont = pEntry ? 518 (const SwGlblDocContent*)pEntry->GetUserData() : 0; 519 if( pCont && GLBLDOC_SECTION == pCont->GetType()) 520 { 521 bParent = sal_False; 522 SvLBoxTab* pTab; 523 SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab ); 524 if(pItem && SV_ITEM_ID_LBOXSTRING == pItem->IsA()) 525 { 526 const SwSection* pSect = pCont->GetSection(); 527 String sEntry = pSect->GetLinkFileName().GetToken(0, sfx2::cTokenSeperator); 528 if(!pSect->IsConnectFlag()) 529 sEntry.Insert(aContextStrings[ST_BROKEN_LINK - ST_GLOBAL_CONTEXT_FIRST], 0 ); 530 Point aEntryPos = GetEntryPosition( pEntry ); 531 532 aEntryPos.X() = GetTabPos( pEntry, pTab ); 533 Size aSize( pItem->GetSize( this, pEntry ) ); 534 535 if((aEntryPos.X() + aSize.Width()) > GetSizePixel().Width()) 536 aSize.Width() = GetSizePixel().Width() - aEntryPos.X(); 537 538 aEntryPos = OutputToScreenPixel(aEntryPos); 539 Rectangle aItemRect( aEntryPos, aSize ); 540 if(Help::IsBalloonHelpEnabled()) 541 { 542 aEntryPos.X() += aSize.Width(); 543 Help::ShowBalloon( this, aEntryPos, aItemRect, sEntry ); 544 } 545 else 546 Help::ShowQuickHelp( this, aItemRect, sEntry, 547 QUICKHELP_LEFT|QUICKHELP_VCENTER ); 548 } 549 } 550 } 551 552 if(bParent) 553 SvTreeListBox::RequestHelp(rHEvt); 554 } 555 /*-----------------16.06.97 16:15------------------- 556 557 --------------------------------------------------*/ 558 void SwGlobalTree::SelectHdl() 559 { 560 561 sal_uInt16 nSelCount = (sal_uInt16)GetSelectionCount(); 562 SvLBoxEntry* pSel = FirstSelected(); 563 sal_uInt16 nAbsPos = pSel ? (sal_uInt16)GetModel()->GetAbsPos(pSel) : 0; 564 SwNavigationPI* pNavi = GetParentWindow(); 565 sal_Bool bReadonly = !pActiveShell || 566 pActiveShell->GetView().GetDocShell()->IsReadOnly(); 567 pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_EDIT, nSelCount == 1 && !bReadonly); 568 pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_OPEN, nSelCount <= 1 && !bReadonly); 569 pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_UPDATE, GetEntryCount() > 0 && !bReadonly); 570 pNavi->aGlobalToolBox.EnableItem(FN_ITEM_UP, 571 nSelCount == 1 && nAbsPos && !bReadonly); 572 pNavi->aGlobalToolBox.EnableItem(FN_ITEM_DOWN, 573 nSelCount == 1 && nAbsPos < ((sal_uInt16)GetEntryCount()) - 1 && !bReadonly); 574 575 } 576 /*-----------------16.06.97 16:15------------------- 577 578 --------------------------------------------------*/ 579 void SwGlobalTree::DeselectHdl() 580 { 581 SelectHdl(); 582 } 583 584 /*-----------------17.06.97 13:11------------------- 585 586 --------------------------------------------------*/ 587 DragDropMode SwGlobalTree::NotifyStartDrag( TransferDataContainer& , 588 SvLBoxEntry* pEntry ) 589 { 590 bIsInternalDrag = sal_True; 591 pDDSource = pEntry; 592 return SV_DRAGDROP_CTRL_MOVE; 593 } 594 595 /*-----------------21.06.97 12:44------------------- 596 597 --------------------------------------------------*/ 598 long SwGlobalTree::GetTabPos( SvLBoxEntry*, SvLBoxTab* pTab) 599 { 600 return pTab->GetPos() - GLBL_TABPOS_SUB; 601 } 602 603 /*-----------------12.06.97 09:38------------------- 604 605 --------------------------------------------------*/ 606 sal_Bool SwGlobalTree::NotifyMoving( SvLBoxEntry* pTarget, 607 SvLBoxEntry* pSource, 608 SvLBoxEntry*&, 609 sal_uLong& 610 ) 611 { 612 SvTreeList* _pModel = GetModel(); 613 sal_uInt16 nSource = (sal_uInt16) _pModel->GetAbsPos(pSource); 614 sal_uInt16 nDest = pTarget ? (sal_uInt16) _pModel->GetAbsPos(pTarget) : pSwGlblDocContents->Count(); 615 616 if( pActiveShell->MoveGlobalDocContent( 617 *pSwGlblDocContents, nSource, nSource + 1, nDest ) && 618 Update( sal_False )) 619 Display(); 620 return sal_False; 621 } 622 /*-----------------12.06.97 09:39------------------- 623 624 --------------------------------------------------*/ 625 sal_Bool SwGlobalTree::NotifyCopying( SvLBoxEntry* /*pTarget*/, 626 SvLBoxEntry* /*pEntry*/, 627 SvLBoxEntry*& /*rpNewParent*/, 628 sal_uLong& /*rNewChildPos*/ 629 ) 630 { 631 return sal_False; 632 } 633 /*-----------------12.06.97 09:39------------------- 634 635 --------------------------------------------------*/ 636 sal_Bool SwGlobalTree::NotifyAcceptDrop( SvLBoxEntry* pEntry) 637 { 638 return pEntry != 0; 639 } 640 /*-----------------12.06.97 09:39------------------- 641 642 --------------------------------------------------*/ 643 void SwGlobalTree::StartDrag( sal_Int8 nAction, const Point& rPt ) 644 { 645 if( 1 == GetSelectionCount() ) 646 SvTreeListBox::StartDrag( nAction, rPt ); 647 } 648 /*-----------------12.06.97 09:39------------------- 649 650 --------------------------------------------------*/ 651 void SwGlobalTree::DragFinished( sal_Int8 nAction ) 652 { 653 SvTreeListBox::DragFinished( nAction ); 654 bIsInternalDrag = sal_False; 655 } 656 657 /*************************************************************************** 658 Beschreibung: Wird ein Ctrl+DoubleClick in einen freien Bereich ausgefuehrt, 659 * dann soll die Basisfunktion des Controls gerufen werden 660 ***************************************************************************/ 661 void SwGlobalTree::MouseButtonDown( const MouseEvent& rMEvt ) 662 { 663 Point aPos( rMEvt.GetPosPixel()); 664 SvLBoxEntry* pEntry = GetEntry( aPos, sal_True ); 665 if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0) 666 Control::MouseButtonDown( rMEvt ); 667 else 668 SvTreeListBox::MouseButtonDown( rMEvt ); 669 } 670 671 /*-----------------12.06.97 13:08------------------- 672 673 --------------------------------------------------*/ 674 void SwGlobalTree::GetFocus() 675 { 676 if(Update( sal_False )) 677 Display(); 678 SvTreeListBox::GetFocus(); 679 } 680 681 /*-----------------12.06.97 12:34------------------- 682 683 --------------------------------------------------*/ 684 void SwGlobalTree::KeyInput(const KeyEvent& rKEvt) 685 { 686 const KeyCode aCode = rKEvt.GetKeyCode(); 687 if(aCode.GetCode() == KEY_RETURN) 688 { 689 switch(aCode.GetModifier()) 690 { 691 case KEY_MOD2: 692 // Boxen umschalten 693 GetParentWindow()->ToggleTree(); 694 break; 695 } 696 } 697 else 698 SvTreeListBox::KeyInput(rKEvt); 699 } 700 701 /*-----------------17.06.97 11:59------------------- 702 703 --------------------------------------------------*/ 704 void SwGlobalTree::Clear() 705 { 706 pEmphasisEntry = 0; 707 SvTreeListBox::Clear(); 708 } 709 /*-----------------12.06.97 12:38------------------- 710 711 --------------------------------------------------*/ 712 void SwGlobalTree::Display(sal_Bool bOnlyUpdateUserData) 713 { 714 if(!bIsImageListInitialized) 715 { 716 sal_uInt16 nResId = GetSettings().GetStyleSettings().GetHighContrastMode() ? IMG_NAVI_ENTRYBMPH : IMG_NAVI_ENTRYBMP; 717 aEntryImages = ImageList(SW_RES(nResId)); 718 bIsImageListInitialized = sal_True; 719 } 720 sal_uInt16 nCount = pSwGlblDocContents->Count(); 721 if(bOnlyUpdateUserData && GetEntryCount() == pSwGlblDocContents->Count()) 722 { 723 SvLBoxEntry* pEntry = First(); 724 for( sal_uInt16 i = 0; i < nCount; i++) 725 { 726 SwGlblDocContentPtr pCont = pSwGlblDocContents->GetObject(i); 727 pEntry->SetUserData(pCont); 728 pEntry = Next(pEntry); 729 } 730 } 731 else 732 { 733 SetUpdateMode( sal_False ); 734 SvLBoxEntry* pOldSelEntry = FirstSelected(); 735 String sEntryName; // Name des Eintrags 736 sal_uInt16 nSelPos = USHRT_MAX; 737 if(pOldSelEntry) 738 { 739 sEntryName = GetEntryText(pOldSelEntry); 740 nSelPos = (sal_uInt16)GetModel()->GetAbsPos(pOldSelEntry); 741 } 742 Clear(); 743 if(!pSwGlblDocContents) 744 Update( sal_False ); 745 746 SvLBoxEntry* pSelEntry = 0; 747 for( sal_uInt16 i = 0; i < nCount; i++) 748 { 749 SwGlblDocContentPtr pCont = pSwGlblDocContents->GetObject(i); 750 String sEntry; 751 Image aImage; 752 switch( pCont->GetType() ) 753 { 754 case GLBLDOC_UNKNOWN: 755 { 756 sEntry = aContextStrings[ST_TEXT - ST_GLOBAL_CONTEXT_FIRST]; 757 aImage = aEntryImages.GetImage(SID_SW_START + GLOBAL_CONTENT_TEXT); 758 } 759 break; 760 case GLBLDOC_TOXBASE: 761 { 762 const SwTOXBase* pBase = pCont->GetTOX(); 763 sEntry = pBase->GetTitle(); 764 aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_INDEX); 765 } 766 break; 767 case GLBLDOC_SECTION: 768 { 769 const SwSection* pSect = pCont->GetSection(); 770 sEntry = pSect->GetSectionName(); 771 aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_REGION); 772 } 773 break; 774 } 775 SvLBoxEntry* pEntry = InsertEntry(sEntry, aImage, aImage, 776 0, sal_False, LIST_APPEND, pCont); 777 if(sEntry == sEntryName) 778 { 779 pSelEntry = pEntry; 780 } 781 } 782 if(pSelEntry) 783 { 784 Select(pSelEntry); 785 } 786 else if(nSelPos != USHRT_MAX && nSelPos < nCount) 787 { 788 Select(GetEntry(nSelPos)); 789 } 790 else if(nCount) 791 Select(First()); 792 else 793 SelectHdl(); 794 SetUpdateMode( sal_True ); 795 } 796 } 797 798 /*-----------------13.06.97 10:32------------------- 799 800 --------------------------------------------------*/ 801 void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont, const String* pFileName ) 802 { 803 Sequence< OUString > aFileNames; 804 if ( !pFileName ) 805 { 806 pDefParentWin = Application::GetDefDialogParent(); 807 Application::SetDefDialogParent( this ); 808 if ( pDocInserter ) 809 delete pDocInserter; 810 pDocInserter = new ::sfx2::DocumentInserter( 0, String::CreateFromAscii("swriter"), true ); 811 pDocInserter->StartExecuteModal( LINK( this, SwGlobalTree, DialogClosedHdl ) ); 812 } 813 else if ( pFileName->Len() ) 814 { 815 aFileNames.realloc(1); 816 INetURLObject aFileName; 817 aFileName.SetSmartURL( *pFileName ); 818 aFileNames.getArray()[0] = aFileName.GetMainURL( INetURLObject::NO_DECODE ); 819 InsertRegion( pCont, aFileNames ); 820 } 821 } 822 823 /*-----------------18.06.97 12:42------------------- 824 825 --------------------------------------------------*/ 826 void SwGlobalTree::EditContent(const SwGlblDocContent* pCont ) 827 { 828 sal_uInt16 nSlot = 0; 829 switch( pCont->GetType() ) 830 { 831 case GLBLDOC_UNKNOWN: 832 pActiveShell->GetView().GetEditWin().GrabFocus(); 833 break; 834 case GLBLDOC_TOXBASE: 835 { 836 const SwTOXBase* pBase = pCont->GetTOX(); 837 if(pBase) 838 nSlot = FN_INSERT_MULTI_TOX; 839 } 840 break; 841 case GLBLDOC_SECTION: 842 { 843 OpenDoc(pCont); 844 845 nSlot = 0; 846 pCont = 0; 847 } 848 break; 849 } 850 if(pCont) 851 GotoContent(pCont); 852 if(nSlot) 853 { 854 pActiveShell->GetView().GetViewFrame()->GetDispatcher()->Execute(nSlot); 855 if(Update( sal_False )) 856 Display(); 857 } 858 } 859 860 /*-----------------13.06.97 14:22------------------- 861 862 --------------------------------------------------*/ 863 IMPL_LINK( SwGlobalTree, PopupHdl, Menu* , pMenu) 864 { 865 ExcecuteContextMenuAction( pMenu->GetCurItemId()); 866 return sal_True; 867 } 868 /* -----------------26.08.2003 11:57----------------- 869 870 --------------------------------------------------*/ 871 void SwGlobalTree::ExcecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ) 872 //IMPL_LINK( SwGlobalTree, PopupHdl, Menu* , pMenu) 873 { 874 // sal_uInt16 nId = pMenu->GetCurItemId(); 875 SvLBoxEntry* pEntry = FirstSelected(); 876 SwGlblDocContent* pCont = pEntry ? (SwGlblDocContent*)pEntry->GetUserData() : 0; 877 // wird waehrend des Dialogs ein RequestHelp gerufen, 878 // dann geht der Content verloren. Deshalb wird hier eine 879 // Kopie angelegt, in der nur die DocPos richtig gesetzt ist. 880 SwGlblDocContent* pContCopy = 0; 881 if(pCont) 882 pContCopy = new SwGlblDocContent(pCont->GetDocPos()); 883 SfxDispatcher& rDispatch = *pActiveShell->GetView().GetViewFrame()->GetDispatcher(); 884 sal_uInt16 nSlot = 0; 885 bool bDeleteContentCopy = true; 886 switch( nSelectedPopupEntry ) 887 { 888 case CTX_UPDATE_SEL: 889 { 890 // zwei Durchlaeufe: zuerst die Bereiche, dann die Verzeichnisse 891 // aktualisieren 892 SvLBoxEntry* pSelEntry = FirstSelected(); 893 while( pSelEntry ) 894 { 895 SwGlblDocContent* pContent = (SwGlblDocContent*)pSelEntry->GetUserData(); 896 if(GLBLDOC_SECTION == pContent->GetType() && 897 pContent->GetSection()->IsConnected()) 898 { 899 ((SwSection*)pContent->GetSection())->UpdateNow(); 900 } 901 902 pSelEntry = NextSelected(pSelEntry); 903 } 904 pSelEntry = FirstSelected(); 905 while( pSelEntry ) 906 { 907 SwGlblDocContent* pContent = (SwGlblDocContent*)pSelEntry->GetUserData(); 908 if(GLBLDOC_TOXBASE == pContent->GetType()) 909 pActiveShell->UpdateTableOf(*pContent->GetTOX()); 910 pSelEntry = NextSelected(pSelEntry); 911 } 912 913 } 914 break; 915 case CTX_UPDATE_INDEX: 916 { 917 nSlot = FN_UPDATE_TOX; 918 } 919 break; 920 case CTX_UPDATE_LINK: 921 case CTX_UPDATE_ALL: 922 { 923 pActiveShell->GetLinkManager().UpdateAllLinks(sal_True); 924 if(CTX_UPDATE_ALL == nSelectedPopupEntry) 925 nSlot = FN_UPDATE_TOX; 926 pCont = 0; 927 } 928 break; 929 case CTX_EDIT: 930 { 931 DBG_ASSERT(pCont, "Edit ohne Entry ? " ); 932 EditContent(pCont); 933 } 934 break; 935 case CTX_EDIT_LINK: 936 { 937 DBG_ASSERT(pCont, "Edit ohne Entry ? " ); 938 SfxStringItem aName(FN_EDIT_REGION, 939 pCont->GetSection()->GetSectionName()); 940 rDispatch.Execute(FN_EDIT_REGION, SFX_CALLMODE_ASYNCHRON, &aName, 0L); 941 } 942 break; 943 case CTX_DELETE: 944 { 945 // sind mehrere Eintraege selektiert, dann muss nach jedem delete 946 // das Array neu gefuellt werden. Damit man sich nichts merken muss, 947 // beginnt das Loeschen am Ende 948 SvLBoxEntry* pSelEntry = LastSelected(); 949 SwGlblDocContents* pTempContents = 0; 950 pActiveShell->StartAction(); 951 while(pSelEntry) 952 { 953 pActiveShell->DeleteGlobalDocContent( 954 pTempContents ? *pTempContents : *pSwGlblDocContents, 955 (sal_uInt16)GetModel()->GetAbsPos(pSelEntry)); 956 pSelEntry = PrevSelected(pSelEntry); 957 if(pSelEntry) 958 { 959 pTempContents = new SwGlblDocContents; 960 pActiveShell->GetGlobalDocContent(*pTempContents); 961 } 962 } 963 delete pTempContents; 964 pActiveShell->EndAction(); 965 pCont = 0; 966 } 967 break; 968 case CTX_INSERT_ANY_INDEX: 969 // case CTX_INSERT_CNTIDX: 970 // case CTX_INSERT_USRIDX: 971 { 972 if(pContCopy) 973 { 974 SfxItemSet aSet(pActiveShell->GetView().GetPool(), 975 RES_COL, RES_COL, 976 RES_BACKGROUND, RES_BACKGROUND, 977 RES_FRM_SIZE, RES_FRM_SIZE, 978 SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE, 979 RES_LR_SPACE, RES_LR_SPACE, 980 FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE, 981 0); 982 983 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 984 DBG_ASSERT(pFact, "Dialogdiet fail!"); 985 AbstractMultiTOXTabDialog* pDlg = pFact->CreateMultiTOXTabDialog( DLG_MULTI_TOX, 986 this, aSet, 987 *pActiveShell, 988 0, 989 USHRT_MAX, 990 sal_True); 991 DBG_ASSERT(pDlg, "Dialogdiet fail!"); 992 if(RET_OK == pDlg->Execute()) 993 { 994 SwTOXDescription& rDesc = pDlg->GetTOXDescription( 995 pDlg->GetCurrentTOXType()); 996 SwTOXMgr aMgr(pActiveShell); 997 SwTOXBase* pToInsert = 0; 998 if(aMgr.UpdateOrInsertTOX(rDesc, &pToInsert, pDlg->GetOutputItemSet())) 999 pActiveShell->InsertGlobalDocContent( *pContCopy, *pToInsert ); 1000 } 1001 pCont = 0; 1002 delete pDlg; 1003 } 1004 } 1005 break; 1006 case CTX_INSERT_FILE: 1007 { 1008 bDeleteContentCopy = false; 1009 pDocContent = pContCopy; 1010 InsertRegion( pContCopy ); 1011 pCont = NULL; 1012 } 1013 break; 1014 case CTX_INSERT_NEW_FILE: 1015 { 1016 SfxViewFrame* pGlobFrm = pActiveShell->GetView().GetViewFrame(); 1017 SwGlobalFrameListener_Impl aFrmListener(*pGlobFrm); 1018 1019 sal_uLong nEntryPos = pEntry ? GetModel()->GetAbsPos(pEntry) : (sal_uLong)-1; 1020 // neues Dok anlegen 1021 SfxStringItem aFactory(SID_NEWDOCDIRECT, 1022 SwDocShell::Factory().GetFilterContainer()->GetName()); 1023 1024 const SfxFrameItem* pItem = (SfxFrameItem*) 1025 rDispatch.Execute(SID_NEWDOCDIRECT, 1026 SFX_CALLMODE_SYNCHRON, &aFactory, 0L); 1027 1028 // sichern unter 1029 SfxFrame* pFrm = pItem ? pItem->GetFrame() : 0; 1030 SfxViewFrame* pFrame = pFrm ? pFrm->GetCurrentViewFrame() : 0; 1031 if( pFrame ) 1032 { 1033 const SfxBoolItem* pBool = (const SfxBoolItem*) 1034 pFrame->GetDispatcher()->Execute( 1035 SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON ); 1036 SfxObjectShell& rObj = *pFrame->GetObjectShell(); 1037 const SfxMedium* pMedium = rObj.GetMedium(); 1038 String sNewFile(pMedium->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI)); 1039 // Bereich mit dem Dok-Namen einfuegen 1040 // eigenes Dok in den Vordergrund 1041 1042 if(aFrmListener.IsValid() && sNewFile.Len()) 1043 { 1044 pGlobFrm->ToTop(); 1045 // durch das Update sind die Eintraege invalid 1046 if(nEntryPos != (sal_uLong)-1) 1047 { 1048 Update( sal_False ); 1049 Display(); 1050 Select(GetModel()->GetEntryAtAbsPos(nEntryPos)); 1051 pEntry = FirstSelected(); 1052 pCont = pEntry ? (SwGlblDocContent*)pEntry->GetUserData() : 0; 1053 } 1054 else 1055 { 1056 pEntry = 0; 1057 pCont = 0; 1058 } 1059 if(pBool->GetValue()) 1060 { 1061 InsertRegion(pCont, &sNewFile); 1062 pFrame->ToTop(); 1063 } 1064 else 1065 pFrame->GetDispatcher()->Execute(SID_CLOSEWIN, 1066 SFX_CALLMODE_SYNCHRON); 1067 } 1068 else 1069 { 1070 pFrame->ToTop(); 1071 return; 1072 } 1073 } 1074 } 1075 break; 1076 case CTX_INSERT_TEXT: 1077 { 1078 if(pCont) 1079 pActiveShell->InsertGlobalDocContent(*pCont); 1080 else 1081 { 1082 pActiveShell->SplitNode(); // leeres Dokument 1083 pActiveShell->Up( sal_False, 1 ); 1084 } 1085 pActiveShell->GetView().GetEditWin().GrabFocus(); 1086 } 1087 break; 1088 case CTX_UPDATE: 1089 pCont = 0; 1090 break; 1091 default:; 1092 // hier passiert nichts 1093 } 1094 if(pCont) 1095 GotoContent(pCont); 1096 if(nSlot) 1097 rDispatch.Execute(nSlot); 1098 if(Update( sal_False )) 1099 Display(); 1100 if ( bDeleteContentCopy ) 1101 delete pContCopy; 1102 else 1103 bDeleteContentCopy = true; 1104 // return sal_True; 1105 } 1106 1107 /*-----------------16.06.97 07:57------------------- 1108 1109 --------------------------------------------------*/ 1110 IMPL_LINK( SwGlobalTree, Timeout, Timer*, EMPTYARG ) 1111 { 1112 if(!HasFocus() && Update( sal_False )) 1113 Display(); 1114 return 0; 1115 } 1116 1117 /*-----------------13.06.97 16:56------------------- 1118 1119 --------------------------------------------------*/ 1120 void SwGlobalTree::GotoContent(const SwGlblDocContent* pCont) 1121 { 1122 pActiveShell->EnterStdMode(); 1123 1124 switch( pCont->GetType() ) 1125 { 1126 case GLBLDOC_UNKNOWN: 1127 pActiveShell->GotoGlobalDocContent(*pCont); 1128 break; 1129 case GLBLDOC_TOXBASE: 1130 { 1131 String sName = pCont->GetTOX()->GetTOXName(); 1132 if (!pActiveShell->GotoNextTOXBase(&sName)) 1133 pActiveShell->GotoPrevTOXBase(&sName); 1134 } 1135 break; 1136 case GLBLDOC_SECTION: 1137 break; 1138 } 1139 1140 } 1141 /*-----------------16.06.97 07:42------------------- 1142 1143 --------------------------------------------------*/ 1144 void SwGlobalTree::ShowTree() 1145 { 1146 aUpdateTimer.Start(); 1147 SvTreeListBox::Show(); 1148 } 1149 /*-----------------16.06.97 07:42------------------- 1150 1151 --------------------------------------------------*/ 1152 void SwGlobalTree::HideTree() 1153 { 1154 aUpdateTimer.Stop(); 1155 SvTreeListBox::Hide(); 1156 } 1157 /*-----------------18.06.97 10:02------------------- 1158 1159 --------------------------------------------------*/ 1160 void SwGlobalTree::ExecCommand(sal_uInt16 nCmd) 1161 { 1162 SvLBoxEntry* pEntry = FirstSelected(); 1163 DBG_ASSERT(pEntry, "gleich knallt's"); 1164 if(FN_GLOBAL_EDIT == nCmd) 1165 { 1166 const SwGlblDocContent* pCont = (const SwGlblDocContent*) 1167 pEntry->GetUserData(); 1168 EditContent(pCont); 1169 } 1170 else 1171 { 1172 if(GetSelectionCount() == 1) 1173 { 1174 sal_Bool bMove = sal_False; 1175 sal_uInt16 nSource = (sal_uInt16)GetModel()->GetAbsPos(pEntry); 1176 sal_uInt16 nDest = nSource; 1177 switch(nCmd) 1178 { 1179 case FN_ITEM_DOWN: 1180 { 1181 sal_uInt16 nEntryCount = (sal_uInt16)GetEntryCount(); 1182 bMove = nEntryCount > nSource + 1; 1183 nDest+= 2; 1184 } 1185 break; 1186 case FN_ITEM_UP: 1187 { 1188 if(nSource) 1189 bMove = 0 != nSource; 1190 nDest--; 1191 } 1192 break; 1193 } 1194 if( bMove && pActiveShell->MoveGlobalDocContent( 1195 *pSwGlblDocContents, nSource, nSource + 1, nDest ) && 1196 Update( sal_False )) 1197 Display(); 1198 } 1199 } 1200 } 1201 1202 /*-----------------16.06.97 07:43------------------- 1203 1204 --------------------------------------------------*/ 1205 sal_Bool SwGlobalTree::Update(sal_Bool bHard) 1206 { 1207 SwView* pActView = GetParentWindow()->GetCreateView(); 1208 sal_Bool bRet = sal_False; 1209 if(pActView && pActView->GetWrtShellPtr()) 1210 { 1211 const SwWrtShell* pOldShell = pActiveShell; 1212 pActiveShell = pActView->GetWrtShellPtr(); 1213 if(pActiveShell != pOldShell) 1214 { 1215 delete pSwGlblDocContents; 1216 pSwGlblDocContents = 0; 1217 } 1218 if(!pSwGlblDocContents) 1219 { 1220 pSwGlblDocContents = new SwGlblDocContents; 1221 bRet = sal_True; 1222 pActiveShell->GetGlobalDocContent(*pSwGlblDocContents); 1223 } 1224 else 1225 { 1226 sal_Bool bCopy = sal_False; 1227 SwGlblDocContents* pTempContents = new SwGlblDocContents; 1228 pActiveShell->GetGlobalDocContent(*pTempContents); 1229 if(pTempContents->Count() != pSwGlblDocContents->Count() || 1230 pTempContents->Count() != GetEntryCount()) 1231 { 1232 bRet = sal_True; 1233 bCopy = sal_True; 1234 } 1235 else 1236 { 1237 for(sal_uInt16 i = 0; i < pTempContents->Count() && !bCopy; i++) 1238 { 1239 SwGlblDocContent* pLeft = pTempContents->GetObject(i); 1240 SwGlblDocContent* pRight = pSwGlblDocContents->GetObject(i); 1241 GlobalDocContentType eType = pLeft->GetType(); 1242 SvLBoxEntry* pEntry = GetEntry(i); 1243 String sTemp = GetEntryText(pEntry); 1244 if ( 1245 eType != pRight->GetType() || 1246 ( 1247 eType == GLBLDOC_SECTION && 1248 pLeft->GetSection()->GetSectionName() != sTemp 1249 ) || 1250 ( 1251 eType == GLBLDOC_TOXBASE && 1252 pLeft->GetTOX()->GetTitle() != sTemp 1253 ) 1254 ) 1255 { 1256 bCopy = bRet = sal_True; 1257 } 1258 } 1259 } 1260 if(bCopy || bHard) 1261 { 1262 sal_uInt16 i; 1263 1264 pSwGlblDocContents->DeleteAndDestroy(0, pSwGlblDocContents->Count()); 1265 for( i = 0; i < pTempContents->Count(); i++) 1266 { 1267 pSwGlblDocContents->Insert(pTempContents->GetObject(i)); 1268 } 1269 for( i = pTempContents->Count(); i; i--) 1270 pTempContents->Remove(i - 1); 1271 1272 } 1273 delete pTempContents; 1274 } 1275 1276 } 1277 else 1278 { 1279 Clear(); 1280 if(pSwGlblDocContents) 1281 pSwGlblDocContents->DeleteAndDestroy(0, pSwGlblDocContents->Count()); 1282 } 1283 // hier muss noch eine Veraenderungspruefung rein! 1284 return bRet; 1285 } 1286 1287 /*-----------------25.06.97 16:20------------------- 1288 1289 --------------------------------------------------*/ 1290 void SwGlobalTree::OpenDoc(const SwGlblDocContent* pCont) 1291 { 1292 String sFileName(pCont->GetSection()->GetLinkFileName().GetToken(0, 1293 sfx2::cTokenSeperator)); 1294 sal_Bool bFound = sal_False; 1295 const SfxObjectShell* pCurr = SfxObjectShell::GetFirst(); 1296 while( !bFound && pCurr ) 1297 { 1298 if(pCurr->GetMedium() && 1299 String(pCurr->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI)) == sFileName) 1300 { 1301 bFound = sal_True; 1302 SwGlobalTree::SetShowShell(pCurr); 1303 Application::PostUserEvent( STATIC_LINK( 1304 this, SwGlobalTree, ShowFrameHdl ) ); 1305 pCurr = 0; 1306 } 1307 else 1308 pCurr = SfxObjectShell::GetNext(*pCurr); 1309 } 1310 if(!bFound) 1311 { 1312 SfxStringItem aURL(SID_FILE_NAME, 1313 sFileName); 1314 SfxBoolItem aReadOnly(SID_DOC_READONLY, sal_False); 1315 SfxStringItem aTargetFrameName( SID_TARGETNAME, String::CreateFromAscii("_blank") ); 1316 SfxStringItem aReferer(SID_REFERER, pActiveShell->GetView().GetDocShell()->GetTitle()); 1317 pActiveShell->GetView().GetViewFrame()->GetDispatcher()-> 1318 Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, 1319 &aURL, &aReadOnly, &aReferer, &aTargetFrameName, 0L); 1320 } 1321 } 1322 1323 /*-----------------25.06.97 16:08------------------- 1324 1325 --------------------------------------------------*/ 1326 IMPL_LINK( SwGlobalTree, DoubleClickHdl, SwGlobalTree *, EMPTYARG ) 1327 { 1328 SvLBoxEntry* pEntry = GetCurEntry(); 1329 SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData(); 1330 if(pCont->GetType() == GLBLDOC_SECTION) 1331 OpenDoc(pCont); 1332 else 1333 { 1334 GotoContent(pCont); 1335 pActiveShell->GetView().GetEditWin().GrabFocus(); 1336 } 1337 return 0; 1338 } 1339 1340 /*-----------------07.10.97 08:09------------------- 1341 1342 --------------------------------------------------*/ 1343 IMPL_STATIC_LINK_NOINSTANCE(SwGlobalTree, ShowFrameHdl, SwGlobalTree*, EMPTYARG) 1344 { 1345 if(SwGlobalTree::GetShowShell()) 1346 SfxViewFrame::GetFirst(SwGlobalTree::GetShowShell())->ToTop(); 1347 SwGlobalTree::SetShowShell(0); 1348 return 0; 1349 } 1350 /* -----------------04.11.98 10:43------------------- 1351 * 1352 * --------------------------------------------------*/ 1353 void SwGlobalTree::InitEntry(SvLBoxEntry* pEntry, 1354 const XubString& rStr ,const Image& rImg1,const Image& rImg2, 1355 SvLBoxButtonKind eButtonKind) 1356 { 1357 sal_uInt16 nColToHilite = 1; //0==Bitmap;1=="Spalte1";2=="Spalte2" 1358 SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind ); 1359 SvLBoxString* pCol = (SvLBoxString*)pEntry->GetItem( nColToHilite ); 1360 SwLBoxString* pStr = new SwLBoxString( pEntry, 0, pCol->GetText() ); 1361 pEntry->ReplaceItem( pStr, nColToHilite ); 1362 } 1363 /* -----------------04.11.98 10:39------------------- 1364 * 1365 * --------------------------------------------------*/ 1366 1367 void SwLBoxString::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags, 1368 SvLBoxEntry* pEntry ) 1369 { 1370 SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData(); 1371 const SwSection* pSect; 1372 if(pCont->GetType() == GLBLDOC_SECTION && 1373 !(pSect = pCont->GetSection())->IsConnectFlag() ) 1374 { 1375 Font aOldFont( rDev.GetFont()); 1376 Font aFont(aOldFont); 1377 Color aCol( COL_LIGHTRED ); 1378 aFont.SetColor( aCol ); 1379 rDev.SetFont( aFont ); 1380 rDev.DrawText( rPos, GetText() ); 1381 rDev.SetFont( aOldFont ); 1382 } 1383 else 1384 SvLBoxString::Paint( rPos, rDev, nFlags, pEntry); 1385 } 1386 /* -----------------------------06.05.2002 10:20------------------------------ 1387 1388 ---------------------------------------------------------------------------*/ 1389 void SwGlobalTree::DataChanged( const DataChangedEvent& rDCEvt ) 1390 { 1391 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 1392 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 1393 { 1394 sal_uInt16 nResId = GetSettings().GetStyleSettings().GetHighContrastMode() ? IMG_NAVI_ENTRYBMPH : IMG_NAVI_ENTRYBMP; 1395 aEntryImages = ImageList(SW_RES(nResId)); 1396 Update(sal_True); 1397 } 1398 SvTreeListBox::DataChanged( rDCEvt ); 1399 } 1400 1401 void SwGlobalTree::InsertRegion( const SwGlblDocContent* _pContent, const Sequence< OUString >& _rFiles ) 1402 { 1403 sal_Int32 nFiles = _rFiles.getLength(); 1404 if ( nFiles ) 1405 { 1406 sal_Bool bMove = sal_False; 1407 if ( !_pContent ) 1408 { 1409 SvLBoxEntry* pLast = (SvLBoxEntry*)LastVisible(); 1410 _pContent = (SwGlblDocContent*)pLast->GetUserData(); 1411 bMove = sal_True; 1412 } 1413 String sFilePassword; 1414 sal_uInt16 nEntryCount = (sal_uInt16)GetEntryCount(); 1415 const OUString* pFileNames = _rFiles.getConstArray(); 1416 SwWrtShell& rSh = GetParentWindow()->GetCreateView()->GetWrtShell(); 1417 rSh.StartAction(); 1418 // after insertion of the first new content the 'pCont' parameter becomes invalid 1419 // find the index of the 'anchor' content to always use a current anchor content 1420 sal_uInt16 nAnchorContent = pSwGlblDocContents->Count() - 1; 1421 if ( !bMove ) 1422 { 1423 for( sal_uInt16 nContent = 0; nContent < pSwGlblDocContents->Count(); ++nContent ) 1424 { 1425 if( *_pContent == *pSwGlblDocContents->GetObject( nContent ) ) 1426 { 1427 nAnchorContent = nContent; 1428 break; 1429 } 1430 } 1431 } 1432 SwGlblDocContents aTempContents; 1433 for ( sal_Int32 nFile = 0; nFile < nFiles; ++nFile ) 1434 { 1435 //update the global document content after each inserted document 1436 rSh.GetGlobalDocContent(aTempContents); 1437 SwGlblDocContent* pAnchorContent = 0; 1438 DBG_ASSERT(aTempContents.Count() > (nAnchorContent + nFile), "invalid anchor content -> last insertion failed"); 1439 if ( aTempContents.Count() > (nAnchorContent + nFile) ) 1440 pAnchorContent = aTempContents.GetObject(nAnchorContent + (sal_uInt16)nFile); 1441 else 1442 pAnchorContent = aTempContents.GetObject(aTempContents.Count() - 1); 1443 String sFileName(pFileNames[nFile]); 1444 INetURLObject aFileUrl; 1445 aFileUrl.SetSmartURL( sFileName ); 1446 String sSectionName(String(aFileUrl.GetLastName( 1447 INetURLObject::DECODE_UNAMBIGUOUS)).GetToken(0, 1448 sfx2::cTokenSeperator)); 1449 sal_uInt16 nSectCount = rSh.GetSectionFmtCount(); 1450 String sTempSectionName(sSectionName); 1451 sal_uInt16 nAddNumber = 0; 1452 sal_uInt16 nCount = 0; 1453 // evtl : und Index anhaengen, wenn der Bereichsname schon vergeben ist 1454 while ( nCount < nSectCount ) 1455 { 1456 const SwSectionFmt& rFmt = rSh.GetSectionFmt(nCount); 1457 if ((rFmt.GetSection()->GetSectionName() == sTempSectionName) 1458 && rFmt.IsInNodesArr()) 1459 { 1460 nCount = 0; 1461 nAddNumber++; 1462 sTempSectionName = sSectionName; 1463 sTempSectionName += ':'; 1464 sTempSectionName += String::CreateFromInt32( nAddNumber ); 1465 } 1466 else 1467 nCount++; 1468 } 1469 1470 if ( nAddNumber ) 1471 sSectionName = sTempSectionName; 1472 1473 SwSectionData aSectionData(CONTENT_SECTION, sSectionName); 1474 aSectionData.SetProtectFlag(true); 1475 aSectionData.SetHidden(false); 1476 1477 aSectionData.SetLinkFileName(sFileName); 1478 aSectionData.SetType(FILE_LINK_SECTION); 1479 aSectionData.SetLinkFilePassword( sFilePassword ); 1480 1481 rSh.InsertGlobalDocContent( *pAnchorContent, aSectionData ); 1482 } 1483 if ( bMove ) 1484 { 1485 Update( sal_False ); 1486 rSh.MoveGlobalDocContent( 1487 *pSwGlblDocContents, nEntryCount, nEntryCount + (sal_uInt16)nFiles, nEntryCount - (sal_uInt16)nFiles ); 1488 } 1489 rSh.EndAction(); 1490 Update( sal_False ); 1491 Display(); 1492 } 1493 } 1494 1495 IMPL_LINK( SwGlobalTree, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg ) 1496 { 1497 Application::SetDefDialogParent( pDefParentWin ); 1498 if ( ERRCODE_NONE == _pFileDlg->GetError() ) 1499 { 1500 SfxMediumList* pMedList = pDocInserter->CreateMediumList(); 1501 if ( pMedList ) 1502 { 1503 Sequence< OUString >aFileNames( pMedList->Count() ); 1504 OUString* pFileNames = aFileNames.getArray(); 1505 SfxMedium* pMed = pMedList->First(); 1506 sal_Int32 nPos = 0; 1507 while ( pMed ) 1508 { 1509 String sFileName = pMed->GetURLObject().GetMainURL( INetURLObject::NO_DECODE ); 1510 sFileName += sfx2::cTokenSeperator; 1511 sFileName += pMed->GetFilter()->GetFilterName(); 1512 sFileName += sfx2::cTokenSeperator; 1513 pFileNames[nPos++] = sFileName; 1514 pMed = pMedList->Next(); 1515 } 1516 delete pMedList; 1517 InsertRegion( pDocContent, aFileNames ); 1518 DELETEZ( pDocContent ); 1519 } 1520 } 1521 return 0; 1522 } 1523 1524