1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27
28
29 // INCLUDE ---------------------------------------------------------------
30
31 #include "scitems.hxx"
32 #include <editeng/eeitem.hxx>
33
34
35 #include <svx/fmshell.hxx>
36 #include <svx/svdobj.hxx>
37 #include <svx/svdoutl.hxx>
38 #include <sfx2/bindings.hxx>
39 #include <sfx2/dispatch.hxx>
40 #include <sfx2/objsh.hxx>
41 #include <tools/ref.hxx>
42
43 #include "tabview.hxx"
44 #include "tabvwsh.hxx"
45 #include "document.hxx"
46 #include "gridwin.hxx"
47 #include "olinewin.hxx"
48 #include "tabsplit.hxx"
49 #include "colrowba.hxx"
50 #include "tabcont.hxx"
51 #include "hintwin.hxx"
52 #include "sc.hrc"
53 #include "pagedata.hxx"
54 #include "hiranges.hxx"
55 #include "drawview.hxx"
56 #include "drwlayer.hxx"
57 #include "fusel.hxx" // Start-Function
58 #include "seltrans.hxx"
59 #include "scmod.hxx"
60 #include "AccessibilityHints.hxx"
61 #include "docsh.hxx"
62 #include "viewuno.hxx"
63
64 #include <vcl/svapp.hxx>
65
66 using namespace com::sun::star;
67
68 // STATIC DATA -----------------------------------------------------------
69
70
Init()71 void __EXPORT ScTabView::Init()
72 {
73 /* RTL layout of the view windows is done manually, because it depends on
74 the sheet orientation, not the UI setting. Note: controls that are
75 already constructed (e.g. scroll bars) have the RTL setting of the GUI.
76 Eventually this has to be disabled manually (see below). */
77 pFrameWin->EnableRTL( sal_False );
78
79 sal_uInt16 i;
80
81 aScrollTimer.SetTimeout(10);
82 aScrollTimer.SetTimeoutHdl( LINK( this, ScTabView, TimerHdl ) );
83
84 for (i=0; i<4; i++)
85 pGridWin[i] = NULL;
86 pGridWin[SC_SPLIT_BOTTOMLEFT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_BOTTOMLEFT );
87
88 pSelEngine = new ScViewSelectionEngine( pGridWin[SC_SPLIT_BOTTOMLEFT], this,
89 SC_SPLIT_BOTTOMLEFT );
90 aFunctionSet.SetSelectionEngine( pSelEngine );
91
92 pHdrSelEng = new ScHeaderSelectionEngine( pFrameWin, &aHdrFunc );
93
94 pColBar[SC_SPLIT_LEFT] = new ScColBar( pFrameWin, &aViewData, SC_SPLIT_LEFT,
95 &aHdrFunc, pHdrSelEng );
96 pColBar[SC_SPLIT_RIGHT] = NULL;
97 pRowBar[SC_SPLIT_BOTTOM] = new ScRowBar( pFrameWin, &aViewData, SC_SPLIT_BOTTOM,
98 &aHdrFunc, pHdrSelEng );
99 pRowBar[SC_SPLIT_TOP] = NULL;
100 for (i=0; i<2; i++)
101 pColOutline[i] = pRowOutline[i] = NULL;
102
103 pHSplitter = new ScTabSplitter( pFrameWin, WinBits( WB_HSCROLL ), &aViewData );
104 pVSplitter = new ScTabSplitter( pFrameWin, WinBits( WB_VSCROLL ), &aViewData );
105
106 // SSA: override default keyboard step size to allow snap to row/column
107 pHSplitter->SetKeyboardStepSize( 1 );
108 pVSplitter->SetKeyboardStepSize( 1 );
109
110 pTabControl = new ScTabControl( pFrameWin, &aViewData );
111 /* #i97900# The tab control has to remain in RTL mode if GUI is RTL, this
112 is needed to draw the 3D effect correctly. The base TabBar implementes
113 mirroring independent from the GUI direction. Have to set RTL mode
114 explicitly because the parent frame window is already RTL disabled. */
115 pTabControl->EnableRTL( Application::GetSettings().GetLayoutRTL() );
116
117 InitScrollBar( aHScrollLeft, MAXCOL+1 );
118 InitScrollBar( aHScrollRight, MAXCOL+1 );
119 InitScrollBar( aVScrollTop, MAXROW+1 );
120 InitScrollBar( aVScrollBottom, MAXROW+1 );
121 /* #i97900# scrollbars remain in correct RTL mode, needed mirroring etc.
122 is now handled correctly at the respective places. */
123
124 // Hier noch nichts anzeigen (Show), weil noch falsch angeordnet ist
125 // Show kommt dann aus UpdateShow beim ersten Resize
126 // pTabControl, pGridWin, aHScrollLeft, aVScrollBottom,
127 // aCornerButton, aScrollBarBox, pHSplitter, pVSplitter
128
129 // Splitter
130
131 pHSplitter->SetSplitHdl( LINK( this, ScTabView, SplitHdl ) );
132 pVSplitter->SetSplitHdl( LINK( this, ScTabView, SplitHdl ) );
133
134 // UpdateShow kommt beim Resize, oder bei Kopie einer bestehenden View aus dem ctor
135
136 pDrawActual = NULL;
137 pDrawOld = NULL;
138
139 // DrawView darf nicht im TabView - ctor angelegt werden,
140 // wenn die ViewShell noch nicht konstruiert ist...
141 // Das gilt auch fuer ViewOptionsHasChanged()
142
143 TestHintWindow();
144 }
145
~ScTabView()146 __EXPORT ScTabView::~ScTabView()
147 {
148 sal_uInt16 i;
149
150 // remove selection object
151 ScModule* pScMod = SC_MOD();
152 ScSelectionTransferObj* pOld = pScMod->GetSelectionTransfer();
153 if ( pOld && pOld->GetView() == this )
154 {
155 pOld->ForgetView();
156 pScMod->SetSelectionTransfer( NULL );
157 TransferableHelper::ClearSelection( GetActiveWin() ); // may delete pOld
158 }
159
160 DELETEZ(pBrushDocument);
161 DELETEZ(pDrawBrushSet);
162
163 DELETEZ(pPageBreakData);
164 DELETEZ(pHighlightRanges);
165
166 DELETEZ(pDrawOld);
167 DELETEZ(pDrawActual);
168
169 aViewData.KillEditView(); // solange GridWin's noch existieren
170
171 DELETEZ(pInputHintWindow);
172
173 if (pDrawView)
174 {
175 for (i=0; i<4; i++)
176 if (pGridWin[i])
177 {
178 pDrawView->VCRemoveWin(pGridWin[i]);
179 pDrawView->DeleteWindowFromPaintView(pGridWin[i]);
180 }
181
182 pDrawView->HideSdrPage();
183 delete pDrawView;
184 }
185
186 delete pSelEngine;
187
188 for (i=0; i<4; i++)
189 delete pGridWin[i];
190
191 delete pHdrSelEng;
192
193 for (i=0; i<2; i++)
194 {
195 delete pColBar[i];
196 delete pRowBar[i];
197 delete pColOutline[i];
198 delete pRowOutline[i];
199 }
200
201 delete pHSplitter;
202 delete pVSplitter;
203
204 delete pTabControl;
205 }
206
MakeDrawView(sal_uInt8 nForceDesignMode)207 void ScTabView::MakeDrawView( sal_uInt8 nForceDesignMode )
208 {
209 if (!pDrawView)
210 {
211 ScDrawLayer* pLayer = aViewData.GetDocument()->GetDrawLayer();
212 DBG_ASSERT(pLayer, "wo ist der Draw Layer ??");
213
214 sal_uInt16 i;
215 pDrawView = new ScDrawView( pGridWin[SC_SPLIT_BOTTOMLEFT], &aViewData );
216 for (i=0; i<4; i++)
217 if (pGridWin[i])
218 {
219 if ( SC_SPLIT_BOTTOMLEFT != (ScSplitPos)i )
220 pDrawView->AddWindowToPaintView(pGridWin[i]);
221 pDrawView->VCAddWin(pGridWin[i]);
222 }
223 pDrawView->RecalcScale();
224 for (i=0; i<4; i++)
225 if (pGridWin[i])
226 {
227 pGridWin[i]->SetMapMode(pGridWin[i]->GetDrawMapMode());
228
229 pGridWin[i]->Update(); // wegen Invalidate im DrawView ctor (ShowPage),
230 // damit gleich gezeichnet werden kann
231 }
232 SfxRequest aSfxRequest(SID_OBJECT_SELECT, 0,aViewData.GetViewShell()->GetPool());
233 SetDrawFuncPtr(new FuSelection( aViewData.GetViewShell(), GetActiveWin(), pDrawView,
234 pLayer,aSfxRequest));
235
236 // #106334# used when switching back from page preview: restore saved design mode state
237 // (otherwise, keep the default from the draw view ctor)
238 if ( nForceDesignMode != SC_FORCEMODE_NONE )
239 pDrawView->SetDesignMode( (sal_Bool)nForceDesignMode );
240
241 // an der FormShell anmelden
242 FmFormShell* pFormSh = aViewData.GetViewShell()->GetFormShell();
243 if (pFormSh)
244 pFormSh->SetView(pDrawView);
245
246 if (aViewData.GetViewShell()->HasAccessibilityObjects())
247 aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_MAKEDRAWLAYER));
248
249 }
250 }
251
DoAddWin(ScGridWindow * pWin)252 void ScTabView::DoAddWin( ScGridWindow* pWin )
253 {
254 if (pDrawView)
255 {
256 pDrawView->AddWindowToPaintView(pWin);
257 pDrawView->VCAddWin(pWin);
258
259 // #114409#
260 pWin->DrawLayerCreated();
261 }
262 }
263
264 //==================================================================
265
TabChanged(bool bSameTabButMoved)266 void ScTabView::TabChanged( bool bSameTabButMoved )
267 {
268 if (pDrawView)
269 {
270 DrawDeselectAll(); // beendet auch Text-Edit-Modus
271
272 sal_uInt16 i;
273 for (i=0; i<4; i++)
274 if (pGridWin[i])
275 pDrawView->VCRemoveWin(pGridWin[i]); // fuer alte Page
276
277 SCTAB nTab = aViewData.GetTabNo();
278 pDrawView->HideSdrPage();
279 pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab));
280
281 UpdateLayerLocks();
282
283 pDrawView->RecalcScale();
284 pDrawView->UpdateWorkArea(); // #54782# PageSize ist pro Page unterschiedlich
285
286 for (i=0; i<4; i++)
287 if (pGridWin[i])
288 pDrawView->VCAddWin(pGridWin[i]); // fuer neue Page
289 }
290
291 SfxBindings& rBindings = aViewData.GetBindings();
292
293 // Es gibt keine einfache Moeglichkeit, alle Slots der FormShell zu invalidieren
294 // (fuer disablete Slots auf geschuetzten Tabellen), darum hier einfach alles...
295 rBindings.InvalidateAll(sal_False);
296
297 #if 0
298 rBindings.Invalidate( SID_SELECT_SCENARIO );
299 rBindings.Invalidate( FID_PROTECT_TABLE );
300 rBindings.Invalidate( FID_DELETE_TABLE );
301 rBindings.Invalidate( FID_TABLE_SHOW );
302 rBindings.Invalidate( FID_TABLE_HIDE );
303
304 // Auswirkungen von geschuetzten Tabellen.
305 rBindings.Invalidate( FID_TAB_RENAME );
306 rBindings.Invalidate( FID_TAB_MOVE );
307 rBindings.Invalidate( SID_DEL_ROWS );
308 rBindings.Invalidate( SID_DEL_COLS );
309 rBindings.Invalidate( FID_INS_ROW );
310 rBindings.Invalidate( FID_INS_COLUMN );
311 rBindings.Invalidate( FID_INS_CELL );
312 rBindings.Invalidate( FID_INS_CELLSDOWN );
313 rBindings.Invalidate( FID_INS_CELLSRIGHT );
314 rBindings.Invalidate( FID_DELETE_CELL );
315
316 rBindings.Invalidate( SID_OPENDLG_CHART );
317 rBindings.Invalidate( SID_INSERT_OBJECT );
318 rBindings.Invalidate( SID_INSERT_DIAGRAM );
319 rBindings.Invalidate( SID_INSERT_SMATH );
320 rBindings.Invalidate( SID_INSERT_GRAPHIC );
321 #endif
322
323 if (aViewData.GetViewShell()->HasAccessibilityObjects())
324 {
325 SfxSimpleHint aAccHint(SC_HINT_ACC_TABLECHANGED);
326 aViewData.GetViewShell()->BroadcastAccessibility(aAccHint);
327 }
328
329 // notification for XActivationBroadcaster
330 SfxViewFrame* pViewFrame = aViewData.GetViewShell()->GetViewFrame();
331 if (pViewFrame)
332 {
333 uno::Reference<frame::XController> xController = pViewFrame->GetFrame().GetController();
334 if (xController.is())
335 {
336 ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController );
337 if (pImp)
338 pImp->SheetChanged( bSameTabButMoved );
339 }
340 }
341 }
342
UpdateLayerLocks()343 void ScTabView::UpdateLayerLocks()
344 {
345 if (pDrawView)
346 {
347 SCTAB nTab = aViewData.GetTabNo();
348 sal_Bool bEx = aViewData.GetViewShell()->IsDrawSelMode();
349 sal_Bool bProt = aViewData.GetDocument()->IsTabProtected( nTab ) ||
350 aViewData.GetSfxDocShell()->IsReadOnly();
351 sal_Bool bShared = aViewData.GetDocShell()->IsDocShared();
352
353 SdrLayer* pLayer;
354 SdrLayerAdmin& rAdmin = pDrawView->GetModel()->GetLayerAdmin();
355 pLayer = rAdmin.GetLayerPerID(SC_LAYER_BACK);
356 if (pLayer)
357 pDrawView->SetLayerLocked( pLayer->GetName(), bProt || !bEx || bShared );
358 pLayer = rAdmin.GetLayerPerID(SC_LAYER_INTERN);
359 if (pLayer)
360 pDrawView->SetLayerLocked( pLayer->GetName(), sal_True );
361 pLayer = rAdmin.GetLayerPerID(SC_LAYER_FRONT);
362 if (pLayer)
363 pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
364 pLayer = rAdmin.GetLayerPerID(SC_LAYER_CONTROLS);
365 if (pLayer)
366 pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
367 pLayer = rAdmin.GetLayerPerID(SC_LAYER_HIDDEN);
368 if (pLayer)
369 {
370 pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
371 pDrawView->SetLayerVisible( pLayer->GetName(), sal_False);
372 }
373 }
374 }
375
DrawDeselectAll()376 void ScTabView::DrawDeselectAll()
377 {
378 if (pDrawView)
379 {
380 ScTabViewShell* pViewSh = aViewData.GetViewShell();
381 if ( pDrawActual &&
382 ( pViewSh->IsDrawTextShell() || pDrawActual->GetSlotID() == SID_DRAW_NOTEEDIT ) )
383 {
384 // end text edit (as if escape pressed, in FuDraw)
385 aViewData.GetDispatcher().Execute( pDrawActual->GetSlotID(),
386 SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD );
387 }
388
389 pDrawView->ScEndTextEdit();
390 pDrawView->UnmarkAll();
391
392 if (!pViewSh->IsDrawSelMode())
393 pViewSh->SetDrawShell( sal_False );
394 }
395 }
396
IsDrawTextEdit() const397 sal_Bool ScTabView::IsDrawTextEdit() const
398 {
399 if (pDrawView)
400 return pDrawView->IsTextEdit();
401 else
402 return sal_False;
403 }
404
405 //UNUSED2008-05 String ScTabView::GetSelectedChartName() const
406 //UNUSED2008-05 {
407 //UNUSED2008-05 if (pDrawView)
408 //UNUSED2008-05 return pDrawView->GetSelectedChartName();
409 //UNUSED2008-05 else
410 //UNUSED2008-05 return EMPTY_STRING;
411 //UNUSED2008-05 }
412
GetZoomType() const413 SvxZoomType ScTabView::GetZoomType() const
414 {
415 return aViewData.GetZoomType();
416 }
417
SetZoomType(SvxZoomType eNew,sal_Bool bAll)418 void ScTabView::SetZoomType( SvxZoomType eNew, sal_Bool bAll )
419 {
420 aViewData.SetZoomType( eNew, bAll );
421 }
422
SetZoom(const Fraction & rNewX,const Fraction & rNewY,sal_Bool bAll)423 void ScTabView::SetZoom( const Fraction& rNewX, const Fraction& rNewY, sal_Bool bAll )
424 {
425 aViewData.SetZoom( rNewX, rNewY, bAll );
426 if (pDrawView)
427 pDrawView->RecalcScale();
428 ZoomChanged(); // einzeln wegen CLOOKs
429 }
430
RefreshZoom()431 void ScTabView::RefreshZoom()
432 {
433 aViewData.RefreshZoom();
434 if (pDrawView)
435 pDrawView->RecalcScale();
436 ZoomChanged();
437 }
438
SetPagebreakMode(sal_Bool bSet)439 void ScTabView::SetPagebreakMode( sal_Bool bSet )
440 {
441 aViewData.SetPagebreakMode(bSet);
442 if (pDrawView)
443 pDrawView->RecalcScale();
444 ZoomChanged(); // einzeln wegen CLOOKs
445 }
446
ResetDrawDragMode()447 void ScTabView::ResetDrawDragMode()
448 {
449 if (pDrawView)
450 pDrawView->SetDragMode( SDRDRAG_MOVE );
451 }
452
ViewOptionsHasChanged(sal_Bool bHScrollChanged,sal_Bool bGraphicsChanged)453 void ScTabView::ViewOptionsHasChanged( sal_Bool bHScrollChanged, sal_Bool bGraphicsChanged )
454 {
455 // DrawView erzeugen, wenn Gitter angezeigt werden soll
456 if ( !pDrawView && aViewData.GetOptions().GetGridOptions().GetGridVisible() )
457 MakeDrawLayer();
458
459 if (pDrawView)
460 pDrawView->UpdateUserViewOptions();
461
462 if (bGraphicsChanged)
463 DrawEnableAnim(sal_True); // DrawEnableAnim checks the options state
464
465 // if TabBar is set to visible, make sure its size is not 0
466 sal_Bool bGrow = ( aViewData.IsTabMode() && pTabControl->GetSizePixel().Width() <= 0 );
467
468 // if ScrollBar is set to visible, TabBar must make room
469 sal_Bool bShrink = ( bHScrollChanged && aViewData.IsTabMode() && aViewData.IsHScrollMode() &&
470 pTabControl->GetSizePixel().Width() > SC_TABBAR_DEFWIDTH );
471
472 if ( bGrow || bShrink )
473 {
474 Size aSize = pTabControl->GetSizePixel();
475 aSize.Width() = SC_TABBAR_DEFWIDTH; // initial size
476 pTabControl->SetSizePixel(aSize); // DoResize is called later...
477 }
478 }
479
480 // Helper-Funktion gegen das Include des Drawing Layers
481
GetSdrView()482 SdrView* ScTabView::GetSdrView()
483 {
484 return pDrawView;
485 }
486
DrawMarkListHasChanged()487 void ScTabView::DrawMarkListHasChanged()
488 {
489 if ( pDrawView )
490 pDrawView->MarkListHasChanged();
491 }
492
UpdateAnchorHandles()493 void ScTabView::UpdateAnchorHandles()
494 {
495 if ( pDrawView )
496 pDrawView->AdjustMarkHdl();
497 }
498
UpdateIMap(SdrObject * pObj)499 void ScTabView::UpdateIMap( SdrObject* pObj )
500 {
501 if ( pDrawView )
502 pDrawView->UpdateIMap( pObj );
503 }
504
DrawMarkRect(const Rectangle & rRect)505 void ScTabView::DrawMarkRect( const Rectangle& rRect )
506 {
507 //! store rectangle for repaint during drag
508
509 for (sal_uInt16 i=0; i<4; i++)
510 {
511 if ( pGridWin[i] && pGridWin[i]->IsVisible() )
512 {
513 RasterOp aROp = pGridWin[i]->GetRasterOp();
514 sal_Bool bHasLine = pGridWin[i]->IsLineColor();
515 Color aLine = pGridWin[i]->GetLineColor();
516 sal_Bool bHasFill = pGridWin[i]->IsFillColor();
517 Color aFill = pGridWin[i]->GetFillColor();
518
519 pGridWin[i]->SetRasterOp( ROP_INVERT );
520 pGridWin[i]->SetLineColor( COL_BLACK );
521 pGridWin[i]->SetFillColor();
522
523 pGridWin[i]->DrawRect(rRect);
524
525 pGridWin[i]->SetRasterOp(aROp);
526 if (bHasLine)
527 pGridWin[i]->SetLineColor(aLine);
528 else
529 pGridWin[i]->SetLineColor();
530 if (bHasFill)
531 pGridWin[i]->SetFillColor(aFill);
532 else
533 pGridWin[i]->SetFillColor();
534 }
535 }
536 }
537
DrawEnableAnim(sal_Bool bSet)538 void ScTabView::DrawEnableAnim(sal_Bool bSet)
539 {
540 sal_uInt16 i;
541 if ( pDrawView )
542 {
543 // #71040# dont start animations if display of graphics is disabled
544 // graphics are controlled by VOBJ_TYPE_OLE
545 if ( bSet && aViewData.GetOptions().GetObjMode(VOBJ_TYPE_OLE) == VOBJ_MODE_SHOW )
546 {
547 if ( !pDrawView->IsAnimationEnabled() )
548 {
549 pDrawView->SetAnimationEnabled(sal_True);
550
551 // Animierte GIFs muessen wieder gestartet werden:
552 ScDocument* pDoc = aViewData.GetDocument();
553 for (i=0; i<4; i++)
554 if ( pGridWin[i] && pGridWin[i]->IsVisible() )
555 pDoc->StartAnimations( aViewData.GetTabNo(), pGridWin[i] );
556 }
557 }
558 else
559 {
560 pDrawView->SetAnimationEnabled(sal_False);
561 }
562 }
563 }
564
565 //HMHvoid ScTabView::DrawShowMarkHdl(sal_Bool bShow)
566 //HMH{
567 //HMHif (!pDrawView)
568 //HMH return;
569
570 //HMHif (bShow)
571 //HMH{
572 //HMH if (!pDrawView->IsDisableHdl())
573 //HMH pDrawView->ShowMarkHdl();
574 //HMH}
575 //HMHelse
576 //HMH pDrawView->HideMarkHdl();
577 //HMH}
578
UpdateDrawTextOutliner()579 void ScTabView::UpdateDrawTextOutliner()
580 {
581 if ( pDrawView )
582 {
583 Outliner* pOL = pDrawView->GetTextEditOutliner();
584 if (pOL)
585 aViewData.UpdateOutlinerFlags( *pOL );
586 }
587 }
588
DigitLanguageChanged()589 void ScTabView::DigitLanguageChanged()
590 {
591 LanguageType eNewLang = SC_MOD()->GetOptDigitLanguage();
592 for (sal_uInt16 i=0; i<4; i++)
593 if ( pGridWin[i] )
594 pGridWin[i]->SetDigitLanguage( eNewLang );
595 }
596
597 //---------------------------------------------------------------
598
ScrollToObject(SdrObject * pDrawObj)599 void ScTabView::ScrollToObject( SdrObject* pDrawObj )
600 {
601 if ( pDrawObj )
602 {
603 // #i118524# use the BoundRect, this defines the visible area
604 MakeVisible(pDrawObj->GetCurrentBoundRect());
605 }
606 }
607
MakeVisible(const Rectangle & rHMMRect)608 void ScTabView::MakeVisible( const Rectangle& rHMMRect )
609 {
610 Window* pWin = GetActiveWin();
611 Size aWinSize = pWin->GetOutputSizePixel();
612 SCTAB nTab = aViewData.GetTabNo();
613
614 Rectangle aRect = pWin->LogicToPixel( rHMMRect );
615
616 long nScrollX=0, nScrollY=0; // Pixel
617
618 if ( aRect.Right() >= aWinSize.Width() ) // rechts raus
619 {
620 nScrollX = aRect.Right() - aWinSize.Width() + 1; // rechter Rand sichtbar
621 if ( aRect.Left() < nScrollX )
622 nScrollX = aRect.Left(); // links sichtbar (falls zu gross)
623 }
624 if ( aRect.Bottom() >= aWinSize.Height() ) // unten raus
625 {
626 nScrollY = aRect.Bottom() - aWinSize.Height() + 1; // unterer Rand sichtbar
627 if ( aRect.Top() < nScrollY )
628 nScrollY = aRect.Top(); // oben sichtbar (falls zu gross)
629 }
630
631 if ( aRect.Left() < 0 ) // links raus
632 nScrollX = aRect.Left(); // linker Rand sichtbar
633 if ( aRect.Top() < 0 ) // oben raus
634 nScrollY = aRect.Top(); // oberer Rand sichtbar
635
636 if (nScrollX || nScrollY)
637 {
638 ScDocument* pDoc = aViewData.GetDocument();
639 if ( pDoc->IsNegativePage( nTab ) )
640 nScrollX = -nScrollX;
641
642 double nPPTX = aViewData.GetPPTX();
643 double nPPTY = aViewData.GetPPTY();
644 ScSplitPos eWhich = aViewData.GetActivePart();
645 SCCOL nPosX = aViewData.GetPosX(WhichH(eWhich));
646 SCROW nPosY = aViewData.GetPosY(WhichV(eWhich));
647
648 long nLinesX=0, nLinesY=0; // Spalten/Zeilen - um mindestens nScrollX/Y scrollen
649
650 if (nScrollX > 0)
651 while (nScrollX > 0 && nPosX < MAXCOL)
652 {
653 nScrollX -= (long) ( pDoc->GetColWidth(nPosX, nTab) * nPPTX );
654 ++nPosX;
655 ++nLinesX;
656 }
657 else if (nScrollX < 0)
658 while (nScrollX < 0 && nPosX > 0)
659 {
660 --nPosX;
661 nScrollX += (long) ( pDoc->GetColWidth(nPosX, nTab) * nPPTX );
662 --nLinesX;
663 }
664
665 if (nScrollY > 0)
666 while (nScrollY > 0 && nPosY < MAXROW)
667 {
668 nScrollY -= (long) ( pDoc->GetRowHeight(nPosY, nTab) * nPPTY );
669 ++nPosY;
670 ++nLinesY;
671 }
672 else if (nScrollY < 0)
673 while (nScrollY < 0 && nPosY > 0)
674 {
675 --nPosY;
676 nScrollY += (long) ( pDoc->GetRowHeight(nPosY, nTab) * nPPTY );
677 --nLinesY;
678 }
679
680 ScrollLines( nLinesX, nLinesY ); // ausfuehren
681 }
682 }
683
684 //---------------------------------------------------------------
685
SetBrushDocument(ScDocument * pNew,sal_Bool bLock)686 void ScTabView::SetBrushDocument( ScDocument* pNew, sal_Bool bLock )
687 {
688 delete pBrushDocument;
689 delete pDrawBrushSet;
690
691 pBrushDocument = pNew;
692 pDrawBrushSet = NULL;
693
694 bLockPaintBrush = bLock;
695
696 aViewData.GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
697 }
698
SetDrawBrushSet(SfxItemSet * pNew,sal_Bool bLock)699 void ScTabView::SetDrawBrushSet( SfxItemSet* pNew, sal_Bool bLock )
700 {
701 delete pBrushDocument;
702 delete pDrawBrushSet;
703
704 pBrushDocument = NULL;
705 pDrawBrushSet = pNew;
706
707 bLockPaintBrush = bLock;
708
709 aViewData.GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
710 }
711
ResetBrushDocument()712 void ScTabView::ResetBrushDocument()
713 {
714 if ( HasPaintBrush() )
715 {
716 SetBrushDocument( NULL, sal_False );
717 SetActivePointer( Pointer( POINTER_ARROW ) ); // switch pointers also when ended with escape key
718 }
719 }
720
721
722