mediawiki-extensions-Visual.../modules/ve-mw/ui/inspectors/ve.ui.MWMathInspector.js
Moriel Schottlender 53f4b2f1ea MWExtensionInspector input direction based on content
In general, the direction of the MWExtensionInspector textarea
should be dependent on the directionality of the node it is editing.

The only exceptions are <hiero> and <math> that need to have their
textarea LTR always; these two inspectors' directionality definition
is overridden in their onOpen() method.

Bug: 56779
Change-Id: Iac5c1c3bf2c61b9fa36c9588c1734c91ca4305c4
2013-11-08 11:27:02 -08:00

119 lines
3 KiB
JavaScript

/*!
* VisualEditor UserInterface MWMathInspector class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* MediaWiki math inspector.
*
* @class
* @extends ve.ui.MWExtensionInspector
*
* @constructor
* @param {ve.ui.SurfaceWindowSet} windowSet Window set this inspector is part of
* @param {Object} [config] Configuration options
*/
ve.ui.MWMathInspector = function VeUiMWMathInspector( windowSet, config ) {
// Parent constructor
ve.ui.MWExtensionInspector.call( this, windowSet, config );
this.onChangeHandler = ve.debounce( ve.bind( this.updatePreview, this ), 250 );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWMathInspector, ve.ui.MWExtensionInspector );
/* Static properties */
ve.ui.MWMathInspector.static.name = 'math';
ve.ui.MWMathInspector.static.icon = 'math';
ve.ui.MWMathInspector.static.titleMessage = 'visualeditor-mwmathinspector-title';
ve.ui.MWMathInspector.static.nodeView = ve.ce.MWMathNode;
ve.ui.MWMathInspector.static.nodeModel = ve.dm.MWMathNode;
/* Methods */
/**
* Update the math node rendering to reflect the content entered into the inspector.
*/
ve.ui.MWMathInspector.prototype.updatePreview = function () {
var newsrc = this.input.getValue();
if ( this.visible ) {
this.node.update( { 'extsrc': newsrc } );
}
};
/**
* Handle the inspector being opened.
*/
ve.ui.MWMathInspector.prototype.onOpen = function () {
var mw, surfaceModel = this.surface.getModel();
this.node = this.surface.getView().getFocusedNode();
if ( !this.node ) {
// Create a dummy node, needed for live preview
mw = {
'name': 'math',
'attrs': {},
'body': {
'extsrc': ''
}
};
surfaceModel.getFragment().collapseRangeToEnd().insertContent( [
{
'type': 'mwMath',
'attributes': {
'mw': mw
}
},
{ 'type': '/mwMath' }
] );
this.node = this.surface.getView().getFocusedNode();
}
this.input.on( 'change', this.onChangeHandler );
// Parent method
ve.ui.MWExtensionInspector.prototype.onOpen.call( this );
// Override directionality settings, inspector's input
// should always be LTR:
this.input.setRTL( false );
};
/**
* Handle the inspector being closed.
*
* @param {string} action Action that caused the window to be closed
*/
ve.ui.MWMathInspector.prototype.onClose = function ( action ) {
var newsrc = this.input.getValue(),
surfaceModel = this.surface.getModel();
if ( newsrc !== '' ) {
// Parent method
ve.ui.MWExtensionInspector.prototype.onClose.call( this, action );
} else {
// Grandparent method; we're overriding the parent behavior in this case
ve.ui.SurfaceInspector.prototype.onClose.call( this, action );
// The user tried to empty the node, remove it
surfaceModel.change( ve.dm.Transaction.newFromRemoval(
surfaceModel.getDocument(), this.node.getOuterRange()
) );
}
this.input.off( 'change', this.onChangeHandler );
};
/* Registration */
ve.ui.inspectorFactory.register( ve.ui.MWMathInspector );