egroupware/phpgwapi/js/egw_action/egw_action_popup.js
Andreas Stöckel ae7987264e - Added working egw_grid component including test and documentation, codebase will be used to replace the nextmatchWidget in etemplate2
- Improved egw_action.js:
	- Bugfixing regaring handling of egwActionObjects organized in trees (hasn't been tested before)
	- Improved egwActionObjectInterface interface and functionality: AOIs can now mark themselves as invisible/visible and request the action objects to reconnect the action implementations
	- Action objects do now automatically register the action implementations
	- Vastly improved speed when working with huge amounts (> 500) of objects organized in trees (as done in the grid test)
	- Improved egwActionObject functionality: Added new functions regarding selecting groups of objects
2011-03-02 21:18:20 +00:00

224 lines
4.6 KiB
JavaScript

/**
* eGroupWare egw_action framework - egw action framework
*
* @link http://www.egroupware.org
* @author Andreas Stöckel <as@stylite.de>
* @copyright 2011 by Andreas Stöckel
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package egw_action
* @version $Id$
*/
if (typeof window._egwActionClasses == "undefined")
window._egwActionClasses = {}
_egwActionClasses["popup"] = {
"actionConstructor": egwPopupAction,
"implementation": getPopupImplementation
}
function egwPopupAction(_id, _handler, _caption, _icon, _onExecute, _allowOnMultiple)
{
var action = new egwAction(_id, _handler, _caption, _icon, _onExecute, _allowOnMultiple);
action.type = "popup";
action["default"] = false;
action.order = 0;
action.group = 0;
action.set_default = function(_value) {
action["default"] = _value;
}
action.set_order = function(_value) {
action.order = _value;
}
action.set_group = function(_value) {
action.group = _value;
}
return action;
}
var
_popupActionImpl = null;
function getPopupImplementation()
{
if (!_popupActionImpl)
{
_popupActionImpl = new egwPopupActionImplementation();
}
return _popupActionImpl
}
function egwPopupActionImplementation()
{
var ai = new egwActionImplementation();
ai.type = "popup";
ai.doRegisterAction = function(_aoi, _callback, _context)
{
var node = _aoi.getDOMNode();
if (node)
{
node.oncontextmenu = function(e) {
//Obtain the event object
if (!e)
{
e = window.event;
}
if (_egw_active_menu)
{
_egw_active_menu.hide()
}
else
{
_xy = ai._getPageXY(e);
_callback.call(_context, _xy, ai);
}
e.cancelBubble = true;
if (e.stopPropagation)
{
e.stopPropagation();
}
return false;
}
return true;
}
return false;
}
ai.doUnregisterAction = function(_aoi)
{
//
}
/**
* Builds the context menu and shows it at the given position/DOM-Node.
*/
ai.doExecuteImplementation = function(_context, _selected, _links)
{
//Check whether the
if ((typeof _context.posx != "number" || typeof _context.posy != "number") &&
typeof _context.id != "undefined")
{
// Calculate context menu position from the given DOM-Node
var node = _context;
x = node.offsetLeft;
y = node.offsetTop;
_context = {"posx": x, "posy": y}
}
var menu = ai._buildMenu(_links, _selected);
menu.showAt(_context.posx, _context.posy);
return true;
}
/**
* Builds the context menu from the given action links
*/
ai._buildMenu = function(_links, _selected)
{
var menu = new egwMenu();
//Sort the links in ordered groups
var link_groups = {};
for (k in _links)
{
// Check whether the link group of the current element already exists,
// if not, create the group
var grp = _links[k].actionObj.group;
if (typeof link_groups[grp] == "undefined")
{
link_groups[grp] = [];
}
// Insert the element in order
var inserted = false;
for (var i = 0; i < link_groups[grp].length; i++)
{
var elem = link_groups[grp][i];
if (elem.actionObj.order > _links[k].actionObj.order)
{
inserted = true;
link_groups[grp].splice(i, 0, _links[k]);
break;
}
}
// If the object hasn't been inserted, add it to the end of the list
if (!inserted)
{
link_groups[grp].push(_links[k]);
}
}
// Insert the link groups sorted into an array
var groups = [];
for (k in link_groups)
groups.push({"grp": k, "links": link_groups[k]});
groups.sort(function(a, b) {
return (a.grp > b.grp) ? 1 : ((a.grp < b.grp) ? -1 : 0);
});
for (var i = 0; i < groups.length; i++)
{
// Add an seperator after each group
if (i != 0)
{
menu.addItem("", "-");
}
// Go through the elements of each group
for (var j = 0; j < groups[i].links.length; j++)
{
var link = groups[i].links[j];
if (link.visible)
{
var item = menu.addItem(link.actionObj.id, link.actionObj.caption,
link.actionObj.iconUrl);
item.data = link.actionObj;
if (link.enabled)
{
item.set_onClick(function(elem) {
elem.data.execute(_selected);
});
}
else
{
item.set_enabled(false);
}
}
}
}
return menu;
}
ai._getPageXY = function getPageXY(event)
{
// document.body.scrollTop does not work in IE
var scrollTop = document.body.scrollTop ? document.body.scrollTop :
document.documentElement.scrollTop;
var scrollLeft = document.body.scrollLeft ? document.body.scrollLeft :
document.documentElement.scrollLeft;
return {'posx': (event.clientX + scrollLeft), 'posy': (event.clientY + scrollTop)};
}
return ai;
}