1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-18 15:08:22 +00:00
seahub/media/aloha-0.22.7/plugins/common/ui/lib/container.js
llj 720ac28c22 [aloha] upgraded to 0.22.7 and added textcolor plugin
* textcolor: fixed plugin bugs, added translation for zh
* image: fixed default.jpg src bug
* added 'ru' support for seaf edit
* rm aloha-0.22.3 and ununsed files in aloha-0.22.7
2013-01-15 14:48:04 +08:00

211 lines
5.2 KiB
JavaScript

/**
* Defines a `Container` Class.
*
* Containers are activated based on the `showOn` setting for the container.
* The values are normalized to functions which accept an element and return a
* boolean; true means the container should be shown.
*
* For efficiency, we group all containers that have the same normalized
* `showOn()' function together, so we can evaluate it once, regardless of how
* many containers are using the same logic. In order for this to work, the
* exact same function must be returned from `Container.normalizeShowOn()' when
* the logic is the same.
*
* The list of containers is then stored on the context instance as
* `context.containers', which is a hash of `showOn()' ids to an array of
* containers. The `showOn()' ids are unique identifiers that are stored as
* properties of the `showOn()' function (see `getShowOnId()'). This gives us
* constant lookup times when grouping containers.
*/
define([
'jquery',
'util/class',
'ui/scopes'
], function(
$,
Class,
Scopes
) {
'use strict';
var uid = 0;
/**
* Gets the id of a normalized showOn option. If the given function has
* not had its showOnId set it will receive one, the first time this
* function it is passed to this function.
*
* @param {function} showOn The function whose id we wish to get.
* @return {number} The id of the given function.
*/
function getShowOnId(showOn) {
// Store a unique id on the showOn function.
// See full explanation at top of file.
if (!showOn.showOnId) {
showOn.showOnId = ++uid;
}
return showOn.showOnId;
}
/**
* Show or hide a set of containers.
*
* @param {Array.<Container>} containers The set of containers to operate
* on.
* @param {boolean} show Whether to show or hide the given containers.
*/
function toggleContainers(containers, show) {
var action = show ? 'show' : 'hide',
i;
for (i = 0; i < containers.length; i++) {
containers[i][action]();
}
}
var scopeFns = {};
var returnTrue = function() {
return true;
};
/**
* Normalizes a showOn option into a function.
*
* @param {(string|boolean|function)} showOn
* @return function
*/
function normalizeShowOn(container, showOn) {
switch ($.type(showOn)) {
case 'function':
return showOn;
case 'object':
if (showOn.scope) {
if (scopeFns[showOn.scope]) {
return scopeFns[showOn.scope];
}
return scopeFns[showOn.scope] = function() {
return Scopes.isActiveScope(showOn.scope);
};
} else {
throw "Invalid showOn configuration";
}
default:
return returnTrue;
}
}
/**
* Container class.
*
* @class
* @base
*/
var Container = Class.extend({
/**
* The containing (wrapper) element for this container.
*
* @type {jQuery<HTMLElement>}
*/
element: null,
/**
* Initialize a new container with the specified properties.
*
* @param {object=} settings Optional properties, and override methods.
* @constructor
*/
_constructor: function(context, settings) {
var showOn = normalizeShowOn(this, settings.showOn),
key = getShowOnId(showOn),
group = context.containers[key];
this.context = context;
if (!group) {
group = context.containers[key] = {
shouldShow: showOn,
containers: []
};
}
group.containers.push(this);
},
/**
* Must be implemented by extending classes.
*
* @ingroup api
* @{
*/
/**
* A container is also a component; this is part of the component API.
*/
show: function() {},
/**
* A container is also a component; this is part of the component API.
*/
hide: function() {},
/**
* A container is also a component; this is part of the component API.
*/
focus: function() {},
/**
* A container is also a component; this is part of the component API.
*/
foreground: function() {},
/**
* The container was previously hidden, and now has become visible. This
* allows a container to let its children react to this.
*/
childVisible: function(childComponent, visible) {},
/**
* The container was given focus; this method must give focus to all
* children of the container.
* Optional. (E.g. tab.js doesn't implement this.)
*/
childFocus: function(childComponent) {},
/**
* The container was foregrounded; this method must foreground all children
* of the container.
*/
childForeground: function(childComponent) {}
/**
* @} End of "ingroup api".
*/
});
// static fields
$.extend( Container, {
/**
* Given an array of elements, show appropriate containers.
*
* @param {object} context
* @param {string} eventType Type of the event triggered (optional)
* @static
*/
showContainersForContext: function(context, eventType) {
var group,
groupKey,
containerGroups;
if (!context.containers) {
// No containers were constructed for the given context, so
// there is nothing for us to do.
return;
}
containerGroups = context.containers;
for (groupKey in containerGroups) {
if (containerGroups.hasOwnProperty(groupKey)) {
group = containerGroups[groupKey];
toggleContainers(group.containers, group.shouldShow(eventType));
}
}
}
});
return Container;
});