contextmenu.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  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. lang = me.getLang( "contextMenu" ),
  14. menu,
  15. items = me.options.contextMenu || [
  16. {label:lang['selectall'], cmdName:'selectall'},
  17. {
  18. label:lang.deletecode,
  19. cmdName:'highlightcode',
  20. icon:'deletehighlightcode'
  21. },
  22. {
  23. label:lang.cleardoc,
  24. cmdName:'cleardoc',
  25. exec:function () {
  26. if ( confirm( lang.confirmclear ) ) {
  27. this.execCommand( 'cleardoc' );
  28. }
  29. }
  30. },
  31. {
  32. label:lang.clearcell,
  33. cmdName:'clearcell',
  34. exec:function () {
  35. this.execCommand( 'clearcell' );
  36. }
  37. },
  38. '-',
  39. {
  40. label:lang.unlink,
  41. cmdName:'unlink'
  42. },
  43. '-',
  44. {
  45. group:lang.paragraph,
  46. icon:'justifyjustify',
  47. subMenu:[
  48. {
  49. label:lang.justifyleft,
  50. cmdName:'justify',
  51. value:'left'
  52. },
  53. {
  54. label:lang.justifyright,
  55. cmdName:'justify',
  56. value:'right'
  57. },
  58. {
  59. label:lang.justifycenter,
  60. cmdName:'justify',
  61. value:'center'
  62. },
  63. {
  64. label:lang.justifyjustify,
  65. cmdName:'justify',
  66. value:'justify'
  67. }
  68. ]
  69. },
  70. '-',
  71. {
  72. group:lang.table,
  73. icon:'table',
  74. subMenu:[
  75. {
  76. label:lang.inserttable,
  77. cmdName:'inserttable'
  78. },
  79. {
  80. label:lang.deletetable,
  81. cmdName:'deletetable'
  82. },
  83. '-',
  84. {
  85. label:lang.deleterow,
  86. cmdName:'deleterow'
  87. },
  88. {
  89. label:lang.deletecol,
  90. cmdName:'deletecol'
  91. },
  92. {
  93. label:lang.insertcol,
  94. cmdName:'insertcol'
  95. },
  96. {
  97. label:lang.insertcolnext,
  98. cmdName:'insertcolnext'
  99. },
  100. {
  101. label:lang.insertrow,
  102. cmdName:'insertrow'
  103. },
  104. {
  105. label:lang.insertrownext,
  106. cmdName:'insertrownext'
  107. },
  108. '-',
  109. {
  110. label:lang.insertcaption,
  111. cmdName:'insertcaption'
  112. },
  113. {
  114. label:lang.deletecaption,
  115. cmdName:'deletecaption'
  116. },
  117. {
  118. label:lang.inserttitle,
  119. cmdName:'inserttitle'
  120. },
  121. {
  122. label:lang.deletetitle,
  123. cmdName:'deletetitle'
  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. },
  183. {
  184. group:lang.aligntable,
  185. icon:'aligntable',
  186. subMenu:[
  187. {
  188. cmdName:'tablealignment',
  189. label:lang.tableleft,
  190. value:['float','left']
  191. },
  192. {
  193. cmdName:'tablealignment',
  194. label:lang.tablecenter,
  195. value:['margin','0 auto']
  196. },
  197. {
  198. cmdName:'tablealignment',
  199. label:lang.tableright,
  200. value:['float','right']
  201. }
  202. ]
  203. },
  204. '-',
  205. {
  206. label:lang.insertparagraphbefore,
  207. cmdName:'insertparagraph',
  208. value:true
  209. },
  210. {
  211. label:lang.insertparagraphafter,
  212. cmdName:'insertparagraph'
  213. },
  214. {
  215. label:lang['copy'],
  216. cmdName:'copy',
  217. exec:function () {
  218. alert( lang.copymsg );
  219. },
  220. query:function () {
  221. return 0;
  222. }
  223. },
  224. {
  225. label:lang['paste'],
  226. cmdName:'paste',
  227. exec:function () {
  228. alert( lang.pastemsg );
  229. },
  230. query:function () {
  231. return 0;
  232. }
  233. },{
  234. label:lang['highlightcode'],
  235. cmdName:'highlightcode',
  236. exec:function () {
  237. if ( UE.ui['highlightcode'] ) {
  238. new UE.ui['highlightcode']( this );
  239. }
  240. this.ui._dialogs['highlightcodeDialog'].open();
  241. }
  242. }
  243. ];
  244. if ( !items.length ) {
  245. return;
  246. }
  247. var uiUtils = UE.ui.uiUtils;
  248. me.addListener( 'contextmenu', function ( type, evt ) {
  249. var offset = uiUtils.getViewportOffsetByEvent( evt );
  250. me.fireEvent( 'beforeselectionchange' );
  251. if ( menu ) {
  252. menu.destroy();
  253. }
  254. for ( var i = 0, ti, contextItems = []; ti = items[i]; i++ ) {
  255. var last;
  256. (function ( item ) {
  257. if ( item == '-' ) {
  258. if ( (last = contextItems[contextItems.length - 1 ] ) && last !== '-' ) {
  259. contextItems.push( '-' );
  260. }
  261. } else if ( item.hasOwnProperty( "group" ) ) {
  262. for ( var j = 0, cj, subMenu = []; cj = item.subMenu[j]; j++ ) {
  263. (function ( subItem ) {
  264. if ( subItem == '-' ) {
  265. if ( (last = subMenu[subMenu.length - 1 ] ) && last !== '-' ) {
  266. subMenu.push( '-' );
  267. }else{
  268. subMenu.splice(subMenu.length-1);
  269. }
  270. } else {
  271. if ( (me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) &&
  272. (subItem.query ? subItem.query() : me.queryCommandState( subItem.cmdName )) > -1 ) {
  273. subMenu.push( {
  274. 'label':subItem.label || me.getLang( "contextMenu." + subItem.cmdName + (subItem.value || '') )||"",
  275. 'className':'edui-for-' +subItem.cmdName,
  276. onclick:subItem.exec ? function () {
  277. subItem.exec.call( me );
  278. } : function () {
  279. me.execCommand( subItem.cmdName, subItem.value );
  280. }
  281. } );
  282. }
  283. }
  284. })( cj );
  285. }
  286. if ( subMenu.length ) {
  287. function getLabel(){
  288. switch (item.icon){
  289. case "table":
  290. return me.getLang( "contextMenu.table" );
  291. case "justifyjustify":
  292. return me.getLang( "contextMenu.paragraph" );
  293. case "aligntd":
  294. return me.getLang("contextMenu.aligntd");
  295. case "aligntable":
  296. return me.getLang("contextMenu.aligntable");
  297. default :
  298. return '';
  299. }
  300. }
  301. contextItems.push( {
  302. //todo 修正成自动获取方式
  303. 'label':getLabel(),
  304. className:'edui-for-' + item.icon,
  305. 'subMenu':{
  306. items:subMenu,
  307. editor:me
  308. }
  309. } );
  310. }
  311. } else {
  312. //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法
  313. if ( (me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) &&
  314. (item.query ? item.query.call(me) : me.queryCommandState( item.cmdName )) > -1 ) {
  315. //highlight todo
  316. if ( item.cmdName == 'highlightcode' ) {
  317. if(me.queryCommandState( item.cmdName ) == 1 && item.icon != 'deletehighlightcode'){
  318. return;
  319. }
  320. if(me.queryCommandState( item.cmdName ) != 1 && item.icon == 'deletehighlightcode'){
  321. return;
  322. }
  323. }
  324. contextItems.push( {
  325. 'label':item.label || me.getLang( "contextMenu." + item.cmdName ),
  326. className:'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')),
  327. onclick:item.exec ? function () {
  328. item.exec.call( me );
  329. } : function () {
  330. me.execCommand( item.cmdName, item.value );
  331. }
  332. } );
  333. }
  334. }
  335. })( ti );
  336. }
  337. if ( contextItems[contextItems.length - 1] == '-' ) {
  338. contextItems.pop();
  339. }
  340. menu = new UE.ui.Menu( {
  341. items:contextItems,
  342. editor:me
  343. } );
  344. menu.render();
  345. menu.showAt( offset );
  346. domUtils.preventDefault( evt );
  347. if ( browser.ie ) {
  348. var ieRange;
  349. try {
  350. ieRange = me.selection.getNative().createRange();
  351. } catch ( e ) {
  352. return;
  353. }
  354. if ( ieRange.item ) {
  355. var range = new dom.Range( me.document );
  356. range.selectNode( ieRange.item( 0 ) ).select( true, true );
  357. }
  358. }
  359. } );
  360. };