mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-29 08:34:54 +00:00
117 lines
3 KiB
JavaScript
117 lines
3 KiB
JavaScript
|
/*!
|
||
|
* VisualEditor UserInterface LanguageInspector class.
|
||
|
*
|
||
|
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
|
||
|
* @license The MIT License (MIT); see LICENSE.txt
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Language inspector.
|
||
|
*
|
||
|
* @class
|
||
|
* @extends ve.ui.AnnotationInspector
|
||
|
*
|
||
|
* @constructor
|
||
|
* @param {ve.ui.Surface} surface
|
||
|
* @param {Object} [config] Config options
|
||
|
*/
|
||
|
ve.ui.LanguageInspector = function VeUiLanguageInspector( surface, config ) {
|
||
|
// Parent constructor
|
||
|
ve.ui.AnnotationInspector.call( this, surface, config );
|
||
|
|
||
|
this.initLang = '';
|
||
|
this.initDir = '';
|
||
|
};
|
||
|
|
||
|
/* Inheritance */
|
||
|
|
||
|
ve.inheritClass( ve.ui.LanguageInspector, ve.ui.AnnotationInspector );
|
||
|
|
||
|
/* Static properties */
|
||
|
|
||
|
ve.ui.LanguageInspector.static.icon = 'language';
|
||
|
|
||
|
ve.ui.LanguageInspector.static.titleMessage = 'visualeditor-languageinspector-title';
|
||
|
|
||
|
/**
|
||
|
* Annotation models this inspector can edit.
|
||
|
*
|
||
|
* @static
|
||
|
* @property {Function[]}
|
||
|
*/
|
||
|
ve.ui.LanguageInspector.static.modelClasses = [ ve.dm.LanguageAnnotation ];
|
||
|
|
||
|
/* Methods */
|
||
|
|
||
|
/**
|
||
|
* Handle frame ready events.
|
||
|
*
|
||
|
* @method
|
||
|
*/
|
||
|
ve.ui.LanguageInspector.prototype.initialize = function () {
|
||
|
// Parent method
|
||
|
ve.ui.AnnotationInspector.prototype.initialize.call( this );
|
||
|
|
||
|
// Properties
|
||
|
this.targetInput = new ve.ui.LanguageInputWidget( {
|
||
|
'$$': this.frame.$$, '$overlay': this.surface.$localOverlay
|
||
|
} );
|
||
|
|
||
|
// Initialization
|
||
|
this.$form.append( this.targetInput.$ );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Handle the inspector being opened.
|
||
|
*/
|
||
|
ve.ui.LanguageInspector.prototype.onOpen = function () {
|
||
|
// Parent method
|
||
|
ve.ui.AnnotationInspector.prototype.onOpen.call( this );
|
||
|
|
||
|
// Wait for animation to complete
|
||
|
setTimeout( ve.bind( function () {
|
||
|
// Setup annotation
|
||
|
this.targetInput.setAnnotation( this.initialAnnotation );
|
||
|
}, this ), 200 );
|
||
|
};
|
||
|
/**
|
||
|
* Handle the inspector being setup.
|
||
|
* Make sure the initial language and direction are set by the parent of the DOM
|
||
|
* element of the selected fragment before the rest of the onSetup method is
|
||
|
* processed by the parent ve.ui.AnnotationInspector
|
||
|
*/
|
||
|
ve.ui.LanguageInspector.prototype.onSetup = function () {
|
||
|
var fragDOM,
|
||
|
fragment = this.surface.getModel().getFragment( null, true );
|
||
|
|
||
|
// Get the fragment documentView object (the real DOM object):
|
||
|
fragDOM = this.surface.getView().documentView.getNodeFromOffset( fragment.getRange( true ).start );
|
||
|
|
||
|
// Set initial parameters according to parent of the DOM object.
|
||
|
// This will be called only if the annotation doesn't already exist, setting
|
||
|
// the default value as the current language/dir of the selected text.
|
||
|
if ( fragDOM ) {
|
||
|
this.initLang = fragDOM.$.closest('[lang]').attr('lang') || 'en';
|
||
|
this.initDir = fragDOM.$.closest('[dir]').css('direction') || 'ltr';
|
||
|
}
|
||
|
|
||
|
// Parent method
|
||
|
ve.ui.AnnotationInspector.prototype.onSetup.call( this );
|
||
|
};
|
||
|
/**
|
||
|
* @inheritdoc
|
||
|
*/
|
||
|
ve.ui.LanguageInspector.prototype.getAnnotationFromText = function () {
|
||
|
return new ve.dm.LanguageAnnotation( {
|
||
|
'type': 'language',
|
||
|
'attributes': {
|
||
|
'lang': this.initLang,
|
||
|
'dir': this.initDir
|
||
|
}
|
||
|
} );
|
||
|
};
|
||
|
|
||
|
/* Registration */
|
||
|
|
||
|
ve.ui.inspectorFactory.register( 'language', ve.ui.LanguageInspector );
|