24 #include <osl/diagnose.h>
31 #include <stlpool.hxx>
37 #include <globstr.hrc>
47 bool isCellQualified(
const ScDocument* pDoc,
SCCOL nCol,
SCROW nRow,
SCTAB nTab,
bool bSelectLocked,
bool bSelectUnlocked)
52 if (bCellProtected && !bSelectLocked)
55 if (!bCellProtected && !bSelectUnlocked)
61 void moveCursorByProtRule(
64 bool bSelectLocked =
true;
65 bool bSelectUnlocked =
true;
67 if (pTabProtection && pTabProtection->
isProtected())
77 SCCOL nNewUnhiddenCol = rCol + 1;
79 while(pDoc->
ColHidden(nNewUnhiddenCol, nTab,
nullptr, &nEndCol))
81 if(nNewUnhiddenCol >= pDoc->
MaxCol())
84 i += nEndCol - nNewUnhiddenCol + 1;
85 nNewUnhiddenCol = nEndCol +1;
88 if (!isCellQualified(pDoc, nNewUnhiddenCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
90 rCol = nNewUnhiddenCol;
95 for (
SCCOL i = 0;
i > nMovX && rCol > 0; --
i)
97 SCCOL nNewUnhiddenCol = rCol - 1;
99 while(pDoc->
ColHidden(nNewUnhiddenCol, nTab, &nStartCol))
101 if(nNewUnhiddenCol <= 0)
104 i -= nNewUnhiddenCol - nStartCol + 1;
105 nNewUnhiddenCol = nStartCol - 1;
108 if (!isCellQualified(pDoc, nNewUnhiddenCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
110 rCol = nNewUnhiddenCol;
118 SCROW nNewUnhiddenRow = rRow + 1;
120 while(pDoc->
RowHidden(nNewUnhiddenRow, nTab,
nullptr, &nEndRow))
122 if(nNewUnhiddenRow >= pDoc->
MaxRow())
125 i += nEndRow - nNewUnhiddenRow + 1;
126 nNewUnhiddenRow = nEndRow + 1;
129 if (!isCellQualified(pDoc, rCol, nNewUnhiddenRow, nTab, bSelectLocked, bSelectUnlocked))
131 rRow = nNewUnhiddenRow;
136 for (
SCROW i = 0;
i > nMovY && rRow > 0; --
i)
138 SCROW nNewUnhiddenRow = rRow - 1;
140 while(pDoc->
RowHidden(nNewUnhiddenRow, nTab, &nStartRow))
142 if(nNewUnhiddenRow <= 0)
145 i -= nNewUnhiddenRow - nStartRow + 1;
146 nNewUnhiddenRow = nStartRow - 1;
149 if (!isCellQualified(pDoc, rCol, nNewUnhiddenRow, nTab, bSelectLocked, bSelectUnlocked))
151 rRow = nNewUnhiddenRow;
164 else if (rCol > pDoc->
MaxCol())
175 else if (rRow > pDoc->
MaxRow())
183 void moveCursorByMergedCell(
191 bool bSelectLocked =
true;
192 bool bSelectUnlocked =
true;
193 if (pTabProtection && pTabProtection->
isProtected())
201 bool bOriginMerged =
false;
204 if (pMergeAttr && pMergeAttr->
IsMerged())
208 bOriginMerged =
true;
217 if (nOrigX < pDoc->MaxCol() && nOrigX < rCol && rCol <= nOrigX + nColSpan - 1)
218 rCol = nOrigX + nColSpan;
228 checkBoundary(pDoc, rCol, rRow);
229 if (!isCellQualified(pDoc, rCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
238 if (nOrigX > 0 && nOrigX <= rCol && rCol < nOrigX + nColSpan - 1)
250 checkBoundary(pDoc, rCol, rRow);
251 if (!isCellQualified(pDoc, rCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
261 if (nOrigY < pDoc->MaxRow() && nOrigY < rRow && rRow <= nOrigY + nRowSpan - 1)
262 rRow = nOrigY + nRowSpan;
272 checkBoundary(pDoc, rCol, rRow);
273 if (!isCellQualified(pDoc, rCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
283 if (nOrigY > 0 && nOrigY <= rRow && rRow < nOrigY + nRowSpan - 1)
295 checkBoundary(pDoc, rCol, rRow);
296 if (!isCellQualified(pDoc, rCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
306 if (!rDoc.ValidCol(nStartCol)) nStartCol = rDoc.
MaxCol();
307 if (!rDoc.ValidRow(nStartRow)) nStartRow = rDoc.MaxRow();
308 if (!rDoc.ValidCol(nEndCol)) nEndCol = rDoc.MaxCol();
309 if (!rDoc.ValidRow(nEndRow)) nEndRow = rDoc.MaxRow();
311 bool bLeft = (nStartCol==0 && nEndCol==rDoc.MaxCol());
312 bool bTop = (nStartRow==0 && nEndRow==rDoc.MaxRow());
354 bool bTestNeg,
bool bCols,
bool bRows,
bool bForceNeg )
360 if (!rDoc.ValidCol(nCurX)) nCurX = rDoc.
MaxCol();
361 if (!rDoc.ValidRow(nCurY)) nCurY = rDoc.MaxRow();
450 bool bCols,
bool bRows,
bool bCellSelection )
458 OSL_FAIL(
"MarkCursor not in BlockMode" );
463 nCurY = rDocument.
MaxRow();
465 nCurX = rDocument.
MaxCol();
483 InitBlockMode( aMarkRange.aStart.Col(), aMarkRange.aStart.Row(),
493 if ( bCellSelection )
497 SCCOL nCurXOffset = 0;
498 SCCOL nBlockStartXOffset = 0;
499 SCROW nCurYOffset = 0;
500 SCROW nBlockStartYOffset = 0;
501 bool bBlockStartMerged =
false;
525 bBlockStartMerged =
true;
546 SCCOL nCurXOffsetTemp = (nCurX < nCurX + nColSpan - 1) ? nColSpan - 1 : 0;
547 nCurXOffset = std::max(nCurXOffset, nCurXOffsetTemp);
551 SCROW nCurYOffsetTemp = (nCurY < nCurY + nRowSpan - 1) ? nRowSpan - 1 : 0;
552 nCurYOffset = std::max(nCurYOffset, nCurYOffsetTemp);
566 if ( !bBlockStartMerged )
596 if ( !bCols && !bRows )
643 if (nMovX != 0 && nPageX == 0) nPageX = (nMovX>0) ? 1 : -1;
644 if (nMovY != 0 && nPageY == 0) nPageY = (nMovY>0) ? 1 : -1;
685 SCCOL nVirtualX = bLegacyCellSelection ? nNewX : nCurX;
686 SCROW nVirtualY = bLegacyCellSelection ? nNewY : nCurY;
690 for ( i=0; i<nMovX; i++ )
693 for ( i=0; i<-nMovX; i++ )
696 for ( i=0; i<nMovY; i++ )
699 for ( i=0; i<-nMovY; i++ )
704 if (nMovX != 0 && nNewX == rDoc.
MaxCol())
706 if (nMovY != 0 && nNewY == rDoc.
MaxRow())
722 rAreaX = nNewX - nCurX;
723 rAreaY = nNewY - nCurY;
733 bool bSkipProtected =
false, bSkipUnprotected =
false;
741 bool bSkipCell =
false;
747 if (bSkipProtected && !bSkipCell)
749 if (bSkipUnprotected && !bSkipCell)
754 if (rCurX <= 0 || rCurX >= nMaxCol)
793 bool bSkipProtected =
false, bSkipUnprotected =
false;
801 bool bSkipCell =
false;
807 if (bSkipProtected && !bSkipCell)
809 if (bSkipUnprotected && !bSkipCell)
814 if (rCurY <= 0 || rCurY >= rDoc.
MaxRow())
850 if (!nMovX && !nMovY)
870 bool bSelectLocked =
true;
871 bool bSelectUnlocked =
true;
873 if (pTabProtection && pTabProtection->
isProtected())
879 moveCursorByProtRule(nNewX, nNewY, nMovX, nMovY, nRefTab, &rDoc);
880 checkBoundary(&rDoc, nNewX, nNewY);
884 SCCOL nTempX = nNewX;
891 if (!checkBoundary(&rDoc, nTempX, nNewY))
894 if (isCellQualified(&rDoc, nTempX, nNewY, nRefTab, bSelectLocked, bSelectUnlocked))
900 SCROW nTempY = nNewY;
907 if (!checkBoundary(&rDoc, nNewX, nTempY))
910 if (isCellQualified(&rDoc, nNewX, nTempY, nRefTab, bSelectLocked, bSelectUnlocked))
916 SCCOL nTargetCol = nNewX;
917 SCROW nTargetRow = nNewY;
982 if (pWin && pWin->IsVisible())
983 pWin->UpdateCopySourceOverlay();
989 if ( pWin && pWin->IsVisible() )
990 pWin->UpdateSelectionOverlay();
996 if ( pWin && pWin->IsVisible() )
997 pWin->UpdateShrinkOverlay();
1003 if ( pWin && pWin->IsVisible() )
1004 pWin->UpdateAllOverlays();
1040 bool bDidReset =
false;
1058 if ( bReset && !bDidReset )
1124 double fZoomFactor =
static_cast<double>(
Fraction(nZoom,100));
1125 fScaleX *= fZoomFactor;
1126 fScaleY *= fZoomFactor;
1130 for (nCol=0; nCol<nFixPosX; nCol++)
1133 sal_uInt16 nColTwips = pDoc->
GetColWidth( nCol, nTab );
1136 nBlockX +=
static_cast<tools::Long>(nColTwips * fScaleX);
1137 if (nBlockX > nWindowX)
1141 for (nCol=nStartCol; nCol<=nEndCol; nCol++)
1143 sal_uInt16 nColTwips = pDoc->
GetColWidth( nCol, nTab );
1146 nBlockX +=
static_cast<tools::Long>(nColTwips * fScaleX);
1147 if (nBlockX > nWindowX)
1153 for (
SCROW nRow = 0; nRow <= nFixPosY-1; ++nRow)
1162 nBlockY +=
static_cast<tools::Long>(nRowTwips * fScaleY);
1163 if (nBlockY > nWindowY)
1167 for (
SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
1172 nBlockY +=
static_cast<tools::Long>(nRowTwips * fScaleY);
1173 if (nBlockY > nWindowY)
1183 sal_uInt16 nZoom = 100;
1187 case SvxZoomType::PERCENT:
1191 case SvxZoomType::OPTIMAL:
1212 if ( nTab < nStartTab && nTab > nEndTab )
1224 if ( nStartCol < nFixPosX )
1225 nStartCol = nFixPosX;
1232 if ( nStartRow < nFixPosY )
1233 nStartRow = nFixPosY;
1241 Size aWinSize =
pGridWin[eUsedPart]->GetOutputSizePixel();
1245 if ( nFixPosX != 0 )
1247 if ( nFixPosY != 0 )
1256 while ( nMax > nMin )
1258 sal_uInt16 nTest = (nMin+nMax+1)/2;
1260 nPPTX, nPPTY, nTest, aWinSize.
Width(), aWinSize.
Height(),
1261 &rDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow,
1262 nFixPosX, nFixPosY ) )
1267 OSL_ENSURE( nMin == nMax,
"Nesting is wrong" );
1270 if ( nZoom != nOldZoom )
1275 if ( nStartCol <= nEndCol )
1277 if ( nStartRow <= nEndRow )
1285 case SvxZoomType::WHOLEPAGE:
1286 case SvxZoomType::PAGEWIDTH:
1293 SfxStyleFamily::Page );
1295 OSL_ENSURE( pStyleSheet,
"PageStyle not found :-/" );
1303 Size aPageSize = aPrintFunc.GetDataSize();
1319 GetOutputSizePixel().Width();
1325 aPageSize.AdjustWidth(rDoc.
GetColWidth( nCol, nCurTab ) );
1327 else if ( nOtherWidth > aWinSize.
Width() )
1334 GetOutputSizePixel().Height();
1342 else if ( nOtherHeight > aWinSize.
Height() )
1350 ( aPageSize.Width() *
nPPTX ) );
1352 ( aPageSize.Height() *
nPPTY ) );
1355 nZoom =
static_cast<sal_uInt16
>(nZoomX);
1357 if (eType == SvxZoomType::WHOLEPAGE && nZoomY > 0 && nZoomY < nZoom)
1358 nZoom =
static_cast<sal_uInt16
>(nZoomY);
1364 OSL_FAIL(
"Unknown Zoom-Revision");
1390 if (pWin && pWin->IsVisible())
1391 pWin->HideNoteMarker();
1402 OSL_ENSURE(
pDrawView,
"ScTabView::MakeDrawLayer does not work");
1408 pWin->DrawLayerCreated();
1415 if (
SC_MOD()->IsInExecuteDrop() )
1425 bool bFocus = pParent && pParent->
has_focus();
1427 if (pGlobStrId && strcmp(pGlobStrId, STR_PROTECTIONERR) == 0)
1431 pGlobStrId = STR_READONLYERR;
1436 VclMessageType::Info, VclButtonsType::Ok,
1438 weld::Window* pGrabOnClose = bFocus ? pParent :
nullptr;
1448 std::unique_ptr<ScPageBreakData> pNewData;
1466 pNewData->AddPages();
ScMarkData & GetMarkData()
SCCOL GetColMerge() const
void InitRefMode(SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, ScRefType eType)
void SelectAll(bool bContinue=false)
ScDocShell * GetDocShell() const
static bool lcl_FitsInWindow(double fScaleX, double fScaleY, sal_uInt16 nZoom, tools::Long nWindowX, tools::Long nWindowY, const ScDocument *pDoc, SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCCOL nFixPosX, SCROW nFixPosY)
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
std::array< VclPtr< ScRowBar >, 2 > pRowBar
SfxPrinter * GetPrinter(bool bCreateIfNotExist=true)
ScVSplitPos WhichV(ScSplitPos ePos)
void setWidth(tools::Long nWidth)
sheet protection state container
SCROW GetRefStartY() const
ScHSplitPos WhichH(ScSplitPos ePos)
void ResetBreaks(SCTAB nTab)
double GetOutputFactor() const
ScFollowMode
Screen behavior related to cursor movements.
tools::Long GetGridWidth(ScHSplitPos eWhich)
ScSplitPos GetActivePart() const
std::shared_ptr< weld::MessageDialog > m_xMessageBox
ScDocument & GetDocument() const
bool IsHorOverlapped(SCCOL nCol, SCROW nRow, SCTAB nTab) const
void Invalidate(sal_uInt16 nId)
void CursorPosChanging(bool bShift, bool bMod1)
SCCOL GetPosX(ScHSplitPos eWhich, SCTAB nForTab=-1) const
SC_DLLPUBLIC bool HasAttrib(SCCOL nCol1, SCROW nRow1, SCTAB nTab1, SCCOL nCol2, SCROW nRow2, SCTAB nTab2, HasAttrFlags nMask) const
SCCOL CellsAtX(SCCOL nPosX, SCCOL nDir, ScHSplitPos eWhichX, sal_uInt16 nScrSizeY=SC_SIZE_NONE) const
constexpr TypedWhichId< ScMergeAttr > ATTR_MERGE(144)
SC_DLLPUBLIC sal_uInt16 GetRowHeight(SCROW nRow, SCTAB nTab, bool bHiddenAsZero=true) const
bool IsCellMarked(SCCOL nCol, SCROW nRow, bool bNoSimple=false) const
void GetMarkArea(ScRange &rRange) const
constexpr tools::Long Width() const
void UpdateCopySourceOverlay()
tools::Long GetGridHeight(ScVSplitPos eWhich)
static tools::Long ToPixel(sal_uInt16 nTwips, double nFactor)
bool isOptionEnabled(Option eOption) const
void PaintLeftArea(SCROW nStartRow, SCROW nEndRow)
SC_DLLPUBLIC SCROW MaxRow() const
std::array< VclPtr< ScGridWindow >, 4 > pGridWin
sal_Int32 SCCOLROW
a type capable of holding either SCCOL or SCROW
SC_DLLPUBLIC SCTAB GetTableCount() const
void SetPosX(ScHSplitPos eWhich, SCCOL nNewPosX)
bool IsMultiMarked() const
void PaintBlock(bool bReset)
divide PaintBlock into two methods: RepaintBlock and RemoveBlock or similar
void UpdateShrinkOverlay()
SC_DLLPUBLIC bool HasTable(SCTAB nTab) const
void UpdateInputHandler(bool bForce=false, bool bStopEditing=true)
void DoneBlockMode(bool bContinue=false)
SCROW GetPosY(ScVSplitPos eWhich, SCTAB nForTab=-1) const
ScSplitMode GetHSplitMode() const
void SkipCursorVertical(SCCOL &rCurX, SCROW &rCurY, SCROW nOldY, SCROW nMovY)
ScDrawLayer * MakeDrawLayer()
void SelectionChanged(bool bFromPaste=false)
SC_DLLPUBLIC const SfxPoolItem * GetAttr(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt16 nWhich) const
bool IsRowMarked(SCROW nRow) const
void PaintArea(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScUpdateMode eMode=ScUpdateMode::All)
ScTabViewShell * GetViewShell() const
std::unique_ptr< ScPageBreakData > pPageBreakData
void ExpandBlock(SCCOL nMovX, SCROW nMovY, ScFollowMode eMode)
void SetMarkArea(const ScRange &rRange)
SC_DLLPUBLIC SCCOL MaxCol() const
SC_DLLPUBLIC bool ColHidden(SCCOL nCol, SCTAB nTab, SCCOL *pFirstCol=nullptr, SCCOL *pLastCol=nullptr) const
SC_DLLPUBLIC sal_uInt16 GetPrintRangeCount(SCTAB nTab)
bool IsColumnMarked(SCCOL nCol) const
void SelectTable(SCTAB nTab, bool bNew)
SfxBindings & GetBindings()
bool ValidCol(SCCOL nCol) const
static SC_DLLPUBLIC double nScreenPPTY
Vertical pixel per twips factor.
void ExpandBlockArea(SCCOL nMovX, SCROW nMovY)
SC_DLLPUBLIC SCCOL ClampToAllocatedColumns(SCTAB nTab, SCCOL nCol) const
OUString ScResId(const char *pId)
ScMarkType GetSimpleArea(SCCOL &rStartCol, SCROW &rStartRow, SCTAB &rStartTab, SCCOL &rEndCol, SCROW &rEndRow, SCTAB &rEndTab) const
SC_DLLPUBLIC OUString GetPageStyle(SCTAB nTab) const
sal_uInt16 CalcZoom(SvxZoomType eType, sal_uInt16 nOldZoom)
weld::Window * GetDialogParent()
void UpdateSelectionOverlay()
SC_DLLPUBLIC bool ExtendMerge(SCCOL nStartCol, SCROW nStartRow, SCCOL &rEndCol, SCROW &rEndRow, SCTAB nTab, bool bRefresh=false)
bool IsMarkNegative() const
virtual bool isProtected() const override
SCCOL GetRefStartX() const
tools::Long GetPageUpDownOffset() const
void PaintMarks(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow)
void SkipOverlapped(SCCOL &rCol, SCROW &rRow, SCTAB nTab) const
bool IsVerOverlapped(SCCOL nCol, SCROW nRow, SCTAB nTab) const
bool ValidRow(SCROW nRow) const
constexpr tools::Long Height() const
void ErrorMessage(const char *pGlobStrId)
void FindAreaPos(SCCOL &rCol, SCROW &rRow, SCTAB nTab, ScMoveDirection eDirection) const
ScHeaderFunctionSet aHdrFunc
tools::Long AdjustWidth(tools::Long n)
bool GetMarkingFlag() const
void SetPosY(ScVSplitPos eWhich, SCROW nNewPosY)
SC_DLLPUBLIC const ScInputOptions & GetInputOptions()
static SC_DLLPUBLIC double nScreenPPTX
Horizontal pixel per twips factor.
const ScDocument & GetDocument() const
void GetPageMoveEndPosition(SCCOL nMovX, SCROW nMovY, SCCOL &rPageX, SCROW &rPageY)
void GetAreaMoveEndPosition(SCCOL nMovX, SCROW nMovY, ScFollowMode eMode, SCCOL &rAreaX, SCROW &rAreaY, ScFollowMode &rMode)
ScViewSelectionEngine * GetSelEngine()
tools::Long AdjustHeight(tools::Long n)
SC_DLLPUBLIC ScStyleSheetPool * GetStyleSheetPool() const
std::array< VclPtr< ScColBar >, 2 > pColBar
void AlignToCursor(SCCOL nCurX, SCROW nCurY, ScFollowMode eMode, const ScSplitPos *pWhich=nullptr)
void SetMarking(bool bFlag)
void SetMarkNegative(bool bFlag)
SC_DLLPUBLIC bool RowHidden(SCROW nRow, SCTAB nTab, SCROW *pFirstRow=nullptr, SCROW *pLastRow=nullptr) const
void setHeight(tools::Long nHeight)
SCROW CellsAtY(SCROW nPosY, SCROW nDir, ScVSplitPos eWhichY, sal_uInt16 nScrSizeX=SC_SIZE_NONE) const
void SetOldCursor(SCCOL nNewX, SCROW nNewY)
void SkipCursorHorizontal(SCCOL &rCurX, SCROW &rCurY, SCCOL nOldX, SCCOL nMovX)
bool IsRefInputMode() const
SCROW GetRowMerge() const
void GetMultiMarkArea(ScRange &rRange) const
virtual SfxPrinter * GetPrinter(bool bCreate=false) override
void UpdateRef(SCCOL nCurX, SCROW nCurY, SCTAB nCurZ)
std::unique_ptr< ScDrawView > pDrawView
void PaintTopArea(SCCOL nStartCol, SCCOL nEndCol)
SC_DLLPUBLIC sal_uInt16 GetColWidth(SCCOL nCol, SCTAB nTab, bool bHiddenAsZero=true) const
bool IsPagebreakMode() const
void MarkCursor(SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, bool bCols=false, bool bRows=false, bool bCellSelection=false)
virtual SfxStyleSheetBase * Find(const OUString &, SfxStyleFamily eFam, SfxStyleSearchBits n=SfxStyleSearchBits::All)
void ExpandBlockPage(SCCOL nMovX, SCROW nMovY)
void UpdatePageBreakData(bool bForcePaint=false)
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage, bool bMobile=false)
ScSplitMode GetVSplitMode() const
void InitBlockMode(SCCOL nCurX, SCROW nCurY, SCTAB nCurZ, bool bTestNeg=false, bool bCols=false, bool bRows=false, bool bForceNeg=false)
bool IsMarking(SCCOL nCol, SCROW nRow, SCTAB nTab) const
SC_DLLPUBLIC const ScTableProtection * GetTabProtection(SCTAB nTab) const