%PDF- %PDF-
Direktori : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/src/ui/actions/ |
Current File : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/src/ui/actions/ve.ui.WindowAction.js |
/*! * VisualEditor UserInterface WindowAction class. * * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org */ /** * Window action. * * @class * @extends ve.ui.Action * @constructor * @param {ve.ui.Surface} surface Surface to act on */ ve.ui.WindowAction = function VeUiWindowAction() { // Parent constructor ve.ui.WindowAction.super.apply( this, arguments ); }; /* Inheritance */ OO.inheritClass( ve.ui.WindowAction, ve.ui.Action ); /* Static Properties */ ve.ui.WindowAction.static.name = 'window'; /** * List of allowed methods for the action. * * @static * @property */ ve.ui.WindowAction.static.methods = [ 'open', 'close', 'toggle' ]; /* Methods */ /** * Open a window. * * @method * @param {string} name Symbolic name of window to open * @param {Object} [data] Window opening data * @param {string} [action] Action to execute after opening, or immediately if the window is already open * @return {boolean} Action was executed */ ve.ui.WindowAction.prototype.open = function ( name, data, action ) { var currentInspector, inspectorWindowManager, windowType = this.getWindowType( name ), windowManager = windowType && this.getWindowManager( windowType ), currentWindow = windowManager.getCurrentWindow(), autoClosePromises = [], surface = this.surface, fragment = surface.getModel().getFragment( undefined, true ), dir = surface.getView().getSelection().getDirection(); if ( !windowManager ) { return false; } data = ve.extendObject( { dir: dir }, data, { fragment: fragment } ); if ( windowType === 'toolbar' || windowType === 'inspector' ) { data = ve.extendObject( data, { surface: surface } ); // Auto-close the current window if it is different to the one we are // trying to open. // TODO: Make auto-close a window manager setting if ( currentWindow && currentWindow.constructor.static.name !== name ) { autoClosePromises.push( windowManager.closeWindow( currentWindow ) ); } } // If we're opening a dialog, close all inspectors first if ( windowType === 'dialog' ) { inspectorWindowManager = this.getWindowManager( 'inspector' ); currentInspector = inspectorWindowManager.getCurrentWindow(); if ( currentInspector ) { autoClosePromises.push( inspectorWindowManager.closeWindow( currentInspector ) ); } } $.when.apply( $, autoClosePromises ).always( function () { windowManager.getWindow( name ).then( function ( win ) { var opening = windowManager.openWindow( win, data ); if ( !win.constructor.static.activeSurface ) { surface.getView().deactivate(); } opening.then( function ( closing ) { closing.then( function ( closed ) { if ( !win.constructor.static.activeSurface ) { surface.getView().activate(); } closed.then( function ( closedData ) { // Sequence-triggered window closed without action, undo if ( data.strippedSequence && !( closedData && closedData.action ) ) { surface.getModel().undo(); } surface.getView().emit( 'position' ); } ); } ); } ).always( function () { if ( action ) { win.executeAction( action ); } } ); } ); } ); return true; }; /** * Close a window * * @method * @param {string} name Symbolic name of window to open * @param {Object} [data] Window closing data * @return {boolean} Action was executed */ ve.ui.WindowAction.prototype.close = function ( name, data ) { var windowType = this.getWindowType( name ), windowManager = windowType && this.getWindowManager( windowType ); if ( !windowManager ) { return false; } windowManager.closeWindow( name, data ); return true; }; /** * Toggle a window between open and close * * @method * @param {string} name Symbolic name of window to open or close * @param {Object} [data] Window opening or closing data * @return {boolean} Action was executed */ ve.ui.WindowAction.prototype.toggle = function ( name, data ) { var win, windowType = this.getWindowType( name ), windowManager = windowType && this.getWindowManager( windowType ); if ( !windowManager ) { return false; } win = windowManager.getCurrentWindow(); if ( !win || win.constructor.static.name !== name ) { this.open( name, data ); } else { this.close( name, data ); } return true; }; /** * Get the specified window type * * @param {string} name Window name * @return {string|null} Window type: 'inspector', 'toolbar' or 'dialog' */ ve.ui.WindowAction.prototype.getWindowType = function ( name ) { var windowClass = ve.ui.windowFactory.lookup( name ); if ( windowClass.prototype instanceof ve.ui.FragmentInspector ) { return 'inspector'; } else if ( windowClass.prototype instanceof ve.ui.ToolbarDialog ) { return 'toolbar'; } else if ( windowClass.prototype instanceof OO.ui.Dialog ) { return 'dialog'; } return null; }; /** * Get the window manager for a specified window type * * @param {Function} windowType Window type: 'inspector', 'toolbar', or 'dialog' * @return {ve.ui.WindowManager|null} Window manager */ ve.ui.WindowAction.prototype.getWindowManager = function ( windowType ) { switch ( windowType ) { case 'inspector': return this.surface.getContext().getInspectors(); case 'toolbar': return this.surface.getToolbarDialogs(); case 'dialog': return this.surface.getDialogs(); } return null; }; /* Registration */ ve.ui.actionFactory.register( ve.ui.WindowAction );