mediawiki-extensions-Visual.../modules/ve/ui/ve.ui.Inspector.js
Trevor Parscal bf254f44da UI "Views" refactor
Objective:

Make it possible for inspectors to inspect nodes or annotations, rather
than only annotations. Meanwhile, also make it possible for dialogs to
edit an annotation.

Strategy:

Switch from using type patterns to associate inspectors with annotations
to using arrays of classes, similar to how dialogs already work.
Introduce a view registry which provides lookups for relationships
between models and views. This is more centralized and less repetitive
than implement matching functions for both annotations and nodes in both
the dialog and inspector factories.

Changes:

*.php
* Added links to new file

ve.AnnotationAction.js
* Removed unused parameter to filter annotations using a string or regexp

ve.dm.AnnotationSet.js
* Switched from property/value arguments to callbacks

ve.ui.*(Dialog|Inspector).js
* Replaced type patterns with class lists
* Added class to view registry

ve.ui.*Tool.js, ve.ui.Context.js
* Updated model/view relationship lookup

ve.ui.*Factory.js
* Removed overly-specific lookup functions

ve.ui.Inspector.js
* Removed typePattern property
* Updated model/view relationship lookup

ve.ui.ViewRegistry.js
* New class!
* Migrated node and annotation lookup functions from factories

Change-Id: Ic2bbcf072fdd87e5ce8a03fe1ae3e6d8d50e2593
2013-04-18 15:53:50 -07:00

151 lines
3.4 KiB
JavaScript

/*!
* VisualEditor UserInterface Inspector class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* UserInterface inspector.
*
* @class
* @abstract
* @extends ve.ui.Window
*
* @constructor
* @param {ve.Surface} surface
*/
ve.ui.Inspector = function VeUiInspector( surface ) {
// Parent constructor
ve.ui.Window.call( this, surface );
// Properties
this.initialSelection = null;
// Initialization
this.$.addClass( 've-ui-inspector' );
};
/* Inheritance */
ve.inheritClass( ve.ui.Inspector, ve.ui.Window );
/* Static Properties */
ve.ui.Inspector.static.titleMessage = 've-ui-inspector-title';
/* Methods */
/**
* Handle frame ready events.
*
* @method
*/
ve.ui.Inspector.prototype.initialize = function () {
// Call parent method
ve.ui.Window.prototype.initialize.call( this );
// Initialization
this.$form = this.$$( '<form>' );
this.closeButton = new ve.ui.IconButtonWidget( {
'$$': this.$$, 'icon': 'previous', 'title': ve.msg( 'visualeditor-inspector-close-tooltip' )
} );
this.removeButton = new ve.ui.IconButtonWidget( {
'$$': this.$$, 'icon': 'remove', 'title': ve.msg( 'visualeditor-inspector-remove-tooltip' )
} );
// Events
this.$form.on( {
'submit': ve.bind( this.onFormSubmit, this ),
'keydown': ve.bind( this.onFormKeyDown, this )
} );
this.closeButton.on( 'click', ve.bind( this.onCloseButtonClick, this ) );
this.removeButton.on( 'click', ve.bind( this.onRemoveButtonClick, this ) );
// Initialization
this.closeButton.$.addClass( 've-ui-inspector-closeButton' );
this.removeButton.$.addClass( 've-ui-inspector-removeButton' );
this.$head.prepend( this.closeButton.$ ).append( this.removeButton.$ );
this.$body.append( this.$form );
};
/**
* Handle close button click events.
*
* @method
*/
ve.ui.Inspector.prototype.onCloseButtonClick = function () {
this.close( 'back' );
};
/**
* Handle remove button click events.
*
* @method
*/
ve.ui.Inspector.prototype.onRemoveButtonClick = function() {
this.close( 'remove' );
};
/**
* Handle form submission events.
*
* @method
* @param {jQuery.Event} e Form submit event
*/
ve.ui.Inspector.prototype.onFormSubmit = function () {
this.close( 'apply' );
return false;
};
/**
* Handle form keydown events.
*
* @method
* @param {jQuery.Event} e Key down event
*/
ve.ui.Inspector.prototype.onFormKeyDown = function ( e ) {
// Escape
if ( e.which === 27 ) {
this.close( 'back' );
return false;
}
};
/**
* Handle inspector setup events.
*
* @method
*/
ve.ui.Inspector.prototype.onSetup = function () {
this.previousSelection = this.surface.getModel().getSelection();
};
/**
* Handle inspector open events.
*
* @method
*/
ve.ui.Inspector.prototype.onOpen = function () {
this.initialSelection = this.surface.getModel().getSelection();
};
/**
* Get matching annotations within a fragment.
*
* @method
* @param {ve.dm.SurfaceFragment} fragment Fragment to get matching annotations within
* @returns {ve.dm.AnnotationSet} Matching annotations
*/
ve.ui.Inspector.prototype.getMatchingAnnotations = function ( fragment ) {
var constructor = this.constructor;
return fragment.getAnnotations().filter( function ( annnotation ) {
return ve.ui.viewRegistry.isViewRelatedToModel( constructor, annnotation );
} );
};
/* Initialization */
ve.ui.Inspector.static.addLocalStylesheets( [ 've.ui.Inspector.css' ] );