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

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.FisheyeList");
  9. dojo.require("dojo.widget.*");
  10. dojo.require("dojo.widget.HtmlWidget");
  11. dojo.require("dojo.html.style");
  12. dojo.require("dojo.html.selection");
  13. dojo.require("dojo.html.util");
  14. dojo.require("dojo.event.*");
  15. dojo.widget.defineWidget("dojo.widget.FisheyeList", dojo.widget.HtmlWidget, function () {
  16. this.pos = {x:-1, y:-1};
  17. this.EDGE = {CENTER:0, LEFT:1, RIGHT:2, TOP:3, BOTTOM:4};
  18. this.timerScale = 1;
  19. }, {templateString:"<div class="dojoHtmlFisheyeListBar"></div>", templateCssString:".dojoHtmlFisheyeListItemLabel {ntfont-family: Arial, Helvetica, sans-serif;ntbackground-color: #eee;ntborder: 2px solid #666;ntpadding: 2px;nttext-align: center;ntposition: absolute;ntdisplay: none;n}nn.dojoHtmlFisheyeListItemLabel.selected {ntdisplay: block;n}nn.dojoHtmlFisheyeListItemImage {ntborder: 0px;ntposition: absolute;n}nn.dojoHtmlFisheyeListItem {ntposition: absolute;ntz-index: 2;n}nn.dojoHtmlFisheyeListBar {ntposition: relative;n}n", templateCssPath:dojo.uri.moduleUri("dojo.widget", "templates/FisheyeList.css"), isContainer:true, snarfChildDomOutput:true, itemWidth:40, itemHeight:40, itemMaxWidth:150, itemMaxHeight:150, orientation:"horizontal", conservativeTrigger:false, effectUnits:2, itemPadding:10, attachEdge:"center", labelEdge:"bottom", enableCrappySvgSupport:false, fillInTemplate:function () {
  20. dojo.html.disableSelection(this.domNode);
  21. this.isHorizontal = (this.orientation == "horizontal");
  22. this.selectedNode = -1;
  23. this.isOver = false;
  24. this.hitX1 = -1;
  25. this.hitY1 = -1;
  26. this.hitX2 = -1;
  27. this.hitY2 = -1;
  28. this.anchorEdge = this._toEdge(this.attachEdge, this.EDGE.CENTER);
  29. this.labelEdge = this._toEdge(this.labelEdge, this.EDGE.TOP);
  30. if (this.isHorizontal && (this.anchorEdge == this.EDGE.LEFT)) {
  31. this.anchorEdge = this.EDGE.CENTER;
  32. }
  33. if (this.isHorizontal && (this.anchorEdge == this.EDGE.RIGHT)) {
  34. this.anchorEdge = this.EDGE.CENTER;
  35. }
  36. if (!this.isHorizontal && (this.anchorEdge == this.EDGE.TOP)) {
  37. this.anchorEdge = this.EDGE.CENTER;
  38. }
  39. if (!this.isHorizontal && (this.anchorEdge == this.EDGE.BOTTOM)) {
  40. this.anchorEdge = this.EDGE.CENTER;
  41. }
  42. if (this.labelEdge == this.EDGE.CENTER) {
  43. this.labelEdge = this.EDGE.TOP;
  44. }
  45. if (this.isHorizontal && (this.labelEdge == this.EDGE.LEFT)) {
  46. this.labelEdge = this.EDGE.TOP;
  47. }
  48. if (this.isHorizontal && (this.labelEdge == this.EDGE.RIGHT)) {
  49. this.labelEdge = this.EDGE.TOP;
  50. }
  51. if (!this.isHorizontal && (this.labelEdge == this.EDGE.TOP)) {
  52. this.labelEdge = this.EDGE.LEFT;
  53. }
  54. if (!this.isHorizontal && (this.labelEdge == this.EDGE.BOTTOM)) {
  55. this.labelEdge = this.EDGE.LEFT;
  56. }
  57. this.proximityLeft = this.itemWidth * (this.effectUnits - 0.5);
  58. this.proximityRight = this.itemWidth * (this.effectUnits - 0.5);
  59. this.proximityTop = this.itemHeight * (this.effectUnits - 0.5);
  60. this.proximityBottom = this.itemHeight * (this.effectUnits - 0.5);
  61. if (this.anchorEdge == this.EDGE.LEFT) {
  62. this.proximityLeft = 0;
  63. }
  64. if (this.anchorEdge == this.EDGE.RIGHT) {
  65. this.proximityRight = 0;
  66. }
  67. if (this.anchorEdge == this.EDGE.TOP) {
  68. this.proximityTop = 0;
  69. }
  70. if (this.anchorEdge == this.EDGE.BOTTOM) {
  71. this.proximityBottom = 0;
  72. }
  73. if (this.anchorEdge == this.EDGE.CENTER) {
  74. this.proximityLeft /= 2;
  75. this.proximityRight /= 2;
  76. this.proximityTop /= 2;
  77. this.proximityBottom /= 2;
  78. }
  79. }, postCreate:function () {
  80. this._initializePositioning();
  81. if (!this.conservativeTrigger) {
  82. dojo.event.connect(document.documentElement, "onmousemove", this, "_onMouseMove");
  83. }
  84. dojo.event.connect(document.documentElement, "onmouseout", this, "_onBodyOut");
  85. dojo.event.connect(this, "addChild", this, "_initializePositioning");
  86. }, _initializePositioning:function () {
  87. this.itemCount = this.children.length;
  88. this.barWidth = (this.isHorizontal ? this.itemCount : 1) * this.itemWidth;
  89. this.barHeight = (this.isHorizontal ? 1 : this.itemCount) * this.itemHeight;
  90. this.totalWidth = this.proximityLeft + this.proximityRight + this.barWidth;
  91. this.totalHeight = this.proximityTop + this.proximityBottom + this.barHeight;
  92. for (var i = 0; i < this.children.length; i++) {
  93. this.children[i].posX = this.itemWidth * (this.isHorizontal ? i : 0);
  94. this.children[i].posY = this.itemHeight * (this.isHorizontal ? 0 : i);
  95. this.children[i].cenX = this.children[i].posX + (this.itemWidth / 2);
  96. this.children[i].cenY = this.children[i].posY + (this.itemHeight / 2);
  97. var isz = this.isHorizontal ? this.itemWidth : this.itemHeight;
  98. var r = this.effectUnits * isz;
  99. var c = this.isHorizontal ? this.children[i].cenX : this.children[i].cenY;
  100. var lhs = this.isHorizontal ? this.proximityLeft : this.proximityTop;
  101. var rhs = this.isHorizontal ? this.proximityRight : this.proximityBottom;
  102. var siz = this.isHorizontal ? this.barWidth : this.barHeight;
  103. var range_lhs = r;
  104. var range_rhs = r;
  105. if (range_lhs > c + lhs) {
  106. range_lhs = c + lhs;
  107. }
  108. if (range_rhs > (siz - c + rhs)) {
  109. range_rhs = siz - c + rhs;
  110. }
  111. this.children[i].effectRangeLeft = range_lhs / isz;
  112. this.children[i].effectRangeRght = range_rhs / isz;
  113. }
  114. this.domNode.style.width = this.barWidth + "px";
  115. this.domNode.style.height = this.barHeight + "px";
  116. for (var i = 0; i < this.children.length; i++) {
  117. var itm = this.children[i];
  118. var elm = itm.domNode;
  119. elm.style.left = itm.posX + "px";
  120. elm.style.top = itm.posY + "px";
  121. elm.style.width = this.itemWidth + "px";
  122. elm.style.height = this.itemHeight + "px";
  123. if (itm.svgNode) {
  124. itm.svgNode.style.position = "absolute";
  125. itm.svgNode.style.left = this.itemPadding + "%";
  126. itm.svgNode.style.top = this.itemPadding + "%";
  127. itm.svgNode.style.width = (100 - 2 * this.itemPadding) + "%";
  128. itm.svgNode.style.height = (100 - 2 * this.itemPadding) + "%";
  129. itm.svgNode.style.zIndex = 1;
  130. itm.svgNode.setSize(this.itemWidth, this.itemHeight);
  131. } else {
  132. itm.imgNode.style.left = this.itemPadding + "%";
  133. itm.imgNode.style.top = this.itemPadding + "%";
  134. itm.imgNode.style.width = (100 - 2 * this.itemPadding) + "%";
  135. itm.imgNode.style.height = (100 - 2 * this.itemPadding) + "%";
  136. }
  137. }
  138. this._calcHitGrid();
  139. }, _onBodyOut:function (e) {
  140. if (dojo.html.overElement(dojo.body(), e)) {
  141. return;
  142. }
  143. this._setDormant(e);
  144. }, _setDormant:function (e) {
  145. if (!this.isOver) {
  146. return;
  147. }
  148. this.isOver = false;
  149. if (this.conservativeTrigger) {
  150. dojo.event.disconnect(document.documentElement, "onmousemove", this, "_onMouseMove");
  151. }
  152. this._onGridMouseMove(-1, -1);
  153. }, _setActive:function (e) {
  154. if (this.isOver) {
  155. return;
  156. }
  157. this.isOver = true;
  158. if (this.conservativeTrigger) {
  159. dojo.event.connect(document.documentElement, "onmousemove", this, "_onMouseMove");
  160. this.timerScale = 0;
  161. this._onMouseMove(e);
  162. this._expandSlowly();
  163. }
  164. }, _onMouseMove:function (e) {
  165. if ((e.pageX >= this.hitX1) && (e.pageX <= this.hitX2) && (e.pageY >= this.hitY1) && (e.pageY <= this.hitY2)) {
  166. if (!this.isOver) {
  167. this._setActive(e);
  168. }
  169. this._onGridMouseMove(e.pageX - this.hitX1, e.pageY - this.hitY1);
  170. } else {
  171. if (this.isOver) {
  172. this._setDormant(e);
  173. }
  174. }
  175. }, onResized:function () {
  176. this._calcHitGrid();
  177. }, _onGridMouseMove:function (x, y) {
  178. this.pos = {x:x, y:y};
  179. this._paint();
  180. }, _paint:function () {
  181. var x = this.pos.x;
  182. var y = this.pos.y;
  183. if (this.itemCount <= 0) {
  184. return;
  185. }
  186. var pos = this.isHorizontal ? x : y;
  187. var prx = this.isHorizontal ? this.proximityLeft : this.proximityTop;
  188. var siz = this.isHorizontal ? this.itemWidth : this.itemHeight;
  189. var sim = this.isHorizontal ? (1 - this.timerScale) * this.itemWidth + this.timerScale * this.itemMaxWidth : (1 - this.timerScale) * this.itemHeight + this.timerScale * this.itemMaxHeight;
  190. var cen = ((pos - prx) / siz) - 0.5;
  191. var max_off_cen = (sim / siz) - 0.5;
  192. if (max_off_cen > this.effectUnits) {
  193. max_off_cen = this.effectUnits;
  194. }
  195. var off_weight = 0;
  196. if (this.anchorEdge == this.EDGE.BOTTOM) {
  197. var cen2 = (y - this.proximityTop) / this.itemHeight;
  198. off_weight = (cen2 > 0.5) ? 1 : y / (this.proximityTop + (this.itemHeight / 2));
  199. }
  200. if (this.anchorEdge == this.EDGE.TOP) {
  201. var cen2 = (y - this.proximityTop) / this.itemHeight;
  202. off_weight = (cen2 < 0.5) ? 1 : (this.totalHeight - y) / (this.proximityBottom + (this.itemHeight / 2));
  203. }
  204. if (this.anchorEdge == this.EDGE.RIGHT) {
  205. var cen2 = (x - this.proximityLeft) / this.itemWidth;
  206. off_weight = (cen2 > 0.5) ? 1 : x / (this.proximityLeft + (this.itemWidth / 2));
  207. }
  208. if (this.anchorEdge == this.EDGE.LEFT) {
  209. var cen2 = (x - this.proximityLeft) / this.itemWidth;
  210. off_weight = (cen2 < 0.5) ? 1 : (this.totalWidth - x) / (this.proximityRight + (this.itemWidth / 2));
  211. }
  212. if (this.anchorEdge == this.EDGE.CENTER) {
  213. if (this.isHorizontal) {
  214. off_weight = y / (this.totalHeight);
  215. } else {
  216. off_weight = x / (this.totalWidth);
  217. }
  218. if (off_weight > 0.5) {
  219. off_weight = 1 - off_weight;
  220. }
  221. off_weight *= 2;
  222. }
  223. for (var i = 0; i < this.itemCount; i++) {
  224. var weight = this._weighAt(cen, i);
  225. if (weight < 0) {
  226. weight = 0;
  227. }
  228. this._setItemSize(i, weight * off_weight);
  229. }
  230. var main_p = Math.round(cen);
  231. var offset = 0;
  232. if (cen < 0) {
  233. main_p = 0;
  234. } else {
  235. if (cen > this.itemCount - 1) {
  236. main_p = this.itemCount - 1;
  237. } else {
  238. offset = (cen - main_p) * ((this.isHorizontal ? this.itemWidth : this.itemHeight) - this.children[main_p].sizeMain);
  239. }
  240. }
  241. this._positionElementsFrom(main_p, offset);
  242. }, _weighAt:function (cen, i) {
  243. var dist = Math.abs(cen - i);
  244. var limit = ((cen - i) > 0) ? this.children[i].effectRangeRght : this.children[i].effectRangeLeft;
  245. return (dist > limit) ? 0 : (1 - dist / limit);
  246. }, _setItemSize:function (p, scale) {
  247. scale *= this.timerScale;
  248. var w = Math.round(this.itemWidth + ((this.itemMaxWidth - this.itemWidth) * scale));
  249. var h = Math.round(this.itemHeight + ((this.itemMaxHeight - this.itemHeight) * scale));
  250. if (this.isHorizontal) {
  251. this.children[p].sizeW = w;
  252. this.children[p].sizeH = h;
  253. this.children[p].sizeMain = w;
  254. this.children[p].sizeOff = h;
  255. var y = 0;
  256. if (this.anchorEdge == this.EDGE.TOP) {
  257. y = (this.children[p].cenY - (this.itemHeight / 2));
  258. } else {
  259. if (this.anchorEdge == this.EDGE.BOTTOM) {
  260. y = (this.children[p].cenY - (h - (this.itemHeight / 2)));
  261. } else {
  262. y = (this.children[p].cenY - (h / 2));
  263. }
  264. }
  265. this.children[p].usualX = Math.round(this.children[p].cenX - (w / 2));
  266. this.children[p].domNode.style.top = y + "px";
  267. this.children[p].domNode.style.left = this.children[p].usualX + "px";
  268. } else {
  269. this.children[p].sizeW = w;
  270. this.children[p].sizeH = h;
  271. this.children[p].sizeOff = w;
  272. this.children[p].sizeMain = h;
  273. var x = 0;
  274. if (this.anchorEdge == this.EDGE.LEFT) {
  275. x = this.children[p].cenX - (this.itemWidth / 2);
  276. } else {
  277. if (this.anchorEdge == this.EDGE.RIGHT) {
  278. x = this.children[p].cenX - (w - (this.itemWidth / 2));
  279. } else {
  280. x = this.children[p].cenX - (w / 2);
  281. }
  282. }
  283. this.children[p].domNode.style.left = x + "px";
  284. this.children[p].usualY = Math.round(this.children[p].cenY - (h / 2));
  285. this.children[p].domNode.style.top = this.children[p].usualY + "px";
  286. }
  287. this.children[p].domNode.style.width = w + "px";
  288. this.children[p].domNode.style.height = h + "px";
  289. if (this.children[p].svgNode) {
  290. this.children[p].svgNode.setSize(w, h);
  291. }
  292. }, _positionElementsFrom:function (p, offset) {
  293. var pos = 0;
  294. if (this.isHorizontal) {
  295. pos = Math.round(this.children[p].usualX + offset);
  296. this.children[p].domNode.style.left = pos + "px";
  297. } else {
  298. pos = Math.round(this.children[p].usualY + offset);
  299. this.children[p].domNode.style.top = pos + "px";
  300. }
  301. this._positionLabel(this.children[p]);
  302. var bpos = pos;
  303. for (var i = p - 1; i >= 0; i--) {
  304. bpos -= this.children[i].sizeMain;
  305. if (this.isHorizontal) {
  306. this.children[i].domNode.style.left = bpos + "px";
  307. } else {
  308. this.children[i].domNode.style.top = bpos + "px";
  309. }
  310. this._positionLabel(this.children[i]);
  311. }
  312. var apos = pos;
  313. for (var i = p + 1; i < this.itemCount; i++) {
  314. apos += this.children[i - 1].sizeMain;
  315. if (this.isHorizontal) {
  316. this.children[i].domNode.style.left = apos + "px";
  317. } else {
  318. this.children[i].domNode.style.top = apos + "px";
  319. }
  320. this._positionLabel(this.children[i]);
  321. }
  322. }, _positionLabel:function (itm) {
  323. var x = 0;
  324. var y = 0;
  325. var mb = dojo.html.getMarginBox(itm.lblNode);
  326. if (this.labelEdge == this.EDGE.TOP) {
  327. x = Math.round((itm.sizeW / 2) - (mb.width / 2));
  328. y = -mb.height;
  329. }
  330. if (this.labelEdge == this.EDGE.BOTTOM) {
  331. x = Math.round((itm.sizeW / 2) - (mb.width / 2));
  332. y = itm.sizeH;
  333. }
  334. if (this.labelEdge == this.EDGE.LEFT) {
  335. x = -mb.width;
  336. y = Math.round((itm.sizeH / 2) - (mb.height / 2));
  337. }
  338. if (this.labelEdge == this.EDGE.RIGHT) {
  339. x = itm.sizeW;
  340. y = Math.round((itm.sizeH / 2) - (mb.height / 2));
  341. }
  342. itm.lblNode.style.left = x + "px";
  343. itm.lblNode.style.top = y + "px";
  344. }, _calcHitGrid:function () {
  345. var pos = dojo.html.getAbsolutePosition(this.domNode, true);
  346. this.hitX1 = pos.x - this.proximityLeft;
  347. this.hitY1 = pos.y - this.proximityTop;
  348. this.hitX2 = this.hitX1 + this.totalWidth;
  349. this.hitY2 = this.hitY1 + this.totalHeight;
  350. }, _toEdge:function (inp, def) {
  351. return this.EDGE[inp.toUpperCase()] || def;
  352. }, _expandSlowly:function () {
  353. if (!this.isOver) {
  354. return;
  355. }
  356. this.timerScale += 0.2;
  357. this._paint();
  358. if (this.timerScale < 1) {
  359. dojo.lang.setTimeout(this, "_expandSlowly", 10);
  360. }
  361. }, destroy:function () {
  362. dojo.event.disconnect(document.documentElement, "onmouseout", this, "_onBodyOut");
  363. dojo.event.disconnect(document.documentElement, "onmousemove", this, "_onMouseMove");
  364. dojo.widget.FisheyeList.superclass.destroy.call(this);
  365. }});
  366. dojo.widget.defineWidget("dojo.widget.FisheyeListItem", dojo.widget.HtmlWidget, {iconSrc:"", svgSrc:"", caption:"", id:"", _blankImgPath:dojo.uri.moduleUri("dojo.widget", "templates/images/blank.gif"), templateString:"<div class="dojoHtmlFisheyeListItem">" + "  <img class="dojoHtmlFisheyeListItemImage" dojoAttachPoint="imgNode" dojoAttachEvent="onMouseOver;onMouseOut;onClick">" + "  <div class="dojoHtmlFisheyeListItemLabel" dojoAttachPoint="lblNode"></div>" + "</div>", fillInTemplate:function () {
  367. if (this.svgSrc != "") {
  368. this.svgNode = this._createSvgNode(this.svgSrc);
  369. this.domNode.appendChild(this.svgNode);
  370. this.imgNode.style.display = "none";
  371. } else {
  372. if ((this.iconSrc.toLowerCase().substring(this.iconSrc.length - 4) == ".png") && (dojo.render.html.ie) && (!dojo.render.html.ie70)) {
  373. if (dojo.dom.hasParent(this.imgNode) && this.id != "") {
  374. var parent = this.imgNode.parentNode;
  375. parent.setAttribute("id", this.id);
  376. }
  377. this.imgNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.iconSrc + "', sizingMethod='scale')";
  378. this.imgNode.src = this._blankImgPath.toString();
  379. } else {
  380. if (dojo.dom.hasParent(this.imgNode) && this.id != "") {
  381. var parent = this.imgNode.parentNode;
  382. parent.setAttribute("id", this.id);
  383. }
  384. this.imgNode.src = this.iconSrc;
  385. }
  386. }
  387. if (this.lblNode) {
  388. this.lblNode.appendChild(document.createTextNode(this.caption));
  389. }
  390. dojo.html.disableSelection(this.domNode);
  391. }, _createSvgNode:function (src) {
  392. var elm = document.createElement("embed");
  393. elm.src = src;
  394. elm.type = "image/svg+xml";
  395. elm.style.width = "1px";
  396. elm.style.height = "1px";
  397. elm.loaded = 0;
  398. elm.setSizeOnLoad = false;
  399. elm.onload = function () {
  400. this.svgRoot = this.getSVGDocument().rootElement;
  401. this.svgDoc = this.getSVGDocument().documentElement;
  402. this.zeroWidth = this.svgRoot.width.baseVal.value;
  403. this.zeroHeight = this.svgRoot.height.baseVal.value;
  404. this.loaded = true;
  405. if (this.setSizeOnLoad) {
  406. this.setSize(this.setWidth, this.setHeight);
  407. }
  408. };
  409. elm.setSize = function (w, h) {
  410. if (!this.loaded) {
  411. this.setWidth = w;
  412. this.setHeight = h;
  413. this.setSizeOnLoad = true;
  414. return;
  415. }
  416. this.style.width = w + "px";
  417. this.style.height = h + "px";
  418. this.svgRoot.width.baseVal.value = w;
  419. this.svgRoot.height.baseVal.value = h;
  420. var scale_x = w / this.zeroWidth;
  421. var scale_y = h / this.zeroHeight;
  422. for (var i = 0; i < this.svgDoc.childNodes.length; i++) {
  423. if (this.svgDoc.childNodes[i].setAttribute) {
  424. this.svgDoc.childNodes[i].setAttribute("transform", "scale(" + scale_x + "," + scale_y + ")");
  425. }
  426. }
  427. };
  428. return elm;
  429. }, onMouseOver:function (e) {
  430. if (!this.parent.isOver) {
  431. this.parent._setActive(e);
  432. }
  433. if (this.caption != "") {
  434. dojo.html.addClass(this.lblNode, "selected");
  435. this.parent._positionLabel(this);
  436. }
  437. }, onMouseOut:function (e) {
  438. dojo.html.removeClass(this.lblNode, "selected");
  439. }, onClick:function (e) {
  440. }});