123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474 |
- goog.provide('goog.ui.Zippy');
- goog.provide('goog.ui.Zippy.Events');
- goog.provide('goog.ui.ZippyEvent');
- goog.require('goog.a11y.aria');
- goog.require('goog.a11y.aria.Role');
- goog.require('goog.a11y.aria.State');
- goog.require('goog.dom');
- goog.require('goog.dom.classlist');
- goog.require('goog.events.Event');
- goog.require('goog.events.EventHandler');
- goog.require('goog.events.EventTarget');
- goog.require('goog.events.EventType');
- goog.require('goog.events.KeyCodes');
- goog.require('goog.events.KeyHandler');
- goog.require('goog.style');
- goog.ui.Zippy = function(
- header, opt_content, opt_expanded, opt_expandedHeader, opt_domHelper) {
- goog.ui.Zippy.base(this, 'constructor');
-
- this.dom_ = opt_domHelper || goog.dom.getDomHelper();
-
- this.elHeader_ = this.dom_.getElement(header) || null;
-
- this.elExpandedHeader_ = this.dom_.getElement(opt_expandedHeader || null);
-
- this.lazyCreateFunc_ = goog.isFunction(opt_content) ? opt_content : null;
-
- this.elContent_ = this.lazyCreateFunc_ || !opt_content ?
- null :
- this.dom_.getElement( (opt_content));
-
- this.expanded_ = opt_expanded == true;
- if (!goog.isDef(opt_expanded) && !this.lazyCreateFunc_) {
-
-
-
-
- if (this.elExpandedHeader_) {
- this.expanded_ = goog.style.isElementShown(this.elExpandedHeader_);
- } else if (this.elHeader_) {
- this.expanded_ = goog.dom.classlist.contains(
- this.elHeader_, goog.getCssName('goog-zippy-expanded'));
- }
- }
-
- this.keyboardEventHandler_ = new goog.events.EventHandler(this);
-
- this.keyHandler_ = new goog.events.KeyHandler();
-
- this.mouseEventHandler_ = new goog.events.EventHandler(this);
- var self = this;
- function addHeaderEvents(el) {
- if (el) {
- el.tabIndex = 0;
- goog.a11y.aria.setRole(el, self.getAriaRole());
- goog.dom.classlist.add(el, goog.getCssName('goog-zippy-header'));
- self.enableMouseEventsHandling_(el);
- self.enableKeyboardEventsHandling_(el);
- }
- }
- addHeaderEvents(this.elHeader_);
- addHeaderEvents(this.elExpandedHeader_);
-
- this.setExpanded(this.expanded_);
- };
- goog.inherits(goog.ui.Zippy, goog.events.EventTarget);
- goog.tagUnsealableClass(goog.ui.Zippy);
- goog.ui.Zippy.Events = {
-
-
-
- ACTION: 'action',
-
- TOGGLE: 'toggle'
- };
- goog.ui.Zippy.prototype.handleMouseEvents_ = true;
- goog.ui.Zippy.prototype.handleKeyEvents_ = true;
- goog.ui.Zippy.prototype.disposeInternal = function() {
- goog.ui.Zippy.base(this, 'disposeInternal');
- goog.dispose(this.keyboardEventHandler_);
- goog.dispose(this.keyHandler_);
- goog.dispose(this.mouseEventHandler_);
- };
- goog.ui.Zippy.prototype.getAriaRole = function() {
- return goog.a11y.aria.Role.TAB;
- };
- goog.ui.Zippy.prototype.getContentElement = function() {
- return (this.elContent_);
- };
- goog.ui.Zippy.prototype.getVisibleHeaderElement = function() {
- var expandedHeader = this.elExpandedHeader_;
- return expandedHeader && goog.style.isElementShown(expandedHeader) ?
- expandedHeader :
- this.elHeader_;
- };
- goog.ui.Zippy.prototype.expand = function() {
- this.setExpanded(true);
- };
- goog.ui.Zippy.prototype.collapse = function() {
- this.setExpanded(false);
- };
- goog.ui.Zippy.prototype.toggle = function() {
- this.setExpanded(!this.expanded_);
- };
- goog.ui.Zippy.prototype.setExpanded = function(expanded) {
- if (this.elContent_) {
-
- goog.style.setElementShown(this.elContent_, expanded);
- } else if (expanded && this.lazyCreateFunc_) {
-
- this.elContent_ = this.lazyCreateFunc_();
- }
- if (this.elContent_) {
- goog.dom.classlist.add(
- this.elContent_, goog.getCssName('goog-zippy-content'));
- }
- if (this.elExpandedHeader_) {
-
- goog.style.setElementShown(this.elHeader_, !expanded);
- goog.style.setElementShown(this.elExpandedHeader_, expanded);
- } else {
-
- this.updateHeaderClassName(expanded);
- }
- this.setExpandedInternal(expanded);
-
- this.dispatchEvent(
- new goog.ui.ZippyEvent(
- goog.ui.Zippy.Events.TOGGLE, this, this.expanded_));
- };
- goog.ui.Zippy.prototype.setExpandedInternal = function(expanded) {
- this.expanded_ = expanded;
- };
- goog.ui.Zippy.prototype.isExpanded = function() {
- return this.expanded_;
- };
- goog.ui.Zippy.prototype.updateHeaderClassName = function(expanded) {
- if (this.elHeader_) {
- goog.dom.classlist.enable(
- this.elHeader_, goog.getCssName('goog-zippy-expanded'), expanded);
- goog.dom.classlist.enable(
- this.elHeader_, goog.getCssName('goog-zippy-collapsed'), !expanded);
- goog.a11y.aria.setState(
- this.elHeader_, goog.a11y.aria.State.EXPANDED, expanded);
- }
- };
- goog.ui.Zippy.prototype.isHandleKeyEvents = function() {
- return this.handleKeyEvents_;
- };
- goog.ui.Zippy.prototype.isHandleMouseEvents = function() {
- return this.handleMouseEvents_;
- };
- goog.ui.Zippy.prototype.setHandleKeyboardEvents = function(enable) {
- if (this.handleKeyEvents_ != enable) {
- this.handleKeyEvents_ = enable;
- if (enable) {
- this.enableKeyboardEventsHandling_(this.elHeader_);
- this.enableKeyboardEventsHandling_(this.elExpandedHeader_);
- } else {
- this.keyboardEventHandler_.removeAll();
- this.keyHandler_.detach();
- }
- }
- };
- goog.ui.Zippy.prototype.setHandleMouseEvents = function(enable) {
- if (this.handleMouseEvents_ != enable) {
- this.handleMouseEvents_ = enable;
- if (enable) {
- this.enableMouseEventsHandling_(this.elHeader_);
- this.enableMouseEventsHandling_(this.elExpandedHeader_);
- } else {
- this.mouseEventHandler_.removeAll();
- }
- }
- };
- goog.ui.Zippy.prototype.enableKeyboardEventsHandling_ = function(header) {
- if (header) {
- this.keyHandler_.attach(header);
- this.keyboardEventHandler_.listen(
- this.keyHandler_, goog.events.KeyHandler.EventType.KEY,
- this.onHeaderKeyDown_);
- }
- };
- goog.ui.Zippy.prototype.enableMouseEventsHandling_ = function(header) {
- if (header) {
- this.mouseEventHandler_.listen(
- header, goog.events.EventType.CLICK, this.onHeaderClick_);
- }
- };
- goog.ui.Zippy.prototype.onHeaderKeyDown_ = function(event) {
- if (event.keyCode == goog.events.KeyCodes.ENTER ||
- event.keyCode == goog.events.KeyCodes.SPACE) {
- this.toggle();
- this.dispatchActionEvent_();
-
- event.preventDefault();
- event.stopPropagation();
- }
- };
- goog.ui.Zippy.prototype.onHeaderClick_ = function(event) {
- this.toggle();
- this.dispatchActionEvent_();
- };
- goog.ui.Zippy.prototype.dispatchActionEvent_ = function() {
- this.dispatchEvent(new goog.events.Event(goog.ui.Zippy.Events.ACTION, this));
- };
- goog.ui.ZippyEvent = function(type, target, expanded) {
- goog.ui.ZippyEvent.base(this, 'constructor', type, target);
-
- this.expanded = expanded;
- };
- goog.inherits(goog.ui.ZippyEvent, goog.events.Event);
|