[Libreoffice-commits] online.git: 7 commits - loleaflet/build loleaflet/Makefile.am loleaflet/src

Szymon Kłos (via logerrit) logerrit at kemper.freedesktop.org
Sun Nov 3 17:30:58 UTC 2019


 loleaflet/Makefile.am                           |    1 
 loleaflet/build/deps.js                         |    3 
 loleaflet/src/control/Control.ContextMenu.js    |   19 +++-
 loleaflet/src/control/Control.LanguageDialog.js |  106 ++++++++++++++++++++++++
 loleaflet/src/control/Control.Toolbar.js        |   19 +++-
 loleaflet/src/layer/marker/Annotation.js        |    3 
 loleaflet/src/layer/tile/CalcTileLayer.js       |   33 +++++++
 loleaflet/src/layer/tile/ImpressTileLayer.js    |    2 
 loleaflet/src/main.js                           |    1 
 loleaflet/src/unocommands.js                    |    3 
 10 files changed, 183 insertions(+), 7 deletions(-)

New commits:
commit 2017b7284bbc487f489bfb6374876096537f5c17
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Fri Jul 26 10:55:56 2019 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Sun Nov 3 18:27:59 2019 +0100

    Show comments after scrolling down
    
    Added view scroll after user clicks "V" button
    to scroll comments down in impress.
    
    Change-Id: Icb41a14fa5c7154e2f09bfc71473f623f2518464

diff --git a/loleaflet/src/layer/tile/ImpressTileLayer.js b/loleaflet/src/layer/tile/ImpressTileLayer.js
index bf702925a..350084c1d 100644
--- a/loleaflet/src/layer/tile/ImpressTileLayer.js
+++ b/loleaflet/src/layer/tile/ImpressTileLayer.js
@@ -391,6 +391,8 @@ L.ImpressTileLayer = L.TileLayer.extend({
 	onAnnotationScrollDown: function () {
 		this._topAnnotation[this._selectedPart] = Math.min(++this._topAnnotation[this._selectedPart], this._annotations[this._partHashes[this._selectedPart]].length - 1);
 		this.onAnnotationCancel();
+		var topRight = this._map.latLngToLayerPoint(this._map.options.docBounds.getNorthEast());
+		this._map.fire('scrollby', {x: topRight.x, y: 0});
 	},
 
 	onAnnotationScrollUp: function () {
commit 777c8b0324cf2178c5a897d4caa605c3b87f9c7f
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Jul 25 09:11:32 2019 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Sun Nov 3 18:11:46 2019 +0100

    Show code in language indicator
    
    Fixes detection of a current code
    
    Change-Id: I30f0caa6b33c78ef6ab6766d07c1ec34090b12ac

diff --git a/loleaflet/src/control/Control.LanguageDialog.js b/loleaflet/src/control/Control.LanguageDialog.js
index c31ad2556..aaf81628d 100644
--- a/loleaflet/src/control/Control.LanguageDialog.js
+++ b/loleaflet/src/control/Control.LanguageDialog.js
@@ -40,16 +40,22 @@ L.Control.LanguageDialog = L.Control.extend({
 		vex.closeAll();
 	},
 
-	_getSelectedLanguage: function() {
+	_getSelectedLanguageCode: function() {
 		var constState = 'stateChangeHandler';
 		var languageAndCode = this._map[constState].getItemValue('.uno:LanguageStatus');
-		var language = languageAndCode.split(';')[0];
-		return language;
+		var split = languageAndCode.split(';');
+		var code = '-';
+		if (split.length > 1)
+			code = split[1];
+		else
+			console.error('Language code not found');
+		return code;
 	},
 
 	_addItem: function(parent, language) {
-		var selectedLanguage = this._getSelectedLanguage();
+		var selectedLanguageCode = this._getSelectedLanguageCode();
 		var neutralLanguage = 'LANGUAGE_NONE';
+		var code = '';
 
 		var tr = L.DomUtil.create('tr', '', parent);
 		var td = L.DomUtil.create('td', '', tr);
@@ -57,13 +63,14 @@ L.Control.LanguageDialog = L.Control.extend({
 
 		if (language) {
 			neutralLanguage = language.neutral;
+			code = language.iso;
 			a.innerHTML = language.iso;
 		} else {
 			a.innerHTML = _('None (Do not check spelling)');
 		}
 
-		if (neutralLanguage.indexOf(selectedLanguage) !== -1
-			|| (selectedLanguage == '[None]' && !language)) {
+		if ((selectedLanguageCode != '-' && code.indexOf(selectedLanguageCode) !== -1)
+			|| (selectedLanguageCode == '-' && !language)) {
 			$(a).addClass('highlighted');
 		} else {
 			$(a).removeClass('highlighted');
commit 985e68aa86db3370940a00b44b18b81bd9052339
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Jul 25 08:39:15 2019 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Sun Nov 3 18:11:37 2019 +0100

    Show iso codes in dialog
    
    Solves missing translations for languages.
    
    Change-Id: If4c7d994b1927c80a374e4f85f1797b9c8cb472f

diff --git a/loleaflet/src/control/Control.LanguageDialog.js b/loleaflet/src/control/Control.LanguageDialog.js
index 43b3f909e..c31ad2556 100644
--- a/loleaflet/src/control/Control.LanguageDialog.js
+++ b/loleaflet/src/control/Control.LanguageDialog.js
@@ -57,7 +57,7 @@ L.Control.LanguageDialog = L.Control.extend({
 
 		if (language) {
 			neutralLanguage = language.neutral;
-			a.innerHTML = language.translated;
+			a.innerHTML = language.iso;
 		} else {
 			a.innerHTML = _('None (Do not check spelling)');
 		}
commit 786709794de5c131f753f01ba2260b664761e006
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Jul 24 15:59:45 2019 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Sun Nov 3 18:10:40 2019 +0100

    Move language icon to the end of toolbar
    
    Change-Id: Ic10e9540d13b6be45acbb87e5ed4a447a617b922

diff --git a/loleaflet/src/control/Control.Toolbar.js b/loleaflet/src/control/Control.Toolbar.js
index 2262197cf..bac3bab0a 100644
--- a/loleaflet/src/control/Control.Toolbar.js
+++ b/loleaflet/src/control/Control.Toolbar.js
@@ -891,7 +891,8 @@ function initNormalToolbar() {
 		{type: 'button',  id: 'sidebar', img: 'sidebar_modify_page', hint: _UNO('.uno:Sidebar', '', true), uno: '.uno:Sidebar', hidden: true},
 		{type: 'break', id: 'breaksidebar', hidden: true},
 		{type: 'button',  id: 'fold',  img: 'fold', desktop: true, mobile: false, hidden: true},
-		{type: 'button',  id: 'hamburger-tablet',  img: 'hamburger', desktop: false, mobile: false, tablet: true, iosapptablet: false, hidden: true}
+		{type: 'button',  id: 'hamburger-tablet',  img: 'hamburger', desktop: false, mobile: false, tablet: true, iosapptablet: false, hidden: true},
+		{type: 'button', id: 'languagecode', desktop: false, mobile: true, tablet: false}
 	];
 
 	var toolbar = $('#toolbar-up');
commit d3b92abd8e516f69b1ebab158ae9b49a39d39125
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Mon Jul 22 11:44:05 2019 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Sun Nov 3 18:00:22 2019 +0100

    Mobile language indicator and dialog
    
    Change-Id: I2358ac60a3ba1a0f177e9fa3f965b7043ab99559

diff --git a/loleaflet/Makefile.am b/loleaflet/Makefile.am
index 15760e5b4..5409d9edb 100644
--- a/loleaflet/Makefile.am
+++ b/loleaflet/Makefile.am
@@ -342,6 +342,7 @@ pot:
 		src/control/Control.DownloadProgress.js \
 		src/control/ColorPicker.js \
 		src/control/Control.JSDialogBuilder.js \
+		src/control/Control.LanguageDialog.js \
 		src/control/Control.Menubar.js \
 		src/control/Control.MobileWizard.js \
 		src/control/Control.Scroll.Annotation.js \
diff --git a/loleaflet/build/deps.js b/loleaflet/build/deps.js
index d9bf83bf2..a0c6d64fa 100644
--- a/loleaflet/build/deps.js
+++ b/loleaflet/build/deps.js
@@ -391,7 +391,8 @@ var deps = {
 			'control/Control.Infobar.js',
 			'control/ColorPicker.js',
 			'control/Control.JSDialogBuilder.js',
-			'control/Control.MobileWizard.js'],
+			'control/Control.MobileWizard.js',
+			'control/Control.LanguageDialog.js'],
 		heading: 'Controls',
 		desc: 'Handles vex dialogs for displaying alerts'
 	},
diff --git a/loleaflet/src/control/Control.LanguageDialog.js b/loleaflet/src/control/Control.LanguageDialog.js
new file mode 100644
index 000000000..43b3f909e
--- /dev/null
+++ b/loleaflet/src/control/Control.LanguageDialog.js
@@ -0,0 +1,99 @@
+/* -*- js-indent-level: 8 -*- */
+/*
+ * L.Control.LanguageDialog used for spellchecking language selection on mobile devices
+ */
+
+/* global _ $ vex */
+L.Control.LanguageDialog = L.Control.extend({
+
+	_languages: [],
+
+	onAdd: function (map) {
+		map.on('commandvalues', this._onCommandValues, this);
+		map.on('languagedialog', this._onLanguageDialog, this);
+	},
+
+	_onCommandValues: function(e) {
+		if (e.commandName === '.uno:LanguageStatus' && L.Util.isArray(e.commandValues)) {
+			var languages = [];
+
+			e.commandValues.forEach(function(language) {
+				var split = language.split(';');
+				language = split[0];
+				var isoCode = '';
+				if (split.length > 1)
+					isoCode = split[1];
+				languages.push({translated: _(language), neutral: language, iso: isoCode});
+			});
+
+			languages.sort(function(a, b) {
+				return a.translated < b.translated ? -1 : a.translated > b.translated ? 1 : 0;
+			});
+
+			this._languages = languages;
+		}
+	},
+
+	_onItemSelected: function(e) {
+		var unoCommand = '.uno:LanguageStatus?Language:string=Default_' + e.data.language;
+		e.data.self._map.sendUnoCommand(unoCommand);
+		vex.closeAll();
+	},
+
+	_getSelectedLanguage: function() {
+		var constState = 'stateChangeHandler';
+		var languageAndCode = this._map[constState].getItemValue('.uno:LanguageStatus');
+		var language = languageAndCode.split(';')[0];
+		return language;
+	},
+
+	_addItem: function(parent, language) {
+		var selectedLanguage = this._getSelectedLanguage();
+		var neutralLanguage = 'LANGUAGE_NONE';
+
+		var tr = L.DomUtil.create('tr', '', parent);
+		var td = L.DomUtil.create('td', '', tr);
+		var a = L.DomUtil.create('a', '', td);
+
+		if (language) {
+			neutralLanguage = language.neutral;
+			a.innerHTML = language.translated;
+		} else {
+			a.innerHTML = _('None (Do not check spelling)');
+		}
+
+		if (neutralLanguage.indexOf(selectedLanguage) !== -1
+			|| (selectedLanguage == '[None]' && !language)) {
+			$(a).addClass('highlighted');
+		} else {
+			$(a).removeClass('highlighted');
+		}
+
+		$(tr).on('click', {self: this, language: encodeURIComponent(neutralLanguage)}, this._onItemSelected);
+	},
+
+	_onLanguageDialog: function() {
+		var dialog = vex.dialog.open({
+			message: '',
+			buttons: [
+				$.extend({}, vex.dialog.buttons.NO, { text: _('Cancel') })
+			],
+		});
+
+		var div = L.DomUtil.create('div', '');
+		var ul = L.DomUtil.create('table', 'lo-menu', div);
+
+		// Add NONE
+		this._addItem(ul, null);
+
+		for (var lang in this._languages) {
+			this._addItem(ul, this._languages[lang]);
+		}
+
+		dialog.get(0).insertBefore(div, dialog.get(0).childNodes[0]);
+	}
+});
+
+L.control.languageDialog = function (options) {
+	return new L.Control.LanguageDialog(options);
+};
diff --git a/loleaflet/src/control/Control.Toolbar.js b/loleaflet/src/control/Control.Toolbar.js
index f49b3841e..2262197cf 100644
--- a/loleaflet/src/control/Control.Toolbar.js
+++ b/loleaflet/src/control/Control.Toolbar.js
@@ -362,6 +362,9 @@ function onClick(e, id, item, subItem) {
 	else if (id === 'link') {
 		map.showHyperlinkDialog();
 	}
+	else if (id === 'languagecode') {
+		map.fire('languagedialog');
+	}
 	else {
 		map.handleSigningClickEvent(id, item); // this handles a bunch of signing bar click events
 	}
@@ -799,6 +802,7 @@ function initNormalToolbar() {
 				}
 			}, mobile: false},
 		{type: 'break', id: 'breakstyles', mobile: false, tablet: false },
+		{type: 'button', id: 'languagecode', desktop: false, mobile: true, tablet: false},
 		{type: 'button',  id: 'bold',  img: 'bold', hint: _UNO('.uno:Bold'), uno: 'Bold'},
 		{type: 'button',  id: 'italic', img: 'italic', hint: _UNO('.uno:Italic'), uno: 'Italic'},
 		{type: 'button',  id: 'underline',  img: 'underline', hint: _UNO('.uno:Underline'), uno: 'Underline'},
@@ -1734,7 +1738,17 @@ function onCommandStateChanged(e) {
 		}
 	}
 	else if (commandName === '.uno:LanguageStatus') {
-		statusbar.set('LanguageStatus', {text: _(state), selected: state});
+		var code = state;
+		var language = _(state);
+
+		var split = code.split(';');
+		if (split.length > 1) {
+			language = _(split[0]);
+			code = split[1];
+		}
+
+		updateToolbarItem(statusbar, 'LanguageStatus', $('#LanguageStatus').html(language).parent().html());
+		w2ui['editbar'].set('languagecode', {text: code});
 	}
 	else if (commandName === '.uno:ModifiedStatus') {
 		if (e.state === 'true') {
diff --git a/loleaflet/src/main.js b/loleaflet/src/main.js
index 7c9d7e944..0a66fe684 100644
--- a/loleaflet/src/main.js
+++ b/loleaflet/src/main.js
@@ -87,6 +87,7 @@ setupToolbar(map);
 map.addControl(L.control.scroll());
 map.addControl(L.control.alertDialog());
 map.addControl(L.control.mobileWizard());
+map.addControl(L.control.languageDialog());
 map.dialog = L.control.lokDialog();
 map.addControl(map.dialog);
 map.addControl(L.control.contextMenu());
commit fd787b7a51b12b034bea85ae29623deac272b8d5
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Jul 18 10:30:18 2019 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Sun Nov 3 17:50:02 2019 +0100

    Add HideNote item to the Calc context menu
    
    Change-Id: I0dade45c8bc3e5b22d092429f14482f07d00920c

diff --git a/loleaflet/src/control/Control.ContextMenu.js b/loleaflet/src/control/Control.ContextMenu.js
index 08990fb24..bd5e3c400 100644
--- a/loleaflet/src/control/Control.ContextMenu.js
+++ b/loleaflet/src/control/Control.ContextMenu.js
@@ -95,6 +95,8 @@ L.Control.ContextMenu = L.Control.extend({
 					callback: function(key) {
 						if (map.getDocType() == 'spreadsheet' && key == '.uno:ShowNote') {
 							map._docLayer.showAnnotationFromCurrentCell();
+						} else if (map.getDocType() == 'spreadsheet' && key == '.uno:HideNote') {
+							map._docLayer.hideAnnotationFromCurrentCell();
 						} else if (!map._clip.filterExecCopyPaste(key)) {
 							map.sendUnoCommand(key);
 							// Give the stolen focus back to map
@@ -139,6 +141,11 @@ L.Control.ContextMenu = L.Control.extend({
 					continue;
 				}
 
+				if (this._map.getDocType() == 'spreadsheet' && commandName == 'ShowNote') {
+					if (this._map._docLayer.isCurrentCellCommentShown())
+						item.command = '.uno:HideNote';
+				}
+
 				// Get the translated text associated with the command
 				itemName = _UNO(item.command, docType, true);
 
diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js b/loleaflet/src/layer/tile/CalcTileLayer.js
index 6a932d4ed..5fb97350a 100644
--- a/loleaflet/src/layer/tile/CalcTileLayer.js
+++ b/loleaflet/src/layer/tile/CalcTileLayer.js
@@ -320,6 +320,17 @@ L.CalcTileLayer = L.TileLayer.extend({
 		annotation.focus();
 	},
 
+	isCurrentCellCommentShown: function () {
+		var annotations = this._annotations[this._selectedPart];
+		for (var key in annotations) {
+			var annotation = annotations[key]._annotation;
+			if (this._cellCursor.contains(annotation._data.cellPos)) {
+				return this._map.hasLayer(annotation) && annotation.isVisible();
+			}
+		}
+		return false;
+	},
+
 	showAnnotationFromCurrentCell: function() {
 		var annotations = this._annotations[this._selectedPart];
 		for (var key in annotations) {
@@ -331,6 +342,17 @@ L.CalcTileLayer = L.TileLayer.extend({
 		}
 	},
 
+	hideAnnotationFromCurrentCell: function() {
+		var annotations = this._annotations[this._selectedPart];
+		for (var key in annotations) {
+			var annotation = annotations[key]._annotation;
+			if (this._cellCursor.contains(annotation._data.cellPos)) {
+				annotation.hide();
+				this._map.removeLayer(annotation);
+			}
+		}
+	},
+
 	showAnnotation: function (annotation) {
 		this._map.addLayer(annotation);
 	},
commit 8e466032ee678a49578737bca8a1b68825a407b7
Author:     Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Tue Jul 16 18:22:59 2019 +0200
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Sun Nov 3 17:49:50 2019 +0100

    Add Show/Delete Comment to the context menu in Calc
    
    Change-Id: I14afbd5c6947279c68e3c778d019a5a2cea82541

diff --git a/loleaflet/src/control/Control.ContextMenu.js b/loleaflet/src/control/Control.ContextMenu.js
index 5e61f91bd..08990fb24 100644
--- a/loleaflet/src/control/Control.ContextMenu.js
+++ b/loleaflet/src/control/Control.ContextMenu.js
@@ -38,7 +38,8 @@ L.Control.ContextMenu = L.Control.extend({
 				   'UpdateCurIndex','RemoveTableOf',
 				   'ReplyComment', 'DeleteComment', 'DeleteAuthor', 'DeleteAllNotes'],
 
-			spreadsheet: ['MergeCells', 'SplitCell', 'RecalcPivotTable', 'FormatCellDialog'],
+			spreadsheet: ['MergeCells', 'SplitCell', 'RecalcPivotTable', 'FormatCellDialog',
+						  'ShowNote', 'DeleteNote'],
 
 			presentation: [],
 			drawing: []
@@ -92,10 +93,13 @@ L.Control.ContextMenu = L.Control.extend({
 			build: function() {
 				return {
 					callback: function(key) {
-						if (!map._clip.filterExecCopyPaste(key))
+						if (map.getDocType() == 'spreadsheet' && key == '.uno:ShowNote') {
+							map._docLayer.showAnnotationFromCurrentCell();
+						} else if (!map._clip.filterExecCopyPaste(key)) {
 							map.sendUnoCommand(key);
-						// Give the stolen focus back to map
-						map.focus();
+							// Give the stolen focus back to map
+							map.focus();
+						}
 					},
 					items: contextMenu
 				};
diff --git a/loleaflet/src/layer/marker/Annotation.js b/loleaflet/src/layer/marker/Annotation.js
index 065585eda..d9ccfdbf9 100644
--- a/loleaflet/src/layer/marker/Annotation.js
+++ b/loleaflet/src/layer/marker/Annotation.js
@@ -313,6 +313,9 @@ L.Annotation = L.Layer.extend({
 		if (L.DomUtil.hasClass(target, 'loleaflet-annotation-menu') || L.DomUtil.hasClass(target, 'loleaflet-annotation-menu-redline')) {
 			$(target).contextMenu();
 			return;
+		} else if ((window.mode.isMobile() || window.mode.isTablet())
+			&& this._map.getDocType() == 'spreadsheet') {
+			this.hide();
 		}
 		L.DomEvent.stopPropagation(e);
 		this._map.fire('AnnotationClick', {annotation: this});
diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js b/loleaflet/src/layer/tile/CalcTileLayer.js
index 1329183f5..6a932d4ed 100644
--- a/loleaflet/src/layer/tile/CalcTileLayer.js
+++ b/loleaflet/src/layer/tile/CalcTileLayer.js
@@ -320,6 +320,17 @@ L.CalcTileLayer = L.TileLayer.extend({
 		annotation.focus();
 	},
 
+	showAnnotationFromCurrentCell: function() {
+		var annotations = this._annotations[this._selectedPart];
+		for (var key in annotations) {
+			var annotation = annotations[key]._annotation;
+			if (this._cellCursor.contains(annotation._data.cellPos)) {
+				this._map.addLayer(annotation);
+				annotation.show();
+			}
+		}
+	},
+
 	showAnnotation: function (annotation) {
 		this._map.addLayer(annotation);
 	},
diff --git a/loleaflet/src/unocommands.js b/loleaflet/src/unocommands.js
index 6622a9a9b..ed094f3b9 100644
--- a/loleaflet/src/unocommands.js
+++ b/loleaflet/src/unocommands.js
@@ -60,6 +60,7 @@ var unoCommandsArray = {
 	DeleteColumnbreak:{spreadsheet:{menu:_('~Column Break'),},},
 	DeleteColumns:{presentation:{menu:_('Delete Column'),},spreadsheet:{menu:_('Delete Columns'),},text:{menu:_('~Columns'),},},
 	DeleteComment:{global:{menu:_('Delete Comment'),},},
+	DeleteNote:{spreadsheet:{menu:_('Delete Comment'),},},
 	DeleteRowbreak:{spreadsheet:{menu:_('~Row Break'),},},
 	DeleteRows:{presentation:{menu:_('Delete Row'),},spreadsheet:{menu:_('Delete Rows'),},text:{menu:_('~Rows'),},},
 	DeleteSlide:{presentation:{menu:_('~Delete Slide'),},},
@@ -97,6 +98,7 @@ var unoCommandsArray = {
 	Hide:{spreadsheet:{menu:_('~Hide Sheet'),},},
 	HideColumn:{spreadsheet:{context:_('H~ide Columns'),menu:_('~Hide'),},},
 	HideDetail:{global:{menu:_('~Hide Details'),},},
+	HideNote:{spreadsheet:{menu:_('Hide Comment'),},},
 	HideRow:{spreadsheet:{context:_('H~ide Rows'),menu:_('H~ide'),},},
 	HyperlinkDialog:{global:{context:_('Insert Hyperlink'),menu:_('~Hyperlink...'),},},
 	IconSetFormatDialog:{spreadsheet:{menu:_('Icon Set...'),},},
@@ -218,6 +220,7 @@ var unoCommandsArray = {
 	Show:{spreadsheet:{menu:_('~Show Sheet...'),},},
 	ShowColumn:{spreadsheet:{context:_('S~how Columns'),menu:_('~Show'),},},
 	ShowDetail:{global:{menu:_('~Show Details'),},},
+	ShowNote:{spreadsheet:{menu:_('Show Comment'),},},
 	ShowResolvedAnnotations:{text:{menu:_('Resolved Comments'),},},
 	ShowRow:{spreadsheet:{context:_('Sho~w Rows'),menu:_('~Show'),},},
 	ShowTrackedChanges:{text:{menu:_('~Show'),},},


More information about the Libreoffice-commits mailing list