Widget.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:10k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.widget.Widget");
  9. dojo.require("dojo.lang.func");
  10. dojo.require("dojo.lang.array");
  11. dojo.require("dojo.lang.extras");
  12. dojo.require("dojo.lang.declare");
  13. dojo.require("dojo.ns");
  14. dojo.require("dojo.widget.Manager");
  15. dojo.require("dojo.event.*");
  16. dojo.require("dojo.a11y");
  17. dojo.declare("dojo.widget.Widget", null, function () {
  18. this.children = [];
  19. this.extraArgs = {};
  20. }, {parent:null, isTopLevel:false, disabled:false, isContainer:false, widgetId:"", widgetType:"Widget", ns:"dojo", getNamespacedType:function () {
  21. return (this.ns ? this.ns + ":" + this.widgetType : this.widgetType).toLowerCase();
  22. }, toString:function () {
  23. return "[Widget " + this.getNamespacedType() + ", " + (this.widgetId || "NO ID") + "]";
  24. }, repr:function () {
  25. return this.toString();
  26. }, enable:function () {
  27. this.disabled = false;
  28. }, disable:function () {
  29. this.disabled = true;
  30. }, onResized:function () {
  31. this.notifyChildrenOfResize();
  32. }, notifyChildrenOfResize:function () {
  33. for (var i = 0; i < this.children.length; i++) {
  34. var child = this.children[i];
  35. if (child.onResized) {
  36. child.onResized();
  37. }
  38. }
  39. }, create:function (args, fragment, parent, ns) {
  40. if (ns) {
  41. this.ns = ns;
  42. }
  43. this.satisfyPropertySets(args, fragment, parent);
  44. this.mixInProperties(args, fragment, parent);
  45. this.postMixInProperties(args, fragment, parent);
  46. dojo.widget.manager.add(this);
  47. this.buildRendering(args, fragment, parent);
  48. this.initialize(args, fragment, parent);
  49. this.postInitialize(args, fragment, parent);
  50. this.postCreate(args, fragment, parent);
  51. return this;
  52. }, destroy:function (finalize) {
  53. if (this.parent) {
  54. this.parent.removeChild(this);
  55. }
  56. this.destroyChildren();
  57. this.uninitialize();
  58. this.destroyRendering(finalize);
  59. dojo.widget.manager.removeById(this.widgetId);
  60. }, destroyChildren:function () {
  61. var widget;
  62. var i = 0;
  63. while (this.children.length > i) {
  64. widget = this.children[i];
  65. if (widget instanceof dojo.widget.Widget) {
  66. this.removeChild(widget);
  67. widget.destroy();
  68. continue;
  69. }
  70. i++;
  71. }
  72. }, getChildrenOfType:function (type, recurse) {
  73. var ret = [];
  74. var isFunc = dojo.lang.isFunction(type);
  75. if (!isFunc) {
  76. type = type.toLowerCase();
  77. }
  78. for (var x = 0; x < this.children.length; x++) {
  79. if (isFunc) {
  80. if (this.children[x] instanceof type) {
  81. ret.push(this.children[x]);
  82. }
  83. } else {
  84. if (this.children[x].widgetType.toLowerCase() == type) {
  85. ret.push(this.children[x]);
  86. }
  87. }
  88. if (recurse) {
  89. ret = ret.concat(this.children[x].getChildrenOfType(type, recurse));
  90. }
  91. }
  92. return ret;
  93. }, getDescendants:function () {
  94. var result = [];
  95. var stack = [this];
  96. var elem;
  97. while ((elem = stack.pop())) {
  98. result.push(elem);
  99. if (elem.children) {
  100. dojo.lang.forEach(elem.children, function (elem) {
  101. stack.push(elem);
  102. });
  103. }
  104. }
  105. return result;
  106. }, isFirstChild:function () {
  107. return this === this.parent.children[0];
  108. }, isLastChild:function () {
  109. return this === this.parent.children[this.parent.children.length - 1];
  110. }, satisfyPropertySets:function (args) {
  111. return args;
  112. }, mixInProperties:function (args, frag) {
  113. if ((args["fastMixIn"]) || (frag["fastMixIn"])) {
  114. for (var x in args) {
  115. this[x] = args[x];
  116. }
  117. return;
  118. }
  119. var undef;
  120. var lcArgs = dojo.widget.lcArgsCache[this.widgetType];
  121. if (lcArgs == null) {
  122. lcArgs = {};
  123. for (var y in this) {
  124. lcArgs[((new String(y)).toLowerCase())] = y;
  125. }
  126. dojo.widget.lcArgsCache[this.widgetType] = lcArgs;
  127. }
  128. var visited = {};
  129. for (var x in args) {
  130. if (!this[x]) {
  131. var y = lcArgs[(new String(x)).toLowerCase()];
  132. if (y) {
  133. args[y] = args[x];
  134. x = y;
  135. }
  136. }
  137. if (visited[x]) {
  138. continue;
  139. }
  140. visited[x] = true;
  141. if ((typeof this[x]) != (typeof undef)) {
  142. if (typeof args[x] != "string") {
  143. this[x] = args[x];
  144. } else {
  145. if (dojo.lang.isString(this[x])) {
  146. this[x] = args[x];
  147. } else {
  148. if (dojo.lang.isNumber(this[x])) {
  149. this[x] = new Number(args[x]);
  150. } else {
  151. if (dojo.lang.isBoolean(this[x])) {
  152. this[x] = (args[x].toLowerCase() == "false") ? false : true;
  153. } else {
  154. if (dojo.lang.isFunction(this[x])) {
  155. if (args[x].search(/[^w.]+/i) == -1) {
  156. this[x] = dojo.evalObjPath(args[x], false);
  157. } else {
  158. var tn = dojo.lang.nameAnonFunc(new Function(args[x]), this);
  159. dojo.event.kwConnect({srcObj:this, srcFunc:x, adviceObj:this, adviceFunc:tn});
  160. }
  161. } else {
  162. if (dojo.lang.isArray(this[x])) {
  163. this[x] = args[x].split(";");
  164. } else {
  165. if (this[x] instanceof Date) {
  166. this[x] = new Date(Number(args[x]));
  167. } else {
  168. if (typeof this[x] == "object") {
  169. if (this[x] instanceof dojo.uri.Uri) {
  170. this[x] = dojo.uri.dojoUri(args[x]);
  171. } else {
  172. var pairs = args[x].split(";");
  173. for (var y = 0; y < pairs.length; y++) {
  174. var si = pairs[y].indexOf(":");
  175. if ((si != -1) && (pairs[y].length > si)) {
  176. this[x][pairs[y].substr(0, si).replace(/^s+|s+$/g, "")] = pairs[y].substr(si + 1);
  177. }
  178. }
  179. }
  180. } else {
  181. this[x] = args[x];
  182. }
  183. }
  184. }
  185. }
  186. }
  187. }
  188. }
  189. }
  190. } else {
  191. this.extraArgs[x.toLowerCase()] = args[x];
  192. }
  193. }
  194. }, postMixInProperties:function (args, frag, parent) {
  195. }, initialize:function (args, frag, parent) {
  196. return false;
  197. }, postInitialize:function (args, frag, parent) {
  198. return false;
  199. }, postCreate:function (args, frag, parent) {
  200. return false;
  201. }, uninitialize:function () {
  202. return false;
  203. }, buildRendering:function (args, frag, parent) {
  204. dojo.unimplemented("dojo.widget.Widget.buildRendering, on " + this.toString() + ", ");
  205. return false;
  206. }, destroyRendering:function () {
  207. dojo.unimplemented("dojo.widget.Widget.destroyRendering");
  208. return false;
  209. }, addedTo:function (parent) {
  210. }, addChild:function (child) {
  211. dojo.unimplemented("dojo.widget.Widget.addChild");
  212. return false;
  213. }, removeChild:function (widget) {
  214. for (var x = 0; x < this.children.length; x++) {
  215. if (this.children[x] === widget) {
  216. this.children.splice(x, 1);
  217. widget.parent = null;
  218. break;
  219. }
  220. }
  221. return widget;
  222. }, getPreviousSibling:function () {
  223. var idx = this.getParentIndex();
  224. if (idx <= 0) {
  225. return null;
  226. }
  227. return this.parent.children[idx - 1];
  228. }, getSiblings:function () {
  229. return this.parent.children;
  230. }, getParentIndex:function () {
  231. return dojo.lang.indexOf(this.parent.children, this, true);
  232. }, getNextSibling:function () {
  233. var idx = this.getParentIndex();
  234. if (idx == this.parent.children.length - 1) {
  235. return null;
  236. }
  237. if (idx < 0) {
  238. return null;
  239. }
  240. return this.parent.children[idx + 1];
  241. }});
  242. dojo.widget.lcArgsCache = {};
  243. dojo.widget.tags = {};
  244. dojo.widget.tags.addParseTreeHandler = function (type) {
  245. dojo.deprecated("addParseTreeHandler", ". ParseTreeHandlers are now reserved for components. Any unfiltered DojoML tag without a ParseTreeHandler is assumed to be a widget", "0.5");
  246. };
  247. dojo.widget.tags["dojo:propertyset"] = function (fragment, widgetParser, parentComp) {
  248. var properties = widgetParser.parseProperties(fragment["dojo:propertyset"]);
  249. };
  250. dojo.widget.tags["dojo:connect"] = function (fragment, widgetParser, parentComp) {
  251. var properties = widgetParser.parseProperties(fragment["dojo:connect"]);
  252. };
  253. dojo.widget.buildWidgetFromParseTree = function (type, frag, parser, parentComp, insertionIndex, localProps) {
  254. dojo.a11y.setAccessibleMode();
  255. var stype = type.split(":");
  256. stype = (stype.length == 2) ? stype[1] : type;
  257. var localProperties = localProps || parser.parseProperties(frag[frag["ns"] + ":" + stype]);
  258. var twidget = dojo.widget.manager.getImplementation(stype, null, null, frag["ns"]);
  259. if (!twidget) {
  260. throw new Error("cannot find "" + type + "" widget");
  261. } else {
  262. if (!twidget.create) {
  263. throw new Error(""" + type + "" widget object has no "create" method and does not appear to implement *Widget");
  264. }
  265. }
  266. localProperties["dojoinsertionindex"] = insertionIndex;
  267. var ret = twidget.create(localProperties, frag, parentComp, frag["ns"]);
  268. return ret;
  269. };
  270. dojo.widget.defineWidget = function (widgetClass, renderer, superclasses, init, props) {
  271. if (dojo.lang.isString(arguments[3])) {
  272. dojo.widget._defineWidget(arguments[0], arguments[3], arguments[1], arguments[4], arguments[2]);
  273. } else {
  274. var args = [arguments[0]], p = 3;
  275. if (dojo.lang.isString(arguments[1])) {
  276. args.push(arguments[1], arguments[2]);
  277. } else {
  278. args.push("", arguments[1]);
  279. p = 2;
  280. }
  281. if (dojo.lang.isFunction(arguments[p])) {
  282. args.push(arguments[p], arguments[p + 1]);
  283. } else {
  284. args.push(null, arguments[p]);
  285. }
  286. dojo.widget._defineWidget.apply(this, args);
  287. }
  288. };
  289. dojo.widget.defineWidget.renderers = "html|svg|vml";
  290. dojo.widget._defineWidget = function (widgetClass, renderer, superclasses, init, props) {
  291. var module = widgetClass.split(".");
  292. var type = module.pop();
  293. var regx = "\.(" + (renderer ? renderer + "|" : "") + dojo.widget.defineWidget.renderers + ")\.";
  294. var r = widgetClass.search(new RegExp(regx));
  295. module = (r < 0 ? module.join(".") : widgetClass.substr(0, r));
  296. dojo.widget.manager.registerWidgetPackage(module);
  297. var pos = module.indexOf(".");
  298. var nsName = (pos > -1) ? module.substring(0, pos) : module;
  299. props = (props) || {};
  300. props.widgetType = type;
  301. if ((!init) && (props["classConstructor"])) {
  302. init = props.classConstructor;
  303. delete props.classConstructor;
  304. }
  305. dojo.declare(widgetClass, superclasses, init, props);
  306. };