contextmenu.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. menu,
  14. items = me.options.contextMenu||[
  15. {label:'删除',cmdName:'delete'},
  16. {label:'全选',cmdName:'selectall'},
  17. {
  18. label:'删除代码',
  19. cmdName:'highlightcode',
  20. icon:'deletehighlightcode'
  21. },
  22. {
  23. label:'清空文档',
  24. cmdName:'cleardoc',
  25. exec:function () {
  26. if ( confirm( '确定清空文档吗?' ) ) {
  27. this.execCommand( 'cleardoc' );
  28. }
  29. }
  30. },
  31. '-',
  32. {
  33. label:'取消链接',
  34. cmdName:'unlink'
  35. },
  36. '-',
  37. {
  38. group:'段落格式',
  39. icon:'justifyjustify',
  40. subMenu:[
  41. {
  42. label:'居左对齐',
  43. cmdName:'justify',
  44. value:'left'
  45. },
  46. {
  47. label:'居右对齐',
  48. cmdName:'justify',
  49. value:'right'
  50. },
  51. {
  52. label:'居中对齐',
  53. cmdName:'justify',
  54. value:'center'
  55. },
  56. {
  57. label:'两端对齐',
  58. cmdName:'justify',
  59. value:'justify'
  60. }
  61. ]
  62. },
  63. '-',
  64. {
  65. label:'表格属性',
  66. cmdName:'edittable',
  67. exec:function () {
  68. this.ui._dialogs['inserttableDialog'].open();
  69. }
  70. },
  71. {
  72. label:'单元格属性',
  73. cmdName:'edittd',
  74. exec:function () {
  75. //如果没有创建,创建一下先
  76. if(UE.ui['edittd']){
  77. new UE.ui['edittd'](this);
  78. }
  79. this.ui._dialogs['edittdDialog'].open();
  80. }
  81. },
  82. {
  83. group:'表格',
  84. icon:'table',
  85. subMenu:[
  86. {
  87. label:'删除表格',
  88. cmdName:'deletetable'
  89. },
  90. {
  91. label:'表格前插行',
  92. cmdName:'insertparagraphbeforetable'
  93. },
  94. '-',
  95. {
  96. label:'删除行',
  97. cmdName:'deleterow'
  98. },
  99. {
  100. label:'删除列',
  101. cmdName:'deletecol'
  102. },
  103. '-',
  104. {
  105. label:'前插入行',
  106. cmdName:'insertrow'
  107. },
  108. {
  109. label:'前插入列',
  110. cmdName:'insertcol'
  111. },
  112. '-',
  113. {
  114. label:'右合并单元格',
  115. cmdName:'mergeright'
  116. },
  117. {
  118. label:'下合并单元格',
  119. cmdName:'mergedown'
  120. },
  121. '-',
  122. {
  123. label:'拆分成行',
  124. cmdName:'splittorows'
  125. },
  126. {
  127. label:'拆分成列',
  128. cmdName:'splittocols'
  129. },
  130. {
  131. label:'合并多个单元格',
  132. cmdName:'mergecells'
  133. },
  134. {
  135. label:'完全拆分单元格',
  136. cmdName:'splittocells'
  137. }
  138. ]
  139. },
  140. {
  141. label:'复制(ctrl+c)',
  142. cmdName:'copy',
  143. exec:function () {
  144. alert( "请使用ctrl+c进行复制" );
  145. },
  146. query : function(){return 0;}
  147. },
  148. {
  149. label:'粘贴(ctrl+v)',
  150. cmdName:'paste',
  151. exec:function () {
  152. alert( "请使用ctrl+v进行粘贴" );
  153. },
  154. query : function(){return 0;}
  155. }
  156. ];
  157. if(!items.length)return;
  158. var uiUtils = UE.ui.uiUtils;
  159. me.addListener('contextmenu',function(type,evt){
  160. var offset = uiUtils.getViewportOffsetByEvent(evt);
  161. me.fireEvent('beforeselectionchange');
  162. if (menu)
  163. menu.destroy();
  164. for (var i = 0,ti,contextItems = []; ti = items[i]; i++) {
  165. var last;
  166. (function(item) {
  167. if (item == '-') {
  168. if ((last = contextItems[contextItems.length - 1 ] ) && last !== '-')
  169. contextItems.push('-');
  170. } else if (item.group) {
  171. for (var j = 0,cj,subMenu = []; cj = item.subMenu[j]; j++) {
  172. (function(subItem) {
  173. if (subItem == '-') {
  174. if ((last = subMenu[subMenu.length - 1 ] ) && last !== '-')
  175. subMenu.push('-');
  176. } else {
  177. if ((me.commands[subItem.cmdName] || UE.commands[subItem.cmdName]||subItem.query) &&
  178. (subItem.query ? subItem.query() : me.queryCommandState(subItem.cmdName)) > -1) {
  179. subMenu.push({
  180. 'label':subItem.label,
  181. className: 'edui-for-' + subItem.cmdName + (subItem.value || ''),
  182. onclick : subItem.exec ? function() {
  183. subItem.exec.call(me)
  184. } : function() {
  185. me.execCommand(subItem.cmdName, subItem.value)
  186. }
  187. })
  188. }
  189. }
  190. })(cj)
  191. }
  192. if (subMenu.length) {
  193. contextItems.push({
  194. 'label' : item.group,
  195. className: 'edui-for-' + item.icon,
  196. 'subMenu' : {
  197. items: subMenu,
  198. editor:me
  199. }
  200. })
  201. }
  202. } else {
  203. //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法
  204. if ((me.commands[item.cmdName] || UE.commands[item.cmdName]||item.query) &&
  205. (item.query ? item.query() : me.queryCommandState(item.cmdName)) > -1) {
  206. //highlight todo
  207. if(item.cmdName == 'highlightcode' && me.queryCommandState(item.cmdName) == 0)
  208. return;
  209. contextItems.push({
  210. 'label':item.label,
  211. className: 'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')),
  212. onclick : item.exec ? function() {
  213. item.exec.call(me)
  214. } : function() {
  215. me.execCommand(item.cmdName, item.value)
  216. }
  217. })
  218. }
  219. }
  220. })(ti)
  221. }
  222. if (contextItems[contextItems.length - 1] == '-')
  223. contextItems.pop();
  224. menu = new UE.ui.Menu({
  225. items: contextItems,
  226. editor:me
  227. });
  228. menu.render();
  229. menu.showAt(offset);
  230. domUtils.preventDefault(evt);
  231. if(browser.ie){
  232. var ieRange;
  233. try{
  234. ieRange = me.selection.getNative().createRange();
  235. }catch(e){
  236. return;
  237. }
  238. if(ieRange.item){
  239. var range = new dom.Range(me.document);
  240. range.selectNode(ieRange.item(0)).select(true,true);
  241. }
  242. }
  243. })
  244. };