Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include "OutlineViewShell.hxx"
22 :
23 : #include "ViewShellImplementation.hxx"
24 : #include <memory>
25 : #include "helpids.h"
26 : #include "app.hrc"
27 : #include <svx/hyperdlg.hxx>
28 : #include <svx/zoomslideritem.hxx>
29 :
30 : #include <sfx2/infobar.hxx>
31 : #include <sfx2/objface.hxx>
32 : #include <sot/exchange.hxx>
33 : #include <svx/ruler.hxx>
34 : #include <sfx2/zoomitem.hxx>
35 : #include <editeng/eeitem.hxx>
36 : #include <editeng/flditem.hxx>
37 : #include <sfx2/shell.hxx>
38 : #include <sfx2/templdlg.hxx>
39 : #include <sfx2/viewfac.hxx>
40 : #include <sfx2/request.hxx>
41 : #include <svx/hlnkitem.hxx>
42 : #include <svx/svdotext.hxx>
43 : #include <sfx2/dispatch.hxx>
44 : #include <vcl/scrbar.hxx>
45 : #include <svl/whiter.hxx>
46 : #include <editeng/editstat.hxx>
47 : #include <svl/itempool.hxx>
48 : #include <sfx2/tplpitem.hxx>
49 : #include <svx/svdorect.hxx>
50 : #include <sot/formats.hxx>
51 : #include <com/sun/star/linguistic2/XThesaurus.hpp>
52 : #include <com/sun/star/i18n/TransliterationModules.hpp>
53 : #include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
54 : #include <editeng/unolingu.hxx>
55 : #include <comphelper/processfactory.hxx>
56 : #include <editeng/outlobj.hxx>
57 : #include <svl/cjkoptions.hxx>
58 : #include <svtools/cliplistener.hxx>
59 : #include <svl/srchitem.hxx>
60 : #include <editeng/editobj.hxx>
61 : #include "fubullet.hxx"
62 : #include "optsitem.hxx"
63 :
64 : #include "strings.hrc"
65 : #include "glob.hrc"
66 : #include "res_bmp.hrc"
67 : #include "Outliner.hxx"
68 : #include "Window.hxx"
69 : #include "TextObjectBar.hxx"
70 : #include "drawdoc.hxx"
71 : #include "sdresid.hxx"
72 : #include "sdpage.hxx"
73 : #include "fuoltext.hxx"
74 : #include "FrameView.hxx"
75 : #include "zoomlist.hxx"
76 : #include "stlsheet.hxx"
77 : #include "slideshow.hxx"
78 : #include "SdUnoOutlineView.hxx"
79 : #include "SpellDialogChildWindow.hxx"
80 :
81 : #include "AccessibleOutlineView.hxx"
82 : #include "ViewShellBase.hxx"
83 : #include "ViewShellManager.hxx"
84 : #include "DrawController.hxx"
85 : #include "framework/FrameworkHelper.hxx"
86 :
87 : using ::rtl::OUString;
88 : using namespace ::com::sun::star;
89 : using namespace ::com::sun::star::uno;
90 : using namespace ::com::sun::star::lang;
91 : using namespace ::com::sun::star::linguistic2;
92 :
93 : using namespace sd;
94 : #define OutlineViewShell
95 : #include "sdslots.hxx"
96 :
97 : namespace sd {
98 :
99 : #define MIN_ZOOM 10 // minimum zoom factor
100 : #define MAX_ZOOM 1000 // maximum zoom factor
101 :
102 : /************************************************************************/
103 :
104 :
105 : /*************************************************************************
106 : |*
107 : |* Declare SFX-Slotmap and standard interface
108 : |*
109 : \************************************************************************/
110 :
111 :
112 33 : SFX_IMPL_INTERFACE(OutlineViewShell, SfxShell, SdResId(STR_OUTLINEVIEWSHELL))
113 : {
114 3 : SFX_POPUPMENU_REGISTRATION( SdResId(RID_OUTLINE_POPUP) );
115 6 : SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_TOOLS | SFX_VISIBILITY_STANDARD |
116 : SFX_VISIBILITY_FULLSCREEN | SFX_VISIBILITY_SERVER,
117 3 : SdResId(RID_OUTLINE_TOOLBOX) );
118 6 : SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_APPLICATION | SFX_VISIBILITY_DESKTOP | SFX_VISIBILITY_STANDARD | SFX_VISIBILITY_CLIENT | SFX_VISIBILITY_VIEWER | SFX_VISIBILITY_READONLYDOC,
119 3 : SdResId(RID_DRAW_VIEWER_TOOLBOX) );
120 3 : SFX_CHILDWINDOW_REGISTRATION( SfxTemplateDialogWrapper::GetChildWindowId() );
121 3 : SFX_CHILDWINDOW_REGISTRATION( SfxInfoBarContainerChild::GetChildWindowId() );
122 3 : SFX_CHILDWINDOW_REGISTRATION( SvxHlinkDlgWrapper::GetChildWindowId() );
123 3 : SFX_CHILDWINDOW_REGISTRATION( ::sd::SpellDialogChildWindow::GetChildWindowId() );
124 3 : SFX_CHILDWINDOW_REGISTRATION( SID_SEARCH_DLG );
125 3 : }
126 :
127 :
128 0 : TYPEINIT1( OutlineViewShell, ViewShell );
129 :
130 :
131 : /*************************************************************************
132 : |*
133 : |* common initialization part of both constructors
134 : |*
135 : \************************************************************************/
136 :
137 0 : void OutlineViewShell::Construct(DrawDocShell* )
138 : {
139 0 : sal_Bool bModified = GetDoc()->IsChanged();
140 :
141 0 : meShellType = ST_OUTLINE;
142 0 : Size aSize(29700, 21000);
143 0 : Point aWinPos (0, 0);
144 0 : Point aViewOrigin(0, 0);
145 0 : GetActiveWindow()->SetMinZoomAutoCalc(sal_False);
146 0 : GetActiveWindow()->SetMinZoom( MIN_ZOOM );
147 0 : GetActiveWindow()->SetMaxZoom( MAX_ZOOM );
148 0 : InitWindows(aViewOrigin, aSize, aWinPos);
149 0 : pOlView = new OutlineView(*GetDocSh(), GetActiveWindow(), *this);
150 0 : mpView = pOlView; // Pointer of base class ViewShell
151 :
152 0 : SetPool( &GetDoc()->GetPool() );
153 :
154 0 : SetZoom(69);
155 :
156 : // Apply settings of FrameView
157 0 : ReadFrameViewData(mpFrameView);
158 :
159 0 : ::Outliner* pOutl = pOlView->GetOutliner();
160 0 : pOutl->SetUpdateMode(sal_True);
161 :
162 0 : if (!bModified)
163 : {
164 0 : pOutl->ClearModifyFlag();
165 : }
166 :
167 0 : pLastPage = GetActualPage();
168 :
169 0 : SetName( OUString( "OutlineViewShell" ) );
170 :
171 0 : SetHelpId( SD_IF_SDOUTLINEVIEWSHELL );
172 0 : GetActiveWindow()->SetHelpId( HID_SDOUTLINEVIEWSHELL );
173 0 : GetActiveWindow()->SetUniqueId( HID_SDOUTLINEVIEWSHELL );
174 0 : }
175 :
176 :
177 :
178 :
179 0 : Reference<drawing::XDrawSubController> OutlineViewShell::CreateSubController (void)
180 : {
181 0 : Reference<drawing::XDrawSubController> xSubController;
182 :
183 0 : if (IsMainViewShell())
184 : {
185 : // Create uno sub controller for the main view shell.
186 : xSubController = Reference<drawing::XDrawSubController>(
187 : new SdUnoOutlineView (
188 0 : *this));
189 : }
190 :
191 0 : return xSubController;
192 : }
193 :
194 :
195 :
196 :
197 : /*************************************************************************
198 : |*
199 : |* Default constructor, windows must not center themselves automatically
200 : |*
201 : \************************************************************************/
202 :
203 0 : OutlineViewShell::OutlineViewShell (
204 : SfxViewFrame* pFrame,
205 : ViewShellBase& rViewShellBase,
206 : ::Window* pParentWindow,
207 : FrameView* pFrameViewArgument)
208 : : ViewShell(pFrame, pParentWindow, rViewShellBase),
209 : pOlView(NULL),
210 : pLastPage( NULL ),
211 : pClipEvtLstnr(NULL),
212 : bPastePossible(false),
213 0 : mbInitialized(false)
214 :
215 : {
216 0 : if (pFrameViewArgument != NULL)
217 0 : mpFrameView = pFrameViewArgument;
218 : else
219 0 : mpFrameView = new FrameView(GetDoc());
220 :
221 0 : mpFrameView->Connect();
222 :
223 0 : Construct(GetDocSh());
224 :
225 0 : doShow();
226 0 : }
227 :
228 : /*************************************************************************
229 : |*
230 : |* Destructor
231 : |*
232 : \************************************************************************/
233 :
234 0 : OutlineViewShell::~OutlineViewShell()
235 : {
236 0 : DisposeFunctions();
237 :
238 0 : delete pOlView;
239 :
240 0 : mpFrameView->Disconnect();
241 :
242 0 : if ( pClipEvtLstnr )
243 : {
244 0 : pClipEvtLstnr->AddRemoveListener( GetActiveWindow(), sal_False );
245 0 : pClipEvtLstnr->ClearCallbackLink(); // prevent callback if another thread is waiting
246 0 : pClipEvtLstnr->release();
247 : }
248 0 : }
249 :
250 :
251 :
252 :
253 0 : void OutlineViewShell::Shutdown (void)
254 : {
255 0 : ViewShell::Shutdown();
256 :
257 0 : PrepareClose();
258 0 : }
259 :
260 :
261 :
262 :
263 : /*************************************************************************
264 : |*
265 : |* Paint method: the event gets forwarded from pWindow to the Viewshell
266 : |* and the current function
267 : |*
268 : \************************************************************************/
269 :
270 0 : void OutlineViewShell::Paint(const Rectangle& rRect, ::sd::Window* pWin)
271 : {
272 0 : if (pOlView)
273 : {
274 0 : pOlView->Paint(rRect, pWin);
275 : }
276 :
277 0 : if(HasCurrentFunction())
278 : {
279 0 : GetCurrentFunction()->Paint(rRect, pWin);
280 : }
281 0 : }
282 :
283 0 : void OutlineViewShell::ArrangeGUIElements ()
284 : {
285 : // Retrieve the current size (thickness) of the scroll bars. That is
286 : // the width of the vertical and the height of the horizontal scroll
287 : // bar.
288 : int nScrollBarSize =
289 0 : GetParentWindow()->GetSettings().GetStyleSettings().GetScrollBarSize();
290 0 : maScrBarWH = Size (nScrollBarSize, nScrollBarSize);
291 :
292 0 : ViewShell::ArrangeGUIElements ();
293 :
294 0 : ::sd::Window* pWindow = mpContentWindow.get();
295 0 : if (pWindow != NULL)
296 : {
297 0 : pWindow->SetMinZoomAutoCalc(sal_False);
298 :
299 :
300 : // change OuputArea of the OutlinerView
301 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
302 :
303 0 : Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
304 :
305 0 : aWin = pWindow->PixelToLogic(aWin);
306 0 : pOutlinerView->SetOutputArea(aWin);
307 :
308 0 : Rectangle aVis = pOutlinerView->GetVisArea();
309 :
310 : Rectangle aText = Rectangle(Point(0,0),
311 0 : Size(pOlView->GetPaperWidth(),
312 0 : pOlView->GetOutliner()->GetTextHeight()));
313 0 : aText.Bottom() += aWin.GetHeight();
314 :
315 0 : if (!aWin.IsEmpty()) // not when opening
316 : {
317 0 : InitWindows(Point(0,0), aText.GetSize(), Point(aVis.TopLeft()));
318 0 : UpdateScrollBars();
319 : }
320 : }
321 0 : }
322 :
323 : /*************************************************************************
324 : |*
325 : |* Handle SfxRequest for the Controller
326 : |*
327 : \************************************************************************/
328 :
329 0 : void OutlineViewShell::ExecCtrl(SfxRequest &rReq)
330 : {
331 0 : sal_uInt16 nSlot = rReq.GetSlot();
332 0 : switch ( nSlot )
333 : {
334 : case SID_MAIL_SCROLLBODY_PAGEDOWN:
335 : {
336 0 : ExecReq( rReq );
337 0 : break;
338 : }
339 :
340 : case SID_OPT_LOCALE_CHANGED:
341 : {
342 0 : pOlView->GetOutliner()->UpdateFields();
343 0 : UpdatePreview( GetActualPage() );
344 0 : rReq.Done();
345 0 : break;
346 : }
347 :
348 : default:
349 0 : break;
350 : }
351 0 : }
352 :
353 :
354 :
355 :
356 0 : void OutlineViewShell::AddWindow (::sd::Window* pWin)
357 : {
358 0 : pOlView->AddWindowToPaintView(pWin);
359 0 : }
360 :
361 :
362 :
363 :
364 0 : void OutlineViewShell::RemoveWindow (::sd::Window* pWin)
365 : {
366 0 : pOlView->DeleteWindowFromPaintView(pWin);
367 0 : }
368 :
369 :
370 :
371 :
372 : /*************************************************************************
373 : |*
374 : |* Activate(): during the first invocation the fields get updated
375 : |*
376 : \************************************************************************/
377 0 : void OutlineViewShell::Activate( sal_Bool bIsMDIActivate )
378 : {
379 0 : if ( ! mbInitialized)
380 : {
381 0 : mbInitialized = true;
382 0 : SfxRequest aRequest (SID_EDIT_OUTLINER, 0, GetDoc()->GetItemPool());
383 0 : FuPermanent (aRequest);
384 : }
385 :
386 0 : ViewShell::Activate( bIsMDIActivate );
387 0 : pOlView->SetLinks();
388 0 : pOlView->ConnectToApplication();
389 :
390 0 : if( bIsMDIActivate )
391 : {
392 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
393 0 : ::Outliner* pOutl = pOutlinerView->GetOutliner();
394 0 : pOutl->UpdateFields();
395 : }
396 0 : }
397 :
398 : /*************************************************************************
399 : |*
400 : |* Deactivate()
401 : |*
402 : \************************************************************************/
403 0 : void OutlineViewShell::Deactivate( sal_Bool bIsMDIActivate )
404 : {
405 0 : pOlView->DisconnectFromApplication();
406 :
407 : // Links must be kept also on deactivated viewshell, to allow drag'n'drop
408 : // to function properly
409 0 : ViewShell::Deactivate( bIsMDIActivate );
410 0 : }
411 :
412 : /*************************************************************************
413 : |*
414 : |* Set status of Controller-SfxSlots
415 : |*
416 : \************************************************************************/
417 0 : void OutlineViewShell::GetCtrlState(SfxItemSet &rSet)
418 : {
419 0 : if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_HYPERLINK_GETLINK))
420 : {
421 0 : SvxHyperlinkItem aHLinkItem;
422 :
423 0 : OutlinerView* pOLV = pOlView->GetViewByWindow(GetActiveWindow());
424 0 : if (pOLV)
425 : {
426 0 : const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();
427 0 : if (pFieldItem)
428 : {
429 0 : ESelection aSel = pOLV->GetSelection();
430 0 : if ( abs( aSel.nEndPos - aSel.nStartPos ) == 1 )
431 : {
432 0 : const SvxFieldData* pField = pFieldItem->GetField();
433 0 : if ( pField->ISA(SvxURLField) )
434 : {
435 0 : aHLinkItem.SetName(((const SvxURLField*) pField)->GetRepresentation());
436 0 : aHLinkItem.SetURL(((const SvxURLField*) pField)->GetURL());
437 0 : aHLinkItem.SetTargetFrame(((const SvxURLField*) pField)->GetTargetFrame());
438 : }
439 : }
440 : }
441 : }
442 0 : rSet.Put(aHLinkItem);
443 : }
444 0 : rSet.Put( SfxBoolItem( SID_READONLY_MODE, GetDocSh()->IsReadOnly() ) );
445 :
446 0 : if ( SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) )
447 0 : rSet.Put( SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, sal_True ) );
448 :
449 0 : if ( SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_TRANSLITERATE_HALFWIDTH) ||
450 0 : SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_TRANSLITERATE_FULLWIDTH) ||
451 0 : SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_TRANSLITERATE_HIRAGANA) ||
452 0 : SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_TRANSLITERATE_KATAGANA) )
453 : {
454 0 : SvtCJKOptions aCJKOptions;
455 0 : if( !aCJKOptions.IsChangeCaseMapEnabled() )
456 : {
457 0 : GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, sal_False );
458 0 : GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, sal_False );
459 0 : GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, sal_False );
460 0 : GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAGANA, sal_False );
461 0 : rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH );
462 0 : rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH );
463 0 : rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA );
464 0 : rSet.DisableItem( SID_TRANSLITERATE_KATAGANA );
465 : }
466 : else
467 : {
468 0 : GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, sal_True );
469 0 : GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, sal_True );
470 0 : GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, sal_True );
471 0 : GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAGANA, sal_True );
472 0 : }
473 : }
474 0 : }
475 :
476 : /*************************************************************************
477 : |*
478 : |* SfxRequests for support functions
479 : |*
480 : \************************************************************************/
481 :
482 0 : void OutlineViewShell::FuSupport(SfxRequest &rReq)
483 : {
484 0 : if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs())
485 0 : GetDocSh()->SetStyleFamily(((SfxUInt16Item&)rReq.GetArgs()->Get( SID_STYLE_FAMILY )).GetValue());
486 :
487 0 : sal_Bool bPreviewState = sal_False;
488 0 : sal_uLong nSlot = rReq.GetSlot();
489 :
490 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
491 0 : std::auto_ptr< OutlineViewModelChangeGuard > aGuard;
492 : SAL_WNODEPRECATED_DECLARATIONS_POP
493 0 : if( pOlView && (
494 : (nSlot == SID_TRANSLITERATE_SENTENCE_CASE) ||
495 : (nSlot == SID_TRANSLITERATE_TITLE_CASE) ||
496 : (nSlot == SID_TRANSLITERATE_TOGGLE_CASE) ||
497 : (nSlot == SID_TRANSLITERATE_UPPER) ||
498 : (nSlot == SID_TRANSLITERATE_LOWER) ||
499 : (nSlot == SID_TRANSLITERATE_HALFWIDTH) ||
500 : (nSlot == SID_TRANSLITERATE_FULLWIDTH) ||
501 : (nSlot == SID_TRANSLITERATE_HIRAGANA) ||
502 : (nSlot == SID_TRANSLITERATE_KATAGANA) ||
503 : (nSlot == SID_CUT) ||
504 : (nSlot == SID_PASTE) ||
505 : (nSlot == SID_DELETE)))
506 : {
507 0 : aGuard.reset( new OutlineViewModelChangeGuard( *pOlView ) );
508 : }
509 :
510 0 : switch ( nSlot )
511 : {
512 : case SID_CUT:
513 : {
514 0 : if(HasCurrentFunction())
515 : {
516 0 : GetCurrentFunction()->DoCut();
517 : }
518 0 : else if (pOlView)
519 : {
520 0 : pOlView->DoCut();
521 : }
522 0 : rReq.Done();
523 0 : bPreviewState = sal_True;
524 : }
525 0 : break;
526 :
527 : case SID_COPY:
528 : {
529 0 : if(HasCurrentFunction())
530 : {
531 0 : GetCurrentFunction()->DoCopy();
532 : }
533 0 : else if (pOlView)
534 : {
535 0 : pOlView->DoCopy();
536 : }
537 0 : rReq.Done();
538 0 : bPreviewState = sal_True;
539 : }
540 0 : break;
541 :
542 : case SID_PASTE:
543 : {
544 0 : OutlineViewPageChangesGuard aGuard2(pOlView);
545 :
546 0 : if(HasCurrentFunction())
547 : {
548 0 : GetCurrentFunction()->DoPaste();
549 : }
550 0 : else if (pOlView)
551 : {
552 0 : pOlView->DoPaste();
553 : }
554 0 : rReq.Done();
555 0 : bPreviewState = sal_True;
556 : }
557 0 : break;
558 :
559 : case SID_DELETE:
560 : {
561 0 : if( pOlView )
562 : {
563 0 : OutlinerView* pOutlView = pOlView->GetViewByWindow(GetActiveWindow());
564 0 : if (pOutlView)
565 : {
566 0 : OutlineViewPageChangesGuard aGuard2(pOlView);
567 :
568 0 : KeyCode aKCode(KEY_DELETE);
569 0 : KeyEvent aKEvt( 0, aKCode );
570 0 : pOutlView->PostKeyEvent(aKEvt);
571 :
572 0 : FunctionReference xFunc( GetCurrentFunction() );
573 0 : FuOutlineText* pFuOutlineText = dynamic_cast< FuOutlineText* >( xFunc.get() );
574 0 : if( pFuOutlineText )
575 0 : pFuOutlineText->UpdateForKeyPress (aKEvt);
576 : }
577 : }
578 0 : rReq.Done();
579 0 : bPreviewState = sal_True;
580 : }
581 0 : break;
582 :
583 : case SID_DRAWINGMODE:
584 : case SID_NOTESMODE:
585 : case SID_HANDOUTMODE:
586 : case SID_DIAMODE:
587 : case SID_OUTLINEMODE:
588 0 : framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot(
589 : nSlot,
590 0 : rReq);
591 0 : rReq.Done();
592 0 : break;
593 :
594 : case SID_RULER:
595 0 : SetRuler( !HasRuler() );
596 0 : Invalidate( SID_RULER );
597 0 : rReq.Done();
598 0 : break;
599 :
600 : case SID_ZOOM_PREV:
601 : {
602 0 : if (mpZoomList->IsPreviousPossible())
603 : {
604 0 : SetZoomRect(mpZoomList->GetPreviousZoomRect());
605 : }
606 0 : rReq.Done ();
607 : }
608 0 : break;
609 :
610 : case SID_ZOOM_NEXT:
611 : {
612 0 : if (mpZoomList->IsNextPossible())
613 : {
614 0 : SetZoomRect(mpZoomList->GetNextZoomRect());
615 : }
616 0 : rReq.Done ();
617 : }
618 0 : break;
619 :
620 : case SID_AUTOSPELL_CHECK:
621 : {
622 0 : GetDoc()->SetOnlineSpell(!GetDoc()->GetOnlineSpell());
623 0 : rReq.Done ();
624 : }
625 0 : break;
626 :
627 : case SID_TRANSLITERATE_SENTENCE_CASE:
628 : case SID_TRANSLITERATE_TITLE_CASE:
629 : case SID_TRANSLITERATE_TOGGLE_CASE:
630 : case SID_TRANSLITERATE_UPPER:
631 : case SID_TRANSLITERATE_LOWER:
632 : case SID_TRANSLITERATE_HALFWIDTH:
633 : case SID_TRANSLITERATE_FULLWIDTH:
634 : case SID_TRANSLITERATE_HIRAGANA:
635 : case SID_TRANSLITERATE_KATAGANA:
636 : {
637 0 : OutlinerView* pOLV = pOlView->GetViewByWindow( GetActiveWindow() );
638 0 : if( pOLV )
639 : {
640 : using namespace ::com::sun::star::i18n;
641 0 : sal_Int32 nType = 0;
642 :
643 0 : switch( nSlot )
644 : {
645 : case SID_TRANSLITERATE_SENTENCE_CASE:
646 0 : nType = TransliterationModulesExtra::SENTENCE_CASE;
647 0 : break;
648 : case SID_TRANSLITERATE_TITLE_CASE:
649 0 : nType = TransliterationModulesExtra::TITLE_CASE;
650 0 : break;
651 : case SID_TRANSLITERATE_TOGGLE_CASE:
652 0 : nType = TransliterationModulesExtra::TOGGLE_CASE;
653 0 : break;
654 : case SID_TRANSLITERATE_UPPER:
655 0 : nType = TransliterationModules_LOWERCASE_UPPERCASE;
656 0 : break;
657 : case SID_TRANSLITERATE_LOWER:
658 0 : nType = TransliterationModules_UPPERCASE_LOWERCASE;
659 0 : break;
660 : case SID_TRANSLITERATE_HALFWIDTH:
661 0 : nType = TransliterationModules_FULLWIDTH_HALFWIDTH;
662 0 : break;
663 : case SID_TRANSLITERATE_FULLWIDTH:
664 0 : nType = TransliterationModules_HALFWIDTH_FULLWIDTH;
665 0 : break;
666 : case SID_TRANSLITERATE_HIRAGANA:
667 0 : nType = TransliterationModules_KATAKANA_HIRAGANA;
668 0 : break;
669 : case SID_TRANSLITERATE_KATAGANA:
670 0 : nType = TransliterationModules_HIRAGANA_KATAKANA;
671 0 : break;
672 : }
673 :
674 0 : pOLV->TransliterateText( nType );
675 : }
676 :
677 0 : rReq.Done();
678 0 : bPreviewState = sal_True;
679 : }
680 0 : break;
681 :
682 : // added Undo/Redo handling
683 : case SID_UNDO :
684 : {
685 0 : OutlineViewPageChangesGuard aGuard2(pOlView);
686 0 : ImpSidUndo(sal_False, rReq);
687 : }
688 0 : break;
689 : case SID_REDO :
690 : {
691 0 : OutlineViewPageChangesGuard aGuard2(pOlView);
692 0 : ImpSidRedo(sal_False, rReq);
693 : }
694 0 : break;
695 :
696 : default:
697 0 : break;
698 : }
699 :
700 0 : if( bPreviewState )
701 0 : Invalidate( SID_PREVIEW_STATE );
702 :
703 0 : Invalidate(SID_CUT);
704 0 : Invalidate(SID_COPY);
705 0 : Invalidate(SID_PASTE);
706 0 : }
707 :
708 : /*************************************************************************
709 : |*
710 : |* SfxRequests for permanent functions
711 : |*
712 : \************************************************************************/
713 :
714 0 : void OutlineViewShell::FuPermanent(SfxRequest &rReq)
715 : {
716 0 : if(HasCurrentFunction())
717 : {
718 0 : DeactivateCurrentFunction(true);
719 : }
720 :
721 0 : switch ( rReq.GetSlot() )
722 : {
723 : case SID_EDIT_OUTLINER:
724 : {
725 0 : ::Outliner* pOutl = pOlView->GetOutliner();
726 0 : if( pOutl )
727 : {
728 0 : pOutl->GetUndoManager().Clear();
729 0 : pOutl->UpdateFields();
730 : }
731 :
732 0 : SetCurrentFunction( FuOutlineText::Create(this,GetActiveWindow(),pOlView,GetDoc(),rReq) );
733 :
734 0 : rReq.Done();
735 : }
736 0 : break;
737 :
738 : default:
739 0 : break;
740 : }
741 :
742 0 : if(HasOldFunction())
743 : {
744 0 : GetOldFunction()->Deactivate();
745 0 : SetOldFunction(0);
746 : }
747 :
748 0 : if(HasCurrentFunction())
749 : {
750 0 : GetCurrentFunction()->Activate();
751 0 : SetOldFunction(GetCurrentFunction());
752 : }
753 0 : }
754 :
755 :
756 0 : IMPL_LINK( OutlineViewShell, ClipboardChanged, TransferableDataHelper*, pDataHelper )
757 : {
758 0 : if ( pDataHelper )
759 : {
760 0 : bPastePossible = ( pDataHelper->GetFormatCount() != 0 &&
761 0 : ( pDataHelper->HasFormat( FORMAT_STRING ) ||
762 0 : pDataHelper->HasFormat( FORMAT_RTF ) ||
763 0 : pDataHelper->HasFormat( SOT_FORMATSTR_ID_HTML ) ) );
764 :
765 0 : SfxBindings& rBindings = GetViewFrame()->GetBindings();
766 0 : rBindings.Invalidate( SID_PASTE );
767 0 : rBindings.Invalidate( SID_PASTE_SPECIAL );
768 0 : rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
769 : }
770 0 : return 0;
771 : }
772 :
773 : /*************************************************************************
774 : |*
775 : |* Set Status (Enabled/Disabled) of Menu-SfxSlots
776 : |*
777 : \************************************************************************/
778 :
779 0 : void OutlineViewShell::GetMenuState( SfxItemSet &rSet )
780 : {
781 0 : ViewShell::GetMenuState(rSet);
782 :
783 0 : rSet.Put(SfxBoolItem(SID_DIAMODE, sal_False));
784 0 : rSet.Put(SfxBoolItem(SID_DRAWINGMODE, sal_False));
785 0 : rSet.Put(SfxBoolItem(SID_OUTLINEMODE, sal_True));
786 0 : rSet.Put(SfxBoolItem(SID_NOTESMODE, sal_False));
787 0 : rSet.Put(SfxBoolItem(SID_HANDOUTMODE, sal_False));
788 :
789 0 : if (!mpZoomList->IsNextPossible())
790 : {
791 0 : rSet.DisableItem(SID_ZOOM_NEXT);
792 : }
793 0 : if (!mpZoomList->IsPreviousPossible())
794 : {
795 0 : rSet.DisableItem(SID_ZOOM_PREV);
796 : }
797 :
798 0 : if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ZOOM_IN ) ||
799 0 : SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ZOOM_OUT ) )
800 : {
801 0 : if( GetActiveWindow()->GetZoom() <= GetActiveWindow()->GetMinZoom() || GetDocSh()->IsUIActive() )
802 0 : rSet.DisableItem( SID_ZOOM_IN );
803 0 : if( GetActiveWindow()->GetZoom() >= GetActiveWindow()->GetMaxZoom() || GetDocSh()->IsUIActive() )
804 0 : rSet.DisableItem( SID_ZOOM_OUT );
805 : }
806 :
807 0 : ::Outliner* pOutl = pOlView->GetOutliner();
808 : DBG_ASSERT(pOutl, "OutlineViewShell::GetMenuState(), no outliner? Fatality!");
809 0 : if( !pOutl )
810 0 : return;
811 :
812 : // allow 'Select All'?
813 0 : if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_SELECTALL ) )
814 : {
815 0 : sal_uLong nParaCount = pOutl->GetParagraphCount();
816 0 : sal_Bool bDisable = nParaCount == 0;
817 0 : if (!bDisable && nParaCount == 1)
818 : {
819 0 : String aTest( pOutl->GetText( pOutl->GetParagraph( 0 ) ) );
820 0 : if (aTest.Len() == 0)
821 : {
822 0 : bDisable = sal_True;
823 0 : }
824 : }
825 0 : if (bDisable)
826 0 : rSet.DisableItem(SID_SELECTALL);
827 : }
828 :
829 : // set status of Ruler
830 0 : rSet.Put( SfxBoolItem( SID_RULER, HasRuler() ) );
831 :
832 : // Enable formatting?
833 0 : rSet.Put( SfxBoolItem( SID_OUTLINE_FORMAT, !pOutl->IsFlatMode() ) );
834 :
835 0 : if( pOutl->IsFlatMode() )
836 0 : rSet.DisableItem( SID_COLORVIEW );
837 : else
838 : {
839 : // Enable color view?
840 0 : sal_uLong nCntrl = pOutl->GetControlWord();
841 0 : sal_Bool bNoColor = sal_False;
842 0 : if (nCntrl & EE_CNTRL_NOCOLORS)
843 0 : bNoColor = sal_True;
844 :
845 0 : rSet.Put( SfxBoolItem( SID_COLORVIEW, bNoColor ) );
846 : }
847 :
848 : // Buttons of toolbar
849 : // first the selection dependent ones: COLLAPSE, EXPAND
850 0 : sal_Bool bDisableCollapse = sal_True;
851 0 : sal_Bool bDisableExpand = sal_True;
852 0 : sal_Bool bUnique = sal_True;
853 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow(GetActiveWindow());
854 :
855 0 : std::vector<Paragraph*> aSelList;
856 0 : pOutlinerView->CreateSelectionList(aSelList);
857 :
858 0 : if (!aSelList.empty())
859 : {
860 0 : std::vector<Paragraph*>::const_iterator iter = aSelList.begin();
861 0 : Paragraph* pPara = *iter;
862 :
863 : sal_Int16 nDepth;
864 0 : sal_Int16 nTmpDepth = pOutl->GetDepth( (sal_uInt16) pOutl->GetAbsPos( pPara ) );
865 0 : bool bPage = pOutl->HasParaFlag( pPara, PARAFLAG_ISPAGE );
866 :
867 0 : while (iter != aSelList.begin())
868 : {
869 0 : pPara = *iter;
870 :
871 0 : nDepth = pOutl->GetDepth( (sal_uInt16) pOutl->GetAbsPos( pPara ) );
872 :
873 0 : if( nDepth != nTmpDepth || bPage != pOutl->HasParaFlag( pPara, PARAFLAG_ISPAGE ))
874 0 : bUnique = sal_False;
875 :
876 0 : if (pOutl->HasChildren(pPara))
877 : {
878 0 : if (!pOutl->IsExpanded(pPara))
879 0 : bDisableExpand = sal_False;
880 : else
881 0 : bDisableCollapse = sal_False;
882 : }
883 :
884 0 : ++iter;
885 : }
886 : }
887 :
888 0 : if (bDisableExpand)
889 0 : rSet.DisableItem(SID_OUTLINE_EXPAND);
890 0 : if (bDisableCollapse)
891 0 : rSet.DisableItem(SID_OUTLINE_COLLAPSE);
892 :
893 : // does the selection provide a unique presentation layout?
894 : // if not, the templates must not be edited
895 0 : SfxItemSet aSet(*rSet.GetPool(), SID_STATUS_LAYOUT, SID_STATUS_LAYOUT);
896 0 : GetStatusBarState(aSet);
897 0 : String aTest(((SfxStringItem&)aSet.Get(SID_STATUS_LAYOUT)).GetValue());
898 0 : if (aTest.Len() == 0)
899 : {
900 0 : bUnique = sal_False;
901 0 : rSet.DisableItem(SID_PRESENTATION_TEMPLATES);
902 : }
903 :
904 0 : if (!bUnique)
905 0 : rSet.DisableItem( SID_PRESENTATIONOBJECT );
906 :
907 : // now the selection independent ones: COLLAPSE_ALL, EXPAND_ALL
908 0 : sal_Bool bDisableCollapseAll = sal_True;
909 0 : sal_Bool bDisableExpandAll = sal_True;
910 :
911 : // does the selection contain something collapsable/expandable?
912 0 : if (!bDisableCollapse)
913 0 : bDisableCollapseAll = sal_False;
914 0 : if (!bDisableExpand)
915 0 : bDisableExpandAll = sal_False;
916 :
917 : // otherwise look through all paragraphs
918 0 : if (bDisableCollapseAll || bDisableExpandAll)
919 : {
920 0 : sal_uLong nParaPos = 0;
921 0 : Paragraph* pPara = pOutl->GetParagraph( nParaPos );
922 0 : while (pPara && (bDisableCollapseAll || bDisableExpandAll))
923 : {
924 0 : if (!pOutl->IsExpanded(pPara) && pOutl->HasChildren(pPara))
925 0 : bDisableExpandAll = sal_False;
926 :
927 0 : if (pOutl->IsExpanded(pPara) && pOutl->HasChildren(pPara))
928 0 : bDisableCollapseAll = sal_False;
929 :
930 0 : pPara = pOutl->GetParagraph( ++nParaPos );
931 : }
932 : }
933 :
934 0 : if (bDisableExpandAll)
935 0 : rSet.DisableItem(SID_OUTLINE_EXPAND_ALL);
936 0 : if (bDisableCollapseAll)
937 0 : rSet.DisableItem(SID_OUTLINE_COLLAPSE_ALL);
938 :
939 0 : if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_PASTE ) )
940 : {
941 0 : if ( !pClipEvtLstnr )
942 : {
943 : // create listener
944 0 : pClipEvtLstnr = new TransferableClipboardListener( LINK( this, OutlineViewShell, ClipboardChanged ) );
945 0 : pClipEvtLstnr->acquire();
946 0 : pClipEvtLstnr->AddRemoveListener( GetActiveWindow(), sal_True );
947 :
948 : // get initial state
949 0 : TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
950 0 : bPastePossible = ( aDataHelper.GetFormatCount() != 0 &&
951 0 : ( aDataHelper.HasFormat( FORMAT_STRING ) ||
952 0 : aDataHelper.HasFormat( FORMAT_RTF ) ||
953 0 : aDataHelper.HasFormat( SOT_FORMATSTR_ID_HTML ) ) );
954 : }
955 :
956 0 : if( !bPastePossible )
957 : {
958 0 : rSet.DisableItem( SID_PASTE );
959 : }
960 : }
961 :
962 0 : if (!pOlView->GetViewByWindow(GetActiveWindow())->HasSelection())
963 : {
964 0 : rSet.DisableItem(SID_CUT);
965 0 : rSet.DisableItem(SID_COPY);
966 : }
967 :
968 0 : if (pOlView->GetOutliner()->IsModified())
969 : {
970 0 : GetDoc()->SetChanged(sal_True);
971 : }
972 :
973 : // the status has to be set here because of overloading
974 0 : if( !GetDocSh()->IsModified() )
975 : {
976 0 : rSet.DisableItem( SID_SAVEDOC );
977 : }
978 :
979 0 : if ( GetDocSh()->IsReadOnly() )
980 : {
981 0 : rSet.DisableItem( SID_AUTOSPELL_CHECK );
982 : }
983 : else
984 : {
985 0 : if (GetDoc()->GetOnlineSpell())
986 : {
987 0 : rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, sal_True));
988 : }
989 : else
990 : {
991 0 : rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, sal_False));
992 : }
993 : }
994 :
995 : // field commands
996 0 : if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_MODIFY_FIELD ) )
997 : {
998 0 : const SvxFieldItem* pFldItem = pOutlinerView->GetFieldAtSelection();
999 :
1000 0 : if( !( pFldItem && (pFldItem->GetField()->ISA( SvxDateField ) ||
1001 0 : pFldItem->GetField()->ISA( SvxAuthorField ) ||
1002 0 : pFldItem->GetField()->ISA( SvxExtFileField ) ||
1003 0 : pFldItem->GetField()->ISA( SvxExtTimeField ) ) ) )
1004 : {
1005 0 : rSet.DisableItem( SID_MODIFY_FIELD );
1006 : }
1007 : }
1008 :
1009 0 : if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_EXPAND_PAGE))
1010 : {
1011 0 : sal_Bool bDisable = sal_True;
1012 0 : sal_uInt16 i = 0;
1013 0 : sal_uInt16 nCount = GetDoc()->GetSdPageCount(PK_STANDARD);
1014 0 : pOlView->SetSelectedPages();
1015 :
1016 0 : while (i < nCount && bDisable)
1017 : {
1018 0 : SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD);
1019 :
1020 0 : if (pPage->IsSelected())
1021 : {
1022 0 : SdrObject* pObj = pPage->GetPresObj(PRESOBJ_OUTLINE);
1023 :
1024 0 : if (pObj!=NULL )
1025 : {
1026 0 : if( !pObj->IsEmptyPresObj() )
1027 : {
1028 0 : bDisable = false;
1029 : }
1030 : else
1031 : {
1032 : // check if the object is in edit, than its temporarely not empty
1033 0 : SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
1034 0 : if( pTextObj )
1035 : {
1036 0 : OutlinerParaObject* pParaObj = pTextObj->GetEditOutlinerParaObject();
1037 0 : if( pParaObj )
1038 : {
1039 0 : delete pParaObj;
1040 0 : bDisable = false;
1041 : }
1042 : }
1043 : }
1044 : }
1045 : }
1046 :
1047 0 : i++;
1048 : }
1049 :
1050 0 : if (bDisable)
1051 : {
1052 0 : rSet.DisableItem(SID_EXPAND_PAGE);
1053 : }
1054 : }
1055 :
1056 0 : if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_SUMMARY_PAGE))
1057 : {
1058 0 : sal_Bool bDisable = sal_True;
1059 0 : sal_uInt16 i = 0;
1060 0 : sal_uInt16 nCount = GetDoc()->GetSdPageCount(PK_STANDARD);
1061 0 : pOlView->SetSelectedPages();
1062 :
1063 0 : while (i < nCount && bDisable)
1064 : {
1065 0 : SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD);
1066 :
1067 0 : if (pPage->IsSelected())
1068 : {
1069 0 : SdrObject* pObj = pPage->GetPresObj(PRESOBJ_TITLE);
1070 :
1071 0 : if (pObj && !pObj->IsEmptyPresObj())
1072 : {
1073 0 : bDisable = sal_False;
1074 : }
1075 : }
1076 :
1077 0 : i++;
1078 : }
1079 :
1080 0 : if (bDisable)
1081 : {
1082 0 : rSet.DisableItem(SID_SUMMARY_PAGE);
1083 : }
1084 : }
1085 :
1086 0 : if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_THESAURUS ) )
1087 : {
1088 0 : if ( !pOlView->IsTextEdit() )
1089 : {
1090 0 : rSet.DisableItem( SID_THESAURUS );
1091 : }
1092 : else
1093 : {
1094 0 : LanguageType eLang = GetDoc()->GetLanguage( EE_CHAR_LANGUAGE );
1095 0 : Reference< XThesaurus > xThesaurus( LinguMgr::GetThesaurus() );
1096 :
1097 0 : if (!xThesaurus.is() || eLang == LANGUAGE_NONE || !xThesaurus->hasLocale( LanguageTag( eLang).getLocale()))
1098 0 : rSet.DisableItem( SID_THESAURUS );
1099 : }
1100 : }
1101 :
1102 : // is starting the presentation possible?
1103 0 : if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_PRESENTATION ) )
1104 : {
1105 0 : sal_Bool bDisable = sal_True;
1106 0 : sal_uInt16 nCount = GetDoc()->GetSdPageCount( PK_STANDARD );
1107 :
1108 0 : for( sal_uInt16 i = 0; i < nCount && bDisable; i++ )
1109 : {
1110 0 : SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD);
1111 :
1112 0 : if( !pPage->IsExcluded() )
1113 0 : bDisable = sal_False;
1114 : }
1115 0 : if( bDisable || GetDocSh()->IsPreview())
1116 : {
1117 0 : rSet.DisableItem( SID_PRESENTATION );
1118 : }
1119 : }
1120 :
1121 0 : FuBullet::GetSlotState( rSet, this, GetViewFrame() );
1122 :
1123 : }
1124 :
1125 : /*************************************************************************
1126 : |*
1127 : |* gets invoked when ScrollBar is used
1128 : |*
1129 : \************************************************************************/
1130 :
1131 0 : long OutlineViewShell::VirtHScrollHdl(ScrollBar* pHScroll)
1132 : {
1133 0 : long nThumb = pHScroll->GetThumbPos();
1134 0 : long nRange = pHScroll->GetRange().Len();
1135 0 : double fX = (double) nThumb / nRange;
1136 :
1137 0 : Window* pWin = mpContentWindow.get();
1138 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWin);
1139 : long nViewWidth = pWin->PixelToLogic(
1140 0 : pWin->GetSizePixel()).Width();
1141 0 : long nTextWidth = pOlView->GetPaperWidth();
1142 0 : nViewWidth = Max(nViewWidth, nTextWidth);
1143 0 : long nCurrentPos = pOutlinerView->GetVisArea().Left();
1144 0 : long nTargetPos = (long)(fX * nViewWidth);
1145 0 : long nDelta = nTargetPos - nCurrentPos;
1146 :
1147 0 : pOutlinerView->HideCursor();
1148 0 : pOutlinerView->Scroll(-nDelta, 0);
1149 0 : pOutlinerView->ShowCursor(sal_False);
1150 :
1151 0 : pOlView->InvalidateSlideNumberArea();
1152 0 : return 0;
1153 : }
1154 :
1155 0 : long OutlineViewShell::VirtVScrollHdl(ScrollBar* pVScroll)
1156 : {
1157 0 : long nThumb = pVScroll->GetThumbPos();
1158 0 : long nRange = pVScroll->GetRange().Len();
1159 0 : double fY = (double) nThumb / nRange;
1160 :
1161 0 : Window* pWin = mpContentWindow.get();
1162 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWin);
1163 : long nViewHeight = pWin->PixelToLogic(
1164 0 : pWin->GetSizePixel()).Height();
1165 0 : long nTextHeight = pOlView->GetOutliner()->GetTextHeight();
1166 0 : nViewHeight += nTextHeight;
1167 0 : long nCurrentPos = pOutlinerView->GetVisArea().Top();
1168 0 : long nTargetPos = (long)(fY * nViewHeight);
1169 0 : long nDelta = nTargetPos - nCurrentPos;
1170 :
1171 0 : pOutlinerView->HideCursor();
1172 0 : pOutlinerView->Scroll(0, -nDelta);
1173 0 : pOutlinerView->ShowCursor(sal_False);
1174 :
1175 0 : pOlView->InvalidateSlideNumberArea();
1176 :
1177 0 : return 0;
1178 : }
1179 :
1180 : /*************************************************************************
1181 : |*
1182 : |* PrepareClose, gets called when the Shell shall be destroyed.
1183 : |* Forwards the invocation to the View
1184 : |*
1185 : \************************************************************************/
1186 :
1187 0 : sal_uInt16 OutlineViewShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
1188 : {
1189 0 : if( ViewShell::PrepareClose(bUI, bForBrowsing) != sal_True )
1190 0 : return sal_False;
1191 :
1192 0 : return pOlView == NULL || pOlView->PrepareClose(bUI);
1193 : }
1194 :
1195 :
1196 : /*************************************************************************
1197 : |*
1198 : |* Zoom with zoom factor. Inform OutlinerView
1199 : |*
1200 : \************************************************************************/
1201 :
1202 0 : void OutlineViewShell::SetZoom(long nZoom)
1203 : {
1204 0 : ViewShell::SetZoom(nZoom);
1205 :
1206 0 : ::sd::Window* pWindow = mpContentWindow.get();
1207 0 : if (pWindow)
1208 : {
1209 : // change OutputArea of OutlinerView
1210 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
1211 0 : Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
1212 0 : aWin = pWindow->PixelToLogic(aWin);
1213 0 : pOutlinerView->SetOutputArea(aWin);
1214 : }
1215 :
1216 0 : GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
1217 0 : GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
1218 0 : }
1219 :
1220 : /*************************************************************************
1221 : |*
1222 : |* Zoom with zoom rectangle. Inform OutlinerView
1223 : |*
1224 : \************************************************************************/
1225 :
1226 0 : void OutlineViewShell::SetZoomRect(const Rectangle& rZoomRect)
1227 : {
1228 0 : ViewShell::SetZoomRect(rZoomRect);
1229 :
1230 0 : ::sd::Window* pWindow = mpContentWindow.get();
1231 0 : if (pWindow)
1232 : {
1233 : // change OutputArea of OutlinerView
1234 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
1235 0 : Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
1236 0 : aWin = pWindow->PixelToLogic(aWin);
1237 0 : pOutlinerView->SetOutputArea(aWin);
1238 : }
1239 :
1240 0 : GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
1241 0 : GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
1242 0 : }
1243 :
1244 : /*************************************************************************
1245 : |*
1246 : |* Before saving: Update Model of the Drawing Engine, then forward the
1247 : |* invocation to the ObjectShell.
1248 : |*
1249 : \************************************************************************/
1250 :
1251 0 : void OutlineViewShell::Execute(SfxRequest& rReq)
1252 : {
1253 0 : bool bForwardCall = true;
1254 :
1255 0 : switch(rReq.GetSlot())
1256 : {
1257 : case SID_SAVEDOC:
1258 : case SID_SAVEASDOC:
1259 0 : PrepareClose();
1260 0 : break;
1261 :
1262 : case SID_SEARCH_ITEM:
1263 : // Forward this request to the the common (old) code of the
1264 : // document shell.
1265 0 : GetDocSh()->Execute (rReq);
1266 0 : bForwardCall = false;
1267 0 : break;
1268 :
1269 : case SID_SPELL_DIALOG:
1270 : {
1271 0 : SfxViewFrame* pViewFrame = GetViewFrame();
1272 0 : if (rReq.GetArgs() != NULL)
1273 : pViewFrame->SetChildWindow (SID_SPELL_DIALOG,
1274 0 : ((const SfxBoolItem&) (rReq.GetArgs()->
1275 0 : Get(SID_SPELL_DIALOG))).GetValue());
1276 : else
1277 0 : pViewFrame->ToggleChildWindow(SID_SPELL_DIALOG);
1278 :
1279 0 : pViewFrame->GetBindings().Invalidate(SID_SPELL_DIALOG);
1280 0 : rReq.Done ();
1281 :
1282 0 : bForwardCall = false;
1283 : }
1284 0 : break;
1285 :
1286 : default:
1287 : OSL_TRACE ("OutlineViewShell::Execute(): can not handle slot %d", rReq.GetSlot());
1288 0 : break;
1289 :
1290 : }
1291 :
1292 0 : if (bForwardCall)
1293 0 : ((DrawDocShell*)GetViewFrame()->GetObjectShell())->ExecuteSlot( rReq );
1294 0 : }
1295 :
1296 : /*************************************************************************
1297 : |*
1298 : |* Read FrameViews data and set actual views data
1299 : |*
1300 : \************************************************************************/
1301 :
1302 0 : void OutlineViewShell::ReadFrameViewData(FrameView* pView)
1303 : {
1304 0 : ::Outliner* pOutl = pOlView->GetOutliner();
1305 :
1306 0 : pOutl->SetFlatMode( static_cast<bool>(pView->IsNoAttribs()) );
1307 :
1308 0 : sal_uLong nCntrl = pOutl->GetControlWord();
1309 :
1310 0 : if ( pView->IsNoColors() )
1311 0 : pOutl->SetControlWord(nCntrl | EE_CNTRL_NOCOLORS);
1312 : else
1313 0 : pOutl->SetControlWord(nCntrl & ~EE_CNTRL_NOCOLORS);
1314 :
1315 0 : sal_uInt16 nPage = mpFrameView->GetSelectedPage();
1316 0 : pLastPage = GetDoc()->GetSdPage( nPage, PK_STANDARD );
1317 0 : pOlView->SetActualPage(pLastPage);
1318 0 : }
1319 :
1320 :
1321 :
1322 : /*************************************************************************
1323 : |*
1324 : |* Write actual views data to FrameView
1325 : |*
1326 : \************************************************************************/
1327 :
1328 0 : void OutlineViewShell::WriteFrameViewData()
1329 : {
1330 0 : ::Outliner* pOutl = pOlView->GetOutliner();
1331 :
1332 0 : sal_uLong nCntrl = pOutl->GetControlWord();
1333 0 : sal_Bool bNoColor = sal_False;
1334 0 : if (nCntrl & EE_CNTRL_NOCOLORS)
1335 0 : bNoColor = sal_True;
1336 0 : mpFrameView->SetNoColors(bNoColor);
1337 0 : mpFrameView->SetNoAttribs( pOutl->IsFlatMode() );
1338 0 : SdPage* pActualPage = pOlView->GetActualPage();
1339 : DBG_ASSERT(pActualPage, "No current page");
1340 0 : if( pActualPage )
1341 0 : mpFrameView->SetSelectedPage((pActualPage->GetPageNum() - 1) / 2);
1342 0 : }
1343 :
1344 :
1345 : /*************************************************************************
1346 : |*
1347 : |* Handle SfxRequests for the StatusBar
1348 : |*
1349 : \************************************************************************/
1350 :
1351 0 : void OutlineViewShell::ExecStatusBar(SfxRequest&)
1352 : {
1353 0 : }
1354 :
1355 : /*************************************************************************
1356 : |*
1357 : |* Return state values of the StatusBar
1358 : |*
1359 : \************************************************************************/
1360 :
1361 0 : void OutlineViewShell::GetStatusBarState(SfxItemSet& rSet)
1362 : {
1363 : // Zoom-Item
1364 0 : if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOM ) )
1365 : {
1366 : SvxZoomItem* pZoomItem;
1367 0 : sal_uInt16 nZoom = (sal_uInt16) GetActiveWindow()->GetZoom();
1368 :
1369 0 : pZoomItem = new SvxZoomItem( SVX_ZOOM_PERCENT, nZoom );
1370 :
1371 : // limit area
1372 0 : sal_uInt16 nZoomValues = SVX_ZOOM_ENABLE_ALL;
1373 0 : nZoomValues &= ~SVX_ZOOM_ENABLE_OPTIMAL;
1374 0 : nZoomValues &= ~SVX_ZOOM_ENABLE_WHOLEPAGE;
1375 0 : nZoomValues &= ~SVX_ZOOM_ENABLE_PAGEWIDTH;
1376 :
1377 0 : pZoomItem->SetValueSet( nZoomValues );
1378 0 : rSet.Put( *pZoomItem );
1379 0 : delete pZoomItem;
1380 : }
1381 :
1382 0 : if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) )
1383 : {
1384 0 : if (GetDocSh()->IsUIActive() || !GetActiveWindow() )
1385 : {
1386 0 : rSet.DisableItem( SID_ATTR_ZOOMSLIDER );
1387 : }
1388 : else
1389 : {
1390 0 : sd::Window * pActiveWindow = GetActiveWindow();
1391 0 : SvxZoomSliderItem aZoomItem( (sal_uInt16) pActiveWindow->GetZoom(), (sal_uInt16)pActiveWindow->GetMinZoom(), (sal_uInt16)pActiveWindow->GetMaxZoom() ) ;
1392 0 : aZoomItem.AddSnappingPoint(100);
1393 0 : rSet.Put( aZoomItem );
1394 : }
1395 : }
1396 :
1397 :
1398 : // page view and layout
1399 :
1400 0 : sal_uInt16 nPageCount = GetDoc()->GetSdPageCount( PK_STANDARD );
1401 0 : String aPageStr, aLayoutStr;
1402 :
1403 0 : ::sd::Window* pWin = GetActiveWindow();
1404 0 : OutlinerView* pActiveView = pOlView->GetViewByWindow( pWin );
1405 0 : ::Outliner* pOutliner = pOlView->GetOutliner();
1406 :
1407 0 : std::vector<Paragraph*> aSelList;
1408 0 : pActiveView->CreateSelectionList(aSelList);
1409 :
1410 0 : Paragraph *pFirstPara = NULL;
1411 0 : Paragraph *pLastPara = NULL;
1412 :
1413 0 : if (!aSelList.empty())
1414 : {
1415 0 : pFirstPara = *(aSelList.begin());
1416 0 : pLastPara = *(aSelList.rbegin());
1417 : }
1418 :
1419 0 : if( !pOutliner->HasParaFlag(pFirstPara,PARAFLAG_ISPAGE) )
1420 0 : pFirstPara = pOlView->GetPrevTitle( pFirstPara );
1421 :
1422 0 : if( !pOutliner->HasParaFlag(pLastPara, PARAFLAG_ISPAGE) )
1423 0 : pLastPara = pOlView->GetPrevTitle( pLastPara );
1424 :
1425 : // only one page selected?
1426 0 : if( pFirstPara == pLastPara )
1427 : {
1428 : // how many pages are we before the selected page?
1429 0 : sal_uLong nPos = 0L;
1430 0 : while( pFirstPara )
1431 : {
1432 0 : pFirstPara = pOlView->GetPrevTitle( pFirstPara );
1433 0 : if( pFirstPara )
1434 0 : nPos++;
1435 : }
1436 :
1437 0 : if( nPos >= GetDoc()->GetSdPageCount( PK_STANDARD ) )
1438 0 : nPos = 0;
1439 :
1440 0 : SdrPage* pPage = GetDoc()->GetSdPage( (sal_uInt16) nPos, PK_STANDARD );
1441 :
1442 0 : aPageStr = String(SdResId( STR_SD_PAGE ));
1443 0 : aPageStr += sal_Unicode(' ');
1444 0 : aPageStr += String::CreateFromInt32( (sal_Int32)(nPos + 1) ); // sal_uLong -> sal_Int32
1445 0 : aPageStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " / " ));
1446 0 : aPageStr += String::CreateFromInt32( nPageCount );
1447 :
1448 0 : aLayoutStr = pPage->GetLayoutName();
1449 0 : aLayoutStr.Erase( aLayoutStr.SearchAscii( SD_LT_SEPARATOR ) );
1450 : }
1451 0 : rSet.Put( SfxStringItem( SID_STATUS_PAGE, aPageStr ) );
1452 0 : rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aLayoutStr ) );
1453 0 : }
1454 :
1455 : /*************************************************************************
1456 : |*
1457 : |* Command event
1458 : |*
1459 : \************************************************************************/
1460 :
1461 0 : void OutlineViewShell::Command( const CommandEvent& rCEvt, ::sd::Window* pWin )
1462 : {
1463 0 : if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
1464 : {
1465 0 : GetActiveWindow()->ReleaseMouse();
1466 :
1467 0 : OutlinerView* pOLV = pOlView->GetViewByWindow(GetActiveWindow());
1468 0 : Point aPos(rCEvt.GetMousePosPixel());
1469 :
1470 0 : if (pOLV && pOLV->IsWrongSpelledWordAtPos(aPos))
1471 : {
1472 : // Popup for Online-Spelling now handled by DrawDocShell
1473 0 : Link aLink = LINK(GetDocSh(), DrawDocShell, OnlineSpellCallback);
1474 :
1475 0 : pOLV->ExecuteSpellPopup(aPos, &aLink);
1476 : }
1477 : else
1478 : {
1479 0 : GetViewFrame()->GetDispatcher()->ExecutePopup(SdResId(RID_OUTLINE_POPUP));
1480 : }
1481 : }
1482 : else
1483 : {
1484 0 : ViewShell::Command( rCEvt, pWin );
1485 :
1486 : // if necessary communicate the new context to the Preview
1487 0 : Invalidate( SID_PREVIEW_STATE );
1488 :
1489 : }
1490 0 : }
1491 :
1492 :
1493 : /*************************************************************************
1494 : |*
1495 : |* Keyboard event
1496 : |*
1497 : \************************************************************************/
1498 :
1499 0 : sal_Bool OutlineViewShell::KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin)
1500 : {
1501 0 : sal_Bool bReturn = sal_False;
1502 0 : OutlineViewPageChangesGuard aGuard(pOlView);
1503 :
1504 0 : if (pWin == NULL && HasCurrentFunction())
1505 : {
1506 0 : bReturn = GetCurrentFunction()->KeyInput(rKEvt);
1507 : }
1508 :
1509 : // no, forward to base class
1510 : else
1511 : {
1512 0 : bReturn = ViewShell::KeyInput(rKEvt, pWin);
1513 : }
1514 :
1515 0 : Invalidate(SID_STYLE_EDIT);
1516 0 : Invalidate(SID_STYLE_NEW);
1517 0 : Invalidate(SID_STYLE_DELETE);
1518 0 : Invalidate(SID_STYLE_HIDE);
1519 0 : Invalidate(SID_STYLE_SHOW);
1520 0 : Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE);
1521 0 : Invalidate(SID_STYLE_NEW_BY_EXAMPLE);
1522 0 : Invalidate(SID_STYLE_WATERCAN);
1523 0 : Invalidate(SID_STYLE_FAMILY5);
1524 :
1525 : // check and distinguish cursor movements- or input-keys
1526 0 : KeyCode aKeyGroup( rKEvt.GetKeyCode().GetGroup() );
1527 0 : if( (aKeyGroup != KEYGROUP_CURSOR && aKeyGroup != KEYGROUP_FKEYS) ||
1528 0 : (GetActualPage() != pLastPage) )
1529 : {
1530 0 : Invalidate( SID_PREVIEW_STATE );
1531 : }
1532 :
1533 0 : return(bReturn);
1534 : }
1535 :
1536 :
1537 : /*************************************************************************
1538 : |*
1539 : |* Return optimal Size
1540 : |*
1541 : \************************************************************************/
1542 :
1543 0 : Size OutlineViewShell::GetOptimalSizePixel() const
1544 : {
1545 0 : Size aResult(200, 200);
1546 0 : if (pOlView)
1547 : {
1548 0 : ::Outliner* pOutliner = pOlView->GetOutliner();
1549 0 : if (pOutliner)
1550 : {
1551 0 : Size aTemp = pOutliner->CalcTextSize();
1552 0 : aTemp = GetActiveWindow()->LogicToPixel(aTemp);
1553 0 : aResult.Width() = Max(aResult.Width(), aTemp.Width());
1554 0 : aResult.Height() = Max(aResult.Height(), aTemp.Height());
1555 0 : if (4 * aResult.Height() > 3 * aResult.Width())
1556 : {
1557 0 : aResult.Height() = 3 * aResult.Width() / 4;
1558 : }
1559 : }
1560 : }
1561 :
1562 : // now add the default stuff
1563 0 : aResult.Width() += mpVerticalScrollBar->GetSizePixel().Width();
1564 0 : aResult.Height() += mpHorizontalScrollBar->GetSizePixel().Height();
1565 0 : return aResult;
1566 : }
1567 :
1568 :
1569 : /*************************************************************************
1570 : |*
1571 : |* Return text of the selection
1572 : |*
1573 : \************************************************************************/
1574 :
1575 0 : String OutlineViewShell::GetSelectionText(sal_Bool bCompleteWords)
1576 : {
1577 0 : String aStrSelection;
1578 0 : ::Outliner* pOl = pOlView->GetOutliner();
1579 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
1580 :
1581 0 : if (pOl && pOlView)
1582 : {
1583 0 : if (bCompleteWords)
1584 : {
1585 0 : ESelection aSel = pOutlinerView->GetSelection();
1586 0 : String aStrCurrentDelimiters = pOl->GetWordDelimiters();
1587 :
1588 0 : pOl->SetWordDelimiters( OUString( " .,;\"'" ) );
1589 0 : aStrSelection = pOl->GetWord( aSel.nEndPara, aSel.nEndPos );
1590 0 : pOl->SetWordDelimiters( aStrCurrentDelimiters );
1591 : }
1592 : else
1593 : {
1594 0 : aStrSelection = pOutlinerView->GetSelected();
1595 : }
1596 : }
1597 :
1598 0 : return (aStrSelection);
1599 : }
1600 :
1601 :
1602 : /*************************************************************************
1603 : |*
1604 : |* Is something selected?
1605 : |*
1606 : \************************************************************************/
1607 :
1608 0 : sal_Bool OutlineViewShell::HasSelection(sal_Bool bText) const
1609 : {
1610 0 : sal_Bool bReturn = sal_False;
1611 :
1612 0 : if (bText)
1613 : {
1614 0 : OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
1615 :
1616 0 : if (pOutlinerView && pOutlinerView->GetSelected().Len() != 0)
1617 : {
1618 0 : bReturn = sal_True;
1619 : }
1620 : }
1621 :
1622 0 : return bReturn;
1623 : }
1624 :
1625 :
1626 : /*************************************************************************
1627 : |*
1628 : |* Status of Attribute-Items
1629 : |*
1630 : \************************************************************************/
1631 :
1632 0 : void OutlineViewShell::GetAttrState( SfxItemSet& rSet )
1633 : {
1634 0 : SfxWhichIter aIter( rSet );
1635 0 : sal_uInt16 nWhich = aIter.FirstWhich();
1636 0 : SfxAllItemSet aAllSet( *rSet.GetPool() );
1637 :
1638 0 : while ( nWhich )
1639 : {
1640 0 : sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
1641 0 : ? GetPool().GetSlotId(nWhich)
1642 0 : : nWhich;
1643 :
1644 0 : switch ( nSlotId )
1645 : {
1646 : case SID_STYLE_FAMILY2:
1647 : case SID_STYLE_FAMILY3:
1648 : {
1649 0 : rSet.DisableItem( nWhich );
1650 : }
1651 0 : break;
1652 :
1653 : case SID_STYLE_FAMILY5:
1654 : {
1655 0 : SfxStyleSheet* pStyleSheet = pOlView->GetViewByWindow(GetActiveWindow())->GetStyleSheet();
1656 :
1657 0 : if( pStyleSheet )
1658 : {
1659 0 : pStyleSheet = ((SdStyleSheet*)pStyleSheet)->GetPseudoStyleSheet();
1660 :
1661 0 : if (pStyleSheet)
1662 : {
1663 0 : SfxTemplateItem aItem( nWhich, pStyleSheet->GetName() );
1664 0 : aAllSet.Put( aItem, aItem.Which() );
1665 : }
1666 : }
1667 :
1668 0 : if( !pStyleSheet )
1669 : {
1670 0 : SfxTemplateItem aItem( nWhich, String() );
1671 0 : aAllSet.Put( aItem, aItem.Which() );
1672 : // rSet.DisableItem( nWhich );
1673 : }
1674 : }
1675 0 : break;
1676 :
1677 : case SID_STYLE_EDIT:
1678 : {
1679 0 : ISfxTemplateCommon* pTmplCommon = SFX_APP()->GetCurrentTemplateCommon(GetViewFrame()->GetBindings());
1680 :
1681 0 : if (pTmplCommon && pTmplCommon->GetActualFamily() == SD_STYLE_FAMILY_PSEUDO)
1682 : {
1683 0 : SfxItemSet aSet(*rSet.GetPool(), SID_STATUS_LAYOUT, SID_STATUS_LAYOUT);
1684 0 : GetStatusBarState(aSet);
1685 0 : String aRealStyle(((SfxStringItem&) aSet.Get(SID_STATUS_LAYOUT)).GetValue());
1686 :
1687 0 : if (!aRealStyle.Len())
1688 : {
1689 : // no unique layout name found
1690 0 : rSet.DisableItem(nWhich);
1691 0 : }
1692 : }
1693 : }
1694 0 : break;
1695 :
1696 : case SID_STYLE_UPDATE_BY_EXAMPLE:
1697 : {
1698 0 : ::sd::Window* pActWin = GetActiveWindow();
1699 0 : OutlinerView* pOV = pOlView->GetViewByWindow(pActWin);
1700 0 : ESelection aESel(pOV->GetSelection());
1701 :
1702 0 : if (aESel.nStartPara != aESel.nEndPara ||
1703 : aESel.nStartPos != aESel.nEndPos)
1704 : // spanned selection, i.e. StyleSheet and/or
1705 : // attribution not necessarily unqiue
1706 0 : rSet.DisableItem(nWhich);
1707 : }
1708 0 : break;
1709 :
1710 : case SID_STYLE_NEW:
1711 : case SID_STYLE_DELETE:
1712 : case SID_STYLE_HIDE:
1713 : case SID_STYLE_SHOW:
1714 : case SID_STYLE_NEW_BY_EXAMPLE:
1715 : case SID_STYLE_WATERCAN:
1716 : {
1717 0 : rSet.DisableItem(nWhich);
1718 : }
1719 0 : break;
1720 : }
1721 :
1722 0 : nWhich = aIter.NextWhich();
1723 : }
1724 :
1725 0 : rSet.Put( aAllSet, sal_False );
1726 0 : }
1727 :
1728 :
1729 :
1730 : /*************************************************************************
1731 : |*
1732 : |* MouseButtonUp event
1733 : |*
1734 : \************************************************************************/
1735 :
1736 0 : void OutlineViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin)
1737 : {
1738 : // first the base classes
1739 0 : ViewShell::MouseButtonUp(rMEvt, pWin);
1740 :
1741 0 : Invalidate(SID_STYLE_EDIT);
1742 0 : Invalidate(SID_STYLE_NEW);
1743 0 : Invalidate(SID_STYLE_DELETE);
1744 0 : Invalidate(SID_STYLE_HIDE);
1745 0 : Invalidate(SID_STYLE_SHOW);
1746 0 : Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE);
1747 0 : Invalidate(SID_STYLE_NEW_BY_EXAMPLE);
1748 0 : Invalidate(SID_STYLE_WATERCAN);
1749 0 : Invalidate(SID_STYLE_FAMILY5);
1750 :
1751 : // if necessary communicate the new context to the Preview
1752 0 : if( GetActualPage() != pLastPage )
1753 0 : Invalidate( SID_PREVIEW_STATE );
1754 0 : }
1755 :
1756 :
1757 :
1758 0 : SdPage* OutlineViewShell::getCurrentPage() const
1759 : {
1760 : // since there are no master pages in outline view, we can
1761 : // for now use the GetActualPage method
1762 0 : return const_cast<OutlineViewShell*>(this)->GetActualPage();
1763 : }
1764 :
1765 : /*************************************************************************
1766 : |*
1767 : |* Returns the first selected page.
1768 : |* If nothing is selected, the first page is returned.
1769 : |*
1770 : \************************************************************************/
1771 0 : SdPage* OutlineViewShell::GetActualPage()
1772 : {
1773 0 : return pOlView->GetActualPage();
1774 : }
1775 :
1776 0 : void OutlineViewShell::UpdatePreview( SdPage* pPage, sal_Bool )
1777 : {
1778 0 : const bool bNewPage = pPage != pLastPage;
1779 0 : pLastPage = pPage;
1780 0 : if (bNewPage)
1781 : {
1782 0 : OutlineViewPageChangesGuard aGuard(pOlView);
1783 0 : SetCurrentPage(pPage);
1784 : }
1785 0 : }
1786 :
1787 : /*************************************************************************
1788 : |*
1789 : |* Update Title
1790 : |*
1791 : \************************************************************************/
1792 :
1793 0 : bool OutlineViewShell::UpdateTitleObject( SdPage* pPage, Paragraph* pPara )
1794 : {
1795 : DBG_ASSERT( pPage, "sd::OutlineViewShell::UpdateTitleObject(), pPage == 0?" );
1796 : DBG_ASSERT( pPara, "sd::OutlineViewShell::UpdateTitleObject(), pPara == 0?" );
1797 :
1798 0 : if( !pPage || !pPara )
1799 0 : return false;
1800 :
1801 0 : ::Outliner* pOutliner = pOlView->GetOutliner();
1802 0 : SdrTextObj* pTO = pOlView->GetTitleTextObject( pPage );
1803 0 : OutlinerParaObject* pOPO = NULL;
1804 :
1805 0 : String aTest( pOutliner->GetText( pPara ) );
1806 0 : bool bText = aTest.Len() > 0;
1807 0 : bool bNewObject = false;
1808 :
1809 0 : if( bText )
1810 : {
1811 : // create a title object if we don't have one but have text
1812 0 : if( !pTO )
1813 : {
1814 : DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
1815 0 : pTO = pOlView->CreateTitleTextObject(pPage);
1816 0 : bNewObject = sal_True;
1817 : }
1818 :
1819 : // if we have a title object and a text, set the text
1820 0 : if( pTO )
1821 : {
1822 0 : pOPO = pOutliner->CreateParaObject( (sal_uInt16) pOutliner->GetAbsPos( pPara ), 1 );
1823 0 : pOPO->SetOutlinerMode( OUTLINERMODE_TITLEOBJECT );
1824 0 : pOPO->SetVertical( pTO->IsVerticalWriting() );
1825 0 : if( pTO->GetOutlinerParaObject() && (pOPO->GetTextObject() == pTO->GetOutlinerParaObject()->GetTextObject()) )
1826 : {
1827 : // do nothing, same text already set
1828 0 : delete pOPO;
1829 : }
1830 : else
1831 : {
1832 : DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
1833 0 : if( !bNewObject && pOlView->isRecordingUndo() )
1834 0 : pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
1835 :
1836 0 : pTO->SetOutlinerParaObject( pOPO );
1837 0 : pTO->SetEmptyPresObj( sal_False );
1838 0 : pTO->ActionChanged();
1839 : }
1840 : }
1841 : }
1842 0 : else if( pTO )
1843 : {
1844 : // no text but object available?
1845 : // outline object available, but we have no text
1846 0 : if(pPage->IsPresObj(pTO))
1847 : {
1848 : // if it is not already empty
1849 0 : if( !pTO->IsEmptyPresObj() )
1850 : {
1851 : DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
1852 :
1853 : // make it empty
1854 0 : if( pOlView->isRecordingUndo() )
1855 0 : pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
1856 0 : pPage->RestoreDefaultText( pTO );
1857 0 : pTO->SetEmptyPresObj(sal_True);
1858 0 : pTO->ActionChanged();
1859 : }
1860 : }
1861 : else
1862 : {
1863 : DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
1864 : // outline object is not part of the layout, delete it
1865 0 : if( pOlView->isRecordingUndo() )
1866 0 : pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoRemoveObject(*pTO));
1867 0 : pPage->RemoveObject(pTO->GetOrdNum());
1868 : }
1869 : }
1870 :
1871 0 : return bNewObject;
1872 : }
1873 :
1874 : /*************************************************************************
1875 : |*
1876 : |* Update LayoutObject
1877 : |*
1878 : \************************************************************************/
1879 :
1880 0 : bool OutlineViewShell::UpdateOutlineObject( SdPage* pPage, Paragraph* pPara )
1881 : {
1882 : DBG_ASSERT( pPage, "sd::OutlineViewShell::UpdateOutlineObject(), pPage == 0?" );
1883 : DBG_ASSERT( pPara, "sd::OutlineViewShell::UpdateOutlineObject(), pPara == 0?" );
1884 :
1885 0 : if( !pPage || !pPara )
1886 0 : return false;
1887 :
1888 0 : ::Outliner* pOutliner = pOlView->GetOutliner();
1889 0 : OutlinerParaObject* pOPO = NULL;
1890 0 : SdrTextObj* pTO = NULL;
1891 :
1892 0 : sal_Bool bNewObject = sal_False;
1893 :
1894 0 : sal_uInt16 eOutlinerMode = OUTLINERMODE_TITLEOBJECT;
1895 0 : pTO = (SdrTextObj*)pPage->GetPresObj( PRESOBJ_TEXT );
1896 0 : if( !pTO )
1897 : {
1898 0 : eOutlinerMode = OUTLINERMODE_OUTLINEOBJECT;
1899 0 : pTO = pOlView->GetOutlineTextObject( pPage );
1900 : }
1901 :
1902 : // how many paragraphs in the outline?
1903 0 : sal_uLong nTitlePara = pOutliner->GetAbsPos( pPara );
1904 0 : sal_uLong nPara = nTitlePara + 1;
1905 0 : sal_uLong nParasInLayout = 0L;
1906 0 : pPara = pOutliner->GetParagraph( nPara );
1907 0 : while( pPara && !pOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) )
1908 : {
1909 0 : nParasInLayout++;
1910 0 : pPara = pOutliner->GetParagraph( ++nPara );
1911 : }
1912 0 : if( nParasInLayout )
1913 : {
1914 : // create an OutlinerParaObject
1915 0 : pPara = pOutliner->GetParagraph( nTitlePara + 1 );
1916 0 : pOPO = pOutliner->CreateParaObject( (sal_uInt16) nTitlePara + 1, (sal_uInt16) nParasInLayout );
1917 : }
1918 :
1919 0 : if( pOPO )
1920 : {
1921 : DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
1922 :
1923 : // do we need an outline text object?
1924 0 : if( !pTO )
1925 : {
1926 0 : pTO = pOlView->CreateOutlineTextObject( pPage );
1927 0 : bNewObject = sal_True;
1928 : }
1929 :
1930 : // page object, outline text in Outliner:
1931 : // apply text
1932 0 : if( pTO )
1933 : {
1934 0 : pOPO->SetVertical( pTO->IsVerticalWriting() );
1935 0 : pOPO->SetOutlinerMode( eOutlinerMode );
1936 0 : if( pTO->GetOutlinerParaObject() && (pOPO->GetTextObject() == pTO->GetOutlinerParaObject()->GetTextObject()) )
1937 : {
1938 : // do nothing, same text already set
1939 0 : delete pOPO;
1940 : }
1941 : else
1942 : {
1943 0 : if( !bNewObject && pOlView->isRecordingUndo() )
1944 0 : pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
1945 :
1946 0 : pTO->SetOutlinerParaObject( pOPO );
1947 0 : pTO->SetEmptyPresObj( sal_False );
1948 0 : pTO->ActionChanged();
1949 : }
1950 : }
1951 : }
1952 0 : else if( pTO )
1953 : {
1954 : // page object but no outline text:
1955 : // if the object is in the outline of the page -> default text
1956 :
1957 : // otherwise delete object
1958 0 : if( pPage->IsPresObj(pTO) )
1959 : {
1960 0 : if( !pTO->IsEmptyPresObj() )
1961 : {
1962 : DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
1963 :
1964 : // delete old OutlinerParaObject, too
1965 0 : if( pOlView->isRecordingUndo() )
1966 0 : pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
1967 0 : pPage->RestoreDefaultText( pTO );
1968 0 : pTO->SetEmptyPresObj(sal_True);
1969 0 : pTO->ActionChanged();
1970 : }
1971 : }
1972 : else
1973 : {
1974 : DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
1975 0 : if( pOlView->isRecordingUndo() )
1976 0 : pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoRemoveObject(*pTO));
1977 0 : pPage->RemoveObject(pTO->GetOrdNum());
1978 : }
1979 : }
1980 :
1981 0 : return bNewObject;
1982 : }
1983 :
1984 :
1985 : /*************************************************************************
1986 : |*
1987 : |* Fill Outliner from Stream
1988 : |*
1989 : \************************************************************************/
1990 :
1991 0 : sal_uLong OutlineViewShell::Read(SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat)
1992 : {
1993 0 : sal_uLong bRet = 0;
1994 :
1995 0 : ::Outliner* pOutl = pOlView->GetOutliner();
1996 :
1997 : {
1998 0 : OutlineViewPageChangesGuard aGuard( pOlView );
1999 0 : OutlineViewModelChangeGuard aGuard2( *pOlView );
2000 :
2001 0 : bRet = pOutl->Read( rInput, rBaseURL, eFormat, GetDocSh()->GetHeaderAttributes() );
2002 :
2003 0 : SdPage* pPage = GetDoc()->GetSdPage( GetDoc()->GetSdPageCount(PK_STANDARD) - 1, PK_STANDARD );;
2004 0 : SfxStyleSheet* pTitleSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE );
2005 0 : SfxStyleSheet* pOutlSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE );
2006 :
2007 0 : sal_uInt16 nParaCount = (sal_uInt16)pOutl->GetParagraphCount();
2008 0 : if ( nParaCount > 0 )
2009 : {
2010 0 : for ( sal_uInt16 nPara = 0; nPara < nParaCount; nPara++ )
2011 : {
2012 0 : pOlView->UpdateParagraph( nPara );
2013 :
2014 0 : sal_Int16 nDepth = pOutl->GetDepth( nPara );
2015 :
2016 0 : if( (nDepth == 0) || !nPara )
2017 : {
2018 0 : Paragraph* pPara = pOutl->GetParagraph( nPara );
2019 0 : pOutl->SetDepth(pPara, -1);
2020 0 : pOutl->SetParaFlag(pPara, PARAFLAG_ISPAGE);
2021 :
2022 0 : pOutl->SetStyleSheet( nPara, pTitleSheet );
2023 :
2024 0 : if( nPara ) // first slide already exists
2025 0 : pOlView->InsertSlideForParagraph( pPara );
2026 : }
2027 : else
2028 : {
2029 0 : pOutl->SetDepth( pOutl->GetParagraph( nPara ), nDepth - 1 );
2030 0 : String aStyleSheetName( pOutlSheet->GetName() );
2031 0 : aStyleSheetName.Erase( aStyleSheetName.Len() - 1, 1 );
2032 0 : aStyleSheetName += String::CreateFromInt32( nDepth );
2033 0 : SfxStyleSheetBasePool* pStylePool = GetDoc()->GetStyleSheetPool();
2034 0 : SfxStyleSheet* pStyle = (SfxStyleSheet*) pStylePool->Find( aStyleSheetName, pOutlSheet->GetFamily() );
2035 : DBG_ASSERT( pStyle, "AutoStyleSheetName - Style not found!" );
2036 0 : if ( pStyle )
2037 0 : pOutl->SetStyleSheet( nPara, pStyle );
2038 : }
2039 : }
2040 0 : }
2041 : }
2042 :
2043 0 : pOutl->GetUndoManager().Clear();
2044 :
2045 0 : return( bRet );
2046 : }
2047 :
2048 0 : void OutlineViewShell::WriteUserDataSequence ( ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& rSequence, sal_Bool bBrowse )
2049 : {
2050 0 : WriteFrameViewData();
2051 :
2052 0 : ViewShell::WriteUserDataSequence( rSequence, bBrowse );
2053 0 : }
2054 :
2055 0 : void OutlineViewShell::ReadUserDataSequence ( const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& rSequence, sal_Bool bBrowse )
2056 : {
2057 0 : WriteFrameViewData();
2058 :
2059 0 : ViewShell::ReadUserDataSequence( rSequence, bBrowse );
2060 :
2061 0 : ReadFrameViewData( mpFrameView );
2062 0 : }
2063 :
2064 0 : void OutlineViewShell::VisAreaChanged(const Rectangle& rRect)
2065 : {
2066 0 : ViewShell::VisAreaChanged( rRect );
2067 :
2068 0 : GetViewShellBase().GetDrawController().FireVisAreaChanged(rRect);
2069 0 : }
2070 :
2071 : /** If there is a valid controller then create a new instance of
2072 : <type>AccessibleDrawDocumentView</type>. Otherwise return an empty
2073 : reference.
2074 : */
2075 : ::com::sun::star::uno::Reference<
2076 : ::com::sun::star::accessibility::XAccessible>
2077 0 : OutlineViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow)
2078 : {
2079 : OSL_ASSERT (GetViewShell()!=NULL);
2080 0 : if (GetViewShell()->GetController() != NULL)
2081 : {
2082 : ::accessibility::AccessibleOutlineView* pDocumentView =
2083 : new ::accessibility::AccessibleOutlineView (
2084 : pWindow,
2085 : this,
2086 : GetViewShell()->GetController(),
2087 0 : pWindow->GetAccessibleParentWindow()->GetAccessible());
2088 0 : pDocumentView->Init();
2089 : return ::com::sun::star::uno::Reference<
2090 : ::com::sun::star::accessibility::XAccessible>
2091 : (static_cast< ::com::sun::star::uno::XWeak*>(pDocumentView),
2092 0 : ::com::sun::star::uno::UNO_QUERY);
2093 : }
2094 :
2095 : OSL_TRACE ("OutlineViewShell::CreateAccessibleDocumentView: no controller");
2096 0 : return ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >();
2097 : }
2098 :
2099 :
2100 :
2101 :
2102 0 : void OutlineViewShell::GetState (SfxItemSet& rSet)
2103 : {
2104 : // Iterate over all requested items in the set.
2105 0 : SfxWhichIter aIter( rSet );
2106 0 : sal_uInt16 nWhich = aIter.FirstWhich();
2107 0 : while (nWhich)
2108 : {
2109 0 : switch (nWhich)
2110 : {
2111 : case SID_SEARCH_ITEM:
2112 : case SID_SEARCH_OPTIONS:
2113 : // Call common (old) implementation in the document shell.
2114 0 : GetDocSh()->GetState (rSet);
2115 0 : break;
2116 : default:
2117 : OSL_TRACE ("OutlineViewShell::GetState(): can not handle which id %d", nWhich);
2118 0 : break;
2119 : }
2120 0 : nWhich = aIter.NextWhich();
2121 0 : }
2122 0 : }
2123 :
2124 :
2125 :
2126 :
2127 0 : void OutlineViewShell::SetCurrentPage (SdPage* pPage)
2128 : {
2129 : // Adapt the selection of the model.
2130 0 : for (sal_uInt16 i=0; i<GetDoc()->GetSdPageCount(PK_STANDARD); i++)
2131 : GetDoc()->SetSelected(
2132 : GetDoc()->GetSdPage(i, PK_STANDARD),
2133 0 : sal_False);
2134 0 : GetDoc()->SetSelected (pPage, sal_True);
2135 :
2136 0 : DrawController& rController(GetViewShellBase().GetDrawController());
2137 0 : rController.FireSelectionChangeListener();
2138 0 : rController.FireSwitchCurrentPage (pPage);
2139 :
2140 0 : pOlView->SetActualPage(pPage);
2141 0 : }
2142 :
2143 :
2144 9 : } // end of namespace sd
2145 :
2146 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|