diff options
author | Jan Holesovsky <kendy@collabora.com> | 2015-03-25 21:21:28 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-03-30 09:23:49 +0200 |
commit | 7fa8f72a1782fd2eea9c0a29c5b06709d4508b95 (patch) | |
tree | 82ba3b5c7266ec1160c077b85757190a160ac895 /sc | |
parent | a7e75be63e7ca7a084d0dbcb78c13f2896eb5b5c (diff) |
sc tiled editing: Allow resizing the cell selection using the handles.
Change-Id: I53e5a43ba4f0ba4783a524751985adb3f4610d84
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/inc/gridwin.hxx | 5 | ||||
-rw-r--r-- | sc/source/ui/unoobj/docuno.cxx | 11 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin4.cxx | 58 |
3 files changed, 73 insertions, 1 deletions
diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index 36a7e5c2ef87..3cf3e360b7b4 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -330,6 +330,11 @@ public: /// Same as MouseButtonUp(), but coordinates are in logic unit. void LogicMouseButtonUp(const MouseEvent& rMouseEvent); + /// Update the cell selection according to what handles have been dragged. + /// Uses the same parameteres as vcl::ITiledRenderable::setTextSelection() + /// (ie. they are in twips here). + void SetCellSelection(int nType, int nX, int nY); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE; void FakeButtonUp(); diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index fa133f35dd21..b7743ae7b34e 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -589,7 +589,16 @@ void ScModelObj::setTextSelection(int nType, int nX, int nY) else { // moving the cell selection handles - // TODO + + // There seems to be no clear way of getting the grid window for this + // particular document, hence we need to hope we get the right window. + ScViewData* pViewData = ScDocShell::GetViewData(); + ScGridWindow* pGridWindow = pViewData->GetActiveWin(); + + if (!pGridWindow) + return; + + pGridWindow->SetCellSelection(nType, nX, nY); } } diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index ac2cd8574817..e204b9728285 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -991,6 +991,64 @@ void ScGridWindow::LogicInvalidate(const Rectangle* pRectangle) pViewData->GetDocument()->GetDrawLayer()->libreOfficeKitCallback(LOK_CALLBACK_INVALIDATE_TILES, sRectangle.getStr()); } +void ScGridWindow::SetCellSelection(int nType, int nX, int nY) +{ + ScTabView* pTabView = pViewData->GetView(); + + if (nType == LOK_SETTEXTSELECTION_RESET) + { + pTabView->DoneBlockMode(); + return; + } + + // obtain the current selection + ScRangeList aRangeList = pViewData->GetMarkData().GetMarkedRanges(); + + SCCOL nCol1, nCol2; + SCROW nRow1, nRow2; + SCTAB nTab1, nTab2; + + if (aRangeList.empty()) + { + nCol1 = nCol2 = pViewData->GetCurX(); + nRow1 = nRow2 = pViewData->GetCurY(); + } + else + aRangeList.Combine().GetVars(nCol1, nRow1, nTab1, nCol2, nRow2, nTab2); + + // convert the coordinates to column/row + SCsCOL nNewPosX; + SCsROW nNewPosY; + SCTAB nTab = pViewData->GetTabNo(); + pViewData->GetPosFromPixel(nX * pViewData->GetPPTX(), nY * pViewData->GetPPTY(), eWhich, nNewPosX, nNewPosY); + + // change the selection + switch (nType) + { + case LOK_SETTEXTSELECTION_START: + if (nNewPosX != nCol1 || nNewPosY != nRow1) + { + pTabView->SetCursor(nNewPosX, nNewPosY); + pTabView->DoneBlockMode(); + pTabView->InitBlockMode(nNewPosX, nNewPosY, nTab, true); + pTabView->MarkCursor(nCol2, nRow2, nTab); + } + break; + case LOK_SETTEXTSELECTION_END: + if (nNewPosX != nCol2 || nNewPosY != nRow2) + { + pTabView->SetCursor(nCol1, nRow1); + pTabView->DoneBlockMode(); + pTabView->InitBlockMode(nCol1, nRow1, nTab, true); + pTabView->MarkCursor(nNewPosX, nNewPosY, nTab); + } + break; + default: + assert(false); + break; + } +} + void ScGridWindow::CheckNeedsRepaint() { // called at the end of painting, and from timer after background text width calculation |