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

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.PopupContainer");
  9. dojo.require("dojo.html.style");
  10. dojo.require("dojo.html.layout");
  11. dojo.require("dojo.html.selection");
  12. dojo.require("dojo.html.iframe");
  13. dojo.require("dojo.event.*");
  14. dojo.require("dojo.widget.*");
  15. dojo.require("dojo.widget.HtmlWidget");
  16. dojo.declare("dojo.widget.PopupContainerBase", null, function () {
  17. this.queueOnAnimationFinish = [];
  18. }, {isShowingNow:false, currentSubpopup:null, beginZIndex:1000, parentPopup:null, parent:null, popupIndex:0, aroundBox:dojo.html.boxSizing.BORDER_BOX, openedForWindow:null, processKey:function (evt) {
  19. return false;
  20. }, applyPopupBasicStyle:function () {
  21. with (this.domNode.style) {
  22. display = "none";
  23. position = "absolute";
  24. }
  25. }, aboutToShow:function () {
  26. }, open:function (x, y, parent, explodeSrc, orient, padding) {
  27. if (this.isShowingNow) {
  28. return;
  29. }
  30. if (this.animationInProgress) {
  31. this.queueOnAnimationFinish.push(this.open, arguments);
  32. return;
  33. }
  34. this.aboutToShow();
  35. var around = false, node, aroundOrient;
  36. if (typeof x == "object") {
  37. node = x;
  38. aroundOrient = explodeSrc;
  39. explodeSrc = parent;
  40. parent = y;
  41. around = true;
  42. }
  43. this.parent = parent;
  44. dojo.body().appendChild(this.domNode);
  45. explodeSrc = explodeSrc || parent["domNode"] || [];
  46. var parentPopup = null;
  47. this.isTopLevel = true;
  48. while (parent) {
  49. if (parent !== this && (parent.setOpenedSubpopup != undefined && parent.applyPopupBasicStyle != undefined)) {
  50. parentPopup = parent;
  51. this.isTopLevel = false;
  52. parentPopup.setOpenedSubpopup(this);
  53. break;
  54. }
  55. parent = parent.parent;
  56. }
  57. this.parentPopup = parentPopup;
  58. this.popupIndex = parentPopup ? parentPopup.popupIndex + 1 : 1;
  59. if (this.isTopLevel) {
  60. var button = dojo.html.isNode(explodeSrc) ? explodeSrc : null;
  61. dojo.widget.PopupManager.opened(this, button);
  62. }
  63. if (this.isTopLevel && !dojo.withGlobal(this.openedForWindow || dojo.global(), dojo.html.selection.isCollapsed)) {
  64. this._bookmark = dojo.withGlobal(this.openedForWindow || dojo.global(), dojo.html.selection.getBookmark);
  65. } else {
  66. this._bookmark = null;
  67. }
  68. if (explodeSrc instanceof Array) {
  69. explodeSrc = {left:explodeSrc[0], top:explodeSrc[1], width:0, height:0};
  70. }
  71. with (this.domNode.style) {
  72. display = "";
  73. zIndex = this.beginZIndex + this.popupIndex;
  74. }
  75. if (around) {
  76. this.move(node, padding, aroundOrient);
  77. } else {
  78. this.move(x, y, padding, orient);
  79. }
  80. this.domNode.style.display = "none";
  81. this.explodeSrc = explodeSrc;
  82. this.show();
  83. this.isShowingNow = true;
  84. }, move:function (x, y, padding, orient) {
  85. var around = (typeof x == "object");
  86. if (around) {
  87. var aroundOrient = padding;
  88. var node = x;
  89. padding = y;
  90. if (!aroundOrient) {
  91. aroundOrient = {"BL":"TL", "TL":"BL"};
  92. }
  93. dojo.html.placeOnScreenAroundElement(this.domNode, node, padding, this.aroundBox, aroundOrient);
  94. } else {
  95. if (!orient) {
  96. orient = "TL,TR,BL,BR";
  97. }
  98. dojo.html.placeOnScreen(this.domNode, x, y, padding, true, orient);
  99. }
  100. }, close:function (force) {
  101. if (force) {
  102. this.domNode.style.display = "none";
  103. }
  104. if (this.animationInProgress) {
  105. this.queueOnAnimationFinish.push(this.close, []);
  106. return;
  107. }
  108. this.closeSubpopup(force);
  109. this.hide();
  110. if (this.bgIframe) {
  111. this.bgIframe.hide();
  112. this.bgIframe.size({left:0, top:0, width:0, height:0});
  113. }
  114. if (this.isTopLevel) {
  115. dojo.widget.PopupManager.closed(this);
  116. }
  117. this.isShowingNow = false;
  118. if (this.parent) {
  119. setTimeout(dojo.lang.hitch(this, function () {
  120. try {
  121. if (this.parent["focus"]) {
  122. this.parent.focus();
  123. } else {
  124. this.parent.domNode.focus();
  125. }
  126. }
  127. catch (e) {
  128. dojo.debug("No idea how to focus to parent", e);
  129. }
  130. }), 10);
  131. }
  132. if (this._bookmark && dojo.withGlobal(this.openedForWindow || dojo.global(), dojo.html.selection.isCollapsed)) {
  133. if (this.openedForWindow) {
  134. this.openedForWindow.focus();
  135. }
  136. try {
  137. dojo.withGlobal(this.openedForWindow || dojo.global(), "moveToBookmark", dojo.html.selection, [this._bookmark]);
  138. }
  139. catch (e) {
  140. }
  141. }
  142. this._bookmark = null;
  143. }, closeAll:function (force) {
  144. if (this.parentPopup) {
  145. this.parentPopup.closeAll(force);
  146. } else {
  147. this.close(force);
  148. }
  149. }, setOpenedSubpopup:function (popup) {
  150. this.currentSubpopup = popup;
  151. }, closeSubpopup:function (force) {
  152. if (this.currentSubpopup == null) {
  153. return;
  154. }
  155. this.currentSubpopup.close(force);
  156. this.currentSubpopup = null;
  157. }, onShow:function () {
  158. dojo.widget.PopupContainer.superclass.onShow.apply(this, arguments);
  159. this.openedSize = {w:this.domNode.style.width, h:this.domNode.style.height};
  160. if (dojo.render.html.ie) {
  161. if (!this.bgIframe) {
  162. this.bgIframe = new dojo.html.BackgroundIframe();
  163. this.bgIframe.setZIndex(this.domNode);
  164. }
  165. this.bgIframe.size(this.domNode);
  166. this.bgIframe.show();
  167. }
  168. this.processQueue();
  169. }, processQueue:function () {
  170. if (!this.queueOnAnimationFinish.length) {
  171. return;
  172. }
  173. var func = this.queueOnAnimationFinish.shift();
  174. var args = this.queueOnAnimationFinish.shift();
  175. func.apply(this, args);
  176. }, onHide:function () {
  177. dojo.widget.HtmlWidget.prototype.onHide.call(this);
  178. if (this.openedSize) {
  179. with (this.domNode.style) {
  180. width = this.openedSize.w;
  181. height = this.openedSize.h;
  182. }
  183. }
  184. this.processQueue();
  185. }});
  186. dojo.widget.defineWidget("dojo.widget.PopupContainer", [dojo.widget.HtmlWidget, dojo.widget.PopupContainerBase], {isContainer:true, fillInTemplate:function () {
  187. this.applyPopupBasicStyle();
  188. dojo.widget.PopupContainer.superclass.fillInTemplate.apply(this, arguments);
  189. }});
  190. dojo.widget.PopupManager = new function () {
  191. this.currentMenu = null;
  192. this.currentButton = null;
  193. this.currentFocusMenu = null;
  194. this.focusNode = null;
  195. this.registeredWindows = [];
  196. this.registerWin = function (win) {
  197. if (!win.__PopupManagerRegistered) {
  198. dojo.event.connect(win.document, "onmousedown", this, "onClick");
  199. dojo.event.connect(win, "onscroll", this, "onClick");
  200. dojo.event.connect(win.document, "onkey", this, "onKey");
  201. win.__PopupManagerRegistered = true;
  202. this.registeredWindows.push(win);
  203. }
  204. };
  205. this.registerAllWindows = function (targetWindow) {
  206. if (!targetWindow) {
  207. targetWindow = dojo.html.getDocumentWindow(window.top && window.top.document || window.document);
  208. }
  209. this.registerWin(targetWindow);
  210. for (var i = 0; i < targetWindow.frames.length; i++) {
  211. try {
  212. var win = dojo.html.getDocumentWindow(targetWindow.frames[i].document);
  213. if (win) {
  214. this.registerAllWindows(win);
  215. }
  216. }
  217. catch (e) {
  218. }
  219. }
  220. };
  221. this.unRegisterWin = function (win) {
  222. if (win.__PopupManagerRegistered) {
  223. dojo.event.disconnect(win.document, "onmousedown", this, "onClick");
  224. dojo.event.disconnect(win, "onscroll", this, "onClick");
  225. dojo.event.disconnect(win.document, "onkey", this, "onKey");
  226. win.__PopupManagerRegistered = false;
  227. }
  228. };
  229. this.unRegisterAllWindows = function () {
  230. for (var i = 0; i < this.registeredWindows.length; ++i) {
  231. this.unRegisterWin(this.registeredWindows[i]);
  232. }
  233. this.registeredWindows = [];
  234. };
  235. dojo.addOnLoad(this, "registerAllWindows");
  236. dojo.addOnUnload(this, "unRegisterAllWindows");
  237. this.closed = function (menu) {
  238. if (this.currentMenu == menu) {
  239. this.currentMenu = null;
  240. this.currentButton = null;
  241. this.currentFocusMenu = null;
  242. }
  243. };
  244. this.opened = function (menu, button) {
  245. if (menu == this.currentMenu) {
  246. return;
  247. }
  248. if (this.currentMenu) {
  249. this.currentMenu.close();
  250. }
  251. this.currentMenu = menu;
  252. this.currentFocusMenu = menu;
  253. this.currentButton = button;
  254. };
  255. this.setFocusedMenu = function (menu) {
  256. this.currentFocusMenu = menu;
  257. };
  258. this.onKey = function (e) {
  259. if (!e.key) {
  260. return;
  261. }
  262. if (!this.currentMenu || !this.currentMenu.isShowingNow) {
  263. return;
  264. }
  265. var m = this.currentFocusMenu;
  266. while (m) {
  267. if (m.processKey(e)) {
  268. e.preventDefault();
  269. e.stopPropagation();
  270. break;
  271. }
  272. m = m.parentPopup || m.parentMenu;
  273. }
  274. }, this.onClick = function (e) {
  275. if (!this.currentMenu) {
  276. return;
  277. }
  278. var scrolloffset = dojo.html.getScroll().offset;
  279. var m = this.currentMenu;
  280. while (m) {
  281. if (dojo.html.overElement(m.domNode, e) || dojo.html.isDescendantOf(e.target, m.domNode)) {
  282. return;
  283. }
  284. m = m.currentSubpopup;
  285. }
  286. if (this.currentButton && dojo.html.overElement(this.currentButton, e)) {
  287. return;
  288. }
  289. this.currentMenu.closeAll(true);
  290. };
  291. };