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