mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-29 08:34:54 +00:00
1572ec1569
This is a major refactor of user interface context, frame, dialog and inspector classes, including adding several new classes which generalize managing inspectors/dialogs (which are now subclasses of window). New classes: * ve.ui.Window.js - base class for inspector and dialog classes * ve.ui.WindowSet.js - manages mutually exclusive windows, used by surface and context for dialogs and inspectors respectively * ve.ui.DialogFactory - generates dialogs * ve.ui.IconButtonWidget - used in inspector for buttons in the head Refactored classes: * ve.ui.Context - moved inspector management to window set * ve.ui.Frame - made iframes initialize asynchronously * ve.ui.Dialog and ve.ui.Inspector - moved initialization to async initialize method Other interesting bits: ve.ui.*Icons*.css, *.svg, *.png, *.ai * Merged icon stylesheets so all icons are available inside windows * Renamed inspector icon to window ve.ui.*.css * Reorganized styles so that different windows can include only what they need * Moved things to where they belonged (some things were in strange places) ve.init.Target.js, ve.init.mw.ViewPageTarget.js, ve.init.sa.Target.js * Removed dialog management - dialogs are managed by the surface now ve.ui.*Dialog.js * Renamed title message static property * Added registration ve.ui.*Inspector.js * Switch to accept surface object rather than context, which conforms to the more general window class without losing any functionality (in fact, most of the time the surface was what we actually wanted) ve.ui.MenuWidget.js, ve.ui.MWLinkTargetInputWidget.js * Using surface overly rather than passing an overlay around through constructors Change-Id: Ifd16a1003ff44c48ee7b2c66928cf9cc858b2564
142 lines
2.9 KiB
JavaScript
142 lines
2.9 KiB
JavaScript
/*!
|
|
* VisualEditor UserInterface Tool class.
|
|
*
|
|
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
*/
|
|
|
|
/**
|
|
* UserInterface tool.
|
|
*
|
|
* @class
|
|
* @abstract
|
|
* @extends ve.ui.Widget
|
|
*
|
|
* @constructor
|
|
* @param {ve.ui.Toolbar} toolbar
|
|
* @param {Object} [config] Config options
|
|
*/
|
|
ve.ui.Tool = function VeUiTool( toolbar, config ) {
|
|
// Parent constructor
|
|
ve.ui.Widget.call( this, config );
|
|
|
|
// Properties
|
|
this.toolbar = toolbar;
|
|
|
|
// Events
|
|
this.toolbar.addListenerMethods(
|
|
this, { 'updateState': 'onUpdateState', 'clearState': 'onClearState' }
|
|
);
|
|
ve.triggerRegistry.addListenerMethods(
|
|
this, { 'register': 'onTriggerRegistryRegister' }
|
|
);
|
|
|
|
// Initialization
|
|
this.setTitle();
|
|
this.$.addClass( 've-ui-Tool' );
|
|
};
|
|
|
|
/* Inheritance */
|
|
|
|
ve.inheritClass( ve.ui.Tool, ve.ui.Widget );
|
|
|
|
/* Static Properties */
|
|
|
|
/**
|
|
* Symbolic name of tool.
|
|
*
|
|
* @abstract
|
|
* @static
|
|
* @property
|
|
* @type {string}
|
|
*/
|
|
ve.ui.Tool.static.name = '';
|
|
|
|
/**
|
|
* CSS class name, rendered as ve-ui-dropdownTool-cssName
|
|
*
|
|
* If this is left as null, static.name is used instead.
|
|
*
|
|
* @abstract
|
|
* @static
|
|
* @property
|
|
* @type {string}
|
|
*/
|
|
ve.ui.Tool.static.cssName = null;
|
|
|
|
/**
|
|
* Message key for tool title.
|
|
*
|
|
* @abstract
|
|
* @static
|
|
* @property
|
|
* @type {string}
|
|
*/
|
|
ve.ui.Tool.static.titleMessage = null;
|
|
|
|
/* Methods */
|
|
|
|
/**
|
|
* Handle trigger registry register events.
|
|
*
|
|
* If a trigger is registered after the tool is loaded, this handler will ensure the tool's title is
|
|
* updated to reflect the available key command for the tool.
|
|
*
|
|
* @param {string} name Symbolic name of trigger
|
|
*/
|
|
ve.ui.Tool.prototype.onTriggerRegistryRegister = function ( name ) {
|
|
if ( name === this.constructor.static.name ) {
|
|
this.setTitle();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Handle the toolbar state being updated.
|
|
*
|
|
* This is an abstract method that must be overridden in a concrete subclass.
|
|
*
|
|
* @abstract
|
|
* @method
|
|
*/
|
|
ve.ui.Tool.prototype.onUpdateState = function () {
|
|
throw new Error(
|
|
've.ui.Tool.onUpdateState not implemented in this subclass:' + this.constructor
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Handle the toolbar state being cleared.
|
|
*
|
|
* This is an abstract method that must be overridden in a concrete subclass.
|
|
*
|
|
* @abstract
|
|
* @method
|
|
*/
|
|
ve.ui.Tool.prototype.onClearState = function () {
|
|
throw new Error(
|
|
've.ui.Tool.onClearState not implemented in this subclass:' + this.constructor
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Sets the tool title attribute in the dom.
|
|
*
|
|
* Combines trigger i18n with tooltip message if trigger exists.
|
|
* Otherwise defaults to titleMessage value.
|
|
*
|
|
* @abstract
|
|
* @method
|
|
* @chainable
|
|
*/
|
|
ve.ui.Tool.prototype.setTitle = function () {
|
|
var trigger = ve.triggerRegistry.lookup( this.constructor.static.name ),
|
|
labelMessage = this.constructor.static.titleMessage,
|
|
labelText = labelMessage ? ve.msg( labelMessage ) : '';
|
|
|
|
if ( trigger ) {
|
|
labelText += ' [' + trigger.getMessage() + ']';
|
|
}
|
|
this.$.attr( 'title', labelText );
|
|
return this;
|
|
};
|