summaryrefslogtreecommitdiff
path: root/sc/source/ui/view
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/view')
-rw-r--r--sc/source/ui/view/cellsh.cxx8
-rw-r--r--sc/source/ui/view/colrowba.cxx6
-rwxr-xr-xsc/source/ui/view/dbfunc3.cxx3
-rw-r--r--sc/source/ui/view/drawutil.cxx27
-rw-r--r--sc/source/ui/view/drawvie4.cxx4
-rw-r--r--sc/source/ui/view/drawview.cxx6
-rw-r--r--sc/source/ui/view/gridwin.cxx99
-rw-r--r--sc/source/ui/view/gridwin2.cxx12
-rw-r--r--sc/source/ui/view/gridwin3.cxx2
-rw-r--r--sc/source/ui/view/gridwin4.cxx16
-rw-r--r--sc/source/ui/view/hdrcont.cxx2
-rw-r--r--sc/source/ui/view/makefile.mk1
-rw-r--r--sc/source/ui/view/olinewin.cxx9
-rw-r--r--sc/source/ui/view/output.cxx53
-rw-r--r--sc/source/ui/view/output2.cxx34
-rw-r--r--sc/source/ui/view/prevloc.cxx96
-rw-r--r--sc/source/ui/view/printfun.cxx177
-rw-r--r--sc/source/ui/view/scextopt.cxx1
-rw-r--r--sc/source/ui/view/select.cxx9
-rw-r--r--sc/source/ui/view/tabcont.cxx38
-rw-r--r--sc/source/ui/view/tabview.cxx6
-rw-r--r--sc/source/ui/view/tabview2.cxx15
-rw-r--r--sc/source/ui/view/tabview3.cxx17
-rw-r--r--sc/source/ui/view/tabview5.cxx4
-rw-r--r--sc/source/ui/view/tabvwshe.cxx17
-rw-r--r--sc/source/ui/view/tabvwshf.cxx159
-rw-r--r--sc/source/ui/view/viewdata.cxx59
-rw-r--r--sc/source/ui/view/viewfun2.cxx25
-rw-r--r--sc/source/ui/view/viewfun3.cxx8
-rw-r--r--sc/source/ui/view/viewfun5.cxx2
-rw-r--r--sc/source/ui/view/viewfunc.cxx32
-rw-r--r--sc/source/ui/view/viewutil.cxx34
32 files changed, 656 insertions, 325 deletions
diff --git a/sc/source/ui/view/cellsh.cxx b/sc/source/ui/view/cellsh.cxx
index a461c54f255e..c880a29f8067 100644
--- a/sc/source/ui/view/cellsh.cxx
+++ b/sc/source/ui/view/cellsh.cxx
@@ -715,22 +715,22 @@ void ScCellShell::GetState(SfxItemSet &rSet)
break;
case FID_INS_ROWBRK:
- if ( nPosY==0 || (pDoc->GetRowFlags(nPosY,nTab) & CR_MANUALBREAK) )
+ if ( nPosY==0 || (pDoc->HasRowBreak(nPosY, nTab) & BREAK_MANUAL) )
rSet.DisableItem( nWhich );
break;
case FID_INS_COLBRK:
- if ( nPosX==0 || (pDoc->GetColFlags(nPosX,nTab) & CR_MANUALBREAK) )
+ if ( nPosX==0 || (pDoc->HasColBreak(nPosX, nTab) & BREAK_MANUAL) )
rSet.DisableItem( nWhich );
break;
case FID_DEL_ROWBRK:
- if ( nPosY==0 || (pDoc->GetRowFlags(nPosY,nTab) & CR_MANUALBREAK)==0 )
+ if ( nPosY==0 || (pDoc->HasRowBreak(nPosY, nTab) & BREAK_MANUAL) == 0 )
rSet.DisableItem( nWhich );
break;
case FID_DEL_COLBRK:
- if ( nPosX==0 || (pDoc->GetColFlags(nPosX,nTab) & CR_MANUALBREAK)==0 )
+ if ( nPosX==0 || (pDoc->HasColBreak(nPosX, nTab) & BREAK_MANUAL) == 0 )
rSet.DisableItem( nWhich );
break;
diff --git a/sc/source/ui/view/colrowba.cxx b/sc/source/ui/view/colrowba.cxx
index 8916624fdb52..d802c08f642f 100644
--- a/sc/source/ui/view/colrowba.cxx
+++ b/sc/source/ui/view/colrowba.cxx
@@ -98,7 +98,8 @@ USHORT ScColBar::GetEntrySize( SCCOLROW nEntryNo )
{
ScDocument* pDoc = pViewData->GetDocument();
SCTAB nTab = pViewData->GetTabNo();
- if ( pDoc->GetColFlags( static_cast<SCCOL>(nEntryNo), nTab ) & CR_HIDDEN )
+ SCCOL nLastCol = -1;
+ if (pDoc->ColHidden(static_cast<SCCOL>(nEntryNo), nTab, nLastCol))
return 0;
else
return (USHORT) ScViewData::ToPixel( pDoc->GetColWidth( static_cast<SCCOL>(nEntryNo), nTab ), pViewData->GetPPTX() );
@@ -265,7 +266,8 @@ USHORT ScRowBar::GetEntrySize( SCCOLROW nEntryNo )
{
ScDocument* pDoc = pViewData->GetDocument();
SCTAB nTab = pViewData->GetTabNo();
- if ( pDoc->GetRowFlags( nEntryNo, nTab ) & CR_HIDDEN )
+ SCROW nLastRow = -1;
+ if (pDoc->RowHidden(nEntryNo, nTab, nLastRow))
return 0;
else
return (USHORT) ScViewData::ToPixel( pDoc->GetOriginalHeight( nEntryNo,
diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx
index 35befa8f7a36..dbdeae1ae0b1 100755
--- a/sc/source/ui/view/dbfunc3.cxx
+++ b/sc/source/ui/view/dbfunc3.cxx
@@ -694,6 +694,9 @@ ULONG RefreshDPObject( ScDPObject *pDPObj, ScDocument *pDoc, ScDocShell *pDocSh,
if( !pDPObj )
return STR_PIVOT_NOTFOUND;
+ if ( pDocSh && !pDoc )
+ pDoc = pDocSh->GetDocument();
+
if( !pDoc )
return static_cast<ULONG>(-1);
diff --git a/sc/source/ui/view/drawutil.cxx b/sc/source/ui/view/drawutil.cxx
index 3885b0adc752..ba250767c169 100644
--- a/sc/source/ui/view/drawutil.cxx
+++ b/sc/source/ui/view/drawutil.cxx
@@ -66,14 +66,19 @@ void ScDrawUtil::CalcScale( ScDocument* pDoc, SCTAB nTab,
nTwipsX += (long) nWidth;
nPixelX += ScViewData::ToPixel( nWidth, nPPTX );
}
- ScCoupledCompressedArrayIterator< SCROW, BYTE, USHORT> aIter(
- pDoc->GetRowFlagsArray( nTab), nStartRow, nEndRow-1, CR_HIDDEN, 0,
- pDoc->GetRowHeightArray( nTab));
- for ( ; aIter; ++aIter )
+
+ for (SCROW nRow = nStartRow; nRow <= nEndRow-1; ++nRow)
{
- USHORT nHeight = *aIter;
- nTwipsY += (long) nHeight;
- nPixelY += ScViewData::ToPixel( nHeight, nPPTY );
+ SCROW nLastRow = nRow;
+ if (pDoc->RowHidden(nRow, nTab, NULL, &nLastRow))
+ {
+ nRow = nLastRow;
+ continue;
+ }
+
+ USHORT nHeight = pDoc->GetRowHeight(nRow, nTab);
+ nTwipsY += static_cast<long>(nHeight);
+ nPixelY += ScViewData::ToPixel(nHeight, nPPTY);
}
MapMode aHMMMode( MAP_100TH_MM, Point(), rZoomX, rZoomY );
@@ -100,10 +105,10 @@ void ScDrawUtil::CalcScale( ScDocument* pDoc, SCTAB nTab,
else
rScaleY = Fraction( 1, 1 );
- // 17 bits of accuracy are needed to always hit the right part of
- // cells in the last rows
- rScaleX.ReduceInaccurate( 17 );
- rScaleY.ReduceInaccurate( 17 );
+ // 25 bits of accuracy are needed to always hit the right part of
+ // cells in the last rows (was 17 before 1M rows).
+ rScaleX.ReduceInaccurate( 25 );
+ rScaleY.ReduceInaccurate( 25 );
}
diff --git a/sc/source/ui/view/drawvie4.cxx b/sc/source/ui/view/drawvie4.cxx
index 8b9debdabfae..3a28096d2853 100644
--- a/sc/source/ui/view/drawvie4.cxx
+++ b/sc/source/ui/view/drawvie4.cxx
@@ -282,8 +282,8 @@ void ScDrawView::CalcNormScale( Fraction& rFractX, Fraction& rFractY ) const
pDoc->GetTableArea( nTab, nEndCol, nEndRow );
if (nEndCol<20)
nEndCol = 20;
- if (nEndRow<20)
- nEndRow = 20;
+ if (nEndRow<1000)
+ nEndRow = 1000;
Fraction aZoom(1,1);
ScDrawUtil::CalcScale( pDoc, nTab, 0,0, nEndCol,nEndRow, pDev, aZoom,aZoom,
diff --git a/sc/source/ui/view/drawview.cxx b/sc/source/ui/view/drawview.cxx
index cc09722530ad..1d2b797b3a9b 100644
--- a/sc/source/ui/view/drawview.cxx
+++ b/sc/source/ui/view/drawview.cxx
@@ -187,7 +187,7 @@ void ScDrawView::AddCustomHdl()
if(nCol > 0)
--nCol;
- SCROW nRow = nPosY <= 0 ? 0 : pDoc->FastGetRowForHeight( nTab,
+ SCROW nRow = nPosY <= 0 ? 0 : pDoc->GetRowForHeight( nTab,
(ULONG) nPosY);
if(nRow > 0)
--nRow;
@@ -376,8 +376,8 @@ void ScDrawView::RecalcScale()
pDoc->GetTableArea( nTab, nEndCol, nEndRow );
if (nEndCol<20)
nEndCol = 20;
- if (nEndRow<20)
- nEndRow = 20;
+ if (nEndRow<1000)
+ nEndRow = 1000;
ScDrawUtil::CalcScale( pDoc, nTab, 0,0, nEndCol,nEndRow, pDev,aZoomX,aZoomY,nPPTX,nPPTY,
aScaleX,aScaleY );
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 87740a88e4df..db72d87f30a2 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -153,7 +153,19 @@ extern USHORT nScFillModeMouseModifier; // global.cxx
#define SC_FILTERLISTBOX_LINES 12
-//==================================================================
+// ============================================================================
+
+ScGridWindow::VisibleRange::VisibleRange() :
+ mnCol1(0), mnCol2(MAXCOL), mnRow1(0), mnRow2(MAXROW)
+{
+}
+
+bool ScGridWindow::VisibleRange::isInside(SCCOL nCol, SCROW nRow) const
+{
+ return mnCol1 <= nCol && nCol <= mnCol2 && mnRow1 <= nRow && nRow <= mnRow2;
+}
+
+// ============================================================================
class ScFilterListBox : public ListBox
{
@@ -366,6 +378,7 @@ ScGridWindow::ScGridWindow( Window* pParent, ScViewData* pData, ScSplitPos eWhic
mpOODragRect( NULL ),
mpOOHeader( NULL ),
mpOOShrink( NULL ),
+ mpAutoFillRect(static_cast<Rectangle*>(NULL)),
pViewData( pData ),
eWhich( eWhichPos ),
pNoteMarker( NULL ),
@@ -1323,37 +1336,23 @@ BOOL ScGridWindow::TestMouse( const MouseEvent& rMEvt, BOOL bAction )
ScDocument* pDoc = pViewData->GetDocument();
SCTAB nTab = pViewData->GetTabNo();
BOOL bLayoutRTL = pDoc->IsLayoutRTL( nTab );
- long nLayoutSign = bLayoutRTL ? -1 : 1;
// Auto-Fill
ScRange aMarkRange;
if (pViewData->GetSimpleArea( aMarkRange ) == SC_MARK_SIMPLE)
{
- if ( aMarkRange.aStart.Tab() == pViewData->GetTabNo() )
+ if (aMarkRange.aStart.Tab() == pViewData->GetTabNo() && mpAutoFillRect)
{
- // Block-Ende wie in DrawAutoFillMark
- SCCOL nX = aMarkRange.aEnd.Col();
- SCROW nY = aMarkRange.aEnd.Row();
-
- Point aFillPos = pViewData->GetScrPos( nX, nY, eWhich, TRUE );
- long nSizeXPix;
- long nSizeYPix;
- pViewData->GetMergeSizePixel( nX, nY, nSizeXPix, nSizeYPix );
- aFillPos.X() += nSizeXPix * nLayoutSign;
- aFillPos.Y() += nSizeYPix;
- if ( bLayoutRTL )
- aFillPos.X() -= 1;
-
Point aMousePos = rMEvt.GetPosPixel();
- // Abfrage hier passend zu DrawAutoFillMark
- // (ein Pixel mehr als markiert)
- if ( aMousePos.X() >= aFillPos.X()-3 && aMousePos.X() <= aFillPos.X()+4 &&
- aMousePos.Y() >= aFillPos.Y()-3 && aMousePos.Y() <= aFillPos.Y()+4 )
+ if (mpAutoFillRect->IsInside(aMousePos))
{
SetPointer( Pointer( POINTER_CROSS ) ); //! dickeres Kreuz ?
if (bAction)
{
+ SCCOL nX = aMarkRange.aEnd.Col();
+ SCROW nY = aMarkRange.aEnd.Row();
+
if ( lcl_IsEditableMatrix( pViewData->GetDocument(), aMarkRange ) )
pViewData->SetDragMode(
aMarkRange.aStart.Col(), aMarkRange.aStart.Row(), nX, nY, SC_FILL_MATRIX );
@@ -2405,6 +2404,7 @@ void lcl_InitMouseEvent( ::com::sun::star::awt::MouseEvent& rEvent, const MouseE
long ScGridWindow::PreNotify( NotifyEvent& rNEvt )
{
+ bool bDone = false;
USHORT nType = rNEvt.GetType();
if ( nType == EVENT_MOUSEBUTTONUP || nType == EVENT_MOUSEBUTTONDOWN )
{
@@ -2425,16 +2425,31 @@ long ScGridWindow::PreNotify( NotifyEvent& rNEvt )
if ( rNEvt.GetWindow() )
aEvent.Source = rNEvt.GetWindow()->GetComponentInterface();
if ( nType == EVENT_MOUSEBUTTONDOWN)
- pImp->MousePressed( aEvent );
+ bDone = pImp->MousePressed( aEvent );
else
- pImp->MouseReleased( aEvent );
+ bDone = pImp->MouseReleased( aEvent );
}
}
}
}
}
+ if (bDone) // event consumed by a listener
+ {
+ if ( nType == EVENT_MOUSEBUTTONDOWN )
+ {
+ const MouseEvent* pMouseEvent = rNEvt.GetMouseEvent();
+ if ( pMouseEvent->IsRight() && pMouseEvent->GetClicks() == 1 )
+ {
+ // If a listener returned true for a right-click call, also prevent opening the context menu
+ // (this works only if the context menu is opened on mouse-down)
+ nMouseStatus = SC_GM_IGNORE;
+ }
+ }
- return Window::PreNotify( rNEvt );
+ return 1;
+ }
+ else
+ return Window::PreNotify( rNEvt );
}
void ScGridWindow::Tracking( const TrackingEvent& rTEvt )
@@ -2678,6 +2693,10 @@ void __EXPORT ScGridWindow::Command( const CommandEvent& rCEvt )
if ( nCmd == COMMAND_CONTEXTMENU && !SC_MOD()->GetIsWaterCan() )
{
+ BOOL bMouse = rCEvt.IsMouseEvent();
+ if ( bMouse && nMouseStatus == SC_GM_IGNORE )
+ return;
+
if (pViewData->IsAnyFillMode())
{
pViewData->GetView()->StopRefMode();
@@ -2688,7 +2707,6 @@ void __EXPORT ScGridWindow::Command( const CommandEvent& rCEvt )
Point aPosPixel = rCEvt.GetMousePosPixel();
Point aMenuPos = aPosPixel;
- BOOL bMouse = rCEvt.IsMouseEvent();
if ( bMouse )
{
@@ -2934,7 +2952,7 @@ void ScGridWindow::SelectForContextMenu( const Point& rPosPixel, SCsCOL nCellX,
// clicked on selected object -> don't change anything
bHitSelected = TRUE;
}
- else if ( pViewData->GetMarkData().IsCellMarked( (USHORT) nCellX, (USHORT) nCellY ) )
+ else if ( pViewData->GetMarkData().IsCellMarked(nCellX, nCellY) )
{
// clicked on selected cell -> don't change anything
bHitSelected = TRUE;
@@ -2958,7 +2976,7 @@ void ScGridWindow::SelectForContextMenu( const Point& rPosPixel, SCsCOL nCellX,
if ( !bHitDraw )
{
pView->Unmark();
- pView->SetCursor( (USHORT) nCellX, (USHORT) nCellY );
+ pView->SetCursor(nCellX, nCellY);
if ( bWasDraw )
pViewData->GetViewShell()->SetDrawShell( FALSE ); // switch shells
}
@@ -4533,18 +4551,17 @@ void lcl_PaintOneRange( ScDocShell* pDocSh, const ScRange& rRange, USHORT nEdges
SCROW nTmp;
ScDocument* pDoc = pDocSh->GetDocument();
- while ( nCol1 > 0 && ( pDoc->GetColFlags( nCol1, nTab1 ) & CR_HIDDEN ) )
+ while ( nCol1 > 0 && pDoc->ColHidden(nCol1, nTab1) )
{
--nCol1;
bHiddenEdge = TRUE;
}
- while ( nCol2 < MAXCOL && ( pDoc->GetColFlags( nCol2, nTab1 ) & CR_HIDDEN ) )
+ while ( nCol2 < MAXCOL && pDoc->ColHidden(nCol2, nTab1) )
{
++nCol2;
bHiddenEdge = TRUE;
}
- nTmp = pDoc->GetRowFlagsArray( nTab1).GetLastForCondition( 0, nRow1,
- CR_HIDDEN, 0);
+ nTmp = pDoc->FirstVisibleRow(0, nRow1, nTab1);
if (!ValidRow(nTmp))
nTmp = 0;
if (nTmp < nRow1)
@@ -4552,8 +4569,7 @@ void lcl_PaintOneRange( ScDocShell* pDocSh, const ScRange& rRange, USHORT nEdges
nRow1 = nTmp;
bHiddenEdge = TRUE;
}
- nTmp = pDoc->GetRowFlagsArray( nTab1).GetFirstForCondition( nRow2, MAXROW,
- CR_HIDDEN, 0);
+ nTmp = pDoc->FirstVisibleRow(nRow2, MAXROW, nTab1);
if (!ValidRow(nTmp))
nTmp = MAXROW;
if (nTmp > nRow2)
@@ -5123,6 +5139,9 @@ void ScGridWindow::UpdateCursorOverlay()
SCCOL nX = pViewData->GetCurX();
SCROW nY = pViewData->GetCurY();
+ if (!maVisibleRange.isInside(nX, nY))
+ return;
+
// don't show the cursor in overlapped cells
ScDocument* pDoc = pViewData->GetDocument();
@@ -5298,6 +5317,7 @@ void ScGridWindow::UpdateSelectionOverlay()
void ScGridWindow::DeleteAutoFillOverlay()
{
DELETEZ( mpOOAutoFill );
+ mpAutoFillRect.reset();
}
void ScGridWindow::UpdateAutoFillOverlay()
@@ -5318,6 +5338,11 @@ void ScGridWindow::UpdateAutoFillOverlay()
{
SCCOL nX = aAutoMarkPos.Col();
SCROW nY = aAutoMarkPos.Row();
+
+ if (!maVisibleRange.isInside(nX, nY))
+ // Autofill mark is not visible. Bail out.
+ return;
+
SCTAB nTab = pViewData->GetTabNo();
ScDocument* pDoc = pViewData->GetDocument();
BOOL bLayoutRTL = pDoc->IsLayoutRTL( nTab );
@@ -5333,7 +5358,7 @@ void ScGridWindow::UpdateAutoFillOverlay()
aFillPos.Y() += nSizeYPix;
aFillPos.Y() -= 2;
- Rectangle aFillRect( aFillPos, Size(6,6) );
+ mpAutoFillRect.reset(new Rectangle(aFillPos, Size(6, 6)));
// #i70788# get the OverlayManager safely
::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
@@ -5343,7 +5368,7 @@ void ScGridWindow::UpdateAutoFillOverlay()
const Color aHandleColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
std::vector< basegfx::B2DRange > aRanges;
const basegfx::B2DHomMatrix aTransform(GetInverseViewTransformation());
- basegfx::B2DRange aRB(aFillRect.Left(), aFillRect.Top(), aFillRect.Right() + 1, aFillRect.Bottom() + 1);
+ basegfx::B2DRange aRB(mpAutoFillRect->Left(), mpAutoFillRect->Top(), mpAutoFillRect->Right() + 1, mpAutoFillRect->Bottom() + 1);
aRB.transform(aTransform);
aRanges.push_back(aRB);
@@ -5358,10 +5383,10 @@ void ScGridWindow::UpdateAutoFillOverlay()
mpOOAutoFill = new ::sdr::overlay::OverlayObjectList;
mpOOAutoFill->append(*pOverlay);
}
- }
- if ( aOldMode != aDrawMode )
- SetMapMode( aOldMode );
+ if ( aOldMode != aDrawMode )
+ SetMapMode( aOldMode );
+ }
}
void ScGridWindow::DeleteDragRectOverlay()
diff --git a/sc/source/ui/view/gridwin2.cxx b/sc/source/ui/view/gridwin2.cxx
index 6d9bb94eb76b..f8b5c25c4a70 100644
--- a/sc/source/ui/view/gridwin2.cxx
+++ b/sc/source/ui/view/gridwin2.cxx
@@ -933,7 +933,7 @@ void ScGridWindow::PagebreakMove( const MouseEvent& rMEvt, BOOL bUp )
BOOL bGrow = !bHide && nNew > nPagebreakBreak;
if ( bColumn )
{
- if ( pDoc->GetColFlags( static_cast<SCCOL>(nPagebreakBreak), nTab ) & CR_MANUALBREAK )
+ if (pDoc->HasColBreak(static_cast<SCCOL>(nPagebreakBreak), nTab) & BREAK_MANUAL)
{
ScAddress aOldAddr( static_cast<SCCOL>(nPagebreakBreak), nPosY, nTab );
pViewFunc->DeletePageBreak( TRUE, TRUE, &aOldAddr, FALSE );
@@ -946,8 +946,8 @@ void ScGridWindow::PagebreakMove( const MouseEvent& rMEvt, BOOL bUp )
if ( bGrow )
{
// vorigen Break auf hart, und Skalierung aendern
- if ( static_cast<SCCOL>(nPagebreakPrev) > aPagebreakSource.aStart.Col() &&
- !(pDoc->GetColFlags( static_cast<SCCOL>(nPagebreakPrev), nTab ) & CR_MANUALBREAK) )
+ bool bManualBreak = (pDoc->HasColBreak(static_cast<SCCOL>(nPagebreakPrev), nTab) & BREAK_MANUAL);
+ if ( static_cast<SCCOL>(nPagebreakPrev) > aPagebreakSource.aStart.Col() && !bManualBreak )
{
ScAddress aPrev( static_cast<SCCOL>(nPagebreakPrev), nPosY, nTab );
pViewFunc->InsertPageBreak( TRUE, TRUE, &aPrev, FALSE );
@@ -960,7 +960,7 @@ void ScGridWindow::PagebreakMove( const MouseEvent& rMEvt, BOOL bUp )
}
else
{
- if ( pDoc->GetRowFlags( nPagebreakBreak, nTab ) & CR_MANUALBREAK )
+ if (pDoc->HasRowBreak(nPagebreakBreak, nTab) & BREAK_MANUAL)
{
ScAddress aOldAddr( nPosX, nPagebreakBreak, nTab );
pViewFunc->DeletePageBreak( FALSE, TRUE, &aOldAddr, FALSE );
@@ -973,8 +973,8 @@ void ScGridWindow::PagebreakMove( const MouseEvent& rMEvt, BOOL bUp )
if ( bGrow )
{
// vorigen Break auf hart, und Skalierung aendern
- if ( nPagebreakPrev > aPagebreakSource.aStart.Row() &&
- !(pDoc->GetRowFlags( nPagebreakPrev, nTab ) & CR_MANUALBREAK) )
+ bool bManualBreak = (pDoc->HasRowBreak(nPagebreakPrev, nTab) & BREAK_MANUAL);
+ if ( nPagebreakPrev > aPagebreakSource.aStart.Row() && !bManualBreak )
{
ScAddress aPrev( nPosX, nPagebreakPrev, nTab );
pViewFunc->InsertPageBreak( FALSE, TRUE, &aPrev, FALSE );
diff --git a/sc/source/ui/view/gridwin3.cxx b/sc/source/ui/view/gridwin3.cxx
index 5bfc0483b553..f16c2fe1ada7 100644
--- a/sc/source/ui/view/gridwin3.cxx
+++ b/sc/source/ui/view/gridwin3.cxx
@@ -265,7 +265,7 @@ MapMode ScGridWindow::GetDrawMapMode( BOOL bForce )
SCROW nEndRow = 0;
pDoc->GetTableArea( nTab, nEndCol, nEndRow );
if (nEndCol<20) nEndCol = 20;
- if (nEndRow<20) nEndRow = 20;
+ if (nEndRow<1000) nEndRow = 1000;
ScDrawUtil::CalcScale( pDoc, nTab, 0,0, nEndCol,nEndRow, this,
pViewData->GetZoomX(),pViewData->GetZoomY(),
pViewData->GetPPTX(),pViewData->GetPPTY(),
diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index f698913ea758..d8024e439173 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -449,6 +449,12 @@ void ScGridWindow::Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, ScUpdateMod
SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich);
if (nYBottom > MAXROW) nYBottom = MAXROW;
+ // Store the current visible range.
+ maVisibleRange.mnCol1 = nPosX;
+ maVisibleRange.mnCol2 = nXRight;
+ maVisibleRange.mnRow1 = nPosY;
+ maVisibleRange.mnRow2 = nYBottom;
+
if (nX1 > nXRight || nY1 > nYBottom)
return; // unsichtbar
if (nX2 > nXRight) nX2 = nXRight;
@@ -1086,7 +1092,7 @@ void ScGridWindow::DrawPagePreview( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
if ( nBreak >= nX1 && nBreak <= nX2+1 )
{
//! hidden suchen
- if ( pDoc->GetColFlags( nBreak, nTab ) & CR_MANUALBREAK )
+ if (pDoc->HasColBreak(nBreak, nTab) & BREAK_MANUAL)
pContentDev->SetFillColor( aManual );
else
pContentDev->SetFillColor( aAutomatic );
@@ -1105,7 +1111,7 @@ void ScGridWindow::DrawPagePreview( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
if ( nBreak >= nY1 && nBreak <= nY2+1 )
{
//! hidden suchen
- if ( pDoc->GetRowFlags( nBreak, nTab ) & CR_MANUALBREAK )
+ if (pDoc->HasRowBreak(nBreak, nTab) & BREAK_MANUAL)
pContentDev->SetFillColor( aManual );
else
pContentDev->SetFillColor( aAutomatic );
@@ -1374,7 +1380,7 @@ Rectangle ScGridWindow::GetListValButtonRect( const ScAddress& rButtonPos )
const ScMergeAttr* pMerge = static_cast<const ScMergeAttr*>(pDoc->GetAttr( nCol,nRow,nTab, ATTR_MERGE ));
if ( pMerge->GetColMerge() > 1 )
nNextCol = nCol + pMerge->GetColMerge(); // next cell after the merged area
- while ( nNextCol <= MAXCOL && (pDoc->GetColFlags( nNextCol, nTab ) & CR_HIDDEN) )
+ while ( nNextCol <= MAXCOL && pDoc->ColHidden(nNextCol, nTab) )
++nNextCol;
BOOL bNextCell = ( nNextCol <= MAXCOL );
if ( bNextCell )
@@ -1577,7 +1583,7 @@ void ScGridWindow::InvertSimple( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
if ( pMergeFlag->IsVerOverlapped() && ( bDoHidden || bFirstRow ) )
{
while ( pMergeFlag->IsVerOverlapped() && nThisY > 0 &&
- ( (pDoc->GetRowFlags( nThisY-1, nTab ) & CR_HIDDEN) || bFirstRow ) )
+ (pDoc->RowHidden(nThisY-1, nTab) || bFirstRow) )
{
--nThisY;
pPattern = pDoc->GetPattern( nX, nThisY, nTab );
@@ -1764,7 +1770,7 @@ void ScGridWindow::GetSelectionRects( ::std::vector< Rectangle >& rPixelRects )
if ( pMergeFlag->IsVerOverlapped() && ( bDoHidden || bFirstRow ) )
{
while ( pMergeFlag->IsVerOverlapped() && nThisY > 0 &&
- ( (pDoc->GetRowFlags( nThisY-1, nTab ) & CR_HIDDEN) || bFirstRow ) )
+ (pDoc->RowHidden(nThisY-1, nTab) || bFirstRow) )
{
--nThisY;
pPattern = pDoc->GetPattern( nX, nThisY, nTab );
diff --git a/sc/source/ui/view/hdrcont.cxx b/sc/source/ui/view/hdrcont.cxx
index 6c389d496b73..25f3c1c8f10a 100644
--- a/sc/source/ui/view/hdrcont.cxx
+++ b/sc/source/ui/view/hdrcont.cxx
@@ -102,7 +102,7 @@ ScHeaderControl::ScHeaderControl( Window* pParent, SelectionEngine* pSelectionEn
nWidth = nSmallWidth = aSize.Width();
nBigWidth = LogicToPixel( Size( GetTextWidth(
- String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("88888")) ), 0 ) ).Width() + 4;
+ String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("8888888")) ), 0 ) ).Width() + 5;
SetBackground(); // sonst Probleme auf OS/2 !?!?!
}
diff --git a/sc/source/ui/view/makefile.mk b/sc/source/ui/view/makefile.mk
index feeacc865fba..1b2fef913fc2 100644
--- a/sc/source/ui/view/makefile.mk
+++ b/sc/source/ui/view/makefile.mk
@@ -155,6 +155,7 @@ EXCEPTIONSFILES= \
$(SLO)$/gridwin2.obj \
$(SLO)$/scextopt.obj \
$(SLO)$/tabvwshb.obj \
+ $(SLO)$/tabvwshf.obj \
$(SLO)$/viewdata.obj \
$(SLO)$/viewfunc.obj \
$(SLO)$/viewfun2.obj \
diff --git a/sc/source/ui/view/olinewin.cxx b/sc/source/ui/view/olinewin.cxx
index bec88920f989..b1e82fd9217f 100644
--- a/sc/source/ui/view/olinewin.cxx
+++ b/sc/source/ui/view/olinewin.cxx
@@ -183,16 +183,15 @@ const ScOutlineEntry* ScOutlineWindow::GetOutlineEntry( size_t nLevel, size_t nE
bool ScOutlineWindow::IsHidden( SCCOLROW nColRowIndex ) const
{
- sal_uInt8 nFlags = mbHoriz ?
- GetDoc().GetColFlags( static_cast<SCCOL>(nColRowIndex), GetTab() ) :
- GetDoc().GetRowFlags( static_cast<SCROW>(nColRowIndex), GetTab() );
- return (nFlags & CR_HIDDEN) != 0;
+ return mbHoriz ?
+ GetDoc().ColHidden(static_cast<SCCOL>(nColRowIndex), GetTab()) :
+ GetDoc().RowHidden(static_cast<SCROW>(nColRowIndex), GetTab());
}
bool ScOutlineWindow::IsFiltered( SCCOLROW nColRowIndex ) const
{
// columns cannot be filtered
- return !mbHoriz && GetDoc().IsFiltered( static_cast<SCROW>(nColRowIndex), GetTab() );
+ return !mbHoriz && GetDoc().RowFiltered( static_cast<SCROW>(nColRowIndex), GetTab() );
}
bool ScOutlineWindow::IsFirstVisible( SCCOLROW nColRowIndex ) const
diff --git a/sc/source/ui/view/output.cxx b/sc/source/ui/view/output.cxx
index 265e54fe0e12..961572fc0185 100644
--- a/sc/source/ui/view/output.cxx
+++ b/sc/source/ui/view/output.cxx
@@ -322,8 +322,9 @@ void ScOutputData::DrawGrid( BOOL bGrid, BOOL bPage )
long nPosX;
long nPosY;
SCSIZE nArrY;
- BYTE nOldFlags = 0;
- BYTE nFlags;
+ ScBreakType nBreak = BREAK_NONE;
+ ScBreakType nBreakOld = BREAK_NONE;
+
BOOL bSingle;
Color aPageColor;
Color aManualColor;
@@ -378,27 +379,27 @@ void ScOutputData::DrawGrid( BOOL bGrid, BOOL bPage )
if ( bPage )
{
// Seitenumbrueche auch in ausgeblendeten suchen
- nFlags = 0;
SCCOL nCol = nXplus1;
while (nCol <= MAXCOL)
{
- BYTE nDocFl = pDoc->GetColFlags( nCol, nTab );
- nFlags = nDocFl & ( CR_PAGEBREAK | CR_MANUALBREAK );
- if ( nFlags || !(nDocFl & CR_HIDDEN) )
+ nBreak = pDoc->HasColBreak(nCol, nTab);
+ bool bHidden = pDoc->ColHidden(nCol, nTab);
+
+ if ( nBreak || !bHidden )
break;
++nCol;
}
- if (nFlags != nOldFlags)
+ if (nBreak != nBreakOld)
{
aGrid.Flush();
- pDev->SetLineColor( (nFlags & CR_MANUALBREAK) ? aManualColor :
- (nFlags) ? aPageColor : aGridColor );
- nOldFlags = nFlags;
+ pDev->SetLineColor( (nBreak & BREAK_MANUAL) ? aManualColor :
+ nBreak ? aPageColor : aGridColor );
+ nBreakOld = nBreak;
}
}
- BOOL bDraw = bGrid || nOldFlags; // einfaches Gitter nur wenn eingestellt
+ BOOL bDraw = bGrid || nBreakOld; // einfaches Gitter nur wenn eingestellt
//! Mit dieser Abfrage wird zuviel weggelassen, wenn ein automatischer
//! Umbruch mitten in den Wiederholungsspalten liegt.
@@ -409,7 +410,7 @@ void ScOutputData::DrawGrid( BOOL bGrid, BOOL bPage )
{
if ( nX == MAXCOL )
bDraw = FALSE;
- else if (pDoc->GetColFlags(nXplus1,nTab) & ( CR_PAGEBREAK | CR_MANUALBREAK ))
+ else if (pDoc->HasColBreak(nXplus1, nTab))
bDraw = FALSE;
}
#endif
@@ -500,28 +501,24 @@ void ScOutputData::DrawGrid( BOOL bGrid, BOOL bPage )
{
if ( bPage )
{
- // Seitenumbrueche auch in ausgeblendeten suchen
- nFlags = 0;
- ScCompressedArrayIterator< SCROW, BYTE > aIter(
- pDoc->GetRowFlagsArray( nTab), nYplus1, MAXROW);
- do
+ for (SCROW i = nYplus1; i <= MAXROW; ++i)
{
- BYTE nDocFl = *aIter;
- nFlags = nDocFl & ( CR_PAGEBREAK | CR_MANUALBREAK );
- if ( nFlags || !(nDocFl & CR_HIDDEN) )
+ nBreak = pDoc->HasRowBreak(i, nTab);
+ bool bHidden = pDoc->RowHidden(i, nTab);
+ if (nBreak || !bHidden)
break;
- } while (aIter.NextRange());
+ }
- if (nFlags != nOldFlags)
+ if (nBreakOld != nBreak)
{
aGrid.Flush();
- pDev->SetLineColor( (nFlags & CR_MANUALBREAK) ? aManualColor :
- (nFlags) ? aPageColor : aGridColor );
- nOldFlags = nFlags;
+ pDev->SetLineColor( (nBreak & BREAK_MANUAL) ? aManualColor :
+ (nBreak) ? aPageColor : aGridColor );
+ nBreakOld = nBreak;
}
}
- BOOL bDraw = bGrid || nOldFlags; // einfaches Gitter nur wenn eingestellt
+ BOOL bDraw = bGrid || nBreakOld; // einfaches Gitter nur wenn eingestellt
//! Mit dieser Abfrage wird zuviel weggelassen, wenn ein automatischer
//! Umbruch mitten in den Wiederholungszeilen liegt.
@@ -532,7 +529,7 @@ void ScOutputData::DrawGrid( BOOL bGrid, BOOL bPage )
{
if ( nY == MAXROW )
bDraw = FALSE;
- else if (pDoc->GetRowFlags(nYplus1,nTab) & ( CR_PAGEBREAK | CR_MANUALBREAK ))
+ else if (pDoc->HasRowBreak(nYplus1, nTab))
bDraw = FALSE;
}
#endif
@@ -654,7 +651,7 @@ void ScOutputData::FindRotated()
const ScPatternAttr* pPattern = pInfo->pPatternAttr;
const SfxItemSet* pCondSet = pInfo->pConditionSet;
- if ( !pPattern && (pDoc->GetColFlags(nX,nTab) & CR_HIDDEN) == 0 )
+ if ( !pPattern && !pDoc->ColHidden(nX, nTab) )
{
pPattern = pDoc->GetPattern( nX, nY, nTab );
pCondSet = pDoc->GetCondResult( nX, nY, nTab );
diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx
index 37bc941c0f16..b0b040f9b5e0 100644
--- a/sc/source/ui/view/output2.cxx
+++ b/sc/source/ui/view/output2.cxx
@@ -114,6 +114,7 @@ class ScDrawStringsVars
long nMaxDigitWidth;
long nSignWidth;
long nDotWidth;
+ long nExpWidth;
ScBaseCell* pLastCell;
ULONG nValueFormat;
@@ -173,6 +174,7 @@ private:
long GetMaxDigitWidth();
long GetSignWidth();
long GetDotWidth();
+ long GetExpWidth();
void TextChanged();
long ConvertWidthLogicToPixel( long nWidth ) const;
};
@@ -193,6 +195,7 @@ ScDrawStringsVars::ScDrawStringsVars(ScOutputData* pData, BOOL bPTL) :
nMaxDigitWidth( 0 ),
nSignWidth( 0 ),
nDotWidth( 0 ),
+ nExpWidth( 0 ),
pLastCell ( NULL ),
nValueFormat( 0 ),
bLineBreak ( FALSE ),
@@ -262,6 +265,7 @@ void ScDrawStringsVars::SetPattern( const ScPatternAttr* pNew, const SfxItemSet*
nMaxDigitWidth = 0;
nSignWidth = 0;
nDotWidth = 0;
+ nExpWidth = 0;
pPattern = pNew;
pCondSet = pSet;
@@ -417,6 +421,7 @@ void ScDrawStringsVars::SetPatternSimple( const ScPatternAttr* pNew, const SfxIt
nMaxDigitWidth = 0;
nSignWidth = 0;
nDotWidth = 0;
+ nExpWidth = 0;
// wird gerufen, wenn sich die Font-Variablen nicht aendern (!StringDiffer)
pPattern = pNew;
@@ -547,7 +552,7 @@ void ScDrawStringsVars::SetTextToWidthOrHash( ScBaseCell* pCell, long nWidth )
// Failed to get output string. Bail out.
return;
- sal_uInt8 nSignCount = 0, nDecimalCount = 0;
+ sal_uInt8 nSignCount = 0, nDecimalCount = 0, nExpCount = 0;
xub_StrLen nLen = aString.Len();
sal_Unicode cDecSep = ScGlobal::GetpLocaleData()->getLocaleItem().decimalSeparator.getStr()[0];
for (xub_StrLen i = 0; i < nLen; ++i)
@@ -557,13 +562,17 @@ void ScDrawStringsVars::SetTextToWidthOrHash( ScBaseCell* pCell, long nWidth )
++nSignCount;
else if (c == cDecSep)
++nDecimalCount;
+ else if (c == sal_Unicode('E'))
+ ++nExpCount;
}
if (nDecimalCount)
nWidth += (nMaxDigit - GetDotWidth()) * nDecimalCount;
if (nSignCount)
nWidth += (nMaxDigit - GetSignWidth()) * nSignCount;
+ if (nExpCount)
+ nWidth += (nMaxDigit - GetExpWidth()) * nExpCount;
- if (nDecimalCount || nSignCount)
+ if (nDecimalCount || nSignCount || nExpCount)
{
// Re-calculate.
nNumDigits = static_cast<sal_uInt16>(nWidth / nMaxDigit);
@@ -658,6 +667,17 @@ long ScDrawStringsVars::GetDotWidth()
return nDotWidth;
}
+long ScDrawStringsVars::GetExpWidth()
+{
+ if (nExpWidth > 0)
+ return nExpWidth;
+
+ nExpWidth = pOutput->pFmtDevice->GetTextWidth(String('E'));
+ if (bPixelToLogic)
+ nExpWidth = ConvertWidthLogicToPixel(nExpWidth);
+ return nExpWidth;
+}
+
void ScDrawStringsVars::TextChanged()
{
OutputDevice* pRefDevice = pOutput->pRefDevice;
@@ -844,7 +864,7 @@ BOOL ScOutputData::GetMergeOrigin( SCCOL nX, SCROW nY, SCSIZE nArrY,
while (bHOver) // nY konstant
{
--rOverX;
- bHidden = ( (pDoc->GetColFlags(rOverX,nTab) & CR_HIDDEN) != 0 );
+ bHidden = pDoc->ColHidden(rOverX, nTab);
if ( !bDoMerge && !bHidden )
return FALSE;
@@ -868,7 +888,7 @@ BOOL ScOutputData::GetMergeOrigin( SCCOL nX, SCROW nY, SCSIZE nArrY,
while (bVOver)
{
--rOverY;
- bHidden = ( (pDoc->GetRowFlags(rOverY,nTab) & CR_HIDDEN) != 0 );
+ bHidden = pDoc->RowHidden(rOverY, nTab);
if ( !bDoMerge && !bHidden )
return FALSE;
@@ -876,8 +896,8 @@ BOOL ScOutputData::GetMergeOrigin( SCCOL nX, SCROW nY, SCSIZE nArrY,
--nArrY; // lokale Kopie !
if (rOverX >= nX1 && rOverY >= nY1 &&
- (pDoc->GetColFlags(rOverX,nTab) & CR_HIDDEN) == 0 &&
- (pDoc->GetRowFlags(rOverY,nTab) & CR_HIDDEN) == 0 &&
+ !pDoc->ColHidden(rOverX, nTab) &&
+ !pDoc->RowHidden(rOverY, nTab) &&
pRowInfo[nArrY].nRowNo == rOverY)
{
// rVirtPosY -= pRowInfo[nArrY].nHeight;
@@ -2176,7 +2196,7 @@ void ScOutputData::DrawEdit(BOOL bPixelToLogic)
if (bDoCell)
{
if ( nCellY == nY && nCellX >= nX1 && nCellX <= nX2 &&
- (pDoc->GetColFlags(nCellX,nTab) & CR_HIDDEN) == 0 )
+ !pDoc->ColHidden(nCellX, nTab) )
{
CellInfo& rCellInfo = pThisRowInfo->pCellInfo[nCellX+1];
pPattern = rCellInfo.pPatternAttr;
diff --git a/sc/source/ui/view/prevloc.cxx b/sc/source/ui/view/prevloc.cxx
index 67e1aa86553a..fd36a1b2c1d0 100644
--- a/sc/source/ui/view/prevloc.cxx
+++ b/sc/source/ui/view/prevloc.cxx
@@ -350,9 +350,9 @@ Rectangle ScPreviewLocationData::GetOffsetPixel( const ScAddress& rCellPos, cons
long nSizeX = (long) ( pDoc->GetColWidth( nEndCol, nTab ) * nScaleX );
SCROW nEndRow = rCellPos.Row();
- long nPosY = (long) pDoc->FastGetScaledRowHeight( rRange.aStart.Row(),
+ long nPosY = (long) pDoc->GetScaledRowHeight( rRange.aStart.Row(),
nEndRow, nTab, nScaleY);
- long nSizeY = (long) ( pDoc->FastGetRowHeight( nEndRow, nTab ) * nScaleY );
+ long nSizeY = (long) ( pDoc->GetRowHeight( nEndRow, nTab ) * nScaleY );
Size aOffsetLogic( nPosX, nPosY );
Size aSizeLogic( nSizeX, nSizeY );
@@ -599,11 +599,11 @@ void ScPreviewLocationData::GetTableInfo( const Rectangle& rVisiblePixel, ScPrev
++nColCount;
if ( bHasRepCols )
for ( nCol=nRepeatColStart; nCol<=nRepeatColEnd; nCol++ )
- if ( ( pDoc->GetColFlags( nCol, nTab ) & CR_HIDDEN ) == 0 )
+ if (!pDoc->ColHidden(nCol, nTab))
++nColCount;
if ( bHasMainCols )
for ( nCol=nMainColStart; nCol<=nMainColEnd; nCol++ )
- if ( ( pDoc->GetColFlags( nCol, nTab ) & CR_HIDDEN ) == 0 )
+ if (!pDoc->ColHidden(nCol, nTab))
++nColCount;
if ( nColCount > 0 )
@@ -620,7 +620,7 @@ void ScPreviewLocationData::GetTableInfo( const Rectangle& rVisiblePixel, ScPrev
{
long nPosX = 0;
for ( nCol=nRepeatColStart; nCol<=nRepeatColEnd; nCol++ )
- if ( ( pDoc->GetColFlags( nCol, nTab ) & CR_HIDDEN ) == 0 )
+ if (!pDoc->ColHidden(nCol, nTab))
{
USHORT nDocW = pDoc->GetColWidth( nCol, nTab );
long nNextX = nPosX + (long) (nDocW * nScaleX);
@@ -639,7 +639,7 @@ void ScPreviewLocationData::GetTableInfo( const Rectangle& rVisiblePixel, ScPrev
{
long nPosX = 0;
for ( nCol=nMainColStart; nCol<=nMainColEnd; nCol++ )
- if ( ( pDoc->GetColFlags( nCol, nTab ) & CR_HIDDEN ) == 0 )
+ if (!pDoc->ColHidden(nCol, nTab))
{
USHORT nDocW = pDoc->GetColWidth( nCol, nTab );
long nNextX = nPosX + (long) (nDocW * nScaleX);
@@ -667,11 +667,9 @@ void ScPreviewLocationData::GetTableInfo( const Rectangle& rVisiblePixel, ScPrev
if ( bHasHeaderRow )
++nRowCount;
if ( bHasRepRows )
- nRowCount += pDoc->GetRowFlagsArray( nTab).CountForCondition(
- nRepeatRowStart, nRepeatRowEnd, CR_HIDDEN, 0);
+ nRowCount += pDoc->CountVisibleRows(nRepeatRowStart, nRepeatRowEnd, nTab);
if ( bHasMainRows )
- nRowCount += pDoc->GetRowFlagsArray( nTab).CountForCondition(
- nMainRowStart, nMainRowEnd, CR_HIDDEN, 0);
+ nRowCount += pDoc->CountVisibleRows(nMainRowStart, nMainRowEnd, nTab);
if ( nRowCount > 0 )
{
@@ -686,58 +684,44 @@ void ScPreviewLocationData::GetTableInfo( const Rectangle& rVisiblePixel, ScPrev
if ( bHasRepRows )
{
long nPosY = 0;
- ScCompressedArrayIterator< SCROW, BYTE> aIter(
- pDoc->GetRowFlagsArray( nTab), nRepeatRowStart,
- nRepeatRowEnd);
- do
+ for (SCROW nRow = nRepeatRowStart; nRow <= nRepeatRowEnd; ++nRow)
{
- if ((*aIter & CR_HIDDEN) == 0)
- {
- SCROW nRangeEnd = aIter.GetRangeEnd();
- for (SCROW nRow=aIter.GetRangeStart(); nRow<=nRangeEnd; ++nRow)
- {
- USHORT nDocH = pDoc->FastGetOriginalRowHeight( nRow, nTab );
- long nNextY = nPosY + (long) (nDocH * nScaleY);
-
- long nPixelStart = pWindow->LogicToPixel( Size( 0, nPosY ), aCellMapMode ).Height();
- long nPixelEnd = pWindow->LogicToPixel( Size( 0, nNextY ), aCellMapMode ).Height() - 1;
- pRowInfo[nRowPos].Set( FALSE, nRow,
- aRepeatRect.Top() + nPixelStart,
- aRepeatRect.Top() + nPixelEnd );
-
- nPosY = nNextY;
- ++nRowPos;
- }
- }
- } while (aIter.NextRange());
+ if (pDoc->RowHidden(nRow, nTab))
+ continue;
+
+ USHORT nDocH = pDoc->GetOriginalHeight( nRow, nTab );
+ long nNextY = nPosY + (long) (nDocH * nScaleY);
+
+ long nPixelStart = pWindow->LogicToPixel( Size( 0, nPosY ), aCellMapMode ).Height();
+ long nPixelEnd = pWindow->LogicToPixel( Size( 0, nNextY ), aCellMapMode ).Height() - 1;
+ pRowInfo[nRowPos].Set( FALSE, nRow,
+ aRepeatRect.Top() + nPixelStart,
+ aRepeatRect.Top() + nPixelEnd );
+
+ nPosY = nNextY;
+ ++nRowPos;
+ }
}
if ( bHasMainRows )
{
long nPosY = 0;
- ScCompressedArrayIterator< SCROW, BYTE> aIter(
- pDoc->GetRowFlagsArray( nTab), nMainRowStart,
- nMainRowEnd);
- do
+ for (SCROW nRow = nMainRowStart; nRow <= nMainRowEnd; ++nRow)
{
- if ((*aIter & CR_HIDDEN) == 0)
- {
- SCROW nRangeEnd = aIter.GetRangeEnd();
- for (SCROW nRow=aIter.GetRangeStart(); nRow<=nRangeEnd; ++nRow)
- {
- USHORT nDocH = pDoc->FastGetOriginalRowHeight( nRow, nTab );
- long nNextY = nPosY + (long) (nDocH * nScaleY);
-
- long nPixelStart = pWindow->LogicToPixel( Size( 0, nPosY ), aCellMapMode ).Height();
- long nPixelEnd = pWindow->LogicToPixel( Size( 0, nNextY ), aCellMapMode ).Height() - 1;
- pRowInfo[nRowPos].Set( FALSE, nRow,
- aMainRect.Top() + nPixelStart,
- aMainRect.Top() + nPixelEnd );
-
- nPosY = nNextY;
- ++nRowPos;
- }
- }
- } while (aIter.NextRange());
+ if (pDoc->RowHidden(nRow, nTab))
+ continue;
+
+ USHORT nDocH = pDoc->GetOriginalHeight( nRow, nTab );
+ long nNextY = nPosY + (long) (nDocH * nScaleY);
+
+ long nPixelStart = pWindow->LogicToPixel( Size( 0, nPosY ), aCellMapMode ).Height();
+ long nPixelEnd = pWindow->LogicToPixel( Size( 0, nNextY ), aCellMapMode ).Height() - 1;
+ pRowInfo[nRowPos].Set( FALSE, nRow,
+ aMainRect.Top() + nPixelStart,
+ aMainRect.Top() + nPixelEnd );
+
+ nPosY = nNextY;
+ ++nRowPos;
+ }
}
rInfo.SetRowInfo( nRowCount, pRowInfo );
}
diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx
index afe23892e786..378ea1233cf9 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -85,6 +85,8 @@
#include <vcl/lineinfo.hxx>
#include <tools/pstm.hxx>
+#include <boost/scoped_ptr.hpp>
+
#define ZOOM_MIN 10
#define GET_BOOL(set,which) ((const SfxBoolItem&)(set)->Get((which))).GetValue()
@@ -1501,7 +1503,7 @@ void ScPrintFunc::PrintRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY )
for (SCROW nRow=nY1; nRow<=nY2; nRow++)
{
- USHORT nDocH = pDoc->FastGetRowHeight( nRow, nPrintTab );
+ USHORT nDocH = pDoc->GetRowHeight( nRow, nPrintTab );
if (nDocH)
{
long nHeight = (long) (nDocH * nScaleY);
@@ -1557,7 +1559,7 @@ void ScPrintFunc::LocateRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY,
nEndX -= nOneX;
long nPosY = nScrY - nOneY;
- nPosY += pDoc->FastGetScaledRowHeight( nY1, nY2, nPrintTab, nScaleY);
+ nPosY += pDoc->GetScaledRowHeight( nY1, nY2, nPrintTab, nScaleY);
Rectangle aCellRect( nScrX, nScrY, nEndX, nPosY );
rLocationData.AddRowHeaders( aCellRect, nY1, nY2, bRepRow );
}
@@ -1599,7 +1601,7 @@ void ScPrintFunc::LocateArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
}
long nPosY = nScrY - nOneY;
- nPosY += pDoc->FastGetScaledRowHeight( nY1, nY2, nPrintTab, nScaleY);
+ nPosY += pDoc->GetScaledRowHeight( nY1, nY2, nPrintTab, nScaleY);
Rectangle aCellRect( nScrX, nScrY, nPosX, nPosY );
rLocationData.AddCellRange( aCellRect, ScRange( nX1,nY1,nPrintTab, nX2,nY2,nPrintTab ),
bRepCol, bRepRow, aDrawMapMode );
@@ -2181,9 +2183,9 @@ void ScPrintFunc::PrintPage( long nPageNo, SCCOL nX1, SCROW nY1, SCCOL nX2, SCRO
}
if ( bCenterVer )
{
- long nDataHeight = pDoc->FastGetRowHeight( nY1, nY2, nPrintTab);
+ long nDataHeight = pDoc->GetRowHeight( nY1, nY2, nPrintTab);
if (bDoRepRow)
- nDataHeight += pDoc->FastGetRowHeight( nRepeatStartRow,
+ nDataHeight += pDoc->GetRowHeight( nRepeatStartRow,
nRepeatEndRow, nPrintTab);
if (aTableParam.bHeaders)
nDataHeight += (long) PRINT_HEADER_HEIGHT;
@@ -2216,11 +2218,11 @@ void ScPrintFunc::PrintPage( long nPageNo, SCCOL nX1, SCROW nY1, SCCOL nX2, SCRO
for (SCCOL i=nRepeatStartCol; i<=nRepeatEndCol; i++)
nRepeatWidth += (long) (pDoc->GetColWidth(i,nPrintTab) * nScaleX);
if (bDoRepRow)
- nRepeatHeight += pDoc->FastGetScaledRowHeight( nRepeatStartRow,
+ nRepeatHeight += pDoc->GetScaledRowHeight( nRepeatStartRow,
nRepeatEndRow, nPrintTab, nScaleY);
for (SCCOL i=nX1; i<=nX2; i++)
nContentWidth += (long) (pDoc->GetColWidth(i,nPrintTab) * nScaleX);
- nContentHeight += pDoc->FastGetScaledRowHeight( nY1, nY2, nPrintTab,
+ nContentHeight += pDoc->GetScaledRowHeight( nY1, nY2, nPrintTab,
nScaleY);
// partition the page
@@ -2886,30 +2888,84 @@ void ScPrintFunc::CalcZoom( USHORT nRangeNo ) // Zoom bere
if (aTableParam.bScalePageNum)
{
nZoom = 100;
- BOOL bFound = FALSE;
USHORT nPagesToFit = aTableParam.nScalePageNum;
- while (!bFound)
+
+ sal_uInt16 nLastFitZoom = 0, nLastNonFitZoom = 0;
+ while (true)
{
+ if (nZoom <= ZOOM_MIN)
+ break;
+
CalcPages();
- if ( nPagesX * nPagesY <= nPagesToFit || nZoom <= ZOOM_MIN )
- bFound = TRUE;
+ bool bFitsPage = (nPagesX * nPagesY <= nPagesToFit);
+
+ if (bFitsPage)
+ {
+ if (nZoom == 100)
+ // If it fits at 100 %, it's good enough for me.
+ break;
+
+ nLastFitZoom = nZoom;
+ nZoom = (nLastNonFitZoom + nZoom) / 2;
+
+ if (nLastFitZoom == nZoom)
+ // It converged. Use this zoom level.
+ break;
+ }
else
- --nZoom;
+ {
+ if (nZoom - nLastFitZoom <= 1)
+ {
+ nZoom = nLastFitZoom;
+ CalcPages();
+ break;
+ }
+
+ nLastNonFitZoom = nZoom;
+ nZoom = (nLastFitZoom + nZoom) / 2;
+ }
}
}
else if (aTableParam.bScaleTo)
{
nZoom = 100;
- BOOL bFound = FALSE;
USHORT nW = aTableParam.nScaleWidth;
USHORT nH = aTableParam.nScaleHeight;
- while (!bFound)
+
+ sal_uInt16 nLastFitZoom = 0, nLastNonFitZoom = 0;
+ while (true)
{
+ if (nZoom <= ZOOM_MIN)
+ break;
+
CalcPages();
- if ( ((!nW || (nPagesX <= nW)) && (!nH || (nPagesY <= nH))) || (nZoom <= ZOOM_MIN) )
- bFound = TRUE;
+ bool bFitsPage = ((!nW || (nPagesX <= nW)) && (!nH || (nPagesY <= nH)));
+
+ if (bFitsPage)
+ {
+ if (nZoom == 100)
+ // If it fits at 100 %, it's good enough for me.
+ break;
+
+ nLastFitZoom = nZoom;
+ nZoom = (nLastNonFitZoom + nZoom) / 2;
+
+ if (nLastFitZoom == nZoom)
+ // It converged. Use this zoom level.
+ break;
+ }
else
- --nZoom;
+ {
+ if (nZoom - nLastFitZoom <= 1)
+ {
+ nZoom = nLastFitZoom;
+ CalcPages();
+ break;
+ }
+
+ nLastNonFitZoom = nZoom;
+ nZoom = (nLastFitZoom + nZoom) / 2;
+ }
}
}
else if (aTableParam.bScaleAll)
@@ -3029,18 +3085,20 @@ void ScPrintFunc::CalcPages() // berechnet aPageRect und Seiten au
nPagesY = 0;
nTotalY = 0;
- BOOL bVisCol = FALSE;
+ bool bVisCol = false;
+ SCCOL nLastCol = -1;
for (SCCOL i=nStartCol; i<=nEndCol; i++)
{
- BYTE nFlags = pDoc->GetColFlags(i,nPrintTab);
- if ( i>nStartCol && bVisCol && (nFlags & CR_PAGEBREAK) )
+ bool bHidden = pDoc->ColHidden(i, nPrintTab, nLastCol);
+ bool bPageBreak = (pDoc->HasColBreak(i, nPrintTab) & BREAK_PAGE);
+ if ( i>nStartCol && bVisCol && bPageBreak )
{
pPageEndX[nPagesX] = i-1;
++nPagesX;
- bVisCol = FALSE;
+ bVisCol = false;
}
- if (!(nFlags & CR_HIDDEN))
- bVisCol = TRUE;
+ if (!bHidden)
+ bVisCol = true;
}
if (bVisCol) // auch am Ende keine leeren Seiten
{
@@ -3048,39 +3106,60 @@ void ScPrintFunc::CalcPages() // berechnet aPageRect und Seiten au
++nPagesX;
}
- BOOL bVisRow = FALSE;
+ bool bVisRow = false;
SCROW nPageStartRow = nStartRow;
- ScCompressedArrayIterator< SCROW, BYTE> aIter( pDoc->GetRowFlagsArray(
- nPrintTab), nStartRow, nEndRow);
- do
+ SCROW nLastVisibleRow = -1;
+
+ ::boost::scoped_ptr<ScRowBreakIterator> pRowBreakIter(pDoc->GetRowBreakIterator(nPrintTab));
+ SCROW nNextPageBreak = pRowBreakIter->first();
+ while (nNextPageBreak != ScRowBreakIterator::NOT_FOUND && nNextPageBreak < nStartRow)
+ // Skip until the page break position is at the start row or greater.
+ nNextPageBreak = pRowBreakIter->next();
+
+ for (SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
{
- BYTE nFlags = *aIter;
- SCROW nRangeEnd = aIter.GetRangeEnd();
- for (SCROW j=aIter.GetRangeStart(); j<=nRangeEnd; ++j)
+ bool bPageBreak = (nNextPageBreak == nRow);
+ if (bPageBreak)
+ nNextPageBreak = pRowBreakIter->next();
+
+ if (nRow > nStartRow && bVisRow && bPageBreak )
{
- if ( j>nStartRow && bVisRow && (nFlags & CR_PAGEBREAK) )
+ pPageEndY[nTotalY] = nRow-1;
+ ++nTotalY;
+
+ if ( !aTableParam.bSkipEmpty ||
+ !pDoc->IsPrintEmpty( nPrintTab, nStartCol, nPageStartRow, nEndCol, nRow-1 ) )
{
- pPageEndY[nTotalY] = j-1;
- ++nTotalY;
+ pPageRows[nPagesY].SetStartRow( nPageStartRow );
+ pPageRows[nPagesY].SetEndRow( nRow-1 );
+ pPageRows[nPagesY].SetPagesX( nPagesX );
+ if (aTableParam.bSkipEmpty)
+ lcl_SetHidden( pDoc, nPrintTab, pPageRows[nPagesY], nStartCol, pPageEndX );
+ ++nPagesY;
+ }
- if ( !aTableParam.bSkipEmpty ||
- !pDoc->IsPrintEmpty( nPrintTab, nStartCol, nPageStartRow, nEndCol, j-1 ) )
- {
- pPageRows[nPagesY].SetStartRow( nPageStartRow );
- pPageRows[nPagesY].SetEndRow( j-1 );
- pPageRows[nPagesY].SetPagesX( nPagesX );
- if (aTableParam.bSkipEmpty)
- lcl_SetHidden( pDoc, nPrintTab, pPageRows[nPagesY], nStartCol, pPageEndX );
- ++nPagesY;
- }
+ nPageStartRow = nRow;
+ bVisRow = false;
+ }
- nPageStartRow = j;
- bVisRow = FALSE;
- }
- if (!(nFlags & CR_HIDDEN))
- bVisRow = TRUE;
+ if (nRow <= nLastVisibleRow)
+ {
+ // This row is still visible. Don't bother calling RowHidden() to
+ // find out, for speed optimization.
+ bVisRow = true;
+ continue;
+ }
+
+ SCROW nLastRow = -1;
+ if (!pDoc->RowHidden(nRow, nPrintTab, NULL, &nLastRow))
+ {
+ bVisRow = true;
+ nLastVisibleRow = nLastRow;
}
- } while (aIter.NextRange());
+ else
+ // skip all hidden rows.
+ nRow = nLastRow;
+ }
if (bVisRow)
{
diff --git a/sc/source/ui/view/scextopt.cxx b/sc/source/ui/view/scextopt.cxx
index bead62419bb3..1faa105d2bd7 100644
--- a/sc/source/ui/view/scextopt.cxx
+++ b/sc/source/ui/view/scextopt.cxx
@@ -36,7 +36,6 @@
// ============================================================================
ScExtDocSettings::ScExtDocSettings() :
- maOleSize( ScAddress::INITIALIZE_INVALID ),
mfTabBarWidth( -1.0 ),
mnLinkCnt( 0 ),
mnDisplTab( 0 )
diff --git a/sc/source/ui/view/select.cxx b/sc/source/ui/view/select.cxx
index 4887895c8e6b..b2c9ffdc1395 100644
--- a/sc/source/ui/view/select.cxx
+++ b/sc/source/ui/view/select.cxx
@@ -275,12 +275,12 @@ BOOL __EXPORT ScViewFunctionSet::SetCursorAtPoint( const Point& rPointPixel, BOO
ScDocument* pDoc = pViewData->GetDocument();
SCTAB nTab = pViewData->GetTabNo();
if ( bLeft && !bRightScroll )
- do --nPosX; while ( nPosX>=0 && ( pDoc->GetColFlags( nPosX, nTab ) & CR_HIDDEN ) );
+ do --nPosX; while ( nPosX>=0 && pDoc->ColHidden( nPosX, nTab ) );
if ( bTop && !bBottomScroll )
{
if (--nPosY >= 0)
{
- pDoc->GetRowFlagsArray( nTab).GetLastForCondition( 0, nPosY, CR_HIDDEN, 0);
+ nPosY = pDoc->LastVisibleRow(0, nPosY, nTab);
if (!ValidRow(nPosY))
nPosY = -1;
}
@@ -476,7 +476,7 @@ BOOL ScViewFunctionSet::SetCursorAtCell( SCsCOL nPosX, SCsROW nPosY, BOOL bScrol
{
// #94321# in SetCursorAtPoint hidden columns are skipped.
// They must be skipped here too, or the result will always be the first hidden column.
- do ++nPosX; while ( nPosX<nStartX && ( pDoc->GetColFlags( nPosX, nTab ) & CR_HIDDEN ) );
+ do ++nPosX; while ( nPosX<nStartX && pDoc->ColHidden(nPosX, nTab) );
for (SCCOL i=nPosX; i<nStartX; i++)
nSizeX += pDoc->GetColWidth( i, nTab );
}
@@ -491,8 +491,7 @@ BOOL ScViewFunctionSet::SetCursorAtCell( SCsCOL nPosX, SCsROW nPosY, BOOL bScrol
// They must be skipped here too, or the result will always be the first hidden row.
if (++nPosY < nStartY)
{
- nPosY = pDoc->GetRowFlagsArray( nTab).GetFirstForCondition(
- nPosY, nStartY-1, CR_HIDDEN, 0);
+ nPosY = pDoc->FirstVisibleRow(nPosY, nStartY-1, nTab);
if (!ValidRow(nPosY))
nPosY = nStartY;
}
diff --git a/sc/source/ui/view/tabcont.cxx b/sc/source/ui/view/tabcont.cxx
index c5572fb9844a..6014ded96e1e 100644
--- a/sc/source/ui/view/tabcont.cxx
+++ b/sc/source/ui/view/tabcont.cxx
@@ -59,13 +59,14 @@ ScTabControl::ScTabControl( Window* pParent, ScViewData* pData ) :
DropTargetHelper( this ),
DragSourceHelper( this ),
pViewData( pData ),
- nMouseClickPageId( TABBAR_PAGE_NOTFOUND ),
- nSelPageIdByMouse( TABBAR_PAGE_NOTFOUND ),
+ nMouseClickPageId( TabBar::PAGE_NOT_FOUND ),
+ nSelPageIdByMouse( TabBar::PAGE_NOT_FOUND ),
bErrorShown( FALSE )
{
ScDocument* pDoc = pViewData->GetDocument();
String aString;
+ Color aTabBgColor;
SCTAB nCount = pDoc->GetTableCount();
for (SCTAB i=0; i<nCount; i++)
{
@@ -77,6 +78,11 @@ ScTabControl::ScTabControl( Window* pParent, ScViewData* pData ) :
InsertPage( static_cast<sal_uInt16>(i)+1, aString, TPB_SPECIAL );
else
InsertPage( static_cast<sal_uInt16>(i)+1, aString );
+ if ( !pDoc->IsDefaultTabBgColor(i) )
+ {
+ aTabBgColor = pDoc->GetTabBgColor(i);
+ SetTabBgColor( static_cast<sal_uInt16>(i)+1, aTabBgColor );
+ }
}
}
}
@@ -157,7 +163,7 @@ void ScTabControl::MouseButtonDown( const MouseEvent& rMEvt )
if( rMEvt.IsLeft() && (rMEvt.GetModifier() == 0) )
nMouseClickPageId = GetPageId( rMEvt.GetPosPixel() );
else
- nMouseClickPageId = TABBAR_PAGE_NOTFOUND;
+ nMouseClickPageId = TabBar::PAGE_NOT_FOUND;
TabBar::MouseButtonDown( rMEvt );
}
@@ -168,7 +174,7 @@ void ScTabControl::MouseButtonUp( const MouseEvent& rMEvt )
// mouse button down and up on same page?
if( nMouseClickPageId != GetPageId( aPos ) )
- nMouseClickPageId = TABBAR_PAGE_NOTFOUND;
+ nMouseClickPageId = TabBar::PAGE_NOT_FOUND;
if ( rMEvt.GetClicks() == 2 && rMEvt.IsLeft() && nMouseClickPageId != 0 && nMouseClickPageId != TAB_PAGE_NOTFOUND )
{
@@ -185,7 +191,7 @@ void ScTabControl::MouseButtonUp( const MouseEvent& rMEvt )
SfxDispatcher* pDispatcher = pViewData->GetViewShell()->GetViewFrame()->GetDispatcher();
pDispatcher->Execute( nSlot, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD );
// forget page ID, to be really sure that the dialog is not called twice
- nMouseClickPageId = TABBAR_PAGE_NOTFOUND;
+ nMouseClickPageId = TabBar::PAGE_NOT_FOUND;
}
TabBar::MouseButtonUp( rMEvt );
@@ -197,7 +203,7 @@ void ScTabControl::Select()
nSelPageIdByMouse = nMouseClickPageId;
/* Reset nMouseClickPageId, so that next Select() call may invalidate
nSelPageIdByMouse (i.e. if called from keyboard). */
- nMouseClickPageId = TABBAR_PAGE_NOTFOUND;
+ nMouseClickPageId = TabBar::PAGE_NOT_FOUND;
ScModule* pScMod = SC_MOD();
ScDocument* pDoc = pViewData->GetDocument();
@@ -262,6 +268,7 @@ void ScTabControl::Select()
rBind.Invalidate( FID_DELETE_TABLE );
rBind.Invalidate( FID_TABLE_SHOW );
rBind.Invalidate( FID_TABLE_HIDE );
+ rBind.Invalidate( FID_TAB_SET_TAB_BG_COLOR );
// SetReference nur wenn der Konsolidieren-Dialog offen ist
// (fuer Referenzen ueber mehrere Tabellen)
@@ -288,16 +295,22 @@ void ScTabControl::UpdateStatus()
SCTAB i;
String aString;
SCTAB nMaxCnt = Max( nCount, static_cast<SCTAB>(GetMaxId()) );
+ Color aTabBgColor;
BOOL bModified = FALSE; // Tabellen-Namen
for (i=0; i<nMaxCnt && !bModified; i++)
{
if (pDoc->IsVisible(i))
+ {
pDoc->GetName(i,aString);
+ aTabBgColor = pDoc->GetTabBgColor(i);
+ }
else
+ {
aString.Erase();
+ }
- if (GetPageText(static_cast<sal_uInt16>(i)+1) != aString)
+ if ( (GetPageText(static_cast<sal_uInt16>(i)+1) != aString) || (GetTabBgColor(static_cast<sal_uInt16>(i)+1) != aTabBgColor) )
bModified = TRUE;
}
@@ -314,6 +327,11 @@ void ScTabControl::UpdateStatus()
InsertPage( static_cast<sal_uInt16>(i)+1, aString, TPB_SPECIAL );
else
InsertPage( static_cast<sal_uInt16>(i)+1, aString );
+ if ( !pDoc->IsDefaultTabBgColor(i) )
+ {
+ aTabBgColor = pDoc->GetTabBgColor(i);
+ SetTabBgColor( static_cast<sal_uInt16>(i)+1, aTabBgColor );
+ }
}
}
}
@@ -371,7 +389,7 @@ void ScTabControl::ActivateView(BOOL bActivate)
void ScTabControl::SetSheetLayoutRTL( BOOL bSheetRTL )
{
SetEffectiveRTL( bSheetRTL );
- nSelPageIdByMouse = TABBAR_PAGE_NOTFOUND;
+ nSelPageIdByMouse = TabBar::PAGE_NOT_FOUND;
}
@@ -607,12 +625,12 @@ void ScTabControl::EndRenaming()
void ScTabControl::Mirror()
{
TabBar::Mirror();
- if( nSelPageIdByMouse != TABBAR_PAGE_NOTFOUND )
+ if( nSelPageIdByMouse != TabBar::PAGE_NOT_FOUND )
{
Rectangle aRect( GetPageRect( GetCurPageId() ) );
if( !aRect.IsEmpty() )
SetPointerPosPixel( aRect.Center() );
- nSelPageIdByMouse = TABBAR_PAGE_NOTFOUND; // only once after a Select()
+ nSelPageIdByMouse = TabBar::PAGE_NOT_FOUND; // only once after a Select()
}
}
diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx
index 4938defa437d..0bc4617a9af4 100644
--- a/sc/source/ui/view/tabview.cxx
+++ b/sc/source/ui/view/tabview.cxx
@@ -1439,7 +1439,7 @@ void ScTabView::ScrollX( long nDeltaX, ScHSplitPos eWhich, BOOL bUpdBars )
SCsCOL nDir = ( nDeltaX > 0 ) ? 1 : -1;
ScDocument* pDoc = aViewData.GetDocument();
SCTAB nTab = aViewData.GetTabNo();
- while ( ( pDoc->GetColFlags( nNewX, nTab ) & CR_HIDDEN ) &&
+ while ( pDoc->ColHidden(nNewX, nTab) &&
nNewX+nDir >= 0 && nNewX+nDir <= MAXCOL )
nNewX = sal::static_int_cast<SCsCOL>( nNewX + nDir );
@@ -1528,7 +1528,7 @@ void ScTabView::ScrollY( long nDeltaY, ScVSplitPos eWhich, BOOL bUpdBars )
SCsROW nDir = ( nDeltaY > 0 ) ? 1 : -1;
ScDocument* pDoc = aViewData.GetDocument();
SCTAB nTab = aViewData.GetTabNo();
- while ( ( pDoc->GetRowFlags( nNewY, nTab ) & CR_HIDDEN ) &&
+ while ( pDoc->RowHidden(nNewY, nTab) &&
nNewY+nDir >= 0 && nNewY+nDir <= MAXROW )
nNewY += nDir;
@@ -1615,7 +1615,7 @@ SCROW lcl_LastVisible( ScViewData& rViewData )
SCTAB nTab = rViewData.GetTabNo();
SCROW nVis = MAXROW;
- while ( nVis > 0 && pDoc->FastGetRowHeight( nVis, nTab ) == 0 )
+ while ( nVis > 0 && pDoc->GetRowHeight( nVis, nTab ) == 0 )
--nVis;
return nVis;
}
diff --git a/sc/source/ui/view/tabview2.cxx b/sc/source/ui/view/tabview2.cxx
index b7a773ab2abd..674f6f8ae0ff 100644
--- a/sc/source/ui/view/tabview2.cxx
+++ b/sc/source/ui/view/tabview2.cxx
@@ -640,13 +640,13 @@ BOOL lcl_FitsInWindow( double fScaleX, double fScaleY, USHORT nZoom,
}
long nBlockY = 0;
- ScCoupledCompressedArrayIterator< SCROW, BYTE, USHORT> aIter(
- pDoc->GetRowFlagsArray( nTab), 0, nFixPosY-1, CR_HIDDEN, 0,
- pDoc->GetRowHeightArray( nTab));
- for ( ; aIter; ++aIter)
+ for (SCROW nRow = 0; nRow <= nFixPosY-1; ++nRow)
{
+ if (pDoc->RowHidden(nRow, nTab))
+ continue;
+
// for frozen panes, add both parts
- USHORT nRowTwips = *aIter;
+ USHORT nRowTwips = pDoc->GetRowHeight(nRow, nTab);
if (nRowTwips)
{
nBlockY += (long)(nRowTwips * fScaleY);
@@ -654,10 +654,9 @@ BOOL lcl_FitsInWindow( double fScaleX, double fScaleY, USHORT nZoom,
return FALSE;
}
}
- aIter.NewLimits( nStartRow, nEndRow);
- for ( ; aIter; ++aIter)
+ for (SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
{
- USHORT nRowTwips = *aIter;
+ USHORT nRowTwips = pDoc->GetRowHeight(nRow, nTab);
if (nRowTwips)
{
nBlockY += (long)(nRowTwips * fScaleY);
diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx
index 750e49ec2334..86f68a1878cc 100644
--- a/sc/source/ui/view/tabview3.cxx
+++ b/sc/source/ui/view/tabview3.cxx
@@ -968,8 +968,8 @@ void ScTabView::MoveCursorRel( SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode,
BOOL bHFlip = FALSE;
do
{
- BYTE nColFlags = pDoc->GetColFlags( nCurX, nTab );
- bSkipCell = (nColFlags & CR_HIDDEN) || pDoc->IsHorOverlapped( nCurX, nCurY, nTab );
+ SCCOL nLastCol = -1;
+ bSkipCell = pDoc->ColHidden(nCurX, nTab, nLastCol) || pDoc->IsHorOverlapped( nCurX, nCurY, nTab );
if (bSkipProtected && !bSkipCell)
bSkipCell = pDoc->HasAttrib(nCurX, nCurY, nTab, nCurX, nCurY, nTab, HASATTR_PROTECTED);
if (bSkipUnprotected && !bSkipCell)
@@ -1010,8 +1010,8 @@ void ScTabView::MoveCursorRel( SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode,
BOOL bVFlip = FALSE;
do
{
- BYTE nRowFlags = pDoc->GetRowFlags( nCurY, nTab );
- bSkipCell = (nRowFlags & CR_HIDDEN) || pDoc->IsVerOverlapped( nCurX, nCurY, nTab );
+ SCROW nLastRow = -1;
+ bSkipCell = pDoc->RowHidden(nCurY, nTab, nLastRow) || pDoc->IsVerOverlapped( nCurX, nCurY, nTab );
if (bSkipProtected && !bSkipCell)
bSkipCell = pDoc->HasAttrib(nCurX, nCurY, nTab, nCurX, nCurY, nTab, HASATTR_PROTECTED);
if (bSkipUnprotected && !bSkipCell)
@@ -2093,17 +2093,18 @@ void ScTabView::PaintRangeFinder( long nNumber )
BOOL bHiddenEdge = FALSE;
SCROW nTmp;
ScDocument* pDoc = aViewData.GetDocument();
- while ( nCol1 > 0 && ( pDoc->GetColFlags( nCol1, nTab ) & CR_HIDDEN ) )
+ SCCOL nLastCol = -1;
+ while ( nCol1 > 0 && pDoc->ColHidden(nCol1, nTab, nLastCol) )
{
--nCol1;
bHiddenEdge = TRUE;
}
- while ( nCol2 < MAXCOL && ( pDoc->GetColFlags( nCol2, nTab ) & CR_HIDDEN ) )
+ while ( nCol2 < MAXCOL && pDoc->ColHidden(nCol2, nTab, nLastCol) )
{
++nCol2;
bHiddenEdge = TRUE;
}
- nTmp = pDoc->GetRowFlagsArray( nTab).GetLastForCondition( 0, nRow1, CR_HIDDEN, 0);
+ nTmp = pDoc->LastVisibleRow(0, nRow1, nTab);
if (!ValidRow(nTmp))
nTmp = 0;
if (nTmp < nRow1)
@@ -2111,7 +2112,7 @@ void ScTabView::PaintRangeFinder( long nNumber )
nRow1 = nTmp;
bHiddenEdge = TRUE;
}
- nTmp = pDoc->GetRowFlagsArray( nTab).GetFirstForCondition( nRow2, MAXROW, CR_HIDDEN, 0);
+ nTmp = pDoc->FirstVisibleRow(nRow2, MAXROW, nTab);
if (!ValidRow(nTmp))
nTmp = MAXROW;
if (nTmp > nRow2)
diff --git a/sc/source/ui/view/tabview5.cxx b/sc/source/ui/view/tabview5.cxx
index bc5c94c271e2..f0ac3fc42869 100644
--- a/sc/source/ui/view/tabview5.cxx
+++ b/sc/source/ui/view/tabview5.cxx
@@ -666,7 +666,7 @@ void ScTabView::MakeVisible( const Rectangle& rHMMRect )
if (nScrollY > 0)
while (nScrollY > 0 && nPosY < MAXROW)
{
- nScrollY -= (long) ( pDoc->FastGetRowHeight(nPosY, nTab) * nPPTY );
+ nScrollY -= (long) ( pDoc->GetRowHeight(nPosY, nTab) * nPPTY );
++nPosY;
++nLinesY;
}
@@ -674,7 +674,7 @@ void ScTabView::MakeVisible( const Rectangle& rHMMRect )
while (nScrollY < 0 && nPosY > 0)
{
--nPosY;
- nScrollY += (long) ( pDoc->FastGetRowHeight(nPosY, nTab) * nPPTY );
+ nScrollY += (long) ( pDoc->GetRowHeight(nPosY, nTab) * nPPTY );
--nLinesY;
}
diff --git a/sc/source/ui/view/tabvwshe.cxx b/sc/source/ui/view/tabvwshe.cxx
index a94d73a4b022..c0af39226c3f 100644
--- a/sc/source/ui/view/tabvwshe.cxx
+++ b/sc/source/ui/view/tabvwshe.cxx
@@ -52,6 +52,7 @@
#include "editsh.hxx"
#include "dociter.hxx"
#include "inputhdl.hxx"
+#include "document.hxx"
//==================================================================
@@ -88,6 +89,22 @@ String __EXPORT ScTabViewShell::GetSelectionText( BOOL bWholeWord )
else
aRange.aEnd = aRange.aStart;
}
+ else
+ {
+ // #i111531# with 1M rows it was necessary to limit the range
+ // to the actually used data area.
+ SCCOL nCol1, nCol2;
+ SCROW nRow1, nRow2;
+ SCTAB nTab1, nTab2;
+ aRange.GetVars( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2);
+ if (pDoc->ShrinkToUsedDataArea( nTab1, nCol1, nRow1, nCol2, nRow2, false))
+ {
+ aRange.aStart.SetCol( nCol1 );
+ aRange.aStart.SetRow( nRow1 );
+ aRange.aEnd.SetCol( nCol2 );
+ aRange.aEnd.SetRow( nRow2 );
+ }
+ }
ScImportExport aObj( pDoc, aRange );
aObj.SetFormulas( GetViewData()->GetOptions().GetOption( VOPT_FORMULAS ) );
diff --git a/sc/source/ui/view/tabvwshf.cxx b/sc/source/ui/view/tabvwshf.cxx
index 68a852c4a3b7..20a10f149a3a 100644
--- a/sc/source/ui/view/tabvwshf.cxx
+++ b/sc/source/ui/view/tabvwshf.cxx
@@ -28,18 +28,19 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
-
-
-// INCLUDE ---------------------------------------------------------------
+#include <boost/scoped_ptr.hpp>
#include "scitems.hxx"
#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
#include <basic/sbstar.hxx>
#include <layout/layout.hxx>
#include <svl/languageoptions.hxx>
#include <svl/stritem.hxx>
#include <svl/whiter.hxx>
#include <vcl/msgbox.hxx>
+#include <svx/svxdlg.hxx>
+#include <editeng/colritem.hxx>
#include "tabvwsh.hxx"
#include "sc.hrc"
@@ -52,9 +53,16 @@
//CHINA001 #include "strindlg.hxx"
//CHINA001 #include "mvtabdlg.hxx"
#include "docfunc.hxx"
+#include "eventuno.hxx"
#include "scabstdlg.hxx" //CHINA001
+#include "tabbgcolor.hxx"
+#include "tabbgcolordlg.hxx"
+
+using ::boost::scoped_ptr;
+using namespace com::sun::star;
+
#define IS_AVAILABLE(WhichId,ppItem) \
(pReqArgs->GetItemState((WhichId), TRUE, ppItem ) == SFX_ITEM_SET)
@@ -683,6 +691,134 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq )
}
break;
+ case FID_TAB_SET_TAB_BG_COLOR:
+ case FID_TAB_MENU_SET_TAB_BG_COLOR:
+ {
+ if ( nSlot == FID_TAB_MENU_SET_TAB_BG_COLOR )
+ nSlot = FID_TAB_SET_TAB_BG_COLOR;
+ SCTAB nTabNr = pViewData->GetTabNo();
+ ScMarkData& rMark = pViewData->GetMarkData();
+ SCTAB nTabSelCount = rMark.GetSelectCount();
+ if ( !pDoc->IsDocEditable() )
+ break;
+
+ if ( pDoc->IsTabProtected( nTabNr ) ) // ||nTabSelCount > 1
+ break;
+
+ if( pReqArgs != NULL )
+ {
+ BOOL bDone = FALSE;
+ const SfxPoolItem* pItem;
+ Color aColor;
+ if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
+ nTabNr = ((const SfxUInt16Item*)pItem)->GetValue();
+
+ if( IS_AVAILABLE( nSlot, &pItem ) )
+ aColor = ((const SvxColorItem*)pItem)->GetValue();
+
+ if ( nTabSelCount > 1 )
+ {
+ scoped_ptr<ScUndoTabColorInfo::List>
+ pTabColorList(new ScUndoTabColorInfo::List);
+ for (SCTAB nTab=0; nTab<nTabCount; nTab++)
+ {
+ if ( rMark.GetTableSelect(nTab) && !pDoc->IsTabProtected(nTab) )
+ {
+ ScUndoTabColorInfo aTabColorInfo(nTab);
+ aTabColorInfo.maNewTabBgColor = aColor;
+ pTabColorList->push_back(aTabColorInfo);
+ }
+ }
+ bDone = SetTabBgColor( *pTabColorList );
+ }
+ else
+ {
+ bDone = SetTabBgColor( aColor, nCurrentTab ); //ScViewFunc.SetTabBgColor
+ }
+ if( bDone )
+ {
+ rReq.Done( *pReqArgs );
+ }
+ }
+ else
+ {
+ USHORT nRet = RET_OK; /// temp
+ BOOL bDone = FALSE; /// temp
+ Color aTabBgColor;
+ Color aNewTabBgColor;
+
+ aTabBgColor = pDoc->GetTabBgColor( nCurrentTab );
+ ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
+ DBG_ASSERT(pFact, "ScAbstractFactory create fail!");
+ AbstractScTabBgColorDlg* pDlg = pFact->CreateScTabBgColorDlg(
+ GetDialogParent(),
+ String(ScResId(SCSTR_SET_TAB_BG_COLOR)),
+ String(ScResId(SCSTR_NO_TAB_BG_COLOR)),
+ aTabBgColor,
+ nSlot,RID_SCDLG_TAB_BG_COLOR);
+ while ( !bDone && nRet == RET_OK )
+ {
+ nRet = pDlg->Execute();
+ if( nRet == RET_OK )
+ {
+ Color aSelectedColor;
+ pDlg->GetSelectedColor(aSelectedColor);
+ scoped_ptr<ScUndoTabColorInfo::List>
+ pTabColorList(new ScUndoTabColorInfo::List);
+ if ( nTabSelCount > 1 )
+ {
+ for (SCTAB nTab=0; nTab<nTabCount; nTab++)
+ {
+ if ( rMark.GetTableSelect(nTab) && !pDoc->IsTabProtected(nTab) )
+ {
+ ScUndoTabColorInfo aTabColorInfo(nTab);
+ aTabColorInfo.maNewTabBgColor = aSelectedColor;
+ pTabColorList->push_back(aTabColorInfo);
+ }
+ }
+ bDone = SetTabBgColor( *pTabColorList );
+ }
+ else
+ {
+ bDone = SetTabBgColor( aSelectedColor, nCurrentTab ); //ScViewFunc.SetTabBgColor
+ }
+ if ( bDone )
+ {
+ rReq.AppendItem( SvxColorItem( aTabBgColor, nSlot ) );
+ rReq.Done();
+ }
+ else
+ {
+ if( rReq.IsAPI() )
+ {
+ StarBASIC::Error( SbERR_SETPROP_FAILED );
+ }
+ }
+ }
+ }
+ delete( pDlg );
+ }
+ }
+ break;
+
+ case FID_TAB_EVENTS:
+ {
+ ScDocShell* pDocSh = pViewData->GetDocShell();
+ uno::Reference<container::XNameReplace> xEvents( new ScSheetEventsObj( pDocSh, nCurrentTab ) );
+ uno::Reference<frame::XFrame> xFrame = GetViewFrame()->GetFrame().GetFrameInterface();
+ SvxAbstractDialogFactory* pDlgFactory = SvxAbstractDialogFactory::Create();
+ if (pDlgFactory)
+ {
+ std::auto_ptr<VclAbstractDialog> pDialog( pDlgFactory->CreateSvxMacroAssignDlg(
+ GetDialogParent(), xFrame, false, xEvents, 0 ) );
+ if ( pDialog.get() && pDialog->Execute() == RET_OK )
+ {
+ // the dialog modifies the settings directly
+ }
+ }
+ }
+ break;
+
default:
DBG_ERROR("Unbekannte Message bei ViewShell");
break;
@@ -801,6 +937,23 @@ void ScTabViewShell::GetStateTable( SfxItemSet& rSet )
rSet.Put( SfxBoolItem( nWhich, pDoc->IsLayoutRTL( nTab ) ) );
}
break;
+
+ case FID_TAB_MENU_SET_TAB_BG_COLOR:
+ {
+ if ( !pDoc->IsDocEditable()
+ || ( pDocShell && pDocShell->IsDocShared() )
+ || pDoc->IsTabProtected(nTab) )
+ rSet.DisableItem( nWhich );
+ }
+ break;
+
+ case FID_TAB_SET_TAB_BG_COLOR:
+ {
+ Color aColor;
+ aColor = pDoc->GetTabBgColor( nTab );
+ rSet.Put( SvxColorItem( aColor, nWhich ) );
+ }
+ break;
}
nWhich = aIter.NextWhich();
}
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 6b13c1bedcbf..c034836d4d4a 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -160,9 +160,6 @@ void ScViewDataTable::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>
pSettings[SC_TABLE_ZOOM_VALUE].Value <<= nZoomValue;
pSettings[SC_TABLE_PAGE_VIEW_ZOOM_VALUE].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_PAGEVIEWZOOMVALUE));
pSettings[SC_TABLE_PAGE_VIEW_ZOOM_VALUE].Value <<= nPageZoomValue;
-
-// pSettings[SC_TABLE_SELECTED].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_TABLESELECTED));
-// pSettings[SC_TABLE_SELECTED].Value <<= bool(rViewData.GetMarkData().GetTableSelect( nTab ));
}
}
@@ -273,6 +270,17 @@ void ScViewDataTable::ReadUserDataSequence(const uno::Sequence <beans::PropertyV
aSettings[i].Value >>= bSelected;
rViewData.GetMarkData().SelectTable( nTab, bSelected );
}
+ else if (sName.compareToAscii(SC_UNONAME_TABCOLOR) == 0)
+ {
+ // There are documents out there that have their tab color defined as a view setting.
+ sal_Int32 nColor = COL_AUTO;
+ aSettings[i].Value >>= nColor;
+ if (static_cast<ColorData>(nColor) != COL_AUTO)
+ {
+ ScDocument* pDoc = rViewData.GetDocument();
+ pDoc->SetTabBgColor(nTab, Color(static_cast<ColorData>(nColor)));
+ }
+ }
}
if (eHSplitMode == SC_SPLIT_FIX)
nFixPosX = SanitizeCol( static_cast<SCCOL>( bHasHSplitInTwips ? nTempPosHTw : nTempPosH ));
@@ -1595,7 +1603,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
nScrPosY = 65535;
else
{
- nTSize = pDoc->FastGetRowHeight( nY, nTabNo );
+ nTSize = pDoc->GetRowHeight( nY, nTabNo );
if (nTSize)
{
long nSizeYPix = ToPixel( nTSize, nPPTY );
@@ -1604,7 +1612,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
else if ( nY < MAXROW )
{
// skip multiple hidden rows (forward only for now)
- SCROW nNext = pDoc->FastGetFirstNonHiddenRow( nY + 1, nTabNo );
+ SCROW nNext = pDoc->FirstVisibleRow(nY + 1, MAXROW, nTabNo);
if ( nNext > MAXROW )
nY = MAXROW;
else
@@ -1616,7 +1624,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
for (nY=nPosY; nY>nWhereY;)
{
--nY;
- nTSize = pDoc->FastGetRowHeight( nY, nTabNo );
+ nTSize = pDoc->GetRowHeight( nY, nTabNo );
if (nTSize)
{
long nSizeYPix = ToPixel( nTSize, nPPTY );
@@ -1706,8 +1714,7 @@ SCROW ScViewData::CellsAtY( SCsROW nPosY, SCsROW nDir, ScVSplitPos eWhichY, USHO
bOut = TRUE;
else
{
-// USHORT nTSize = pDoc->GetRowHeight( nRowNo, nTabNo );
- USHORT nTSize = pDoc->FastGetRowHeight( nRowNo, nTabNo );
+ USHORT nTSize = pDoc->GetRowHeight( nRowNo, nTabNo );
if (nTSize)
{
long nSizeYPix = ToPixel( nTSize, nPPTY );
@@ -1716,7 +1723,7 @@ SCROW ScViewData::CellsAtY( SCsROW nPosY, SCsROW nDir, ScVSplitPos eWhichY, USHO
else if ( nDir == 1 && nRowNo < MAXROW )
{
// skip multiple hidden rows (forward only for now)
- SCROW nNext = pDoc->FastGetFirstNonHiddenRow( nRowNo + 1, nTabNo );
+ SCROW nNext = pDoc->FirstVisibleRow(nRowNo + 1, MAXROW, nTabNo);
if ( nNext > MAXROW )
{
// same behavior as without the optimization: set bOut with nY=MAXROW+1
@@ -1779,11 +1786,19 @@ BOOL ScViewData::GetMergeSizePixel( SCCOL nX, SCROW nY, long& rSizeXPix, long& r
for (SCCOL i=0; i<nCountX; i++)
nOutWidth += ToPixel( pDoc->GetColWidth(nX+i,nTabNo), nPPTX );
SCROW nCountY = pMerge->GetRowMerge();
- ScCoupledCompressedArrayIterator< SCROW, BYTE, USHORT> aIter(
- pDoc->GetRowFlagsArray( nTabNo), nY, nY+nCountY-1, CR_HIDDEN,
- 0, pDoc->GetRowHeightArray( nTabNo));
- for ( ; aIter; ++aIter )
- nOutHeight += ToPixel( *aIter, nPPTY );
+
+ for (SCROW nRow = nY; nRow <= nY+nCountY-1; ++nRow)
+ {
+ SCROW nLastRow = nRow;
+ if (pDoc->RowHidden(nRow, nTabNo, NULL, &nLastRow))
+ {
+ nRow = nLastRow;
+ continue;
+ }
+
+ USHORT nHeight = pDoc->GetRowHeight(nRow, nTabNo);
+ nOutHeight += ToPixel(nHeight, nPPTY);
+ }
rSizeXPix = nOutWidth;
rSizeYPix = nOutHeight;
@@ -1843,7 +1858,7 @@ BOOL ScViewData::GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich,
{
while ( rPosY<=MAXROW && nClickY >= nScrY )
{
- nScrY += ToPixel( pDoc->FastGetRowHeight( rPosY, nTabNo ), nPPTY );
+ nScrY += ToPixel( pDoc->GetRowHeight( rPosY, nTabNo ), nPPTY );
++rPosY;
}
--rPosY;
@@ -1853,7 +1868,7 @@ BOOL ScViewData::GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich,
while ( rPosY>0 && nClickY < nScrY )
{
--rPosY;
- nScrY -= ToPixel( pDoc->FastGetRowHeight( rPosY, nTabNo ), nPPTY );
+ nScrY -= ToPixel( pDoc->GetRowHeight( rPosY, nTabNo ), nPPTY );
}
}
@@ -1973,14 +1988,14 @@ void ScViewData::SetPosY( ScVSplitPos eWhich, SCROW nNewPosY )
if ( nNewPosY > nOldPosY )
for ( i=nOldPosY; i<nNewPosY; i++ )
{
- long nThis = pDoc->FastGetRowHeight( i,nTabNo );
+ long nThis = pDoc->GetRowHeight( i,nTabNo );
nTPosY -= nThis;
nPixPosY -= ToPixel(sal::static_int_cast<USHORT>(nThis), nPPTY);
}
else
for ( i=nNewPosY; i<nOldPosY; i++ )
{
- long nThis = pDoc->FastGetRowHeight( i,nTabNo );
+ long nThis = pDoc->GetRowHeight( i,nTabNo );
nTPosY += nThis;
nPixPosY += ToPixel(sal::static_int_cast<USHORT>(nThis), nPPTY);
}
@@ -2010,7 +2025,7 @@ void ScViewData::RecalcPixPos() // nach Zoom-Aenderungen
long nPixPosY = 0;
SCROW nPosY = pThisTab->nPosY[eWhich];
for (SCROW j=0; j<nPosY; j++)
- nPixPosY -= ToPixel(pDoc->FastGetRowHeight(j,nTabNo), nPPTY);
+ nPixPosY -= ToPixel(pDoc->GetRowHeight(j,nTabNo), nPPTY);
pThisTab->nPixPosY[eWhich] = nPixPosY;
}
}
@@ -2053,7 +2068,7 @@ void ScViewData::SetScreen( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
for (nRow=nRow1; nRow<=nRow2; nRow++)
{
- nTSize = pDoc->FastGetRowHeight( nRow, nTabNo );
+ nTSize = pDoc->GetRowHeight( nRow, nTabNo );
if (nTSize)
{
nSizePix = ToPixel( nTSize, nPPTY );
@@ -2095,7 +2110,7 @@ void ScViewData::SetScreenPos( const Point& rVisAreaStart )
bEnd = FALSE;
while (!bEnd)
{
- nAdd = (long) pDoc->FastGetRowHeight(nY1,nTabNo);
+ nAdd = (long) pDoc->GetRowHeight(nY1,nTabNo);
if (nSize+nAdd <= nTwips+1 && nY1<MAXROW)
{
nSize += nAdd;
@@ -3047,7 +3062,7 @@ BOOL ScViewData::UpdateFixY( SCTAB nTab ) // TRUE = Wert geaendert
long nNewPos = 0;
for (SCROW nY=pTabData[nTab]->nPosY[SC_SPLIT_TOP]; nY<nFix; nY++)
{
- USHORT nTSize = pLocalDoc->FastGetRowHeight( nY, nTab );
+ USHORT nTSize = pLocalDoc->GetRowHeight( nY, nTab );
if (nTSize)
{
long nPix = ToPixel( nTSize, nPPTY );
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx
index 11ecfa5aae8c..34fbbfdad5b5 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -86,6 +86,7 @@
#include "funcdesc.hxx"
#include "docuno.hxx"
#include "charthelper.hxx"
+#include "tabbgcolor.hxx"
#include <basic/sbstar.hxx>
#include <com/sun/star/container/XNameContainer.hpp>
@@ -2201,6 +2202,8 @@ BOOL ScViewFunc::DeleteTables(const SvShorts &TheTabs, BOOL bRecord )
pUndoDoc->SetActiveScenario( nTab, bActive );
}
pUndoDoc->SetVisible( nTab, pDoc->IsVisible( nTab ) );
+ pUndoDoc->SetTabBgColor( nTab, pDoc->GetTabBgColor(nTab) );
+ pUndoDoc->SetSheetEvents( nTab, pDoc->GetSheetEvents( nTab ) );
if ( pDoc->IsTabProtected( nTab ) )
pUndoDoc->SetTabProtection(nTab, pDoc->GetTabProtection(nTab));
@@ -2291,6 +2294,28 @@ BOOL ScViewFunc::RenameTable( const String& rName, SCTAB nTab )
//----------------------------------------------------------------------------
+bool ScViewFunc::SetTabBgColor( const Color& rColor, SCTAB nTab )
+{
+ bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().SetTabBgColor( nTab, rColor, TRUE, FALSE );
+ if (bSuccess)
+ {
+ GetViewData()->GetViewShell()->UpdateInputHandler();
+ }
+ return bSuccess;
+}
+
+bool ScViewFunc::SetTabBgColor( ScUndoTabColorInfo::List& rUndoSetTabBgColorInfoList )
+{
+ bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().SetTabBgColor( rUndoSetTabBgColorInfoList, TRUE, FALSE );
+ if (bSuccess)
+ {
+ GetViewData()->GetViewShell()->UpdateInputHandler();
+ }
+ return bSuccess;
+}
+
+//----------------------------------------------------------------------------
+
void ScViewFunc::InsertAreaLink( const String& rFile,
const String& rFilter, const String& rOptions,
const String& rSource, ULONG nRefresh )
diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx
index dacb41cd1aea..24fab9ac2eba 100644
--- a/sc/source/ui/view/viewfun3.cxx
+++ b/sc/source/ui/view/viewfun3.cxx
@@ -1723,10 +1723,10 @@ BOOL ScViewFunc::MoveBlockTo( const ScRange& rSource, const ScAddress& rDestPos,
BOOL bIncludeFiltered = bCut;
if ( !bIncludeFiltered )
{
- // manually find number of non-filtered rows
- SCROW nPastedCount = pDocSh->GetDocument()->GetRowFlagsArray(
- rSource.aStart.Tab()).CountForCondition(
- rSource.aStart.Row(), rSource.aEnd.Row(), CR_FILTERED, 0);
+ // find number of non-filtered rows
+ SCROW nPastedCount = pDocSh->GetDocument()->CountNonFilteredRows(
+ rSource.aStart.Row(), rSource.aEnd.Row(), rSource.aStart.Tab());
+
if ( nPastedCount == 0 )
nPastedCount = 1;
aDestEnd.SetRow( rDestPos.Row() + nPastedCount - 1 );
diff --git a/sc/source/ui/view/viewfun5.cxx b/sc/source/ui/view/viewfun5.cxx
index 9697cae3a57e..dc4e96bbbf34 100644
--- a/sc/source/ui/view/viewfun5.cxx
+++ b/sc/source/ui/view/viewfun5.cxx
@@ -110,7 +110,7 @@ BOOL ScViewFunc::PasteDataFormat( ULONG nFormatId,
nXT += pDoc->GetColWidth(i,nTab);
if (pDoc->IsNegativePage(nTab))
nXT = -nXT;
- ULONG nYT = pDoc->FastGetRowHeight( 0, nPosY-1, nTab);
+ ULONG nYT = pDoc->GetRowHeight( 0, nPosY-1, nTab);
aPos = Point( (long)(nXT * HMM_PER_TWIPS), (long)(nYT * HMM_PER_TWIPS) );
}
}
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 5d3bf97aa29c..231eb4e67562 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -2195,28 +2195,19 @@ void ScViewFunc::SetWidthOrHeight( BOOL bWidth, SCCOLROW nRangeCnt, SCCOLROW* pR
{
// fuer alle eingeblendeten CR_MANUALSIZE loeschen,
// dann SetOptimalHeight mit bShrink = FALSE
- ScCompressedArrayIterator< SCROW, BYTE> aIter(
- pDoc->GetRowFlagsArray( nTab), nStartNo,
- nEndNo);
- do
+ for (SCROW nRow = nStartNo; nRow <= nEndNo; ++nRow)
{
- BYTE nOld = *aIter;
- if ( (nOld & CR_HIDDEN) == 0 && ( nOld & CR_MANUALSIZE ) )
+ SCROW nLastRow = nRow;
+ if (pDoc->RowHidden(nRow, nTab, NULL, &nLastRow))
{
- SCROW nRangeEnd = aIter.GetRangeEnd();
- pDoc->SetRowFlags( aIter.GetRangeStart(),
- nRangeEnd, nTab,
- nOld & ~CR_MANUALSIZE);
- aIter.Resync( nRangeEnd);
- // Range may be extended due to merges and
- // now aIter.GetRangeEnd() may point behind
- // the previous row, but all flags of this
- // range have the CR_MANUALSIZE bit
- // removed, so it is safe to continue with
- // the next range, not necessary to catch
- // up with the remaining rows.
+ nRow = nLastRow;
+ continue;
}
- } while (aIter.NextRange());
+
+ BYTE nOld = pDoc->GetRowFlags(nRow, nTab);
+ if (nOld & CR_MANUALSIZE)
+ pDoc->SetRowFlags(nRow, nTab, nOld & ~CR_MANUALSIZE);
+ }
}
double nPPTX = GetViewData()->GetPPTX();
@@ -2258,8 +2249,7 @@ void ScViewFunc::SetWidthOrHeight( BOOL bWidth, SCCOLROW nRangeCnt, SCCOLROW* pR
{
for (SCCOL nCol=static_cast<SCCOL>(nStartNo); nCol<=static_cast<SCCOL>(nEndNo); nCol++)
{
- if ( eMode != SC_SIZE_VISOPT ||
- (pDoc->GetColFlags( nCol, nTab ) & CR_HIDDEN) == 0 )
+ if ( eMode != SC_SIZE_VISOPT || !pDoc->ColHidden(nCol, nTab) )
{
USHORT nThisSize = nSizeTwips;
diff --git a/sc/source/ui/view/viewutil.cxx b/sc/source/ui/view/viewutil.cxx
index d887aec8bc5b..a6b4e320d3ab 100644
--- a/sc/source/ui/view/viewutil.cxx
+++ b/sc/source/ui/view/viewutil.cxx
@@ -271,20 +271,19 @@ void ScViewUtil::UnmarkFiltered( ScMarkData& rMark, ScDocument* pDoc )
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
if ( rMark.GetTableSelect(nTab ) )
{
- ScCompressedArrayIterator<SCROW, BYTE> aIter(pDoc->GetRowFlagsArray(nTab), nStartRow, nEndRow);
- do
+ for (SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
{
- if (*aIter & CR_FILTERED)
+ SCROW nLastRow = nRow;
+ if (pDoc->RowFiltered(nRow, nTab, NULL, &nLastRow))
{
// use nStartCol/nEndCol, so the multi mark area isn't extended to all columns
// (visible in repaint for indentation)
-
- rMark.SetMultiMarkArea( ScRange( nStartCol, aIter.GetRangeStart(), nTab,
- nEndCol, aIter.GetRangeEnd(), nTab ), FALSE );
+ rMark.SetMultiMarkArea(
+ ScRange(nStartCol, nRow, nTab, nEndCol, nLastRow, nTab), false);
bChanged = true;
+ nRow = nLastRow;
}
}
- while (aIter.NextRange());
}
if ( bChanged && !rMark.HasAnyMultiMarks() )
@@ -295,34 +294,29 @@ void ScViewUtil::UnmarkFiltered( ScMarkData& rMark, ScDocument* pDoc )
// static
-bool ScViewUtil::FitToUnfilteredRows( ScRange & rRange, const ScDocument * pDoc, size_t nRows )
+bool ScViewUtil::FitToUnfilteredRows( ScRange & rRange, ScDocument * pDoc, size_t nRows )
{
SCTAB nTab = rRange.aStart.Tab();
bool bOneTabOnly = (nTab == rRange.aEnd.Tab());
// Always fit the range on its first sheet.
DBG_ASSERT( bOneTabOnly, "ScViewUtil::ExtendToUnfilteredRows: works only on one sheet");
SCROW nStartRow = rRange.aStart.Row();
- // FillArrayForCondition() usually is the fastest to determine such a set
- // in one pass, even if the array isn't used but the last element.
- SCROW* pArr = new SCROW[nRows];
- size_t nCount = pDoc->GetRowFlagsArray( nTab).FillArrayForCondition(
- nStartRow, MAXROW, CR_FILTERED, 0, pArr, nRows);
- if (nCount)
- rRange.aEnd.SetRow( pArr[nCount-1]);
- delete [] pArr;
- return nCount == nRows && bOneTabOnly;
+ SCROW nLastRow = pDoc->LastNonFilteredRow(nStartRow, MAXROW, nTab);
+ if (ValidRow(nLastRow))
+ rRange.aEnd.SetRow(nLastRow);
+ SCROW nCount = pDoc->CountNonFilteredRows(nStartRow, MAXROW, nTab);
+ return static_cast<size_t>(nCount) == nRows && bOneTabOnly;
}
// static
-bool ScViewUtil::HasFiltered( const ScRange& rRange, const ScDocument* pDoc )
+bool ScViewUtil::HasFiltered( const ScRange& rRange, ScDocument* pDoc )
{
SCROW nStartRow = rRange.aStart.Row();
SCROW nEndRow = rRange.aEnd.Row();
for (SCTAB nTab=rRange.aStart.Tab(); nTab<=rRange.aEnd.Tab(); nTab++)
{
- if ( pDoc->GetRowFlagsArray( nTab).HasCondition( nStartRow, nEndRow,
- CR_FILTERED, CR_FILTERED ) )
+ if (pDoc->HasFilteredRows(nStartRow, nEndRow, nTab))
return true;
}