contextmenu.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. ///import core
  2. ///commands 右键菜单
  3. ///commandsName ContextMenu
  4. ///commandsTitle 右键菜单
  5. /**
  6. * 右键菜单
  7. * @function
  8. * @name baidu.editor.plugins.contextmenu
  9. * @author zhanyi
  10. */
  11. UE.plugins["contextmenu"] = function() {
  12. var me = this;
  13. me.setOpt("enableContextMenu", me.getOpt("enableContextMenu") || true);
  14. if (me.getOpt("enableContextMenu") === false) {
  15. return;
  16. }
  17. var lang = me.getLang("contextMenu"),
  18. menu,
  19. items = me.options.contextMenu || [
  20. { label: lang["selectall"], cmdName: "selectall" },
  21. {
  22. label: lang.cleardoc,
  23. cmdName: "cleardoc",
  24. exec: function() {
  25. if (confirm(lang.confirmclear)) {
  26. this.execCommand("cleardoc");
  27. }
  28. }
  29. },
  30. "-",
  31. {
  32. label: lang.unlink,
  33. cmdName: "unlink"
  34. },
  35. "-",
  36. {
  37. group: lang.paragraph,
  38. icon: "justifyjustify",
  39. subMenu: [
  40. {
  41. label: lang.justifyleft,
  42. cmdName: "justify",
  43. value: "left"
  44. },
  45. {
  46. label: lang.justifyright,
  47. cmdName: "justify",
  48. value: "right"
  49. },
  50. {
  51. label: lang.justifycenter,
  52. cmdName: "justify",
  53. value: "center"
  54. },
  55. {
  56. label: lang.justifyjustify,
  57. cmdName: "justify",
  58. value: "justify"
  59. }
  60. ]
  61. },
  62. "-",
  63. {
  64. group: lang.table,
  65. icon: "table",
  66. subMenu: [
  67. {
  68. label: lang.inserttable,
  69. cmdName: "inserttable"
  70. },
  71. {
  72. label: lang.deletetable,
  73. cmdName: "deletetable"
  74. },
  75. "-",
  76. {
  77. label: lang.deleterow,
  78. cmdName: "deleterow"
  79. },
  80. {
  81. label: lang.deletecol,
  82. cmdName: "deletecol"
  83. },
  84. {
  85. label: lang.insertcol,
  86. cmdName: "insertcol"
  87. },
  88. {
  89. label: lang.insertcolnext,
  90. cmdName: "insertcolnext"
  91. },
  92. {
  93. label: lang.insertrow,
  94. cmdName: "insertrow"
  95. },
  96. {
  97. label: lang.insertrownext,
  98. cmdName: "insertrownext"
  99. },
  100. "-",
  101. {
  102. label: lang.insertcaption,
  103. cmdName: "insertcaption"
  104. },
  105. {
  106. label: lang.deletecaption,
  107. cmdName: "deletecaption"
  108. },
  109. {
  110. label: lang.inserttitle,
  111. cmdName: "inserttitle"
  112. },
  113. {
  114. label: lang.deletetitle,
  115. cmdName: "deletetitle"
  116. },
  117. {
  118. label: lang.inserttitlecol,
  119. cmdName: "inserttitlecol"
  120. },
  121. {
  122. label: lang.deletetitlecol,
  123. cmdName: "deletetitlecol"
  124. },
  125. "-",
  126. {
  127. label: lang.mergecells,
  128. cmdName: "mergecells"
  129. },
  130. {
  131. label: lang.mergeright,
  132. cmdName: "mergeright"
  133. },
  134. {
  135. label: lang.mergedown,
  136. cmdName: "mergedown"
  137. },
  138. "-",
  139. {
  140. label: lang.splittorows,
  141. cmdName: "splittorows"
  142. },
  143. {
  144. label: lang.splittocols,
  145. cmdName: "splittocols"
  146. },
  147. {
  148. label: lang.splittocells,
  149. cmdName: "splittocells"
  150. },
  151. "-",
  152. {
  153. label: lang.averageDiseRow,
  154. cmdName: "averagedistributerow"
  155. },
  156. {
  157. label: lang.averageDisCol,
  158. cmdName: "averagedistributecol"
  159. },
  160. "-",
  161. {
  162. label: lang.edittd,
  163. cmdName: "edittd",
  164. exec: function() {
  165. if (UE.ui["edittd"]) {
  166. new UE.ui["edittd"](this);
  167. }
  168. this.getDialog("edittd").open();
  169. }
  170. },
  171. {
  172. label: lang.edittable,
  173. cmdName: "edittable",
  174. exec: function() {
  175. if (UE.ui["edittable"]) {
  176. new UE.ui["edittable"](this);
  177. }
  178. this.getDialog("edittable").open();
  179. }
  180. },
  181. {
  182. label: lang.setbordervisible,
  183. cmdName: "setbordervisible"
  184. }
  185. ]
  186. },
  187. {
  188. group: lang.tablesort,
  189. icon: "tablesort",
  190. subMenu: [
  191. {
  192. label: lang.enablesort,
  193. cmdName: "enablesort"
  194. },
  195. {
  196. label: lang.disablesort,
  197. cmdName: "disablesort"
  198. },
  199. "-",
  200. {
  201. label: lang.reversecurrent,
  202. cmdName: "sorttable",
  203. value: "reversecurrent"
  204. },
  205. {
  206. label: lang.orderbyasc,
  207. cmdName: "sorttable",
  208. value: "orderbyasc"
  209. },
  210. {
  211. label: lang.reversebyasc,
  212. cmdName: "sorttable",
  213. value: "reversebyasc"
  214. },
  215. {
  216. label: lang.orderbynum,
  217. cmdName: "sorttable",
  218. value: "orderbynum"
  219. },
  220. {
  221. label: lang.reversebynum,
  222. cmdName: "sorttable",
  223. value: "reversebynum"
  224. }
  225. ]
  226. },
  227. {
  228. group: lang.borderbk,
  229. icon: "borderBack",
  230. subMenu: [
  231. {
  232. label: lang.setcolor,
  233. cmdName: "interlacetable",
  234. exec: function() {
  235. this.execCommand("interlacetable");
  236. }
  237. },
  238. {
  239. label: lang.unsetcolor,
  240. cmdName: "uninterlacetable",
  241. exec: function() {
  242. this.execCommand("uninterlacetable");
  243. }
  244. },
  245. {
  246. label: lang.setbackground,
  247. cmdName: "settablebackground",
  248. exec: function() {
  249. this.execCommand("settablebackground", {
  250. repeat: true,
  251. colorList: ["#bbb", "#ccc"]
  252. });
  253. }
  254. },
  255. {
  256. label: lang.unsetbackground,
  257. cmdName: "cleartablebackground",
  258. exec: function() {
  259. this.execCommand("cleartablebackground");
  260. }
  261. },
  262. {
  263. label: lang.redandblue,
  264. cmdName: "settablebackground",
  265. exec: function() {
  266. this.execCommand("settablebackground", {
  267. repeat: true,
  268. colorList: ["red", "blue"]
  269. });
  270. }
  271. },
  272. {
  273. label: lang.threecolorgradient,
  274. cmdName: "settablebackground",
  275. exec: function() {
  276. this.execCommand("settablebackground", {
  277. repeat: true,
  278. colorList: ["#aaa", "#bbb", "#ccc"]
  279. });
  280. }
  281. }
  282. ]
  283. },
  284. {
  285. group: lang.aligntd,
  286. icon: "aligntd",
  287. subMenu: [
  288. {
  289. cmdName: "cellalignment",
  290. value: { align: "left", vAlign: "top" }
  291. },
  292. {
  293. cmdName: "cellalignment",
  294. value: { align: "center", vAlign: "top" }
  295. },
  296. {
  297. cmdName: "cellalignment",
  298. value: { align: "right", vAlign: "top" }
  299. },
  300. {
  301. cmdName: "cellalignment",
  302. value: { align: "left", vAlign: "middle" }
  303. },
  304. {
  305. cmdName: "cellalignment",
  306. value: { align: "center", vAlign: "middle" }
  307. },
  308. {
  309. cmdName: "cellalignment",
  310. value: { align: "right", vAlign: "middle" }
  311. },
  312. {
  313. cmdName: "cellalignment",
  314. value: { align: "left", vAlign: "bottom" }
  315. },
  316. {
  317. cmdName: "cellalignment",
  318. value: { align: "center", vAlign: "bottom" }
  319. },
  320. {
  321. cmdName: "cellalignment",
  322. value: { align: "right", vAlign: "bottom" }
  323. }
  324. ]
  325. },
  326. {
  327. group: lang.aligntable,
  328. icon: "aligntable",
  329. subMenu: [
  330. {
  331. cmdName: "tablealignment",
  332. className: "left",
  333. label: lang.tableleft,
  334. value: "left"
  335. },
  336. {
  337. cmdName: "tablealignment",
  338. className: "center",
  339. label: lang.tablecenter,
  340. value: "center"
  341. },
  342. {
  343. cmdName: "tablealignment",
  344. className: "right",
  345. label: lang.tableright,
  346. value: "right"
  347. }
  348. ]
  349. },
  350. "-",
  351. {
  352. label: lang.insertparagraphbefore,
  353. cmdName: "insertparagraph",
  354. value: true
  355. },
  356. {
  357. label: lang.insertparagraphafter,
  358. cmdName: "insertparagraph"
  359. },
  360. {
  361. label: lang["copy"],
  362. cmdName: "copy"
  363. },
  364. {
  365. label: lang["paste"],
  366. cmdName: "paste"
  367. }
  368. ];
  369. if (!items.length) {
  370. return;
  371. }
  372. var uiUtils = UE.ui.uiUtils;
  373. me.addListener("contextmenu", function(type, evt) {
  374. var offset = uiUtils.getViewportOffsetByEvent(evt);
  375. me.fireEvent("beforeselectionchange");
  376. if (menu) {
  377. menu.destroy();
  378. }
  379. for (var i = 0, ti, contextItems = []; (ti = items[i]); i++) {
  380. var last;
  381. (function(item) {
  382. if (item == "-") {
  383. if ((last = contextItems[contextItems.length - 1]) && last !== "-") {
  384. contextItems.push("-");
  385. }
  386. } else if (item.hasOwnProperty("group")) {
  387. for (var j = 0, cj, subMenu = []; (cj = item.subMenu[j]); j++) {
  388. (function(subItem) {
  389. if (subItem == "-") {
  390. if ((last = subMenu[subMenu.length - 1]) && last !== "-") {
  391. subMenu.push("-");
  392. } else {
  393. subMenu.splice(subMenu.length - 1);
  394. }
  395. } else {
  396. if (
  397. (me.commands[subItem.cmdName] ||
  398. UE.commands[subItem.cmdName] ||
  399. subItem.query) &&
  400. (subItem.query
  401. ? subItem.query()
  402. : me.queryCommandState(subItem.cmdName)) > -1
  403. ) {
  404. subMenu.push({
  405. label:
  406. subItem.label ||
  407. me.getLang(
  408. "contextMenu." +
  409. subItem.cmdName +
  410. (subItem.value || "")
  411. ) ||
  412. "",
  413. className:
  414. "edui-for-" +
  415. subItem.cmdName +
  416. (subItem.className
  417. ? " edui-for-" +
  418. subItem.cmdName +
  419. "-" +
  420. subItem.className
  421. : ""),
  422. onclick: subItem.exec
  423. ? function() {
  424. subItem.exec.call(me);
  425. }
  426. : function() {
  427. me.execCommand(subItem.cmdName, subItem.value);
  428. }
  429. });
  430. }
  431. }
  432. })(cj);
  433. }
  434. if (subMenu.length) {
  435. function getLabel() {
  436. switch (item.icon) {
  437. case "table":
  438. return me.getLang("contextMenu.table");
  439. case "justifyjustify":
  440. return me.getLang("contextMenu.paragraph");
  441. case "aligntd":
  442. return me.getLang("contextMenu.aligntd");
  443. case "aligntable":
  444. return me.getLang("contextMenu.aligntable");
  445. case "tablesort":
  446. return lang.tablesort;
  447. case "borderBack":
  448. return lang.borderbk;
  449. default:
  450. return "";
  451. }
  452. }
  453. contextItems.push({
  454. //todo 修正成自动获取方式
  455. label: getLabel(),
  456. className: "edui-for-" + item.icon,
  457. subMenu: {
  458. items: subMenu,
  459. editor: me
  460. }
  461. });
  462. }
  463. } else {
  464. //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法
  465. if (
  466. (me.commands[item.cmdName] ||
  467. UE.commands[item.cmdName] ||
  468. item.query) &&
  469. (item.query
  470. ? item.query.call(me)
  471. : me.queryCommandState(item.cmdName)) > -1
  472. ) {
  473. contextItems.push({
  474. label: item.label || me.getLang("contextMenu." + item.cmdName),
  475. className:
  476. "edui-for-" +
  477. (item.icon ? item.icon : item.cmdName + (item.value || "")),
  478. onclick: item.exec
  479. ? function() {
  480. item.exec.call(me);
  481. }
  482. : function() {
  483. me.execCommand(item.cmdName, item.value);
  484. }
  485. });
  486. }
  487. }
  488. })(ti);
  489. }
  490. if (contextItems[contextItems.length - 1] == "-") {
  491. contextItems.pop();
  492. }
  493. menu = new UE.ui.Menu({
  494. items: contextItems,
  495. className: "edui-contextmenu",
  496. editor: me
  497. });
  498. menu.render();
  499. menu.showAt(offset);
  500. me.fireEvent("aftershowcontextmenu", menu);
  501. domUtils.preventDefault(evt);
  502. if (browser.ie) {
  503. var ieRange;
  504. try {
  505. ieRange = me.selection.getNative().createRange();
  506. } catch (e) {
  507. return;
  508. }
  509. if (ieRange.item) {
  510. var range = new dom.Range(me.document);
  511. range.selectNode(ieRange.item(0)).select(true, true);
  512. }
  513. }
  514. });
  515. // 添加复制的flash按钮
  516. me.addListener("aftershowcontextmenu", function(type, menu) {
  517. if (me.zeroclipboard) {
  518. var items = menu.items;
  519. for (var key in items) {
  520. if (items[key].className == "edui-for-copy") {
  521. me.zeroclipboard.clip(items[key].getDom());
  522. }
  523. }
  524. }
  525. });
  526. };