[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-4-0' - bundled/include kit/ChildSession.cpp kit/ChildSession.hpp loleaflet/src wsd/ClientSession.cpp wsd/protocol.txt
Ashod Nakashian (via logerrit)
logerrit at kemper.freedesktop.org
Fri Oct 18 20:28:12 UTC 2019
bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h | 1
kit/ChildSession.cpp | 32 +++++++++++++++++++
kit/ChildSession.hpp | 1
loleaflet/src/control/Control.PartsPreview.js | 12 ++++++-
loleaflet/src/control/Parts.js | 25 ++++++++++++++
wsd/ClientSession.cpp | 20 +++++++++++
wsd/protocol.txt | 9 +++++
7 files changed, 98 insertions(+), 2 deletions(-)
New commits:
commit 9408633f9c82c64fc57dd29a9c8f36f6b84b35c2
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
AuthorDate: Tue Sep 11 19:30:55 2018 -0400
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Fri Oct 18 22:27:53 2019 +0200
wsd: loleaflet: select multiple parts
Primarily support for selecting multiple slides
to edit their properties together.
Change-Id: I96c7ec048668494b5b769677db6874df91cbb42d
Reviewed-on: https://gerrit.libreoffice.org/69631
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
(cherry picked from commit 66930b7232c366968099d5e98ffa574425a52f04)
Reviewed-on: https://gerrit.libreoffice.org/80574
Reviewed-by: Andras Timar <andras.timar at collabora.com>
Tested-by: Andras Timar <andras.timar at collabora.com>
diff --git a/bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h b/bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h
index 850e544c6..4f9d668c4 100644
--- a/bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h
+++ b/bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h
@@ -564,6 +564,7 @@ typedef enum
* "type" tells the type of the window the action is associated with
* - "dialog" - window is a dialog
* - "child" - window is a floating window (combo boxes, etc.)
+ * - "panel" - window is a docked panel (i.e. in the sidebar)
*
* "action" can take following values:
* - "created" - window is created in the backend, client can render it now
diff --git a/kit/ChildSession.cpp b/kit/ChildSession.cpp
index 4a2d0e642..5bec45b48 100644
--- a/kit/ChildSession.cpp
+++ b/kit/ChildSession.cpp
@@ -223,6 +223,10 @@ bool ChildSession::_handleInput(const char *buffer, int length)
{
return setClientPart(buffer, length, tokens);
}
+ else if (tokens[0] == "selectclientpart")
+ {
+ return selectClientPart(buffer, length, tokens);
+ }
else if (tokens[0] == "setpage")
{
return setPage(buffer, length, tokens);
@@ -1791,6 +1795,34 @@ bool ChildSession::setClientPart(const char* /*buffer*/, int /*length*/, const s
return true;
}
+bool ChildSession::selectClientPart(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
+{
+ int nPart;
+ int nSelect;
+ if (tokens.size() < 3 ||
+ !getTokenInteger(tokens[1], "part", nPart) ||
+ !getTokenInteger(tokens[2], "how", nSelect))
+ {
+ sendTextFrame("error: cmd=selectclientpart kind=invalid");
+ return false;
+ }
+
+ std::unique_lock<std::mutex> lock(_docManager.getDocumentMutex());
+
+ getLOKitDocument()->setView(_viewId);
+
+ if (getLOKitDocument()->getDocumentType() != LOK_DOCTYPE_TEXT && nPart != getLOKitDocument()->getPart())
+ {
+ getLOKitDocument()->selectPart(nPart, nSelect);
+ }
+ else
+ {
+ LOG_WRN("ChildSession::selectClientPart[" << getName() << "]: error selecting part on text documents.");
+ }
+
+ return true;
+}
+
bool ChildSession::setPage(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
{
int page;
diff --git a/kit/ChildSession.hpp b/kit/ChildSession.hpp
index f40110b15..ed272f225 100644
--- a/kit/ChildSession.hpp
+++ b/kit/ChildSession.hpp
@@ -262,6 +262,7 @@ private:
bool resetSelection(const char* buffer, int length, const std::vector<std::string>& tokens);
bool saveAs(const char* buffer, int length, const std::vector<std::string>& tokens);
bool setClientPart(const char* buffer, int length, const std::vector<std::string>& tokens);
+ bool selectClientPart(const char* buffer, int length, const std::vector<std::string>& tokens);
bool setPage(const char* buffer, int length, const std::vector<std::string>& tokens);
bool sendWindowCommand(const char* buffer, int length, const std::vector<std::string>& tokens);
bool signDocumentContent(const char* buffer, int length, const std::vector<std::string>& tokens);
diff --git a/loleaflet/src/control/Control.PartsPreview.js b/loleaflet/src/control/Control.PartsPreview.js
index eae8149d3..dc978f39f 100644
--- a/loleaflet/src/control/Control.PartsPreview.js
+++ b/loleaflet/src/control/Control.PartsPreview.js
@@ -188,7 +188,17 @@ L.Control.PartsPreview = L.Control.extend({
}
var part = $('#slide-sorter .mCSB_container .preview-frame').index(e.target.parentNode);
if (part !== null) {
- this._map.setPart(parseInt(part));
+ var partId = parseInt(part);
+
+ if (e.ctrlKey) {
+ this._map.selectPart(partId, 2, false); // Toggle selection on ctrl+click.
+ } else if (e.altKey) {
+ console.log('alt');
+ } else if (e.shiftKey) {
+ console.log('shift');
+ } else {
+ this._map.setPart(partId);
+ }
}
},
diff --git a/loleaflet/src/control/Parts.js b/loleaflet/src/control/Parts.js
index 1b309146c..49a8de3ec 100644
--- a/loleaflet/src/control/Parts.js
+++ b/loleaflet/src/control/Parts.js
@@ -1,6 +1,6 @@
/* -*- js-indent-level: 8 -*- */
/*
- * Document parts switching handler
+ * Document parts switching and selecting handler
*/
L.Map.include({
setPart: function (part, external, calledFromSetPartHandler) {
@@ -54,6 +54,29 @@ L.Map.include({
}
},
+ // part is the part index/id
+ // how is 0 to deselect, 1 to select, and 2 to toggle selection
+ selectPart: function (part, how, external) {
+ var docLayer = this._docLayer;
+ if (typeof (part) === 'number' && part >= 0 && part < docLayer._parts) {
+ var selectedPart = part;
+ }
+ else {
+ return;
+ }
+ this.fire('updateparts', {
+ selectedPart: docLayer._selectedPart,
+ parts: docLayer._parts,
+ docType: docLayer._docType
+ });
+
+ // If this wasn't triggered from the server,
+ // then notify the server of the change.
+ if (!external) {
+ this._socket.sendMessage('selectclientpart part=' + selectedPart + ' how=' + how);
+ }
+ },
+
getPreview: function (id, index, maxWidth, maxHeight, options) {
if (!this._docPreviews) {
this._docPreviews = {};
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index c26c804a7..4014a3e58 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -163,6 +163,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
tokens[0] != "selectgraphic" &&
tokens[0] != "selecttext" &&
tokens[0] != "setclientpart" &&
+ tokens[0] != "selectclientpart" &&
tokens[0] != "setpage" &&
tokens[0] != "status" &&
tokens[0] != "tile" &&
@@ -320,6 +321,25 @@ bool ClientSession::_handleInput(const char *buffer, int length)
}
}
}
+ else if (tokens[0] == "selectclientpart")
+ {
+ if(!_isTextDocument)
+ {
+ int part;
+ int how;
+ if (tokens.size() != 3 ||
+ !getTokenInteger(tokens[1], "part", part) ||
+ !getTokenInteger(tokens[2], "how", how))
+ {
+ sendTextFrame("error: cmd=selectclientpart kind=syntax");
+ return false;
+ }
+ else
+ {
+ return forwardToChild(std::string(buffer, length), docBroker);
+ }
+ }
+ }
else if (tokens[0] == "clientzoom")
{
int tilePixelWidth, tilePixelHeight, tileTwipWidth, tileTwipHeight;
diff --git a/wsd/protocol.txt b/wsd/protocol.txt
index 047cbead5..a4631c912 100644
--- a/wsd/protocol.txt
+++ b/wsd/protocol.txt
@@ -138,6 +138,15 @@ setclientpart part=<partNumber>
Informs the server that the client changed to part <partNumber>.
+selectclientpart part=<partNumber>
+
+ Informs the server that the client changed the selection state of <partNumber>.
+
+setpage page=<pageNumber>
+
+ Valid only for text documents.
+ Informs the server that the client changed to page <pageNumber>.
+
status
styles
More information about the Libreoffice-commits
mailing list