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