Kaydet (Commit) 2bcaffd1 authored tarafından Andrzej Hunt's avatar Andrzej Hunt

sc lok: tdf#94605 introduce uno:CellCursor

This allows the client to rerequest the current cursor position,
which is necessary e.g. on zoom-level changes.

Conflicts:
	desktop/source/lib/init.cxx
	sc/inc/docuno.hxx

Change-Id: I10d81e220a56a36e2ec0c59005cd1d4f134857d5
üst f859dac5
......@@ -32,6 +32,7 @@
#include <comphelper/dispatchcommand.hxx>
#include <comphelper/lok.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/string.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
......@@ -1209,6 +1210,7 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
{
OString aCommand(pCommand);
static const OString aViewRowColumnHeaders(".uno:ViewRowColumnHeaders");
static const OString aCellCursor(".uno:CellCursor");
if (!strcmp(pCommand, ".uno:CharFontName"))
{
......@@ -1267,6 +1269,47 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
OUString aHeaders = pDoc->getRowColumnHeaders(aRectangle);
OString aString = OUStringToOString(aHeaders, RTL_TEXTENCODING_UTF8);
char* pMemory = static_cast<char*>(malloc(aString.getLength() + 1));
strcpy(pMemory, aString.getStr());
return pMemory;
}
else if (aCommand.startsWith(aCellCursor)
{
ITiledRenderable* pDoc = getTiledRenderable(pThis);
if (!pDoc)
{
gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering";
return 0;
}
OString aString;
OString aParams = aCommand.copy(OString(".uno:CellCursor:").getLength());
sal_Int32 nIndex = 0;
OString aOutputWidth = aParams.getToken(0, ',', nIndex);
OString aOutputHeight = aParams.getToken(0, ',', nIndex);
OString aTileWidth = aParams.getToken(0, ',', nIndex);
OString aTileHeight = aParams.getToken(0, ',', nIndex);
int nOutputWidth, nOutputHeight;
long nTileWidth, nTileHeight;
if (!(comphelper::string::getTokenCount(aParams, ',') == 4
&& !aOutputWidth.isEmpty()
&& (nOutputWidth = aOutputWidth.toInt32()) != 0
&& !aOutputHeight.isEmpty()
&& (nOutputHeight = aOutputHeight.toInt32()) != 0
&& !aTileWidth.isEmpty()
&& (nTileWidth = aTileWidth.toInt64()) != 0
&& !aTileHeight.isEmpty()
&& (nTileHeight = aTileHeight.toInt64()) != 0))
{
gImpl->maLastExceptionMsg = "Can't parse arguments for .uno:CellCursor, no cursor returned";
return NULL;
}
OString aString = pDoc->getCellCursor(nOutputWidth, nOutputHeight, nTileWidth, nTileHeight);
char* pMemory = static_cast<char*>(malloc(aString.getLength() + 1));
strcpy(pMemory, aString.getStr());
return pMemory;
......
......@@ -159,6 +159,18 @@ public:
return OUString();
}
/**
* Get position and size of cell cursor in Calc.
* (This could maybe also be used for tables in Writer/Impress in future?)
*/
virtual OString getCellCursor(int /*nOutputWidth*/,
int /*nOutputHeight*/,
long /*nTileWidth*/,
long /*nTileHeight*/)
{
return OString();
}
/// Sets the clipboard of the component.
virtual void setClipboard(const css::uno::Reference<css::datatransfer::clipboard::XClipboard>& xClipboard) = 0;
......
......@@ -407,6 +407,12 @@ public:
/// @see vcl::ITiledRenderable::getRowColumnHeaders().
virtual OUString getRowColumnHeaders(const Rectangle& rRectangle) override;
/// @see vcl::ITiledRenderable::getCellCursor().
virtual OString getCellCursor( int nOutputWidth,
int nOutputHeight,
long nTileWidth,
long nTileHeight ) override;
};
class ScDrawPagesObj : public cppu::WeakImplHelper<
......
......@@ -300,6 +300,7 @@ class ScGridWindow : public vcl::Window, public DropTargetHelper, public DragSou
void GetSelectionRects( ::std::vector< Rectangle >& rPixelRects );
void updateLibreOfficeKitCellCursor();
protected:
virtual void PrePaint(vcl::RenderContext& rRenderContext) override;
......@@ -439,6 +440,14 @@ public:
void UpdateShrinkOverlay();
void UpdateAllOverlays();
/// @see ScModelObj::getCellCursor().
OString getCellCursor(const Fraction& rZoomX,
const Fraction& rZoomY);
OString getCellCursor(int nOutputWidth,
int nOutputHeight,
long nTileWidth,
long nTileHeight);
protected:
void ImpCreateOverlayObjects();
void ImpDestroyOverlayObjects();
......
......@@ -885,6 +885,23 @@ OUString ScModelObj::getRowColumnHeaders(const Rectangle& rRectangle)
return pTabView->getRowColumnHeaders(rRectangle);
}
OString ScModelObj::getCellCursor( int nOutputWidth, int nOutputHeight,
long nTileWidth, long nTileHeight )
{
SolarMutexGuard aGuard;
ScViewData* pViewData = ScDocShell::GetViewData();
if (!pViewData)
return OString();
ScGridWindow* pGridWindow = pViewData->GetActiveWin();
if (!pGridWindow)
return OString();
return "{ \"commandName\": \".uno:CellCursor\", \"commandValues\": \"" + pGridWindow->getCellCursor( nOutputWidth, nOutputHeight, nTileWidth, nTileHeight ) + "\" }";
}
void ScModelObj::initializeForTiledRendering()
{
SolarMutexGuard aGuard;
......
......@@ -5777,19 +5777,36 @@ bool ScGridWindow::InsideVisibleRange( SCCOL nPosX, SCROW nPosY )
return maVisibleRange.isInside(nPosX, nPosY);
}
void ScGridWindow::updateLibreOfficeKitCellCursor() {
// Use the same zoom calculations as in paintTile - this
// means the client can ensure they can get the correct
// cursor corresponding to their current tile sizings.
OString ScGridWindow::getCellCursor( int nOutputWidth, int nOutputHeight,
long nTileWidth, long nTileHeight )
{
Fraction zoomX = Fraction(long(nOutputWidth * TWIPS_PER_PIXEL), nTileWidth);
Fraction zoomY = Fraction(long(nOutputHeight * TWIPS_PER_PIXEL), nTileHeight);
return getCellCursor(zoomX, zoomY);
}
OString ScGridWindow::getCellCursor(const Fraction& rZoomX, const Fraction& rZoomY) {
ScDocument* pDoc = pViewData->GetDocument();
ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
if (!pDrawLayer->isTiledRendering())
return;
// GridWindows stores a shown cell cursor in mpOOCursors, hence
// we can use that to determine whether we would want to be showing
// one (client-side) for tiled rendering too.
if (!pDrawLayer->isTiledRendering() || !mpOOCursors.get())
{
return OString("EMPTY");
}
SCCOL nX = pViewData->GetCurX();
SCROW nY = pViewData->GetCurY();
Fraction defaultZoomX = pViewData->GetZoomX();
Fraction defaultZoomY = pViewData->GetZoomX();
pViewData->SetZoom(mTiledZoomX, mTiledZoomY, true);
pViewData->SetZoom(rZoomX, rZoomY, true);
Point aScrPos = pViewData->GetScrPos( nX, nY, eWhich, true );
long nSizeXPix;
......@@ -5803,7 +5820,15 @@ void ScGridWindow::updateLibreOfficeKitCellCursor() {
pViewData->SetZoom(defaultZoomX, defaultZoomY, true);
pDrawLayer->libreOfficeKitCallback(LOK_CALLBACK_CELL_CURSOR, aRect.toString().getStr());
return aRect.toString();
}
void ScGridWindow::updateLibreOfficeKitCellCursor()
{
ScDocument* pDoc = pViewData->GetDocument();
ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
OString aCursor = getCellCursor(mTiledZoomX, mTiledZoomY);
pDrawLayer->libreOfficeKitCallback(LOK_CALLBACK_CELL_CURSOR, aCursor.getStr());
}
void ScGridWindow::CursorChanged()
......@@ -6089,6 +6114,7 @@ void ScGridWindow::UpdateCursorOverlay()
if ( !aPixelRects.empty() )
{
if (pDrawLayer->isTiledRendering()) {
mpOOCursors.reset(new sdr::overlay::OverlayObjectList);
updateLibreOfficeKitCellCursor();
}
else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment