contextmenu.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  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',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",{repeat:true,colorList:["#bbb","#ccc"]});
  250. }
  251. },
  252. {
  253. label:lang.unsetbackground,
  254. cmdName:"cleartablebackground",
  255. exec:function(){
  256. this.execCommand("cleartablebackground");
  257. }
  258. },
  259. {
  260. label:lang.redandblue,
  261. cmdName:"settablebackground",
  262. exec:function(){
  263. this.execCommand("settablebackground",{repeat:true,colorList:["red","blue"]});
  264. }
  265. },
  266. {
  267. label:lang.threecolorgradient,
  268. cmdName:"settablebackground",
  269. exec:function(){
  270. this.execCommand("settablebackground",{repeat:true,colorList:["#aaa","#bbb","#ccc"]});
  271. }
  272. }
  273. ]
  274. },
  275. {
  276. group:lang.aligntd,
  277. icon:'aligntd',
  278. subMenu:[
  279. {
  280. cmdName:'cellalignment',
  281. value:{align:'left',vAlign:'top'}
  282. },
  283. {
  284. cmdName:'cellalignment',
  285. value:{align:'center',vAlign:'top'}
  286. },
  287. {
  288. cmdName:'cellalignment',
  289. value:{align:'right',vAlign:'top'}
  290. },
  291. {
  292. cmdName:'cellalignment',
  293. value:{align:'left',vAlign:'middle'}
  294. },
  295. {
  296. cmdName:'cellalignment',
  297. value:{align:'center',vAlign:'middle'}
  298. },
  299. {
  300. cmdName:'cellalignment',
  301. value:{align:'right',vAlign:'middle'}
  302. },
  303. {
  304. cmdName:'cellalignment',
  305. value:{align:'left',vAlign:'bottom'}
  306. },
  307. {
  308. cmdName:'cellalignment',
  309. value:{align:'center',vAlign:'bottom'}
  310. },
  311. {
  312. cmdName:'cellalignment',
  313. value:{align:'right',vAlign:'bottom'}
  314. }
  315. ]
  316. },
  317. {
  318. group:lang.aligntable,
  319. icon:'aligntable',
  320. subMenu:[
  321. {
  322. cmdName:'tablealignment',
  323. className: 'left',
  324. label:lang.tableleft,
  325. value:"left"
  326. },
  327. {
  328. cmdName:'tablealignment',
  329. className: 'center',
  330. label:lang.tablecenter,
  331. value:"center"
  332. },
  333. {
  334. cmdName:'tablealignment',
  335. className: 'right',
  336. label:lang.tableright,
  337. value:"right"
  338. }
  339. ]
  340. },
  341. '-',
  342. {
  343. label:lang.insertparagraphbefore,
  344. cmdName:'insertparagraph',
  345. value:true
  346. },
  347. {
  348. label:lang.insertparagraphafter,
  349. cmdName:'insertparagraph'
  350. },
  351. {
  352. label:lang['copy'],
  353. cmdName:'copy'
  354. },
  355. {
  356. label:lang['paste'],
  357. cmdName:'paste'
  358. }
  359. ];
  360. if ( !items.length ) {
  361. return;
  362. }
  363. var uiUtils = UE.ui.uiUtils;
  364. me.addListener( 'contextmenu', function ( type, evt ) {
  365. var offset = uiUtils.getViewportOffsetByEvent( evt );
  366. me.fireEvent( 'beforeselectionchange' );
  367. if ( menu ) {
  368. menu.destroy();
  369. }
  370. for ( var i = 0, ti, contextItems = []; ti = items[i]; i++ ) {
  371. var last;
  372. (function ( item ) {
  373. if ( item == '-' ) {
  374. if ( (last = contextItems[contextItems.length - 1 ] ) && last !== '-' ) {
  375. contextItems.push( '-' );
  376. }
  377. } else if ( item.hasOwnProperty( "group" ) ) {
  378. for ( var j = 0, cj, subMenu = []; cj = item.subMenu[j]; j++ ) {
  379. (function ( subItem ) {
  380. if ( subItem == '-' ) {
  381. if ( (last = subMenu[subMenu.length - 1 ] ) && last !== '-' ) {
  382. subMenu.push( '-' );
  383. }else{
  384. subMenu.splice(subMenu.length-1);
  385. }
  386. } else {
  387. if ( (me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) &&
  388. (subItem.query ? subItem.query() : me.queryCommandState( subItem.cmdName )) > -1 ) {
  389. subMenu.push( {
  390. 'label':subItem.label || me.getLang( "contextMenu." + subItem.cmdName + (subItem.value || '') )||"",
  391. 'className':'edui-for-' +subItem.cmdName + ( subItem.className ? ( ' edui-for-' + subItem.cmdName + '-' + subItem.className ) : '' ),
  392. onclick:subItem.exec ? function () {
  393. subItem.exec.call( me );
  394. } : function () {
  395. me.execCommand( subItem.cmdName, subItem.value );
  396. }
  397. } );
  398. }
  399. }
  400. })( cj );
  401. }
  402. if ( subMenu.length ) {
  403. function getLabel(){
  404. switch (item.icon){
  405. case "table":
  406. return me.getLang( "contextMenu.table" );
  407. case "justifyjustify":
  408. return me.getLang( "contextMenu.paragraph" );
  409. case "aligntd":
  410. return me.getLang("contextMenu.aligntd");
  411. case "aligntable":
  412. return me.getLang("contextMenu.aligntable");
  413. case "tablesort":
  414. return lang.tablesort;
  415. case "borderBack":
  416. return lang.borderbk;
  417. default :
  418. return '';
  419. }
  420. }
  421. contextItems.push( {
  422. //todo 修正成自动获取方式
  423. 'label':getLabel(),
  424. className:'edui-for-' + item.icon,
  425. 'subMenu':{
  426. items:subMenu,
  427. editor:me
  428. }
  429. } );
  430. }
  431. } else {
  432. //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法
  433. if ( (me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) &&
  434. (item.query ? item.query.call(me) : me.queryCommandState( item.cmdName )) > -1 ) {
  435. contextItems.push( {
  436. 'label':item.label || me.getLang( "contextMenu." + item.cmdName ),
  437. className:'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')),
  438. onclick:item.exec ? function () {
  439. item.exec.call( me );
  440. } : function () {
  441. me.execCommand( item.cmdName, item.value );
  442. }
  443. } );
  444. }
  445. }
  446. })( ti );
  447. }
  448. if ( contextItems[contextItems.length - 1] == '-' ) {
  449. contextItems.pop();
  450. }
  451. menu = new UE.ui.Menu( {
  452. items:contextItems,
  453. className:"edui-contextmenu",
  454. editor:me
  455. } );
  456. menu.render();
  457. menu.showAt( offset );
  458. me.fireEvent("aftershowcontextmenu",menu);
  459. domUtils.preventDefault( evt );
  460. if ( browser.ie ) {
  461. var ieRange;
  462. try {
  463. ieRange = me.selection.getNative().createRange();
  464. } catch ( e ) {
  465. return;
  466. }
  467. if ( ieRange.item ) {
  468. var range = new dom.Range( me.document );
  469. range.selectNode( ieRange.item( 0 ) ).select( true, true );
  470. }
  471. }
  472. });
  473. // 添加复制的flash按钮
  474. me.addListener('aftershowcontextmenu', function(type, menu) {
  475. if (me.zeroclipboard) {
  476. var items = menu.items;
  477. for (var key in items) {
  478. if (items[key].className == 'edui-for-copy') {
  479. me.zeroclipboard.clip(items[key].getDom());
  480. }
  481. }
  482. }
  483. });
  484. };