mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-12-01 17:36:35 +00:00
babaa4118d
Introduction of fake selection for single focused nodes. This change specifically makes the selection much nicer in appearance for Chrome users selecting floated FocusableNodes (block images) for example. Added ve-ce-surface-highlights DOM element to contain styled highlight elements. Made adjustments to getSelectionRect to return fake selection bounds if necessary. Replaced old uses of showSelection with model.change(). Change-Id: I96e66567cdce6455ef3eb77568e72f23140448ff
78 lines
2 KiB
JavaScript
78 lines
2 KiB
JavaScript
/*!
|
|
* VisualEditor UserInterface FormatAction class.
|
|
*
|
|
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
*/
|
|
|
|
/**
|
|
* Format action.
|
|
*
|
|
* @class
|
|
* @extends ve.ui.Action
|
|
* @constructor
|
|
* @param {ve.ui.Surface} surface Surface to act on
|
|
*/
|
|
ve.ui.FormatAction = function VeUiFormatAction( surface ) {
|
|
// Parent constructor
|
|
ve.ui.Action.call( this, surface );
|
|
};
|
|
|
|
/* Inheritance */
|
|
|
|
ve.inheritClass( ve.ui.FormatAction, ve.ui.Action );
|
|
|
|
/* Static Properties */
|
|
|
|
/**
|
|
* List of allowed methods for this action.
|
|
*
|
|
* @static
|
|
* @property
|
|
*/
|
|
ve.ui.FormatAction.static.methods = ['convert'];
|
|
|
|
/* Methods */
|
|
|
|
/**
|
|
* Convert the format of content.
|
|
*
|
|
* Conversion splits and unwraps all lists and replaces content branch nodes.
|
|
*
|
|
* TODO: Refactor functionality into {ve.dm.SurfaceFragment}.
|
|
*
|
|
* @param {string} type
|
|
* @param {Object} attributes
|
|
*/
|
|
ve.ui.FormatAction.prototype.convert = function ( type, attributes ) {
|
|
var selected, i, length, contentBranch, txs,
|
|
surfaceModel = this.surface.getModel(),
|
|
selection = surfaceModel.getSelection(),
|
|
fragmentForSelection = surfaceModel.getFragment( selection, true ),
|
|
doc = surfaceModel.getDocument(),
|
|
fragments = [];
|
|
|
|
// We can't have headings or pre's in a list, so if we're trying to convert
|
|
// things that are in lists to a heading or a pre, split the list
|
|
selected = doc.selectNodes( selection, 'leaves' );
|
|
for ( i = 0, length = selected.length; i < length; i++ ) {
|
|
contentBranch = selected[i].node.isContent() ?
|
|
selected[i].node.getParent() :
|
|
selected[i].node;
|
|
|
|
fragments.push( surfaceModel.getFragment( contentBranch.getOuterRange(), true ) );
|
|
}
|
|
|
|
for ( i = 0, length = fragments.length; i < length; i++ ) {
|
|
fragments[i].isolateAndUnwrap( type );
|
|
}
|
|
selection = fragmentForSelection.getRange();
|
|
|
|
txs = ve.dm.Transaction.newFromContentBranchConversion( doc, selection, type, attributes );
|
|
surfaceModel.change( txs, selection );
|
|
};
|
|
|
|
/* Registration */
|
|
|
|
ve.ui.actionFactory.register( 'format', ve.ui.FormatAction );
|