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_sw.hxx" 26 27 28 29 #define NAVIPI_CXX 30 31 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers 32 #include <tools/list.hxx> 33 #include <svl/urlbmk.hxx> 34 #include <svl/stritem.hxx> 35 #include <svtools/filter.hxx> 36 #include <svl/urihelper.hxx> 37 #include <sot/formats.hxx> 38 #include <sot/filelist.hxx> 39 #include <sfx2/event.hxx> 40 #include <sfx2/imgmgr.hxx> 41 #include <sfx2/dispatch.hxx> 42 #include <sfx2/dockwin.hxx> 43 #include <vcl/toolbox.hxx> 44 #include <swtypes.hxx> // fuer Pathfinder 45 #include <errhdl.hxx> 46 #include <swmodule.hxx> 47 #ifndef _VIEW_HXX 48 #include <view.hxx> 49 #endif 50 #include <navicfg.hxx> 51 #include <wrtsh.hxx> 52 #ifndef _DOCSH_HXX 53 #include <docsh.hxx> 54 #endif 55 #include <actctrl.hxx> 56 #include <IMark.hxx> 57 #include <navipi.hxx> 58 #include <content.hxx> 59 #include <workctrl.hxx> 60 #include <section.hxx> 61 #include <edtwin.hxx> 62 #include <sfx2/app.hxx> 63 #ifndef _CMDID_H 64 #include <cmdid.h> 65 #endif 66 #ifndef _HELPID_H 67 #include <helpid.h> 68 #endif 69 #ifndef _RIBBAR_HRC 70 #include <ribbar.hrc> 71 #endif 72 #ifndef _NAVIPI_HRC 73 #include <navipi.hrc> 74 #endif 75 #ifndef _UTLUI_HRC 76 #include <utlui.hrc> 77 #endif 78 79 #include "access.hrc" 80 81 #include <unomid.h> 82 83 84 #define PAGE_CHANGE_TIMEOUT 1000 //Timeout fuer Seitenwechsel 85 86 #define JUMP_TYPE_TBL 0 87 #define JUMP_TYPE_FRM 1 88 #define JUMP_TYPE_GRF 2 89 #define JUMP_TYPE_REG 3 90 #define JUMP_TYPE_BKM 4 91 92 // Version fuer Konfiguration 93 94 #define NAVI_VERSION0 0 95 #define NAVI_VERSION1 1 96 #define NAVI_VERSION2 2 // bIsGlobalActive 97 98 #define NAVI_CONFIG_VERSION NAVI_VERSION2 99 100 using namespace ::com::sun::star::uno; 101 using namespace ::com::sun::star::frame; 102 103 SFX_IMPL_CHILDWINDOW_CONTEXT( SwNavigationChild, SID_NAVIGATOR, SwView ) 104 105 /*------------------------------------------------------------------------ 106 Bechreibung: Steuerzeichen aus dem Outline-Entry filtern 107 ------------------------------------------------------------------------*/ 108 109 void SwNavigationPI::CleanEntry( String& rEntry ) 110 { 111 sal_uInt16 i = rEntry.Len(); 112 if( i ) 113 for( sal_Unicode* pStr = rEntry.GetBufferAccess(); i; --i, ++pStr ) 114 if( *pStr == 10 || *pStr == 9 ) 115 *pStr = 0x20; 116 } 117 /*------------------------------------------------------------------------ 118 Beschreibung: Ausfuehrung der Drag-Operation 119 mit und ohne Childs 120 ------------------------------------------------------------------------*/ 121 122 void SwNavigationPI::MoveOutline(sal_uInt16 nSource, sal_uInt16 nTarget, 123 sal_Bool bWithChilds) 124 { 125 SwView *pView = GetCreateView(); 126 SwWrtShell &rSh = pView->GetWrtShell(); 127 if(nTarget < nSource || nTarget == USHRT_MAX) 128 nTarget ++; 129 if ( rSh.IsOutlineMovable( nSource )) 130 { 131 132 short nMove = nTarget-nSource; //( nDir<0 ) ? 1 : 0 ; 133 rSh.GotoOutline(nSource); 134 if (bWithChilds) 135 rSh.MakeOutlineSel(nSource, nSource, sal_True); 136 // Die selektierten Children zaehlen bei der Bewegung vorwaerts nicht mit 137 sal_uInt16 nLastOutlinePos = rSh.GetOutlinePos(MAXLEVEL); 138 if(bWithChilds && nMove > 1 && 139 nLastOutlinePos < nTarget) 140 { 141 if(!rSh.IsCrsrPtAtEnd()) 142 rSh.SwapPam(); 143 nMove -= nLastOutlinePos - nSource; 144 } 145 if(!bWithChilds || nMove < 1 || nLastOutlinePos < nTarget ) 146 rSh.MoveOutlinePara( nMove ); 147 rSh.ClearMark(); 148 rSh.GotoOutline( nSource + nMove); 149 FillBox(); 150 } 151 152 } 153 154 155 /*------------------------------------------------------------------------ 156 Beschreibung: Nach Goto einen Status Rahmenselektion aufheben 157 ------------------------------------------------------------------------*/ 158 159 160 void lcl_UnSelectFrm(SwWrtShell *pSh) 161 { 162 if (pSh->IsFrmSelected()) 163 { 164 pSh->UnSelectFrm(); 165 pSh->LeaveSelFrmMode(); 166 } 167 } 168 169 /*------------------------------------------------------------------------ 170 Beschreibung: Select der Documentanzeige 171 ------------------------------------------------------------------------*/ 172 173 174 IMPL_LINK( SwNavigationPI, DocListBoxSelectHdl, ListBox *, pBox ) 175 { 176 int nEntryIdx = pBox->GetSelectEntryPos(); 177 SwView *pView ; 178 pView = SwModule::GetFirstView(); 179 while (nEntryIdx-- && pView) 180 { 181 pView = SwModule::GetNextView(pView); 182 } 183 if(!pView) 184 { 185 nEntryIdx == 0 ? 186 aContentTree.ShowHiddenShell(): 187 aContentTree.ShowActualView(); 188 189 190 } 191 else 192 { 193 aContentTree.SetConstantShell(pView->GetWrtShellPtr()); 194 } 195 return 0; 196 } 197 198 /*------------------------------------------------------------------------ 199 Beschreibung: Fuellen der ListBox fuer Outline Sicht oder Dokumente 200 Der PI wird auf volle Groesse gesetzt 201 ------------------------------------------------------------------------*/ 202 203 204 void SwNavigationPI::FillBox() 205 { 206 if(pContentWrtShell) 207 { 208 aContentTree.SetHiddenShell( pContentWrtShell ); 209 aContentTree.Display( sal_False ); 210 } 211 else 212 { 213 SwView *pView = GetCreateView(); 214 if(!pView) 215 { 216 aContentTree.SetActiveShell(0); 217 } 218 else if( pView != pActContView) 219 { 220 SwWrtShell* pWrtShell = pView->GetWrtShellPtr(); 221 aContentTree.SetActiveShell(pWrtShell); 222 } 223 else 224 aContentTree.Display( sal_True ); 225 pActContView = pView; 226 } 227 } 228 229 230 void SwNavigationPI::UsePage(SwWrtShell *pSh) 231 { 232 if (!pSh) 233 { 234 SwView *pView = GetCreateView(); 235 pSh = pView ? &pView->GetWrtShell() : 0; 236 GetPageEdit().SetValue(1); 237 } 238 if (pSh) 239 { 240 const sal_uInt16 nPageCnt = pSh->GetPageCnt(); 241 sal_uInt16 nPhyPage, nVirPage; 242 pSh->GetPageNum(nPhyPage, nVirPage); 243 244 GetPageEdit().SetMax(nPageCnt); 245 GetPageEdit().SetLast(nPageCnt); 246 GetPageEdit().SetValue(nPhyPage); 247 } 248 } 249 250 /*------------------------------------------------------------------------ 251 Beschreibung: SelectHandler der Toolboxen 252 ------------------------------------------------------------------------*/ 253 254 255 IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox ) 256 { 257 const sal_uInt16 nCurrItemId = pBox->GetCurItemId(); 258 SwView *pView = GetCreateView(); 259 if (!pView) 260 return 1; 261 SwWrtShell &rSh = pView->GetWrtShell(); 262 //MouseModifier fuer Outline-Move besorgen 263 264 //Standard: Unterebenen werden mitgenommen 265 // mit Ctrl Unterebenen nicht mitnehmen 266 sal_Bool bOutlineWithChilds = ( KEY_MOD1 != pBox->GetModifier()); 267 int nFuncId = 0; 268 sal_Bool bFocusToDoc = sal_False; 269 switch (nCurrItemId) 270 { 271 case FN_UP: 272 case FN_DOWN: 273 { 274 // #i75416# move the execution of the search to an asynchronously called static link 275 bool* pbNext = new bool( FN_DOWN == nCurrItemId ); 276 Application::PostUserEvent( STATIC_LINK(pView, SwView, MoveNavigationHdl), pbNext ); 277 } 278 break; 279 case FN_SHOW_ROOT: 280 { 281 aContentTree.ToggleToRoot(); 282 } 283 break; 284 case FN_SHOW_CONTENT_BOX: 285 case FN_SELECT_CONTENT: 286 if(pContextWin!=NULL && pContextWin->GetFloatingWindow()!=NULL) 287 { 288 if(_IsZoomedIn() ) 289 { 290 _ZoomOut(); 291 } 292 else 293 { 294 _ZoomIn(); 295 } 296 } 297 return sal_True; 298 //break; 299 // Funktionen, die eine direkte Aktion ausloesen 300 301 case FN_SELECT_FOOTER: 302 { 303 rSh.MoveCrsr(); 304 const sal_uInt16 eType = rSh.GetFrmType(0,sal_False); 305 if (eType & FRMTYPE_FOOTER) 306 { 307 if (rSh.EndPg()) 308 nFuncId = FN_END_OF_PAGE; 309 } 310 else if (rSh.GotoFooterTxt()) 311 nFuncId = FN_TO_FOOTER; 312 bFocusToDoc = sal_True; 313 } 314 break; 315 case FN_SELECT_HEADER: 316 { 317 rSh.MoveCrsr(); 318 const sal_uInt16 eType = rSh.GetFrmType(0,sal_False); 319 if (eType & FRMTYPE_HEADER) 320 { 321 if (rSh.SttPg()) 322 nFuncId = FN_START_OF_PAGE; 323 } 324 else if (rSh.GotoHeaderTxt()) 325 nFuncId = FN_TO_HEADER; 326 bFocusToDoc = sal_True; 327 } 328 break; 329 case FN_SELECT_FOOTNOTE: 330 { 331 rSh.MoveCrsr(); 332 const sal_uInt16 eFrmType = rSh.GetFrmType(0,sal_False); 333 // aus Fussnote zum Anker springen 334 if (eFrmType & FRMTYPE_FOOTNOTE) 335 { 336 if (rSh.GotoFtnAnchor()) 337 nFuncId = FN_FOOTNOTE_TO_ANCHOR; 338 } 339 // andernfalls zuerst zum Fussnotentext springen; geht 340 // dies nicht, zur naechten Fussnote; geht auch dies 341 // nicht, zur vorhergehenden Fussnote 342 else 343 { 344 if (rSh.GotoFtnTxt()) 345 nFuncId = FN_FOOTNOTE_TO_ANCHOR; 346 else if (rSh.GotoNextFtnAnchor()) 347 nFuncId = FN_NEXT_FOOTNOTE; 348 else if (rSh.GotoPrevFtnAnchor()) 349 nFuncId = FN_PREV_FOOTNOTE; 350 } 351 bFocusToDoc = sal_True; 352 } 353 break; 354 355 case FN_SELECT_SET_AUTO_BOOKMARK: 356 MakeMark(); 357 break; 358 case FN_ITEM_DOWN: 359 case FN_ITEM_UP: 360 case FN_ITEM_LEFT: 361 case FN_ITEM_RIGHT: 362 case FN_GLOBAL_EDIT: 363 { 364 if(IsGlobalMode()) 365 aGlobalTree.ExecCommand(nCurrItemId); 366 else 367 aContentTree.ExecCommand(nCurrItemId, bOutlineWithChilds); 368 } 369 break; 370 case FN_GLOBAL_SWITCH: 371 { 372 ToggleTree(); 373 pConfig->SetGlobalActive(IsGlobalMode()); 374 } 375 break; 376 case FN_GLOBAL_SAVE_CONTENT: 377 { 378 sal_Bool bSave = rSh.IsGlblDocSaveLinks(); 379 rSh.SetGlblDocSaveLinks( !bSave ); 380 pBox->CheckItem(FN_GLOBAL_SAVE_CONTENT, !bSave ); 381 } 382 break; 383 } 384 385 if (nFuncId) 386 { 387 lcl_UnSelectFrm(&rSh); 388 } 389 if(bFocusToDoc) 390 pView->GetEditWin().GrabFocus(); 391 return sal_True; 392 } 393 /*------------------------------------------------------------------------ 394 Beschreibung: ClickHandler der Toolboxen 395 ------------------------------------------------------------------------*/ 396 397 398 IMPL_LINK( SwNavigationPI, ToolBoxClickHdl, ToolBox *, pBox ) 399 { 400 const sal_uInt16 nCurrItemId = pBox->GetCurItemId(); 401 switch (nCurrItemId) 402 { 403 case FN_GLOBAL_UPDATE: 404 case FN_GLOBAL_OPEN: 405 { 406 aGlobalTree.TbxMenuHdl(nCurrItemId, pBox); 407 } 408 break; 409 } 410 411 return sal_True; 412 } 413 414 /*-----------------13.07.04 ------------------- 415 ----------------------------------------------*/ 416 417 IMPL_LINK( SwNavigationPI, ToolBoxDropdownClickHdl, ToolBox*, pBox ) 418 { 419 const sal_uInt16 nCurrItemId = pBox->GetCurItemId(); 420 switch (nCurrItemId) 421 { 422 case FN_CREATE_NAVIGATION: 423 { 424 CreateNavigationTool(pBox->GetItemRect(FN_CREATE_NAVIGATION), sal_True); 425 } 426 break; 427 428 case FN_DROP_REGION: 429 { 430 static const char* aHIDs[] = 431 { 432 HID_NAVI_DRAG_HYP, 433 HID_NAVI_DRAG_LINK, 434 HID_NAVI_DRAG_COPY, 435 }; 436 PopupMenu *pMenu = new PopupMenu; 437 for (sal_uInt16 i = 0; i <= REGION_MODE_EMBEDDED; i++) 438 { 439 pMenu->InsertItem( i + 1, aContextArr[i] ); 440 pMenu->SetHelpId(i + 1, aHIDs[i]); 441 } 442 pMenu->CheckItem( nRegionMode + 1 ); 443 pMenu->SetSelectHdl(LINK(this, SwNavigationPI, MenuSelectHdl)); 444 pBox->SetItemDown( nCurrItemId, sal_True ); 445 pMenu->Execute( pBox, 446 pBox->GetItemRect(FN_DROP_REGION), 447 POPUPMENU_EXECUTE_DOWN ); 448 pBox->SetItemDown( nCurrItemId, sal_False ); 449 pBox->EndSelection(); 450 delete pMenu; 451 pBox->Invalidate(); 452 } 453 break; 454 case FN_OUTLINE_LEVEL: 455 { 456 PopupMenu *pMenu = new PopupMenu; 457 for (sal_uInt16 i = 101; i <= 100 + MAXLEVEL; i++) 458 { 459 pMenu->InsertItem( i, String::CreateFromInt32(i - 100) ); 460 pMenu->SetHelpId( i, HID_NAVI_OUTLINES ); 461 } 462 pMenu->CheckItem( aContentTree.GetOutlineLevel() + 100 ); 463 pMenu->SetSelectHdl(LINK(this, SwNavigationPI, MenuSelectHdl)); 464 pBox->SetItemDown( nCurrItemId, sal_True ); 465 pMenu->Execute( pBox, 466 pBox->GetItemRect(FN_OUTLINE_LEVEL), 467 POPUPMENU_EXECUTE_DOWN ); 468 pBox->SetItemDown( nCurrItemId, sal_False ); 469 delete pMenu; 470 pBox->EndSelection(); 471 pBox->Invalidate(); 472 } 473 break; 474 } 475 return sal_True; 476 } 477 478 /*-----------------13.07.04 ------------------- 479 --------------------------------------------------*/ 480 481 SwNavHelpToolBox::SwNavHelpToolBox(SwNavigationPI* pParent, const ResId &rResId) : 482 SwHelpToolBox(pParent, rResId) 483 {} 484 /*-----------------19.06.97 09:09------------------- 485 486 --------------------------------------------------*/ 487 void SwNavHelpToolBox::MouseButtonDown(const MouseEvent &rEvt) 488 { 489 if(rEvt.GetButtons() == MOUSE_LEFT && 490 FN_CREATE_NAVIGATION == GetItemId(rEvt.GetPosPixel())) 491 { 492 ((SwNavigationPI*)GetParent())->CreateNavigationTool(GetItemRect(FN_CREATE_NAVIGATION), sal_False); 493 } 494 else 495 SwHelpToolBox::MouseButtonDown(rEvt); 496 } 497 /* -----------------------------12.03.2002 16:55------------------------------ 498 499 ---------------------------------------------------------------------------*/ 500 void SwNavigationPI::CreateNavigationTool(const Rectangle& rRect, sal_Bool bSetFocus) 501 { 502 // SfxBindings& rBind = GetCreateView()->GetViewFrame()->GetBindings(); 503 // rBind.ENTERREGISTRATIONS(); 504 Reference< XFrame > xFrame = GetCreateView()->GetViewFrame()->GetFrame().GetFrameInterface(); 505 SwScrollNaviPopup* pPopup = new 506 SwScrollNaviPopup(FN_SCROLL_NAVIGATION, 507 xFrame ); 508 // rBind.LEAVEREGISTRATIONS(); 509 510 Rectangle aRect(rRect); 511 Point aT1 = aRect.TopLeft(); 512 aT1 = pPopup->GetParent()->OutputToScreenPixel(pPopup->GetParent()->AbsoluteScreenToOutputPixel(aContentToolBox.OutputToAbsoluteScreenPixel(aT1))); 513 aRect.SetPos(aT1); 514 pPopup->StartPopupMode(aRect, FLOATWIN_POPUPMODE_RIGHT|FLOATWIN_POPUPMODE_ALLOWTEAROFF); 515 SetPopupWindow( pPopup ); 516 if(bSetFocus) 517 { 518 pPopup->EndPopupMode(FLOATWIN_POPUPMODEEND_TEAROFF); 519 pPopup->GrabFocus(); 520 } 521 } 522 523 /*-----------------19.06.97 10:12------------------- 524 525 --------------------------------------------------*/ 526 void SwNavHelpToolBox::RequestHelp( const HelpEvent& rHEvt ) 527 { 528 sal_uInt16 nItemId = GetItemId(ScreenToOutputPixel(rHEvt.GetMousePosPixel())); 529 if( FN_UP == nItemId || FN_DOWN == nItemId ) 530 { 531 SetItemText(nItemId, SwScrollNaviPopup::GetQuickHelpText((FN_DOWN == nItemId))); 532 } 533 SwHelpToolBox::RequestHelp(rHEvt); 534 } 535 536 /*------------------------------------------------------------------------ 537 Beschreibung: Action-Handler Edit; wechselt auf die Seite, wenn 538 nicht Gliederungssicht angeschaltet ist. 539 ------------------------------------------------------------------------*/ 540 541 542 IMPL_LINK( SwNavigationPI, EditAction, NumEditAction *, pEdit ) 543 { 544 SwView *pView = GetCreateView(); 545 if (pView) 546 { 547 if(aPageChgTimer.IsActive()) 548 aPageChgTimer.Stop(); 549 pCreateView->GetWrtShell().GotoPage((sal_uInt16)pEdit->GetValue(), sal_True); 550 pCreateView->GetEditWin().GrabFocus(); 551 pCreateView->GetViewFrame()->GetBindings().Invalidate(FN_STAT_PAGE); 552 } 553 return 0; 554 } 555 556 /*------------------------------------------------------------------------ 557 Beschreibung: Falls die Seite eingestellt werden kann, wird hier 558 das Maximum gesetzt. 559 ------------------------------------------------------------------------*/ 560 561 562 IMPL_LINK( SwNavigationPI, EditGetFocus, NumEditAction *, pEdit ) 563 { 564 SwView *pView = GetCreateView(); 565 if (!pView) 566 return 0; 567 SwWrtShell &rSh = pView->GetWrtShell(); 568 569 const sal_uInt16 nPageCnt = rSh.GetPageCnt(); 570 pEdit->SetMax(nPageCnt); 571 pEdit->SetLast(nPageCnt); 572 return 0; 573 } 574 575 /*------------------------------------------------------------------------ 576 Beschreibung: 577 ------------------------------------------------------------------------*/ 578 579 sal_Bool SwNavigationPI::Close() 580 { 581 SfxViewFrame* pVFrame = pCreateView->GetViewFrame(); 582 pVFrame->GetBindings().Invalidate(SID_NAVIGATOR); 583 pVFrame->GetDispatcher()->Execute(SID_NAVIGATOR); 584 return sal_True; 585 } 586 587 /*------------------------------------------------------------------------ 588 Beschreibung: Setzen einer automatischen Marke 589 ------------------------------------------------------------------------*/ 590 591 592 void SwNavigationPI::MakeMark() 593 { 594 SwView *pView = GetCreateView(); 595 if (!pView) return; 596 SwWrtShell &rSh = pView->GetWrtShell(); 597 IDocumentMarkAccess* const pMarkAccess = rSh.getIDocumentMarkAccess(); 598 599 // collect and sort navigator reminder names 600 ::std::vector< ::rtl::OUString > vNavMarkNames; 601 for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getAllMarksBegin(); 602 ppMark != pMarkAccess->getAllMarksEnd(); 603 ppMark++) 604 if( IDocumentMarkAccess::GetType(**ppMark) == IDocumentMarkAccess::NAVIGATOR_REMINDER ) 605 vNavMarkNames.push_back(ppMark->get()->GetName()); 606 ::std::sort(vNavMarkNames.begin(), vNavMarkNames.end()); 607 608 // we are maxed out and delete one 609 // nAutoMarkIdx rotates through the available MarkNames 610 // this assumes that IDocumentMarkAccess generates Names in ascending order 611 if(vNavMarkNames.size() == MAX_MARKS) 612 pMarkAccess->deleteMark(pMarkAccess->findMark(vNavMarkNames[nAutoMarkIdx])); 613 614 rSh.SetBookmark(KeyCode(), ::rtl::OUString(), ::rtl::OUString(), IDocumentMarkAccess::NAVIGATOR_REMINDER); 615 SwView::SetActMark( nAutoMarkIdx ); 616 617 if(++nAutoMarkIdx == MAX_MARKS) 618 nAutoMarkIdx = 0; 619 } 620 621 /*------------------------------------------------------------------------ 622 Beschreibung: 623 ------------------------------------------------------------------------*/ 624 625 void SwNavigationPI::GotoPage() 626 { 627 if (pContextWin && pContextWin->GetFloatingWindow() && pContextWin->GetFloatingWindow()->IsRollUp()) 628 _ZoomIn(); 629 if(IsGlobalMode()) 630 ToggleTree(); 631 UsePage(0); 632 GetPageEdit().GrabFocus(); 633 } 634 635 /*------------------------------------------------------------------------ 636 Beschreibung: 637 ------------------------------------------------------------------------*/ 638 639 void SwNavigationPI::_ZoomOut() 640 { 641 if (_IsZoomedIn()) 642 { 643 FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL; 644 bIsZoomedIn = sal_False; 645 Size aSz(GetOutputSizePixel()); 646 aSz.Height() = nZoomOut; 647 Size aMinOutSizePixel = ((SfxDockingWindow*)GetParent())->GetMinOutputSizePixel(); 648 ((SfxDockingWindow*)GetParent())->SetMinOutputSizePixel(Size( 649 aMinOutSizePixel.Width(),nZoomOutInit)); 650 if (pFloat != NULL) 651 pFloat->SetOutputSizePixel(aSz); 652 FillBox(); 653 if(IsGlobalMode()) 654 { 655 aGlobalTree.ShowTree(); 656 } 657 else 658 { 659 aContentTree.ShowTree(); 660 aDocListBox.Show(); 661 } 662 SvLBoxEntry* pFirst = aContentTree.FirstSelected(); 663 if(pFirst) 664 aContentTree.Select(pFirst, sal_True); // toolbox enablen 665 pConfig->SetSmall( sal_False ); 666 aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX); 667 } 668 } 669 670 /*------------------------------------------------------------------------ 671 Beschreibung: 672 ------------------------------------------------------------------------*/ 673 674 void SwNavigationPI::_ZoomIn() 675 { 676 if (pContextWin != NULL) 677 { 678 FloatingWindow* pFloat = pContextWin->GetFloatingWindow(); 679 if (pFloat && 680 (!_IsZoomedIn() || ( pContextWin->GetFloatingWindow()->IsRollUp()))) 681 { 682 aContentTree.HideTree(); 683 aDocListBox.Hide(); 684 aGlobalTree.HideTree(); 685 bIsZoomedIn = sal_True; 686 Size aSz(GetOutputSizePixel()); 687 if( aSz.Height() > nZoomIn ) 688 nZoomOut = ( short ) aSz.Height(); 689 690 aSz.Height() = nZoomIn; 691 Size aMinOutSizePixel = ((SfxDockingWindow*)GetParent())->GetMinOutputSizePixel(); 692 ((SfxDockingWindow*)GetParent())->SetMinOutputSizePixel(Size( 693 aMinOutSizePixel.Width(), aSz.Height())); 694 pFloat->SetOutputSizePixel(aSz); 695 SvLBoxEntry* pFirst = aContentTree.FirstSelected(); 696 if(pFirst) 697 aContentTree.Select(pFirst, sal_True); // toolbox enablen 698 pConfig->SetSmall( sal_True ); 699 aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX, sal_False); 700 } 701 } 702 } 703 /*------------------------------------------------------------------------ 704 Beschreibung: 705 ------------------------------------------------------------------------*/ 706 707 void SwNavigationPI::Resize() 708 { 709 Window* pParent = GetParent(); 710 if( !_IsZoomedIn() ) 711 { 712 Size aNewSize (pParent->GetOutputSizePixel()); 713 714 SfxDockingWindow* pDockingParent = dynamic_cast<SfxDockingWindow*>(pParent); 715 if (pDockingParent != NULL) 716 { 717 FloatingWindow* pFloat = pDockingParent->GetFloatingWindow(); 718 //change the minimum width depending on the dock status 719 Size aMinOutSizePixel = pDockingParent->GetMinOutputSizePixel(); 720 if( pFloat) 721 { 722 aNewSize = pFloat->GetOutputSizePixel(); 723 aMinOutSizePixel.Width() = nWishWidth; 724 aMinOutSizePixel.Height() = _IsZoomedIn() ? nZoomIn : nZoomOutInit; 725 } 726 else 727 { 728 aMinOutSizePixel.Width() = 0; 729 aMinOutSizePixel.Height() = 0; 730 } 731 pDockingParent->SetMinOutputSizePixel(aMinOutSizePixel); 732 } 733 734 const Point aPos = aContentTree.GetPosPixel(); 735 Point aLBPos = aDocListBox.GetPosPixel(); 736 long nDist = aPos.X(); 737 aNewSize.Height() -= (aPos.Y() + aPos.X() + nDocLBIniHeight + nDist); 738 aNewSize.Width() -= 2 * nDist; 739 aLBPos.Y() = aPos.Y() + aNewSize.Height() + nDist; 740 aDocListBox.Show(!aGlobalTree.IsVisible() && aLBPos.Y() > aPos.Y() ); 741 742 Size aDocLBSz = aDocListBox.GetSizePixel(); 743 aDocLBSz.Width() = aNewSize.Width(); 744 if(aNewSize.Height() < 0) 745 aDocLBSz.Height() = 0; 746 else 747 aDocLBSz.Height() = nDocLBIniHeight; 748 aContentTree.SetSizePixel(aNewSize); 749 // GlobalTree faengt weiter oben an und reicht bis ganz unten 750 aNewSize.Height() += (nDist + nDocLBIniHeight + aPos.Y() - aGlobalTree.GetPosPixel().Y()); 751 aGlobalTree.SetSizePixel(aNewSize); 752 aDocListBox.SetPosSizePixel( aLBPos.X(), aLBPos.Y(), 753 aDocLBSz.Width(), aDocLBSz.Height(), 754 WINDOW_POSSIZE_X|WINDOW_POSSIZE_Y|WINDOW_POSSIZE_WIDTH); 755 } 756 } 757 758 759 /*------------------------------------------------------------------------ 760 Beschreibung: 761 ------------------------------------------------------------------------*/ 762 763 SwNavigationPI::SwNavigationPI( SfxBindings* _pBindings, 764 SfxChildWindowContext* pCw, 765 Window* pParent) : 766 767 Window( pParent, SW_RES(DLG_NAVIGATION_PI)), 768 SfxControllerItem( SID_DOCFULLNAME, *_pBindings ), 769 770 aContentToolBox(this, SW_RES(TB_CONTENT)), 771 aGlobalToolBox(this, SW_RES(TB_GLOBAL)), 772 aContentImageList(SW_RES(IL_CONTENT)), 773 aContentImageListH(SW_RES(ILH_CONTENT)), 774 aContentTree(this, SW_RES(TL_CONTENT)), 775 aGlobalTree(this, SW_RES(TL_GLOBAL)), 776 aDocListBox(this, SW_RES(LB_DOCS)), 777 778 pxObjectShell(0), 779 pContentView(0), 780 pContentWrtShell(0), 781 pActContView(0), 782 pCreateView(0), 783 pPopupWindow(0), 784 pFloatingWindow(0), 785 786 pContextWin(pCw), 787 788 pConfig(SW_MOD()->GetNavigationConfig()), 789 rBindings(*_pBindings), 790 791 nWishWidth(0), 792 nAutoMarkIdx(1), 793 nRegionMode(REGION_MODE_NONE), 794 795 bSmallMode(sal_False), 796 bIsZoomedIn(sal_False), 797 bPageCtrlsVisible(sal_False), 798 bGlobalMode(sal_False) 799 { 800 GetCreateView(); 801 InitImageList(); 802 803 aContentToolBox.SetHelpId(HID_NAVIGATOR_TOOLBOX ); 804 aGlobalToolBox.SetHelpId(HID_NAVIGATOR_GLOBAL_TOOLBOX); 805 aDocListBox.SetHelpId(HID_NAVIGATOR_LISTBOX ); 806 aDocListBox.SetDropDownLineCount(9); 807 808 nDocLBIniHeight = aDocListBox.GetSizePixel().Height(); 809 nZoomOutInit = nZoomOut = Resource::ReadShortRes(); 810 811 //NumericField in die Toolbox einfuegen 812 NumEditAction* pEdit = new NumEditAction( 813 &aContentToolBox, SW_RES(NF_PAGE )); 814 pEdit->SetActionHdl(LINK(this, SwNavigationPI, EditAction)); 815 pEdit->SetGetFocusHdl(LINK(this, SwNavigationPI, EditGetFocus)); 816 pEdit->SetAccessibleName(pEdit->GetQuickHelpText()); 817 pEdit->SetUpHdl(LINK(this, SwNavigationPI, PageEditModifyHdl)); 818 pEdit->SetDownHdl(LINK(this, SwNavigationPI, PageEditModifyHdl)); 819 820 bPageCtrlsVisible = sal_True; 821 822 // Rectangle aFirstRect = aContentToolBox.GetItemRect(FN_SHOW_ROOT); 823 // sal_uInt16 nWidth = 2 * (sal_uInt16)aFirstRect.Left(); 824 //doppelte Separatoren sind nicht erlaubt, also muss 825 //die passende Groesse anders ermittelt werden 826 Rectangle aFirstRect = aContentToolBox.GetItemRect(FN_SELECT_FOOTNOTE); 827 Rectangle aSecondRect = aContentToolBox.GetItemRect(FN_SELECT_HEADER); 828 sal_uInt16 nWidth = sal_uInt16(aFirstRect.Left() - aSecondRect.Left()); 829 830 Size aItemWinSize( nWidth , aFirstRect.Bottom() - aFirstRect.Top() ); 831 pEdit->SetSizePixel(aItemWinSize); 832 aContentToolBox.InsertSeparator(4); 833 aContentToolBox.InsertWindow( FN_PAGENUMBER, pEdit, 0, 4); 834 aContentToolBox.InsertSeparator(4); 835 aContentToolBox.SetHelpId(FN_PAGENUMBER, HID_NAVI_TBX16); 836 aContentToolBox.ShowItem( FN_PAGENUMBER ); 837 838 for( sal_uInt16 i = 0; i <= REGION_MODE_EMBEDDED; i++ ) 839 { 840 aContextArr[i] = SW_RESSTR(ST_HYPERLINK + i); 841 aStatusArr[i] = SW_RESSTR(ST_STATUS_FIRST + i); 842 } 843 aStatusArr[3] = SW_RESSTR(ST_ACTIVE_VIEW); 844 FreeResource(); 845 846 847 const Size& rOutSize = GetOutputSizePixel(); 848 849 nZoomIn = (short)rOutSize.Height(); 850 851 // Make sure the toolbox has a size that fits all its contents 852 Size aContentToolboxSize( aContentToolBox.CalcWindowSizePixel() ); 853 aContentToolBox.SetOutputSizePixel( aContentToolboxSize ); 854 855 // position listbox below toolbar and add some space 856 long nListboxYPos = aContentToolBox.GetPosPixel().Y() + aContentToolboxSize.Height() + 4; 857 858 //Der linke und rechte Rand um die Toolboxen soll gleich sein 859 nWishWidth = aContentToolboxSize.Width(); 860 nWishWidth += 2 * aContentToolBox.GetPosPixel().X(); 861 862 DockingWindow* pDockingParent = dynamic_cast<DockingWindow*>(pParent); 863 if (pDockingParent != NULL) 864 { 865 FloatingWindow* pFloat = pDockingParent->GetFloatingWindow(); 866 Size aMinSize(pFloat ? nWishWidth : 0, pFloat ? nZoomOutInit : 0); 867 pDockingParent->SetMinOutputSizePixel(aMinSize); 868 SetOutputSizePixel( Size( nWishWidth, nZoomOutInit)); 869 870 SfxDockingWindow* pSfxDockingParent = dynamic_cast<SfxDockingWindow*>(pParent); 871 if (pSfxDockingParent != NULL) 872 { 873 Size aTmpParentSize(pSfxDockingParent->GetSizePixel()); 874 if (aTmpParentSize.Width() < aMinSize.Width() 875 || aTmpParentSize.Height() < aMinSize.Height()) 876 { 877 if (pSfxDockingParent->GetFloatingWindow() 878 && ! pSfxDockingParent->GetFloatingWindow()->IsRollUp()) 879 { 880 pSfxDockingParent->SetOutputSizePixel(aMinSize); 881 } 882 } 883 } 884 } 885 886 aContentTree.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y ); 887 aContentTree.SetStyle( aContentTree.GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT| 888 WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); 889 aContentTree.SetSpaceBetweenEntries(3); 890 aContentTree.SetSelectionMode( SINGLE_SELECTION ); 891 aContentTree.SetDragDropMode( SV_DRAGDROP_CTRL_MOVE | 892 SV_DRAGDROP_CTRL_COPY | 893 SV_DRAGDROP_ENABLE_TOP ); 894 aContentTree.EnableAsyncDrag(sal_True); 895 aContentTree.ShowTree(); 896 aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX, sal_True); 897 898 // TreeListBox fuer Globaldokument 899 aGlobalTree.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y ); 900 aGlobalTree.SetSelectionMode( MULTIPLE_SELECTION ); 901 aGlobalTree.SetStyle( aGlobalTree.GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT| 902 WB_CLIPCHILDREN|WB_HSCROLL ); 903 Size aGlblSize(aGlobalToolBox.CalcWindowSizePixel()); 904 aGlobalToolBox.SetSizePixel(aGlblSize); 905 906 // Handler 907 908 Link aLk = LINK(this, SwNavigationPI, ToolBoxSelectHdl); 909 aContentToolBox.SetSelectHdl( aLk ); 910 aGlobalToolBox.SetSelectHdl( aLk ); 911 aDocListBox.SetSelectHdl(LINK(this, SwNavigationPI, 912 DocListBoxSelectHdl)); 913 aContentToolBox.SetClickHdl( LINK(this, SwNavigationPI, ToolBoxClickHdl) ); 914 aContentToolBox.SetDropdownClickHdl( LINK(this, SwNavigationPI, ToolBoxDropdownClickHdl) ); 915 aGlobalToolBox.SetClickHdl( LINK(this, SwNavigationPI, ToolBoxClickHdl) ); 916 aGlobalToolBox.SetDropdownClickHdl( LINK(this, SwNavigationPI, ToolBoxDropdownClickHdl) ); 917 aGlobalToolBox.CheckItem(FN_GLOBAL_SWITCH, sal_True); 918 919 Font aFont(GetFont()); 920 aFont.SetWeight(WEIGHT_NORMAL); 921 GetPageEdit().SetFont(aFont); 922 aFont = aContentTree.GetFont(); 923 aFont.SetWeight(WEIGHT_NORMAL); 924 aContentTree.SetFont(aFont); 925 aGlobalTree.SetFont(aFont); 926 927 StartListening(*SFX_APP()); 928 if ( pCreateView ) 929 StartListening(*pCreateView); 930 SfxImageManager* pImgMan = SfxImageManager::GetImageManager( SW_MOD() ); 931 pImgMan->RegisterToolBox(&aContentToolBox, SFX_TOOLBOX_CHANGEOUTSTYLE); 932 pImgMan->RegisterToolBox(&aGlobalToolBox, SFX_TOOLBOX_CHANGEOUTSTYLE); 933 934 aContentToolBox.SetItemBits( FN_CREATE_NAVIGATION, aContentToolBox.GetItemBits( FN_CREATE_NAVIGATION ) | TIB_DROPDOWNONLY ); 935 aContentToolBox.SetItemBits( FN_DROP_REGION, aContentToolBox.GetItemBits( FN_DROP_REGION ) | TIB_DROPDOWNONLY ); 936 aContentToolBox.SetItemBits( FN_OUTLINE_LEVEL, aContentToolBox.GetItemBits( FN_OUTLINE_LEVEL ) | TIB_DROPDOWNONLY ); 937 938 if(IsGlobalDoc()) 939 { 940 SwView *pActView = GetCreateView(); 941 aGlobalToolBox.CheckItem(FN_GLOBAL_SAVE_CONTENT, 942 pActView->GetWrtShellPtr()->IsGlblDocSaveLinks()); 943 if(pConfig->IsGlobalActive()) 944 ToggleTree(); 945 aGlobalTree.GrabFocus(); 946 } 947 else 948 aContentTree.GrabFocus(); 949 UsePage(0); 950 aPageChgTimer.SetTimeoutHdl(LINK(this, SwNavigationPI, ChangePageHdl)); 951 aPageChgTimer.SetTimeout(PAGE_CHANGE_TIMEOUT); 952 953 aContentTree.SetAccessibleName(SW_RESSTR(STR_ACCESS_TL_CONTENT)); 954 aGlobalTree.SetAccessibleName(SW_RESSTR(STR_ACCESS_TL_GLOBAL)); 955 aDocListBox.SetAccessibleName(aStatusArr[3]); 956 957 if (pContextWin == NULL) 958 { 959 // When the context window is missing then the navigator is 960 // displayed in the sidebar. While the navigator could change 961 // its size, the sidebar can not, and the navigator would just 962 // waste space. Therefore hide this button. 963 aContentToolBox.RemoveItem(aContentToolBox.GetItemPos(FN_SHOW_CONTENT_BOX)); 964 } 965 } 966 967 /*------------------------------------------------------------------------ 968 Beschreibung: 969 ------------------------------------------------------------------------*/ 970 971 SwNavigationPI::~SwNavigationPI() 972 { 973 if(IsGlobalDoc() && !IsGlobalMode()) 974 { 975 SwView *pView = GetCreateView(); 976 SwWrtShell &rSh = pView->GetWrtShell(); 977 if( !rSh.IsAllProtect() ) 978 pView->GetDocShell()->SetReadOnlyUI(sal_False); 979 } 980 981 EndListening(*SFX_APP()); 982 983 SfxImageManager* pImgMan = SfxImageManager::GetImageManager( SW_MOD() ); 984 pImgMan->ReleaseToolBox(&aContentToolBox); 985 pImgMan->ReleaseToolBox(&aGlobalToolBox); 986 delete aContentToolBox.GetItemWindow(FN_PAGENUMBER); 987 aContentToolBox.Clear(); 988 if(pxObjectShell) 989 { 990 if(pxObjectShell->Is()) 991 (*pxObjectShell)->DoClose(); 992 delete pxObjectShell; 993 } 994 delete pPopupWindow; 995 delete pFloatingWindow; 996 997 if ( IsBound() ) 998 rBindings.Release(*this); 999 } 1000 1001 /*------------------------------------------------------------------------ 1002 Beschreibung: 1003 ------------------------------------------------------------------------*/ 1004 1005 void SwNavigationPI::SetPopupWindow( SfxPopupWindow* pWindow ) 1006 { 1007 pPopupWindow = pWindow; 1008 pPopupWindow->SetPopupModeEndHdl( LINK( this, SwNavigationPI, PopupModeEndHdl )); 1009 pPopupWindow->SetDeleteLink_Impl( LINK( this, SwNavigationPI, ClosePopupWindow )); 1010 } 1011 1012 /*------------------------------------------------------------------------ 1013 Beschreibung: 1014 ------------------------------------------------------------------------*/ 1015 1016 IMPL_LINK( SwNavigationPI, PopupModeEndHdl, void *, EMPTYARG ) 1017 { 1018 if ( pPopupWindow->IsVisible() ) 1019 { 1020 // Replace floating window with popup window and destroy 1021 // floating window instance. 1022 delete pFloatingWindow; 1023 pFloatingWindow = pPopupWindow; 1024 pPopupWindow = 0; 1025 } 1026 else 1027 { 1028 // Popup window has been closed by the user. No replacement, instance 1029 // will destroy itself. 1030 pPopupWindow = 0; 1031 } 1032 1033 return 1; 1034 } 1035 1036 /*------------------------------------------------------------------------ 1037 Beschreibung: 1038 ------------------------------------------------------------------------*/ 1039 1040 IMPL_LINK( SwNavigationPI, ClosePopupWindow, SfxPopupWindow *, pWindow ) 1041 { 1042 if ( pWindow == pFloatingWindow ) 1043 pFloatingWindow = 0; 1044 else 1045 pPopupWindow = 0; 1046 1047 return 1; 1048 } 1049 1050 /*------------------------------------------------------------------------ 1051 Beschreibung: 1052 ------------------------------------------------------------------------*/ 1053 1054 void SwNavigationPI::StateChanged( sal_uInt16 nSID, SfxItemState /*eState*/, 1055 const SfxPoolItem* /*pState*/ ) 1056 { 1057 if(nSID == SID_DOCFULLNAME) 1058 { 1059 SwView *pActView = GetCreateView(); 1060 if(pActView) 1061 { 1062 SwWrtShell* pWrtShell = pActView->GetWrtShellPtr(); 1063 aContentTree.SetActiveShell(pWrtShell); 1064 sal_Bool bGlobal = IsGlobalDoc(); 1065 aContentToolBox.EnableItem(FN_GLOBAL_SWITCH, bGlobal); 1066 if( (!bGlobal && IsGlobalMode()) || 1067 (!IsGlobalMode() && pConfig->IsGlobalActive()) ) 1068 { 1069 ToggleTree(); 1070 } 1071 if(bGlobal) 1072 { 1073 aGlobalToolBox.CheckItem(FN_GLOBAL_SAVE_CONTENT, pWrtShell->IsGlblDocSaveLinks()); 1074 } 1075 } 1076 else 1077 { 1078 aContentTree.SetActiveShell(0); 1079 } 1080 UpdateListBox(); 1081 } 1082 } 1083 1084 /*------------------------------------------------------------------------ 1085 Bechreibung: NumericField aus der Toolbox holen 1086 ------------------------------------------------------------------------*/ 1087 1088 NumEditAction& SwNavigationPI::GetPageEdit() 1089 { 1090 return *(NumEditAction*)aContentToolBox.GetItemWindow(FN_PAGENUMBER); 1091 } 1092 1093 /*------------------------------------------------------------------------ 1094 Beschreibung: 1095 ------------------------------------------------------------------------*/ 1096 1097 SfxChildAlignment SwNavigationPI::CheckAlignment 1098 ( 1099 SfxChildAlignment eActAlign, 1100 SfxChildAlignment eAlign 1101 ) 1102 { 1103 SfxChildAlignment eRetAlign; 1104 1105 if(_IsZoomedIn()) 1106 eRetAlign = SFX_ALIGN_NOALIGNMENT; 1107 else 1108 switch (eAlign) 1109 { 1110 case SFX_ALIGN_BOTTOM: 1111 case SFX_ALIGN_LOWESTBOTTOM: 1112 case SFX_ALIGN_HIGHESTBOTTOM: 1113 eRetAlign = eActAlign; 1114 break; 1115 1116 case SFX_ALIGN_TOP: 1117 case SFX_ALIGN_HIGHESTTOP: 1118 case SFX_ALIGN_LOWESTTOP: 1119 case SFX_ALIGN_LEFT: 1120 case SFX_ALIGN_RIGHT: 1121 case SFX_ALIGN_FIRSTLEFT: 1122 case SFX_ALIGN_LASTLEFT: 1123 case SFX_ALIGN_FIRSTRIGHT: 1124 case SFX_ALIGN_LASTRIGHT: 1125 eRetAlign = eAlign; 1126 break; 1127 1128 default: 1129 eRetAlign = eAlign; 1130 break; 1131 } 1132 return eRetAlign; 1133 1134 } 1135 1136 /*-------------------------------------------------------------------- 1137 Beschreibung: Benachrichtigung bei geaenderter DocInfo 1138 --------------------------------------------------------------------*/ 1139 1140 void SwNavigationPI::Notify( SfxBroadcaster& rBrdc, const SfxHint& rHint ) 1141 { 1142 if(&rBrdc == pCreateView) 1143 { 1144 if(rHint.ISA(SfxSimpleHint) && ((SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING) 1145 { 1146 pCreateView = 0; 1147 } 1148 } 1149 else 1150 { 1151 if(rHint.ISA(SfxEventHint)) 1152 { 1153 if( pxObjectShell && 1154 ((SfxEventHint&) rHint).GetEventId() == SFX_EVENT_CLOSEAPP) 1155 { 1156 DELETEZ(pxObjectShell); 1157 } 1158 else if(((SfxEventHint&) rHint).GetEventId() == SFX_EVENT_OPENDOC) 1159 { 1160 1161 SwView *pActView = GetCreateView(); 1162 if(pActView) 1163 { 1164 SwWrtShell* pWrtShell = pActView->GetWrtShellPtr(); 1165 aContentTree.SetActiveShell(pWrtShell); 1166 if(aGlobalTree.IsVisible()) 1167 { 1168 if(aGlobalTree.Update( sal_False )) 1169 aGlobalTree.Display(); 1170 else 1171 // wenn kein Update notwendig, dann zumindest painten 1172 // wg. der roten Eintraege fuer broken links 1173 aGlobalTree.Invalidate(); 1174 } 1175 } 1176 } 1177 } 1178 } 1179 } 1180 1181 /*-------------------------------------------------------------------- 1182 Beschreibung: 1183 --------------------------------------------------------------------*/ 1184 1185 IMPL_LINK( SwNavigationPI, MenuSelectHdl, Menu *, pMenu ) 1186 { 1187 sal_uInt16 nMenuId = pMenu->GetCurItemId(); 1188 if(nMenuId != USHRT_MAX) 1189 { 1190 if(nMenuId < 100) 1191 SetRegionDropMode( --nMenuId); 1192 else 1193 aContentTree.SetOutlineLevel( static_cast< sal_uInt8 >(nMenuId - 100) ); 1194 } 1195 return 0; 1196 } 1197 1198 1199 /*-------------------------------------------------------------------- 1200 Beschreibung: 1201 --------------------------------------------------------------------*/ 1202 1203 void SwNavigationPI::UpdateListBox() 1204 { 1205 aDocListBox.SetUpdateMode(sal_False); 1206 aDocListBox.Clear(); 1207 SwView *pActView = GetCreateView(); 1208 sal_Bool bDisable = pActView == 0; 1209 SwView *pView = SwModule::GetFirstView(); 1210 sal_uInt16 nCount = 0; 1211 sal_uInt16 nAct = 0; 1212 sal_uInt16 nConstPos = 0; 1213 const SwView* pConstView = aContentTree.IsConstantView() && 1214 aContentTree.GetActiveWrtShell() ? 1215 &aContentTree.GetActiveWrtShell()->GetView(): 1216 0; 1217 while (pView) 1218 { 1219 SfxObjectShell* pDoc = pView->GetDocShell(); 1220 // pb: #i53333# don't show help pages here 1221 if ( !pDoc->IsHelpDocument() ) 1222 { 1223 String sEntry = pDoc->GetTitle(); 1224 sEntry += C2S(" ("); 1225 if (pView == pActView) 1226 { 1227 nAct = nCount; 1228 sEntry += aStatusArr[ST_ACTIVE - ST_STATUS_FIRST]; 1229 } 1230 else 1231 sEntry += aStatusArr[ST_INACTIVE - ST_STATUS_FIRST]; 1232 sEntry += ')'; 1233 aDocListBox.InsertEntry(sEntry); 1234 1235 1236 if (pConstView && pView == pConstView) 1237 nConstPos = nCount; 1238 1239 nCount++; 1240 } 1241 pView = SwModule::GetNextView(pView); 1242 } 1243 aDocListBox.InsertEntry(aStatusArr[3]); //"Aktives Fenster" 1244 nCount++; 1245 1246 if(aContentTree.GetHiddenWrtShell()) 1247 { 1248 String sEntry = aContentTree.GetHiddenWrtShell()->GetView(). 1249 GetDocShell()->GetTitle(); 1250 sEntry += C2S(" ("); 1251 sEntry += aStatusArr[ST_HIDDEN - ST_STATUS_FIRST]; 1252 sEntry += ')'; 1253 aDocListBox.InsertEntry(sEntry); 1254 bDisable = sal_False; 1255 } 1256 if(aContentTree.IsActiveView()) 1257 { 1258 //entweder den Namen des akt. Docs oder "Aktives Dokument" 1259 sal_uInt16 nTmp = pActView ? nAct : --nCount; 1260 aDocListBox.SelectEntryPos( nTmp ); 1261 } 1262 else if(aContentTree.IsHiddenView()) 1263 { 1264 aDocListBox.SelectEntryPos(nCount); 1265 } 1266 else 1267 aDocListBox.SelectEntryPos(nConstPos); 1268 1269 aDocListBox.Enable( !bDisable ); 1270 aDocListBox.SetUpdateMode(sal_True); 1271 } 1272 1273 /*-----------------16.06.97 15:05------------------- 1274 1275 --------------------------------------------------*/ 1276 1277 /*------------------------------------------------------------------------ 1278 Beschreibung: 1279 ------------------------------------------------------------------------*/ 1280 1281 IMPL_LINK(SwNavigationPI, DoneLink, SfxPoolItem *, pItem) 1282 { 1283 const SfxViewFrameItem* pFrameItem = PTR_CAST(SfxViewFrameItem, pItem ); 1284 if( pFrameItem ) 1285 { 1286 SfxViewFrame* pFrame = pFrameItem->GetFrame(); 1287 if(pFrame) 1288 { 1289 aContentTree.Clear(); 1290 pContentView = PTR_CAST(SwView, pFrame->GetViewShell()); 1291 DBG_ASSERT(pContentView, "keine SwView"); 1292 if(pContentView) 1293 pContentWrtShell = pContentView->GetWrtShellPtr(); 1294 else 1295 pContentWrtShell = 0; 1296 pxObjectShell = new SfxObjectShellLock(pFrame->GetObjectShell()); 1297 FillBox(); 1298 aContentTree.Update(); 1299 } 1300 } 1301 return 0; 1302 } 1303 1304 String SwNavigationPI::CreateDropFileName( TransferableDataHelper& rData ) 1305 { 1306 String sFileName; 1307 sal_uLong nFmt; 1308 if( rData.HasFormat( nFmt = FORMAT_FILE_LIST )) 1309 { 1310 FileList aFileList; 1311 rData.GetFileList( nFmt, aFileList ); 1312 sFileName = aFileList.GetFile( 0 ); 1313 } 1314 else if( rData.HasFormat( nFmt = FORMAT_STRING ) || 1315 rData.HasFormat( nFmt = FORMAT_FILE ) || 1316 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_FILENAME )) 1317 rData.GetString( nFmt, sFileName ); 1318 else if( rData.HasFormat( nFmt = SOT_FORMATSTR_ID_SOLK ) || 1319 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK )|| 1320 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_FILECONTENT ) || 1321 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) || 1322 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR )) 1323 { 1324 INetBookmark aBkmk( aEmptyStr, aEmptyStr ); 1325 rData.GetINetBookmark( nFmt, aBkmk ); 1326 sFileName = aBkmk.GetURL(); 1327 } 1328 if( sFileName.Len() ) 1329 { 1330 sFileName = INetURLObject( sFileName ).GetMainURL( INetURLObject::NO_DECODE ); 1331 } 1332 return sFileName; 1333 } 1334 1335 /*------------------------------------------------------------------------ 1336 Beschreibung: 1337 ------------------------------------------------------------------------*/ 1338 1339 sal_Int8 SwNavigationPI::AcceptDrop( const AcceptDropEvent& /*rEvt*/ ) 1340 { 1341 return ( !aContentTree.IsInDrag() && 1342 ( aContentTree.IsDropFormatSupported( FORMAT_FILE ) || 1343 aContentTree.IsDropFormatSupported( FORMAT_STRING ) || 1344 aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_SOLK ) || 1345 aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK )|| 1346 aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_FILECONTENT ) || 1347 aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) || 1348 aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) || 1349 aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_FILENAME ))) 1350 ? DND_ACTION_COPY 1351 : DND_ACTION_NONE; 1352 } 1353 1354 sal_Int8 SwNavigationPI::ExecuteDrop( const ExecuteDropEvent& rEvt ) 1355 { 1356 TransferableDataHelper aData( rEvt.maDropEvent.Transferable ); 1357 sal_Int8 nRet = DND_ACTION_NONE; 1358 String sFileName; 1359 if( !aContentTree.IsInDrag() && 1360 0 != (sFileName = SwNavigationPI::CreateDropFileName( aData )).Len() ) 1361 { 1362 INetURLObject aTemp( sFileName ); 1363 GraphicDescriptor aDesc( aTemp ); 1364 if( !aDesc.Detect() ) // keine Grafiken annehmen 1365 { 1366 if( STRING_NOTFOUND == sFileName.Search('#') 1367 && (!sContentFileName.Len() || sContentFileName != sFileName )) 1368 { 1369 nRet = rEvt.mnAction; 1370 sFileName.EraseTrailingChars( char(0) ); 1371 sContentFileName = sFileName; 1372 if(pxObjectShell) 1373 { 1374 aContentTree.SetHiddenShell( 0 ); 1375 (*pxObjectShell)->DoClose(); 1376 DELETEZ( pxObjectShell); 1377 } 1378 SfxStringItem aFileItem(SID_FILE_NAME, sFileName ); 1379 String sOptions = C2S("HRC"); 1380 SfxStringItem aOptionsItem( SID_OPTIONS, sOptions ); 1381 SfxLinkItem aLink( SID_DONELINK, 1382 LINK( this, SwNavigationPI, DoneLink ) ); 1383 GetActiveView()->GetViewFrame()->GetDispatcher()->Execute( 1384 SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, 1385 &aFileItem, &aOptionsItem, &aLink, 0L ); 1386 } 1387 } 1388 } 1389 return nRet; 1390 } 1391 1392 /*-----------------27.11.96 13.00------------------- 1393 1394 --------------------------------------------------*/ 1395 1396 void SwNavigationPI::SetRegionDropMode(sal_uInt16 nNewMode) 1397 { 1398 nRegionMode = nNewMode; 1399 pConfig->SetRegionMode( nRegionMode ); 1400 1401 sal_uInt16 nDropId = FN_DROP_REGION; 1402 if(nRegionMode == REGION_MODE_LINK) 1403 nDropId = FN_DROP_REGION_LINK; 1404 else if(nRegionMode == REGION_MODE_EMBEDDED) 1405 nDropId = FN_DROP_REGION_COPY; 1406 1407 ImageList& rImgLst = aContentToolBox.GetSettings().GetStyleSettings().GetHighContrastMode() 1408 ? aContentImageListH : aContentImageList; 1409 1410 aContentToolBox.SetItemImage( FN_DROP_REGION, 1411 rImgLst.GetImage(nDropId)); 1412 } 1413 1414 1415 /*-----------------12.06.97 09:47------------------- 1416 1417 --------------------------------------------------*/ 1418 1419 sal_Bool SwNavigationPI::ToggleTree() 1420 { 1421 sal_Bool bRet = sal_True; 1422 sal_Bool bGlobalDoc = IsGlobalDoc(); 1423 if(!IsGlobalMode() && bGlobalDoc) 1424 { 1425 SetUpdateMode(sal_False); 1426 if(_IsZoomedIn()) 1427 _ZoomOut(); 1428 aGlobalTree.ShowTree(); 1429 aGlobalToolBox.Show(); 1430 aContentTree.HideTree(); 1431 aContentToolBox.Hide(); 1432 aDocListBox.Hide(); 1433 SetGlobalMode(sal_True); 1434 SetUpdateMode(sal_True); 1435 } 1436 else 1437 { 1438 aGlobalTree.HideTree(); 1439 aGlobalToolBox.Hide(); 1440 if(!_IsZoomedIn()) 1441 { 1442 aContentTree.ShowTree(); 1443 aContentToolBox.Show(); 1444 aDocListBox.Show(); 1445 } 1446 bRet = sal_False; 1447 SetGlobalMode(sal_False); 1448 } 1449 return bRet; 1450 } 1451 1452 /*-----------------13.06.97 09:42------------------- 1453 1454 --------------------------------------------------*/ 1455 sal_Bool SwNavigationPI::IsGlobalDoc() const 1456 { 1457 sal_Bool bRet = sal_False; 1458 SwView *pView = GetCreateView(); 1459 if(pView) 1460 { 1461 SwWrtShell &rSh = pView->GetWrtShell(); 1462 bRet = rSh.IsGlobalDoc(); 1463 } 1464 return bRet; 1465 } 1466 /* -----------------26.10.98 08:10------------------- 1467 * 1468 * --------------------------------------------------*/ 1469 IMPL_LINK( SwNavigationPI, ChangePageHdl, Timer*, EMPTYARG ) 1470 { 1471 EditAction(&GetPageEdit()); 1472 GetPageEdit().GrabFocus(); 1473 return 0; 1474 } 1475 /* -----------------26.10.98 08:14------------------- 1476 * 1477 * --------------------------------------------------*/ 1478 IMPL_LINK( SwNavigationPI, PageEditModifyHdl, Edit*, EMPTYARG ) 1479 { 1480 if(aPageChgTimer.IsActive()) 1481 aPageChgTimer.Stop(); 1482 aPageChgTimer.Start(); 1483 return 0; 1484 } 1485 1486 /* -----------------------------23.04.01 07:34-------------------------------- 1487 1488 ---------------------------------------------------------------------------*/ 1489 SwView* SwNavigationPI::GetCreateView() const 1490 { 1491 if(!pCreateView) 1492 { 1493 SwView* pView = SwModule::GetFirstView(); 1494 while(pView) 1495 { 1496 if(&pView->GetViewFrame()->GetBindings() == &rBindings) 1497 { 1498 ((SwNavigationPI*)this)->pCreateView = pView; 1499 ((SwNavigationPI*)this)->StartListening(*pCreateView); 1500 break; 1501 } 1502 pView = SwModule::GetNextView(pView); 1503 } 1504 } 1505 return pCreateView; 1506 } 1507 1508 1509 /*------------------------------------------------------------------------ 1510 Beschreibung: 1511 ------------------------------------------------------------------------*/ 1512 1513 SwNavigationChild::SwNavigationChild( Window* pParent, 1514 sal_uInt16 nId, 1515 SfxBindings* _pBindings, 1516 SfxChildWinInfo* pInfo ) 1517 : SfxChildWindowContext( nId ) 1518 { 1519 SwNavigationPI* pNavi = new SwNavigationPI( _pBindings, this, pParent ); 1520 SetWindow( pNavi ); 1521 _pBindings->Invalidate(SID_NAVIGATOR); 1522 String sExtra = pInfo->aExtraString; 1523 1524 SwNavigationConfig* pNaviConfig = SW_MOD()->GetNavigationConfig(); 1525 1526 sal_uInt16 nRootType = static_cast< sal_uInt16 >( pNaviConfig->GetRootType() ); 1527 if( nRootType < CONTENT_TYPE_MAX ) 1528 { 1529 pNavi->aContentTree.SetRootType(nRootType); 1530 pNavi->aContentToolBox.CheckItem(FN_SHOW_ROOT, sal_True); 1531 } 1532 pNavi->aContentTree.SetOutlineLevel( static_cast< sal_uInt8 >( pNaviConfig->GetOutlineLevel() ) ); 1533 pNavi->SetRegionDropMode( static_cast< sal_uInt16 >( pNaviConfig->GetRegionMode() ) ); 1534 1535 if(GetFloatingWindow() && pNaviConfig->IsSmall()) 1536 { 1537 pNavi->_ZoomIn(); 1538 } 1539 } 1540 /* -----------------------------06.05.2002 10:06------------------------------ 1541 1542 ---------------------------------------------------------------------------*/ 1543 void SwNavigationPI::DataChanged( const DataChangedEvent& rDCEvt ) 1544 { 1545 Window::DataChanged( rDCEvt ); 1546 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 1547 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 1548 { 1549 InitImageList(); 1550 const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); 1551 Color aBgColor = rStyleSettings.GetFaceColor(); 1552 Wallpaper aBack( aBgColor ); 1553 SetBackground( aBack ); 1554 } 1555 } 1556 /* -----------------------------06.05.2002 10:07------------------------------ 1557 1558 ---------------------------------------------------------------------------*/ 1559 void SwNavigationPI::InitImageList() 1560 { 1561 sal_uInt16 k; 1562 1563 ImageList& rImgLst = aContentToolBox.GetSettings().GetStyleSettings().GetHighContrastMode() ? 1564 aContentImageListH : aContentImageList; 1565 for( k = 0; k < aContentToolBox.GetItemCount(); k++) 1566 aContentToolBox.SetItemImage(aContentToolBox.GetItemId(k), 1567 rImgLst.GetImage(aContentToolBox.GetItemId(k))); 1568 1569 for( k = 0; k < aGlobalToolBox.GetItemCount(); k++) 1570 aGlobalToolBox.SetItemImage(aGlobalToolBox.GetItemId(k), 1571 rImgLst.GetImage(aGlobalToolBox.GetItemId(k))); 1572 1573 sal_uInt16 nDropId = FN_DROP_REGION; 1574 if(nRegionMode == REGION_MODE_LINK) 1575 nDropId = FN_DROP_REGION_LINK; 1576 else if(nRegionMode == REGION_MODE_EMBEDDED) 1577 nDropId = FN_DROP_REGION_COPY; 1578 aContentToolBox.SetItemImage( FN_DROP_REGION, 1579 rImgLst.GetImage(nDropId)); 1580 } 1581 1582