[Libreoffice-commits] online.git: Branch 'feature/jsdialogs' - 394 commits - android/app android/lib android/templates common/FileUtil.cpp common/Log.cpp common/Log.hpp common/LOOLWebSocket.hpp common/Message.hpp common/MessageQueue.cpp common/Protocol.cpp common/Protocol.hpp common/Seccomp.cpp common/Seccomp.hpp common/Session.cpp common/Session.hpp common/StringVector.cpp common/StringVector.hpp common/Unit.hpp common/Util.cpp common/Util.hpp configure.ac cypress_test/cypress.json cypress_test/data cypress_test/integration_tests cypress_test/Makefile.am cypress_test/package.json cypress_test/plugins cypress_test/README cypress_test/support discovery.xml docker/l10n-docker-nightly.sh docker/scripts fuzzer/Admin.cpp fuzzer/admin-data fuzzer/ClientSession.cpp fuzzer/data ios/Mobile ios/Mobile.xcodeproj kit/ChildSession.cpp kit/ChildSession.hpp kit/ForKit.cpp kit/Kit.cpp loleaflet/admin loleaflet/build loleaflet/bundle.js.m4 loleaflet/css loleaflet/.eslintrc loleaflet/html loleaflet/images loleafle t/js loleaflet/l10n loleaflet/loleaflet-src.js.m4 loleaflet/Makefile.am loleaflet/po loleaflet/spec loleaflet/src loolkitconfig-mobile.xcu loolwsd.xml.in Makefile.am net/Socket.cpp net/Socket.hpp net/SslSocket.hpp net/WebSocketHandler.hpp test/countloolkits.hpp test/data test/DeltaTests.cpp test/fakesockettest.cpp test/helpers.hpp test/httpcrashtest.cpp test/httpwstest.cpp test/integration-http-server.cpp test/lokassert.hpp test/Makefile.am test/TileCacheTests.cpp test/TileQueueTests.cpp test/UnitAdmin.cpp test/UnitBadDocLoad.cpp test/UnitCalc.cpp test/UnitClose.cpp test/UnitCursor.cpp test/UnitEachView.cpp test/UnitFuzz.cpp test/UnitHosting.cpp test/UnitHTTP.cpp test/UnitInsertDelete.cpp test/UnitLargePaste.cpp test/UnitLoad.cpp test/UnitLoadTorture.cpp test/UnitOAuth.cpp test/UnitPasswordProtected.cpp test/UnitPaste.cpp test/UnitRenderingOptions.cpp test/UnitRenderShape.cpp test/UnitSession.cpp test/UnitTiffLoad.cpp test/UnitUNOCommand.cpp test/UnitWOPI.cpp test/UnitWOPIRenameFile .cpp test/UnitWOPISaveAs.cpp test/UnitWOPITemplate.cpp test/UnitWOPIVersionRestore.cpp test/UnitWOPIWatermark.cpp test/WhiteBoxTests.cpp test/WopiTestServer.hpp tools/Connect.cpp tools/KitClient.cpp tools/WebSocketDump.cpp wsd/Admin.cpp wsd/Admin.hpp wsd/Auth.cpp wsd/ClientSession.cpp wsd/ClientSession.hpp wsd/DocumentBroker.cpp wsd/DocumentBroker.hpp wsd/FileServer.cpp wsd/LOOLWSD.cpp wsd/LOOLWSD.hpp wsd/Storage.cpp wsd/TestStubs.cpp wsd/TileCache.cpp wsd/TileDesc.hpp wsd/TraceFile.hpp

Szymon KÅ‚os (via logerrit) logerrit at kemper.freedesktop.org
Fri Apr 3 06:30:51 UTC 2020


Rebased ref, commits from common ancestor:
commit c4590977dac80308a02067bb8089bbf4bedc0a2a
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Tue Mar 31 12:17:20 2020 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:18:17 2020 +0200

    jsdialog: show ok button in message boxes
    
    Change-Id: I4f57b6cc0275875150a6cd1c944e2d12394a59a4

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index f42b84064..1ea147613 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -35,6 +35,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		this._controlHandlers['edit'] = this._editControl;
 		this._controlHandlers['multilineedit'] = this._multiLineEditControl;
 		this._controlHandlers['pushbutton'] = this._pushbuttonControl;
+		this._controlHandlers['okbutton'] = this._pushbuttonControl;
 		this._controlHandlers['combobox'] = this._comboboxControl;
 		this._controlHandlers['comboboxentry'] = this._comboboxEntry;
 		this._controlHandlers['listbox'] = this._listboxControl;
commit 8faff3302af9b3ec085b5613cf22db1ef484b65e
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Tue Mar 31 12:14:40 2020 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:18:17 2020 +0200

    jsdialog: close mobilewizard before all dialogs
    
    Mobilewizard has reference to the last window so in
    case of message box it will be closed first.
    This prevent us from closing parent window before child
    as we close all windows in closePopups.
    
    Change-Id: I9887b56374f2fc7e1cabb46d97e2c8ee03511596

diff --git a/loleaflet/src/map/handler/Map.TouchGesture.js b/loleaflet/src/map/handler/Map.TouchGesture.js
index 95c2eb25e..ebc5d2ddd 100644
--- a/loleaflet/src/map/handler/Map.TouchGesture.js
+++ b/loleaflet/src/map/handler/Map.TouchGesture.js
@@ -309,8 +309,8 @@ L.Map.TouchGesture = L.Handler.extend({
 			return;
 		}
 
-		this._map.fire('closepopups');
 		this._map.fire('closemobilewizard');
+		this._map.fire('closepopups');
 		this._map.fire('editorgotfocus');
 
 		var docLayer = this._map._docLayer;
commit d5e75c9a0bc635cc4930374061a6450745bea047
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Mar 26 14:58:14 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:18:17 2020 +0200

    jsdialog: customize spell checking error label
    
    Change-Id: Ieb977363bda76af51a4e5d41052fc378995e24ea

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index f48f032b2..e82eec5a9 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -840,6 +840,12 @@ input[type=checkbox][disabled] {
 	font-size: 15pt;
 }
 
+#mobile-spell-error {
+	border: none;
+	font-size: 15pt;
+	color: red !important;
+}
+
 #searchlabel {
 	border: none;
 	font-size: 11pt;
commit 03abc977725737d14fcdf001071794537ef4aa14
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 25 12:17:06 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:17:43 2020 +0200

    jsdialog: handle drawingarea
    
    Change-Id: Ia3bc01e76c71edc7ac59e3157e7de5700397c21d

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index 60bdf2f98..f48f032b2 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -848,3 +848,8 @@ input[type=checkbox][disabled] {
 #criteria.ui-tab, #inputhelp.ui-tab {
 	width: 30% !important;
 }
+
+.mobile-wizard.ui-drawing-area {
+	margin: 10px 5% 10px 5% !important;
+	width: 90%;
+}
diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index cd3ea3f85..f42b84064 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -59,6 +59,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		this._controlHandlers['colorlistbox'] = this._colorControl;
 		this._controlHandlers['borderstyle'] = this._borderControl;
 		this._controlHandlers['treelistbox'] = this._listboxControl;
+		this._controlHandlers['drawingarea'] = this._drawingAreaControl;
 
 		this._controlHandlers['mainmenu'] = this._containerHandler;
 		this._controlHandlers['submenu'] = this._subMenuHandler;
@@ -1365,6 +1366,15 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		return false;
 	},
 
+	_drawingAreaControl: function(parentContainer, data) {
+		if (data.image) {
+			var image = L.DomUtil.create('img', 'mobile-wizard ui-drawing-area', parentContainer);
+			image.src = data.image.replace('\\', '');
+			image.id = data.id;
+		}
+		return false;
+	},
+
 	_htmlControl: function(parentContainer, data) {
 		var container = L.DomUtil.create('div', 'mobile-wizard', parentContainer);
 		container.appendChild(data.content);
commit dc9035f2bcc6e7cb60f4d563d0a6826a1394bfe8
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Tue Mar 24 14:53:35 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:17:12 2020 +0200

    jsdialog: handle treelistbox
    
    Change-Id: I89da1b60591f8a83413b0d25ec75812120ab5f11

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index b5ec16003..cd3ea3f85 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -58,6 +58,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		this._controlHandlers['divcontainer'] = this._divContainerHandler;
 		this._controlHandlers['colorlistbox'] = this._colorControl;
 		this._controlHandlers['borderstyle'] = this._borderControl;
+		this._controlHandlers['treelistbox'] = this._listboxControl;
 
 		this._controlHandlers['mainmenu'] = this._containerHandler;
 		this._controlHandlers['submenu'] = this._subMenuHandler;
@@ -1268,9 +1269,10 @@ L.Control.JSDialogBuilder = L.Control.extend({
 				var value = data.entries[data.selectedEntries[0]];
 				valueNode = L.DomUtil.create('div', '', null);
 				valueNode.innerHTML = value;
-			} else {
+			} else if (isNaN(parseInt(data.selectedEntries[0])))
+				title = builder._cleanText(data.selectedEntries[0]);
+			else
 				title = data.entries[data.selectedEntries[0]];
-			}
 		}
 		title = builder._cleanText(title);
 		data.text = title;
@@ -1279,6 +1281,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		for (var index in data.entries) {
 			var style = 'ui-combobox-text';
 			if ((data.selectedEntries && index == data.selectedEntries[0])
+				|| (data.selectedEntries && data.entries[index] == data.selectedEntries[0])
 				|| data.entries[index] == title) {
 				style += ' selected';
 			}
commit b82eb7e498c716026e1c552384b1b0d432a092ca
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Mar 19 14:02:21 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:16:43 2020 +0200

    jsdialog: add custom text for select range button

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 26d85ecae..b5ec16003 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -1145,9 +1145,17 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		return false;
 	},
 
+	_customPushButtonTextForId: function(buttonId) {
+		if (buttonId == 'validref')
+			return _('Select range');
+
+		return '';
+	},
+
 	_pushbuttonControl: function(parentContainer, data, builder, customCallback) {
 		var pushbutton = L.DomUtil.create('button', '', parentContainer);
-		pushbutton.innerHTML = builder._cleanText(data.text);
+		var customText = builder._customPushButtonTextForId(data.id);
+		pushbutton.innerHTML = customText !== '' ? customText : builder._cleanText(data.text);
 		pushbutton.id = data.id;
 
 		if (data.enabled == 'false')
commit 880d431abacbc74c150a28ed94799caa78433eaf
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 18 14:47:36 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:16:43 2020 +0200

    jsdialog: full width combobox

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index c714baa30..60bdf2f98 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -824,6 +824,11 @@ input[type=checkbox][disabled] {
 	width: 100%;
 }
 
+.combobox {
+	width: -moz-available !important;
+	width: -webkit-fill-available !important;
+}
+
 .ui-edit.mobile-wizard, textarea {
 	width: -moz-available;
 	width: -webkit-fill-available;
diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index f757ecb93..26d85ecae 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -1180,7 +1180,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		if (data && data.id)
 			sectionTitle.id = data.id;
 
-		var leftDiv = L.DomUtil.create('div', 'ui-header-left', sectionTitle);
+		var leftDiv = L.DomUtil.create('div', 'ui-header-left combobox', sectionTitle);
 
 		var editCallback = function(value) {
 			builder.callback('combobox', 'change', data, value, builder);
commit b815c26ecb582a5bc578de8e6afdeaf280d12f7a
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 18 14:45:22 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:16:10 2020 +0200

    jsdialog: keep edit field in line with arrow

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index 16044b8c2..c714baa30 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -827,7 +827,7 @@ input[type=checkbox][disabled] {
 .ui-edit.mobile-wizard, textarea {
 	width: -moz-available;
 	width: -webkit-fill-available;
-	margin: 0px 5% 10px 5% !important;
+	margin: 10px 5% 10px 5% !important;
 }
 
 #label9, #documentlabel-mobile {
commit a92bf9ea350151f4b4d8214a907b47415222381d
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 18 13:01:59 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:15:06 2020 +0200

    jsdialog: fix checkbox

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 5cd4af45b..f757ecb93 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -641,7 +641,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		}
 
 		checkbox.addEventListener('change', function() {
-			builder.callback('checkbox', 'change', checkbox, this.checked, builder);
+			builder.callback('checkbox', 'change', div, this.checked, builder);
 		});
 
 		var customCommand = builder._mapWindowIdToUnoCommand(data.id);
commit 9c158d749433fd9427005b5ee960909475c7e6a5
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Tue Mar 17 15:17:57 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:15:06 2020 +0200

    jsdialog: textarea without cursor is a paragraph

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index c663abd77..5cd4af45b 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -1116,8 +1116,17 @@ L.Control.JSDialogBuilder = L.Control.extend({
 	},
 
 	_multiLineEditControl: function(parentContainer, data, builder, callback) {
-		var edit = L.DomUtil.create('textarea', '', parentContainer);
-		edit.value = builder._cleanText(data.text);
+		var controlType = 'textarea';
+		if (data.cursor && data.cursor === 'false')
+			controlType = 'p';
+
+		var edit = L.DomUtil.create(controlType, '', parentContainer);
+
+		if (controlType === 'textarea')
+			edit.value = builder._cleanText(data.text);
+		else
+			edit.innerHTML = builder._cleanText(data.text);
+
 		edit.id = data.id;
 
 		if (data.enabled == 'false')
commit 776cf39343da9d611adf1b227ce18d287b47b491
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Mon Mar 16 19:08:38 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:15:06 2020 +0200

    jsdialog: edit control full width

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index 2d15599a3..16044b8c2 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -825,8 +825,9 @@ input[type=checkbox][disabled] {
 }
 
 .ui-edit.mobile-wizard, textarea {
-	margin-left: 5% !important;
-	margin-bottom: 10px;
+	width: -moz-available;
+	width: -webkit-fill-available;
+	margin: 0px 5% 10px 5% !important;
 }
 
 #label9, #documentlabel-mobile {
commit ccffa1a3e717e1cd2eabe2112c96ce957e776a27
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Mar 12 09:40:00 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:13:17 2020 +0200

    jsdialog: style dialogs
    
    Change-Id: Iaac2c5521db66ea42900756584262463ae527892

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index c284f2240..2d15599a3 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -812,3 +812,33 @@ input[type=checkbox][disabled] {
 	background-color: grey !important;
 	border-color: grey !important;
 }
+
+.ui-checkbox.mobile-wizard {
+	margin-top: 25px;
+	padding-left: 2% !important;
+	width: 100%;
+}
+
+.ui-header-left > input, .ui-checkbox.mobile-wizard > label {
+	margin-left: 2% !important;
+	width: 100%;
+}
+
+.ui-edit.mobile-wizard, textarea {
+	margin-left: 5% !important;
+	margin-bottom: 10px;
+}
+
+#label9, #documentlabel-mobile {
+	border: none;
+	font-size: 15pt;
+}
+
+#searchlabel {
+	border: none;
+	font-size: 11pt;
+}
+
+#criteria.ui-tab, #inputhelp.ui-tab {
+	width: 30% !important;
+}
diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 56b27a4b9..c663abd77 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -1091,7 +1091,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 	},
 
 	_editControl: function(parentContainer, data, builder, callback) {
-		var edit = L.DomUtil.create('input', '', parentContainer);
+		var edit = L.DomUtil.create('input', 'ui-edit mobile-wizard', parentContainer);
 		edit.value = builder._cleanText(data.text);
 		edit.id = data.id;
 
@@ -1226,7 +1226,8 @@ L.Control.JSDialogBuilder = L.Control.extend({
 	_comboboxControl: function(parentContainer, data, builder) {
 		if (data.id === 'applystyle' ||
 			data.id === 'fontnamecombobox' ||
-			data.id === 'fontsizecombobox')
+			data.id === 'fontsizecombobox' ||
+			data.id === 'FontBox')
 			builder._listboxControl(parentContainer, data, builder);
 		else
 			builder._explorableEditControl(parentContainer, data, builder);
@@ -1240,6 +1241,9 @@ L.Control.JSDialogBuilder = L.Control.extend({
 
 		builder._setIconAndNameForCombobox(data);
 
+		if (data.id === 'FontBox')
+			data.text = '';
+
 		var title = data.text;
 		var valueNode = null;
 		if (data.selectedEntries) {
commit 17a87bd1a6f9512de7ecf9cb5d218bf03cad84b3
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Mar 12 09:00:53 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:12:22 2020 +0200

    jsdialog: avoid doubled ids
    
    Change-Id: Ib6ad41d60f297906c7104b45e032937c18e45252

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 9bdd8d3aa..56b27a4b9 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -626,11 +626,13 @@ L.Control.JSDialogBuilder = L.Control.extend({
 
 	_checkboxControl: function(parentContainer, data, builder) {
 		var div = L.DomUtil.createWithId('div', data.id, parentContainer);
+		$(div).addClass('ui-checkbox');
+		$(div).addClass('mobile-wizard');
 
 		var checkboxLabel = L.DomUtil.create('label', '', div);
 		checkboxLabel.innerHTML = builder._cleanText(data.text);
 		checkboxLabel.for = data.id;
-		var checkbox = L.DomUtil.createWithId('input', data.id, div);
+		var checkbox = L.DomUtil.create('input', '', div);
 		checkbox.type = 'checkbox';
 
 		if (data.enabled == 'false') {
commit c51c96565e611a81efa0b33b73209ba4d9b38330
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 11 15:07:43 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:12:22 2020 +0200

    jsdialog: revert previous font style listboxes
    
    Change-Id: Id2a279f81a09bc7b82293add5fb526fb4516883d

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 68bc553ac..9bdd8d3aa 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -1222,7 +1222,12 @@ L.Control.JSDialogBuilder = L.Control.extend({
 	},
 
 	_comboboxControl: function(parentContainer, data, builder) {
-		builder._explorableEditControl(parentContainer, data, builder);
+		if (data.id === 'applystyle' ||
+			data.id === 'fontnamecombobox' ||
+			data.id === 'fontsizecombobox')
+			builder._listboxControl(parentContainer, data, builder);
+		else
+			builder._explorableEditControl(parentContainer, data, builder);
 	},
 
 	_listboxControl: function(parentContainer, data, builder) {
commit a01f405dcc25beec02b2fb88050540c4c37f62fe
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 11 15:03:54 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:12:22 2020 +0200

    jsdialog: better disabled button styling
    
    Change-Id: I681a1422c4b2fb63def4621d40ba7d287622a50f

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index 5ecd16d70..c284f2240 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -796,6 +796,7 @@ input[type=checkbox]#UseBandingColumnStyle, input[type=checkbox]#UseLastColumnSt
 }
 #mobile-wizard button:disabled{
 	background-color: silver;
+	border-color: white;
 }
 #enablecontour + button {
 	float: right;
commit 2cd55212aba54af72f1aa0eed4fef53a5c71e3cc
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 11 14:45:28 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:11:30 2020 +0200

    jsdialog: handle selected tab
    
    Change-Id: I80992bfe173cd48bbabf1dd1aa14fbc5701c4fa6

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 884245327..68bc553ac 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -505,7 +505,9 @@ L.Control.JSDialogBuilder = L.Control.extend({
 				var title = builder._cleanText(item.text);
 
 				var tab = L.DomUtil.create('div', 'ui-tab mobile-wizard', tabsContainer);
-				tab.id = title;
+				tab.id = data.tabs[tabIdx].name;
+				if (data.selected == data.tabs[tabIdx].id)
+					$(tab).addClass('selected');
 				tabs[tabIdx] = tab;
 
 				var label = L.DomUtil.create('span', 'ui-tab-content mobile-wizard unolabel', tab);
commit 906da746e2b0f5fec5f4a340e28425198e9809e7
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 11 14:13:24 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:11:30 2020 +0200

    jsdialog: style disabled checkboxes
    
    Change-Id: I274f342ee8fb24ab0d0ff3d91875ca3f7332ff7d

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index e126cc0bf..5ecd16d70 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -802,3 +802,12 @@ input[type=checkbox]#UseBandingColumnStyle, input[type=checkbox]#UseLastColumnSt
 	margin: 24px 0px;
 }
 div#enablecontour + p, #arrangelabel, #SetMinimalRowHeight {clear: both;}
+
+label.disabled {
+	color: grey !important;
+}
+
+input[type=checkbox][disabled] {
+	background-color: grey !important;
+	border-color: grey !important;
+}
diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index b029641f4..884245327 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -631,8 +631,10 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		var checkbox = L.DomUtil.createWithId('input', data.id, div);
 		checkbox.type = 'checkbox';
 
-		if (data.enabled == 'false')
+		if (data.enabled == 'false') {
+			$(checkboxLabel).addClass('disabled');
 			$(checkbox).attr('disabled', 'disabled');
+		}
 
 		checkbox.addEventListener('change', function() {
 			builder.callback('checkbox', 'change', checkbox, this.checked, builder);
commit d5b55e49665a23f6e6ed6d94d0e43e15fd13d18e
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 11 14:08:29 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:10:51 2020 +0200

    jsdialog: style disabled listboxes
    
    Change-Id: I2dbe1b63bc4266261cefb45d472aef45c3b6fd3f

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index 296cafe66..e126cc0bf 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -325,6 +325,10 @@ p.mobile-wizard.ui-combobox-text.selected {
 	background-color: #fff;
 }
 
+.ui-header.mobile-wizard.disabled .ui-header-left * {
+	color: grey !important;
+}
+
 .ui-header.mobile-wizard:active, .mobile-wizard.ui-combobox-text:active, .ui-header.mobile-wizard:focus, .mobile-wizard.ui-combobox-text:focus, .ui-header.mobile-wizard:hover, .mobile-wizard.ui-combobox-text:hover {
 	background-color: #eee;
 }
diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index e4c4a1837..b029641f4 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -255,6 +255,9 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		if (data && data.id)
 			sectionTitle.id = data.id;
 
+		if (data.enabled === 'false')
+			$(sectionTitle).addClass('disabled');
+
 		var leftDiv = L.DomUtil.create('div', 'ui-header-left', sectionTitle);
 		var titleClass = '';
 		console.debug('sectionTitle.id' + sectionTitle.id);
@@ -309,7 +312,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		if (!data.nosubmenu)
 		{
 			$(contentDiv).hide();
-			if (builder.wizard) {
+			if (builder.wizard && data.enabled !== 'false') {
 				$(sectionTitle).click(function(event, data) {
 					builder.wizard.goLevelDown(contentDiv, data);
 					if (contentNode.onshow)
commit d585877e8a5f4ee5bf48e41e9f66ae425468c04f
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 11 13:17:07 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:09:34 2020 +0200

    jsdialog: fix inifinite regenetate JSON loop
    
    Change-Id: I52667e115a0cf70f09f570dc6ea1ec0bcac49460

diff --git a/loleaflet/src/control/Control.MobileWizard.js b/loleaflet/src/control/Control.MobileWizard.js
index 214b38208..b6698f073 100644
--- a/loleaflet/src/control/Control.MobileWizard.js
+++ b/loleaflet/src/control/Control.MobileWizard.js
@@ -259,7 +259,8 @@ L.Control.MobileWizard = L.Control.extend({
 	},
 
 	_goToPath: function(path) {
-		if (this._tabs && path && path.length)
+		// when dialog has tabs, tab selection triggers the callback, causes infinite regenetate loop
+		if (this._tabs && path && path.length && !this.map.dialog.hasMobilePanelOpened())
 			this._selectTab(path[0]);
 
 		for (var index in path) {
commit 3f9d591bca10879c56258946a4ac87a12d724c61
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 11 13:01:26 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:09:34 2020 +0200

    jsdialog: don't forget dialog on sidebar events
    
    Change-Id: I74dc646ede106fce03c61faf953bf3c11a0744e1

diff --git a/loleaflet/src/control/Control.MobileWizard.js b/loleaflet/src/control/Control.MobileWizard.js
index f6b0d5fe5..214b38208 100644
--- a/loleaflet/src/control/Control.MobileWizard.js
+++ b/loleaflet/src/control/Control.MobileWizard.js
@@ -286,14 +286,6 @@ L.Control.MobileWizard = L.Control.extend({
 
 	_onMobileWizard: function(data) {
 		if (data) {
-
-			if (data.id && !isNaN(data.id)) {
-				// id is a number - remember window id for interaction
-				window.windowId = data.id;
-			} else {
-				window.windowId = undefined;
-			}
-
 			var isSidebar = (data.children && data.children.length >= 1 &&
 					 data.children[0].type == 'deck');
 
@@ -305,6 +297,11 @@ L.Control.MobileWizard = L.Control.extend({
 				return;
 			}
 
+			if (data.id && !isNaN(data.id) && !isSidebar) {
+				// id is a number - remember window id for interaction
+				window.windowId = data.id;
+			}
+
 			// Sometimes it happens that we get the same sidebar
 			// structure twice. This makes hard to test mobile wizard.
 			if (isSidebar && L.Browser.cypressTest) {
commit 8047a9e23d0864958752aa1970aaa79eb3cd3c3f
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Fri Mar 6 12:56:59 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:09:34 2020 +0200

    jsdialog: add style for disabled button
    
    Change-Id: I034470a988a79abaed8eddcb97b84a02a54dcf12

diff --git a/loleaflet/css/mobilewizard.css b/loleaflet/css/mobilewizard.css
index dc3cfacca..296cafe66 100644
--- a/loleaflet/css/mobilewizard.css
+++ b/loleaflet/css/mobilewizard.css
@@ -790,6 +790,9 @@ input[type=checkbox]#UseBandingColumnStyle, input[type=checkbox]#UseLastColumnSt
 	border: none;
 	background-color: #ebf2fb;
 }
+#mobile-wizard button:disabled{
+	background-color: silver;
+}
 #enablecontour + button {
 	float: right;
 	margin: 24px 0px;
commit d8f8ae7f42d981bd8ed89333cd0c84be9a5c4556
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Fri Mar 6 12:30:35 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: implemented multilineedit control
    
    Change-Id: I1cda88437357f80cafbdcdbee03832af806a55d6

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 0420ecaec..e4c4a1837 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -33,6 +33,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		this._controlHandlers['checkbox'] = this._checkboxControl;
 		this._controlHandlers['spinfield'] = this._spinfieldControl;
 		this._controlHandlers['edit'] = this._editControl;
+		this._controlHandlers['multilineedit'] = this._multiLineEditControl;
 		this._controlHandlers['pushbutton'] = this._pushbuttonControl;
 		this._controlHandlers['combobox'] = this._comboboxControl;
 		this._controlHandlers['comboboxentry'] = this._comboboxEntry;
@@ -1105,6 +1106,27 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		return false;
 	},
 
+	_multiLineEditControl: function(parentContainer, data, builder, callback) {
+		var edit = L.DomUtil.create('textarea', '', parentContainer);
+		edit.value = builder._cleanText(data.text);
+		edit.id = data.id;
+
+		if (data.enabled == 'false')
+			$(edit).attr('disabled', 'disabled');
+
+		edit.addEventListener('change', function() {
+			if (callback)
+				callback(this.value);
+			else
+				builder.callback('edit', 'change', edit, this.value, builder);
+		});
+
+		if (data.hidden)
+			$(edit).hide();
+
+		return false;
+	},
+
 	_pushbuttonControl: function(parentContainer, data, builder, customCallback) {
 		var pushbutton = L.DomUtil.create('button', '', parentContainer);
 		pushbutton.innerHTML = builder._cleanText(data.text);
commit 2cb2466f7c7cdb026d1a234044737ac6baac20f3
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Fri Mar 6 10:57:09 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: custom change event for combobox
    
    Change-Id: Ic48ca0df400fc182a765974d143786afe9f19bd9

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 8d0db5e06..0420ecaec 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -1080,7 +1080,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		return false;
 	},
 
-	_editControl: function(parentContainer, data, builder) {
+	_editControl: function(parentContainer, data, builder, callback) {
 		var edit = L.DomUtil.create('input', '', parentContainer);
 		edit.value = builder._cleanText(data.text);
 		edit.id = data.id;
@@ -1089,7 +1089,10 @@ L.Control.JSDialogBuilder = L.Control.extend({
 			$(edit).attr('disabled', 'disabled');
 
 		edit.addEventListener('change', function() {
-			builder.callback('edit', 'change', edit, this.value, builder);
+			if (callback)
+				callback(this.value);
+			else
+				builder.callback('edit', 'change', edit, this.value, builder);
 		});
 
 		edit.addEventListener('click', function(e) {
@@ -1138,7 +1141,11 @@ L.Control.JSDialogBuilder = L.Control.extend({
 			sectionTitle.id = data.id;
 
 		var leftDiv = L.DomUtil.create('div', 'ui-header-left', sectionTitle);
-		builder._editControl(leftDiv, data, builder);
+
+		var editCallback = function(value) {
+			builder.callback('combobox', 'change', data, value, builder);
+		};
+		builder._editControl(leftDiv, data, builder, editCallback);
 
 		var rightDiv = L.DomUtil.create('div', 'ui-header-right', sectionTitle);
 
commit f1cdc73da5c2693a6ae914d0e9d729d8e21cb993
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Mar 5 14:40:54 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: send control type with event
    
    Change-Id: I6cd6f1d26b5c78715f9e0adc992a1869e0f19a97

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 379e010bb..8d0db5e06 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -109,8 +109,11 @@ L.Control.JSDialogBuilder = L.Control.extend({
 			data = typeof data === 'string' ? data.replace('"', '\\"') : data;
 			var windowId = window.windowId !== undefined ? window.windowId :
 								(window.sidebarId !== undefined ? window.sidebarId : -1);
-			var message = 'dialogevent ' + windowId +
-			    ' {\"id\":\"' + object.id + '\", \"cmd\": \"' + eventType + '\", \"data\":\"' + data + '\"}';
+			var message = 'dialogevent ' + windowId
+			    + ' {\"id\":\"' + object.id
+				+ '\", \"cmd\": \"' + eventType
+				+ '\", \"data\": \"' + data
+				+ '\", \"type\": \"' + objectType + '\"}';
 			builder.map._socket.sendMessage(message);
 		}
 	},
commit aedccaada5e4668b7987c6689ebcc93d69d8be20
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Mar 5 14:40:26 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: close mobile wizard when dialog is closed
    
    Change-Id: I570317fc6019b22a6ee5ec36507edbb450938cdf

diff --git a/loleaflet/src/control/Control.LokDialog.js b/loleaflet/src/control/Control.LokDialog.js
index 84267ab01..498221fb7 100644
--- a/loleaflet/src/control/Control.LokDialog.js
+++ b/loleaflet/src/control/Control.LokDialog.js
@@ -296,7 +296,6 @@ L.Control.LokDialog = L.Control.extend({
 				} else {
 					// In mobile we get jsdialog messages.
 					window.sidebarId = e.id;
-					window.windowId = undefined;
 				}
 			} else if (e.winType === 'child') {
 				var parentId = parseInt(e.parentId);
@@ -319,8 +318,14 @@ L.Control.LokDialog = L.Control.extend({
 		}
 
 		// All other callbacks doen't make sense without an active dialog.
-		if (!(this._isOpen(e.id) || this._getParentId(e.id)))
+		if (!(this._isOpen(e.id) || this._getParentId(e.id))) {
+			if (e.action == 'close' && window.windowId == e.id) {
+				window.windowId = undefined;
+				this._map.fire('closemobilewizard');
+			}
+
 			return;
+		}
 
 		// We don't want dialogs on smartphones
 		if (window.mode.isMobile())
commit 15e357aa5a24e8fae3dad58aa63c041cd44afa59
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Mar 4 15:50:29 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: tabcontrol widget
    
    Change-Id: Ibe72a382e767869f94db4f8b475dfe2169fcc702

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index d59cfe1c1..379e010bb 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -44,6 +44,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		this._controlHandlers['frame'] = this._frameHandler;
 		this._controlHandlers['panel'] = this._panelHandler;
 		this._controlHandlers['calcfuncpanel'] = this._calcFuncListPanelHandler;
+		this._controlHandlers['tabcontrol'] = this._tabsControlHandler;
 		this._controlHandlers['paneltabs'] = this._panelTabsHandler;
 		this._controlHandlers['container'] = this._containerHandler;
 		this._controlHandlers['window'] = this._containerHandler;
@@ -482,6 +483,56 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		};
 	},
 
+	_tabsControlHandler: function(parentContainer, data, builder) {
+		if (data.tabs) {
+			var tabsContainer = L.DomUtil.create('div', 'ui-tabs mobile-wizard ui-widget');
+			tabsContainer.id = data.id;
+			var contentsContainer = L.DomUtil.create('div', 'ui-tabs-content mobile-wizard ui-widget', parentContainer);
+
+			var tabs = [];
+			var contentDivs = [];
+			var labels = [];
+			for (var tabIdx = 0; tabIdx < data.tabs.length; tabIdx++) {
+				var item = data.tabs[tabIdx];
+
+				var title = builder._cleanText(item.text);
+
+				var tab = L.DomUtil.create('div', 'ui-tab mobile-wizard', tabsContainer);
+				tab.id = title;
+				tabs[tabIdx] = tab;
+
+				var label = L.DomUtil.create('span', 'ui-tab-content mobile-wizard unolabel', tab);
+				label.innerHTML = title;
+				labels[tabIdx] = title;
+
+				var contentDiv = L.DomUtil.create('div', 'ui-content level-' + builder._currentDepth + ' mobile-wizard', contentsContainer);
+				contentDiv.title = title;
+
+				$(contentDiv).hide();
+				contentDivs[tabIdx] = contentDiv;
+			}
+
+			if (builder.wizard) {
+				builder.wizard.setTabs(tabsContainer);
+
+				for (var t = 0; t < tabs.length; t++) {
+					// to get capture of 't' right has to be a sub fn.
+					var fn = function(id) {
+						return function() {
+							builder._createTabClick(builder, id, tabs, contentDivs, labels)();
+							builder.callback('tabcontrol', 'selecttab', tabsContainer, id, builder);
+						};
+					};
+					$(tabs[t]).click(fn(t));
+				}
+			} else {
+				console.debug('Builder used outside of mobile wizard: please implement the click handler');
+			}
+		}
+
+		return true;
+	},
+
 	_panelTabsHandler: function(parentContainer, data, builder) {
 		var tabsContainer = L.DomUtil.create('div', 'ui-tabs mobile-wizard ui-widget');
 		var contentsContainer = L.DomUtil.create('div', 'ui-tabs-content mobile-wizard ui-widget', parentContainer);
commit 7baff11323957d8b2d982bd7f7a780722e6fafc9
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Mon Mar 2 15:04:28 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: close dialog when closed mobile wizard
    
    Change-Id: I5ba1eab7a32eef19dd156c56068e725a14223f48

diff --git a/loleaflet/src/control/Control.MobileWizard.js b/loleaflet/src/control/Control.MobileWizard.js
index 8991b9cfa..f6b0d5fe5 100644
--- a/loleaflet/src/control/Control.MobileWizard.js
+++ b/loleaflet/src/control/Control.MobileWizard.js
@@ -87,6 +87,12 @@ L.Control.MobileWizard = L.Control.extend({
 	},
 
 	_hideWizard: function() {
+		// dialog
+		if (this.map.dialog.hasMobilePanelOpened()) {
+			this.map.dialog._onDialogClose(window.windowId, true);
+			window.windowId = undefined;
+		}
+
 		$('#mobile-wizard').hide();
 		$('#mobile-wizard-content').empty();
 		if (this.map._permission === 'edit') {
commit 7f46759bcfa5fc9f0cd0e948f5eea71085d4d868
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Mon Mar 2 12:44:40 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: implement full combobox
    
    Change-Id: I02432c39ffb78906466efe407118a771de7001f1

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 61545e66c..d59cfe1c1 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -1038,6 +1038,10 @@ L.Control.JSDialogBuilder = L.Control.extend({
 			builder.callback('edit', 'change', edit, this.value, builder);
 		});
 
+		edit.addEventListener('click', function(e) {
+			e.stopPropagation();
+		});
+
 		if (data.hidden)
 			$(edit).hide();
 
@@ -1073,11 +1077,62 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		}
 	},
 
-	_comboboxControl: function(parentContainer, data, builder) {
-		if (data.entries)
-			builder._listboxControl(parentContainer, data, builder);
+	_explorableEditControl: function(parentContainer, data, builder) {
+		var sectionTitle = L.DomUtil.create('div', 'ui-header level-' + builder._currentDepth + ' mobile-wizard ui-widget', parentContainer);
+		$(sectionTitle).css('justify-content', 'space-between');
+		if (data && data.id)
+			sectionTitle.id = data.id;
+
+		var leftDiv = L.DomUtil.create('div', 'ui-header-left', sectionTitle);
+		builder._editControl(leftDiv, data, builder);
+
+		var rightDiv = L.DomUtil.create('div', 'ui-header-right', sectionTitle);
+
+		var arrowSpan = L.DomUtil.create('span', 'sub-menu-arrow', rightDiv);
+		arrowSpan.innerHTML = '>';
+
+		var contentDiv = L.DomUtil.create('div', 'ui-content level-' + builder._currentDepth + ' mobile-wizard', parentContainer);
+		contentDiv.title = data.text;
+
+		var entries = [];
+		if (data.entries) {
+			for (var index in data.entries) {
+				var style = 'ui-combobox-text';
+				if ((data.selectedEntries && index == data.selectedEntries[0])
+					|| data.entries[index] == data.text) {
+					style += ' selected';
+				}
+
+				var entry = { type: 'comboboxentry', text: data.entries[index], pos: index, parent: data, style: style };
+				entries.push(entry);
+			}
+		}
+
+		var contentNode = {type: 'container', children: entries};
+
+		builder._currentDepth++;
+		builder.build(contentDiv, [contentNode]);
+		builder._currentDepth--;
+
+		if (!data.nosubmenu)
+		{
+			$(contentDiv).hide();
+			if (builder.wizard) {
+				$(sectionTitle).click(function(event, data) {
+					builder.wizard.goLevelDown(contentDiv, data);
+					if (contentNode.onshow)
+						contentNode.onshow();
+				});
+			} else {
+				console.debug('Builder used outside of mobile wizard: please implement the click handler');
+			}
+		}
 		else
-			builder._editControl(parentContainer, data, builder);
+			$(sectionTitle).hide();
+	},
+
+	_comboboxControl: function(parentContainer, data, builder) {
+		builder._explorableEditControl(parentContainer, data, builder);
 	},
 
 	_listboxControl: function(parentContainer, data, builder) {
commit 0ffa2a1973098f6a4de7ae0bb5afc319470dca65
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Fri Feb 28 15:08:56 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: when combobox is empty show edit
    
    Change-Id: I84572335313654f22d5d899e003aaa82a002b128

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 0a2e64188..61545e66c 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -36,7 +36,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		this._controlHandlers['pushbutton'] = this._pushbuttonControl;
 		this._controlHandlers['combobox'] = this._comboboxControl;
 		this._controlHandlers['comboboxentry'] = this._comboboxEntry;
-		this._controlHandlers['listbox'] = this._comboboxControl;
+		this._controlHandlers['listbox'] = this._listboxControl;
 		this._controlHandlers['valueset'] = this._valuesetControl;
 		this._controlHandlers['fixedtext'] = this._fixedtextControl;
 		this._controlHandlers['htmlcontrol'] = this._htmlControl;
@@ -1074,6 +1074,13 @@ L.Control.JSDialogBuilder = L.Control.extend({
 	},
 
 	_comboboxControl: function(parentContainer, data, builder) {
+		if (data.entries)
+			builder._listboxControl(parentContainer, data, builder);
+		else
+			builder._editControl(parentContainer, data, builder);
+	},
+
+	_listboxControl: function(parentContainer, data, builder) {
 		// TODO: event listener in the next level...
 
 		if (!data.entries || data.entries.length === 0)
commit c41854a334a233a1d93b182f6b2ede6b3fffa0fa
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Tue Feb 25 10:50:43 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:08:17 2020 +0200

    jsdialog: build frame also without title
    
    Change-Id: Id5f94eb90756419305ab5d593791663ecb5eb41b

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index bfe7b49d5..0a2e64188 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -432,10 +432,13 @@ L.Control.JSDialogBuilder = L.Control.extend({
 	},
 
 	_frameHandler: function(parentContainer, data, builder) {
-		data.text = builder._cleanText(data.children[0].text);
-		var contentNode = data.children[1];
-
-		builder._explorableEntry(parentContainer, data, contentNode, builder);
+		if (data.children.length > 1) {
+			data.text = builder._cleanText(data.children[0].text);
+			var contentNode = data.children[1];
+			builder._explorableEntry(parentContainer, data, contentNode, builder);
+		} else {
+			return true;
+		}
 
 		return false;
 	},
@@ -1690,6 +1693,9 @@ L.Control.JSDialogBuilder = L.Control.extend({
 	build: function(parent, data) {
 		this._amendJSDialogData(data);
 		for (var childIndex in data) {
+			if (!data[childIndex])
+				continue;
+
 			var childData = data[childIndex];
 			if (!childData)
 				continue;
commit 5ecdafd31c104dba2d1506fd1324198b992fc6a1
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Fri Feb 21 11:37:22 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:07:40 2020 +0200

    jsdialog: Don't show dialog window on mobile devices
    
    Change-Id: I9828c1aafb7876160a5122a41109dc7165de481d

diff --git a/loleaflet/src/control/Control.LokDialog.js b/loleaflet/src/control/Control.LokDialog.js
index 13d88bf83..84267ab01 100644
--- a/loleaflet/src/control/Control.LokDialog.js
+++ b/loleaflet/src/control/Control.LokDialog.js
@@ -59,6 +59,10 @@ L.Control.LokDialog = L.Control.extend({
 
 	dialogIdPrefix: 'lokdialog-',
 
+	hasMobilePanelOpened: function() {
+		return window.windowId !== undefined;
+	},
+
 	onPan: function (ev) {
 		if (!draggedObject)
 			return;
@@ -279,10 +283,11 @@ L.Control.LokDialog = L.Control.extend({
 			e.title = e.title.replace('Collabora Office', brandProductName);
 		}
 
-		if (e.action === 'created') {
+		if (e.action === 'created' && !window.mode.isMobile()) {
 			if (e.winType === 'dialog') {
 				// When left/top are invalid, the dialog shows in the center.
-				this._launchDialog(e.id, left, top, width, height, e.title);
+				if (!this.hasMobilePanelOpened())
+					this._launchDialog(e.id, left, top, width, height, e.title);
 			} else if (e.winType === 'calc-input-win') {
 				this._launchCalcInputBar(e.id, width, height);
 			} else if (e.winType === 'deck') {
@@ -317,7 +322,11 @@ L.Control.LokDialog = L.Control.extend({
 		if (!(this._isOpen(e.id) || this._getParentId(e.id)))
 			return;
 
-		if (e.action === 'invalidate') {
+		// We don't want dialogs on smartphones
+		if (window.mode.isMobile())
+			return;
+
+		if (e.action === 'invalidate' && !this.hasMobilePanelOpened()) {
 			this.wasInvalidated = true;
 			var parent = this._getParentId(e.id);
 			var rectangle = e.rectangle;
@@ -339,7 +348,7 @@ L.Control.LokDialog = L.Control.extend({
 				rectangle = this._createRectStr(e.id);
 			}
 			this._sendPaintWindow(e.id, rectangle);
-		} else if (e.action === 'size_changed') {
+		} else if (e.action === 'size_changed' && !this.hasMobilePanelOpened()) {
 			// FIXME: we don't really have to destroy and launch the dialog again but do it for
 			// now because the size sent to us previously in 'created' cb is not correct
 			$('#' + strId).remove();
@@ -1208,6 +1217,9 @@ L.Control.LokDialog = L.Control.extend({
 				this._onDialogClose(dialogId, true);
 			}
 		}
+		if (window.windowId !== undefined) {
+			this._onDialogClose(window.windowId, true);
+		}
 	},
 
 	onCloseCurrentPopUp: function() {
commit ea3b3e60f8db5cd982a7c796d2b3a905ecdf54a8
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Fri Feb 21 09:54:33 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Fri Apr 3 08:07:40 2020 +0200

    jsdialog: use correct id also for dialogs in mobilewizard
    
    Change-Id: I585c5b92192655684eedd62d88817a92fc1fc0a8

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 27c8f35d7..bfe7b49d5 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -106,7 +106,9 @@ L.Control.JSDialogBuilder = L.Control.extend({
 			builder.map.sendUnoCommand(data);
 		} else if (object) {
 			data = typeof data === 'string' ? data.replace('"', '\\"') : data;
-			var message = 'dialogevent ' + (window.sidebarId !== undefined ? window.sidebarId : -1) +
+			var windowId = window.windowId !== undefined ? window.windowId :
+								(window.sidebarId !== undefined ? window.sidebarId : -1);
+			var message = 'dialogevent ' + windowId +
 			    ' {\"id\":\"' + object.id + '\", \"cmd\": \"' + eventType + '\", \"data\":\"' + data + '\"}';
 			builder.map._socket.sendMessage(message);
 		}
diff --git a/loleaflet/src/control/Control.LokDialog.js b/loleaflet/src/control/Control.LokDialog.js
index 675526299..13d88bf83 100644
--- a/loleaflet/src/control/Control.LokDialog.js
+++ b/loleaflet/src/control/Control.LokDialog.js
@@ -291,6 +291,7 @@ L.Control.LokDialog = L.Control.extend({
 				} else {
 					// In mobile we get jsdialog messages.
 					window.sidebarId = e.id;
+					window.windowId = undefined;
 				}
 			} else if (e.winType === 'child') {
 				var parentId = parseInt(e.parentId);
diff --git a/loleaflet/src/control/Control.MobileWizard.js b/loleaflet/src/control/Control.MobileWizard.js
index ea0ad84b6..8991b9cfa 100644
--- a/loleaflet/src/control/Control.MobileWizard.js
+++ b/loleaflet/src/control/Control.MobileWizard.js
@@ -280,6 +280,14 @@ L.Control.MobileWizard = L.Control.extend({
 
 	_onMobileWizard: function(data) {
 		if (data) {
+
+			if (data.id && !isNaN(data.id)) {
+				// id is a number - remember window id for interaction
+				window.windowId = data.id;
+			} else {
+				window.windowId = undefined;
+			}
+
 			var isSidebar = (data.children && data.children.length >= 1 &&
 					 data.children[0].type == 'deck');
 
commit 4bdd0497ed8e082db577062a988be2807f00e25f
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Thu Apr 2 12:11:19 2020 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Apr 2 17:13:25 2020 +0200

    cypress: mobile: avoid animations in mobile wizard.
    
    Cypress sometimes fails with 'DOM element is detached'
    failure because of the animation in the mobile wizard.
    Disable animation instead of waiting for 100 ms.
    I tried to override $.fn.show() function, but it's
    actually overriden by JQuery.ui code.
    
    Change-Id: I0e8e937a501a99b1106d7a450088760f67102bc2
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91569
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>

diff --git a/cypress_test/integration_tests/mobile/calc/apply_font_spec.js b/cypress_test/integration_tests/mobile/calc/apply_font_spec.js
index c829890da..c54cbcfe3 100644
--- a/cypress_test/integration_tests/mobile/calc/apply_font_spec.js
+++ b/cypress_test/integration_tests/mobile/calc/apply_font_spec.js
@@ -26,8 +26,7 @@ describe('Apply font changes.', function() {
 			.click();
 
 		cy.get('#Bold')
-			.should('be.visible')
-			.wait(100);
+			.should('be.visible');
 	});
 
 	afterEach(function() {
diff --git a/cypress_test/integration_tests/mobile/calc/number_format_spec.js b/cypress_test/integration_tests/mobile/calc/number_format_spec.js
index 942de9de0..03fef04bb 100644
--- a/cypress_test/integration_tests/mobile/calc/number_format_spec.js
+++ b/cypress_test/integration_tests/mobile/calc/number_format_spec.js
@@ -26,8 +26,7 @@ describe('Apply number formatting.', function() {
 			.click();
 
 		cy.get('#category')
-			.should('be.visible')
-			.wait(100);
+			.should('be.visible');
 	});
 
 	afterEach(function() {
@@ -225,8 +224,7 @@ describe('Apply number formatting.', function() {
 			.click();
 
 		cy.get('#NumberFormatDecimal')
-			.should('be.visible')
-			.wait(100);
+			.should('be.visible');
 
 		// Change to number formatting
 		cy.get('#NumberFormatDecimal')
diff --git a/cypress_test/integration_tests/mobile/writer/apply_font_spec.js b/cypress_test/integration_tests/mobile/writer/apply_font_spec.js
index 08e51940c..1f0ba1d2a 100644
--- a/cypress_test/integration_tests/mobile/writer/apply_font_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/apply_font_spec.js
@@ -36,17 +36,9 @@ describe('Apply font changes.', function() {
 		cy.get('#applystyle')
 			.click();
 
-		cy.wait(200);
-
 		cy.get('#mobile-wizard-back')
 			.should('be.visible');
 
-		cy.get('.mobile-wizard.ui-combobox-text')
-			.contains(styleName)
-			.scrollIntoView();
-
-		cy.wait(200);
-
 		cy.get('.mobile-wizard.ui-combobox-text')
 			.contains(styleName)
 			.click();
diff --git a/cypress_test/integration_tests/mobile/writer/apply_paragraph_properties_spec.js b/cypress_test/integration_tests/mobile/writer/apply_paragraph_properties_spec.js
index 7db827bbf..13da19d7a 100644
--- a/cypress_test/integration_tests/mobile/writer/apply_paragraph_properties_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/apply_paragraph_properties_spec.js
@@ -23,8 +23,7 @@ describe('Apply paragraph properties.', function() {
 			.click();
 
 		cy.get('#Paragraph')
-			.should('have.class', 'selected')
-			.wait(100);
+			.should('have.class', 'selected');
 	});
 
 	afterEach(function() {
diff --git a/cypress_test/integration_tests/mobile/writer/insert_field_spec.js b/cypress_test/integration_tests/mobile/writer/insert_field_spec.js
index baba5e1ce..d17a33dac 100644
--- a/cypress_test/integration_tests/mobile/writer/insert_field_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/insert_field_spec.js
@@ -22,8 +22,7 @@ describe('Insert fields via insertion wizard.', function() {
 			.click();
 
 		cy.get('.ui-content.level-0.mobile-wizard')
-			.should('be.visible')
-			.wait(100);
+			.should('be.visible');
 	});
 
 	afterEach(function() {
diff --git a/cypress_test/integration_tests/mobile/writer/insert_formatting_mark_spec.js b/cypress_test/integration_tests/mobile/writer/insert_formatting_mark_spec.js
index 85733799f..2c1c35ed8 100644
--- a/cypress_test/integration_tests/mobile/writer/insert_formatting_mark_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/insert_formatting_mark_spec.js
@@ -22,8 +22,7 @@ describe('Insert formatting mark via insertion wizard.', function() {
 			.click();
 
 		cy.get('.ui-content.level-0.mobile-wizard')
-			.should('be.visible')
-			.wait(100);
+			.should('be.visible');
 	});
 
 	afterEach(function() {
diff --git a/cypress_test/integration_tests/mobile/writer/shape_properties_spec.js b/cypress_test/integration_tests/mobile/writer/shape_properties_spec.js
index a6141211d..12a07f534 100644
--- a/cypress_test/integration_tests/mobile/writer/shape_properties_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/shape_properties_spec.js
@@ -49,14 +49,8 @@ describe('Change shape properties via mobile wizard.', function() {
 		cy.get('#mobile-wizard')
 			.should('not.be.visible');
 
-		cy.get('#tb_actionbar_item_mobile_wizard')
-			.click();
-		cy.get('#mobile-wizard')
-			.should('be.visible');
-
 		// Change width
-		cy.get('#PosSizePropertyPanel')
-			.click();
+		openPosSizePanel();
 
 		cy.get('#selectwidth .plus')
 			.should('be.visible')
@@ -93,8 +87,7 @@ describe('Change shape properties via mobile wizard.', function() {
 			.click();
 
 		cy.get('.ui-content.level-0.mobile-wizard')
-			.should('be.visible')
-			.wait(100);
+			.should('be.visible');
 	}
 
 	it('Check default shape geometry.', function() {
diff --git a/cypress_test/integration_tests/mobile/writer/table_properties_spec.js b/cypress_test/integration_tests/mobile/writer/table_properties_spec.js
index d199177e6..25ea31e0c 100644
--- a/cypress_test/integration_tests/mobile/writer/table_properties_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/table_properties_spec.js
@@ -29,8 +29,7 @@ describe('Change table properties / layout via mobile wizard.', function() {
 			.click();
 
 		cy.get('.ui-content.level-0.mobile-wizard')
-			.should('be.visible')
-			.wait(100);
+			.should('be.visible');
 	}
 
 	function moveCursorToFirstCell() {
diff --git a/cypress_test/integration_tests/mobile/writer/writer_helper.js b/cypress_test/integration_tests/mobile/writer/writer_helper.js
index 57770fb87..74c5ece92 100644
--- a/cypress_test/integration_tests/mobile/writer/writer_helper.js
+++ b/cypress_test/integration_tests/mobile/writer/writer_helper.js
@@ -90,8 +90,7 @@ function selectAllMobile() {
 		.click();
 
 	cy.get('.ui-header.level-1 .menu-entry-with-icon')
-		.should('be.visible')
-		.wait(100);
+		.should('be.visible');
 
 	// Do the selection
 	cy.get('.ui-header.level-1 .menu-entry-with-icon')
diff --git a/loleaflet/src/control/Control.MobileWizard.js b/loleaflet/src/control/Control.MobileWizard.js
index 2edb21c75..ea0ad84b6 100644
--- a/loleaflet/src/control/Control.MobileWizard.js
+++ b/loleaflet/src/control/Control.MobileWizard.js
@@ -148,6 +148,9 @@ L.Control.MobileWizard = L.Control.extend({
 
 	goLevelDown: function(contentToShow, options) {
 		var animate = (options && options.animate != undefined) ? options.animate : true;
+		// Animation fools cypress tests.
+		if (L.Browser.cypressTest)
+			animate = false;
 
 		if (!this._isTabMode || this._currentDepth > 0)
 			this.backButton.removeClass('close-button');
commit 04b0a7b651bc2d7f98b843b08c402411641513a3
Author:     Ashod Nakashian <ashod.nakashian at collabora.co.uk>
AuthorDate: Thu Apr 2 08:09:28 2020 -0400
Commit:     Ashod Nakashian <ashnakash at gmail.com>
CommitDate: Thu Apr 2 17:09:28 2020 +0200

    leaflet: maintain focus when searching
    
    When the focus is in the search box, we shouldn't
    lose it, or hide the keyboard.
    
    Change-Id: I05c4c3e384d840b2919106af1063978b6fe7fbfe
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91580
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 225bceddb..d5aa0c18d 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -2184,7 +2184,8 @@ L.TileLayer = L.GridLayer.extend({
 			}
 		} else {
 			this._map._textInput.hideCursor();
-			if (this._map.editorHasFocus()) // Allow input if a dialog has the focus.
+			// Maintain input if a dialog or search-box has the focus.
+			if (this._map.editorHasFocus() && !this._map.isSearching())
 				this._map.focus(false);
 		}
 	},
commit f96126fb69ff8feb3b5de6c55310f9926b89bf44
Author:     Ashod Nakashian <ashod.nakashian at collabora.co.uk>
AuthorDate: Thu Apr 2 10:05:15 2020 -0400
Commit:     Ashod Nakashian <ashnakash at gmail.com>
CommitDate: Thu Apr 2 17:08:22 2020 +0200

    leaflet: support pasting in the search box
    
    When pasting into the document a special handler
    is used to manage the transfer of data. For the search
    box we need to let the default handler do the right thing
    and so we check that we aren't searching before we override
    the paste handler logic, which explicitly pastes into the doc.
    
    Change-Id: I570168d1aaf70c2a78403644e006ba9625ec68db
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91581
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loleaflet/src/map/Clipboard.js b/loleaflet/src/map/Clipboard.js
index 218c3dfd0..df07abf4d 100644
--- a/loleaflet/src/map/Clipboard.js
+++ b/loleaflet/src/map/Clipboard.js
@@ -657,6 +657,10 @@ L.Clipboard = L.Class.extend({
 		if (isAnyVexDialogActive() && !this._map.hasFocus())
 			return;
 
+		// If the focus is in the search box, paste there.
+		if (this._map.isSearching())
+			return;
+
 		if (this._map._activeDialog)
 			ev.usePasteKeyEvent = true;
 
commit a0c1bc05ecefc3606d35244a3faa42348752a216
Author:     Ashod Nakashian <ashod.nakashian at collabora.co.uk>
AuthorDate: Thu Mar 26 07:32:39 2020 -0400
Commit:     Ashod Nakashian <ashnakash at gmail.com>
CommitDate: Thu Apr 2 17:06:39 2020 +0200

    leaflet: limit special case to only the Formula-Bar
    
    Change-Id: If9c5bbe7f985a7bdac2d12c5136e0e93a1d41354
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91536
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index add537854..225bceddb 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -2017,7 +2017,7 @@ L.TileLayer = L.GridLayer.extend({
 
 	_postMouseEvent: function(type, x, y, count, buttons, modifier) {
 
-		if (this.isCalc() && !this._map.editorHasFocus()) {
+		if (this._map.calcInputBarHasFocus()) {
 			// When the Formula-bar has the focus, sending
 			// mouse move with the document coordinates
 			// hides the cursor (lost focus?). This is clearly
commit c46168bb779ac8fd043ff9b219c9fd1a17460967
Author:     Jan Holesovsky <kendy at collabora.com>
AuthorDate: Thu Apr 2 15:48:34 2020 +0200
Commit:     Jan Holesovsky <kendy at collabora.com>
CommitDate: Thu Apr 2 16:38:20 2020 +0200

    mobile: Let's remove the smaller padding for really small phones.
    
    Apparently there were more stuff added mobilewizard.css and nobody cared
    to update these, so I suspect better not to have this, because nobody
    will ever test it again anyway.
    
    Change-Id: I591fe2b52621cde4f1d7d1f087555f98c49731f2
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91575
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/loleaflet/css/toolbar.css b/loleaflet/css/toolbar.css
index 408023067..c01e913f6 100644
--- a/loleaflet/css/toolbar.css
+++ b/loleaflet/css/toolbar.css
@@ -1,9 +1,4 @@
- at media (max-width: 407px), (max-device-height: 407px) {
-	#buttonbefore, #buttonafter, #buttonoptimal, #buttonparallel, #buttonnone, #buttonthrough{
-		padding: 18px 28px 18px 28px !important;
-	}
-}
-	#toolbar-up.w2ui-toolbar {
+#toolbar-up.w2ui-toolbar {
 		left: 0;
 		right: 0;
 		padding-left: 9px;
commit 53a668b179f99482210015cc0228d2297a3be447
Author:     Jan Holesovsky <kendy at collabora.com>
AuthorDate: Thu Apr 2 15:39:40 2020 +0200
Commit:     Jan Holesovsky <kendy at collabora.com>
CommitDate: Thu Apr 2 16:37:59 2020 +0200

    mobile: Drag and drop target is smaller on mobile.
    
    Change-Id: Ic17eac122578bbefed75e1b8a9569d3ae622cbc4
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91574
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/loleaflet/css/device-mobile.css b/loleaflet/css/device-mobile.css
index 685d16454..363818deb 100644
--- a/loleaflet/css/device-mobile.css
+++ b/loleaflet/css/device-mobile.css
@@ -684,3 +684,8 @@ td[id^=tb_spreadsheet-toolbar_item]:focus table.w2ui-button div.w2ui-icon, td[id
 	max-width: 66px;
 	display: block;
 }
+
+/* Highlight where a slide can be dropped when reordering by drag-and-drop. */
+.preview-img-dropsite {
+    border-bottom: 3px solid #b6b6b6;
+}
diff --git a/loleaflet/css/partsPreviewControl.css b/loleaflet/css/partsPreviewControl.css
index 4ea0d3c7e..0d07b3d0c 100644
--- a/loleaflet/css/partsPreviewControl.css
+++ b/loleaflet/css/partsPreviewControl.css
@@ -47,12 +47,5 @@
 
 /* Highlight where a slide can be dropped when reordering by drag-and-drop. */
 .preview-img-dropsite {
-    border-bottom: 3px solid #b6b6b6;
-}
-
-/* Make it larger on larger displays */
- at media (min-width: 768px),(min-device-height: 768px) {
-    .preview-img-dropsite {
-	border-bottom: 20px solid #b6b6b6;
-    }
+    border-bottom: 20px solid #b6b6b6;
 }
commit 7cd2beb8660498d1dedd37b23057c4e4b0bc55a4
Author:     Jan Holesovsky <kendy at collabora.com>
AuthorDate: Thu Apr 2 14:14:19 2020 +0200
Commit:     Jan Holesovsky <kendy at collabora.com>
CommitDate: Thu Apr 2 16:37:45 2020 +0200

    mobile: Handle the portrait / landscape for slide sorter in JS too.
    
    Change-Id: I214501fac516f4d581d3c1e8a95650a87db1a4aa
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91570
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/loleaflet/css/device-mobile.css b/loleaflet/css/device-mobile.css
index 5a40ba1b2..685d16454 100644
--- a/loleaflet/css/device-mobile.css
+++ b/loleaflet/css/device-mobile.css
@@ -624,6 +624,24 @@ td[id^=tb_spreadsheet-toolbar_item]:focus table.w2ui-button div.w2ui-icon, td[id
 	bottom: 33px;
 }
 
+#slide-sorter.portrait {
+	max-height: 60px;
+}
+
+.preview-img-portrait {
+	min-width: 37px;
+	max-width: 60px;
+	max-height: 45px;
+	margin: 0px;
+}
+
+.preview-frame-portrait {
+	max-height: 60px;
+	max-width: initial;
+	display: table-cell;
+	padding-right: 1em;
+}
+
 /* Slidesorter in landscape mode */
 #presentation-controls-wrapper.landscape {
 	top: 41px;
@@ -650,3 +668,19 @@ td[id^=tb_spreadsheet-toolbar_item]:focus table.w2ui-button div.w2ui-icon, td[id
 #document-container.landscape.parts-preview-document.keyboard {
 	left: 0px !important;
 }
+
+#slide-sorter.landscape {
+	max-width: 120px;
+}
+
+.preview-img-landscape {
+	min-width: 40px;
+	max-width: 40px;
+	margin-left: 8px;
+}
+
+.preview-frame-landscape {
+	max-height: initial;
+	max-width: 66px;
+	display: block;
+}
diff --git a/loleaflet/css/partsPreviewControl.css b/loleaflet/css/partsPreviewControl.css
index 618d2e0a7..4ea0d3c7e 100644
--- a/loleaflet/css/partsPreviewControl.css
+++ b/loleaflet/css/partsPreviewControl.css
@@ -33,44 +33,6 @@
 	margin-left: 20px;
 	}
 
- at media (max-width: 767px) and (orientation: portrait), (max-device-width: 767px) and (orientation: portrait) {
-	#slide-sorter {
-		max-height: 60px;
-	}
-
-	.preview-img {
-		min-width: 37px;
-		max-width: 60px;
-		max-height: 45px;
-		margin: 0px;
-	}
-
-	.preview-frame {
-		max-height: 60px;
-		max-width: initial;
-		display: table-cell;
-		padding-right: 1em;
-	}
-}
-
- at media (max-height: 767px) and (orientation: landscape), (max-device-height: 767px) and (orientation: landscape) {
-	#slide-sorter {
-		max-width: 120px;
-	}
-
-	.preview-img {
-		min-width: 40px;
-		max-width: 40px;
-		margin-left: 8px;
-	}
-
-	.preview-frame {
-		max-height: initial;
-		max-width: 66px;
-		display: block;
-	}
-}
-
 /* The current part the user is on. */
 .preview-img-currentpart {
     border-color: #000000;
diff --git a/loleaflet/src/control/Control.PartsPreview.js b/loleaflet/src/control/Control.PartsPreview.js
index 4d9776566..22c81be19 100644
--- a/loleaflet/src/control/Control.PartsPreview.js
+++ b/loleaflet/src/control/Control.PartsPreview.js
@@ -150,6 +150,27 @@ L.Control.PartsPreview = L.Control.extend({
 						L.DomUtil.addClass(this._previewTiles[j], 'preview-img-selectedpart');
 				}
 			}
+
+			// update portrait / landscape
+			var removePreviewImg = 'preview-img-portrait';
+			var addPreviewImg = 'preview-img-landscape';
+			var removePreviewFrame = 'preview-frame-portrait';
+			var addPreviewFrame = 'preview-frame-landscape';
+			if (L.DomUtil.isPortrait()) {
+				removePreviewImg = 'preview-img-landscape';
+				addPreviewImg = 'preview-img-portrait';
+				removePreviewFrame = 'preview-frame-landscape';
+				addPreviewFrame = 'preview-frame-portrait';
+			}
+
+			for (i = 0; i < parts; i++) {
+				L.DomUtil.removeClass(this._previewTiles[i], removePreviewImg);
+				L.DomUtil.addClass(this._previewTiles[i], addPreviewImg);
+			}
+
+			var previewFrame = $(this._partsPreviewCont).find('.preview-frame');
+			previewFrame.removeClass(removePreviewFrame);
+			previewFrame.addClass(addPreviewFrame);
 		}
 	},
 
diff --git a/loleaflet/src/layer/tile/ImpressTileLayer.js b/loleaflet/src/layer/tile/ImpressTileLayer.js
index 0319cf7b1..ee0b75e9c 100644
--- a/loleaflet/src/layer/tile/ImpressTileLayer.js
+++ b/loleaflet/src/layer/tile/ImpressTileLayer.js
@@ -100,6 +100,7 @@ L.ImpressTileLayer = L.TileLayer.extend({
 
 		var presentationControlWrapperElem = L.DomUtil.get('presentation-controls-wrapper');
 		var documentContainer = L.DomUtil.get('document-container');
+		var slideSorter = L.DomUtil.get('slide-sorter');
 
 		// update portrait / landscape
 		var remove = 'portrait';
@@ -111,12 +112,14 @@ L.ImpressTileLayer = L.TileLayer.extend({
 
 		L.DomUtil.removeClass(presentationControlWrapperElem, remove);
 		L.DomUtil.removeClass(documentContainer, remove);
+		L.DomUtil.removeClass(slideSorter, remove);
 		L.DomUtil.addClass(presentationControlWrapperElem, add);
 		L.DomUtil.addClass(documentContainer, add);
+		L.DomUtil.addClass(slideSorter, add);
 
 		// update parts
 		var visible = L.DomUtil.getStyle(presentationControlWrapperElem, 'display');
-		if (!this._isSlidePaneVisible && visible !== 'none') {
+		if (visible !== 'none') {
 			this._map.fire('updateparts', {
 				selectedPart: this._selectedPart,
 				selectedParts: this._selectedParts,
@@ -125,7 +128,6 @@ L.ImpressTileLayer = L.TileLayer.extend({
 				partNames: this._partHashes
 			});
 		}
-		this._isSlidePaneVisible = !(visible === 'none');
 	},
 
 	onMobileInit: function (map) {
commit 91b2e52ce2d2f78802faec1025c13bd1e438fae7
Author:     Henry Castro <hcastro at collabora.com>
AuthorDate: Fri Mar 27 20:02:16 2020 -0400
Commit:     Henry Castro <hcastro at collabora.com>
CommitDate: Thu Apr 2 15:43:54 2020 +0200

    loleaflet: update position and size transformation values
    
    Now the LO Core server sends the converted units formatted
    text to update in client side when mobile wizard is visible.
    
    Change-Id: I82416bb4712aa20bcddb409c1129da1aff521a34
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91266
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Henry Castro <hcastro at collabora.com>

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js b/loleaflet/src/control/Control.JSDialogBuilder.js
index 862c218a4..27c8f35d7 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -904,34 +904,6 @@ L.Control.JSDialogBuilder = L.Control.extend({
 			}
 			break;
 
-		case 'selectwidth':
-			state = items.getItemValue('.uno:Size');
-			if (state) {
-				return String(L.mm100thToInch(state.split('x')[0]).toFixed(2));
-			}
-			break;
-
-		case 'selectheight':
-			state = items.getItemValue('.uno:Size');
-			if (state) {
-				return String(L.mm100thToInch(state.split('x')[1]).toFixed(2));
-			}
-			break;
-
-		case 'horizontalpos':
-			state = items.getItemValue('.uno:Position');
-			if (state) {
-				return String(L.mm100thToInch(state.split('/')[0]).toFixed(2));
-			}
-			break;
-
-		case 'verticalpos':
-			state = items.getItemValue('.uno:Position');
-			if (state) {
-				return String(L.mm100thToInch(state.split('/')[1]).toFixed(2));
-			}
-			break;
-
 		case 'transtype':
 			state = items.getItemValue('.uno:FillFloatTransparence');
 			if (state) {
@@ -999,8 +971,11 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		if (data.readOnly === true)
 			$(spinfield).attr('readOnly', 'true');
 
-		var updateFunction = function() {
-			var value = builder._getUnoStateForItemId(data.id, builder);
+		var updateFunction = function(e) {
+			var value = e ? e[data.id] : undefined;
+			if (!value) {
+				value = builder._getUnoStateForItemId(data.id, builder);
+			}
 
 			if (!value && data.text != undefined)
 				value = data.text;
@@ -1013,7 +988,9 @@ L.Control.JSDialogBuilder = L.Control.extend({
 		updateFunction();
 
 		builder.map.on('commandstatechanged', function(e) {
-			if (e.commandName === builder._mapWindowIdToUnoCommand(data.id))
+			if (e.state[data.id]) {
+				updateFunction(e.state);
+			} else if (e.commandName === builder._mapWindowIdToUnoCommand(data.id))
 				updateFunction();
 		}, this);
 
commit 6b096960fde3434996bff1eef1c61d410507bbcd
Author:     Pedro Pinto Silva <pedro.silva at collabora.com>
AuthorDate: Thu Apr 2 14:07:01 2020 +0200
Commit:     Pedro Pinto da Silva <pedro.silva at collabora.com>
CommitDate: Thu Apr 2 15:18:44 2020 +0200

    Mobile: Tollbar-up: mkae sure the bezel under the toolbar-up is visisble all the way
    
    Change-Id: I20f6188eec56c1ef193a9f1efdfd8b7d7a60f169
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91568
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Reviewed-by: Pedro Pinto da Silva <pedro.silva at collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Tested-by: Pedro Pinto da Silva <pedro.silva at collabora.com>

diff --git a/loleaflet/css/device-mobile.css b/loleaflet/css/device-mobile.css
index e642080f1..5a40ba1b2 100644
--- a/loleaflet/css/device-mobile.css
+++ b/loleaflet/css/device-mobile.css
@@ -362,6 +362,7 @@ button.vex-dialog-button-secondary.vex-dialog-button.vex-last {
 #toolbar-up.w2ui-toolbar{
 	padding-top: 0px;
 	padding-bottom: 0px;
+	background: transparent;
 }
 #formulabar {
 	padding: 0px !important;
commit 73ff494aaaf636ad9e1a0f88b2095db0a0dc5fdb
Author:     Pedro Pinto Silva <pedro.silva at collabora.com>
AuthorDate: Thu Apr 2 15:12:38 2020 +0200
Commit:     Pedro Pinto da Silva <pedro.silva at collabora.com>
CommitDate: Thu Apr 2 15:17:33 2020 +0200

    Mobile: spelling context menu: add icons
    
    Change-Id: Idc56a0534770a1895c5e6e7ea93fb46ccb44f3e9
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91573
    Tested-by: Pedro Pinto da Silva <pedro.silva at collabora.com>
    Reviewed-by: Pedro Pinto da Silva <pedro.silva at collabora.com>

diff --git a/loleaflet/images/lc_selectionlanugagedefault.svg b/loleaflet/images/lc_selectionlanugagedefault.svg
new file mode 100644
index 000000000..b95226337
--- /dev/null
+++ b/loleaflet/images/lc_selectionlanugagedefault.svg
@@ -0,0 +1,3 @@
+<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+ <path d="m12 2a10 10 0 0 0-5.5098 1.6621l4.4453 4.4453 0.70703-0.70703-3.5137-3.5137a9 9 0 0 1 3.8711-0.88672 9 9 0 0 1 9 9 9 9 0 0 1-1.3887 4.7832l0.72656 0.72656a10 10 0 0 0 1.6621-5.5098 10 10 0 0 0-10-10zm-8.3379 4.4902a10 10 0 0 0-1.6621 5.5098 10 10 0 0 0 10 10 10 10 0 0 0 5.5098-1.6621l-0.66992-0.66992 0.005859-0.003907-4-4-0.70703 0.70703 3.7402 3.7402a9 9 0 0 1-3.8789 0.88867 9 9 0 0 1-9-9 9 9 0 0 1 1.3887-4.7832z" fill="#4d82b8" fill-rule="evenodd"/>
+</svg>
diff --git a/loleaflet/images/lc_selectionlanugagenone.svg b/loleaflet/images/lc_selectionlanugagenone.svg
new file mode 100644
index 000000000..ae9911814
--- /dev/null
+++ b/loleaflet/images/lc_selectionlanugagenone.svg
@@ -0,0 +1,8 @@
+<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#696969">
+  <path d="m10 12h-1.4709q-0.25485 0-0.40777-0.12048-0.15291-0.12801-0.22573-0.31626l-0.61165-1.9654h-3.5607l-0.60437 1.9578q-0.058253 0.16566-0.22573 0.30874-0.16019 0.13554-0.40049 0.13554h-1.4927l3.5243-10h1.9515zm-5.8471-3.7877h2.6942l-0.98301-3.1627q-0.087379-0.23343-0.18204-0.54217-0.09466-0.31627-0.18932-0.68524-0.087379 0.36898-0.18204 0.68524-0.09466 0.31627-0.17476 0.5497z" fill="#696969"/>
+  <path d="m11 11.897v-9.8967h1.671v3.8636q0.38158-0.41322 0.84868-0.66116 0.4671-0.25482 1.0526-0.25482 0.55921 0 1.0066 0.23416 0.44737 0.23416 0.76316 0.67493 0.31579 0.43388 0.48684 1.0537 0.17105 0.61983 0.17105 1.3912 0 0.83333-0.19737 1.5152-0.19737 0.68182-0.55921 1.1708-0.36184 0.48209-0.86842 0.75069-0.5 0.26171-1.1184 0.26171-0.30263 0-0.54605-0.06198-0.23684-0.06198-0.44079-0.17218-0.20395-0.11708-0.375-0.27548-0.16447-0.16529-0.32237-0.36501l-0.07237 0.44077q-0.0329 0.18595-0.13158 0.26171-0.09868 0.06887-0.25658 0.06887h-1.1118zm2.9934-5.5854q-0.42105 0-0.73026 0.19972-0.30921 0.19284-0.5921 0.56474v3.0165q0.25 0.32369 0.53947 0.45454 0.28947 0.13085 0.61842 0.13085 0.32895 0 0.59868-0.12397 0.26974-0.13086 0.45395-0.40634 0.19079-0.28237 0.28947-0.71625 0.10526-0.44077 0.10526-1.0606 0-0.55096-0.08553-0.93664-0.085523-0.39256-0.25-0.6405-0.15789-0.24793-0.40132-0.36501-0.23684-0.11708-0.54605-0.11708z" fill="#696969"/>
+  <path d="m20.867 5c-0.46948 0-0.88172 0.089844-1.2402 0.26758-0.35425 0.17773-0.65321 0.42383-0.89648 0.73828-0.23901 0.3099-0.42115 0.67578-0.54492 1.0996-0.12377 0.42383-0.18555 0.88411-0.18555 1.3809 0 0.55599 0.07009 1.0527 0.21094 1.4902 0.14084 0.43294 0.3313 0.80078 0.57031 1.1016 0.19531 0.24148 0.42003 0.4238 0.66211 0.57422l0.81055-0.9082-0.01953 0.02539c0.06369-0.07601 0.13506-0.14331 0.20703-0.20898-0.17002-0.09409-0.3164-0.23891-0.4375-0.44141-0.22621-0.38281-0.33984-0.92643-0.33984-1.6328 0-0.33268 0.0269-0.63346 0.07813-0.90234 0.05548-0.26888 0.13549-0.49674 0.24219-0.68359 0.1067-0.18685 0.24211-0.33138 0.4043-0.43164 0.16645-0.10026 0.36009-0.15039 0.58203-0.15039 0.17926 0 0.32617 0.026041 0.44141 0.076172 0.11951 0.05013 0.22128 0.10612 0.30664 0.16992 0.08963 0.059244 0.16999 0.11393 0.23828 0.16406 0.06829 0.050131 0.14156 0.076172 0.22266 0.076172 0.08535 0 0.15226-0.018229 0.19922-0.054687 0.04694-0.041016 0.09367-0.094401 0.14062-0.1582l0.42968-0.62109c-0.
 26889-0.31445-0.57298-0.55273-0.91016-0.7168-0.33717-0.16862-0.728-0.25391-1.1719-0.25391z"/>
+ </g>
+ <path d="m22.008 11.016c-0.11263-0.02069-0.22958-0.02189-0.34981 0.0022-0.25623 0.05414-0.49235 0.19518-0.65848 0.39344l-7.353 8.2266-2.6339-2.5753c-0.44054-0.43079-1.2421-0.43076-1.6828 0-0.44056 0.43077-0.4406 1.2145 0 1.6453l3.5119 3.4337 0.91455 0.85842 0.8048-0.92996 8.1944-9.1565c0.5812-0.61865 0.04074-1.7531-0.74765-1.8979z" fill="#b3b3b3"/>
+</svg>
diff --git a/loleaflet/images/lc_setparagraphlanguagemenu.svg b/loleaflet/images/lc_setparagraphlanguagemenu.svg
new file mode 100644
index 000000000..53ef0a279
--- /dev/null
+++ b/loleaflet/images/lc_setparagraphlanguagemenu.svg
@@ -0,0 +1,10 @@
+<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+ <path d="m6.332 13-0.39844 0.43555-1.9277 1.9277-1.9277-1.9277a0.58188 0.58188 0 1 0-0.80078 0.80078l2.3281 2.3281 0.40039 0.43555 0.40039-0.43555 1.9258-1.9277 1.9277 1.9277 0.099609 0.10742c0.078991-0.11387 0.16798-0.22302 0.27148-0.32422 0.36248-0.35436 0.80476-0.55278 1.2598-0.61328l1.0977-1.0977 1.9258 1.9277 0.40039 0.43555 0.40039-0.43555 1.9277-1.9277 0.59766 0.59961 0.75586-0.8457-0.95508-0.95508-0.39844-0.43555-0.40039 0.43555-1.9277 1.9277-1.9277-1.9277-0.39844-0.43555-0.40039 0.43555-1.9277 1.9277-1.9277-1.9277z" fill="#d65532"/>
+ <g fill="#696969">
+  <path d="m10 12h-1.4709q-0.25485 0-0.40777-0.12048-0.15291-0.12801-0.22573-0.31626l-0.61165-1.9654h-3.5607l-0.60437 1.9578q-0.058253 0.16566-0.22573 0.30874-0.16019 0.13554-0.40049 0.13554h-1.4927l3.5243-10h1.9515zm-5.8471-3.7877h2.6942l-0.98301-3.1627q-0.087379-0.23343-0.18204-0.54217-0.09466-0.31627-0.18932-0.68524-0.087379 0.36898-0.18204 0.68524-0.09466 0.31627-0.17476 0.5497z" fill="#696969"/>
+  <path d="m11 11.897v-9.8967h1.671v3.8636q0.38158-0.41322 0.84868-0.66116 0.4671-0.25482 1.0526-0.25482 0.55921 0 1.0066 0.23416 0.44737 0.23416 0.76316 0.67493 0.31579 0.43388 0.48684 1.0537 0.17105 0.61983 0.17105 1.3912 0 0.83333-0.19737 1.5152-0.19737 0.68182-0.55921 1.1708-0.36184 0.48209-0.86842 0.75069-0.5 0.26171-1.1184 0.26171-0.30263 0-0.54605-0.06198-0.23684-0.06198-0.44079-0.17218-0.20395-0.11708-0.375-0.27548-0.16447-0.16529-0.32237-0.36501l-0.07237 0.44077q-0.0329 0.18595-0.13158 0.26171-0.09868 0.06887-0.25658 0.06887h-1.1118zm2.9934-5.5854q-0.42105 0-0.73026 0.19972-0.30921 0.19284-0.5921 0.56474v3.0165q0.25 0.32369 0.53947 0.45454 0.28947 0.13085 0.61842 0.13085 0.32895 0 0.59868-0.12397 0.26974-0.13086 0.45395-0.40634 0.19079-0.28237 0.28947-0.71625 0.10526-0.44077 0.10526-1.0606 0-0.55096-0.08553-0.93664-0.085523-0.39256-0.25-0.6405-0.15789-0.24793-0.40132-0.36501-0.23684-0.11708-0.54605-0.11708z" fill="#696969"/>
+  <path d="m20.867 5c-0.46948 0-0.88172 0.089844-1.2402 0.26758-0.35425 0.17773-0.65321 0.42383-0.89648 0.73828-0.23901 0.3099-0.42115 0.67578-0.54492 1.0996-0.12377 0.42383-0.18555 0.88411-0.18555 1.3809 0 0.55599 0.07009 1.0527 0.21094 1.4902 0.14084 0.43294 0.3313 0.80078 0.57031 1.1016 0.19531 0.24148 0.42003 0.4238 0.66211 0.57422l0.81055-0.9082-0.01953 0.02539c0.06369-0.07601 0.13506-0.14331 0.20703-0.20898-0.17002-0.09409-0.3164-0.23891-0.4375-0.44141-0.22621-0.38281-0.33984-0.92643-0.33984-1.6328 0-0.33268 0.0269-0.63346 0.07813-0.90234 0.05548-0.26888 0.13549-0.49674 0.24219-0.68359 0.1067-0.18685 0.24211-0.33138 0.4043-0.43164 0.16645-0.10026 0.36009-0.15039 0.58203-0.15039 0.17926 0 0.32617 0.026041 0.44141 0.076172 0.11951 0.05013 0.22128 0.10612 0.30664 0.16992 0.08963 0.059244 0.16999 0.11393 0.23828 0.16406 0.06829 0.050131 0.14156 0.076172 0.22266 0.076172 0.08535 0 0.15226-0.018229 0.19922-0.054687 0.04694-0.041016 0.09367-0.094401 0.14062-0.1582l0.42968-0.62109c-0.
 26889-0.31445-0.57298-0.55273-0.91016-0.7168-0.33717-0.16862-0.728-0.25391-1.1719-0.25391z"/>
+ </g>
+ <path d="m22.008 11.016c-0.11263-0.02069-0.22958-0.02189-0.34981 0.0022-0.25623 0.05414-0.49235 0.19518-0.65848 0.39344l-7.353 8.2266-2.6339-2.5753c-0.44054-0.43079-1.2421-0.43076-1.6828 0-0.44056 0.43077-0.4406 1.2145 0 1.6453l3.5119 3.4337 0.91455 0.85842 0.8048-0.92996 8.1944-9.1565c0.5812-0.61865 0.04074-1.7531-0.74765-1.8979z" fill="#76a797"/>
+ <path d="m6.332 13-0.39844 0.43555-1.9277 1.9277-1.9277-1.9277a0.58188 0.58188 0 1 0-0.80078 0.80078l2.3281 2.3281 0.40039 0.43555 0.40039-0.43555 1.9258-1.9277 1.9277 1.9277 0.099609 0.10742c0.078991-0.11387 0.16798-0.22302 0.27148-0.32422 0.36248-0.35436 0.80476-0.55278 1.2598-0.61328l1.0977-1.0977 1.9258 1.9277 0.40039 0.43555 0.40039-0.43555 1.9277-1.9277 0.59766 0.59961 0.75586-0.8457-0.95508-0.95508-0.39844-0.43555-0.40039 0.43555-1.9277 1.9277-1.9277-1.9277-0.39844-0.43555-0.40039 0.43555-1.9277 1.9277-1.9277-1.9277z" fill="#d65532"/>
+</svg>
diff --git a/loleaflet/images/lc_setselectionlanguagemenu.svg b/loleaflet/images/lc_setselectionlanguagemenu.svg
new file mode 100644
index 000000000..6c9f7c7e8
--- /dev/null
+++ b/loleaflet/images/lc_setselectionlanguagemenu.svg
@@ -0,0 +1,11 @@
+<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+ <path d="m6.332 13-0.39844 0.43555-1.9277 1.9277-1.9277-1.9277a0.58188 0.58188 0 1 0-0.80078 0.80078l2.3281 2.3281 0.40039 0.43555 0.40039-0.43555 1.9258-1.9277 1.9277 1.9277 0.099609 0.10742c0.078991-0.11387 0.16798-0.22302 0.27148-0.32422 0.36248-0.35436 0.80476-0.55278 1.2598-0.61328l1.0977-1.0977 1.9258 1.9277 0.40039 0.43555 0.40039-0.43555 1.9277-1.9277 0.59766 0.59961 0.75586-0.8457-0.95508-0.95508-0.39844-0.43555-0.40039 0.43555-1.9277 1.9277-1.9277-1.9277-0.39844-0.43555-0.40039 0.43555-1.9277 1.9277-1.9277-1.9277z" fill="#d65532"/>
+ <g fill="#696969">
+  <rect x=".59152" y="1.6464" width="16.817" height="10.707" rx=".98201" ry=".90166" fill="#696969" stroke="#696969" stroke-linejoin="round" stroke-width=".30299" style="paint-order:stroke markers fill"/>
+  <path d="m10 12h-1.4709q-0.25485 0-0.40777-0.12048-0.15291-0.12801-0.22573-0.31626l-0.61165-1.9654h-3.5607l-0.60437 1.9578q-0.058253 0.16566-0.22573 0.30874-0.16019 0.13554-0.40049 0.13554h-1.4927l3.5243-10h1.9515zm-5.8471-3.7877h2.6942l-0.98301-3.1627q-0.087379-0.23343-0.18204-0.54217-0.09466-0.31627-0.18932-0.68524-0.087379 0.36898-0.18204 0.68524-0.09466 0.31627-0.17476 0.5497z" fill="#fff"/>
+  <path d="m11 11.897v-9.8967h1.671v3.8636q0.38158-0.41322 0.84868-0.66116 0.4671-0.25482 1.0526-0.25482 0.55921 0 1.0066 0.23416 0.44737 0.23416 0.76316 0.67493 0.31579 0.43388 0.48684 1.0537 0.17105 0.61983 0.17105 1.3912 0 0.83333-0.19737 1.5152-0.19737 0.68182-0.55921 1.1708-0.36184 0.48209-0.86842 0.75069-0.5 0.26171-1.1184 0.26171-0.30263 0-0.54605-0.06198-0.23684-0.06198-0.44079-0.17218-0.20395-0.11708-0.375-0.27548-0.16447-0.16529-0.32237-0.36501l-0.07237 0.44077q-0.0329 0.18595-0.13158 0.26171-0.09868 0.06887-0.25658 0.06887h-1.1118zm2.9934-5.5854q-0.42105 0-0.73026 0.19972-0.30921 0.19284-0.5921 0.56474v3.0165q0.25 0.32369 0.53947 0.45454 0.28947 0.13085 0.61842 0.13085 0.32895 0 0.59868-0.12397 0.26974-0.13086 0.45395-0.40634 0.19079-0.28237 0.28947-0.71625 0.10526-0.44077 0.10526-1.0606 0-0.55096-0.08553-0.93664-0.085523-0.39256-0.25-0.6405-0.15789-0.24793-0.40132-0.36501-0.23684-0.11708-0.54605-0.11708z" fill="#fff"/>
+  <path d="m20.867 5c-0.46948 0-0.88172 0.089844-1.2402 0.26758-0.35425 0.17773-0.65321 0.42383-0.89648 0.73828-0.23901 0.3099-0.42115 0.67578-0.54492 1.0996-0.12377 0.42383-0.18555 0.88411-0.18555 1.3809 0 0.55599 0.07009 1.0527 0.21094 1.4902 0.14084 0.43294 0.3313 0.80078 0.57031 1.1016 0.19531 0.24148 0.42003 0.4238 0.66211 0.57422l0.81055-0.9082-0.01953 0.02539c0.06369-0.07601 0.13506-0.14331 0.20703-0.20898-0.17002-0.09409-0.3164-0.23891-0.4375-0.44141-0.22621-0.38281-0.33984-0.92643-0.33984-1.6328 0-0.33268 0.0269-0.63346 0.07813-0.90234 0.05548-0.26888 0.13549-0.49674 0.24219-0.68359 0.1067-0.18685 0.24211-0.33138 0.4043-0.43164 0.16645-0.10026 0.36009-0.15039 0.58203-0.15039 0.17926 0 0.32617 0.026041 0.44141 0.076172 0.11951 0.05013 0.22128 0.10612 0.30664 0.16992 0.08963 0.059244 0.16999 0.11393 0.23828 0.16406 0.06829 0.050131 0.14156 0.076172 0.22266 0.076172 0.08535 0 0.15226-0.018229 0.19922-0.054687 0.04694-0.041016 0.09367-0.094401 0.14062-0.1582l0.42968-0.62109c-0.
 26889-0.31445-0.57298-0.55273-0.91016-0.7168-0.33717-0.16862-0.728-0.25391-1.1719-0.25391z"/>
+ </g>
+ <path d="m22.008 11.016c-0.11263-0.02069-0.22958-0.02189-0.34981 0.0022-0.25623 0.05414-0.49235 0.19518-0.65848 0.39344l-7.353 8.2266-2.6339-2.5753c-0.44054-0.43079-1.2421-0.43076-1.6828 0-0.44056 0.43077-0.4406 1.2145 0 1.6453l3.5119 3.4337 0.91455 0.85842 0.8048-0.92996 8.1944-9.1565c0.5812-0.61865 0.04074-1.7531-0.74765-1.8979z" fill="#76a797"/>
+ <path d="m6.332 13-0.39844 0.43555-1.9277 1.9277-1.9277-1.9277a0.58188 0.58188 0 1 0-0.80078 0.80078l2.3281 2.3281 0.40039 0.43555 0.40039-0.43555 1.9258-1.9277 1.9277 1.9277 0.099609 0.10742c0.078991-0.11387 0.16798-0.22302 0.27148-0.32422 0.36248-0.35436 0.80476-0.55278 1.2598-0.61328l1.0977-1.0977 1.9258 1.9277 0.40039 0.43555 0.40039-0.43555 1.9277-1.9277 0.59766 0.59961 0.75586-0.8457-0.95508-0.95508-0.39844-0.43555-0.40039 0.43555-1.9277 1.9277-1.9277-1.9277-0.39844-0.43555-0.40039 0.43555-1.9277 1.9277-1.9277-1.9277z" fill="#d65532"/>
+</svg>
diff --git a/loleaflet/images/lc_spellcheckignore.svg b/loleaflet/images/lc_spellcheckignore.svg
new file mode 100644
index 000000000..ed7a91613
--- /dev/null
+++ b/loleaflet/images/lc_spellcheckignore.svg
@@ -0,0 +1,9 @@
+<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#696969">
+  <path d="m10 12h-1.4709q-0.25485 0-0.40777-0.12048-0.15291-0.12801-0.22573-0.31626l-0.61165-1.9654h-3.5607l-0.60437 1.9578q-0.058253 0.16566-0.22573 0.30874-0.16019 0.13554-0.40049 0.13554h-1.4927l3.5243-10h1.9515zm-5.8471-3.7877h2.6942l-0.98301-3.1627q-0.087379-0.23343-0.18204-0.54217-0.09466-0.31627-0.18932-0.68524-0.087379 0.36898-0.18204 0.68524-0.09466 0.31627-0.17476 0.5497z"/>
+  <path d="m11 11.897v-9.8967h1.671v3.8636q0.38158-0.41322 0.84868-0.66116 0.4671-0.25482 1.0526-0.25482 0.55921 0 1.0066 0.23416 0.44737 0.23416 0.76316 0.67493 0.31579 0.43388 0.48684 1.0537 0.17105 0.61983 0.17105 1.3912 0 0.83333-0.19737 1.5152-0.19737 0.68182-0.55921 1.1708-0.36184 0.48209-0.86842 0.75069-0.5 0.26171-1.1184 0.26171-0.30263 0-0.54605-0.06198-0.23684-0.06198-0.44079-0.17218-0.20395-0.11708-0.375-0.27548-0.16447-0.16529-0.32237-0.36501l-0.07237 0.44077q-0.0329 0.18595-0.13158 0.26171-0.09868 0.06887-0.25658 0.06887h-1.1118zm2.9934-5.5854q-0.42105 0-0.73026 0.19972-0.30921 0.19284-0.5921 0.56474v3.0165q0.25 0.32369 0.53947 0.45454t0.61842 0.13085 0.59868-0.12397q0.26974-0.13086 0.45395-0.40634 0.19079-0.28237 0.28947-0.71625 0.10526-0.44077 0.10526-1.0606 0-0.55096-0.08553-0.93664-0.08552-0.39256-0.25-0.6405-0.15789-0.24793-0.40132-0.36501-0.23684-0.11708-0.54605-0.11708z"/>
+  <path d="m20.867 5c-0.46948 0-0.88172 0.089844-1.2402 0.26758-0.35425 0.17773-0.65321 0.42383-0.89648 0.73828-0.23901 0.3099-0.42115 0.67578-0.54492 1.0996-0.12377 0.42383-0.18555 0.88411-0.18555 1.3809 0 0.55599 0.07009 1.0527 0.21094 1.4902 0.14084 0.43294 0.3313 0.80078 0.57031 1.1016 0.19531 0.24148 0.42003 0.4238 0.66211 0.57422l0.81055-0.9082-0.01953 0.02539c0.06369-0.07601 0.13506-0.14331 0.20703-0.20898-0.17002-0.09409-0.3164-0.23891-0.4375-0.44141-0.22621-0.38281-0.33984-0.92643-0.33984-1.6328 0-0.33268 0.0269-0.63346 0.07813-0.90234 0.05548-0.26888 0.13549-0.49674 0.24219-0.68359s0.24211-0.33138 0.4043-0.43164c0.16645-0.10026 0.36009-0.15039 0.58203-0.15039 0.17926 0 0.32617 0.026041 0.44141 0.076172 0.11951 0.05013 0.22128 0.10612 0.30664 0.16992 0.08963 0.059244 0.16999 0.11393 0.23828 0.16406 0.06829 0.050131 0.14156 0.076172 0.22266 0.076172 0.08535 0 0.15226-0.018229 0.19922-0.054687 0.04694-0.041016 0.09367-0.094401 0.14062-0.1582l0.42968-0.62109c-0.26889-0.31445-0
 .57298-0.55273-0.91016-0.7168-0.33717-0.16862-0.728-0.25391-1.1719-0.25391z"/>
+ </g>
+ <path d="m22.008 11.016c-0.11263-0.02069-0.22958-0.02189-0.34981 0.0022-0.25623 0.05414-0.49235 0.19518-0.65848 0.39344l-7.353 8.2266-2.6339-2.5753c-0.44054-0.43079-1.2421-0.43076-1.6828 0-0.44056 0.43077-0.4406 1.2145 0 1.6453l3.5119 3.4337 0.91455 0.85842 0.8048-0.92996 8.1944-9.1565c0.5812-0.61865 0.04074-1.7531-0.74765-1.8979z" fill="#76a797"/>
+ <path d="m1.9769 21.5h2v-5.7244l-1.6783 1.2616c-0.09712 0.08093-0.19221 0.10926-0.28528 0.08498-0.08902-0.02833-0.15174-0.06879-0.18816-0.1214l-0.3217-0.4431 2.3247-2.0577h1.1487v7h1v1h-4z" fill="#76a797" stroke="#76a797" stroke-width=".75"/>
+</svg>
diff --git a/loleaflet/images/lc_spellcheckignoreall.svg b/loleaflet/images/lc_spellcheckignoreall.svg
new file mode 100644
index 000000000..16dc38362
--- /dev/null
+++ b/loleaflet/images/lc_spellcheckignoreall.svg
@@ -0,0 +1,8 @@
+<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#696969">
+  <path d="m10 12h-1.4709q-0.25485 0-0.40777-0.12048-0.15291-0.12801-0.22573-0.31626l-0.61165-1.9654h-3.5607l-0.60437 1.9578q-0.058253 0.16566-0.22573 0.30874-0.16019 0.13554-0.40049 0.13554h-1.4927l3.5243-10h1.9515zm-5.8471-3.7877h2.6942l-0.98301-3.1627q-0.087379-0.23343-0.18204-0.54217-0.09466-0.31627-0.18932-0.68524-0.087379 0.36898-0.18204 0.68524-0.09466 0.31627-0.17476 0.5497z"/>
+  <path d="m11 11.897v-9.8967h1.671v3.8636q0.38158-0.41322 0.84868-0.66116 0.4671-0.25482 1.0526-0.25482 0.55921 0 1.0066 0.23416 0.44737 0.23416 0.76316 0.67493 0.31579 0.43388 0.48684 1.0537 0.17105 0.61983 0.17105 1.3912 0 0.83333-0.19737 1.5152-0.19737 0.68182-0.55921 1.1708-0.36184 0.48209-0.86842 0.75069-0.5 0.26171-1.1184 0.26171-0.30263 0-0.54605-0.06198-0.23684-0.06198-0.44079-0.17218-0.20395-0.11708-0.375-0.27548-0.16447-0.16529-0.32237-0.36501l-0.07237 0.44077q-0.0329 0.18595-0.13158 0.26171-0.09868 0.06887-0.25658 0.06887h-1.1118zm2.9934-5.5854q-0.42105 0-0.73026 0.19972-0.30921 0.19284-0.5921 0.56474v3.0165q0.25 0.32369 0.53947 0.45454 0.28947 0.13085 0.61842 0.13085 0.32895 0 0.59868-0.12397 0.26974-0.13086 0.45395-0.40634 0.19079-0.28237 0.28947-0.71625 0.10526-0.44077 0.10526-1.0606 0-0.55096-0.08553-0.93664-0.085523-0.39256-0.25-0.6405-0.15789-0.24793-0.40132-0.36501-0.23684-0.11708-0.54605-0.11708z"/>
+  <path d="m20.867188 5c-.469484 0-.881719.0898437-1.240235.2675781-.354246.1777345-.653206.4238281-.896484.7382813-.239011.309896-.421149.675781-.544922 1.0996094-.123773.4238283-.185547.8841143-.185547 1.3808593 0 .5559898.070092 1.0527342.210938 1.4902344.140845.4329425.331302.8007815.570312 1.1015625.195314.241481.42003.423801.662109.574219l.810547-.908203-.019531.02539c.063691-.076012.135062-.14331.207031-.208984-.170025-.094091-.316402-.238909-.4375-.441406-.226206-.382813-.339844-.9264324-.339844-1.6328129 0-.3326824.026905-.6334634.078126-.9023437.055484-.2688804.135486-.4967447.242187-.6835938.106701-.186849.242112-.3313801.404297-.4316406.166453-.1002605.360093-.1503906.582031-.1503906.179257 0 .32617.0260412.441406.0761718.119506.0501304.22128.1061199.306641.1699219.089629.0592444.169993.1139319.238281.1640625.068288.0501307.141563.0761719.222657.0761719.085355 0 .152265-.0182288.199218-.0546875.046944-.0410157.093672-.0944011.140625-.1582031l.429688-.6210938c-.268886-.31
 44533-.572982-.5527343-.910157-.7167969-.337174-.1686198-.727999-.2539062-1.171874-.2539062z"/>
+ </g>
+ <path d="m22.008 11.016c-0.11263-0.02069-0.22958-0.02189-0.34981 0.0022-0.25623 0.05414-0.49235 0.19518-0.65848 0.39344l-7.353 8.2266-2.6339-2.5753c-0.44054-0.43079-1.2421-0.43076-1.6828 0-0.44056 0.43077-0.4406 1.2145 0 1.6453l3.5119 3.4337 0.91455 0.85842 0.8048-0.92996 8.1944-9.1565c0.5812-0.61865 0.04074-1.7531-0.74765-1.8979z" fill="#76a797"/>
+</svg>
commit e814adfb2876748b06e3d21145aa4d18db52ed0d
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Thu Apr 2 11:35:07 2020 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Apr 2 13:50:06 2020 +0200

    cypress: integrate cypress-wait-until package.
    
    There are cases sometimes, where we can't use cypress'
    nice retry feature for waiting to an assumption to
    be true. A workaround for this issue is the cypress-wait-until
    package, which makes us able to use the retry feature for
    any use case.
    An example is the position of an element. I don't know
    a way to wait on the position to get changed in the cypress
    test framework. So we can use cy.waitUntil() here instead.
    
    Please use this new package when it's really necessary,
    do not replace the better cypress calls with it.
    
    Change-Id: I8c553456e351664e30043b8ccd5ace51f1c0298d
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91554
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>

diff --git a/cypress_test/.gitignore b/cypress_test/.gitignore
index 0b6b5b539..3e5e8dbd2 100644
--- a/cypress_test/.gitignore
+++ b/cypress_test/.gitignore
@@ -2,4 +2,3 @@ node_modules
 cypress
 package-lock.json
 workdir
-support/commands.js
diff --git a/cypress_test/integration_tests/mobile/writer/insert_object_spec.js b/cypress_test/integration_tests/mobile/writer/insert_object_spec.js
index 7a01c8824..64794d649 100644
--- a/cypress_test/integration_tests/mobile/writer/insert_object_spec.js
+++ b/cypress_test/integration_tests/mobile/writer/insert_object_spec.js
@@ -171,14 +171,14 @@ describe('Insert objects via insertion wizard.', function() {
 			.contains('All')
 			.click();
 
-		cy.wait(100);
-
 		// Check that the cursor was moved
-		cy.get('.blinking-cursor')
-			.then(function(cursor) {
-				expect(cursor).to.have.lengthOf(1);
-				expect(cursor[0].getBoundingClientRect().left).to.be.lessThan(cursorOrigLeft);
-			});
+		cy.waitUntil(function() {
+			return cy.get('.blinking-cursor')
+				.then(function(cursor) {
+					expect(cursor).to.have.lengthOf(1);
+					return cursor[0].getBoundingClientRect().left < cursorOrigLeft;
+				});
+		});
 	});
 
 	it('Insert footer.', function() {
@@ -214,14 +214,14 @@ describe('Insert objects via insertion wizard.', function() {
 			.contains('All')
 			.click();
 
-		cy.wait(100);
-
 		// Check that the cursor was moved
-		cy.get('.blinking-cursor')
-			.then(function(cursor) {
-				expect(cursor).to.have.lengthOf(1);
-				expect(cursor[0].getBoundingClientRect().top).to.be.greaterThan(cursorOrigTop);
-			});
+		cy.waitUntil(function() {
+			return cy.get('.blinking-cursor')
+				.then(function(cursor) {
+					expect(cursor).to.have.lengthOf(1);
+					return cursor[0].getBoundingClientRect().top > cursorOrigTop;
+				});
+		});
 	});
 
 	it('Insert footnote.', function() {
@@ -245,14 +245,14 @@ describe('Insert objects via insertion wizard.', function() {
 			.contains('Footnote')
 			.click();
 
-		cy.wait(100);
-
-		// Check that the cursor was moved down
-		cy.get('.blinking-cursor')
-			.then(function(cursor) {
-				expect(cursor).to.have.lengthOf(1);
-				expect(cursor[0].getBoundingClientRect().top).to.be.greaterThan(cursorOrigTop);
-			});
+		// Check that the cursor was moved
+		cy.waitUntil(function() {
+			return cy.get('.blinking-cursor')
+				.then(function(cursor) {
+					expect(cursor).to.have.lengthOf(1);
+					return cursor[0].getBoundingClientRect().top > cursorOrigTop;
+				});
+		});
 	});
 
 	it('Insert endnote.', function() {
@@ -276,14 +276,14 @@ describe('Insert objects via insertion wizard.', function() {
 			.contains('Endnote')
 			.click();
 
-		cy.wait(100);
-
-		// Check that the cursor was moved down
-		cy.get('.blinking-cursor')
-			.then(function(cursor) {
-				expect(cursor).to.have.lengthOf(1);
-				expect(cursor[0].getBoundingClientRect().top).to.be.greaterThan(cursorOrigTop);
-			});
+		// Check that the cursor was moved
+		cy.waitUntil(function() {
+			return cy.get('.blinking-cursor')
+				.then(function(cursor) {
+					expect(cursor).to.have.lengthOf(1);
+					return cursor[0].getBoundingClientRect().top > cursorOrigTop;
+				});
+		});
 	});
 
 	it('Insert page break.', function() {
@@ -307,14 +307,14 @@ describe('Insert objects via insertion wizard.', function() {
 			.contains('Page Break')
 			.click();
 
-		cy.wait(100);
-
-		// Check that the cursor was moved down
-		cy.get('.blinking-cursor')
-			.then(function(cursor) {
-				expect(cursor).to.have.lengthOf(1);
-				expect(cursor[0].getBoundingClientRect().top).to.be.greaterThan(cursorOrigTop);
-			});
+		// Check that the cursor was moved
+		cy.waitUntil(function() {
+			return cy.get('.blinking-cursor')
+				.then(function(cursor) {
+					expect(cursor).to.have.lengthOf(1);
+					return cursor[0].getBoundingClientRect().top > cursorOrigTop;
+				});
+		});
 	});
 
 	it('Insert column break.', function() {
@@ -338,14 +338,14 @@ describe('Insert objects via insertion wizard.', function() {
 			.contains('Column Break')
 			.click();
 
-		cy.wait(100);
-
-		// Check that the cursor was moved down
-		cy.get('.blinking-cursor')
-			.then(function(cursor) {
-				expect(cursor).to.have.lengthOf(1);
-				expect(cursor[0].getBoundingClientRect().top).to.be.greaterThan(cursorOrigTop);
-			});
+		// Check that the cursor was moved
+		cy.waitUntil(function() {
+			return cy.get('.blinking-cursor')
+				.then(function(cursor) {
+					expect(cursor).to.have.lengthOf(1);
+					return cursor[0].getBoundingClientRect().top > cursorOrigTop;
+				});
+		});
 	});
 
 	it('Insert hyperlink.', function() {
diff --git a/cypress_test/package.json b/cypress_test/package.json
index cfdad5618..a49df3820 100644
--- a/cypress_test/package.json
+++ b/cypress_test/package.json
@@ -6,6 +6,7 @@
   "dependencies": {
     "cypress": "4.3.0",
     "cypress-failed-log": "2.6.2",
+    "cypress-wait-until": "1.6.1",
     "eslint": "6.8.0",
     "get-port-cli": "2.0.0",
     "wait-on": "4.0.0"
diff --git a/cypress_test/support/commands.js b/cypress_test/support/commands.js
new file mode 100644
index 000000000..5c6c3cd80
--- /dev/null
+++ b/cypress_test/support/commands.js
@@ -0,0 +1 @@
+import 'cypress-wait-until';
diff --git a/cypress_test/support/index.js b/cypress_test/support/index.js
index 8f683db34..2a2b1f1d5 100644
--- a/cypress_test/support/index.js
+++ b/cypress_test/support/index.js
@@ -1,3 +1,4 @@
 /* global require */
 
 require('cypress-failed-log');
+require('./commands');
commit ef1a14e175c526865cc3b07fc82fdda5143c2b5d
Author:     Jan Holesovsky <kendy at collabora.com>
AuthorDate: Thu Apr 2 11:02:47 2020 +0200
Commit:     Jan Holesovsky <kendy at collabora.com>
CommitDate: Thu Apr 2 13:01:57 2020 +0200

    mobile: Move the slidesorter handling to device-mobile.css.
    
    Don't use @media for portrait / landscape handling either.
    
    Change-Id: I5a67488e862b59878284bbc5d0ef067a1ff7f60a
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/91559
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/loleaflet/css/device-mobile.css b/loleaflet/css/device-mobile.css
index 5b1143739..e642080f1 100644
--- a/loleaflet/css/device-mobile.css
+++ b/loleaflet/css/device-mobile.css
@@ -519,3 +519,133 @@ td[id^=tb_spreadsheet-toolbar_item]:focus table.w2ui-button div.w2ui-icon, td[id
 	flex-direction: row;
 	align-items: center;
 }
+
+/* Related to slidesorter */
+/* Show slidesorter beyond 768px only */
+#presentation-controls-wrapper {
+	top: initial;
+	left: initial;
+	bottom: 33px;
+	max-width: initial;
+}
+
+#presentation-controls-wrapper.readonly {
+	top: initial;
+	bottom: 0px;
+}
+
+/* Show sidebar beyond 768px only */
+#sidebar-dock-wrapper {
+	display: none;
+	top: 41px;
+}
+
+#document-container.sidebar-document {
+	left: 0px !important;
+}
+
+#document-container.readonly {
+	top: 37px; /*set equal to toolbar up's height*/
+	bottom: 0px;
+}
+
+#document-container.readonly.parts-preview-document {
+	bottom: 65px;
+}
+
+#document-container.readonly.spreadsheet-document {
+	top: 61px !important;
+	bottom: 42px;
+}
+
+#document-container.parts-preview-document {
+	left: 0px !important;
+	bottom: 95px;
+}
+
+#document-container.spreadsheet-document {
+	top: 92px !important;
+	bottom: 68px;
+}
+
+#document-container {
+	top: 37px; /*set equal to toolbar up's height*/
+	right: 0px !important;
+	bottom: 35px;
+}
+
+#spreadsheet-row-column-frame {
+	top: 72px !important;
+	bottom: 68px;
+}
+
+#spreadsheet-row-column-frame.readonly {
+	top: 41px !important;
+	bottom: 35px !important;
+}
+
+#closebuttonwrapper {
+	display: none;
+}
+/* Show menubar even if folded */
+.main-nav {
+	display: block !important;
+}
+
+/* Slidesorter in portrait mode */
+#presentation-controls-wrapper.portrait {
+	top: initial;
+	left: initial;
+	bottom: 33px;
+	position: fixed;
+	width: 100%;
+	max-width: initial;
+}
+

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list