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