diff -r 000000000000 -r 1450b09d0cfd ginebra2/chrome/js/ToggleButton.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra2/chrome/js/ToggleButton.js Tue May 04 12:39:35 2010 +0300 @@ -0,0 +1,136 @@ +// Call ToggleButton to wire an HTML button (typically an tag) to a JS callback +// when you want the button pressed state to be tied to a Ginebra snippets +// visible attribute. +// +// +// Params: +// id - the id of the button. Ex: +// snippetId - the id of the ginebra snippet to which the button state should be tied +// upImg - the path to the "up" image for the button. +// downImg - the path to the "down" image for the button. +// disabledImg - the path to the "disabled" image for the button. +// handler - the javascript callback to be called when triggered +// triggerOnMouseUp- if true the handler will be called on mouse-up, defaults to true. +// triggerOnMouseDown - if true the handler will be called on mouse-down, defaults to false. +// triggerOnMouseOut - if true the handler will be called on mouse-out, defaults to false. +// +function ToggleButton(id, snippetId, upImg, downImg, disabledImg, handler, triggerOnMouseUp, triggerOnMouseDown, triggerOnMouseOut) { + this.id = id; + this.snippetId = snippetId; + this.upImg = upImg; + this.downImg = downImg; + this.disabledImg = disabledImg; + this.handler = handler; + this.isDown = false; + this.enabled = true; + this.triggerOnMouseUp= triggerOnMouseUp == undefined ? true : triggerOnMouseUp; + this.triggerOnMouseDown = triggerOnMouseDown == undefined ? false : triggerOnMouseDown; + this.triggerOnMouseOut = triggerOnMouseOut == undefined ? false : triggerOnMouseOut; + + // attach this class to the item as "button" for later access + // delete/cleanup existing button (if any) and attach this as button + dom = document.getElementById(this.id); + if (dom.button) { + delete dom.button; + } + dom.button = this; + + //! Provide easy access to button element. + this.element = function() { + return document.getElementById(this.id); + } + + //! Allow client to change button images after object creation. + this.updateImages = function(upImg, downImg, disabledImg) { + this.upImg = upImg; + this.downImg = downImg; + this.disableImg = disabledImg; + this.updateButton(); + } + + //! Updates button image to appropriate up/down/disabled icon. + this.updateButton = function() { + if (this.enabled) { + // button is enabled + if (this.isDown) { + // button is down + this.element().src = this.downImg; + } else { + // button is up + this.element().src = this.upImg; + } + } else { + // button is disabled + this.element().src = this.disabledImg; + } + } + + //! Enables/Disables button. + this.setEnabled = function(state) { + this.enabled = state; + this.updateButton(); + } + + //! Handler for the mouse down event. + this.onMouseDown = function() { + if (this.triggerOnMouseDown && this.enabled) { + this.handler(); + } + } + + //! Handler for the mouse up event. + this.onMouseUp = function() { + if (this.triggerOnMouseUp && this.enabled) { + this.handler(); + } + } + + //! Handler for the mouse out event. + this.onMouseOut = function() { + if (this.isDown) { + if (this.triggerOnMouseOut && this.enabled) { + this.handler(); + } + } + } + + //! Handler for the snippet shown signal. + this.onSnippetShown = function() { + // When the snippet is shown the button should be down. + this.isDown = true; + this.updateButton.call(this); + } + + //! Handler for the snippet hidden signal. + this.onSnippetHidden = function() { + // When the snippet is hidden the button should be up. + this.isDown = false; + this.updateButton.call(this); + } + + //! After chrome is loaded, setup shown/hidden handlers. + this.chromeLoadComplete = function() { + // The up/down state of this button is tied to the visibility state of + // the specified snippet. + window.snippets[this.snippetId].shown.connect(this.onSnippetShown.bind(this)); + window.snippets[this.snippetId].hidden.connect(this.onSnippetHidden.bind(this)); + } + + // Make sure we can find the element. + if (!this.element()) { + alert("ToggleButton: element not found, " + id); + return; + } + + // Set up element event handlers. + this.element().onmousedown = this.onMouseDown.bind(this); + this.element().onmouseup = this.onMouseUp.bind(this); + this.element().onmouseout = this.onMouseOut.bind(this); + + // Set the initial state of the button. + this.updateButton(); + + // can't access chrome snippets until chrome load complete + window.chrome.chromeComplete.connect(this.chromeLoadComplete.bind(this)); +} +