30 #include <stlpool.hxx>
36 #include <globstr.hrc>
46 bool isCellQualified(
const ScDocument* pDoc,
SCCOL nCol,
SCROW nRow,
SCTAB nTab,
bool bSelectLocked,
bool bSelectUnlocked)
51 if (bCellProtected && !bSelectLocked)
54 if (!bCellProtected && !bSelectUnlocked)
60 void moveCursorByProtRule(
63 bool bSelectLocked =
true;
64 bool bSelectUnlocked =
true;
66 if (pTabProtection && pTabProtection->
isProtected())
76 SCCOL nNewUnhiddenCol = rCol + 1;
78 while(pDoc->
ColHidden(nNewUnhiddenCol, nTab,
nullptr, &nEndCol))
80 if(nNewUnhiddenCol >= pDoc->
MaxCol())
83 i += nEndCol - nNewUnhiddenCol + 1;
84 nNewUnhiddenCol = nEndCol +1;
87 if (!isCellQualified(pDoc, nNewUnhiddenCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
89 rCol = nNewUnhiddenCol;
94 for (
SCCOL i = 0;
i > nMovX && rCol > 0; --
i)
96 SCCOL nNewUnhiddenCol = rCol - 1;
98 while(pDoc->
ColHidden(nNewUnhiddenCol, nTab, &nStartCol))
100 if(nNewUnhiddenCol <= 0)
103 i -= nNewUnhiddenCol - nStartCol + 1;
104 nNewUnhiddenCol = nStartCol - 1;
107 if (!isCellQualified(pDoc, nNewUnhiddenCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
109 rCol = nNewUnhiddenCol;
117 SCROW nNewUnhiddenRow = rRow + 1;
119 while(pDoc->
RowHidden(nNewUnhiddenRow, nTab,
nullptr, &nEndRow))
121 if(nNewUnhiddenRow >= pDoc->
MaxRow())
124 i += nEndRow - nNewUnhiddenRow + 1;
125 nNewUnhiddenRow = nEndRow + 1;
128 if (!isCellQualified(pDoc, rCol, nNewUnhiddenRow, nTab, bSelectLocked, bSelectUnlocked))
130 rRow = nNewUnhiddenRow;
135 for (
SCROW i = 0;
i > nMovY && rRow > 0; --
i)
137 SCROW nNewUnhiddenRow = rRow - 1;
139 while(pDoc->
RowHidden(nNewUnhiddenRow, nTab, &nStartRow))
141 if(nNewUnhiddenRow <= 0)
144 i -= nNewUnhiddenRow - nStartRow + 1;
145 nNewUnhiddenRow = nStartRow - 1;
148 if (!isCellQualified(pDoc, rCol, nNewUnhiddenRow, nTab, bSelectLocked, bSelectUnlocked))
150 rRow = nNewUnhiddenRow;
163 else if (rCol > pDoc->
MaxCol())
174 else if (rRow > pDoc->
MaxRow())
182 void moveCursorByMergedCell(
190 bool bSelectLocked =
true;
191 bool bSelectUnlocked =
true;
192 if (pTabProtection && pTabProtection->
isProtected())
200 bool bOriginMerged =
false;
203 if (pMergeAttr && pMergeAttr->
IsMerged())
207 bOriginMerged =
true;
216 if (nOrigX < pDoc->MaxCol() && nOrigX < rCol && rCol <= nOrigX + nColSpan - 1)
217 rCol = nOrigX + nColSpan;
227 checkBoundary(pDoc, rCol, rRow);
228 if (!isCellQualified(pDoc, rCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
237 if (nOrigX > 0 && nOrigX <= rCol && rCol < nOrigX + nColSpan - 1)
249 checkBoundary(pDoc, rCol, rRow);
250 if (!isCellQualified(pDoc, rCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
260 if (nOrigY < pDoc->MaxRow() && nOrigY < rRow && rRow <= nOrigY + nRowSpan - 1)
261 rRow = nOrigY + nRowSpan;
271 checkBoundary(pDoc, rCol, rRow);
272 if (!isCellQualified(pDoc, rCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
282 if (nOrigY > 0 && nOrigY <= rRow && rRow < nOrigY + nRowSpan - 1)
294 checkBoundary(pDoc, rCol, rRow);
295 if (!isCellQualified(pDoc, rCol, rRow, nTab, bSelectLocked, bSelectUnlocked))
305 if (!rDoc.ValidCol(nStartCol)) nStartCol = rDoc.
MaxCol();
306 if (!rDoc.ValidRow(nStartRow)) nStartRow = rDoc.MaxRow();
307 if (!rDoc.ValidCol(nEndCol)) nEndCol = rDoc.MaxCol();
308 if (!rDoc.ValidRow(nEndRow)) nEndRow = rDoc.MaxRow();
310 bool bLeft = (nStartCol==0 && nEndCol==rDoc.MaxCol());
311 bool bTop = (nStartRow==0 && nEndRow==rDoc.MaxRow());
353 bool bTestNeg,
bool bCols,
bool bRows,
bool bForceNeg )
359 if (!rDoc.ValidCol(nCurX)) nCurX = rDoc.
MaxCol();
360 if (!rDoc.ValidRow(nCurY)) nCurY = rDoc.MaxRow();
449 bool bCols,
bool bRows,
bool bCellSelection )
457 OSL_FAIL(
"MarkCursor not in BlockMode" );
462 nCurY = rDocument.
MaxRow();
464 nCurX = rDocument.
MaxCol();
482 InitBlockMode( aMarkRange.aStart.Col(), aMarkRange.aStart.Row(),
492 if ( bCellSelection )
496 SCCOL nCurXOffset = 0;
497 SCCOL nBlockStartXOffset = 0;
498 SCROW nCurYOffset = 0;
499 SCROW nBlockStartYOffset = 0;
500 bool bBlockStartMerged =
false;
524 bBlockStartMerged =
true;
545 SCCOL nCurXOffsetTemp = (nCurX < nCurX + nColSpan - 1) ? nColSpan - 1 : 0;
546 nCurXOffset = std::max(nCurXOffset, nCurXOffsetTemp);
550 SCROW nCurYOffsetTemp = (nCurY < nCurY + nRowSpan - 1) ? nRowSpan - 1 : 0;
551 nCurYOffset = std::max(nCurYOffset, nCurYOffsetTemp);
565 if ( !bBlockStartMerged )
595 if ( !bCols && !bRows )
642 if (nMovX != 0 && nPageX == 0) nPageX = (nMovX>0) ? 1 : -1;
643 if (nMovY != 0 && nPageY == 0) nPageY = (nMovY>0) ? 1 : -1;
684 SCCOL nVirtualX = bLegacyCellSelection ? nNewX : nCurX;
685 SCROW nVirtualY = bLegacyCellSelection ? nNewY : nCurY;
689 for ( i=0; i<nMovX; i++ )
692 for ( i=0; i<-nMovX; i++ )
695 for ( i=0; i<nMovY; i++ )
698 for ( i=0; i<-nMovY; i++ )
703 if (nMovX != 0 && nNewX == rDoc.
MaxCol())
705 if (nMovY != 0 && nNewY == rDoc.
MaxRow())
721 rAreaX = nNewX - nCurX;
722 rAreaY = nNewY - nCurY;
732 bool bSkipProtected =
false, bSkipUnprotected =
false;
740 bool bSkipCell =
false;
746 if (bSkipProtected && !bSkipCell)
748 if (bSkipUnprotected && !bSkipCell)
753 if (rCurX <= 0 || rCurX >= nMaxCol)
792 bool bSkipProtected =
false, bSkipUnprotected =
false;
800 bool bSkipCell =
false;
806 if (bSkipProtected && !bSkipCell)
808 if (bSkipUnprotected && !bSkipCell)
813 if (rCurY <= 0 || rCurY >= rDoc.
MaxRow())
849 if (!nMovX && !nMovY)
869 bool bSelectLocked =
true;
870 bool bSelectUnlocked =
true;
872 if (pTabProtection && pTabProtection->
isProtected())
878 moveCursorByProtRule(nNewX, nNewY, nMovX, nMovY, nRefTab, &rDoc);
879 checkBoundary(&rDoc, nNewX, nNewY);
883 SCCOL nTempX = nNewX;
890 if (!checkBoundary(&rDoc, nTempX, nNewY))
893 if (isCellQualified(&rDoc, nTempX, nNewY, nRefTab, bSelectLocked, bSelectUnlocked))
899 SCROW nTempY = nNewY;
906 if (!checkBoundary(&rDoc, nNewX, nTempY))
909 if (isCellQualified(&rDoc, nNewX, nTempY, nRefTab, bSelectLocked, bSelectUnlocked))
915 SCCOL nTargetCol = nNewX;
916 SCROW nTargetRow = nNewY;
981 if (pWin && pWin->IsVisible())
982 pWin->UpdateCopySourceOverlay();
988 if ( pWin && pWin->IsVisible() )
989 pWin->UpdateSelectionOverlay();
995 if ( pWin && pWin->IsVisible() )
996 pWin->UpdateShrinkOverlay();
1002 if ( pWin && pWin->IsVisible() )
1003 pWin->UpdateAllOverlays();
1039 bool bDidReset =
false;
1057 if ( bReset && !bDidReset )
1123 double fZoomFactor =
static_cast<double>(
Fraction(nZoom,100));
1124 fScaleX *= fZoomFactor;
1125 fScaleY *= fZoomFactor;
1129 for (nCol=0; nCol<nFixPosX; nCol++)
1132 sal_uInt16 nColTwips = pDoc->
GetColWidth( nCol, nTab );
1135 nBlockX +=
static_cast<tools::Long>(nColTwips * fScaleX);
1136 if (nBlockX > nWindowX)
1140 for (nCol=nStartCol; nCol<=nEndCol; nCol++)
1142 sal_uInt16 nColTwips = pDoc->
GetColWidth( nCol, nTab );
1145 nBlockX +=
static_cast<tools::Long>(nColTwips * fScaleX);
1146 if (nBlockX > nWindowX)
1152 for (
SCROW nRow = 0; nRow <= nFixPosY-1; ++nRow)
1161 nBlockY +=
static_cast<tools::Long>(nRowTwips * fScaleY);
1162 if (nBlockY > nWindowY)
1166 for (
SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
1171 nBlockY +=
static_cast<tools::Long>(nRowTwips * fScaleY);
1172 if (nBlockY > nWindowY)
1182 sal_uInt16 nZoom = 100;
1186 case SvxZoomType::PERCENT:
1190 case SvxZoomType::OPTIMAL:
1211 if ( nTab < nStartTab && nTab > nEndTab )
1223 if ( nStartCol < nFixPosX )
1224 nStartCol = nFixPosX;
1231 if ( nStartRow < nFixPosY )
1232 nStartRow = nFixPosY;
1240 Size aWinSize =
pGridWin[eUsedPart]->GetOutputSizePixel();
1244 if ( nFixPosX != 0 )
1246 if ( nFixPosY != 0 )
1255 while ( nMax > nMin )
1257 sal_uInt16 nTest = (nMin+nMax+1)/2;
1259 nPPTX, nPPTY, nTest, aWinSize.
Width(), aWinSize.
Height(),
1260 &rDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow,
1261 nFixPosX, nFixPosY ) )
1266 OSL_ENSURE( nMin == nMax,
"Nesting is wrong" );
1269 if ( nZoom != nOldZoom )
1274 if ( nStartCol <= nEndCol )
1276 if ( nStartRow <= nEndRow )
1284 case SvxZoomType::WHOLEPAGE:
1285 case SvxZoomType::PAGEWIDTH:
1292 SfxStyleFamily::Page );
1294 OSL_ENSURE( pStyleSheet,
"PageStyle not found :-/" );
1302 Size aPageSize = aPrintFunc.GetDataSize();
1318 GetOutputSizePixel().Width();
1324 aPageSize.AdjustWidth(rDoc.
GetColWidth( nCol, nCurTab ) );
1326 else if ( nOtherWidth > aWinSize.
Width() )
1333 GetOutputSizePixel().Height();
1341 else if ( nOtherHeight > aWinSize.
Height() )
1349 ( aPageSize.Width() *
nPPTX ) );
1351 ( aPageSize.Height() *
nPPTY ) );
1354 nZoom =
static_cast<sal_uInt16
>(nZoomX);
1356 if (eType == SvxZoomType::WHOLEPAGE && nZoomY > 0 && nZoomY < nZoom)
1357 nZoom =
static_cast<sal_uInt16
>(nZoomY);
1363 OSL_FAIL(
"Unknown Zoom-Revision");
1389 if (pWin && pWin->IsVisible())
1390 pWin->HideNoteMarker();
1401 OSL_ENSURE(
pDrawView,
"ScTabView::MakeDrawLayer does not work");
1407 pWin->DrawLayerCreated();
1414 if (
SC_MOD()->IsInExecuteDrop() )
1424 bool bFocus = pParent && pParent->
has_focus();
1426 if (pGlobStrId && strcmp(pGlobStrId, STR_PROTECTIONERR) == 0)
1430 pGlobStrId = STR_READONLYERR;
1435 VclMessageType::Info, VclButtonsType::Ok,
1437 weld::Window* pGrabOnClose = bFocus ? pParent :
nullptr;
1447 std::unique_ptr<ScPageBreakData> pNewData;
1465 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
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)
tools::Long Width() const
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
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)
tools::Long Height() const
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