vitro/webapp/web/src/widget/SimpleDropdownButtons.js

158 lines
5 KiB
JavaScript

/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
/* TODO:
* - make the dropdowns "smart" so they can't get cutoff on bottom of page, sides of page, etc.
* - unify menus with the MenuItem and Menu classes so we can add stuff to all menus at once
* - allow buttons to be enabled/disabled at runtime
* - this probably means creating all menus upfront and then triggering a disable action
* for disabled buttons in the constructor loop. we'll need a disable and enable action anyway
* - should each button with menu be a widget object of it's own?
*/
dojo.provide("dojo.widget.SimpleDropdownButtons");
dojo.provide("dojo.widget.HtmlSimpleDropdownButtons");
dojo.deprecated("dojo.widget.SimpleDropdownButtons", "use dojo.widget.DropDownButton", "0.4");
dojo.require("dojo.event.*");
dojo.require("dojo.widget.*");
dojo.require("dojo.uri.Uri");
dojo.require("dojo.dom");
dojo.require("dojo.style");
dojo.require("dojo.html");
dojo.widget.tags.addParseTreeHandler("dojo:simpledropdownbuttons");
dojo.widget.HtmlSimpleDropdownButtons = function() {
dojo.widget.HtmlWidget.call(this);
this.widgetType = "SimpleDropdownButtons";
this.templateCssPath = dojo.uri.dojoUri("src/widget/templates/HtmlSimpleDropdownButtons.css");
this.menuTriggerClass = "dojoSimpleDropdownButtons";
this.menuClass = "dojoSimpleDropdownButtonsMenu";
// overwrite buildRendering so we don't clobber our list
this.buildRendering = function(args, frag) {
if(this.templateCssPath) {
dojo.style.insertCssFile(this.templateCssPath, null, true);
}
this.domNode = frag["dojo:"+this.widgetType.toLowerCase()]["nodeRef"];
var menu = this.domNode;
if( !dojo.html.hasClass(menu, this.menuTriggerClass) ) {
dojo.html.addClass(menu, this.menuTriggerClass);
}
var li = dojo.dom.getFirstChildElement(menu);
var menuIDs = [];
var arrowIDs = [];
while(li) {
if(li.getElementsByTagName("ul").length > 0) {
var a = dojo.dom.getFirstChildElement(li);
var arrow = document.createElement("a");
arrow.href = "javascript:;";
arrow.innerHTML = " ";
dojo.html.setClass(arrow, "downArrow");
if(!arrow.id) {
arrow.id = dojo.dom.getUniqueId();
}
arrowIDs.push(arrow.id);
var submenu = dojo.dom.getNextSiblingElement(a);
if(!submenu.id) {
submenu.id = dojo.dom.getUniqueId();
}
menuIDs.push(submenu.id);
if( dojo.html.hasClass(a, "disabled") ) {
dojo.html.addClass(arrow, "disabled");
dojo.html.disableSelection(li);
arrow.onfocus = function(){ this.blur(); }
} else {
dojo.html.addClass(submenu, this.menuClass);
document.body.appendChild(submenu);
dojo.event.connect(arrow, "onmousedown", (function() {
var ar = arrow;
return function(e) {
dojo.html.addClass(ar, "pressed");
}
})());
dojo.event.connect(arrow, "onclick", (function() {
var aa = a;
var ar = arrow;
var sm = submenu;
var setWidth = false;
return function(e) {
hideAll(sm, ar);
sm.style.left = (dojo.html.getScrollLeft()
+ e.clientX - e.layerX + aa.offsetLeft) + "px";
sm.style.top = (dojo.html.getScrollTop() + e.clientY
- e.layerY + aa.offsetTop + aa.offsetHeight) + "px";
sm.style.display = sm.style.display == "block" ? "none" : "block";
if(sm.style.display == "none") {
dojo.html.removeClass(ar, "pressed");
e.target.blur()
}
if(!setWidth && sm.style.display == "block"
&& sm.offsetWidth < aa.offsetWidth + ar.offsetWidth) {
sm.style.width = aa.offsetWidth + ar.offsetWidth + "px";
setWidth = true;
}
e.preventDefault();
}
})());
}
dojo.event.connect(a, "onclick", function(e) {
if(e && e.target && e.target.blur) {
e.target.blur();
}
});
if(a.nextSibling) {
li.insertBefore(arrow, a.nextSibling);
} else {
li.appendChild(arrow);
}
}
li = dojo.dom.getNextSiblingElement(li);
}
function hideAll(excludeMenu, excludeArrow) {
// hide menus
for(var i = 0; i < menuIDs.length; i++) {
var m = document.getElementById(menuIDs[i]);
if(!excludeMenu || m != excludeMenu) {
document.getElementById(menuIDs[i]).style.display = "none";
}
}
// restore arrows to non-pressed state
for(var i = 0; i < arrowIDs.length; i++) {
var m = document.getElementById(arrowIDs[i]);
if(!excludeArrow || m != excludeArrow) {
dojo.html.removeClass(m, "pressed");
}
}
}
dojo.event.connect(document.documentElement, "onmousedown", function(e) {
if( dojo.html.hasClass(e.target, "downArrow") ) { return };
for(var i = 0; i < menuIDs.length; i++) {
if( dojo.dom.isDescendantOf(e.target, document.getElementById(menuIDs[i])) ) {
return;
}
}
hideAll();
});
}
}
dojo.inherits(dojo.widget.HtmlSimpleDropdownButtons, dojo.widget.HtmlWidget);