mediawiki-extensions-Visual.../modules/ve/ui/ve.ui.WindowSet.js
Moriel Schottlender 63056eaa6d Allowing for config data when instantiating dialogs
Currently, WindowSet open method uses the Window factory to call up
the instantiation of a new dialog or inspector class. This commit will
also allow sending further config options to these classes if needed.

Specifically, this will also allow the use of ve.ui.Context.js for
block inspectors that are not dependent on current selection or current
location of the cursor.

It will also let us generalize the dialog/inspector window instantiations
by adding in any needed config settings on call.

Change-Id: If14384d74ab91ef01b1c7641ff84f327f2a12112
2013-09-11 08:36:05 -07:00

143 lines
3 KiB
JavaScript

/*!
* VisualEditor UserInterface WindowSet class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* UserInterface window set.
*
* @class
* @extends ve.Element
* @mixins ve.EventEmitter
*
* @constructor
* @param {ve.ui.Surface} surface
* @param {ve.Factory} factory Window factory
* @param {Object} [config] Config options
*/
ve.ui.WindowSet = function VeUiWindowSet( surface, factory, config ) {
// Parent constructor
ve.Element.call( this, config );
// Mixin constructors
ve.EventEmitter.call( this );
// Properties
this.surface = surface;
this.factory = factory;
this.windows = {};
this.currentWindow = null;
// Initialization
this.$.addClass( 've-ui-windowSet' );
};
/* Inheritance */
ve.inheritClass( ve.ui.WindowSet, ve.Element );
ve.mixinClass( ve.ui.WindowSet, ve.EventEmitter );
/* Events */
/**
* @event setup
* @param {ve.ui.Window} win Window that's been setup
*/
/**
* @event open
* @param {ve.ui.Window} win Window that's been opened
*/
/**
* @event close
* @param {ve.ui.Window} win Window that's been closed
* @param {string} action Action that caused the window to be closed
*/
/* Methods */
/**
* Handle a window being setup.
*
* @method
* @param {ve.ui.Window} win Window that's been setup
* @emits setup
*/
ve.ui.WindowSet.prototype.onWindowSetup = function ( win ) {
this.emit( 'setup', win );
};
/**
* Handle a window being opened.
*
* @method
* @param {ve.ui.Window} win Window that's been opened
* @emits open
*/
ve.ui.WindowSet.prototype.onWindowOpen = function ( win ) {
this.currentWindow = win;
this.emit( 'open', win );
};
/**
* Handle a window being closed.
*
* @method
* @param {ve.ui.Window} win Window that's been opened
* @param {boolean} accept Changes have been accepted
* @emits close
*/
ve.ui.WindowSet.prototype.onWindowClose = function ( win, accept ) {
this.currentWindow = null;
this.emit( 'close', win, accept );
};
/**
* Get the current window.
*
* @method
* @returns {ve.ui.Window} Current window
*/
ve.ui.WindowSet.prototype.getCurrent = function () {
return this.currentWindow;
};
/**
* Opens a given window.
*
* Any already open dialog will be closed.
*
* @method
* @param {string} name Symbolic name of window
* @param {Object} [config] Config options to be sent to the window class constructor
* @chainable
*/
ve.ui.WindowSet.prototype.open = function ( name, config ) {
var win;
if ( !this.factory.lookup( name ) ) {
throw new Error( 'Unknown window: ' + name );
}
if ( this.currentWindow ) {
throw new Error( 'Cannot open another window while another one is active' );
}
if ( !( name in this.windows ) ) {
win = this.windows[name] = this.factory.create( name, this.surface, config );
win.connect( this, {
'setup': ['onWindowSetup', win],
'open': ['onWindowOpen', win],
'close': ['onWindowClose', win]
} );
this.$.append( win.$ );
win.getFrame().load();
}
this.windows[name].open();
return this;
};