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 "scitems.hxx"
21 : #include <editeng/eeitem.hxx>
22 :
23 : #include <svx/fmshell.hxx>
24 : #include <svx/svdobj.hxx>
25 : #include <svx/svdoutl.hxx>
26 : #include <sfx2/bindings.hxx>
27 : #include <sfx2/dispatch.hxx>
28 : #include <sfx2/objsh.hxx>
29 :
30 : #include "tabview.hxx"
31 : #include "tabvwsh.hxx"
32 : #include "document.hxx"
33 : #include "gridwin.hxx"
34 : #include "olinewin.hxx"
35 : #include "tabsplit.hxx"
36 : #include "colrowba.hxx"
37 : #include "tabcont.hxx"
38 : #include "hintwin.hxx"
39 : #include "sc.hrc"
40 : #include "pagedata.hxx"
41 : #include "hiranges.hxx"
42 : #include "drawview.hxx"
43 : #include "drwlayer.hxx"
44 : #include "fusel.hxx"
45 : #include "seltrans.hxx"
46 : #include "scmod.hxx"
47 : #include "AccessibilityHints.hxx"
48 : #include "docsh.hxx"
49 : #include "viewuno.hxx"
50 :
51 : #include <vcl/svapp.hxx>
52 : #include <vcl/settings.hxx>
53 :
54 : #include <officecfg/Office/Calc.hxx>
55 :
56 : using namespace com::sun::star;
57 :
58 : // STATIC DATA -----------------------------------------------------------
59 :
60 348 : void ScTabView::Init()
61 : {
62 : /* RTL layout of the view windows is done manually, because it depends on
63 : the sheet orientation, not the UI setting. Note: controls that are
64 : already constructed (e.g. scroll bars) have the RTL setting of the GUI.
65 : Eventually this has to be disabled manually (see below). */
66 348 : pFrameWin->EnableRTL( false );
67 :
68 : sal_uInt16 i;
69 :
70 348 : mbInlineWithScrollbar = officecfg::Office::Calc::Layout::Other::TabbarInlineWithScrollbar::get();
71 :
72 348 : aScrollTimer.SetTimeout(10);
73 348 : aScrollTimer.SetTimeoutHdl( LINK( this, ScTabView, TimerHdl ) );
74 :
75 1740 : for (i=0; i<4; i++)
76 1392 : pGridWin[i] = NULL;
77 348 : pGridWin[SC_SPLIT_BOTTOMLEFT] = VclPtr<ScGridWindow>::Create( pFrameWin, &aViewData, SC_SPLIT_BOTTOMLEFT );
78 :
79 : pSelEngine = new ScViewSelectionEngine( pGridWin[SC_SPLIT_BOTTOMLEFT], this,
80 348 : SC_SPLIT_BOTTOMLEFT );
81 348 : aFunctionSet.SetSelectionEngine( pSelEngine );
82 :
83 348 : pHdrSelEng = new ScHeaderSelectionEngine( pFrameWin, &aHdrFunc );
84 :
85 696 : pColBar[SC_SPLIT_LEFT] = VclPtr<ScColBar>::Create( pFrameWin, &aViewData, SC_SPLIT_LEFT,
86 348 : &aHdrFunc, pHdrSelEng );
87 348 : pColBar[SC_SPLIT_RIGHT] = NULL;
88 696 : pRowBar[SC_SPLIT_BOTTOM] = VclPtr<ScRowBar>::Create( pFrameWin, &aViewData, SC_SPLIT_BOTTOM,
89 348 : &aHdrFunc, pHdrSelEng );
90 348 : pRowBar[SC_SPLIT_TOP] = NULL;
91 1044 : for (i=0; i<2; i++)
92 696 : pColOutline[i] = pRowOutline[i] = NULL;
93 :
94 348 : pHSplitter = VclPtr<ScTabSplitter>::Create( pFrameWin, WinBits( WB_HSCROLL ), &aViewData );
95 348 : pVSplitter = VclPtr<ScTabSplitter>::Create( pFrameWin, WinBits( WB_VSCROLL ), &aViewData );
96 :
97 : // SSA: override default keyboard step size to allow snap to row/column
98 348 : pHSplitter->SetKeyboardStepSize( 1 );
99 348 : pVSplitter->SetKeyboardStepSize( 1 );
100 :
101 348 : pTabControl = VclPtr<ScTabControl>::Create(pFrameWin, &aViewData);
102 348 : if (mbInlineWithScrollbar)
103 0 : pTabControl->SetStyle(pTabControl->GetStyle() | WB_SIZEABLE);
104 :
105 : /* #i97900# The tab control has to remain in RTL mode if GUI is RTL, this
106 : is needed to draw the 3D effect correctly. The base TabBar implementes
107 : mirroring independent from the GUI direction. Have to set RTL mode
108 : explicitly because the parent frame window is already RTL disabled. */
109 348 : pTabControl->EnableRTL( AllSettings::GetLayoutRTL() );
110 :
111 348 : InitScrollBar( *aHScrollLeft.get(), MAXCOL+1 );
112 348 : InitScrollBar( *aHScrollRight.get(), MAXCOL+1 );
113 348 : InitScrollBar( *aVScrollTop.get(), MAXROW+1 );
114 348 : InitScrollBar( *aVScrollBottom.get(), MAXROW+1 );
115 : /* #i97900# scrollbars remain in correct RTL mode, needed mirroring etc.
116 : is now handled correctly at the respective places. */
117 :
118 : // Hier noch nichts anzeigen (Show), weil noch falsch angeordnet ist
119 : // Show kommt dann aus UpdateShow beim ersten Resize
120 : // pTabControl, pGridWin, aHScrollLeft, aVScrollBottom,
121 : // aCornerButton, aScrollBarBox, pHSplitter, pVSplitter
122 :
123 : // Splitter
124 :
125 348 : pHSplitter->SetSplitHdl( LINK( this, ScTabView, SplitHdl ) );
126 348 : pVSplitter->SetSplitHdl( LINK( this, ScTabView, SplitHdl ) );
127 :
128 : // UpdateShow kommt beim Resize, oder bei Kopie einer bestehenden View aus dem ctor
129 :
130 348 : pDrawActual = NULL;
131 348 : pDrawOld = NULL;
132 :
133 : // DrawView darf nicht im TabView - ctor angelegt werden,
134 : // wenn die ViewShell noch nicht konstruiert ist...
135 : // Das gilt auch fuer ViewOptionsHasChanged()
136 :
137 348 : TestHintWindow();
138 348 : }
139 :
140 690 : ScTabView::~ScTabView()
141 : {
142 : sal_uInt16 i;
143 :
144 : // remove selection object
145 345 : ScModule* pScMod = SC_MOD();
146 345 : ScSelectionTransferObj* pOld = pScMod->GetSelectionTransfer();
147 345 : if ( pOld && pOld->GetView() == this )
148 : {
149 1 : pOld->ForgetView();
150 1 : pScMod->SetSelectionTransfer( NULL );
151 1 : TransferableHelper::ClearSelection( GetActiveWin() ); // may delete pOld
152 : }
153 :
154 345 : DELETEZ(pBrushDocument);
155 345 : DELETEZ(pDrawBrushSet);
156 :
157 345 : DELETEZ(pPageBreakData);
158 :
159 345 : DELETEZ(pDrawOld);
160 345 : DELETEZ(pDrawActual);
161 :
162 345 : aViewData.KillEditView(); // solange GridWin's noch existieren
163 :
164 345 : if (pDrawView)
165 : {
166 1725 : for (i=0; i<4; i++)
167 1380 : if (pGridWin[i])
168 : {
169 348 : pDrawView->DeleteWindowFromPaintView(pGridWin[i]);
170 : }
171 :
172 345 : pDrawView->HideSdrPage();
173 345 : delete pDrawView;
174 : }
175 :
176 345 : delete pSelEngine;
177 :
178 : // Delete this before the grid windows, since it's a child window of one of them.
179 345 : mpInputHintWindow.disposeAndClear();
180 1725 : for (i=0; i<4; i++)
181 1380 : pGridWin[i].disposeAndClear();
182 :
183 345 : delete pHdrSelEng;
184 :
185 1035 : for (i=0; i<2; i++)
186 : {
187 690 : pColBar[i].disposeAndClear();
188 690 : pRowBar[i].disposeAndClear();
189 690 : pColOutline[i].disposeAndClear();
190 690 : pRowOutline[i].disposeAndClear();
191 : }
192 :
193 345 : aScrollBarBox.disposeAndClear();
194 345 : aCornerButton.disposeAndClear();
195 345 : aTopButton.disposeAndClear();
196 345 : aHScrollLeft.disposeAndClear();
197 345 : aHScrollRight.disposeAndClear();
198 345 : aVScrollTop.disposeAndClear();
199 345 : aVScrollBottom.disposeAndClear();
200 :
201 345 : pHSplitter.disposeAndClear();
202 345 : pVSplitter.disposeAndClear();
203 345 : pTabControl.disposeAndClear();
204 345 : }
205 :
206 348 : void ScTabView::MakeDrawView( TriState nForceDesignMode )
207 : {
208 348 : if (!pDrawView)
209 : {
210 348 : ScDrawLayer* pLayer = aViewData.GetDocument()->GetDrawLayer();
211 : OSL_ENSURE(pLayer, "wo ist der Draw Layer ??");
212 :
213 : sal_uInt16 i;
214 348 : pDrawView = new ScDrawView( pGridWin[SC_SPLIT_BOTTOMLEFT], &aViewData );
215 1740 : for (i=0; i<4; i++)
216 1392 : if (pGridWin[i])
217 : {
218 348 : if ( SC_SPLIT_BOTTOMLEFT != (ScSplitPos)i )
219 0 : pDrawView->AddWindowToPaintView(pGridWin[i]);
220 : }
221 348 : pDrawView->RecalcScale();
222 1740 : for (i=0; i<4; i++)
223 1392 : if (pGridWin[i])
224 : {
225 348 : pGridWin[i]->SetMapMode(pGridWin[i]->GetDrawMapMode());
226 :
227 348 : pGridWin[i]->Update(); // wegen Invalidate im DrawView ctor (ShowPage),
228 : // damit gleich gezeichnet werden kann
229 : }
230 348 : SfxRequest aSfxRequest(SID_OBJECT_SELECT, SfxCallMode::SLOT, aViewData.GetViewShell()->GetPool());
231 348 : SetDrawFuncPtr(new FuSelection( aViewData.GetViewShell(), GetActiveWin(), pDrawView,
232 348 : pLayer,aSfxRequest));
233 :
234 : // used when switching back from page preview: restore saved design mode state
235 : // (otherwise, keep the default from the draw view ctor)
236 348 : if ( nForceDesignMode != TRISTATE_INDET )
237 0 : pDrawView->SetDesignMode( nForceDesignMode );
238 :
239 : // an der FormShell anmelden
240 348 : FmFormShell* pFormSh = aViewData.GetViewShell()->GetFormShell();
241 348 : if (pFormSh)
242 348 : pFormSh->SetView(pDrawView);
243 :
244 348 : if (aViewData.GetViewShell()->HasAccessibilityObjects())
245 0 : aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_MAKEDRAWLAYER));
246 :
247 : }
248 348 : }
249 :
250 3 : void ScTabView::DoAddWin( ScGridWindow* pWin )
251 : {
252 3 : if (pDrawView)
253 : {
254 3 : pDrawView->AddWindowToPaintView(pWin);
255 :
256 : // #114409#
257 3 : pWin->DrawLayerCreated();
258 : }
259 3 : }
260 :
261 597 : void ScTabView::TabChanged( bool bSameTabButMoved )
262 : {
263 597 : if (pDrawView)
264 : {
265 597 : DrawDeselectAll(); // beendet auch Text-Edit-Modus
266 :
267 597 : SCTAB nTab = aViewData.GetTabNo();
268 597 : pDrawView->HideSdrPage();
269 597 : pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab));
270 :
271 597 : UpdateLayerLocks();
272 :
273 597 : pDrawView->RecalcScale();
274 597 : pDrawView->UpdateWorkArea(); // PageSize ist pro Page unterschiedlich
275 : }
276 :
277 597 : SfxBindings& rBindings = aViewData.GetBindings();
278 :
279 : // Es gibt keine einfache Moeglichkeit, alle Slots der FormShell zu invalidieren
280 : // (fuer disablete Slots auf geschuetzten Tabellen), darum hier einfach alles...
281 597 : rBindings.InvalidateAll(false);
282 :
283 597 : if (aViewData.GetViewShell()->HasAccessibilityObjects())
284 : {
285 0 : SfxSimpleHint aAccHint(SC_HINT_ACC_TABLECHANGED);
286 0 : aViewData.GetViewShell()->BroadcastAccessibility(aAccHint);
287 : }
288 :
289 : // notification for XActivationBroadcaster
290 597 : SfxViewFrame* pViewFrame = aViewData.GetViewShell()->GetViewFrame();
291 597 : if (pViewFrame)
292 : {
293 597 : uno::Reference<frame::XController> xController = pViewFrame->GetFrame().GetController();
294 597 : if (xController.is())
295 : {
296 597 : ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController );
297 597 : if (pImp)
298 597 : pImp->SheetChanged( bSameTabButMoved );
299 597 : }
300 : }
301 597 : }
302 :
303 629 : void ScTabView::UpdateLayerLocks()
304 : {
305 629 : if (pDrawView)
306 : {
307 629 : SCTAB nTab = aViewData.GetTabNo();
308 629 : bool bEx = aViewData.GetViewShell()->IsDrawSelMode();
309 1258 : bool bProt = aViewData.GetDocument()->IsTabProtected( nTab ) ||
310 1258 : aViewData.GetSfxDocShell()->IsReadOnly();
311 629 : bool bShared = aViewData.GetDocShell()->IsDocShared();
312 :
313 : SdrLayer* pLayer;
314 629 : SdrLayerAdmin& rAdmin = pDrawView->GetModel()->GetLayerAdmin();
315 629 : pLayer = rAdmin.GetLayerPerID(SC_LAYER_BACK);
316 629 : if (pLayer)
317 629 : pDrawView->SetLayerLocked( pLayer->GetName(), bProt || !bEx || bShared );
318 629 : pLayer = rAdmin.GetLayerPerID(SC_LAYER_INTERN);
319 629 : if (pLayer)
320 629 : pDrawView->SetLayerLocked( pLayer->GetName(), true );
321 629 : pLayer = rAdmin.GetLayerPerID(SC_LAYER_FRONT);
322 629 : if (pLayer)
323 629 : pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
324 629 : pLayer = rAdmin.GetLayerPerID(SC_LAYER_CONTROLS);
325 629 : if (pLayer)
326 629 : pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
327 629 : pLayer = rAdmin.GetLayerPerID(SC_LAYER_HIDDEN);
328 629 : if (pLayer)
329 : {
330 629 : pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
331 629 : pDrawView->SetLayerVisible( pLayer->GetName(), false);
332 : }
333 : }
334 629 : }
335 :
336 1194 : void ScTabView::DrawDeselectAll()
337 : {
338 1194 : if (pDrawView)
339 : {
340 1194 : ScTabViewShell* pViewSh = aViewData.GetViewShell();
341 2388 : if ( pDrawActual &&
342 2388 : ( pViewSh->IsDrawTextShell() || pDrawActual->GetSlotID() == SID_DRAW_NOTEEDIT ) )
343 : {
344 : // end text edit (as if escape pressed, in FuDraw)
345 0 : aViewData.GetDispatcher().Execute( pDrawActual->GetSlotID(),
346 0 : SfxCallMode::SLOT | SfxCallMode::RECORD );
347 : }
348 :
349 1194 : pDrawView->ScEndTextEdit();
350 1194 : pDrawView->UnmarkAll();
351 :
352 1194 : if (!pViewSh->IsDrawSelMode())
353 1194 : pViewSh->SetDrawShell( false );
354 : }
355 1194 : }
356 :
357 0 : bool ScTabView::IsDrawTextEdit() const
358 : {
359 0 : if (pDrawView)
360 0 : return pDrawView->IsTextEdit();
361 : else
362 0 : return false;
363 : }
364 :
365 2470 : SvxZoomType ScTabView::GetZoomType() const
366 : {
367 2470 : return aViewData.GetZoomType();
368 : }
369 :
370 348 : void ScTabView::SetZoomType( SvxZoomType eNew, bool bAll )
371 : {
372 348 : aViewData.SetZoomType( eNew, bAll );
373 348 : }
374 :
375 348 : void ScTabView::SetZoom( const Fraction& rNewX, const Fraction& rNewY, bool bAll )
376 : {
377 348 : aViewData.SetZoom( rNewX, rNewY, bAll );
378 348 : if (pDrawView)
379 135 : pDrawView->RecalcScale();
380 348 : ZoomChanged();
381 348 : }
382 :
383 599 : void ScTabView::RefreshZoom()
384 : {
385 599 : aViewData.RefreshZoom();
386 599 : if (pDrawView)
387 599 : pDrawView->RecalcScale();
388 599 : ZoomChanged();
389 599 : }
390 :
391 2 : void ScTabView::SetPagebreakMode( bool bSet )
392 : {
393 2 : aViewData.SetPagebreakMode(bSet);
394 2 : if (pDrawView)
395 2 : pDrawView->RecalcScale();
396 2 : ZoomChanged();
397 2 : }
398 :
399 1407 : void ScTabView::ResetDrawDragMode()
400 : {
401 1407 : if (pDrawView)
402 1407 : pDrawView->SetDragMode( SDRDRAG_MOVE );
403 1407 : }
404 :
405 364 : void ScTabView::ViewOptionsHasChanged( bool bHScrollChanged, bool bGraphicsChanged )
406 : {
407 : // DrawView erzeugen, wenn Gitter angezeigt werden soll
408 364 : if ( !pDrawView && aViewData.GetOptions().GetGridOptions().GetGridVisible() )
409 0 : MakeDrawLayer();
410 :
411 364 : if (pDrawView)
412 151 : pDrawView->UpdateUserViewOptions();
413 :
414 364 : if (bGraphicsChanged)
415 0 : DrawEnableAnim(true); // DrawEnableAnim checks the options state
416 :
417 : // if TabBar is set to visible, make sure its size is not 0
418 364 : bool bGrow = ( aViewData.IsTabMode() && pTabControl->GetSizePixel().Width() <= 0 );
419 :
420 : // if ScrollBar is set to visible, TabBar must make room
421 366 : bool bShrink = ( bHScrollChanged && aViewData.IsTabMode() && aViewData.IsHScrollMode() &&
422 366 : pTabControl->GetSizePixel().Width() > SC_TABBAR_DEFWIDTH );
423 :
424 364 : if ( bGrow || bShrink )
425 : {
426 1 : Size aSize = pTabControl->GetSizePixel();
427 1 : aSize.Width() = SC_TABBAR_DEFWIDTH; // initial size
428 1 : pTabControl->SetSizePixel(aSize); // DoResize is called later...
429 : }
430 364 : }
431 :
432 : // Helper-Funktion gegen das Include des Drawing Layers
433 :
434 0 : void ScTabView::DrawMarkListHasChanged()
435 : {
436 0 : if ( pDrawView )
437 0 : pDrawView->MarkListHasChanged();
438 0 : }
439 :
440 0 : void ScTabView::UpdateAnchorHandles()
441 : {
442 0 : if ( pDrawView )
443 0 : pDrawView->AdjustMarkHdl();
444 0 : }
445 :
446 0 : void ScTabView::UpdateIMap( SdrObject* pObj )
447 : {
448 0 : if ( pDrawView )
449 0 : pDrawView->UpdateIMap( pObj );
450 0 : }
451 :
452 2685 : void ScTabView::DrawEnableAnim(bool bSet)
453 : {
454 : sal_uInt16 i;
455 2685 : if ( pDrawView )
456 : {
457 : // dont start animations if display of graphics is disabled
458 : // graphics are controlled by VOBJ_TYPE_OLE
459 2685 : if ( bSet && aViewData.GetOptions().GetObjMode(VOBJ_TYPE_OLE) == VOBJ_MODE_SHOW )
460 : {
461 2685 : if ( !pDrawView->IsAnimationEnabled() )
462 : {
463 0 : pDrawView->SetAnimationEnabled(true);
464 :
465 : // Animierte GIFs muessen wieder gestartet werden:
466 0 : ScDocument* pDoc = aViewData.GetDocument();
467 0 : for (i=0; i<4; i++)
468 0 : if ( pGridWin[i] && pGridWin[i]->IsVisible() )
469 0 : pDoc->StartAnimations( aViewData.GetTabNo(), pGridWin[i] );
470 : }
471 : }
472 : else
473 : {
474 0 : pDrawView->SetAnimationEnabled(false);
475 : }
476 : }
477 2685 : }
478 :
479 338 : void ScTabView::UpdateDrawTextOutliner()
480 : {
481 338 : if ( pDrawView )
482 : {
483 338 : Outliner* pOL = pDrawView->GetTextEditOutliner();
484 338 : if (pOL)
485 0 : aViewData.UpdateOutlinerFlags( *pOL );
486 : }
487 338 : }
488 :
489 0 : void ScTabView::DigitLanguageChanged()
490 : {
491 0 : LanguageType eNewLang = SC_MOD()->GetOptDigitLanguage();
492 0 : for (sal_uInt16 i=0; i<4; i++)
493 0 : if ( pGridWin[i] )
494 0 : pGridWin[i]->SetDigitLanguage( eNewLang );
495 0 : }
496 :
497 3 : void ScTabView::ScrollToObject( SdrObject* pDrawObj )
498 : {
499 3 : if ( pDrawObj )
500 : {
501 : // #i118524# use the BoundRect, this defines the visible area
502 3 : MakeVisible(pDrawObj->GetCurrentBoundRect());
503 : }
504 3 : }
505 :
506 3 : void ScTabView::MakeVisible( const Rectangle& rHMMRect )
507 : {
508 3 : vcl::Window* pWin = GetActiveWin();
509 3 : Size aWinSize = pWin->GetOutputSizePixel();
510 3 : SCTAB nTab = aViewData.GetTabNo();
511 :
512 3 : Rectangle aRect = pWin->LogicToPixel( rHMMRect );
513 :
514 3 : long nScrollX=0, nScrollY=0; // Pixel
515 :
516 3 : if ( aRect.Right() >= aWinSize.Width() ) // rechts raus
517 : {
518 0 : nScrollX = aRect.Right() - aWinSize.Width() + 1; // rechter Rand sichtbar
519 0 : if ( aRect.Left() < nScrollX )
520 0 : nScrollX = aRect.Left(); // links sichtbar (falls zu gross)
521 : }
522 3 : if ( aRect.Bottom() >= aWinSize.Height() ) // unten raus
523 : {
524 0 : nScrollY = aRect.Bottom() - aWinSize.Height() + 1; // unterer Rand sichtbar
525 0 : if ( aRect.Top() < nScrollY )
526 0 : nScrollY = aRect.Top(); // oben sichtbar (falls zu gross)
527 : }
528 :
529 3 : if ( aRect.Left() < 0 ) // links raus
530 0 : nScrollX = aRect.Left(); // linker Rand sichtbar
531 3 : if ( aRect.Top() < 0 ) // oben raus
532 0 : nScrollY = aRect.Top(); // oberer Rand sichtbar
533 :
534 3 : if (nScrollX || nScrollY)
535 : {
536 0 : ScDocument* pDoc = aViewData.GetDocument();
537 0 : if ( pDoc->IsNegativePage( nTab ) )
538 0 : nScrollX = -nScrollX;
539 :
540 0 : double nPPTX = aViewData.GetPPTX();
541 0 : double nPPTY = aViewData.GetPPTY();
542 0 : ScSplitPos eWhich = aViewData.GetActivePart();
543 0 : SCCOL nPosX = aViewData.GetPosX(WhichH(eWhich));
544 0 : SCROW nPosY = aViewData.GetPosY(WhichV(eWhich));
545 :
546 0 : long nLinesX=0, nLinesY=0; // Spalten/Zeilen - um mindestens nScrollX/Y scrollen
547 :
548 0 : if (nScrollX > 0)
549 0 : while (nScrollX > 0 && nPosX < MAXCOL)
550 : {
551 0 : nScrollX -= (long) ( pDoc->GetColWidth(nPosX, nTab) * nPPTX );
552 0 : ++nPosX;
553 0 : ++nLinesX;
554 : }
555 0 : else if (nScrollX < 0)
556 0 : while (nScrollX < 0 && nPosX > 0)
557 : {
558 0 : --nPosX;
559 0 : nScrollX += (long) ( pDoc->GetColWidth(nPosX, nTab) * nPPTX );
560 0 : --nLinesX;
561 : }
562 :
563 0 : if (nScrollY > 0)
564 0 : while (nScrollY > 0 && nPosY < MAXROW)
565 : {
566 0 : nScrollY -= (long) ( pDoc->GetRowHeight(nPosY, nTab) * nPPTY );
567 0 : ++nPosY;
568 0 : ++nLinesY;
569 : }
570 0 : else if (nScrollY < 0)
571 0 : while (nScrollY < 0 && nPosY > 0)
572 : {
573 0 : --nPosY;
574 0 : nScrollY += (long) ( pDoc->GetRowHeight(nPosY, nTab) * nPPTY );
575 0 : --nLinesY;
576 : }
577 :
578 0 : ScrollLines( nLinesX, nLinesY ); // ausfuehren
579 : }
580 3 : }
581 :
582 0 : void ScTabView::SetBrushDocument( ScDocument* pNew, bool bLock )
583 : {
584 0 : delete pBrushDocument;
585 0 : delete pDrawBrushSet;
586 :
587 0 : pBrushDocument = pNew;
588 0 : pDrawBrushSet = NULL;
589 :
590 0 : bLockPaintBrush = bLock;
591 :
592 0 : aViewData.GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
593 0 : }
594 :
595 0 : void ScTabView::SetDrawBrushSet( SfxItemSet* pNew, bool bLock )
596 : {
597 0 : delete pBrushDocument;
598 0 : delete pDrawBrushSet;
599 :
600 0 : pBrushDocument = NULL;
601 0 : pDrawBrushSet = pNew;
602 :
603 0 : bLockPaintBrush = bLock;
604 :
605 0 : aViewData.GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
606 0 : }
607 :
608 0 : void ScTabView::ResetBrushDocument()
609 : {
610 0 : if ( HasPaintBrush() )
611 : {
612 0 : SetBrushDocument( NULL, false );
613 0 : SetActivePointer( Pointer( PointerStyle::Arrow ) ); // switch pointers also when ended with escape key
614 : }
615 156 : }
616 :
617 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|