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