bundled/include/LibreOfficeKit/LibreOfficeKit.h | 3 ++ bundled/include/LibreOfficeKit/LibreOfficeKit.hxx | 13 ++++++++ kit/ChildSession.cpp | 33 ++++++++++++++++++++++ kit/ChildSession.hpp | 1 kit/DummyLibreOfficeKit.cpp | 11 +++++++ loleaflet/src/control/Control.Header.js | 16 ++++------ wsd/ClientSession.cpp | 1 wsd/protocol.txt | 6 ++++ 8 files changed, 75 insertions(+), 9 deletions(-)
New commits: commit 29a233e5a9009cbe2ec0f62cc05cf0aceca8e459 Author: Marco Cecchetti <marco.cecche...@collabora.com> Date: Tue Nov 28 23:38:35 2017 +0100 calc: set outline state use a specific message from the client for set the visibility state of a group instead of hijacking the update row/column header message Change-Id: I69d66b30db0b4d8a0082cbd2524120491d4f97cb Reviewed-on: https://gerrit.libreoffice.org/45446 Reviewed-by: Marco Cecchetti <mrcek...@gmail.com> Tested-by: Marco Cecchetti <mrcek...@gmail.com> diff --git a/bundled/include/LibreOfficeKit/LibreOfficeKit.h b/bundled/include/LibreOfficeKit/LibreOfficeKit.h index 14824821..02e8e50e 100644 --- a/bundled/include/LibreOfficeKit/LibreOfficeKit.h +++ b/bundled/include/LibreOfficeKit/LibreOfficeKit.h @@ -227,6 +227,9 @@ struct _LibreOfficeKitDocumentClass /// @see lok::Document::setVisibleArea). void (*setClientVisibleArea) (LibreOfficeKitDocument* pThis, int nX, int nY, int nWidth, int nHeight); + /// @see lok::Document::setOutlineState). + void (*setOutlineState) (LibreOfficeKitDocument* pThis, bool bColumn, int nLevel, int nIndex, bool bHidden); + /// @see lok::Document::createView(). int (*createView) (LibreOfficeKitDocument* pThis); /// @see lok::Document::destroyView(). diff --git a/bundled/include/LibreOfficeKit/LibreOfficeKit.hxx b/bundled/include/LibreOfficeKit/LibreOfficeKit.hxx index 19e121fe..1c4fcd03 100644 --- a/bundled/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/bundled/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -465,6 +465,19 @@ public: } /** + * Show/Hide a single row/column header outline for Calc dosuments. + * + * @param bColumn - if we are dealing with a column or row group + * @param nLevel - the level to which the group belongs + * @param nIndex - the group entry index + * @param bHidden - the new group state (collapsed/expanded) + */ + void setOutlineState(bool bColumn, int nLevel, int nIndex, bool bHidden) + { + mpDoc->pClass->setOutlineState(mpDoc, bColumn, nLevel, nIndex, bHidden); + } + + /** * 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/kit/ChildSession.cpp b/kit/ChildSession.cpp index b540febe..ca4c855e 100644 --- a/kit/ChildSession.cpp +++ b/kit/ChildSession.cpp @@ -217,6 +217,7 @@ bool ChildSession::_handleInput(const char *buffer, int length) assert(tokens[0] == "clientzoom" || tokens[0] == "clientvisiblearea" || + tokens[0] == "outlinestate" || tokens[0] == "downloadas" || tokens[0] == "getchildid" || tokens[0] == "gettextselection" || @@ -243,6 +244,10 @@ bool ChildSession::_handleInput(const char *buffer, int length) { return clientVisibleArea(buffer, length, tokens); } + else if (tokens[0] == "outlinestate") + { + return outlineState(buffer, length, tokens); + } else if (tokens[0] == "downloadas") { return downloadAs(buffer, length, tokens); @@ -592,6 +597,34 @@ bool ChildSession::clientVisibleArea(const char* /*buffer*/, int /*length*/, con return true; } +bool ChildSession::outlineState(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens) +{ + std::string type, state; + int level, index; + + if (tokens.size() != 5 || + !getTokenString(tokens[1], "type", type) || + (type != "column" && type != "row") || + !getTokenInteger(tokens[2], "level", level) || + !getTokenInteger(tokens[3], "index", index) || + !getTokenString(tokens[4], "state", state) || + (state != "visible" && state != "hidden")) + { + sendTextFrame("error: cmd=outlinestate kind=syntax"); + return false; + } + + bool column = type == "column"; + bool hidden = state == "hidden"; + + std::unique_lock<std::mutex> lock(_docManager.getDocumentMutex()); + + getLOKitDocument()->setView(_viewId); + + getLOKitDocument()->setOutlineState(column, level, index, hidden); + return true; +} + bool ChildSession::downloadAs(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens) { std::string name, id, format, filterOptions; diff --git a/kit/ChildSession.hpp b/kit/ChildSession.hpp index b5b9209c..ad9486a2 100644 --- a/kit/ChildSession.hpp +++ b/kit/ChildSession.hpp @@ -182,6 +182,7 @@ private: bool clientZoom(const char* buffer, int length, const std::vector<std::string>& tokens); bool clientVisibleArea(const char* buffer, int length, const std::vector<std::string>& tokens); + bool outlineState(const char* buffer, int length, const std::vector<std::string>& tokens); bool downloadAs(const char* buffer, int length, const std::vector<std::string>& tokens); bool getChildId(); bool getTextSelection(const char* buffer, int length, const std::vector<std::string>& tokens); diff --git a/kit/DummyLibreOfficeKit.cpp b/kit/DummyLibreOfficeKit.cpp index 891ac6ed..55f4e0ce 100644 --- a/kit/DummyLibreOfficeKit.cpp +++ b/kit/DummyLibreOfficeKit.cpp @@ -106,6 +106,7 @@ static void doc_setClientZoom(LibreOfficeKitDocument* pThis, int nTileTwipWidth, int nTileTwipHeight); static void doc_setClientVisibleArea(LibreOfficeKitDocument* pThis, int nX, int nY, int nWidth, int nHeight); +static void doc_setOutlineState(LibreOfficeKitDocument* pThis, bool bColumn, int nLevel, int nIndex, bool bHidden); static int doc_createView(LibreOfficeKitDocument* pThis); static void doc_destroyView(LibreOfficeKitDocument* pThis, int nId); static void doc_setView(LibreOfficeKitDocument* pThis, int nId); @@ -153,6 +154,7 @@ LibLODocument_Impl::LibLODocument_Impl() m_pDocumentClass->getCommandValues = doc_getCommandValues; m_pDocumentClass->setClientZoom = doc_setClientZoom; m_pDocumentClass->setClientVisibleArea = doc_setClientVisibleArea; + m_pDocumentClass->setOutlineState = doc_setOutlineState; m_pDocumentClass->createView = doc_createView; m_pDocumentClass->destroyView = doc_destroyView; @@ -464,6 +466,15 @@ static void doc_setClientVisibleArea(LibreOfficeKitDocument* pThis, int nX, int (void) nHeight; } +static void doc_setOutlineState(LibreOfficeKitDocument* pThis, bool bColumn, int nLevel, int nIndex, bool bHidden) +{ + (void) pThis; + (void) bColumn; + (void) nLevel; + (void) nIndex; + (void) bHidden; +} + static int doc_createView(LibreOfficeKitDocument* /*pThis*/) { return 1; diff --git a/loleaflet/src/control/Control.Header.js b/loleaflet/src/control/Control.Header.js index 6dac7330..3da83248 100644 --- a/loleaflet/src/control/Control.Header.js +++ b/loleaflet/src/control/Control.Header.js @@ -382,15 +382,13 @@ L.Control.Header = L.Control.extend({ }, _updateOutlineState: function (column, group) { - var e = { - x: this._map._getTopLeftPoint().x, - y: this._map._getTopLeftPoint().y, - offset: {x: undefined, y: undefined}, - outline: {column: column, level: group.level, index: group.index, hidden: !group.hidden} - }; - this._map.fire('updaterowcolumnheaders', e); - // TODO do we need this ? - //this._map._socket.sendMessage('commandvalues command=.uno:ViewAnnotationsPosition'); + if (!group) + return; + + var type = column ? 'column' : 'row'; + var state = group.hidden ? 'visible' : 'hidden'; // we have to send the new state + var payload = 'outlinestate type='+ type + ' level=' + group.level + ' index=' + group.index + ' state=' + state; + this._map._socket.sendMessage(payload); }, _onMouseDown: function (e) { diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index d7f6f1fc..663a55fc 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -126,6 +126,7 @@ bool ClientSession::_handleInput(const char *buffer, int length) else if (tokens[0] != "canceltiles" && tokens[0] != "clientzoom" && tokens[0] != "clientvisiblearea" && + tokens[0] != "outlinestate" && tokens[0] != "commandvalues" && tokens[0] != "closedocument" && tokens[0] != "downloadas" && diff --git a/wsd/protocol.txt b/wsd/protocol.txt index 3af10f64..bb871d81 100644 --- a/wsd/protocol.txt +++ b/wsd/protocol.txt @@ -177,6 +177,12 @@ clientvisiblearea x=<x> y=<y> width=<width> height=<height> Invokes lok::Document::setClientVisibleArea(). +outlinestate type=<type> level=<level> index=<index> state=<state> + + <type> is 'column' or 'row', <level> and <index> are numbers, <state> is 'visible' or 'hidden'. + + Invokes lok::Document::setOutlineState(). + useractive Sent when the user regains focus or clicks within the active area to _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits