159 lines
5 KiB
JavaScript
159 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);
|