/* * Ext JS Library 1.0.1 * Copyright(c) 2006-2007, Ext JS, LLC. * licensing@extjs.com * * http://www.extjs.com/license */ /** * @class Ext.MenuButton * @extends Ext.Button * A split button that provides a built-in dropdown arrow that can fire an event separately from the default * click event of the button. Typically this would be used to display a dropdown menu that provides additional * options to the primary button action, but any custom handler can provide the arrowclick implementation. * @cfg {Function} arrowHandler A function called when the arrow button is clicked (can be used instead of click event) * @cfg {String} arrowTooltip The title attribute of the arrow * @constructor * Create a new menu button * @param {String/HTMLElement/Element} renderTo The element to append the button to * @param {Object} config The config object */ Ext.MenuButton = function(renderTo, config){ Ext.MenuButton.superclass.constructor.call(this, renderTo, config); /** * @event arrowclick * Fires when this button's arrow is clicked * @param {MenuButton} this * @param {EventObject} e The click event */ this.addEvents({"arrowclick":true}); }; Ext.extend(Ext.MenuButton, Ext.Button, { render : function(renderTo){ // this is one sweet looking template! var tpl = new Ext.Template( '
', '', '', "
 
", '', '', "
 
" ); var btn = tpl.append(renderTo, [this.text], true); if(this.cls){ btn.addClass(this.cls); } if(this.icon){ btn.child("button").setStyle('background-image', 'url(' +this.icon +')'); } this.el = btn; this.autoWidth(); if(this.handleMouseEvents){ btn.on("mouseover", this.onMouseOver, this); btn.on("mouseout", this.onMouseOut, this); btn.on("mousedown", this.onMouseDown, this); btn.on("mouseup", this.onMouseUp, this); } btn.on(this.clickEvent, this.onClick, this); if(this.tooltip){ var btnEl = btn.child("button:first"); if(typeof this.tooltip == 'object'){ Ext.QuickTips.tips(Ext.apply({ target: btnEl.id }, this.tooltip)); } else { btnEl.dom[this.tooltipType] = this.tooltip; } } if(this.arrowTooltip){ var btnEl = btn.child("button:nth(2)"); btnEl.dom[this.tooltipType] = this.arrowTooltip; } if(this.hidden){ this.hide(); } if(this.disabled){ this.disable(); } if(this.menu){ this.menu.on("show", this.onMenuShow, this); this.menu.on("hide", this.onMenuHide, this); } }, // private autoWidth : function(){ if(this.el){ var tbl = this.el.child("table:first"); var tbl2 = this.el.child("table:last"); this.el.setWidth("auto"); tbl.setWidth("auto"); if(Ext.isIE7 && Ext.isStrict){ var ib = this.el.child('button:first'); if(ib && ib.getWidth() > 20){ ib.clip(); ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); } } if(this.minWidth){ if(this.hidden){ this.el.beginMeasure(); } if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){ tbl.setWidth(this.minWidth-tbl2.getWidth()); } if(this.hidden){ this.el.endMeasure(); } } this.el.setWidth(tbl.getWidth()+tbl2.getWidth()); } }, /** * Sets this button's click handler * @param {Function} handler The function to call when the button is clicked * @param {Object} scope (optional) Scope for the function passed above */ setHandler : function(handler, scope){ this.handler = handler; this.scope = scope; }, /** * Sets this button's arrow click handler * @param {Function} handler The function to call when the arrow is clicked * @param {Object} scope (optional) Scope for the function passed above */ setArrowHandler : function(handler, scope){ this.arrowHandler = handler; this.scope = scope; }, /** * Focus the button */ focus : function(){ if(this.el){ this.el.child("a:first").focus(); } }, // private onClick : function(e){ e.preventDefault(); if(!this.disabled){ if(e.getTarget(".x-btn-menu-arrow-wrap")){ if(this.menu && !this.menu.isVisible()){ this.menu.show(this.el, this.menuAlign); } this.fireEvent("arrowclick", this, e); if(this.arrowHandler){ this.arrowHandler.call(this.scope || this, this, e); } }else{ this.fireEvent("click", this, e); if(this.handler){ this.handler.call(this.scope || this, this, e); } } } }, // private onMouseDown : function(e){ if(!this.disabled){ Ext.fly(e.getTarget("table")).addClass("x-btn-click"); } }, // private onMouseUp : function(e){ Ext.fly(e.getTarget("table")).removeClass("x-btn-click"); } });