|
|
|
|
// This is actually for BOTH trees and menus
|
|
|
|
|
$axure.internal(function($ax) {
|
|
|
|
|
var _tree = $ax.tree = {};
|
|
|
|
|
var _menu = $ax.menu = {};
|
|
|
|
|
|
|
|
|
|
$ax.menu.InitializeSubmenu = function(subMenuId, cellId) {
|
|
|
|
|
var $submenudiv = $('#' + subMenuId);
|
|
|
|
|
|
|
|
|
|
//mouseenter and leave for parent table cell
|
|
|
|
|
$('#' + cellId).mouseenter(function(e) {
|
|
|
|
|
//show current submenu
|
|
|
|
|
// var submenuElement = document.getElementById(subMenuId);
|
|
|
|
|
// if($ax.visibility.IsVisible(submenuElement) && submenuElement.style.display !== 'none') return;
|
|
|
|
|
$ax.visibility.SetIdVisible(subMenuId, true);
|
|
|
|
|
$ax.legacy.BringToFront(subMenuId);
|
|
|
|
|
//$submenudiv.find('.menu_item').each(function() {
|
|
|
|
|
// $ax.style.updateTextAlignmentForVisibility($ax.GetTextPanelId($(this).attr('id')));
|
|
|
|
|
//});
|
|
|
|
|
_fireEventForSubmenu(subMenuId, "onShow");
|
|
|
|
|
|
|
|
|
|
}).mouseleave(function (e) {
|
|
|
|
|
var offset = $submenudiv.offset();
|
|
|
|
|
var subcontwidth = $submenudiv.width();
|
|
|
|
|
var subcontheight = $submenudiv.height();
|
|
|
|
|
//If mouse is not within the submenu (added 3 pixel margin to top and left calculations), then close the submenu...
|
|
|
|
|
if(e.pageX + 3 < offset.left || e.pageX > offset.left + subcontwidth || e.pageY + 3 < offset.top || e.pageY > offset.top + subcontheight) {
|
|
|
|
|
$submenudiv.find('.sub_menu').addBack().each(function () {
|
|
|
|
|
// if(!$ax.visibility.IsVisible(this)) return;
|
|
|
|
|
$ax.visibility.SetVisible(this, false);
|
|
|
|
|
_fireEventForSubmenu(subMenuId, "onHide");
|
|
|
|
|
});
|
|
|
|
|
$ax.style.SetWidgetHover(cellId, false);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$submenudiv.css('display', 'none');
|
|
|
|
|
|
|
|
|
|
//mouseleave for submenu
|
|
|
|
|
$submenudiv.mouseleave(function(e) {
|
|
|
|
|
//close this menu and all menus below it
|
|
|
|
|
$(this).find('.sub_menu').addBack().css({ 'visibility': 'hidden', 'display': 'none' }).each(function () {
|
|
|
|
|
// if(!$ax.visibility.IsVisible(this)) return;
|
|
|
|
|
_fireEventForSubmenu(this.id, "onHide");
|
|
|
|
|
});
|
|
|
|
|
$ax.style.SetWidgetHover(cellId, false);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var _fireEventForSubmenu = function(targetId, eventName) {
|
|
|
|
|
var diagramObject = $ax.getObjectFromElementId(targetId);
|
|
|
|
|
var event = diagramObject.interactionMap && diagramObject.interactionMap[eventName];
|
|
|
|
|
if(event) {
|
|
|
|
|
var eventInfo = $ax.getEventInfoFromEvent($ax.getjBrowserEvent(), false, targetId);
|
|
|
|
|
$ax.event.handleEvent(targetId, eventInfo, event, false, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function IsNodeVisible(nodeId) {
|
|
|
|
|
var current = window.document.getElementById(nodeId);
|
|
|
|
|
var parent = current.parentNode;
|
|
|
|
|
|
|
|
|
|
//move all the parent's children that are below the node and their annotations
|
|
|
|
|
while(!$(current).hasClass("treeroot")) {
|
|
|
|
|
if(!$ax.visibility.IsVisible(parent)) return false;
|
|
|
|
|
current = parent;
|
|
|
|
|
parent = parent.parentNode;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ax.tree.ExpandNode = function(nodeId, childContainerId, plusMinusId) {
|
|
|
|
|
var container = window.document.getElementById(childContainerId);
|
|
|
|
|
if(!container || $ax.visibility.IsVisible(container)) return;
|
|
|
|
|
$ax.visibility.SetVisible(container, true);
|
|
|
|
|
|
|
|
|
|
if(plusMinusId != '') $ax.style.SetWidgetSelected(plusMinusId, true);
|
|
|
|
|
|
|
|
|
|
var delta = _getExpandCollapseDelta(nodeId, childContainerId);
|
|
|
|
|
|
|
|
|
|
var isVisible = IsNodeVisible(nodeId);
|
|
|
|
|
var current = window.document.getElementById(nodeId);
|
|
|
|
|
var parent = current.parentNode;
|
|
|
|
|
|
|
|
|
|
//move all the parent's children that are below the node and their annotations
|
|
|
|
|
while(!$(current).hasClass("treeroot")) {
|
|
|
|
|
var after = false;
|
|
|
|
|
var i = 0;
|
|
|
|
|
for(i = 0; i < parent.childNodes.length; i++) {
|
|
|
|
|
var child = parent.childNodes[i];
|
|
|
|
|
if(after && child.id && $(child).hasClass("treenode")) {
|
|
|
|
|
var elementId = child.id;
|
|
|
|
|
child.style.top = $ax.getNumFromPx($(child).css('top')) + delta + 'px';
|
|
|
|
|
var ann = window.document.getElementById(elementId + "_ann");
|
|
|
|
|
if (ann) ann.style.top = $ax.getNumFromPx($(ann).css('top')) + delta + 'px';
|
|
|
|
|
}
|
|
|
|
|
if(child == current) after = true;
|
|
|
|
|
}
|
|
|
|
|
current = parent;
|
|
|
|
|
parent = parent.parentNode;
|
|
|
|
|
if(!isVisible && $ax.visibility.IsVisible(parent)) break;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
$ax.tree.CollapseNode = function(nodeId, childContainerId, plusMinusId) {
|
|
|
|
|
var container = window.document.getElementById(childContainerId);
|
|
|
|
|
if(!container || !$ax.visibility.IsVisible(container)) return;
|
|
|
|
|
|
|
|
|
|
if(plusMinusId != '') $ax.style.SetWidgetSelected(plusMinusId, false);
|
|
|
|
|
|
|
|
|
|
var delta = _getExpandCollapseDelta(nodeId, childContainerId);
|
|
|
|
|
|
|
|
|
|
//hide it after getting the delta, otherwise the delta can't be calculated (offsetParent is null)
|
|
|
|
|
$ax.visibility.SetVisible(container, false);
|
|
|
|
|
|
|
|
|
|
var isVisible = IsNodeVisible(nodeId);
|
|
|
|
|
var current = window.document.getElementById(nodeId);
|
|
|
|
|
var parent = current.parentNode;
|
|
|
|
|
|
|
|
|
|
//move all the parent's children that are below the node and their annotations
|
|
|
|
|
while(!$(current).hasClass("treeroot")) {
|
|
|
|
|
var after = false;
|
|
|
|
|
var i = 0;
|
|
|
|
|
for(i = 0; i < parent.childNodes.length; i++) {
|
|
|
|
|
var child = parent.childNodes[i];
|
|
|
|
|
if(after && child.id && $(child).hasClass("treenode")) {
|
|
|
|
|
var elementId = child.id;
|
|
|
|
|
child.style.top = $ax.getNumFromPx($(child).css('top')) - delta + 'px';
|
|
|
|
|
var ann = window.document.getElementById(elementId + "_ann");
|
|
|
|
|
if (ann) ann.style.top = $ax.getNumFromPx($(ann).css('top')) - delta + 'px';
|
|
|
|
|
}
|
|
|
|
|
if(child == current) after = true;
|
|
|
|
|
}
|
|
|
|
|
current = parent;
|
|
|
|
|
parent = current.parentNode;
|
|
|
|
|
if(!isVisible && $ax.visibility.IsVisible(parent)) break;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var _getExpandCollapseDelta = function(nodeId, childContainerId) {
|
|
|
|
|
return _getChildContainerHeightHelper(childContainerId);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var _getChildContainerHeightHelper = function(childContainerId) {
|
|
|
|
|
var height = 0;
|
|
|
|
|
$('#' + childContainerId).children().each(function() {
|
|
|
|
|
if($(this).hasClass("treenode")) {
|
|
|
|
|
height += $(this).height();
|
|
|
|
|
var subContainer = window.document.getElementById(this.id + '_children');
|
|
|
|
|
if(subContainer && $ax.visibility.IsVisible(subContainer)) {
|
|
|
|
|
height += _getChildContainerHeightHelper(subContainer.id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return height;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
$ax.tree.InitializeTreeNode = function(nodeId, plusminusid, childContainerId, selectText) {
|
|
|
|
|
var childContainer = window.document.getElementById(childContainerId);
|
|
|
|
|
if(childContainer) {
|
|
|
|
|
//relying on the html generator to put this inline so we know to collapse by default
|
|
|
|
|
var isCollapsed = childContainer.style.visibility == "hidden";
|
|
|
|
|
if(isCollapsed) $ax.visibility.SetVisible(childContainer, false);
|
|
|
|
|
|
|
|
|
|
if(!isCollapsed && plusminusid != '') $ax.style.SetWidgetSelected(plusminusid, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(plusminusid != '') {
|
|
|
|
|
$jobj(plusminusid).click(function() {
|
|
|
|
|
var visibleSet = $ax.visibility.IsIdVisible(childContainerId);
|
|
|
|
|
|
|
|
|
|
if(visibleSet) $ax.tree.CollapseNode(nodeId, childContainerId, plusminusid);
|
|
|
|
|
else $ax.tree.ExpandNode(nodeId, childContainerId, plusminusid);
|
|
|
|
|
$ax.tree.SelectTreeNode(nodeId, true);
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}).css('cursor', 'default');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var _getButtonShapeId = function(id) {
|
|
|
|
|
var obj = $obj(id);
|
|
|
|
|
return $ax.public.fn.IsTreeNodeObject(obj.type) ? $ax.getElementIdFromPath([obj.buttonShapeId], { relativeTo: id }) : id;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
$ax.tree.SelectTreeNode = function(id, selected) {
|
|
|
|
|
$ax.style.SetWidgetSelected(_getButtonShapeId(id), selected);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
});
|