xref: /trunk/main/sc/source/ui/inc/viewdata.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef SC_VIEWDATA_HXX
28 #define SC_VIEWDATA_HXX
29 
30 #include <svx/zoomitem.hxx>
31 #include "scdllapi.h"
32 #include "viewopti.hxx"
33 #include "markdata.hxx"
34 
35 
36 // ---------------------------------------------------------------------------
37 
38 #define SC_SLIDER_SIZE      2
39 #define SC_SMALL3DSHADOW    COL_BLACK
40 #define SC_SIZE_NONE        65535
41 const SCCOL SC_TABSTART_NONE = SCCOL_MAX;
42 
43 #define SC_FILL_NONE        0
44 #define SC_FILL_FILL        1
45 #define SC_FILL_EMBED_LT    2
46 #define SC_FILL_EMBED_RB    3
47 #define SC_FILL_MATRIX      4
48 
49 enum ScSplitMode { SC_SPLIT_NONE = 0, SC_SPLIT_NORMAL, SC_SPLIT_FIX };
50 
51 enum ScSplitPos { SC_SPLIT_TOPLEFT, SC_SPLIT_TOPRIGHT, SC_SPLIT_BOTTOMLEFT, SC_SPLIT_BOTTOMRIGHT };
52 enum ScHSplitPos { SC_SPLIT_LEFT, SC_SPLIT_RIGHT };
53 enum ScVSplitPos { SC_SPLIT_TOP, SC_SPLIT_BOTTOM };
54 
55 inline ScHSplitPos WhichH( ScSplitPos ePos );
56 inline ScVSplitPos WhichV( ScSplitPos ePos );
57 inline ScSplitPos Which( ScHSplitPos eHPos );
58 inline ScSplitPos Which( ScVSplitPos eVPos );
59 
60 //  Bildschirmverhalten bei Cursorbewegungen:
61 enum ScFollowMode { SC_FOLLOW_NONE, SC_FOLLOW_LINE, SC_FOLLOW_FIX, SC_FOLLOW_JUMP };
62 
63 //  Mausmodi um Bereiche zu selektieren
64 enum ScRefType { SC_REFTYPE_NONE, SC_REFTYPE_REF, SC_REFTYPE_FILL,
65                     SC_REFTYPE_EMBED_LT, SC_REFTYPE_EMBED_RB };
66 
67 /** States GetSimpleArea() returns for the underlying selection marks, so the
68     caller can react if the result is not of type SC_MARK_SIMPLE. */
69 enum ScMarkType
70 {
71     SC_MARK_NONE            = 0,    // Not returned by GetSimpleArea(), used internally.
72                                     // Nothing marked always results in the
73                                     // current cursor position being selected and a simple mark.
74     SC_MARK_SIMPLE          = 1,    // Simple rectangular area marked, no filtered rows.
75     SC_MARK_FILTERED        = 2,    // At least one mark contains filtered rows.
76     SC_MARK_SIMPLE_FILTERED =       // Simple rectangular area marked containing filtered rows.
77         SC_MARK_SIMPLE |
78         SC_MARK_FILTERED,  // 3
79     SC_MARK_MULTI           = 4     // Multiple selection marks.
80     /* TODO: if filtered multi-selection was implemented, this would be the value to use. */
81 #if 0
82         ,
83     SC_MARK_MULTI_FILTERED  =       // Multiple selection marks containing filtered rows.
84         SC_MARK_MULTI |
85         SC_MARK_FILTERED   // 6
86 #endif
87 };
88 
89 class ScDocShell;
90 class ScDocument;
91 class ScDBFunc;
92 class ScTabViewShell;
93 class ScDrawView;
94 class ScEditEngineDefaulter;
95 class EditView;
96 class EditStatus;
97 class Outliner;
98 class Window;
99 class SfxObjectShell;
100 class SfxBindings;
101 class SfxDispatcher;
102 class ScPatternAttr;
103 class ScRangeListRef;
104 class ScExtDocOptions;
105 class ScViewData;
106 
107 //--------------------------------------------------------------------------
108 
109 class ScViewDataTable                           // Daten pro Tabelle
110 {
111 friend class ScViewData;
112 private:
113     SvxZoomType     eZoomType;                  // selected zoom type (normal view)
114     Fraction        aZoomX;                     // selected zoom X
115     Fraction        aZoomY;                     // selected zoom Y (displayed)
116     Fraction        aPageZoomX;                 // zoom in page break preview mode
117     Fraction        aPageZoomY;
118 
119     long            nTPosX[2];                  // MapMode - Offset (Twips)
120     long            nTPosY[2];
121     long            nMPosX[2];                  // MapMode - Offset (1/100 mm)
122     long            nMPosY[2];
123     long            nPixPosX[2];                // Offset in Pixeln
124     long            nPixPosY[2];
125     long            nHSplitPos;
126     long            nVSplitPos;
127 
128     ScSplitMode     eHSplitMode;
129     ScSplitMode     eVSplitMode;
130     ScSplitPos      eWhichActive;
131 
132     SCCOL           nFixPosX;                   // Zellposition des Splitters beim Fixieren
133     SCROW           nFixPosY;
134 
135     SCCOL           nCurX;
136     SCROW           nCurY;
137     SCCOL           nOldCurX;
138     SCROW           nOldCurY;
139     SCCOL           nPosX[2];
140     SCROW           nPosY[2];
141 
142     sal_Bool            bOldCurValid;               // "virtuelle" Cursorpos. bei zusammengefassten
143 
144                     ScViewDataTable();
145                     ~ScViewDataTable();
146 
147     void            WriteUserDataSequence(
148                         com::sun::star::uno::Sequence <com::sun::star::beans::PropertyValue>& rSettings,
149                         const ScViewData& rViewData, SCTAB nTab );
150 
151     void            ReadUserDataSequence(
152                         const com::sun::star::uno::Sequence <com::sun::star::beans::PropertyValue>& rSettings,
153                         ScViewData& rViewData, SCTAB nTab, bool& rHasZoom);
154 };
155 
156 // ---------------------------------------------------------------------------
157 
158 class SC_DLLPUBLIC ScViewData
159 {
160 private:
161     double              nPPTX, nPPTY;               // Scaling-Faktoren
162 
163     ScViewDataTable*    pTabData[MAXTABCOUNT];
164     ScViewDataTable*    pThisTab;                   // Daten der angezeigten Tabelle
165     ScDocShell*         pDocShell;
166     ScDocument*         pDoc;
167     ScDBFunc*           pView;
168     ScTabViewShell*     pViewShell;
169     EditView*           pEditView[4];               // gehoert dem Fenster
170     ScViewOptions*      pOptions;
171     EditView*           pSpellingView;
172 
173     ScMarkData          aMarkData;
174 
175     long                nEditMargin;
176 
177     Size                aScenButSize;               // Groesse eines Szenario-Buttons
178 
179     Size                aScrSize;
180     MapMode             aLogicMode;                 // skalierter 1/100mm-MapMode
181 
182     SvxZoomType         eDefZoomType;               // default zoom and type for missing TabData
183     Fraction            aDefZoomX;
184     Fraction            aDefZoomY;
185     Fraction            aDefPageZoomX;              // zoom in page break preview mode
186     Fraction            aDefPageZoomY;
187 
188     ScRefType           eRefType;
189 
190     SCTAB               nTabNo;                     // angezeigte Tabelle
191     SCTAB               nRefTabNo;                  // Tabelle auf die sich RefInput bezieht
192     SCCOL               nRefStartX;
193     SCROW               nRefStartY;
194     SCTAB               nRefStartZ;
195     SCCOL               nRefEndX;
196     SCROW               nRefEndY;
197     SCTAB               nRefEndZ;
198     SCCOL               nFillStartX;                // Fill-Cursor
199     SCROW               nFillStartY;
200     SCCOL               nFillEndX;
201     SCROW               nFillEndY;
202     SCCOL               nEditCol;                   // Position dazu
203     SCROW               nEditRow;
204     SCCOL               nEditStartCol;
205     SCCOL               nEditEndCol;                // Ende der Edit-View
206     SCROW               nEditEndRow;
207     SCCOL               nTabStartCol;               // fuer Enter nach Tab
208     ScRange             aDelRange;                  // fuer AutoFill-Loeschen
209 
210     ScSplitPos          eEditActivePart;            // the part that was active when edit mode was started
211     sal_Bool                bEditActive[4];             // aktiv?
212     sal_Bool                bActive;                    // aktives Fenster ?
213     sal_Bool                bIsRefMode;                 // Referenzeingabe
214     sal_Bool                bDelMarkValid;              // nur gueltig bei SC_REFTYPE_FILL
215     sal_uInt8               nFillMode;                  // Modus
216     sal_Bool                bPagebreak;                 // Seitenumbruch-Vorschaumodus
217 
218     sal_Bool                bSelCtrlMouseClick;         // special selection handling for ctrl-mouse-click
219 
220     SC_DLLPRIVATE DECL_LINK (EmptyEditHdl, EditStatus*);
221     SC_DLLPRIVATE DECL_LINK (EditEngineHdl, EditStatus*);
222 
223     SC_DLLPRIVATE void          CalcPPT();
224     SC_DLLPRIVATE void          CreateTabData( SCTAB nNewTab );
225     SC_DLLPRIVATE void          CreateTabData( std::vector< SCTAB >& rvTabs );
226     SC_DLLPRIVATE void          CreateSelectedTabData();
227 
228 public:
229                     ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh );
230                     ScViewData( const ScViewData& rViewData );
231                     ~ScViewData();
232 
233     void            InitData( ScDocument* pDocument );
234 //UNUSED2008-05  void            InitFrom( const ScViewData* pRef );
235 //UNUSED2008-05  void           SetDocShell( ScDocShell* pShell );
236 
237 
238     ScDocShell*     GetDocShell() const     { return pDocShell; }
239     ScDBFunc*       GetView() const         { return pView; }
240     ScTabViewShell* GetViewShell() const    { return pViewShell; }
241 
242     SfxObjectShell* GetSfxDocShell() const;
243     SfxBindings&    GetBindings();          // from ViewShell's ViewFrame
244     SfxDispatcher&  GetDispatcher();        // from ViewShell's ViewFrame
245 
246     ScMarkData&     GetMarkData()           { return aMarkData; }
247     const ScMarkData& GetMarkData() const   { return aMarkData; }
248 
249     Window*         GetDialogParent();          // von tabvwsh weitergeleitet
250     Window*         GetActiveWin();             // von View
251     ScDrawView*     GetScDrawView();            // von View
252     sal_Bool            IsMinimized();              // von View
253 
254     void            UpdateInputHandler( sal_Bool bForce = sal_False, sal_Bool bStopEditing = sal_True );
255 
256     void            WriteUserData(String& rData);
257     void            ReadUserData(const String& rData);
258     void            WriteExtOptions( ScExtDocOptions& rOpt ) const;
259     void            ReadExtOptions( const ScExtDocOptions& rOpt );
260     void            WriteUserDataSequence(com::sun::star::uno::Sequence <com::sun::star::beans::PropertyValue>& rSettings);
261     void            ReadUserDataSequence(const com::sun::star::uno::Sequence <com::sun::star::beans::PropertyValue>& rSettings);
262 
263     ScDocument*     GetDocument() const;
264 
265     void            SetViewShell( ScTabViewShell* pViewSh );
266 
267     sal_Bool            IsActive() const            { return bActive; }
268     void            Activate(sal_Bool bActivate)    { bActive = bActivate; }
269 
270     void            UpdateThis();
271 
272     void            InsertTab( SCTAB nTab );
273     void            DeleteTab( SCTAB nTab );
274     void            CopyTab( SCTAB nSrcTab, SCTAB nDestTab );
275     void            MoveTab( SCTAB nSrcTab, SCTAB nDestTab );
276 
277     SCTAB           GetRefTabNo() const                     { return nRefTabNo; }
278     void            SetRefTabNo( SCTAB nNewTab )            { nRefTabNo = nNewTab; }
279 
280     SCTAB           GetTabNo() const                        { return nTabNo; }
281     ScSplitPos      GetActivePart() const                   { return pThisTab->eWhichActive; }
282     SCCOL           GetPosX( ScHSplitPos eWhich ) const     { return pThisTab->nPosX[eWhich]; }
283     SCROW           GetPosY( ScVSplitPos eWhich ) const     { return pThisTab->nPosY[eWhich]; }
284     SCCOL           GetCurX() const                         { return pThisTab->nCurX; }
285     SCROW           GetCurY() const                         { return pThisTab->nCurY; }
286     sal_Bool            HasOldCursor() const                    { return pThisTab->bOldCurValid; }
287     SCCOL           GetOldCurX() const;
288     SCROW           GetOldCurY() const;
289     ScSplitMode     GetHSplitMode() const                   { return pThisTab->eHSplitMode; }
290     ScSplitMode     GetVSplitMode() const                   { return pThisTab->eVSplitMode; }
291     long            GetHSplitPos() const                    { return pThisTab->nHSplitPos; }
292     long            GetVSplitPos() const                    { return pThisTab->nVSplitPos; }
293     SCCOL           GetFixPosX() const                      { return pThisTab->nFixPosX; }
294     SCROW           GetFixPosY() const                      { return pThisTab->nFixPosY; }
295     sal_Bool            IsPagebreakMode() const                 { return bPagebreak; }
296 
297     void            SetPosX( ScHSplitPos eWhich, SCCOL nNewPosX );
298     void            SetPosY( ScVSplitPos eWhich, SCROW nNewPosY );
299     void            SetCurX( SCCOL nNewCurX )                       { pThisTab->nCurX = nNewCurX; }
300     void            SetCurY( SCROW nNewCurY )                       { pThisTab->nCurY = nNewCurY; }
301     void            SetOldCursor( SCCOL nNewX, SCROW nNewY );
302     void            ResetOldCursor();
303     void            SetHSplitMode( ScSplitMode eMode )              { pThisTab->eHSplitMode = eMode; }
304     void            SetVSplitMode( ScSplitMode eMode )              { pThisTab->eVSplitMode = eMode; }
305     void            SetHSplitPos( long nPos )                       { pThisTab->nHSplitPos = nPos; }
306     void            SetVSplitPos( long nPos )                       { pThisTab->nVSplitPos = nPos; }
307     void            SetFixPosX( SCCOL nPos )                        { pThisTab->nFixPosX = nPos; }
308     void            SetFixPosY( SCROW nPos )                        { pThisTab->nFixPosY = nPos; }
309     void            SetPagebreakMode( sal_Bool bSet );
310 
311     void            SetZoomType( SvxZoomType eNew, sal_Bool bAll );
312     void            SetZoomType( SvxZoomType eNew, std::vector< SCTAB >& tabs );
313     void            SetZoom( const Fraction& rNewX, const Fraction& rNewY, std::vector< SCTAB >& tabs );
314     void            SetZoom( const Fraction& rNewX, const Fraction& rNewY, sal_Bool bAll );
315     void            RefreshZoom();
316 
317     void            SetSelCtrlMouseClick( sal_Bool bTmp ) { bSelCtrlMouseClick = bTmp; }
318 
319     SvxZoomType     GetZoomType() const     { return pThisTab->eZoomType; }
320     const Fraction& GetZoomX() const        { return bPagebreak ? pThisTab->aPageZoomX : pThisTab->aZoomX; }
321     const Fraction& GetZoomY() const        { return bPagebreak ? pThisTab->aPageZoomY : pThisTab->aZoomY; }
322 
323     const MapMode&  GetLogicMode( ScSplitPos eWhich );
324     const MapMode&  GetLogicMode();                     // Offset 0
325 
326     long            GetTPosX( ScHSplitPos eWhich ) const        { return pThisTab->nTPosX[eWhich]; }
327     long            GetTPosY( ScVSplitPos eWhich ) const        { return pThisTab->nTPosY[eWhich]; }
328 
329     double          GetPPTX() const { return nPPTX; }
330     double          GetPPTY() const { return nPPTY; }
331 
332     ScMarkType      GetSimpleArea( SCCOL& rStartCol, SCROW& rStartRow, SCTAB& rStartTab,
333                                     SCCOL& rEndCol, SCROW& rEndRow, SCTAB& rEndTab ) const;
334     ScMarkType      GetSimpleArea( ScRange& rRange ) const;
335                     /// May modify rNewMark using MarkToSimple().
336     ScMarkType      GetSimpleArea( ScRange & rRange, ScMarkData & rNewMark ) const;
337     void            GetMultiArea( ScRangeListRef& rRange ) const;
338 
339     sal_Bool            SimpleColMarked();
340     sal_Bool            SimpleRowMarked();
341 
342     sal_Bool            IsMultiMarked();
343 
344     void            SetFillMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow );
345     void            SetDragMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
346                                     sal_uInt8 nMode );
347     void            GetFillData( SCCOL& rStartCol, SCROW& rStartRow,
348                                  SCCOL& rEndCol, SCROW& rEndRow );
349     void            ResetFillMode();
350     sal_Bool            IsAnyFillMode()             { return nFillMode != SC_FILL_NONE; }
351     sal_Bool            IsFillMode()                { return nFillMode == SC_FILL_FILL; }
352     sal_uInt8           GetFillMode()               { return nFillMode; }
353 
354                     // TRUE: Zelle ist zusammengefasst
355     sal_Bool            GetMergeSizePixel( SCCOL nX, SCROW nY, long& rSizeXPix, long& rSizeYPix );
356     sal_Bool            GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich,
357                                         SCsCOL& rPosX, SCsROW& rPosY,
358                                         sal_Bool bTestMerge = sal_True, sal_Bool bRepair = sal_False,
359                                         sal_Bool bNextIfLarge = sal_True );
360     void            GetMouseQuadrant( const Point& rClickPos, ScSplitPos eWhich,
361                                         SCsCOL nPosX, SCsROW nPosY, sal_Bool& rLeft, sal_Bool& rTop );
362 
363     sal_Bool            IsRefMode() const                       { return bIsRefMode; }
364     ScRefType       GetRefType() const                      { return eRefType; }
365     SCCOL           GetRefStartX() const                    { return nRefStartX; }
366     SCROW           GetRefStartY() const                    { return nRefStartY; }
367     SCTAB           GetRefStartZ() const                    { return nRefStartZ; }
368     SCCOL           GetRefEndX() const                      { return nRefEndX; }
369     SCROW           GetRefEndY() const                      { return nRefEndY; }
370     SCTAB           GetRefEndZ() const                      { return nRefEndZ; }
371 
372     void            SetRefMode( sal_Bool bNewMode, ScRefType eNewType )
373                                     { bIsRefMode = bNewMode; eRefType = eNewType; }
374 
375     void            SetRefStart( SCCOL nNewX, SCROW nNewY, SCTAB nNewZ )
376                             { nRefStartX = nNewX; nRefStartY = nNewY; nRefStartZ = nNewZ; }
377     void            SetRefEnd( SCCOL nNewX, SCROW nNewY, SCTAB nNewZ )
378                             { nRefEndX = nNewX; nRefEndY = nNewY; nRefEndZ = nNewZ; }
379 
380     void            ResetDelMark()                          { bDelMarkValid = sal_False; }
381     void            SetDelMark( const ScRange& rRange )
382                             { aDelRange = rRange; bDelMarkValid = sal_True; }
383 
384     sal_Bool            GetDelMark( ScRange& rRange ) const
385                             { rRange = aDelRange; return bDelMarkValid; }
386 
387     inline void     GetMoveCursor( SCCOL& rCurX, SCROW& rCurY );
388 
389     const ScViewOptions&    GetOptions() const { return *pOptions; }
390     void                    SetOptions( const ScViewOptions& rOpt );
391 
392     sal_Bool    IsGridMode      () const            { return pOptions->GetOption( VOPT_GRID ); }
393     void    SetGridMode     ( sal_Bool bNewMode )   { pOptions->SetOption( VOPT_GRID, bNewMode ); }
394     sal_Bool    IsSyntaxMode    () const            { return pOptions->GetOption( VOPT_SYNTAX ); }
395     void    SetSyntaxMode   ( sal_Bool bNewMode )   { pOptions->SetOption( VOPT_SYNTAX, bNewMode ); }
396     sal_Bool    IsHeaderMode    () const            { return pOptions->GetOption( VOPT_HEADER ); }
397     void    SetHeaderMode   ( sal_Bool bNewMode )   { pOptions->SetOption( VOPT_HEADER, bNewMode ); }
398     sal_Bool    IsTabMode       () const            { return pOptions->GetOption( VOPT_TABCONTROLS ); }
399     void    SetTabMode      ( sal_Bool bNewMode )   { pOptions->SetOption( VOPT_TABCONTROLS, bNewMode ); }
400     sal_Bool    IsVScrollMode   () const            { return pOptions->GetOption( VOPT_VSCROLL ); }
401     void    SetVScrollMode  ( sal_Bool bNewMode )   { pOptions->SetOption( VOPT_VSCROLL, bNewMode ); }
402     sal_Bool    IsHScrollMode   () const            { return pOptions->GetOption( VOPT_HSCROLL ); }
403     void    SetHScrollMode  ( sal_Bool bNewMode )   { pOptions->SetOption( VOPT_HSCROLL, bNewMode ); }
404     sal_Bool    IsOutlineMode   () const            { return pOptions->GetOption( VOPT_OUTLINER ); }
405     void    SetOutlineMode  ( sal_Bool bNewMode )   { pOptions->SetOption( VOPT_OUTLINER, bNewMode ); }
406 
407     void            KillEditView();
408     void            ResetEditView();
409     void            SetEditEngine( ScSplitPos eWhich,
410                                     ScEditEngineDefaulter* pNewEngine,
411                                     Window* pWin, SCCOL nNewX, SCROW nNewY );
412     void            GetEditView( ScSplitPos eWhich, EditView*& rViewPtr, SCCOL& rCol, SCROW& rRow );
413     sal_Bool            HasEditView( ScSplitPos eWhich ) const
414                                         { return pEditView[eWhich] && bEditActive[eWhich]; }
415     EditView*       GetEditView( ScSplitPos eWhich ) const
416                                         { return pEditView[eWhich]; }
417 
418     void            EditGrowX();
419     void            EditGrowY( sal_Bool bInitial = sal_False );
420 
421     ScSplitPos      GetEditActivePart() const       { return eEditActivePart; }
422     SCCOL           GetEditViewCol() const          { return nEditCol; }
423     SCROW           GetEditViewRow() const          { return nEditRow; }
424     SCCOL           GetEditStartCol() const         { return nEditStartCol; }
425     SCROW           GetEditStartRow() const         { return nEditRow; }        // never editing above the cell
426     SCCOL           GetEditEndCol() const           { return nEditEndCol; }
427     SCROW           GetEditEndRow() const           { return nEditEndRow; }
428 
429     Rectangle       GetEditArea( ScSplitPos eWhich, SCCOL nPosX, SCROW nPosY, Window* pWin,
430                                     const ScPatternAttr* pPattern, sal_Bool bForceToTop );
431 
432     void            SetTabNo( SCTAB nNewTab );
433     void            SetActivePart( ScSplitPos eNewActive );
434 
435     Point           GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
436                                 sal_Bool bAllowNeg = sal_False ) const;
437     Point           GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScHSplitPos eWhich ) const;
438     Point           GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScVSplitPos eWhich ) const;
439 
440     SCCOL           CellsAtX( SCsCOL nPosX, SCsCOL nDir, ScHSplitPos eWhichX, sal_uInt16 nScrSizeY = SC_SIZE_NONE ) const;
441     SCROW           CellsAtY( SCsROW nPosY, SCsROW nDir, ScVSplitPos eWhichY, sal_uInt16 nScrSizeX = SC_SIZE_NONE ) const;
442 
443     SCCOL           VisibleCellsX( ScHSplitPos eWhichX ) const;     // angezeigte komplette Zellen
444     SCROW           VisibleCellsY( ScVSplitPos eWhichY ) const;
445     SCCOL           PrevCellsX( ScHSplitPos eWhichX ) const;        // Zellen auf der vorgehenden Seite
446     SCROW           PrevCellsY( ScVSplitPos eWhichY ) const;
447 //UNUSED2008-05  SCCOL           LastCellsX( ScHSplitPos eWhichX ) const;        // Zellen auf der letzten Seite
448 //UNUSED2008-05  SCROW           LastCellsY( ScVSplitPos eWhichY ) const;
449 
450     sal_Bool            IsOle();
451 //UNUSED2008-05  void            UpdateOle( ScSplitPos eWhich );
452     void            SetScreen( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
453     void            SetScreen( const Rectangle& rVisArea );
454     void            SetScreenPos( const Point& rVisAreaStart );
455 
456     void            UpdateScreenZoom( const Fraction& rNewX, const Fraction& rNewY );
457 
458     Size            GetScrSize() const              { return aScrSize; }
459 
460     void            RecalcPixPos();
461     Point           GetPixPos( ScSplitPos eWhich ) const
462                     { return Point( pThisTab->nPixPosX[WhichH(eWhich)],
463                                     pThisTab->nPixPosY[WhichV(eWhich)] ); }
464     void            SetSpellingView( EditView* pSpView) { pSpellingView = pSpView; }
465     EditView*       GetSpellingView() const { return pSpellingView; }
466 
467     void            UpdateOutlinerFlags( Outliner& rOutl ) const;
468 
469     Point           GetMousePosPixel();
470 
471     sal_Bool            UpdateFixX(SCTAB nTab = MAXTAB+1);
472     sal_Bool            UpdateFixY(SCTAB nTab = MAXTAB+1);
473 
474     SCCOL           GetTabStartCol() const          { return nTabStartCol; }
475     void            SetTabStartCol(SCCOL nNew)      { nTabStartCol = nNew; }
476 
477     ScAddress       GetCurPos() const;
478 
479     const Size&     GetScenButSize() const              { return aScenButSize; }
480     void            SetScenButSize(const Size& rNew)    { aScenButSize = rNew; }
481 
482     sal_Bool            IsSelCtrlMouseClick() { return bSelCtrlMouseClick; }
483 
484     static inline long ToPixel( sal_uInt16 nTwips, double nFactor );
485 
486     /** while (rScrY <= nEndPixels && rPosY <= nEndRow) add pixels of row
487         heights converted with nPPTY to rScrY, optimized for row height
488         segments. Upon return rPosY is the last row evaluated <= nEndRow, rScrY
489         may be > nEndPixels!
490      */
491     static void     AddPixelsWhile( long & rScrY, long nEndPixels,
492                                     SCROW & rPosY, SCROW nEndRow, double nPPTY,
493                                     const ScDocument * pDoc, SCTAB nTabNo );
494 
495     /** while (rScrY <= nEndPixels && rPosY >= nStartRow) add pixels of row
496         heights converted with nPPTY to rScrY, optimized for row height
497         segments. Upon return rPosY is the last row evaluated >= nStartRow,
498         rScrY may be > nEndPixels!
499      */
500     static void     AddPixelsWhileBackward( long & rScrY, long nEndPixels,
501                                     SCROW & rPosY, SCROW nStartRow, double nPPTY,
502                                     const ScDocument * pDoc, SCTAB nTabNo );
503 };
504 
505 
506 // ---------------------------------------------------------------------------
507 
508 inline long ScViewData::ToPixel( sal_uInt16 nTwips, double nFactor )
509 {
510     long nRet = (long)( nTwips * nFactor );
511     if ( !nRet && nTwips )
512         nRet = 1;
513     return nRet;
514 }
515 
516 inline void ScViewData::GetMoveCursor( SCCOL& rCurX, SCROW& rCurY )
517 {
518     if ( bIsRefMode )
519     {
520         rCurX = nRefEndX;
521         rCurY = nRefEndY;
522     }
523     else
524     {
525         rCurX = GetCurX();
526         rCurY = GetCurY();
527     }
528 }
529 
530 inline ScHSplitPos WhichH( ScSplitPos ePos )
531 {
532     return (ePos==SC_SPLIT_TOPLEFT || ePos==SC_SPLIT_BOTTOMLEFT) ?
533                 SC_SPLIT_LEFT : SC_SPLIT_RIGHT;
534 }
535 
536 inline ScVSplitPos WhichV( ScSplitPos ePos )
537 {
538     return (ePos==SC_SPLIT_TOPLEFT || ePos==SC_SPLIT_TOPRIGHT) ?
539                 SC_SPLIT_TOP : SC_SPLIT_BOTTOM;
540 }
541 
542 inline ScSplitPos Which( ScHSplitPos eHPos )
543 {
544     return (eHPos==SC_SPLIT_LEFT) ?
545                 SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT;
546 }
547 
548 inline ScSplitPos Which( ScVSplitPos eVPos )
549 {
550     return (eVPos==SC_SPLIT_TOP) ?
551                 SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT;
552 }
553 
554 
555 
556 #endif
557 
558