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