OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / build / tools / droiddoc / templates / assets / android-developer-reference.js
1
2 /* API LEVEL TOGGLE */
3 addLoadEvent(changeApiLevel);
4
5 var API_LEVEL_ENABLED_COOKIE = "api_level_enabled";
6 var API_LEVEL_COOKIE = "api_level";
7 var minLevel = 1;
8
9 function toggleApiLevelSelector(checkbox) {
10   var date = new Date();
11   date.setTime(date.getTime()+(10*365*24*60*60*1000)); // keep this for 10 years
12   var expiration = date.toGMTString();
13   if (checkbox.checked) {
14     $("#apiLevelSelector").removeAttr("disabled");
15     $("#api-level-toggle label").removeClass("disabled");
16     writeCookie(API_LEVEL_ENABLED_COOKIE, 1, null, expiration);
17   } else {
18     $("#apiLevelSelector").attr("disabled","disabled");
19     $("#api-level-toggle label").addClass("disabled");
20     writeCookie(API_LEVEL_ENABLED_COOKIE, 0, null, expiration);
21   }
22   changeApiLevel();
23 }
24
25 function buildApiLevelSelector() {
26   var maxLevel = SINCE_DATA.length;
27   var userApiLevelEnabled = readCookie(API_LEVEL_ENABLED_COOKIE);
28   var userApiLevel = readCookie(API_LEVEL_COOKIE);
29   userApiLevel = userApiLevel == 0 ? maxLevel : userApiLevel; // If there's no cookie (zero), use the max by default
30
31   if (userApiLevelEnabled == 0) {
32     $("#apiLevelSelector").attr("disabled","disabled");
33   } else {
34     $("#apiLevelCheckbox").attr("checked","checked");
35     $("#api-level-toggle label").removeClass("disabled");
36   }
37   
38   minLevel = $("body").attr("class");
39   var select = $("#apiLevelSelector").html("").change(changeApiLevel);
40   for (var i = maxLevel-1; i >= 0; i--) {
41     var option = $("<option />").attr("value",""+SINCE_DATA[i]).append(""+SINCE_DATA[i]);
42   //  if (SINCE_DATA[i] < minLevel) option.addClass("absent"); // always false for strings (codenames)
43     select.append(option);
44   }
45   
46   // get the DOM element and use setAttribute cuz IE6 fails when using jquery .attr('selected',true)
47   var selectedLevelItem = $("#apiLevelSelector option[value='"+userApiLevel+"']").get(0);
48   selectedLevelItem.setAttribute('selected',true);
49 }
50
51 function changeApiLevel() {
52   var maxLevel = SINCE_DATA.length;
53   var userApiLevelEnabled = readCookie(API_LEVEL_ENABLED_COOKIE);
54   var selectedLevel = maxLevel;
55   
56   if (userApiLevelEnabled == 0) {
57     toggleVisisbleApis(selectedLevel, "body");
58   } else {
59     selectedLevel = $("#apiLevelSelector option:selected").val();
60     toggleVisisbleApis(selectedLevel, "body");
61     
62     var date = new Date();
63     date.setTime(date.getTime()+(10*365*24*60*60*1000)); // keep this for 10 years
64     var expiration = date.toGMTString();
65     writeCookie(API_LEVEL_COOKIE, selectedLevel, null, expiration);
66   }
67   
68   if (selectedLevel < minLevel) {
69     var thing = ($("#jd-header").html().indexOf("package") != -1) ? "package" : "class";
70     $("#naMessage").show().html("<div><p><strong>This " + thing + " is not available with API Level " + selectedLevel + ".</strong></p>"
71                               + "<p>To use this " + thing + ", your application must specify API Level " + minLevel + " or higher in its manifest "
72                               + "and be compiled against a version of the Android library that supports an equal or higher API Level. To reveal this "
73                               + "document, change the value of the API Level filter above.</p>"
74                               + "<p><a href='" +toRoot+ "guide/appendix/api-levels.html'>What is the API Level?</a></p></div>");
75   } else {
76     $("#naMessage").hide();
77   }
78 }
79
80 function toggleVisisbleApis(selectedLevel, context) {
81   var apis = $(".api",context);
82   apis.each(function(i) {
83     var obj = $(this);
84     var className = obj.attr("class");
85     var apiLevelIndex = className.lastIndexOf("-")+1;
86     var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
87     apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
88     var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
89     if (apiLevel > selectedLevel) obj.addClass("absent").attr("title","Requires API Level "+apiLevel+" or higher");
90     else obj.removeClass("absent").removeAttr("title");
91   });
92 }
93
94 /* NAVTREE */
95
96 function new_node(me, mom, text, link, children_data, api_level)
97 {
98   var node = new Object();
99   node.children = Array();
100   node.children_data = children_data;
101   node.depth = mom.depth + 1;
102
103   node.li = document.createElement("li");
104   mom.get_children_ul().appendChild(node.li);
105
106   node.label_div = document.createElement("div");
107   node.label_div.className = "label";
108   if (api_level != null) {
109     $(node.label_div).addClass("api");
110     $(node.label_div).addClass("api-level-"+api_level);
111   }
112   node.li.appendChild(node.label_div);
113   node.label_div.style.paddingLeft = 10*node.depth + "px";
114
115   if (children_data == null) {
116     // 12 is the width of the triangle and padding extra space
117     node.label_div.style.paddingLeft = ((10*node.depth)+12) + "px";
118   } else {
119     node.label_div.style.paddingLeft = 10*node.depth + "px";
120     node.expand_toggle = document.createElement("a");
121     node.expand_toggle.href = "javascript:void(0)";
122     node.expand_toggle.onclick = function() {
123           if (node.expanded) {
124             $(node.get_children_ul()).slideUp("fast");
125             node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
126             node.expanded = false;
127           } else {
128             expand_node(me, node);
129           }
130        };
131     node.label_div.appendChild(node.expand_toggle);
132
133     node.plus_img = document.createElement("img");
134     node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
135     node.plus_img.className = "plus";
136     node.plus_img.border = "0";
137     node.expand_toggle.appendChild(node.plus_img);
138
139     node.expanded = false;
140   }
141
142   var a = document.createElement("a");
143   node.label_div.appendChild(a);
144   node.label = document.createTextNode(text);
145   a.appendChild(node.label);
146   if (link) {
147     a.href = me.toroot + link;
148   } else {
149     if (children_data != null) {
150       a.className = "nolink";
151       a.href = "javascript:void(0)";
152       a.onclick = node.expand_toggle.onclick;
153       // This next line shouldn't be necessary.  I'll buy a beer for the first
154       // person who figures out how to remove this line and have the link
155       // toggle shut on the first try. --joeo@android.com
156       node.expanded = false;
157     }
158   }
159   
160
161   node.children_ul = null;
162   node.get_children_ul = function() {
163       if (!node.children_ul) {
164         node.children_ul = document.createElement("ul");
165         node.children_ul.className = "children_ul";
166         node.children_ul.style.display = "none";
167         node.li.appendChild(node.children_ul);
168       }
169       return node.children_ul;
170     };
171
172   return node;
173 }
174
175 function expand_node(me, node)
176 {
177   if (node.children_data && !node.expanded) {
178     if (node.children_visited) {
179       $(node.get_children_ul()).slideDown("fast");
180     } else {
181       get_node(me, node);
182       if ($(node.label_div).hasClass("absent")) $(node.get_children_ul()).addClass("absent");
183       $(node.get_children_ul()).slideDown("fast");
184     }
185     node.plus_img.src = me.toroot + "assets/images/triangle-opened-small.png";
186     node.expanded = true;
187     
188     // perform api level toggling because new nodes are new to the DOM
189     var selectedLevel = $("#apiLevelSelector option:selected").val();
190     toggleVisisbleApis(selectedLevel, "#side-nav");
191   }
192 }
193
194 function get_node(me, mom)
195 {
196   mom.children_visited = true;
197   for (var i in mom.children_data) {
198     var node_data = mom.children_data[i];
199     mom.children[i] = new_node(me, mom, node_data[0], node_data[1],
200         node_data[2], node_data[3]);
201   }
202 }
203
204 function this_page_relative(toroot)
205 {
206   var full = document.location.pathname;
207   var file = "";
208   if (toroot.substr(0, 1) == "/") {
209     if (full.substr(0, toroot.length) == toroot) {
210       return full.substr(toroot.length);
211     } else {
212       // the file isn't under toroot.  Fail.
213       return null;
214     }
215   } else {
216     if (toroot != "./") {
217       toroot = "./" + toroot;
218     }
219     do {
220       if (toroot.substr(toroot.length-3, 3) == "../" || toroot == "./") {
221         var pos = full.lastIndexOf("/");
222         file = full.substr(pos) + file;
223         full = full.substr(0, pos);
224         toroot = toroot.substr(0, toroot.length-3);
225       }
226     } while (toroot != "" && toroot != "/");
227     return file.substr(1);
228   }
229 }
230
231 function find_page(url, data)
232 {
233   var nodes = data;
234   var result = null;
235   for (var i in nodes) {
236     var d = nodes[i];
237     if (d[1] == url) {
238       return new Array(i);
239     }
240     else if (d[2] != null) {
241       result = find_page(url, d[2]);
242       if (result != null) {
243         return (new Array(i).concat(result));
244       }
245     }
246   }
247   return null;
248 }
249
250 function load_navtree_data(toroot) {
251   var navtreeData = document.createElement("script");
252   navtreeData.setAttribute("type","text/javascript");
253   navtreeData.setAttribute("src", toroot+"navtree_data.js");
254   $("head").append($(navtreeData));
255 }
256
257 function init_default_navtree(toroot) {
258   init_navtree("nav-tree", toroot, NAVTREE_DATA);
259   
260   // perform api level toggling because because the whole tree is new to the DOM
261   var selectedLevel = $("#apiLevelSelector option:selected").val();
262   toggleVisisbleApis(selectedLevel, "#side-nav");
263 }
264
265 function init_navtree(navtree_id, toroot, root_nodes)
266 {
267   var me = new Object();
268   me.toroot = toroot;
269   me.node = new Object();
270
271   me.node.li = document.getElementById(navtree_id);
272   me.node.children_data = root_nodes;
273   me.node.children = new Array();
274   me.node.children_ul = document.createElement("ul");
275   me.node.get_children_ul = function() { return me.node.children_ul; };
276   //me.node.children_ul.className = "children_ul";
277   me.node.li.appendChild(me.node.children_ul);
278   me.node.depth = 0;
279
280   get_node(me, me.node);
281
282   me.this_page = this_page_relative(toroot);
283   me.breadcrumbs = find_page(me.this_page, root_nodes);
284   if (me.breadcrumbs != null && me.breadcrumbs.length != 0) {
285     var mom = me.node;
286     for (var i in me.breadcrumbs) {
287       var j = me.breadcrumbs[i];
288       mom = mom.children[j];
289       expand_node(me, mom);
290     }
291     mom.label_div.className = mom.label_div.className + " selected";
292     addLoadEvent(function() {
293       scrollIntoView("nav-tree");
294       });
295   }
296 }
297
298 /* TOGGLE INHERITED MEMBERS */
299
300 /* Toggle an inherited class (arrow toggle)
301  * @param linkObj  The link that was clicked.
302  * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
303  *                'null' to simply toggle.
304  */
305 function toggleInherited(linkObj, expand) {
306     var base = linkObj.getAttribute("id");
307     var list = document.getElementById(base + "-list");
308     var summary = document.getElementById(base + "-summary");
309     var trigger = document.getElementById(base + "-trigger");
310     var a = $(linkObj);
311     if ( (expand == null && a.hasClass("closed")) || expand ) {
312         list.style.display = "none";
313         summary.style.display = "block";
314         trigger.src = toRoot + "assets/images/triangle-opened.png";
315         a.removeClass("closed");
316         a.addClass("opened");
317     } else if ( (expand == null && a.hasClass("opened")) || (expand == false) ) {
318         list.style.display = "block";
319         summary.style.display = "none";
320         trigger.src = toRoot + "assets/images/triangle-closed.png";
321         a.removeClass("opened");
322         a.addClass("closed");
323     }
324     return false;
325 }
326
327 /* Toggle all inherited classes in a single table (e.g. all inherited methods)
328  * @param linkObj  The link that was clicked.
329  * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
330  *                'null' to simply toggle.
331  */
332 function toggleAllInherited(linkObj, expand) {
333   var a = $(linkObj);
334   var table = $(a.parent().parent().parent()); // ugly way to get table/tbody
335   var expandos = $(".jd-expando-trigger", table);
336   if ( (expand == null && a.text() == "[Expand]") || expand ) {
337     expandos.each(function(i) {
338       toggleInherited(this, true);
339     });
340     a.text("[Collapse]");
341   } else if ( (expand == null && a.text() == "[Collapse]") || (expand == false) ) {
342     expandos.each(function(i) {
343       toggleInherited(this, false);
344     });
345     a.text("[Expand]");
346   }
347   return false;
348 }
349
350 /* Toggle all inherited members in the class (link in the class title)
351  */
352 function toggleAllClassInherited() {
353   var a = $("#toggleAllClassInherited"); // get toggle link from class title
354   var toggles = $(".toggle-all", $("#doc-content"));
355   if (a.text() == "[Expand All]") {
356     toggles.each(function(i) {
357       toggleAllInherited(this, true);
358     });
359     a.text("[Collapse All]");
360   } else {
361     toggles.each(function(i) {
362       toggleAllInherited(this, false);
363     });
364     a.text("[Expand All]");
365   }
366   return false;
367 }
368
369 /* Expand all inherited members in the class. Used when initiating page search */
370 function ensureAllInheritedExpanded() {
371   var toggles = $(".toggle-all", $("#doc-content"));
372   toggles.each(function(i) {
373     toggleAllInherited(this, true);
374   });
375   $("#toggleAllClassInherited").text("[Collapse All]");
376 }
377
378
379 /* HANDLE KEY EVENTS
380  * - Listen for Ctrl+F (Cmd on Mac) and expand all inherited members (to aid page search)
381  */
382 var agent = navigator['userAgent'].toLowerCase();
383 var mac = agent.indexOf("macintosh") != -1;
384
385 $(document).keydown( function(e) {
386 var control = mac ? e.metaKey && !e.ctrlKey : e.ctrlKey; // get ctrl key
387   if (control && e.which == 70) {  // 70 is "F"
388     ensureAllInheritedExpanded();
389   }
390 });