1 | define([ |
---|
2 | "dojo/_base/connect", |
---|
3 | "dojo/_base/declare", |
---|
4 | "dojo/_base/window", |
---|
5 | "dojo/dom", |
---|
6 | "dojo/dom-class", |
---|
7 | "dojo/dom-construct", |
---|
8 | "dijit/registry", // registry.byNode |
---|
9 | "dijit/_Contained", |
---|
10 | "dijit/_WidgetBase" |
---|
11 | ], function(connect, declare, win, dom, domClass, domConstruct, registry, Contained, WidgetBase){ |
---|
12 | |
---|
13 | /*===== |
---|
14 | var Contained = dijit._Contained; |
---|
15 | var WidgetBase = dijit._WidgetBase; |
---|
16 | =====*/ |
---|
17 | |
---|
18 | // module: |
---|
19 | // dojox/mobile/PageIndicator |
---|
20 | // summary: |
---|
21 | // A current page indicator. |
---|
22 | |
---|
23 | return declare("dojox.mobile.PageIndicator", [WidgetBase, Contained],{ |
---|
24 | // summary: |
---|
25 | // A current page indicator. |
---|
26 | // description: |
---|
27 | // PageIndicator displays a series of gray and white dots to |
---|
28 | // indicate which page is currently being viewed. It can typically |
---|
29 | // be used with dojox.mobile.SwapView. It is also internally used |
---|
30 | // in dojox.mobile.Carousel. |
---|
31 | |
---|
32 | // refId: String |
---|
33 | // An ID of a DOM node to be searched. Siblings of the reference |
---|
34 | // node will be searched for views. If not specified, this.domNode |
---|
35 | // will be the reference node. |
---|
36 | refId: "", |
---|
37 | |
---|
38 | buildRendering: function(){ |
---|
39 | this.domNode = this.srcNodeRef || win.doc.createElement("DIV"); |
---|
40 | this.domNode.className = "mblPageIndicator"; |
---|
41 | this._tblNode = domConstruct.create("TABLE", {className:"mblPageIndicatorContainer"}, this.domNode); |
---|
42 | this._tblNode.insertRow(-1); |
---|
43 | this.connect(this.domNode, "onclick", "onClick"); |
---|
44 | connect.subscribe("/dojox/mobile/viewChanged", this, function(view){ |
---|
45 | this.reset(); |
---|
46 | }); |
---|
47 | }, |
---|
48 | |
---|
49 | startup: function(){ |
---|
50 | var _this = this; |
---|
51 | setTimeout(function(){ // to wait until views' visibility is determined |
---|
52 | _this.reset(); |
---|
53 | }, 0); |
---|
54 | }, |
---|
55 | |
---|
56 | reset: function(){ |
---|
57 | // summary: |
---|
58 | // Updates the indicator. |
---|
59 | var r = this._tblNode.rows[0]; |
---|
60 | var i, c, a = [], dot; |
---|
61 | var refNode = (this.refId && dom.byId(this.refId)) || this.domNode; |
---|
62 | var children = refNode.parentNode.childNodes; |
---|
63 | for(i = 0; i < children.length; i++){ |
---|
64 | c = children[i]; |
---|
65 | if(this.isView(c)){ |
---|
66 | a.push(c); |
---|
67 | } |
---|
68 | } |
---|
69 | if(r.cells.length !== a.length){ |
---|
70 | domConstruct.empty(r); |
---|
71 | for(i = 0; i < a.length; i++){ |
---|
72 | c = a[i]; |
---|
73 | dot = domConstruct.create("DIV", {className:"mblPageIndicatorDot"}); |
---|
74 | r.insertCell(-1).appendChild(dot); |
---|
75 | } |
---|
76 | } |
---|
77 | if(a.length === 0){ return; } |
---|
78 | var currentView = registry.byNode(a[0]).getShowingView(); |
---|
79 | for(i = 0; i < r.cells.length; i++){ |
---|
80 | dot = r.cells[i].firstChild; |
---|
81 | if(a[i] === currentView.domNode){ |
---|
82 | domClass.add(dot, "mblPageIndicatorDotSelected"); |
---|
83 | }else{ |
---|
84 | domClass.remove(dot, "mblPageIndicatorDotSelected"); |
---|
85 | } |
---|
86 | } |
---|
87 | }, |
---|
88 | |
---|
89 | isView: function(node){ |
---|
90 | // summary: |
---|
91 | // Returns true if the given node is a view. |
---|
92 | return (node && node.nodeType === 1 && domClass.contains(node, "mblView")); |
---|
93 | }, |
---|
94 | |
---|
95 | onClick: function(e){ |
---|
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 | }); |
---|