mediawiki-extensions-Visual.../modules/ve/ui/tools/ve.ui.AnnotationButtonTool.js
Rob Moen 7be9f92de7 re: AnnotationSet, annotationButtonTool properly clears annotation.
Surface model annotate method previously cleared basic tool annotation objects.
Now that bold and other annotations have htmlAttributes from parsoid,
we must gather annotations by type from selection and iterate through
to properly clear.

Change-Id: Id53bf5733078524ae5aac376e01b9679eb8c32df
2012-09-24 14:58:55 -07:00

104 lines
2.6 KiB
JavaScript

/**
* VisualEditor user interface AnnotationButtonTool class.
*
* @copyright 2011-2012 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Creates an ve.ui.AnnotationButtonTool object.
*
* @class
* @constructor
* @extends {ve.ui.ButtonTool}
* @param {ve.ui.Toolbar} toolbar
* @param {String} name
* @param title
* @param {Object} data
*/
ve.ui.AnnotationButtonTool = function VeUiAnnotationButtonTool( toolbar, name, title, data ) {
// Parent constructor
ve.ui.ButtonTool.call( this, toolbar, name, title );
// Properties
this.annotation = data.annotation;
this.inspector = data.inspector;
this.active = false;
};
/* Inheritance */
ve.inheritClass( ve.ui.AnnotationButtonTool, ve.ui.ButtonTool );
/* Methods */
ve.ui.AnnotationButtonTool.prototype.onClick = function () {
var surfaceView = this.toolbar.getSurfaceView(),
surfaceModel = surfaceView.model,
documentModel = surfaceModel.getDocument(),
selection = surfaceModel.getSelection(),
annotations,
i;
if ( this.inspector ) {
if ( selection && selection.getLength() ) {
surfaceView.contextView.openInspector( this.inspector );
}
} else {
if ( this.active ) {
// Get all annotations by type.
annotations = documentModel
.getAnnotationsFromRange( surfaceModel.getSelection() )
.getAnnotationsOfType( this.annotation.type )
.get();
// Clear each selected annotation.
for( i = 0; i < annotations.length; i++ ) {
surfaceModel.annotate( 'clear', annotations[i] );
}
} else {
// Set annotation.
surfaceModel.annotate( 'set', this.annotation );
}
}
};
ve.ui.AnnotationButtonTool.prototype.onUpdateState = function ( annotations ) {
if ( annotations.hasAnnotationOfType( this.annotation.type ) ) {
this.$.addClass( 've-ui-toolbarButtonTool-down' );
this.active = true;
} else {
this.$.removeClass( 've-ui-toolbarButtonTool-down' );
this.active = false;
}
};
/* Registration */
ve.ui.Tool.tools.bold = {
'constructor': ve.ui.AnnotationButtonTool,
'name': 'bold',
'title': ve.msg( 'visualeditor-annotationbutton-bold-tooltip' ),
'data': {
'annotation': { 'type': 'textStyle/bold' }
}
};
ve.ui.Tool.tools.italic = {
'constructor': ve.ui.AnnotationButtonTool,
'name': 'italic',
'title': ve.msg( 'visualeditor-annotationbutton-italic-tooltip' ),
'data': {
'annotation': { 'type': 'textStyle/italic' }
}
};
ve.ui.Tool.tools.link = {
'constructor': ve.ui.AnnotationButtonTool,
'name': 'link',
'title': ve.msg( 'visualeditor-annotationbutton-link-tooltip' ),
'data': {
'annotation': { 'type': 'link/WikiLink', 'data': { 'title': '' } },
'inspector': 'link'
}
};