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 @@ ...@@ -32,6 +32,7 @@
#include <comphelper/dispatchcommand.hxx> #include <comphelper/dispatchcommand.hxx>
#include <comphelper/lok.hxx> #include <comphelper/lok.hxx>
#include <comphelper/processfactory.hxx> #include <comphelper/processfactory.hxx>
#include <comphelper/string.hxx>
#include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/container/XNameAccess.hpp>
...@@ -1209,6 +1210,7 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo ...@@ -1209,6 +1210,7 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
{ {
OString aCommand(pCommand); OString aCommand(pCommand);
static const OString aViewRowColumnHeaders(".uno:ViewRowColumnHeaders"); static const OString aViewRowColumnHeaders(".uno:ViewRowColumnHeaders");
static const OString aCellCursor(".uno:CellCursor");
if (!strcmp(pCommand, ".uno:CharFontName")) if (!strcmp(pCommand, ".uno:CharFontName"))
{ {
...@@ -1267,6 +1269,47 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo ...@@ -1267,6 +1269,47 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
OUString aHeaders = pDoc->getRowColumnHeaders(aRectangle); OUString aHeaders = pDoc->getRowColumnHeaders(aRectangle);
OString aString = OUStringToOString(aHeaders, RTL_TEXTENCODING_UTF8); 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)); char* pMemory = static_cast<char*>(malloc(aString.getLength() + 1));
strcpy(pMemory, aString.getStr()); strcpy(pMemory, aString.getStr());
return pMemory; return pMemory;
......
...@@ -159,6 +159,18 @@ public: ...@@ -159,6 +159,18 @@ public:
return OUString(); 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. /// Sets the clipboard of the component.
virtual void setClipboard(const css::uno::Reference<css::datatransfer::clipboard::XClipboard>& xClipboard) = 0; virtual void setClipboard(const css::uno::Reference<css::datatransfer::clipboard::XClipboard>& xClipboard) = 0;
......
...@@ -407,6 +407,12 @@ public: ...@@ -407,6 +407,12 @@ public:
/// @see vcl::ITiledRenderable::getRowColumnHeaders(). /// @see vcl::ITiledRenderable::getRowColumnHeaders().
virtual OUString getRowColumnHeaders(const Rectangle& rRectangle) override; 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< class ScDrawPagesObj : public cppu::WeakImplHelper<
......
...@@ -300,6 +300,7 @@ class ScGridWindow : public vcl::Window, public DropTargetHelper, public DragSou ...@@ -300,6 +300,7 @@ class ScGridWindow : public vcl::Window, public DropTargetHelper, public DragSou
void GetSelectionRects( ::std::vector< Rectangle >& rPixelRects ); void GetSelectionRects( ::std::vector< Rectangle >& rPixelRects );
void updateLibreOfficeKitCellCursor(); void updateLibreOfficeKitCellCursor();
protected: protected:
virtual void PrePaint(vcl::RenderContext& rRenderContext) override; virtual void PrePaint(vcl::RenderContext& rRenderContext) override;
...@@ -439,6 +440,14 @@ public: ...@@ -439,6 +440,14 @@ public:
void UpdateShrinkOverlay(); void UpdateShrinkOverlay();
void UpdateAllOverlays(); void UpdateAllOverlays();
/// @see ScModelObj::getCellCursor().
OString getCellCursor(const Fraction& rZoomX,
const Fraction& rZoomY);
OString getCellCursor(int nOutputWidth,
int nOutputHeight,
long nTileWidth,
long nTileHeight);
protected: protected:
void ImpCreateOverlayObjects(); void ImpCreateOverlayObjects();
void ImpDestroyOverlayObjects(); void ImpDestroyOverlayObjects();
......
...@@ -885,6 +885,23 @@ OUString ScModelObj::getRowColumnHeaders(const Rectangle& rRectangle) ...@@ -885,6 +885,23 @@ OUString ScModelObj::getRowColumnHeaders(const Rectangle& rRectangle)
return pTabView->getRowColumnHeaders(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() void ScModelObj::initializeForTiledRendering()
{ {
SolarMutexGuard aGuard; SolarMutexGuard aGuard;
......
...@@ -5777,19 +5777,36 @@ bool ScGridWindow::InsideVisibleRange( SCCOL nPosX, SCROW nPosY ) ...@@ -5777,19 +5777,36 @@ bool ScGridWindow::InsideVisibleRange( SCCOL nPosX, SCROW nPosY )
return maVisibleRange.isInside(nPosX, 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(); ScDocument* pDoc = pViewData->GetDocument();
ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
if (!pDrawLayer->isTiledRendering()) // GridWindows stores a shown cell cursor in mpOOCursors, hence
return; // 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(); SCCOL nX = pViewData->GetCurX();
SCROW nY = pViewData->GetCurY(); SCROW nY = pViewData->GetCurY();
Fraction defaultZoomX = pViewData->GetZoomX(); Fraction defaultZoomX = pViewData->GetZoomX();
Fraction defaultZoomY = pViewData->GetZoomX(); Fraction defaultZoomY = pViewData->GetZoomX();
pViewData->SetZoom(mTiledZoomX, mTiledZoomY, true);
pViewData->SetZoom(rZoomX, rZoomY, true);
Point aScrPos = pViewData->GetScrPos( nX, nY, eWhich, true ); Point aScrPos = pViewData->GetScrPos( nX, nY, eWhich, true );
long nSizeXPix; long nSizeXPix;
...@@ -5803,7 +5820,15 @@ void ScGridWindow::updateLibreOfficeKitCellCursor() { ...@@ -5803,7 +5820,15 @@ void ScGridWindow::updateLibreOfficeKitCellCursor() {
pViewData->SetZoom(defaultZoomX, defaultZoomY, true); 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() void ScGridWindow::CursorChanged()
...@@ -6089,6 +6114,7 @@ void ScGridWindow::UpdateCursorOverlay() ...@@ -6089,6 +6114,7 @@ void ScGridWindow::UpdateCursorOverlay()
if ( !aPixelRects.empty() ) if ( !aPixelRects.empty() )
{ {
if (pDrawLayer->isTiledRendering()) { if (pDrawLayer->isTiledRendering()) {
mpOOCursors.reset(new sdr::overlay::OverlayObjectList);
updateLibreOfficeKitCellCursor(); updateLibreOfficeKitCellCursor();
} }
else 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