summaryrefslogtreecommitdiff
path: root/sc/source/ui/view/tabview5.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/view/tabview5.cxx')
-rw-r--r--sc/source/ui/view/tabview5.cxx729
1 files changed, 729 insertions, 0 deletions
diff --git a/sc/source/ui/view/tabview5.cxx b/sc/source/ui/view/tabview5.cxx
new file mode 100644
index 000000000000..75e961d5eeec
--- /dev/null
+++ b/sc/source/ui/view/tabview5.cxx
@@ -0,0 +1,729 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: tabview5.cxx,v $
+ * $Revision: 1.25.32.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+
+
+// INCLUDE ---------------------------------------------------------------
+
+#include "scitems.hxx"
+#include <svx/eeitem.hxx>
+
+
+#include <svx/fmshell.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdoutl.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/objsh.hxx>
+#include <tools/ref.hxx>
+
+#include "tabview.hxx"
+#include "tabvwsh.hxx"
+#include "document.hxx"
+#include "gridwin.hxx"
+#include "olinewin.hxx"
+#include "tabsplit.hxx"
+#include "colrowba.hxx"
+#include "tabcont.hxx"
+#include "hintwin.hxx"
+#include "sc.hrc"
+#include "pagedata.hxx"
+#include "hiranges.hxx"
+#include "drawview.hxx"
+#include "drwlayer.hxx"
+#include "fusel.hxx" // Start-Function
+#include "seltrans.hxx"
+#include "scmod.hxx"
+#include "AccessibilityHints.hxx"
+#include "docsh.hxx"
+#include "viewuno.hxx"
+
+#include <vcl/svapp.hxx>
+
+using namespace com::sun::star;
+
+// STATIC DATA -----------------------------------------------------------
+
+
+void __EXPORT ScTabView::Init()
+{
+ /* RTL layout of the view windows is done manually, because it depends on
+ the sheet orientation, not the UI setting. Note: controls that are
+ already constructed (e.g. scroll bars) have the RTL setting of the GUI.
+ Eventually this has to be disabled manually (see below). */
+ pFrameWin->EnableRTL( FALSE );
+
+ USHORT i;
+
+ aScrollTimer.SetTimeout(10);
+ aScrollTimer.SetTimeoutHdl( LINK( this, ScTabView, TimerHdl ) );
+
+ for (i=0; i<4; i++)
+ pGridWin[i] = NULL;
+ pGridWin[SC_SPLIT_BOTTOMLEFT] = new ScGridWindow( pFrameWin, &aViewData, SC_SPLIT_BOTTOMLEFT );
+
+ pSelEngine = new ScViewSelectionEngine( pGridWin[SC_SPLIT_BOTTOMLEFT], this,
+ SC_SPLIT_BOTTOMLEFT );
+ aFunctionSet.SetSelectionEngine( pSelEngine );
+
+ pHdrSelEng = new ScHeaderSelectionEngine( pFrameWin, &aHdrFunc );
+
+ pColBar[SC_SPLIT_LEFT] = new ScColBar( pFrameWin, &aViewData, SC_SPLIT_LEFT,
+ &aHdrFunc, pHdrSelEng );
+ pColBar[SC_SPLIT_RIGHT] = NULL;
+ pRowBar[SC_SPLIT_BOTTOM] = new ScRowBar( pFrameWin, &aViewData, SC_SPLIT_BOTTOM,
+ &aHdrFunc, pHdrSelEng );
+ pRowBar[SC_SPLIT_TOP] = NULL;
+ for (i=0; i<2; i++)
+ pColOutline[i] = pRowOutline[i] = NULL;
+
+ pHSplitter = new ScTabSplitter( pFrameWin, WinBits( WB_HSCROLL ), &aViewData );
+ pVSplitter = new ScTabSplitter( pFrameWin, WinBits( WB_VSCROLL ), &aViewData );
+
+ // SSA: override default keyboard step size to allow snap to row/column
+ pHSplitter->SetKeyboardStepSize( 1 );
+ pVSplitter->SetKeyboardStepSize( 1 );
+
+ pTabControl = new ScTabControl( pFrameWin, &aViewData );
+ /* #i97900# The tab control has to remain in RTL mode if GUI is RTL, this
+ is needed to draw the 3D effect correctly. The base TabBar implementes
+ mirroring independent from the GUI direction. Have to set RTL mode
+ explicitly because the parent frame window is already RTL disabled. */
+ pTabControl->EnableRTL( Application::GetSettings().GetLayoutRTL() );
+
+ InitScrollBar( aHScrollLeft, MAXCOL+1 );
+ InitScrollBar( aHScrollRight, MAXCOL+1 );
+ InitScrollBar( aVScrollTop, MAXROW+1 );
+ InitScrollBar( aVScrollBottom, MAXROW+1 );
+ /* #i97900# scrollbars remain in correct RTL mode, needed mirroring etc.
+ is now handled correctly at the respective places. */
+
+ // Hier noch nichts anzeigen (Show), weil noch falsch angeordnet ist
+ // Show kommt dann aus UpdateShow beim ersten Resize
+ // pTabControl, pGridWin, aHScrollLeft, aVScrollBottom,
+ // aCornerButton, aScrollBarBox, pHSplitter, pVSplitter
+
+ // Splitter
+
+ pHSplitter->SetSplitHdl( LINK( this, ScTabView, SplitHdl ) );
+ pVSplitter->SetSplitHdl( LINK( this, ScTabView, SplitHdl ) );
+
+ // UpdateShow kommt beim Resize, oder bei Kopie einer bestehenden View aus dem ctor
+
+ pDrawActual = NULL;
+ pDrawOld = NULL;
+
+ // DrawView darf nicht im TabView - ctor angelegt werden,
+ // wenn die ViewShell noch nicht konstruiert ist...
+ // Das gilt auch fuer ViewOptionsHasChanged()
+
+ TestHintWindow();
+}
+
+__EXPORT ScTabView::~ScTabView()
+{
+ USHORT i;
+
+ // remove selection object
+ ScModule* pScMod = SC_MOD();
+ ScSelectionTransferObj* pOld = pScMod->GetSelectionTransfer();
+ if ( pOld && pOld->GetView() == this )
+ {
+ pOld->ForgetView();
+ pScMod->SetSelectionTransfer( NULL );
+ TransferableHelper::ClearSelection( GetActiveWin() ); // may delete pOld
+ }
+
+ DELETEZ(pBrushDocument);
+ DELETEZ(pDrawBrushSet);
+
+ DELETEZ(pPageBreakData);
+ DELETEZ(pHighlightRanges);
+
+ DELETEZ(pDrawOld);
+ DELETEZ(pDrawActual);
+
+ aViewData.KillEditView(); // solange GridWin's noch existieren
+
+ DELETEZ(pInputHintWindow);
+
+ if (pDrawView)
+ {
+ for (i=0; i<4; i++)
+ if (pGridWin[i])
+ {
+ pDrawView->VCRemoveWin(pGridWin[i]);
+ pDrawView->DeleteWindowFromPaintView(pGridWin[i]);
+ }
+
+ pDrawView->HideSdrPage();
+ delete pDrawView;
+ }
+
+ delete pSelEngine;
+
+ for (i=0; i<4; i++)
+ delete pGridWin[i];
+
+ delete pHdrSelEng;
+
+ for (i=0; i<2; i++)
+ {
+ delete pColBar[i];
+ delete pRowBar[i];
+ delete pColOutline[i];
+ delete pRowOutline[i];
+ }
+
+ delete pHSplitter;
+ delete pVSplitter;
+
+ delete pTabControl;
+}
+
+void ScTabView::MakeDrawView( BYTE nForceDesignMode )
+{
+ if (!pDrawView)
+ {
+ ScDrawLayer* pLayer = aViewData.GetDocument()->GetDrawLayer();
+ DBG_ASSERT(pLayer, "wo ist der Draw Layer ??");
+
+ USHORT i;
+ pDrawView = new ScDrawView( pGridWin[SC_SPLIT_BOTTOMLEFT], &aViewData );
+ for (i=0; i<4; i++)
+ if (pGridWin[i])
+ {
+ if ( SC_SPLIT_BOTTOMLEFT != (ScSplitPos)i )
+ pDrawView->AddWindowToPaintView(pGridWin[i]);
+ pDrawView->VCAddWin(pGridWin[i]);
+ }
+ pDrawView->RecalcScale();
+ for (i=0; i<4; i++)
+ if (pGridWin[i])
+ {
+ pGridWin[i]->SetMapMode(pGridWin[i]->GetDrawMapMode());
+
+ pGridWin[i]->Update(); // wegen Invalidate im DrawView ctor (ShowPage),
+ // damit gleich gezeichnet werden kann
+ }
+ SfxRequest aSfxRequest(SID_OBJECT_SELECT, 0,aViewData.GetViewShell()->GetPool());
+ SetDrawFuncPtr(new FuSelection( aViewData.GetViewShell(), GetActiveWin(), pDrawView,
+ pLayer,aSfxRequest));
+
+ // #106334# used when switching back from page preview: restore saved design mode state
+ // (otherwise, keep the default from the draw view ctor)
+ if ( nForceDesignMode != SC_FORCEMODE_NONE )
+ pDrawView->SetDesignMode( (BOOL)nForceDesignMode );
+
+ // an der FormShell anmelden
+ FmFormShell* pFormSh = aViewData.GetViewShell()->GetFormShell();
+ if (pFormSh)
+ pFormSh->SetView(pDrawView);
+
+ if (aViewData.GetViewShell()->HasAccessibilityObjects())
+ aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_MAKEDRAWLAYER));
+
+ }
+}
+
+void ScTabView::DoAddWin( ScGridWindow* pWin )
+{
+ if (pDrawView)
+ {
+ pDrawView->AddWindowToPaintView(pWin);
+ pDrawView->VCAddWin(pWin);
+
+ // #114409#
+ pWin->DrawLayerCreated();
+ }
+}
+
+//==================================================================
+
+void ScTabView::TabChanged()
+{
+ if (pDrawView)
+ {
+ DrawDeselectAll(); // beendet auch Text-Edit-Modus
+
+ USHORT i;
+ for (i=0; i<4; i++)
+ if (pGridWin[i])
+ pDrawView->VCRemoveWin(pGridWin[i]); // fuer alte Page
+
+ SCTAB nTab = aViewData.GetTabNo();
+ pDrawView->HideSdrPage();
+ pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab));
+
+ UpdateLayerLocks();
+
+ pDrawView->RecalcScale();
+ pDrawView->UpdateWorkArea(); // #54782# PageSize ist pro Page unterschiedlich
+
+ for (i=0; i<4; i++)
+ if (pGridWin[i])
+ pDrawView->VCAddWin(pGridWin[i]); // fuer neue Page
+ }
+
+ SfxBindings& rBindings = aViewData.GetBindings();
+
+ // Es gibt keine einfache Moeglichkeit, alle Slots der FormShell zu invalidieren
+ // (fuer disablete Slots auf geschuetzten Tabellen), darum hier einfach alles...
+ rBindings.InvalidateAll(FALSE);
+
+#if 0
+ rBindings.Invalidate( SID_SELECT_SCENARIO );
+ rBindings.Invalidate( FID_PROTECT_TABLE );
+ rBindings.Invalidate( FID_DELETE_TABLE );
+ rBindings.Invalidate( FID_TABLE_SHOW );
+ rBindings.Invalidate( FID_TABLE_HIDE );
+
+ // Auswirkungen von geschuetzten Tabellen.
+ rBindings.Invalidate( FID_TAB_RENAME );
+ rBindings.Invalidate( FID_TAB_MOVE );
+ rBindings.Invalidate( SID_DEL_ROWS );
+ rBindings.Invalidate( SID_DEL_COLS );
+ rBindings.Invalidate( FID_INS_ROW );
+ rBindings.Invalidate( FID_INS_COLUMN );
+ rBindings.Invalidate( FID_INS_CELL );
+ rBindings.Invalidate( FID_INS_CELLSDOWN );
+ rBindings.Invalidate( FID_INS_CELLSRIGHT );
+ rBindings.Invalidate( FID_DELETE_CELL );
+
+ rBindings.Invalidate( SID_OPENDLG_CHART );
+ rBindings.Invalidate( SID_INSERT_OBJECT );
+ rBindings.Invalidate( SID_INSERT_DIAGRAM );
+ rBindings.Invalidate( SID_INSERT_SMATH );
+ rBindings.Invalidate( SID_INSERT_GRAPHIC );
+#endif
+
+ if (aViewData.GetViewShell()->HasAccessibilityObjects())
+ {
+ SfxSimpleHint aAccHint(SC_HINT_ACC_TABLECHANGED);
+ aViewData.GetViewShell()->BroadcastAccessibility(aAccHint);
+ }
+
+ // notification for XActivationBroadcaster
+ SfxViewFrame* pViewFrame = aViewData.GetViewShell()->GetViewFrame();
+ if (pViewFrame)
+ {
+ SfxFrame* pFrame = pViewFrame->GetFrame();
+ if (pFrame)
+ {
+ uno::Reference<frame::XController> xController = pFrame->GetController();
+ if (xController.is())
+ {
+ ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController );
+ if (pImp)
+ pImp->SheetChanged();
+ }
+ }
+ }
+}
+
+void ScTabView::UpdateLayerLocks()
+{
+ if (pDrawView)
+ {
+ SCTAB nTab = aViewData.GetTabNo();
+ BOOL bEx = aViewData.GetViewShell()->IsDrawSelMode();
+ BOOL bProt = aViewData.GetDocument()->IsTabProtected( nTab ) ||
+ aViewData.GetSfxDocShell()->IsReadOnly();
+ BOOL bShared = aViewData.GetDocShell()->IsDocShared();
+
+ SdrLayer* pLayer;
+ SdrLayerAdmin& rAdmin = pDrawView->GetModel()->GetLayerAdmin();
+ pLayer = rAdmin.GetLayerPerID(SC_LAYER_BACK);
+ if (pLayer)
+ pDrawView->SetLayerLocked( pLayer->GetName(), bProt || !bEx || bShared );
+ pLayer = rAdmin.GetLayerPerID(SC_LAYER_INTERN);
+ if (pLayer)
+ pDrawView->SetLayerLocked( pLayer->GetName(), TRUE );
+ pLayer = rAdmin.GetLayerPerID(SC_LAYER_FRONT);
+ if (pLayer)
+ pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
+ pLayer = rAdmin.GetLayerPerID(SC_LAYER_CONTROLS);
+ if (pLayer)
+ pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
+ pLayer = rAdmin.GetLayerPerID(SC_LAYER_HIDDEN);
+ if (pLayer)
+ {
+ pDrawView->SetLayerLocked( pLayer->GetName(), bProt || bShared );
+ pDrawView->SetLayerVisible( pLayer->GetName(), sal_False);
+ }
+ }
+}
+
+void ScTabView::DrawDeselectAll()
+{
+ if (pDrawView)
+ {
+ ScTabViewShell* pViewSh = aViewData.GetViewShell();
+ if ( pDrawActual &&
+ ( pViewSh->IsDrawTextShell() || pDrawActual->GetSlotID() == SID_DRAW_NOTEEDIT ) )
+ {
+ // end text edit (as if escape pressed, in FuDraw)
+ aViewData.GetDispatcher().Execute( pDrawActual->GetSlotID(),
+ SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD );
+ }
+
+ pDrawView->ScEndTextEdit();
+ pDrawView->UnmarkAll();
+
+ if (!pViewSh->IsDrawSelMode())
+ pViewSh->SetDrawShell( FALSE );
+ }
+}
+
+BOOL ScTabView::IsDrawTextEdit() const
+{
+ if (pDrawView)
+ return pDrawView->IsTextEdit();
+ else
+ return FALSE;
+}
+
+//UNUSED2008-05 String ScTabView::GetSelectedChartName() const
+//UNUSED2008-05 {
+//UNUSED2008-05 if (pDrawView)
+//UNUSED2008-05 return pDrawView->GetSelectedChartName();
+//UNUSED2008-05 else
+//UNUSED2008-05 return EMPTY_STRING;
+//UNUSED2008-05 }
+
+SvxZoomType ScTabView::GetZoomType() const
+{
+ return aViewData.GetZoomType();
+}
+
+void ScTabView::SetZoomType( SvxZoomType eNew, BOOL bAll )
+{
+ aViewData.SetZoomType( eNew, bAll );
+}
+
+void ScTabView::SetZoom( const Fraction& rNewX, const Fraction& rNewY, BOOL bAll )
+{
+ aViewData.SetZoom( rNewX, rNewY, bAll );
+ if (pDrawView)
+ pDrawView->RecalcScale();
+ ZoomChanged(); // einzeln wegen CLOOKs
+}
+
+void ScTabView::RefreshZoom()
+{
+ aViewData.RefreshZoom();
+ if (pDrawView)
+ pDrawView->RecalcScale();
+ ZoomChanged();
+}
+
+void ScTabView::SetPagebreakMode( BOOL bSet )
+{
+ aViewData.SetPagebreakMode(bSet);
+ if (pDrawView)
+ pDrawView->RecalcScale();
+ ZoomChanged(); // einzeln wegen CLOOKs
+}
+
+void ScTabView::ResetDrawDragMode()
+{
+ if (pDrawView)
+ pDrawView->SetDragMode( SDRDRAG_MOVE );
+}
+
+void ScTabView::ViewOptionsHasChanged( BOOL bHScrollChanged, BOOL bGraphicsChanged )
+{
+ // DrawView erzeugen, wenn Gitter angezeigt werden soll
+ if ( !pDrawView && aViewData.GetOptions().GetGridOptions().GetGridVisible() )
+ MakeDrawLayer();
+
+ if (pDrawView)
+ pDrawView->UpdateUserViewOptions();
+
+ if (bGraphicsChanged)
+ DrawEnableAnim(TRUE); // DrawEnableAnim checks the options state
+
+ // if TabBar is set to visible, make sure its size is not 0
+ BOOL bGrow = ( aViewData.IsTabMode() && pTabControl->GetSizePixel().Width() <= 0 );
+
+ // if ScrollBar is set to visible, TabBar must make room
+ BOOL bShrink = ( bHScrollChanged && aViewData.IsTabMode() && aViewData.IsHScrollMode() &&
+ pTabControl->GetSizePixel().Width() > SC_TABBAR_DEFWIDTH );
+
+ if ( bGrow || bShrink )
+ {
+ Size aSize = pTabControl->GetSizePixel();
+ aSize.Width() = SC_TABBAR_DEFWIDTH; // initial size
+ pTabControl->SetSizePixel(aSize); // DoResize is called later...
+ }
+}
+
+// Helper-Funktion gegen das Include des Drawing Layers
+
+SdrView* ScTabView::GetSdrView()
+{
+ return pDrawView;
+}
+
+void ScTabView::DrawMarkListHasChanged()
+{
+ if ( pDrawView )
+ pDrawView->MarkListHasChanged();
+}
+
+void ScTabView::UpdateAnchorHandles()
+{
+ if ( pDrawView )
+ pDrawView->AdjustMarkHdl();
+}
+
+void ScTabView::UpdateIMap( SdrObject* pObj )
+{
+ if ( pDrawView )
+ pDrawView->UpdateIMap( pObj );
+}
+
+void ScTabView::DrawMarkRect( const Rectangle& rRect )
+{
+ //! store rectangle for repaint during drag
+
+ for (USHORT i=0; i<4; i++)
+ {
+ if ( pGridWin[i] && pGridWin[i]->IsVisible() )
+ {
+ RasterOp aROp = pGridWin[i]->GetRasterOp();
+ BOOL bHasLine = pGridWin[i]->IsLineColor();
+ Color aLine = pGridWin[i]->GetLineColor();
+ BOOL bHasFill = pGridWin[i]->IsFillColor();
+ Color aFill = pGridWin[i]->GetFillColor();
+
+ pGridWin[i]->SetRasterOp( ROP_INVERT );
+ pGridWin[i]->SetLineColor( COL_BLACK );
+ pGridWin[i]->SetFillColor();
+
+ pGridWin[i]->DrawRect(rRect);
+
+ pGridWin[i]->SetRasterOp(aROp);
+ if (bHasLine)
+ pGridWin[i]->SetLineColor(aLine);
+ else
+ pGridWin[i]->SetLineColor();
+ if (bHasFill)
+ pGridWin[i]->SetFillColor(aFill);
+ else
+ pGridWin[i]->SetFillColor();
+ }
+ }
+}
+
+void ScTabView::DrawEnableAnim(BOOL bSet)
+{
+ USHORT i;
+ if ( pDrawView )
+ {
+ // #71040# dont start animations if display of graphics is disabled
+ // graphics are controlled by VOBJ_TYPE_OLE
+ if ( bSet && aViewData.GetOptions().GetObjMode(VOBJ_TYPE_OLE) == VOBJ_MODE_SHOW )
+ {
+ if ( !pDrawView->IsAnimationEnabled() )
+ {
+ pDrawView->SetAnimationEnabled(TRUE);
+
+ // Animierte GIFs muessen wieder gestartet werden:
+ ScDocument* pDoc = aViewData.GetDocument();
+ for (i=0; i<4; i++)
+ if ( pGridWin[i] && pGridWin[i]->IsVisible() )
+ pDoc->StartAnimations( aViewData.GetTabNo(), pGridWin[i] );
+ }
+ }
+ else
+ {
+ pDrawView->SetAnimationEnabled(FALSE);
+ }
+ }
+}
+
+//HMHvoid ScTabView::DrawShowMarkHdl(BOOL bShow)
+//HMH{
+ //HMHif (!pDrawView)
+ //HMH return;
+
+ //HMHif (bShow)
+ //HMH{
+ //HMH if (!pDrawView->IsDisableHdl())
+ //HMH pDrawView->ShowMarkHdl();
+ //HMH}
+ //HMHelse
+ //HMH pDrawView->HideMarkHdl();
+//HMH}
+
+void ScTabView::UpdateDrawTextOutliner()
+{
+ if ( pDrawView )
+ {
+ Outliner* pOL = pDrawView->GetTextEditOutliner();
+ if (pOL)
+ aViewData.UpdateOutlinerFlags( *pOL );
+ }
+}
+
+void ScTabView::DigitLanguageChanged()
+{
+ LanguageType eNewLang = SC_MOD()->GetOptDigitLanguage();
+ for (USHORT i=0; i<4; i++)
+ if ( pGridWin[i] )
+ pGridWin[i]->SetDigitLanguage( eNewLang );
+}
+
+//---------------------------------------------------------------
+
+void ScTabView::ScrollToObject( SdrObject* pDrawObj )
+{
+ if ( pDrawObj )
+ MakeVisible( pDrawObj->GetLogicRect() );
+}
+
+void ScTabView::MakeVisible( const Rectangle& rHMMRect )
+{
+ Window* pWin = GetActiveWin();
+ Size aWinSize = pWin->GetOutputSizePixel();
+ SCTAB nTab = aViewData.GetTabNo();
+
+ Rectangle aRect = pWin->LogicToPixel( rHMMRect );
+
+ long nScrollX=0, nScrollY=0; // Pixel
+
+ if ( aRect.Right() >= aWinSize.Width() ) // rechts raus
+ {
+ nScrollX = aRect.Right() - aWinSize.Width() + 1; // rechter Rand sichtbar
+ if ( aRect.Left() < nScrollX )
+ nScrollX = aRect.Left(); // links sichtbar (falls zu gross)
+ }
+ if ( aRect.Bottom() >= aWinSize.Height() ) // unten raus
+ {
+ nScrollY = aRect.Bottom() - aWinSize.Height() + 1; // unterer Rand sichtbar
+ if ( aRect.Top() < nScrollY )
+ nScrollY = aRect.Top(); // oben sichtbar (falls zu gross)
+ }
+
+ if ( aRect.Left() < 0 ) // links raus
+ nScrollX = aRect.Left(); // linker Rand sichtbar
+ if ( aRect.Top() < 0 ) // oben raus
+ nScrollY = aRect.Top(); // oberer Rand sichtbar
+
+ if (nScrollX || nScrollY)
+ {
+ ScDocument* pDoc = aViewData.GetDocument();
+ if ( pDoc->IsNegativePage( nTab ) )
+ nScrollX = -nScrollX;
+
+ double nPPTX = aViewData.GetPPTX();
+ double nPPTY = aViewData.GetPPTY();
+ ScSplitPos eWhich = aViewData.GetActivePart();
+ SCCOL nPosX = aViewData.GetPosX(WhichH(eWhich));
+ SCROW nPosY = aViewData.GetPosY(WhichV(eWhich));
+
+ long nLinesX=0, nLinesY=0; // Spalten/Zeilen - um mindestens nScrollX/Y scrollen
+
+ if (nScrollX > 0)
+ while (nScrollX > 0 && nPosX < MAXCOL)
+ {
+ nScrollX -= (long) ( pDoc->GetColWidth(nPosX, nTab) * nPPTX );
+ ++nPosX;
+ ++nLinesX;
+ }
+ else if (nScrollX < 0)
+ while (nScrollX < 0 && nPosX > 0)
+ {
+ --nPosX;
+ nScrollX += (long) ( pDoc->GetColWidth(nPosX, nTab) * nPPTX );
+ --nLinesX;
+ }
+
+ if (nScrollY > 0)
+ while (nScrollY > 0 && nPosY < MAXROW)
+ {
+ nScrollY -= (long) ( pDoc->FastGetRowHeight(nPosY, nTab) * nPPTY );
+ ++nPosY;
+ ++nLinesY;
+ }
+ else if (nScrollY < 0)
+ while (nScrollY < 0 && nPosY > 0)
+ {
+ --nPosY;
+ nScrollY += (long) ( pDoc->FastGetRowHeight(nPosY, nTab) * nPPTY );
+ --nLinesY;
+ }
+
+ ScrollLines( nLinesX, nLinesY ); // ausfuehren
+ }
+}
+
+//---------------------------------------------------------------
+
+void ScTabView::SetBrushDocument( ScDocument* pNew, BOOL bLock )
+{
+ delete pBrushDocument;
+ delete pDrawBrushSet;
+
+ pBrushDocument = pNew;
+ pDrawBrushSet = NULL;
+
+ bLockPaintBrush = bLock;
+
+ aViewData.GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
+}
+
+void ScTabView::SetDrawBrushSet( SfxItemSet* pNew, BOOL bLock )
+{
+ delete pBrushDocument;
+ delete pDrawBrushSet;
+
+ pBrushDocument = NULL;
+ pDrawBrushSet = pNew;
+
+ bLockPaintBrush = bLock;
+
+ aViewData.GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
+}
+
+void ScTabView::ResetBrushDocument()
+{
+ if ( HasPaintBrush() )
+ {
+ SetBrushDocument( NULL, FALSE );
+ SetActivePointer( Pointer( POINTER_ARROW ) ); // switch pointers also when ended with escape key
+ }
+}
+
+