summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/Bootstrap/src/org/libreoffice/kit/Document.java2
-rw-r--r--android/source/src/java/org/libreoffice/LOKitThread.java13
-rw-r--r--android/source/src/java/org/libreoffice/LOKitTileProvider.java11
-rw-r--r--android/source/src/java/org/libreoffice/TileProvider.java4
-rw-r--r--android/source/src/java/org/mozilla/gecko/gfx/ImmutableViewportMetrics.java4
-rw-r--r--desktop/source/lib/init.cxx20
-rw-r--r--desktop/source/lib/lokandroid.cxx8
-rw-r--r--include/LibreOfficeKit/LibreOfficeKit.h7
-rw-r--r--include/LibreOfficeKit/LibreOfficeKit.hxx17
-rw-r--r--include/vcl/ITiledRenderable.hxx18
-rw-r--r--libreofficekit/source/gtk/lokdocview.cxx38
-rw-r--r--libreofficekit/source/gtk/tilebuffer.hxx11
-rw-r--r--sc/inc/docuno.hxx3
-rw-r--r--sc/source/ui/unoobj/docuno.cxx18
14 files changed, 158 insertions, 16 deletions
diff --git a/android/Bootstrap/src/org/libreoffice/kit/Document.java b/android/Bootstrap/src/org/libreoffice/kit/Document.java
index 4cc4ba345c04..dcc315faca4c 100644
--- a/android/Bootstrap/src/org/libreoffice/kit/Document.java
+++ b/android/Bootstrap/src/org/libreoffice/kit/Document.java
@@ -143,6 +143,8 @@ public class Document {
private native int getDocumentTypeNative();
+ public native void setClientZoom(int nTilePixelWidth, int nTilePixelHeight, int nTileTwipWidth, int nTileTwipHeight);
+
private native void saveAs(String url, String format, String options);
private native void paintTileNative(ByteBuffer buffer, int canvasWidth, int canvasHeight, int tilePositionX, int tilePositionY, int tileWidth, int tileHeight);
diff --git a/android/source/src/java/org/libreoffice/LOKitThread.java b/android/source/src/java/org/libreoffice/LOKitThread.java
index a8f4d303293c..978056dab1d7 100644
--- a/android/source/src/java/org/libreoffice/LOKitThread.java
+++ b/android/source/src/java/org/libreoffice/LOKitThread.java
@@ -299,17 +299,18 @@ public class LOKitThread extends Thread {
// to handle hyperlinks, enable single tap even in the Viewer
boolean editing = LOKitShell.isEditingEnabled();
+ float zoomFactor = mViewportMetrics.getZoomFactor();
if (touchType.equals("LongPress") && editing) {
mInvalidationHandler.changeStateTo(InvalidationHandler.OverlayState.TRANSITION);
- mTileProvider.mouseButtonDown(documentCoordinate, 1);
- mTileProvider.mouseButtonUp(documentCoordinate, 1);
- mTileProvider.mouseButtonDown(documentCoordinate, 2);
- mTileProvider.mouseButtonUp(documentCoordinate, 2);
+ mTileProvider.mouseButtonDown(documentCoordinate, 1, zoomFactor);
+ mTileProvider.mouseButtonUp(documentCoordinate, 1, zoomFactor);
+ mTileProvider.mouseButtonDown(documentCoordinate, 2, zoomFactor);
+ mTileProvider.mouseButtonUp(documentCoordinate, 2, zoomFactor);
} else if (touchType.equals("SingleTap")) {
mInvalidationHandler.changeStateTo(InvalidationHandler.OverlayState.TRANSITION);
- mTileProvider.mouseButtonDown(documentCoordinate, 1);
- mTileProvider.mouseButtonUp(documentCoordinate, 1);
+ mTileProvider.mouseButtonDown(documentCoordinate, 1, zoomFactor);
+ mTileProvider.mouseButtonUp(documentCoordinate, 1, zoomFactor);
} else if (touchType.equals("GraphicSelectionStart") && editing) {
mTileProvider.setGraphicSelectionStart(documentCoordinate);
} else if (touchType.equals("GraphicSelectionEnd") && editing) {
diff --git a/android/source/src/java/org/libreoffice/LOKitTileProvider.java b/android/source/src/java/org/libreoffice/LOKitTileProvider.java
index f859b7a1bc62..b70e8524ecc3 100644
--- a/android/source/src/java/org/libreoffice/LOKitTileProvider.java
+++ b/android/source/src/java/org/libreoffice/LOKitTileProvider.java
@@ -397,10 +397,11 @@ public class LOKitTileProvider implements TileProvider {
}
}
- private void mouseButton(int type, PointF inDocument, int numberOfClicks) {
+ private void mouseButton(int type, PointF inDocument, int numberOfClicks, float zoomFactor) {
int x = (int) pixelToTwip(inDocument.x, mDPI);
int y = (int) pixelToTwip(inDocument.y, mDPI);
+ mDocument.setClientZoom(TILE_SIZE, TILE_SIZE, (int) (mTileWidth / zoomFactor), (int) (mTileHeight / zoomFactor));
mDocument.postMouseEvent(type, x, y, numberOfClicks, Document.MOUSE_BUTTON_LEFT, Document.KEYBOARD_MODIFIER_NONE);
}
@@ -408,16 +409,16 @@ public class LOKitTileProvider implements TileProvider {
* @see TileProvider#mouseButtonDown(android.graphics.PointF, int)
*/
@Override
- public void mouseButtonDown(PointF documentCoordinate, int numberOfClicks) {
- mouseButton(Document.MOUSE_EVENT_BUTTON_DOWN, documentCoordinate, numberOfClicks);
+ public void mouseButtonDown(PointF documentCoordinate, int numberOfClicks, float zoomFactor) {
+ mouseButton(Document.MOUSE_EVENT_BUTTON_DOWN, documentCoordinate, numberOfClicks, zoomFactor);
}
/**
* @see TileProvider#mouseButtonUp(android.graphics.PointF, int)
*/
@Override
- public void mouseButtonUp(PointF documentCoordinate, int numberOfClicks) {
- mouseButton(Document.MOUSE_EVENT_BUTTON_UP, documentCoordinate, numberOfClicks);
+ public void mouseButtonUp(PointF documentCoordinate, int numberOfClicks, float zoomFactor) {
+ mouseButton(Document.MOUSE_EVENT_BUTTON_UP, documentCoordinate, numberOfClicks, zoomFactor);
}
@Override
diff --git a/android/source/src/java/org/libreoffice/TileProvider.java b/android/source/src/java/org/libreoffice/TileProvider.java
index 3104172ef5cf..0ab5a1f641c9 100644
--- a/android/source/src/java/org/libreoffice/TileProvider.java
+++ b/android/source/src/java/org/libreoffice/TileProvider.java
@@ -88,7 +88,7 @@ public interface TileProvider {
* @param documentCoordinate - coordinate relative to the document where the mouse button should be triggered
* @param numberOfClicks - number of clicks (1 - single click, 2 - double click)
*/
- void mouseButtonDown(PointF documentCoordinate, int numberOfClicks);
+ void mouseButtonDown(PointF documentCoordinate, int numberOfClicks, float zoomFactor);
/**
@@ -107,7 +107,7 @@ public interface TileProvider {
* @param documentCoordinate - coordinate relative to the document where the mouse button should be triggered
* @param numberOfClicks - number of clicks (1 - single click, 2 - double click)
*/
- void mouseButtonUp(PointF documentCoordinate, int numberOfClicks);
+ void mouseButtonUp(PointF documentCoordinate, int numberOfClicks, float zoomFactor);
/**
* Post a UNO command to LOK.
diff --git a/android/source/src/java/org/mozilla/gecko/gfx/ImmutableViewportMetrics.java b/android/source/src/java/org/mozilla/gecko/gfx/ImmutableViewportMetrics.java
index 35b417593acf..f90580fbee8c 100644
--- a/android/source/src/java/org/mozilla/gecko/gfx/ImmutableViewportMetrics.java
+++ b/android/source/src/java/org/mozilla/gecko/gfx/ImmutableViewportMetrics.java
@@ -106,6 +106,10 @@ public class ImmutableViewportMetrics {
return new RectF(cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom);
}
+ public float getZoomFactor() {
+ return zoomFactor;
+ }
+
/*
* Returns the viewport metrics that represent a linear transition between "this" and "to" at
* time "t", which is on the scale [0, 1). This function interpolates all values stored in
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index e33544abec90..94b81e049cd2 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -318,7 +318,11 @@ static void doc_setGraphicSelection (LibreOfficeKitDocument* pThis,
int nY);
static void doc_resetSelection (LibreOfficeKitDocument* pThis);
static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCommand);
-
+static void doc_setClientZoom(LibreOfficeKitDocument* pThis,
+ int nTilePixelWidth,
+ int nTilePixelHeight,
+ int nTileTwipWidth,
+ int nTileTwipHeight);
static int doc_createView(LibreOfficeKitDocument* pThis);
static void doc_destroyView(LibreOfficeKitDocument* pThis, int nId);
static void doc_setView(LibreOfficeKitDocument* pThis, int nId);
@@ -358,6 +362,7 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
m_pDocumentClass->setGraphicSelection = doc_setGraphicSelection;
m_pDocumentClass->resetSelection = doc_resetSelection;
m_pDocumentClass->getCommandValues = doc_getCommandValues;
+ m_pDocumentClass->setClientZoom = doc_setClientZoom;
m_pDocumentClass->createView = doc_createView;
m_pDocumentClass->destroyView = doc_destroyView;
@@ -1470,6 +1475,19 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
}
}
+static void doc_setClientZoom(LibreOfficeKitDocument* pThis, int nTilePixelWidth, int nTilePixelHeight,
+ int nTileTwipWidth, int nTileTwipHeight)
+{
+ ITiledRenderable* pDoc = getTiledRenderable(pThis);
+ if (!pDoc)
+ {
+ gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering";
+ return;
+ }
+
+ pDoc->setClientZoom(nTilePixelWidth, nTilePixelHeight, nTileTwipWidth, nTileTwipHeight);
+}
+
static int doc_createView(LibreOfficeKitDocument* /*pThis*/)
{
SolarMutexGuard aGuard;
diff --git a/desktop/source/lib/lokandroid.cxx b/desktop/source/lib/lokandroid.cxx
index 017ab8a9cdaf..0c360d3c2b9c 100644
--- a/desktop/source/lib/lokandroid.cxx
+++ b/desktop/source/lib/lokandroid.cxx
@@ -358,4 +358,12 @@ extern "C" SAL_JNI_EXPORT jstring JNICALL Java_org_libreoffice_kit_Document_getC
return pEnv->NewStringUTF(pValue);
}
+
+extern "C" SAL_JNI_EXPORT void JNICALL Java_org_libreoffice_kit_Document_setClientZoom
+ (JNIEnv* pEnv, jobject aObject, jint nTilePixelWidth, jint nTilePixelHeight, jint nTileTwipWidth, jint nTileTwipHeight)
+{
+ LibreOfficeKitDocument* pDocument = getHandle<LibreOfficeKitDocument>(pEnv, aObject);
+ pDocument->pClass->setClientZoom(pDocument, nTilePixelWidth, nTilePixelHeight, nTileTwipWidth, nTileTwipHeight);
+
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index c887f5f64b8a..03210376c61e 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -181,6 +181,13 @@ struct _LibreOfficeKitDocumentClass
/// @see lok::Document::getCommandValues().
char* (*getCommandValues) (LibreOfficeKitDocument* pThis, const char* pCommand);
+ /// @see lok::Document::setClientZoom().
+ void (*setClientZoom) (LibreOfficeKitDocument* pThis,
+ int nTilePixelWidth,
+ int nTilePixelHeight,
+ int nTileTwipWidth,
+ int nTileTwipHeight);
+
/// @see lok::Document::createView().
int (*createView) (LibreOfficeKitDocument* pThis);
/// @see lok::Document::destroyView().
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index fe8c4d19aa29..d21abddd0448 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -294,6 +294,23 @@ public:
}
/**
+ * Save the client's view so that we can compute the right zoom level
+ * for the mouse events. This only affects CALC.
+ * @param nTilePixelWidth - tile width in pixels
+ * @param nTilePixelHeight - tile height in pixels
+ * @param nTileTwipWidth - tile width in twips
+ * @param nTileTwipHeight - tile height in twips
+ */
+ inline void setClientZoom(
+ int nTilePixelWidth,
+ int nTilePixelHeight,
+ int nTileTwipWidth,
+ int nTileTwipHeight)
+ {
+ mpDoc->pClass->setClientZoom(mpDoc, nTilePixelWidth, nTilePixelHeight, nTileTwipWidth, nTileTwipHeight);
+ }
+
+ /**
* Create a new view for an existing document.
* By default a loaded document has 1 view.
* @return the ID of the new view.
diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx
index 99c31b8da9a7..e1cdf83ac439 100644
--- a/include/vcl/ITiledRenderable.hxx
+++ b/include/vcl/ITiledRenderable.hxx
@@ -23,6 +23,9 @@ namespace vcl
class VCL_DLLPUBLIC ITiledRenderable
{
+protected:
+ int nTilePixelWidth, nTilePixelHeight;
+ int nTileTwipWidth, nTileTwipHeight;
public:
virtual ~ITiledRenderable();
@@ -180,6 +183,21 @@ public:
/// If the current contents of the clipboard is something we can paste.
virtual bool isMimeTypeSupported() = 0;
+
+ /**
+ * Save the client's view so that we can compute the right zoom level
+ * for the mouse events.
+ * @param nTilePixelWidth - tile width in pixels
+ * @param nTilePixelHeight - tile height in pixels
+ * @param nTileTwipWidth - tile width in twips
+ * @param nTileTwipHeight - tile height in twips
+ */
+ virtual void setClientZoom(int /*nTilePixelWidth*/,
+ int /*nTilePixelHeight*/,
+ int /*nTileTwipWidth*/,
+ int /*nTileTwipHeight*/)
+ {
+ }
};
} // namespace vcl
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 550a9221744e..f52ba6176b31 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -1506,6 +1506,23 @@ setGraphicSelectionInThread(gpointer data)
}
static void
+setClientZoomInThread(gpointer data)
+{
+ GTask* task = G_TASK(data);
+ LOKDocView* pDocView = LOK_DOC_VIEW(g_task_get_source_object(task));
+ LOKDocViewPrivate& priv = getPrivate(pDocView);
+ LOEvent* pLOEvent = static_cast<LOEvent*>(g_task_get_task_data(task));
+
+ if (!priv->m_pDocument)
+ return;
+ priv->m_pDocument->pClass->setClientZoom(priv->m_pDocument,
+ pLOEvent->m_nTilePixelWidth,
+ pLOEvent->m_nTilePixelHeight,
+ pLOEvent->m_nTileTwipWidth,
+ pLOEvent->m_nTileTwipHeight);
+}
+
+static void
postMouseEventInThread(gpointer data)
{
GTask* task = G_TASK(data);
@@ -1721,6 +1738,9 @@ lokThreadFunc(gpointer data, gpointer /*user_data*/)
case LOK_SET_GRAPHIC_SELECTION:
setGraphicSelectionInThread(task);
break;
+ case LOK_SET_CLIENT_ZOOM:
+ setClientZoomInThread(task);
+ break;
}
g_object_unref(task);
@@ -2301,6 +2321,7 @@ SAL_DLLPUBLIC_EXPORT void
lok_doc_view_set_zoom (LOKDocView* pDocView, float fZoom)
{
LOKDocViewPrivate& priv = getPrivate(pDocView);
+ GError* error = NULL;
priv->m_fZoom = fZoom;
long nDocumentWidthPixels = twipToPixel(priv->m_nDocumentWidthTwips, fZoom);
@@ -2313,6 +2334,23 @@ lok_doc_view_set_zoom (LOKDocView* pDocView, float fZoom)
gtk_widget_set_size_request(GTK_WIDGET(pDocView),
nDocumentWidthPixels,
nDocumentHeightPixels);
+
+ // Update the client's view size
+ GTask* task = g_task_new(pDocView, NULL, NULL, NULL);
+ LOEvent* pLOEvent = new LOEvent(LOK_SET_CLIENT_ZOOM);
+ pLOEvent->m_nTilePixelWidth = nTileSizePixels;
+ pLOEvent->m_nTilePixelHeight = nTileSizePixels;
+ pLOEvent->m_nTileTwipWidth = pixelToTwip(nTileSizePixels, fZoom);
+ pLOEvent->m_nTileTwipHeight = pixelToTwip(nTileSizePixels, fZoom);
+ g_task_set_task_data(task, pLOEvent, LOEvent::destroy);
+
+ g_thread_pool_push(priv->lokThreadPool, g_object_ref(task), &error);
+ if (error != NULL)
+ {
+ g_warning("Unable to call LOK_SET_CLIENT_ZOOM: %s", error->message);
+ g_clear_error(&error);
+ }
+ g_object_unref(task);
}
SAL_DLLPUBLIC_EXPORT float
diff --git a/libreofficekit/source/gtk/tilebuffer.hxx b/libreofficekit/source/gtk/tilebuffer.hxx
index 7d7160e0450e..c8f401d38c0a 100644
--- a/libreofficekit/source/gtk/tilebuffer.hxx
+++ b/libreofficekit/source/gtk/tilebuffer.hxx
@@ -157,7 +157,8 @@ enum
LOK_POST_KEY,
LOK_PAINT_TILE,
LOK_POST_MOUSE_EVENT,
- LOK_SET_GRAPHIC_SELECTION
+ LOK_SET_GRAPHIC_SELECTION,
+ LOK_SET_CLIENT_ZOOM
};
enum
@@ -231,6 +232,14 @@ struct LOEvent
int m_nSetGraphicSelectionY;
///@}
+ /// @name setClientView parameters
+ ///@{
+ int m_nTilePixelWidth;
+ int m_nTilePixelHeight;
+ int m_nTileTwipWidth;
+ int m_nTileTwipHeight;
+ ///@}
+
/// Constructor to instantiate an object of type `type`.
LOEvent(int type)
: m_nType(type)
diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx
index c208db36ec34..4c79af8343b5 100644
--- a/sc/inc/docuno.hxx
+++ b/sc/inc/docuno.hxx
@@ -405,6 +405,9 @@ public:
/// @see vcl::ITiledRenderable::isMimeTypeSupported().
virtual bool isMimeTypeSupported() override;
+ /// @see vcl::ITiledRenderable::setClientZoom().
+ virtual void setClientZoom(int nTilePixelWidth, int nTilePixelHeight, int nTileTwipWidth, int nTileTwipHeight) override;
+
/// @see vcl::ITiledRenderable::getRowColumnHeaders().
virtual OUString getRowColumnHeaders(const Rectangle& rRectangle) override;
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index b3f80b28f2d2..01ca52d393cb 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -604,7 +604,8 @@ void ScModelObj::postMouseEvent(int nType, int nX, int nY, int nCount, int nButt
return;
// update the aLogicMode in ScViewData to something predictable
- pViewData->SetZoom(Fraction(1, 1), Fraction(1, 1), true);
+ pViewData->SetZoom(Fraction(nTilePixelWidth * TWIPS_PER_PIXEL, nTileTwipWidth),
+ Fraction(nTilePixelHeight * TWIPS_PER_PIXEL, nTileTwipHeight), true);
// Calc operates in pixels...
MouseEvent aEvent(Point(nX * pViewData->GetPPTX(), nY * pViewData->GetPPTY()), nCount,
@@ -872,6 +873,14 @@ bool ScModelObj::isMimeTypeSupported()
return EditEngine::HasValidData(aDataHelper.GetTransferable());
}
+void ScModelObj::setClientZoom(int nTilePixelWidth_, int nTilePixelHeight_, int nTileTwipWidth_, int nTileTwipHeight_)
+{
+ nTilePixelWidth = nTilePixelWidth_;
+ nTilePixelHeight = nTilePixelHeight_;
+ nTileTwipWidth = nTileTwipWidth_;
+ nTileTwipHeight = nTileTwipHeight_;
+}
+
OUString ScModelObj::getRowColumnHeaders(const Rectangle& rRectangle)
{
ScViewData* pViewData = ScDocShell::GetViewData();
@@ -930,6 +939,13 @@ void ScModelObj::initializeForTiledRendering()
// tdf#93154: in tiled rendering LO doesn't always detect changes
SvtMiscOptions aMiscOpt;
aMiscOpt.SetSaveAlwaysAllowed(true);
+
+ // default tile size in pixels
+ nTilePixelWidth = 256;
+ nTilePixelHeight = 256;
+ // the default zoom level will be 1
+ nTileTwipWidth = nTilePixelWidth * TWIPS_PER_PIXEL;
+ nTileTwipHeight = nTilePixelHeight * TWIPS_PER_PIXEL;
}
uno::Any SAL_CALL ScModelObj::queryInterface( const uno::Type& rType )