Esanders has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/343040 )

Change subject: Add tool to change directionality of document view
......................................................................

Add tool to change directionality of document view

This is apparently useful for editors of bidi documents, especially
in source mode. Toggling the viewed direction does not affect the
document model in any way.

Bug: T153356
Change-Id: I1e3d89e8250b75d0b6992cf4664e84de66d99bc0
---
M build/modules.json
M demos/ve/desktop.html
M demos/ve/mobile.html
M i18n/en.json
M i18n/qqq.json
M src/ce/ve.ce.Document.js
M src/init/sa/ve.init.sa.Target.js
M src/ui/actions/ve.ui.ContentAction.js
A src/ui/tools/ve.ui.ChangeDirectionalityTool.js
M src/ui/ve.ui.CommandHelpRegistry.js
M src/ui/ve.ui.CommandRegistry.js
M src/ui/ve.ui.TriggerRegistry.js
M tests/index.html
13 files changed, 144 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/40/343040/1

diff --git a/build/modules.json b/build/modules.json
index 4eca486..62a8dfe 100644
--- a/build/modules.json
+++ b/build/modules.json
@@ -532,6 +532,7 @@
                        "src/ui/widgets/ve.ui.NoFocusButtonWidget.js",
                        
"src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js",
                        "src/ui/tools/ve.ui.AnnotationTool.js",
+                       "src/ui/tools/ve.ui.ChangeDirectionalityTool.js",
                        "src/ui/tools/ve.ui.ClearAnnotationTool.js",
                        "src/ui/tools/ve.ui.WindowTool.js",
                        "src/ui/tools/ve.ui.FragmentWindowTool.js",
diff --git a/demos/ve/desktop.html b/demos/ve/desktop.html
index f90c840..684a76f 100644
--- a/demos/ve/desktop.html
+++ b/demos/ve/desktop.html
@@ -470,6 +470,7 @@
                <script 
src="../../src/ui/widgets/ve.ui.NoFocusButtonWidget.js"></script>
                <script 
src="../../src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js"></script>
                <script 
src="../../src/ui/tools/ve.ui.AnnotationTool.js"></script>
+               <script 
src="../../src/ui/tools/ve.ui.ChangeDirectionalityTool.js"></script>
                <script 
src="../../src/ui/tools/ve.ui.ClearAnnotationTool.js"></script>
                <script src="../../src/ui/tools/ve.ui.WindowTool.js"></script>
                <script 
src="../../src/ui/tools/ve.ui.FragmentWindowTool.js"></script>
diff --git a/demos/ve/mobile.html b/demos/ve/mobile.html
index 116eaab..f5da8a3 100644
--- a/demos/ve/mobile.html
+++ b/demos/ve/mobile.html
@@ -470,6 +470,7 @@
                <script 
src="../../src/ui/widgets/ve.ui.NoFocusButtonWidget.js"></script>
                <script 
src="../../src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js"></script>
                <script 
src="../../src/ui/tools/ve.ui.AnnotationTool.js"></script>
+               <script 
src="../../src/ui/tools/ve.ui.ChangeDirectionalityTool.js"></script>
                <script 
src="../../src/ui/tools/ve.ui.ClearAnnotationTool.js"></script>
                <script src="../../src/ui/tools/ve.ui.WindowTool.js"></script>
                <script 
src="../../src/ui/tools/ve.ui.FragmentWindowTool.js"></script>
diff --git a/i18n/en.json b/i18n/en.json
index aaef04d..86073e8 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -43,6 +43,9 @@
        "visualeditor-changedesc-set": "$1 set to $2",
        "visualeditor-changedesc-unknown": "$1 changed",
        "visualeditor-changedesc-unset": "$1 unset from $2",
+       "visualeditor-changedir": "Change directionality",
+       "visualeditor-changedir-tool-ltr": "View as left-to-right",
+       "visualeditor-changedir-tool-rtl": "View as right-to-left",
        "visualeditor-clearbutton-tooltip": "Clear styling",
        "visualeditor-clipboard-copy": "Copy",
        "visualeditor-clipboard-cut": "Cut",
diff --git a/i18n/qqq.json b/i18n/qqq.json
index f693ab6..4717906 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -51,6 +51,9 @@
        "visualeditor-changedesc-set": "Fallback description of an attribute 
value being set for visual diffing, if no specific i18n exists for that kind of 
change.\n\nValues:\n* $1 – Attribute name, like 'lang' or 'dir'\n* $2 – New 
attribute value, like 'fa' or 'auto'",
        "visualeditor-changedesc-unknown": "Fallback description of an 
attribute value change for visual diffing which can't be otherwise described, 
if no specific i18n exists for that kind of change.\n\nValues:\n* $1 – 
Attribute name, like 'lang' or 'dir'",
        "visualeditor-changedesc-unset": "Fallback description of an attribute 
value being unset for visual diffing, if no specific i18n exists for that kind 
of change.\n\nValues:\n* $1 – Attribute name, like 'lang' or 'dir'\n* $2 – 
Previous attribute value, like 'ar' or 'rtl'",
+       "visualeditor-changedir": "Label for tool to change directionality",
+       "visualeditor-changedir-tool-ltr": "Label for tool to change rendered 
directionality to LTR",
+       "visualeditor-changedir-tool-rtl": "Label for tool to change rendered 
directionality to RTL",
        "visualeditor-clearbutton-tooltip": "Tooltip text for the clear styling 
button. This clears \"styling\" like bold or italics from the current 
selection, but not \"formatting\" like being a list, a heading or a table.",
        "visualeditor-clipboard-copy": "Label for copy 
command.\n{{Identical|Copy}}",
        "visualeditor-clipboard-cut": "Label for cut 
command.\n{{Identical|Cut}}",
diff --git a/src/ce/ve.ce.Document.js b/src/ce/ve.ce.Document.js
index 7278b95..6897325 100644
--- a/src/ce/ve.ce.Document.js
+++ b/src/ce/ve.ce.Document.js
@@ -18,10 +18,11 @@
        // Parent constructor
        ve.ce.Document.super.call( this, new ve.ce.DocumentNode( 
model.getDocumentNode(), surface ) );
 
-       this.getDocumentNode().$element.prop( {
-               lang: model.getLang(),
-               dir: model.getDir()
-       } );
+       this.lang = null;
+       this.dir = null;
+
+       this.setLang( model.getLang() );
+       this.setDir( model.getDir() );
 
        // Properties
        this.model = model;
@@ -34,6 +35,44 @@
 /* Methods */
 
 /**
+ * Set the document view language
+ *
+ * @param {string} lang Language code
+ */
+ve.ce.Document.prototype.setLang = function ( lang ) {
+       this.getDocumentNode().$element.prop( 'lang', lang );
+       this.lang = lang;
+};
+
+/**
+ * Set the document view directionality
+ *
+ * @param {string} dir Directionality (ltr/rtl)
+ */
+ve.ce.Document.prototype.setDir = function ( dir ) {
+       this.getDocumentNode().$element.prop( 'dir', dir );
+       this.dir = dir;
+};
+
+/**
+ * Get the document view language
+ *
+ * @return {string} Language code
+ */
+ve.ce.Document.prototype.getLang = function () {
+       return this.lang;
+};
+
+/**
+ * Get the document view directionality
+ *
+ * @return {string} Directionality (ltr/rtl)
+ */
+ve.ce.Document.prototype.getDir = function () {
+       return this.dir;
+};
+
+/**
  * Get a slug at an offset.
  *
  * @method
diff --git a/src/init/sa/ve.init.sa.Target.js b/src/init/sa/ve.init.sa.Target.js
index 6eee832..fca8bec 100644
--- a/src/init/sa/ve.init.sa.Target.js
+++ b/src/init/sa/ve.init.sa.Target.js
@@ -52,7 +52,7 @@
                icon: 'menu',
                indicator: null,
                title: OO.ui.deferMsg( 'visualeditor-pagemenu-tooltip' ),
-               include: [ 'findAndReplace', 'commandHelp' ]
+               include: [ 'findAndReplace', 'changeDirectionality', 
'commandHelp' ]
        }
 ];
 
diff --git a/src/ui/actions/ve.ui.ContentAction.js 
b/src/ui/actions/ve.ui.ContentAction.js
index 1747835..ccc458e 100644
--- a/src/ui/actions/ve.ui.ContentAction.js
+++ b/src/ui/actions/ve.ui.ContentAction.js
@@ -32,7 +32,7 @@
  * @static
  * @property
  */
-ve.ui.ContentAction.static.methods = [ 'insert', 'remove', 'select', 
'pasteSpecial', 'selectAll' ];
+ve.ui.ContentAction.static.methods = [ 'insert', 'remove', 'select', 
'pasteSpecial', 'selectAll', 'changeDirectionality' ];
 
 /* Methods */
 
@@ -100,6 +100,19 @@
        return false;
 };
 
+/**
+ * Change directionality
+ *
+ * @method
+ * @return {boolean} Action was executed
+ */
+ve.ui.ContentAction.prototype.changeDirectionality = function () {
+       var documentView = this.surface.getView().getDocument();
+       documentView.setDir( documentView.getDir() === 'ltr' ? 'rtl' : 'ltr' );
+       this.surface.getModel().emit( 'contextChange' );
+       return true;
+};
+
 /* Registration */
 
 ve.ui.actionFactory.register( ve.ui.ContentAction );
diff --git a/src/ui/tools/ve.ui.ChangeDirectionalityTool.js 
b/src/ui/tools/ve.ui.ChangeDirectionalityTool.js
new file mode 100644
index 0000000..7972402
--- /dev/null
+++ b/src/ui/tools/ve.ui.ChangeDirectionalityTool.js
@@ -0,0 +1,67 @@
+/*!
+ * VisualEditor UserInterface ChangeDirectionalityTool class.
+ *
+ * @copyright 2011-2017 VisualEditor Team and others; see 
http://ve.mit-license.org
+ */
+
+/**
+ * UserInterface change view directionality tool.
+ *
+ * @class
+ * @extends ve.ui.Tool
+ * @constructor
+ * @param {OO.ui.ToolGroup} toolGroup
+ * @param {Object} [config] Configuration options
+ */
+ve.ui.ChangeDirectionalityTool = function VeUiChangeDirectionalityTool() {
+       // Parent constructor
+       ve.ui.ChangeDirectionalityTool.super.apply( this, arguments );
+
+       this.modelDir = null;
+
+       this.setDisabled( false );
+};
+
+/* Inheritance */
+
+OO.inheritClass( ve.ui.ChangeDirectionalityTool, ve.ui.Tool );
+
+/* Static Properties */
+
+ve.ui.ChangeDirectionalityTool.static.name = 'changeDirectionality';
+
+ve.ui.ChangeDirectionalityTool.static.icon = 'textDirRTL';
+
+ve.ui.ChangeDirectionalityTool.static.title =
+       OO.ui.deferMsg( 'visualeditor-changedir-rtl' );
+
+ve.ui.ChangeDirectionalityTool.static.commandName = 'changeDirectionality';
+
+ve.ui.ChangeDirectionalityTool.static.deactivateOnSelect = false;
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+ve.ui.ChangeDirectionalityTool.prototype.onUpdateState = function ( fragment ) 
{
+       var viewDir = 
this.toolbar.getSurface().getView().getDocument().getDir(),
+               modelDir = fragment.getDocument().getDir();
+
+       // Parent method
+       ve.ui.ChangeDirectionalityTool.super.prototype.onUpdateState.apply( 
this, arguments );
+
+       if ( modelDir !== this.modelDir ) {
+               // Icons used here textDirLTR, textDirRTL
+               this.setIcon( 'textDir' + ( modelDir === 'ltr' ? 'RTL' : 'LTR' 
) );
+               // Messages used here: visualeditor-changedir-tool-ltr, 
visualeditor-changedir-tool-rtl
+               this.setTitle( ve.msg( 'visualeditor-changedir-tool-' + ( 
modelDir === 'ltr' ? 'rtl' : 'ltr' ) ) );
+               this.modelDir = modelDir;
+       }
+
+       this.setActive( viewDir !== modelDir );
+};
+
+/* Registration */
+
+ve.ui.toolFactory.register( ve.ui.ChangeDirectionalityTool );
diff --git a/src/ui/ve.ui.CommandHelpRegistry.js 
b/src/ui/ve.ui.CommandHelpRegistry.js
index 2a86a9a..58ad06e 100644
--- a/src/ui/ve.ui.CommandHelpRegistry.js
+++ b/src/ui/ve.ui.CommandHelpRegistry.js
@@ -151,4 +151,5 @@
 ve.ui.commandHelpRegistry.register( 'other', 'findNext', { trigger: 
'findNext', label: OO.ui.deferMsg( 'visualeditor-find-and-replace-next-button' 
) } );
 ve.ui.commandHelpRegistry.register( 'other', 'findPrevious', { trigger: 
'findPrevious', label: OO.ui.deferMsg( 
'visualeditor-find-and-replace-previous-button' ) } );
 ve.ui.commandHelpRegistry.register( 'other', 'selectAll', { trigger: 
'selectAll', label: OO.ui.deferMsg( 'visualeditor-content-select-all' ) } );
+ve.ui.commandHelpRegistry.register( 'other', 'changeDirectionality', { 
trigger: 'changeDirectionality', label: OO.ui.deferMsg( 
'visualeditor-changedir' ) } );
 ve.ui.commandHelpRegistry.register( 'other', 'commandHelp', { trigger: 
'commandHelp', label: OO.ui.deferMsg( 'visualeditor-dialog-command-help-title' 
) } );
diff --git a/src/ui/ve.ui.CommandRegistry.js b/src/ui/ve.ui.CommandRegistry.js
index 77d1727..759d693 100644
--- a/src/ui/ve.ui.CommandRegistry.js
+++ b/src/ui/ve.ui.CommandRegistry.js
@@ -190,6 +190,11 @@
 );
 ve.ui.commandRegistry.register(
        new ve.ui.Command(
+               'changeDirectionality', 'content', 'changeDirectionality'
+       )
+);
+ve.ui.commandRegistry.register(
+       new ve.ui.Command(
                'language', 'window', 'open',
                { args: [ 'language' ], supportedSelections: [ 'linear' ] }
        )
diff --git a/src/ui/ve.ui.TriggerRegistry.js b/src/ui/ve.ui.TriggerRegistry.js
index 5415059..f5cb521 100644
--- a/src/ui/ve.ui.TriggerRegistry.js
+++ b/src/ui/ve.ui.TriggerRegistry.js
@@ -207,6 +207,9 @@
        'findAndReplace', { mac: new ve.ui.Trigger( 'cmd+f' ), pc: new 
ve.ui.Trigger( 'ctrl+f' ) }
 );
 ve.ui.triggerRegistry.register(
+       'changeDirectionality', { mac: new ve.ui.Trigger( 'cmd+shift+x' ), pc: 
new ve.ui.Trigger( 'ctrl+shift+x' ) }
+);
+ve.ui.triggerRegistry.register(
        'findNext', {
                mac: new ve.ui.Trigger( 'cmd+g' ),
                pc: [
diff --git a/tests/index.html b/tests/index.html
index 6f99cb9..ec9c3fe 100644
--- a/tests/index.html
+++ b/tests/index.html
@@ -389,6 +389,7 @@
                <script 
src="../src/ui/widgets/ve.ui.NoFocusButtonWidget.js"></script>
                <script 
src="../src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js"></script>
                <script src="../src/ui/tools/ve.ui.AnnotationTool.js"></script>
+               <script 
src="../src/ui/tools/ve.ui.ChangeDirectionalityTool.js"></script>
                <script 
src="../src/ui/tools/ve.ui.ClearAnnotationTool.js"></script>
                <script src="../src/ui/tools/ve.ui.WindowTool.js"></script>
                <script 
src="../src/ui/tools/ve.ui.FragmentWindowTool.js"></script>

-- 
To view, visit https://gerrit.wikimedia.org/r/343040
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1e3d89e8250b75d0b6992cf4664e84de66d99bc0
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <esand...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to