1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-23 01:07:35 +00:00
seahub/media/aloha-0.22.7/plugins/common/ui/lib/scopes.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

189 lines
5.3 KiB
JavaScript

define([
'jquery',
'PubSub',
'util/maps'
], function (
$,
PubSub,
Maps
) {
'use strict';
var scopes = {
'Aloha.empty': [],
'Aloha.global': ['Aloha.empty'],
'Aloha.continuoustext': ['Aloha.global']
},
activeScopes = [],
addedScopes = {},
scopeSetDuringSelectionChanged = false;
function pushScopeAncestors(ancestorScopes, scope) {
if (!scopes.hasOwnProperty(scope)) {
return;
}
var parentScopes = scopes[scope];
for (var i = 0; i < parentScopes.length; i++) {
var parentScope = parentScopes[i];
ancestorScopes.push(parentScope);
pushScopeAncestors(ancestorScopes, parentScope);
}
}
Aloha.bind('aloha-selection-changed-before', function () {
scopeSetDuringSelectionChanged = false;
});
Aloha.bind('aloha-selection-changed-after', function (event, range, originalEvent) {
// I don't know why we check for originalEvent != 'undefined', here is
// the original comment:
// "Only set the specific scope if an event was provided, which means
// that somehow an editable was selected"
if (typeof originalEvent !== 'undefined' && ! scopeSetDuringSelectionChanged) {
Scopes.setScope('Aloha.continuoustext');
}
});
/**
* @deprecated
* Scopes don't provide any additional functionality since
* the visibility of containers and components can be
* controlled individually.
*/
var Scopes = {
/**
* Increments the scope counter for the given scope and requestor.
*
* A counter is maintained per scope and requestor. The counter
* can be incremented/decremented with enterScope/leaveScope.
*
* The first increment of the counter (the increment to 1) will
* make the scope active (isActiveScope() returns true) and
* publish the aloha.ui.scope.change event. Further increments
* will do nothing except increment the counter, which will
* require more leaveScope calls to be made to leave the scope.
*
* The last decrement of the counter (the decrement to 0) will
* make the scope inactive (isActiveScope() returns false) and
* publish the aloha.ui.scope.change event. Further decrements
* will do nothing.
*
* @param scope
* The scope to enter.
* @param requestor
* The subsystem or plugin that requests to leave the
* scope. Can be used to isolate the scope counter to a
* particular subsystem, usually a plugin. If not given,
* a global counter will be used instead.
* @deprecated
* Scopes don't provide any additional functionality since
* the visibility of containers and components can be
* controlled individually.
*/
enterScope: function(scope, requestor) {
requestor = requestor || '_globalCounter';
var counters = addedScopes[scope];
if (!counters) {
counters = addedScopes[scope] = {};
}
var counter = counters[requestor] || 0;
counter += 1;
counters[requestor] = counter;
if (!counter) {
PubSub.pub('aloha.ui.scope.change');
}
},
/**
* Decrements the scope counter for the given scope and requestor.
*
* @param force
* True when the scope should be left even if the counter
* is non-zero after decrementing it.
* @see enterScope()
* @deprecated
* Scopes don't provide any additional functionality since
* the visibility of containers and components can be
* controlled individually.
*/
leaveScope: function(scope, requestor, force) {
requestor = requestor || '_globalCounter';
var counters = addedScopes[scope];
if (!counters) {
return;
}
var counter = counters[requestor];
if (!counter) {
return;
}
counter -= 1;
if (counter && !force) {
counters[requestor] = counter;
} else {
delete counters[requestor];
if (Maps.isEmpty(counters)) {
delete addedScopes[scope];
}
PubSub.pub('aloha.ui.scope.change');
}
},
/**
* @deprecated
* Scopes don't provide any additional functionality since
* the visibility of containers and components can be
* controlled individually.
*/
isActiveScope: function(scope){
if (addedScopes[scope]) {
return true;
}
var isActive = (-1 !== $.inArray(scope, activeScopes));
if (isActive) {
return true;
}
return false;
},
/**
* @deprecated
* See setScope()
*/
getPrimaryScope: function() {
return activeScopes[0];
},
/**
* @deprecated
* Problem with setScope is that scopes defined by multiple plugins are exclusive to one another.
* Example: table plugin and link plugin - you want to be able to set both table and link scopes.
* Use enterScope and leaveScope instead.
*/
setScope: function(scope) {
scopeSetDuringSelectionChanged = true;
if (activeScopes[0] != scope) {
activeScopes = [scope];
pushScopeAncestors(activeScopes, scope);
PubSub.pub('aloha.ui.scope.change');
}
},
/**
* @deprecated
* This method was used to define an ancestry for scopes.
* It is unknonwn what problem scope ancestry solved, and
* the method is therefore deprecated.
*/
createScope: function(scope, parentScopes){
if ( ! parentScopes ) {
parentScopes = ['Aloha.empty'];
} else if (typeof parentScopes === 'string') {
parentScopes = [parentScopes];
}
scopes[scope] = parentScopes;
}
};
return Scopes;
});