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

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.Editor");
  9. dojo.deprecated("dojo.widget.Editor", "is replaced by dojo.widget.Editor2", "0.5");
  10. dojo.require("dojo.io.*");
  11. dojo.require("dojo.widget.*");
  12. dojo.require("dojo.widget.Toolbar");
  13. dojo.require("dojo.widget.RichText");
  14. dojo.require("dojo.widget.ColorPalette");
  15. dojo.require("dojo.string.extras");
  16. dojo.widget.tags.addParseTreeHandler("dojo:Editor");
  17. dojo.widget.Editor = function () {
  18. dojo.widget.HtmlWidget.call(this);
  19. this.contentFilters = [];
  20. this._toolbars = [];
  21. };
  22. dojo.inherits(dojo.widget.Editor, dojo.widget.HtmlWidget);
  23. dojo.widget.Editor.itemGroups = {textGroup:["bold", "italic", "underline", "strikethrough"], blockGroup:["formatBlock", "fontName", "fontSize"], justifyGroup:["justifyleft", "justifycenter", "justifyright"], commandGroup:["save", "cancel"], colorGroup:["forecolor", "hilitecolor"], listGroup:["insertorderedlist", "insertunorderedlist"], indentGroup:["outdent", "indent"], linkGroup:["createlink", "insertimage", "inserthorizontalrule"]};
  24. dojo.widget.Editor.formatBlockValues = {"Normal":"p", "Main heading":"h2", "Sub heading":"h3", "Sub sub heading":"h4", "Preformatted":"pre"};
  25. dojo.widget.Editor.fontNameValues = {"Arial":"Arial, Helvetica, sans-serif", "Verdana":"Verdana, sans-serif", "Times New Roman":"Times New Roman, serif", "Courier":"Courier New, monospace"};
  26. dojo.widget.Editor.fontSizeValues = {"1 (8 pt)":"1", "2 (10 pt)":"2", "3 (12 pt)":"3", "4 (14 pt)":"4", "5 (18 pt)":"5", "6 (24 pt)":"6", "7 (36 pt)":"7"};
  27. dojo.widget.Editor.defaultItems = ["commandGroup", "|", "blockGroup", "|", "textGroup", "|", "colorGroup", "|", "justifyGroup", "|", "listGroup", "indentGroup", "|", "linkGroup"];
  28. dojo.widget.Editor.supportedCommands = ["save", "cancel", "|", "-", "/", " "];
  29. dojo.lang.extend(dojo.widget.Editor, {widgetType:"Editor", saveUrl:"", saveMethod:"post", saveArgName:"editorContent", closeOnSave:false, items:dojo.widget.Editor.defaultItems, formatBlockItems:dojo.lang.shallowCopy(dojo.widget.Editor.formatBlockValues), fontNameItems:dojo.lang.shallowCopy(dojo.widget.Editor.fontNameValues), fontSizeItems:dojo.lang.shallowCopy(dojo.widget.Editor.fontSizeValues), getItemProperties:function (name) {
  30. var props = {};
  31. switch (name.toLowerCase()) {
  32.   case "bold":
  33.   case "italic":
  34.   case "underline":
  35.   case "strikethrough":
  36. props.toggleItem = true;
  37. break;
  38.   case "justifygroup":
  39. props.defaultButton = "justifyleft";
  40. props.preventDeselect = true;
  41. props.buttonGroup = true;
  42. break;
  43.   case "listgroup":
  44. props.buttonGroup = true;
  45. break;
  46.   case "save":
  47.   case "cancel":
  48. props.label = dojo.string.capitalize(name);
  49. break;
  50.   case "forecolor":
  51.   case "hilitecolor":
  52. props.name = name;
  53. props.toggleItem = true;
  54. props.icon = this.getCommandImage(name);
  55. break;
  56.   case "formatblock":
  57. props.name = "formatBlock";
  58. props.values = this.formatBlockItems;
  59. break;
  60.   case "fontname":
  61. props.name = "fontName";
  62. props.values = this.fontNameItems;
  63.   case "fontsize":
  64. props.name = "fontSize";
  65. props.values = this.fontSizeItems;
  66. }
  67. return props;
  68. }, validateItems:true, focusOnLoad:true, minHeight:"1em", _richText:null, _richTextType:"RichText", _toolbarContainer:null, _toolbarContainerType:"ToolbarContainer", _toolbars:[], _toolbarType:"Toolbar", _toolbarItemType:"ToolbarItem", buildRendering:function (args, frag) {
  69. var node = frag["dojo:" + this.widgetType.toLowerCase()]["nodeRef"];
  70. var trt = dojo.widget.createWidget(this._richTextType, {focusOnLoad:this.focusOnLoad, minHeight:this.minHeight}, node);
  71. var _this = this;
  72. setTimeout(function () {
  73. _this.setRichText(trt);
  74. _this.initToolbar();
  75. _this.fillInTemplate(args, frag);
  76. }, 0);
  77. }, setRichText:function (richText) {
  78. if (this._richText && this._richText == richText) {
  79. dojo.debug("Already set the richText to this richText!");
  80. return;
  81. }
  82. if (this._richText && !this._richText.isClosed) {
  83. dojo.debug("You are switching richTexts yet you haven't closed the current one. Losing reference!");
  84. }
  85. this._richText = richText;
  86. dojo.event.connect(this._richText, "close", this, "onClose");
  87. dojo.event.connect(this._richText, "onLoad", this, "onLoad");
  88. dojo.event.connect(this._richText, "onDisplayChanged", this, "updateToolbar");
  89. if (this._toolbarContainer) {
  90. this._toolbarContainer.enable();
  91. this.updateToolbar(true);
  92. }
  93. }, initToolbar:function () {
  94. if (this._toolbarContainer) {
  95. return;
  96. }
  97. this._toolbarContainer = dojo.widget.createWidget(this._toolbarContainerType);
  98. var tb = this.addToolbar();
  99. var last = true;
  100. for (var i = 0; i < this.items.length; i++) {
  101. if (this.items[i] == "n") {
  102. tb = this.addToolbar();
  103. } else {
  104. if ((this.items[i] == "|") && (!last)) {
  105. last = true;
  106. } else {
  107. last = this.addItem(this.items[i], tb);
  108. }
  109. }
  110. }
  111. this.insertToolbar(this._toolbarContainer.domNode, this._richText.domNode);
  112. }, insertToolbar:function (tbNode, richTextNode) {
  113. dojo.html.insertBefore(tbNode, richTextNode);
  114. }, addToolbar:function (toolbar) {
  115. this.initToolbar();
  116. if (!(toolbar instanceof dojo.widget.Toolbar)) {
  117. toolbar = dojo.widget.createWidget(this._toolbarType);
  118. }
  119. this._toolbarContainer.addChild(toolbar);
  120. this._toolbars.push(toolbar);
  121. return toolbar;
  122. }, addItem:function (item, tb, dontValidate) {
  123. if (!tb) {
  124. tb = this._toolbars[0];
  125. }
  126. var cmd = ((item) && (!dojo.lang.isUndefined(item["getValue"]))) ? cmd = item["getValue"]() : item;
  127. var groups = dojo.widget.Editor.itemGroups;
  128. if (item instanceof dojo.widget.ToolbarItem) {
  129. tb.addChild(item);
  130. } else {
  131. if (groups[cmd]) {
  132. var group = groups[cmd];
  133. var worked = true;
  134. if (cmd == "justifyGroup" || cmd == "listGroup") {
  135. var btnGroup = [cmd];
  136. for (var i = 0; i < group.length; i++) {
  137. if (dontValidate || this.isSupportedCommand(group[i])) {
  138. btnGroup.push(this.getCommandImage(group[i]));
  139. } else {
  140. worked = false;
  141. }
  142. }
  143. if (btnGroup.length) {
  144. var btn = tb.addChild(btnGroup, null, this.getItemProperties(cmd));
  145. dojo.event.connect(btn, "onClick", this, "_action");
  146. dojo.event.connect(btn, "onChangeSelect", this, "_action");
  147. }
  148. return worked;
  149. } else {
  150. for (var i = 0; i < group.length; i++) {
  151. if (!this.addItem(group[i], tb)) {
  152. worked = false;
  153. }
  154. }
  155. return worked;
  156. }
  157. } else {
  158. if ((!dontValidate) && (!this.isSupportedCommand(cmd))) {
  159. return false;
  160. }
  161. if (dontValidate || this.isSupportedCommand(cmd)) {
  162. cmd = cmd.toLowerCase();
  163. if (cmd == "formatblock") {
  164. var select = dojo.widget.createWidget("ToolbarSelect", {name:"formatBlock", values:this.formatBlockItems});
  165. tb.addChild(select);
  166. var _this = this;
  167. dojo.event.connect(select, "onSetValue", function (item, value) {
  168. _this.onAction("formatBlock", value);
  169. });
  170. } else {
  171. if (cmd == "fontname") {
  172. var select = dojo.widget.createWidget("ToolbarSelect", {name:"fontName", values:this.fontNameItems});
  173. tb.addChild(select);
  174. dojo.event.connect(select, "onSetValue", dojo.lang.hitch(this, function (item, value) {
  175. this.onAction("fontName", value);
  176. }));
  177. } else {
  178. if (cmd == "fontsize") {
  179. var select = dojo.widget.createWidget("ToolbarSelect", {name:"fontSize", values:this.fontSizeItems});
  180. tb.addChild(select);
  181. dojo.event.connect(select, "onSetValue", dojo.lang.hitch(this, function (item, value) {
  182. this.onAction("fontSize", value);
  183. }));
  184. } else {
  185. if (dojo.lang.inArray(cmd, ["forecolor", "hilitecolor"])) {
  186. var btn = tb.addChild(dojo.widget.createWidget("ToolbarColorDialog", this.getItemProperties(cmd)));
  187. dojo.event.connect(btn, "onSetValue", this, "_setValue");
  188. } else {
  189. var btn = tb.addChild(this.getCommandImage(cmd), null, this.getItemProperties(cmd));
  190. if (cmd == "save") {
  191. dojo.event.connect(btn, "onClick", this, "_save");
  192. } else {
  193. if (cmd == "cancel") {
  194. dojo.event.connect(btn, "onClick", this, "_close");
  195. } else {
  196. dojo.event.connect(btn, "onClick", this, "_action");
  197. dojo.event.connect(btn, "onChangeSelect", this, "_action");
  198. }
  199. }
  200. }
  201. }
  202. }
  203. }
  204. }
  205. }
  206. }
  207. return true;
  208. }, enableToolbar:function () {
  209. if (this._toolbarContainer) {
  210. this._toolbarContainer.domNode.style.display = "";
  211. this._toolbarContainer.enable();
  212. }
  213. }, disableToolbar:function (hide) {
  214. if (hide) {
  215. if (this._toolbarContainer) {
  216. this._toolbarContainer.domNode.style.display = "none";
  217. }
  218. } else {
  219. if (this._toolbarContainer) {
  220. this._toolbarContainer.disable();
  221. }
  222. }
  223. }, _updateToolbarLastRan:null, _updateToolbarTimer:null, _updateToolbarFrequency:500, updateToolbar:function (force) {
  224. if (!this._toolbarContainer) {
  225. return;
  226. }
  227. var diff = new Date() - this._updateToolbarLastRan;
  228. if (!force && this._updateToolbarLastRan && (diff < this._updateToolbarFrequency)) {
  229. clearTimeout(this._updateToolbarTimer);
  230. var _this = this;
  231. this._updateToolbarTimer = setTimeout(function () {
  232. _this.updateToolbar();
  233. }, this._updateToolbarFrequency / 2);
  234. return;
  235. } else {
  236. this._updateToolbarLastRan = new Date();
  237. }
  238. var items = this._toolbarContainer.getItems();
  239. for (var i = 0; i < items.length; i++) {
  240. var item = items[i];
  241. if (item instanceof dojo.widget.ToolbarSeparator) {
  242. continue;
  243. }
  244. var cmd = item._name;
  245. if (cmd == "save" || cmd == "cancel") {
  246. continue;
  247. } else {
  248. if (cmd == "justifyGroup") {
  249. try {
  250. if (!this._richText.queryCommandEnabled("justifyleft")) {
  251. item.disable(false, true);
  252. } else {
  253. item.enable(false, true);
  254. var jitems = item.getItems();
  255. for (var j = 0; j < jitems.length; j++) {
  256. var name = jitems[j]._name;
  257. var value = this._richText.queryCommandValue(name);
  258. if (typeof value == "boolean" && value) {
  259. value = name;
  260. break;
  261. } else {
  262. if (typeof value == "string") {
  263. value = "justify" + value;
  264. } else {
  265. value = null;
  266. }
  267. }
  268. }
  269. if (!value) {
  270. value = "justifyleft";
  271. }
  272. item.setValue(value, false, true);
  273. }
  274. }
  275. catch (err) {
  276. }
  277. } else {
  278. if (cmd == "listGroup") {
  279. var litems = item.getItems();
  280. for (var j = 0; j < litems.length; j++) {
  281. this.updateItem(litems[j]);
  282. }
  283. } else {
  284. this.updateItem(item);
  285. }
  286. }
  287. }
  288. }
  289. }, updateItem:function (item) {
  290. try {
  291. var cmd = item._name;
  292. var enabled = this._richText.queryCommandEnabled(cmd);
  293. item.setEnabled(enabled, false, true);
  294. var active = this._richText.queryCommandState(cmd);
  295. if (active && cmd == "underline") {
  296. active = !this._richText.queryCommandEnabled("unlink");
  297. }
  298. item.setSelected(active, false, true);
  299. return true;
  300. }
  301. catch (err) {
  302. return false;
  303. }
  304. }, supportedCommands:dojo.widget.Editor.supportedCommands.concat(), isSupportedCommand:function (cmd) {
  305. var yes = dojo.lang.inArray(cmd, this.supportedCommands);
  306. if (!yes) {
  307. try {
  308. var richText = this._richText || dojo.widget.HtmlRichText.prototype;
  309. yes = richText.queryCommandAvailable(cmd);
  310. }
  311. catch (E) {
  312. }
  313. }
  314. return yes;
  315. }, getCommandImage:function (cmd) {
  316. if (cmd == "|") {
  317. return cmd;
  318. } else {
  319. return dojo.uri.moduleUri("dojo.widget", "templates/buttons/" + cmd + ".gif");
  320. }
  321. }, _action:function (e) {
  322. this._fire("onAction", e.getValue());
  323. }, _setValue:function (a, b) {
  324. this._fire("onAction", a.getValue(), b);
  325. }, _save:function (e) {
  326. if (!this._richText.isClosed) {
  327. if (this.saveUrl.length) {
  328. var content = {};
  329. content[this.saveArgName] = this.getHtml();
  330. dojo.io.bind({method:this.saveMethod, url:this.saveUrl, content:content});
  331. } else {
  332. dojo.debug("please set a saveUrl for the editor");
  333. }
  334. if (this.closeOnSave) {
  335. this._richText.close(e.getName().toLowerCase() == "save");
  336. }
  337. }
  338. }, _close:function (e) {
  339. if (!this._richText.isClosed) {
  340. this._richText.close(e.getName().toLowerCase() == "save");
  341. }
  342. }, onAction:function (cmd, value) {
  343. switch (cmd) {
  344.   case "createlink":
  345. if (!(value = prompt("Please enter the URL of the link:", "http://"))) {
  346. return;
  347. }
  348. break;
  349.   case "insertimage":
  350. if (!(value = prompt("Please enter the URL of the image:", "http://"))) {
  351. return;
  352. }
  353. break;
  354. }
  355. this._richText.execCommand(cmd, value);
  356. }, fillInTemplate:function (args, frag) {
  357. }, _fire:function (eventName) {
  358. if (dojo.lang.isFunction(this[eventName])) {
  359. var args = [];
  360. if (arguments.length == 1) {
  361. args.push(this);
  362. } else {
  363. for (var i = 1; i < arguments.length; i++) {
  364. args.push(arguments[i]);
  365. }
  366. }
  367. this[eventName].apply(this, args);
  368. }
  369. }, getHtml:function () {
  370. this._richText.contentFilters = this._richText.contentFilters.concat(this.contentFilters);
  371. return this._richText.getEditorContent();
  372. }, getEditorContent:function () {
  373. return this.getHtml();
  374. }, onClose:function (save, hide) {
  375. this.disableToolbar(hide);
  376. if (save) {
  377. this._fire("onSave");
  378. } else {
  379. this._fire("onCancel");
  380. }
  381. }, onLoad:function () {
  382. }, onSave:function () {
  383. }, onCancel:function () {
  384. }});