2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
\r
3 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
\r
5 * == BEGIN LICENSE ==
\r
7 * Licensed under the terms of any of the following licenses at your
\r
10 * - GNU General Public License Version 2 or later (the "GPL")
\r
11 * http://www.gnu.org/licenses/gpl.html
\r
13 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
\r
14 * http://www.gnu.org/licenses/lgpl.html
\r
16 * - Mozilla Public License Version 1.1 or later (the "MPL")
\r
17 * http://www.mozilla.org/MPL/MPL-1.1.html
\r
21 * Defines the FCK.ContextMenu object that is responsible for all
\r
22 * Context Menu operations in the editing area.
\r
25 FCK.ContextMenu = new Object() ;
\r
26 FCK.ContextMenu.Listeners = new Array() ;
\r
28 FCK.ContextMenu.RegisterListener = function( listener )
\r
31 this.Listeners.push( listener ) ;
\r
34 function FCK_ContextMenu_Init()
\r
36 var oInnerContextMenu = FCK.ContextMenu._InnerContextMenu = new FCKContextMenu( FCKBrowserInfo.IsIE ? window : window.parent, FCKLang.Dir ) ;
\r
37 oInnerContextMenu.CtrlDisable = FCKConfig.BrowserContextMenuOnCtrl ;
\r
38 oInnerContextMenu.OnBeforeOpen = FCK_ContextMenu_OnBeforeOpen ;
\r
39 oInnerContextMenu.OnItemClick = FCK_ContextMenu_OnItemClick ;
\r
41 // Get the registering function.
\r
42 var oMenu = FCK.ContextMenu ;
\r
44 // Register all configured context menu listeners.
\r
45 for ( var i = 0 ; i < FCKConfig.ContextMenu.length ; i++ )
\r
46 oMenu.RegisterListener( FCK_ContextMenu_GetListener( FCKConfig.ContextMenu[i] ) ) ;
\r
49 function FCK_ContextMenu_GetListener( listenerName )
\r
51 switch ( listenerName )
\r
55 AddItems : function( menu, tag, tagName )
\r
57 menu.AddItem( 'Cut' , FCKLang.Cut , 7, FCKCommands.GetCommand( 'Cut' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
58 menu.AddItem( 'Copy' , FCKLang.Copy , 8, FCKCommands.GetCommand( 'Copy' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
59 menu.AddItem( 'Paste' , FCKLang.Paste , 9, FCKCommands.GetCommand( 'Paste' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
64 AddItems : function( menu, tag, tagName )
\r
66 var bIsTable = ( tagName == 'TABLE' ) ;
\r
67 var bIsCell = ( !bIsTable && FCKSelection.HasAncestorNode( 'TABLE' ) ) ;
\r
71 menu.AddSeparator() ;
\r
72 var oItem = menu.AddItem( 'Cell' , FCKLang.CellCM ) ;
\r
73 oItem.AddItem( 'TableInsertCellBefore' , FCKLang.InsertCellBefore, 69 ) ;
\r
74 oItem.AddItem( 'TableInsertCellAfter' , FCKLang.InsertCellAfter, 58 ) ;
\r
75 oItem.AddItem( 'TableDeleteCells' , FCKLang.DeleteCells, 59 ) ;
\r
76 if ( FCKBrowserInfo.IsGecko )
\r
77 oItem.AddItem( 'TableMergeCells' , FCKLang.MergeCells, 60,
\r
78 FCKCommands.GetCommand( 'TableMergeCells' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
81 oItem.AddItem( 'TableMergeRight' , FCKLang.MergeRight, 60,
\r
82 FCKCommands.GetCommand( 'TableMergeRight' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
83 oItem.AddItem( 'TableMergeDown' , FCKLang.MergeDown, 60,
\r
84 FCKCommands.GetCommand( 'TableMergeDown' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
86 oItem.AddItem( 'TableHorizontalSplitCell' , FCKLang.HorizontalSplitCell, 61,
\r
87 FCKCommands.GetCommand( 'TableHorizontalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
88 oItem.AddItem( 'TableVerticalSplitCell' , FCKLang.VerticalSplitCell, 61,
\r
89 FCKCommands.GetCommand( 'TableVerticalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
90 oItem.AddSeparator() ;
\r
91 oItem.AddItem( 'TableCellProp' , FCKLang.CellProperties, 57,
\r
92 FCKCommands.GetCommand( 'TableCellProp' ).GetState() == FCK_TRISTATE_DISABLED ) ;
\r
94 menu.AddSeparator() ;
\r
95 oItem = menu.AddItem( 'Row' , FCKLang.RowCM ) ;
\r
96 oItem.AddItem( 'TableInsertRowBefore' , FCKLang.InsertRowBefore, 70 ) ;
\r
97 oItem.AddItem( 'TableInsertRowAfter' , FCKLang.InsertRowAfter, 62 ) ;
\r
98 oItem.AddItem( 'TableDeleteRows' , FCKLang.DeleteRows, 63 ) ;
\r
100 menu.AddSeparator() ;
\r
101 oItem = menu.AddItem( 'Column' , FCKLang.ColumnCM ) ;
\r
102 oItem.AddItem( 'TableInsertColumnBefore', FCKLang.InsertColumnBefore, 71 ) ;
\r
103 oItem.AddItem( 'TableInsertColumnAfter' , FCKLang.InsertColumnAfter, 64 ) ;
\r
104 oItem.AddItem( 'TableDeleteColumns' , FCKLang.DeleteColumns, 65 ) ;
\r
107 if ( bIsTable || bIsCell )
\r
109 menu.AddSeparator() ;
\r
110 menu.AddItem( 'TableDelete' , FCKLang.TableDelete ) ;
\r
111 menu.AddItem( 'TableProp' , FCKLang.TableProperties, 39 ) ;
\r
117 AddItems : function( menu, tag, tagName )
\r
119 var bInsideLink = ( tagName == 'A' || FCKSelection.HasAncestorNode( 'A' ) ) ;
\r
121 if ( bInsideLink || FCK.GetNamedCommandState( 'Unlink' ) != FCK_TRISTATE_DISABLED )
\r
123 // Go up to the anchor to test its properties
\r
124 var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
\r
125 var bIsAnchor = ( oLink && oLink.name.length > 0 && oLink.href.length == 0 ) ;
\r
126 // If it isn't a link then don't add the Link context menu
\r
130 menu.AddSeparator() ;
\r
131 menu.AddItem( 'VisitLink', FCKLang.VisitLink ) ;
\r
132 menu.AddSeparator() ;
\r
134 menu.AddItem( 'Link', FCKLang.EditLink , 34 ) ;
\r
135 menu.AddItem( 'Unlink' , FCKLang.RemoveLink , 35 ) ;
\r
141 AddItems : function( menu, tag, tagName )
\r
143 if ( tagName == 'IMG' && !tag.getAttribute( '_fckfakelement' ) )
\r
145 menu.AddSeparator() ;
\r
146 menu.AddItem( 'Image', FCKLang.ImageProperties, 37 ) ;
\r
152 AddItems : function( menu, tag, tagName )
\r
154 // Go up to the anchor to test its properties
\r
155 var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
\r
156 var bIsAnchor = ( oLink && oLink.name.length > 0 ) ;
\r
158 if ( bIsAnchor || ( tagName == 'IMG' && tag.getAttribute( '_fckanchor' ) ) )
\r
160 menu.AddSeparator() ;
\r
161 menu.AddItem( 'Anchor', FCKLang.AnchorProp, 36 ) ;
\r
162 menu.AddItem( 'AnchorDelete', FCKLang.AnchorDelete ) ;
\r
168 AddItems : function( menu, tag, tagName )
\r
170 if ( tagName == 'IMG' && tag.getAttribute( '_fckflash' ) )
\r
172 menu.AddSeparator() ;
\r
173 menu.AddItem( 'Flash', FCKLang.FlashProperties, 38 ) ;
\r
179 AddItems : function( menu, tag, tagName )
\r
181 if ( FCKSelection.HasAncestorNode('FORM') )
\r
183 menu.AddSeparator() ;
\r
184 menu.AddItem( 'Form', FCKLang.FormProp, 48 ) ;
\r
190 AddItems : function( menu, tag, tagName )
\r
192 if ( tagName == 'INPUT' && tag.type == 'checkbox' )
\r
194 menu.AddSeparator() ;
\r
195 menu.AddItem( 'Checkbox', FCKLang.CheckboxProp, 49 ) ;
\r
201 AddItems : function( menu, tag, tagName )
\r
203 if ( tagName == 'INPUT' && tag.type == 'radio' )
\r
205 menu.AddSeparator() ;
\r
206 menu.AddItem( 'Radio', FCKLang.RadioButtonProp, 50 ) ;
\r
212 AddItems : function( menu, tag, tagName )
\r
214 if ( tagName == 'INPUT' && ( tag.type == 'text' || tag.type == 'password' ) )
\r
216 menu.AddSeparator() ;
\r
217 menu.AddItem( 'TextField', FCKLang.TextFieldProp, 51 ) ;
\r
221 case 'HiddenField' :
\r
223 AddItems : function( menu, tag, tagName )
\r
225 if ( tagName == 'IMG' && tag.getAttribute( '_fckinputhidden' ) )
\r
227 menu.AddSeparator() ;
\r
228 menu.AddItem( 'HiddenField', FCKLang.HiddenFieldProp, 56 ) ;
\r
232 case 'ImageButton' :
\r
234 AddItems : function( menu, tag, tagName )
\r
236 if ( tagName == 'INPUT' && tag.type == 'image' )
\r
238 menu.AddSeparator() ;
\r
239 menu.AddItem( 'ImageButton', FCKLang.ImageButtonProp, 55 ) ;
\r
245 AddItems : function( menu, tag, tagName )
\r
247 if ( tagName == 'INPUT' && ( tag.type == 'button' || tag.type == 'submit' || tag.type == 'reset' ) )
\r
249 menu.AddSeparator() ;
\r
250 menu.AddItem( 'Button', FCKLang.ButtonProp, 54 ) ;
\r
256 AddItems : function( menu, tag, tagName )
\r
258 if ( tagName == 'SELECT' )
\r
260 menu.AddSeparator() ;
\r
261 menu.AddItem( 'Select', FCKLang.SelectionFieldProp, 53 ) ;
\r
267 AddItems : function( menu, tag, tagName )
\r
269 if ( tagName == 'TEXTAREA' )
\r
271 menu.AddSeparator() ;
\r
272 menu.AddItem( 'Textarea', FCKLang.TextareaProp, 52 ) ;
\r
276 case 'BulletedList' :
\r
278 AddItems : function( menu, tag, tagName )
\r
280 if ( FCKSelection.HasAncestorNode('UL') )
\r
282 menu.AddSeparator() ;
\r
283 menu.AddItem( 'BulletedList', FCKLang.BulletedListProp, 27 ) ;
\r
287 case 'NumberedList' :
\r
289 AddItems : function( menu, tag, tagName )
\r
291 if ( FCKSelection.HasAncestorNode('OL') )
\r
293 menu.AddSeparator() ;
\r
294 menu.AddItem( 'NumberedList', FCKLang.NumberedListProp, 26 ) ;
\r
298 case 'DivContainer':
\r
300 AddItems : function( menu, tag, tagName )
\r
302 var currentBlocks = FCKDomTools.GetSelectedDivContainers() ;
\r
304 if ( currentBlocks.length > 0 )
\r
306 menu.AddSeparator() ;
\r
307 menu.AddItem( 'EditDiv', FCKLang.EditDiv, 75 ) ;
\r
308 menu.AddItem( 'DeleteDiv', FCKLang.DeleteDiv, 76 ) ;
\r
316 function FCK_ContextMenu_OnBeforeOpen()
\r
319 FCK.Events.FireEvent( 'OnSelectionChange' ) ;
\r
321 // Get the actual selected tag (if any).
\r
322 var oTag, sTagName ;
\r
324 // The extra () is to avoid a warning with strict error checking. This is ok.
\r
325 if ( (oTag = FCKSelection.GetSelectedElement()) )
\r
326 sTagName = oTag.tagName ;
\r
328 // Cleanup the current menu items.
\r
329 var oMenu = FCK.ContextMenu._InnerContextMenu ;
\r
330 oMenu.RemoveAllItems() ;
\r
332 // Loop through the listeners.
\r
333 var aListeners = FCK.ContextMenu.Listeners ;
\r
334 for ( var i = 0 ; i < aListeners.length ; i++ )
\r
335 aListeners[i].AddItems( oMenu, oTag, sTagName ) ;
\r
338 function FCK_ContextMenu_OnItemClick( item )
\r
340 // IE might work incorrectly if we refocus the editor #798
\r
341 if ( !FCKBrowserInfo.IsIE )
\r
344 FCKCommands.GetCommand( item.Name ).Execute( item.CustomData ) ;
\r