Divec has uploaded a new change for review.
https://gerrit.wikimedia.org/r/283197
Change subject: WIP DONTMERGE: IME UI integration
......................................................................
WIP DONTMERGE: IME UI integration
Change-Id: I796fa6b5425e108f9b6b17f1b0f1579616619b6e
---
M extension.json
A lib/ve-mw/ext.ve-mw-jquery.ime.init.js
A lib/ve-mw/ve.ui.MWCommandRegistry.js
A lib/ve-mw/ve.ui.MWImeDialog.css
A lib/ve-mw/ve.ui.MWImeDialog.js
A lib/ve-mw/ve.ui.MWImeDialogTool.js
A lib/ve-mw/ve.ui.MWInputMethodDialog.css
A lib/ve-mw/ve.ui.MWInputMethodDialog.js
8 files changed, 405 insertions(+), 2 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/UniversalLanguageSelector
refs/changes/97/283197/1
diff --git a/extension.json b/extension.json
index e46c4c4..59c234f 100644
--- a/extension.json
+++ b/extension.json
@@ -282,8 +282,20 @@
"remoteExtPath": "UniversalLanguageSelector/resources"
},
"jquery.ime": {
- "scripts": "jquery.ime/jquery.ime.js",
- "styles": "jquery.ime/css/jquery.ime.css",
+ "scripts": [
+ "jquery.ime/jquery.ime.js",
+ "ve-mw/ve.ui.MWCommandRegistry.js",
+ "ve-mw/ve.ui.MWImeDialog.js",
+ "ve-mw/ve.ui.MWImeDialogTool.js",
+ "ve-mw/ve.ui.MWInputMethodDialog.js",
+ "ve-mw/ext.ve-mw-jquery.ime.init.js"
+ ],
+ "styles": [
+ "jquery.ime/css/jquery.ime.css",
+ "ve-mw/ve.ui.MWImeDialog.css",
+ "ve-mw/ve.ui.MWInputMethodDialog.css"
+ ],
+ "dependencies": "ext.visualEditor.core",
"localBasePath": "lib",
"remoteExtPath": "UniversalLanguageSelector/lib"
},
diff --git a/lib/ve-mw/ext.ve-mw-jquery.ime.init.js
b/lib/ve-mw/ext.ve-mw-jquery.ime.init.js
new file mode 100644
index 0000000..26bcdad
--- /dev/null
+++ b/lib/ve-mw/ext.ve-mw-jquery.ime.init.js
@@ -0,0 +1,52 @@
+/*!
+ * ULS startup script - MediaWiki specific customization for jquery.uls
+ *
+ * Copyright (C) 2012-2013 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon
Harris,
+ * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+ * contributors. See CREDITS for a list.
+ *
+ * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
+ * have to do anything special to choose one license or the other and you don't
+ * have to notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @file
+ * @ingroup Extensions
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $, mw ) {
+ 'use strict';
+ function veInit() {
+ // Patch IME toolbar
+ //ve.init.target.constructor.static.toolbarGroups.splice( 6, 1
);
+ ve.init.target.constructor.static.toolbarGroups.push( {
+ type: 'list',
+ classes: [ 've-test-toolbar-ime' ],
+ indicator: 'down',
+ title: OO.ui.deferMsg(
'visualeditor-toolbar-ime-tooltip' ),
+ include: [ 'specialCharacter', 'mwIme' ],
+ icon: 'keyboard'
+ } );
+ ve.init.target.setupToolbar( ve.init.target.surface );
+ }
+
+ if ( window.ve ) {
+ // Wait until ve.init.target is available
+ // TODO: get rid of this ungainly hack
+ ( function () {
+ var f = function () {
+ if ( ve.init && ve.init.target ) {
+ veInit();
+ // ve.init.target.setupToolbar(
ve.init.target.surface );
+ //
ve.init.target.constructor.static.toolbarGroups
+ } else {
+ setTimeout( f );
+ }
+ };
+ setTimeout( f );
+ } () );
+ }
+}( jQuery, mediaWiki ) );
diff --git a/lib/ve-mw/ve.ui.MWCommandRegistry.js
b/lib/ve-mw/ve.ui.MWCommandRegistry.js
new file mode 100644
index 0000000..3ad26cc
--- /dev/null
+++ b/lib/ve-mw/ve.ui.MWCommandRegistry.js
@@ -0,0 +1,14 @@
+/*!
+ * VisualEditor MediaWiki CommandRegistry registrations.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/* MW-specific overrides of core command registrations */
+
+ve.ui.commandRegistry.register(
+ new ve.ui.Command( 'mwIme', 'window', 'toggle',
+ { args: [ 'mwIme' ], supportedSelections: [ 'linear', 'table' ]
}
+ )
+);
diff --git a/lib/ve-mw/ve.ui.MWImeDialog.css b/lib/ve-mw/ve.ui.MWImeDialog.css
new file mode 100644
index 0000000..34c8b7b
--- /dev/null
+++ b/lib/ve-mw/ve.ui.MWImeDialog.css
@@ -0,0 +1,27 @@
+/*!
+ * VisualEditor UserInterface ImeDialog styles.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see
http://ve.mit-license.org
+ */
+
+.ve-ui-mwImeDialog-row {
+ display: table;
+ min-width: 30em;
+ padding-bottom: 0.3em;
+}
+
+.ve-ui-mwImeDialog-row:last-child {
+ /* Extra pixel for button shadows */
+ padding-bottom: 1px;
+}
+
+.ve-ui-mwImeDialog-cell {
+ display: table-cell;
+ vertical-align: middle;
+ white-space: nowrap;
+ padding-right: 1em;
+}
+
+.ve-ui-mwImeDialog-cell:last-child {
+ padding-right: 0;
+}
diff --git a/lib/ve-mw/ve.ui.MWImeDialog.js b/lib/ve-mw/ve.ui.MWImeDialog.js
new file mode 100644
index 0000000..8739594
--- /dev/null
+++ b/lib/ve-mw/ve.ui.MWImeDialog.js
@@ -0,0 +1,185 @@
+/*!
+ * VisualEditor UserInterface MWImeDialog class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see
http://ve.mit-license.org
+ */
+
+/**
+ * IME dialog
+ *
+ * @class
+ * @extends ve.ui.ToolbarDialog
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+ve.ui.MWImeDialog = function VeUiMWImeDialog( config ) {
+ // Parent constructor
+ ve.ui.MWImeDialog.super.call( this, config );
+
+ // Pre-initialization
+ this.$element.addClass( 've-ui-mwImeDialog' );
+};
+
+/* Inheritance */
+
+OO.inheritClass( ve.ui.MWImeDialog, ve.ui.ToolbarDialog );
+
+ve.ui.MWImeDialog.static.name = 'mwIme';
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWImeDialog.prototype.initialize = function () {
+ var languageLabel, methodLabel, closeButton;
+
+ // Parent method
+ ve.ui.MWImeDialog.super.prototype.initialize.call( this );
+
+ // Properties
+ this.surface = null;
+ this.dialogs = null;
+
+ languageLabel = new OO.ui.LabelWidget( {
+ classes: [ 've-ui-mwImeDialog-cell
ve-ui-mwImeDialog-languageLabel' ],
+ label: ve.msg(
'visualeditor-imedialog-widget-label-inputlanguage' )
+ } );
+ this.chooseLanguageButton = new OO.ui.ButtonWidget( {
+ classes: [ 've-ui-mwImeDialog-cell
ve-ui-mwImeDialog-chooseLanguageButton' ],
+ label: ve.msg( 'visualeditor-imedialog-widget-chooselanguage' ),
+ indicator: 'next'
+ } );
+ methodLabel = new OO.ui.LabelWidget( {
+ classes: [ 've-ui-mwImeDialog-cell
ve-ui-mwImeDialog-methodLabel' ],
+ label: ve.msg(
'visualeditor-imedialog-widget-label-inputmethod' )
+ } );
+ this.chooseMethodButton = new OO.ui.ButtonWidget( {
+ classes: [ 've-ui-mwImeDialog-cell
ve-ui-mwImeDialog-chooseMethodButton' ],
+ label: ve.msg( 'visualeditor-imedialog-widget-choosemethod' ),
+ indicator: 'next'
+ } );
+ closeButton = new OO.ui.ButtonWidget( {
+ classes: [ 've-ui-mwImeDialog-cell
ve-ui-mwImeDialog-closeButton' ],
+ label: ve.msg( 'visualeditor-imedialog-widget-button-close' )
+ } );
+
+ // Events
+ this.chooseLanguageButton.connect( this, { click:
'onFindLanguageButtonClick' } );
+ this.chooseMethodButton.connect( this, { click:
'onChooseMethodButtonClick' } );
+ closeButton.connect( this, { click: 'close' } );
+
+ // Initialization
+ this.$body.append(
+ $( '<div>' ).addClass( 've-ui-mwImeDialog-row' )
+ .append(
+ languageLabel.$element,
+ this.chooseLanguageButton.$element,
+ methodLabel.$element,
+ this.chooseMethodButton.$element,
+ closeButton.$element
+ )
+ );
+};
+
+ve.ui.MWImeDialog.prototype.onFindLanguageButtonClick = function () {
+ var imeDialog = this;
+ this.dialogs.openWindow(
+ 'languageSearch',
+ { availableLanguages: this.ime.getLanguageCodes() }
+ ).then( function ( opened ) {
+ opened.then( function ( closing ) {
+ closing.then( function ( data ) {
+ data = data || {};
+ if ( data.action === 'apply' ) {
+ imeDialog.setLangCode( data.lang );
+ }
+ } );
+ } );
+ } );
+};
+
+ve.ui.MWImeDialog.prototype.setLangCode = function ( lang ) {
+ var imeDialog = this;
+ this.ime.setLanguage( lang );
+ imeDialog.onChooseMethodButtonClick();
+};
+
+ve.ui.MWImeDialog.prototype.onChooseMethodButtonClick = function () {
+ var imeDialog = this,
+ inputMethods = this.ime.getInputMethods( this.ime.getLanguage()
);
+ this.dialogs.openWindow(
+ 'mwInputMethods',
+ { inputMethods: inputMethods }
+ ).then( function ( opened ) {
+ opened.then( function ( closing ) {
+ closing.then( function ( data ) {
+ data = data || {};
+ if ( data.action === 'apply' ) {
+ imeDialog.ime.load( data.id ).done(
function () {
+ imeDialog.ime.setIM( data.id );
+ } );
+ }
+ } );
+ } );
+ } );
+};
+
+ve.ui.MWImeDialog.prototype.onImeLanguageChange = function () {
+ var lang = this.ime.getLanguage();
+ if ( lang ) {
+ this.chooseLanguageButton.setLabel( this.ime.getAutonym( lang )
);
+ this.chooseMethodButton.setDisabled( false );
+ } else {
+ this.chooseLanguageButton.setLabel(
+ ve.msg( 'visualeditor-imedialog-widget-chooselanguage' )
+ );
+ this.chooseMethodButton.setDisabled( true );
+ }
+ this.onImeMethodChange();
+};
+
+ve.ui.MWImeDialog.prototype.onImeMethodChange = function () {
+ var inputMethod = this.ime.getIM();
+ this.chooseMethodButton.setLabel(
+ inputMethod ?
+ this.ime.getInputMethodName( inputMethod.id ) :
+ ve.msg( 'visualeditor-imedialog-widget-choosemethod' )
+ );
+};
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWImeDialog.prototype.getSetupProcess = function ( data ) {
+ var imeDialog = this;
+ data = data || {};
+ return ve.ui.MWImeDialog.super.prototype.getSetupProcess.call( this,
data )
+ .first( function () {
+ this.surface = data.surface;
+ this.dialogs = this.surface.getDialogs();
+ this.$doc =
this.surface.view.documentView.getDocumentNode().$element;
+ this.ime = this.$doc.data( 'ime' );
+ this.$doc.on( 'imeLanguageChange',
imeDialog.onImeLanguageChange.bind( imeDialog ) );
+ this.$doc.on( 'imeMethodChange',
imeDialog.onImeMethodChange.bind( imeDialog ) );
+ imeDialog.onImeLanguageChange();
+ imeDialog.onImeMethodChange();
+ this.ime.enable();
+ }, this );
+};
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWImeDialog.prototype.getTeardownProcess = function ( data ) {
+ // Cannot use this.ime.disable(), because it unsets the IM
+ this.ime.toggle();
+ this.$element.off( 'imeMethodChange' );
+ this.$element.off( 'imeLanguageChange' );
+ return ve.ui.MWImeDialog.super.prototype.getTeardownProcess.call( this,
data );
+};
+
+/* Registration */
+
+ve.ui.windowFactory.register( ve.ui.MWImeDialog );
diff --git a/lib/ve-mw/ve.ui.MWImeDialogTool.js
b/lib/ve-mw/ve.ui.MWImeDialogTool.js
new file mode 100644
index 0000000..61ad435
--- /dev/null
+++ b/lib/ve-mw/ve.ui.MWImeDialogTool.js
@@ -0,0 +1,21 @@
+/**
+ * IME tool.
+ *
+ * @class
+ * @extends ve.ui.ToolbarDialogTool
+ * @constructor
+ * @param {OO.ui.ToolGroup} toolGroup
+ * @param {Object} [config] Configuration options
+ */
+ve.ui.MWImeDialogTool = function VeUiMWImeDialogTool() {
+ ve.ui.MWImeDialogTool.super.apply( this, arguments );
+};
+OO.inheritClass( ve.ui.MWImeDialogTool, ve.ui.ToolbarDialogTool );
+ve.ui.MWImeDialogTool.static.name = 'mwIme';
+ve.ui.MWImeDialogTool.static.group = 'dialog';
+ve.ui.MWImeDialogTool.static.icon = 'keyboard';
+ve.ui.MWImeDialogTool.static.title = OO.ui.deferMsg(
'visualeditor-ime-button-tooltip' );
+ve.ui.MWImeDialogTool.static.autoAddToCatchall = false;
+ve.ui.MWImeDialogTool.static.autoAddToGroup = false;
+ve.ui.MWImeDialogTool.static.commandName = 'mwIme';
+ve.ui.toolFactory.register( ve.ui.MWImeDialogTool );
diff --git a/lib/ve-mw/ve.ui.MWInputMethodDialog.css
b/lib/ve-mw/ve.ui.MWInputMethodDialog.css
new file mode 100644
index 0000000..3bee8dd
--- /dev/null
+++ b/lib/ve-mw/ve.ui.MWInputMethodDialog.css
@@ -0,0 +1,5 @@
+/*!
+ * VisualEditor UserInterface InputMethodDialog styles.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see
http://ve.mit-license.org
+ */
diff --git a/lib/ve-mw/ve.ui.MWInputMethodDialog.js
b/lib/ve-mw/ve.ui.MWInputMethodDialog.js
new file mode 100644
index 0000000..98419c3
--- /dev/null
+++ b/lib/ve-mw/ve.ui.MWInputMethodDialog.js
@@ -0,0 +1,87 @@
+/*!
+ * VisualEditor UserInterface MWInputMethodDialog class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see
http://ve.mit-license.org
+ */
+
+/**
+ * Dialog for searching for and selecting an input method for a language.
+ *
+ * @class
+ * @extends OO.ui.ProcessDialog
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+ve.ui.MWInputMethodDialog = function VeUiMWInputMethodDialog( config ) {
+ // Parent constructor
+ ve.ui.MWInputMethodDialog.super.call( this, config );
+};
+
+/* Inheritance */
+
+OO.inheritClass( ve.ui.MWInputMethodDialog, OO.ui.ProcessDialog );
+
+/* Static Properties */
+
+ve.ui.MWInputMethodDialog.static.name = 'mwInputMethods';
+
+ve.ui.MWInputMethodDialog.static.size = 'medium';
+
+ve.ui.MWInputMethodDialog.static.title =
+ OO.ui.deferMsg( 'visualeditor-inputmethodsdialog-input-methods-title' );
+
+ve.ui.MWInputMethodDialog.static.actions = [
+ {
+ label: OO.ui.deferMsg( 'visualeditor-dialog-action-cancel' ),
+ flags: [ 'back' ]
+ }
+];
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWInputMethodDialog.prototype.initialize = function () {
+ ve.ui.MWInputMethodDialog.super.prototype.initialize.apply( this,
arguments );
+ this.methodSelect = new OO.ui.SelectWidget( {
+ label: 'Select input method',
+ menu: { items: [] }
+ } );
+ this.$body.append( this.methodSelect.$element );
+};
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWInputMethodDialog.prototype.getSetupProcess = function ( data ) {
+ var inputMethods;
+ data = data || {};
+ inputMethods = data.inputMethods || [];
+
+ this.methodSelect.clearItems();
+ this.methodSelect.addItems( inputMethods.map( function ( inputMethod ) {
+ return new OO.ui.MenuOptionWidget( {
+ data: inputMethod.id,
+ label: inputMethod.name
+ } );
+ } ) );
+ this.methodSelect.connect( this, { choose: 'onMethodSelectChoose' } );
+ return ve.ui.MWInputMethodDialog.super.prototype.getSetupProcess.call(
this, data );
+};
+
+ve.ui.MWInputMethodDialog.prototype.onMethodSelectChoose = function ( item ) {
+ this.close( { action: 'apply', id: item.getData() } );
+};
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWInputMethodDialog.prototype.getBodyHeight = function () {
+ return 200;
+};
+
+/* Registration */
+
+ve.ui.windowFactory.register( ve.ui.MWInputMethodDialog );
--
To view, visit https://gerrit.wikimedia.org/r/283197
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I796fa6b5425e108f9b6b17f1b0f1579616619b6e
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/UniversalLanguageSelector
Gerrit-Branch: master
Gerrit-Owner: Divec <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits