[483] | 1 | define([ |
---|
| 2 | "dojo/_base/connect", |
---|
| 3 | "dojo/_base/declare", |
---|
| 4 | "dojo/dom", |
---|
| 5 | "dojo/dom-class", |
---|
| 6 | "dojo/dom-construct", |
---|
| 7 | "dijit/registry", |
---|
| 8 | "dijit/_Contained", |
---|
| 9 | "dijit/_WidgetBase" |
---|
| 10 | ], function(connect, declare, dom, domClass, domConstruct, registry, Contained, WidgetBase){ |
---|
| 11 | |
---|
| 12 | // module: |
---|
| 13 | // dojox/mobile/PageIndicator |
---|
| 14 | |
---|
| 15 | return declare("dojox.mobile.PageIndicator", [WidgetBase, Contained],{ |
---|
| 16 | // summary: |
---|
| 17 | // A current page indicator. |
---|
| 18 | // description: |
---|
| 19 | // PageIndicator displays a series of gray and white dots to |
---|
| 20 | // indicate which page is currently being viewed. It can typically |
---|
| 21 | // be used with dojox/mobile/SwapView. It is also internally used |
---|
| 22 | // in dojox/mobile/Carousel. |
---|
| 23 | |
---|
| 24 | // refId: String |
---|
| 25 | // An ID of a DOM node to be searched. Siblings of the reference |
---|
| 26 | // node will be searched for views. If not specified, this.domNode |
---|
| 27 | // will be the reference node. |
---|
| 28 | refId: "", |
---|
| 29 | |
---|
| 30 | // baseClass: String |
---|
| 31 | // The name of the CSS class of this widget. |
---|
| 32 | baseClass: "mblPageIndicator", |
---|
| 33 | |
---|
| 34 | buildRendering: function(){ |
---|
| 35 | this.inherited(arguments); |
---|
| 36 | this._tblNode = domConstruct.create("table", {className:"mblPageIndicatorContainer"}, this.domNode); |
---|
| 37 | this._tblNode.insertRow(-1); |
---|
| 38 | this.connect(this.domNode, "onclick", "_onClick"); |
---|
| 39 | this.subscribe("/dojox/mobile/viewChanged", function(view){ |
---|
| 40 | this.reset(); |
---|
| 41 | }); |
---|
| 42 | }, |
---|
| 43 | |
---|
| 44 | startup: function(){ |
---|
| 45 | var _this = this; |
---|
| 46 | _this.defer(function(){ // to wait until views' visibility is determined |
---|
| 47 | _this.reset(); |
---|
| 48 | }); |
---|
| 49 | }, |
---|
| 50 | |
---|
| 51 | reset: function(){ |
---|
| 52 | // summary: |
---|
| 53 | // Updates the indicator. |
---|
| 54 | var r = this._tblNode.rows[0]; |
---|
| 55 | var i, c, a = [], dot; |
---|
| 56 | var refNode = (this.refId && dom.byId(this.refId)) || this.domNode; |
---|
| 57 | var children = refNode.parentNode.childNodes; |
---|
| 58 | for(i = 0; i < children.length; i++){ |
---|
| 59 | c = children[i]; |
---|
| 60 | if(this.isView(c)){ |
---|
| 61 | a.push(c); |
---|
| 62 | } |
---|
| 63 | } |
---|
| 64 | if(r.cells.length !== a.length){ |
---|
| 65 | domConstruct.empty(r); |
---|
| 66 | for(i = 0; i < a.length; i++){ |
---|
| 67 | c = a[i]; |
---|
| 68 | dot = domConstruct.create("div", {className:"mblPageIndicatorDot"}); |
---|
| 69 | r.insertCell(-1).appendChild(dot); |
---|
| 70 | } |
---|
| 71 | } |
---|
| 72 | if(a.length === 0){ return; } |
---|
| 73 | var currentView = registry.byNode(a[0]).getShowingView(); |
---|
| 74 | for(i = 0; i < r.cells.length; i++){ |
---|
| 75 | dot = r.cells[i].firstChild; |
---|
| 76 | if(a[i] === currentView.domNode){ |
---|
| 77 | domClass.add(dot, "mblPageIndicatorDotSelected"); |
---|
| 78 | }else{ |
---|
| 79 | domClass.remove(dot, "mblPageIndicatorDotSelected"); |
---|
| 80 | } |
---|
| 81 | } |
---|
| 82 | }, |
---|
| 83 | |
---|
| 84 | isView: function(node){ |
---|
| 85 | // summary: |
---|
| 86 | // Returns true if the given node is a view. |
---|
| 87 | return (node && node.nodeType === 1 && domClass.contains(node, "mblView")); // Boolean |
---|
| 88 | }, |
---|
| 89 | |
---|
| 90 | _onClick: function(e){ |
---|
| 91 | // summary: |
---|
| 92 | // Internal handler for click events. |
---|
| 93 | // tags: |
---|
| 94 | // private |
---|
| 95 | if(this.onClick(e) === false){ return; } // user's click action |
---|
| 96 | if(e.target !== this.domNode){ return; } |
---|
| 97 | if(e.layerX < this._tblNode.offsetLeft){ |
---|
| 98 | connect.publish("/dojox/mobile/prevPage", [this]); |
---|
| 99 | }else if(e.layerX > this._tblNode.offsetLeft + this._tblNode.offsetWidth){ |
---|
| 100 | connect.publish("/dojox/mobile/nextPage", [this]); |
---|
| 101 | } |
---|
| 102 | }, |
---|
| 103 | |
---|
| 104 | onClick: function(/*Event*/ /*===== e =====*/){ |
---|
| 105 | // summary: |
---|
| 106 | // User-defined function to handle clicks. |
---|
| 107 | // tags: |
---|
| 108 | // callback |
---|
| 109 | } |
---|
| 110 | }); |
---|
| 111 | }); |
---|