mediawiki-extensions-Visual.../modules/ve/ui/widgets/ve.ui.OutlineControlsWidget.js
Trevor Parscal ac26f5fc69 Outline controls
Objectives:

* Allow reordering items in outline widgets using an outline control
  widget
* Use an outline control widget to reorder transclusion parts

Changes:

ve.ui.SelectWidget.js
* Emit add and remove events

ve.ui.OutlineItemWidget.js
* Add movable config options
* Add isMovable method

ve.ui.OutlineControlsWidget.js
* New class
* Displays move up/down buttons which are synchronized with an outline
  widget
* Doesn't actually move items (since an outline widget is probably
  data-driven) just emits events

ve.ui.Widget.css
* Add disabled style for icon button widgets
* Add styles for outline controls widget

ve.ui.Icons*.css
* Add missing icon styles

ve.ui.Dialog.css
* Add styles for outline and controls in editable paged dialogs

ve.ui.GroupElement.js
* Fix bug where items are insertions are in the wrong place when "moving"
  them

ve.ui.PagedDialog.js
* Add editable config option which shows outline controls under the
  outline
* Pass through movable config option when creating pages

ve.ui.MWTranclusionDialog.js
* Configure paged dialog outline as editable
* Add initialize method to connect outline controls widget events
* Make addPart method automatically add parameters when templates are
  added
* Add handler for outline controls move event which re-orders parts
* Make parts movable (params are automatically ordered, so they aren't
  movable)

ve.dm.MWTransclusionModel.js
* Add addPart method and use it within the addContent and addTemplate
  methods
* Fix documentation lies
* Add getPartFromId method

*.php
* Add links to new files and messages

Change-Id: I919d4c3e9b85d07a97a99c0b2e8739a859bdf2b1
2013-06-14 11:56:30 -07:00

86 lines
2.2 KiB
JavaScript

/*!
* VisualEditor UserInterface OutlineControlsWidget class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Creates an ve.ui.OutlineControlsWidget object.
*
* @class
*
* @constructor
* @param {ve.ui.OutlineWidget} outline Outline to control
* @param {Object} [config] Config options
*/
ve.ui.OutlineControlsWidget = function VeUiOutlineControlsWidget( outline, config ) {
// Parent constructor
ve.ui.Widget.call( this, config );
// Properties
this.outline = outline;
this.upButton = new ve.ui.IconButtonWidget( {
'$$': this.$$, 'icon': 'collapse', 'title': ve.msg( 'visualeditor-outline-control-move-up' )
} );
this.downButton = new ve.ui.IconButtonWidget( {
'$$': this.$$, 'icon': 'expand', 'title': ve.msg( 'visualeditor-outline-control-move-down' )
} );
// Events
outline.connect( this, {
'select': 'onOutlineChange',
'add': 'onOutlineChange',
'remove': 'onOutlineChange'
} );
this.upButton.connect( this, { 'click': ['emit', 'move', -1] } );
this.downButton.connect( this, { 'click': ['emit', 'move', 1] } );
// Initialization
this.$.addClass( 've-ui-outlineControlsWidget' );
this.upButton.$.addClass( 've-ui-outlineControlsWidget-upButton' );
this.downButton.$.addClass( 've-ui-outlineControlsWidget-downButton' );
this.$.append( this.upButton.$, this.downButton.$ );
};
/* Inheritance */
ve.inheritClass( ve.ui.OutlineControlsWidget, ve.ui.Widget );
/* Events */
/**
* @event move
* @param {number} places Number of places to move
*/
/* Methods */
ve.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
var i, len, firstMoveable, lastMoveable,
moveable = false,
items = this.outline.getItems(),
selectedItem = this.outline.getSelectedItem();
if ( selectedItem && selectedItem.isMoveable() ) {
moveable = true;
i = -1;
len = items.length;
while ( ++i < len ) {
if ( items[i].isMoveable() ) {
firstMoveable = items[i];
break;
}
}
i = len;
while ( i-- ) {
if ( items[i].isMoveable() ) {
lastMoveable = items[i];
break;
}
}
}
this.upButton.setDisabled( !moveable || selectedItem === firstMoveable );
this.downButton.setDisabled( !moveable || selectedItem === lastMoveable );
};