fckspecialcombo.js
上传用户:ah_jiwei
上传日期:2022-07-24
资源大小:54044k
文件大小:11k
源码类别:

数据库编程

开发平台:

Visual C++

  1. /*
  2.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3.  * Copyright (C) 2003-2007 Frederico Caldeira Knabben
  4.  *
  5.  * == BEGIN LICENSE ==
  6.  *
  7.  * Licensed under the terms of any of the following licenses at your
  8.  * choice:
  9.  *
  10.  *  - GNU General Public License Version 2 or later (the "GPL")
  11.  *    http://www.gnu.org/licenses/gpl.html
  12.  *
  13.  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
  14.  *    http://www.gnu.org/licenses/lgpl.html
  15.  *
  16.  *  - Mozilla Public License Version 1.1 or later (the "MPL")
  17.  *    http://www.mozilla.org/MPL/MPL-1.1.html
  18.  *
  19.  * == END LICENSE ==
  20.  *
  21.  * FCKSpecialCombo Class: represents a special combo.
  22.  */
  23. var FCKSpecialCombo = function( caption, fieldWidth, panelWidth, panelMaxHeight, parentWindow )
  24. {
  25. // Default properties values.
  26. this.FieldWidth = fieldWidth || 100 ;
  27. this.PanelWidth = panelWidth || 150 ;
  28. this.PanelMaxHeight = panelMaxHeight || 150 ;
  29. this.Label = ' ' ;
  30. this.Caption = caption ;
  31. this.Tooltip = caption ;
  32. this.Style = FCK_TOOLBARITEM_ICONTEXT ;
  33. this.Enabled = true ;
  34. this.Items = new Object() ;
  35. this._Panel = new FCKPanel( parentWindow || window ) ;
  36. this._Panel.AppendStyleSheet( FCKConfig.SkinPath + 'fck_editor.css' ) ;
  37. this._PanelBox = this._Panel.MainNode.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
  38. this._PanelBox.className = 'SC_Panel' ;
  39. this._PanelBox.style.width = this.PanelWidth + 'px' ;
  40. this._PanelBox.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
  41. this._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0] ;
  42. if ( FCK.IECleanup )
  43. FCK.IECleanup.AddItem( this, FCKSpecialCombo_Cleanup ) ;
  44. // this._Panel.StyleSheet = FCKConfig.SkinPath + 'fck_contextmenu.css' ;
  45. // this._Panel.Create() ;
  46. // this._Panel.PanelDiv.className += ' SC_Panel' ;
  47. // this._Panel.PanelDiv.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
  48. // this._ItemsHolderEl = this._Panel.PanelDiv.getElementsByTagName('TD')[0] ;
  49. }
  50. function FCKSpecialCombo_ItemOnMouseOver()
  51. {
  52. this.className += ' SC_ItemOver' ;
  53. }
  54. function FCKSpecialCombo_ItemOnMouseOut()
  55. {
  56. this.className = this.originalClass ;
  57. }
  58. function FCKSpecialCombo_ItemOnClick( ev, specialCombo, itemId )
  59. {
  60. this.className = this.originalClass ;
  61. specialCombo._Panel.Hide() ;
  62. specialCombo.SetLabel( this.FCKItemLabel ) ;
  63. if ( typeof( specialCombo.OnSelect ) == 'function' )
  64. specialCombo.OnSelect( itemId, this ) ;
  65. }
  66. FCKSpecialCombo.prototype.ClearItems = function ()
  67. {
  68. if ( this.Items )
  69. {
  70. for ( var key in this.Items )
  71. this.Items[key] = null ;
  72. }
  73. var itemsholder = this._ItemsHolderEl ;
  74. while ( itemsholder.firstChild )
  75. itemsholder.removeChild( itemsholder.firstChild ) ;
  76. }
  77. FCKSpecialCombo.prototype.AddItem = function( id, html, label, bgColor )
  78. {
  79. // <div class="SC_Item" onmouseover="this.className='SC_Item SC_ItemOver';" onmouseout="this.className='SC_Item';"><b>Bold 1</b></div>
  80. var oDiv = this._ItemsHolderEl.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
  81. oDiv.className = oDiv.originalClass = 'SC_Item' ;
  82. oDiv.innerHTML = html ;
  83. oDiv.FCKItemLabel = label || id ;
  84. oDiv.Selected = false ;
  85. // In IE, the width must be set so the borders are shown correctly when the content overflows.
  86. if ( FCKBrowserInfo.IsIE )
  87. oDiv.style.width = '100%' ;
  88. if ( bgColor )
  89. oDiv.style.backgroundColor = bgColor ;
  90. FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKSpecialCombo_ItemOnMouseOver ) ;
  91. FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKSpecialCombo_ItemOnMouseOut ) ;
  92. FCKTools.AddEventListenerEx( oDiv, 'click', FCKSpecialCombo_ItemOnClick, [ this, id ] ) ;
  93. this.Items[ id.toString().toLowerCase() ] = oDiv ;
  94. return oDiv ;
  95. }
  96. FCKSpecialCombo.prototype.SelectItem = function( item )
  97. {
  98. if ( typeof item == 'string' )
  99. item = this.Items[ item.toString().toLowerCase() ] ;
  100. if ( item )
  101. {
  102. item.className = item.originalClass = 'SC_ItemSelected' ;
  103. item.Selected = true ;
  104. }
  105. }
  106. FCKSpecialCombo.prototype.SelectItemByLabel = function( itemLabel, setLabel )
  107. {
  108. for ( var id in this.Items )
  109. {
  110. var oDiv = this.Items[id] ;
  111. if ( oDiv.FCKItemLabel == itemLabel )
  112. {
  113. oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ;
  114. oDiv.Selected = true ;
  115. if ( setLabel )
  116. this.SetLabel( itemLabel ) ;
  117. }
  118. }
  119. }
  120. FCKSpecialCombo.prototype.DeselectAll = function( clearLabel )
  121. {
  122. for ( var i in this.Items )
  123. {
  124. if ( !this.Items[i] ) continue;
  125. this.Items[i].className = this.Items[i].originalClass = 'SC_Item' ;
  126. this.Items[i].Selected = false ;
  127. }
  128. if ( clearLabel )
  129. this.SetLabel( '' ) ;
  130. }
  131. FCKSpecialCombo.prototype.SetLabelById = function( id )
  132. {
  133. id = id ? id.toString().toLowerCase() : '' ;
  134. var oDiv = this.Items[ id ] ;
  135. this.SetLabel( oDiv ? oDiv.FCKItemLabel : '' ) ;
  136. }
  137. FCKSpecialCombo.prototype.SetLabel = function( text )
  138. {
  139. text = ( !text || text.length == 0 ) ? '&nbsp;' : text ;
  140. if ( text == this.Label )
  141. return ;
  142. this.Label = text ;
  143. var labelEl = this._LabelEl ;
  144. if ( labelEl )
  145. {
  146. labelEl.innerHTML = text ;
  147. // It may happen that the label is some HTML, including tags. This
  148. // would be a problem because when the user click on those tags, the
  149. // combo will get the selection from the editing area. So we must
  150. // disable any kind of selection here.
  151. FCKTools.DisableSelection( labelEl ) ;
  152. }
  153. }
  154. FCKSpecialCombo.prototype.SetEnabled = function( isEnabled )
  155. {
  156. this.Enabled = isEnabled ;
  157. this._OuterTable.className = isEnabled ? '' : 'SC_FieldDisabled' ;
  158. }
  159. FCKSpecialCombo.prototype.Create = function( targetElement )
  160. {
  161. var oDoc = FCKTools.GetElementDocument( targetElement ) ;
  162. var eOuterTable = this._OuterTable = targetElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
  163. eOuterTable.cellPadding = 0 ;
  164. eOuterTable.cellSpacing = 0 ;
  165. eOuterTable.insertRow(-1) ;
  166. var sClass ;
  167. var bShowLabel ;
  168. switch ( this.Style )
  169. {
  170. case FCK_TOOLBARITEM_ONLYICON :
  171. sClass = 'TB_ButtonType_Icon' ;
  172. bShowLabel = false;
  173. break ;
  174. case FCK_TOOLBARITEM_ONLYTEXT :
  175. sClass = 'TB_ButtonType_Text' ;
  176. bShowLabel = false;
  177. break ;
  178. case FCK_TOOLBARITEM_ICONTEXT :
  179. bShowLabel = true;
  180. break ;
  181. }
  182. if ( this.Caption && this.Caption.length > 0 && bShowLabel )
  183. {
  184. var oCaptionCell = eOuterTable.rows[0].insertCell(-1) ;
  185. oCaptionCell.innerHTML = this.Caption ;
  186. oCaptionCell.className = 'SC_FieldCaption' ;
  187. }
  188. // Create the main DIV element.
  189. var oField = FCKTools.AppendElement( eOuterTable.rows[0].insertCell(-1), 'div' ) ;
  190. if ( bShowLabel )
  191. {
  192. oField.className = 'SC_Field' ;
  193. oField.style.width = this.FieldWidth + 'px' ;
  194. oField.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label>&nbsp;</label></td><td class="SC_FieldButton">&nbsp;</td></tr></tbody></table>' ;
  195. this._LabelEl = oField.getElementsByTagName('label')[0] ; // Memory Leak
  196. this._LabelEl.innerHTML = this.Label ;
  197. }
  198. else
  199. {
  200. oField.className = 'TB_Button_Off' ;
  201. //oField.innerHTML = '<span className="SC_FieldCaption">' + this.Caption + '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;">&nbsp;</td></tr></tbody></table>' ;
  202. //oField.innerHTML = '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;">&nbsp;</td></tr></tbody></table>' ;
  203. // Gets the correct CSS class to use for the specified style (param).
  204. oField.innerHTML = '<table title="' + this.Tooltip + '" class="' + sClass + '" cellspacing="0" cellpadding="0" border="0">' +
  205. '<tr>' +
  206. //'<td class="TB_Icon"><img src="' + FCKConfig.SkinPath + 'toolbar/' + this.Command.Name.toLowerCase() + '.gif" width="21" height="21"></td>' +
  207. '<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
  208. '<td class="TB_Text">' + this.Caption + '</td>' +
  209. '<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
  210. '<td class="TB_ButtonArrow"><img src="' + FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif" width="5" height="3"></td>' +
  211. '<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
  212. '</tr>' +
  213. '</table>' ;
  214. }
  215. // Events Handlers
  216. FCKTools.AddEventListenerEx( oField, 'mouseover', FCKSpecialCombo_OnMouseOver, this ) ;
  217. FCKTools.AddEventListenerEx( oField, 'mouseout', FCKSpecialCombo_OnMouseOut, this ) ;
  218. FCKTools.AddEventListenerEx( oField, 'click', FCKSpecialCombo_OnClick, this ) ;
  219. FCKTools.DisableSelection( this._Panel.Document.body ) ;
  220. }
  221. function FCKSpecialCombo_Cleanup()
  222. {
  223. this._LabelEl = null ;
  224. this._OuterTable = null ;
  225. this._ItemsHolderEl = null ;
  226. this._PanelBox = null ;
  227. if ( this.Items )
  228. {
  229. for ( var key in this.Items )
  230. this.Items[key] = null ;
  231. }
  232. }
  233. function FCKSpecialCombo_OnMouseOver( ev, specialCombo )
  234. {
  235. if ( specialCombo.Enabled )
  236. {
  237. switch ( specialCombo.Style )
  238. {
  239. case FCK_TOOLBARITEM_ONLYICON :
  240. this.className = 'TB_Button_On_Over';
  241. break ;
  242. case FCK_TOOLBARITEM_ONLYTEXT :
  243. this.className = 'TB_Button_On_Over';
  244. break ;
  245. case FCK_TOOLBARITEM_ICONTEXT :
  246. this.className = 'SC_Field SC_FieldOver' ;
  247. break ;
  248. }
  249. }
  250. }
  251. function FCKSpecialCombo_OnMouseOut( ev, specialCombo )
  252. {
  253. switch ( specialCombo.Style )
  254. {
  255. case FCK_TOOLBARITEM_ONLYICON :
  256. this.className = 'TB_Button_Off';
  257. break ;
  258. case FCK_TOOLBARITEM_ONLYTEXT :
  259. this.className = 'TB_Button_Off';
  260. break ;
  261. case FCK_TOOLBARITEM_ICONTEXT :
  262. this.className='SC_Field' ;
  263. break ;
  264. }
  265. }
  266. function FCKSpecialCombo_OnClick( e, specialCombo )
  267. {
  268. // For Mozilla we must stop the event propagation to avoid it hiding
  269. // the panel because of a click outside of it.
  270. // if ( e )
  271. // {
  272. // e.stopPropagation() ;
  273. // FCKPanelEventHandlers.OnDocumentClick( e ) ;
  274. // }
  275. if ( specialCombo.Enabled )
  276. {
  277. var oPanel = specialCombo._Panel ;
  278. var oPanelBox = specialCombo._PanelBox ;
  279. var oItemsHolder = specialCombo._ItemsHolderEl ;
  280. var iMaxHeight = specialCombo.PanelMaxHeight ;
  281. if ( specialCombo.OnBeforeClick )
  282. specialCombo.OnBeforeClick( specialCombo ) ;
  283. // This is a tricky thing. We must call the "Load" function, otherwise
  284. // it will not be possible to retrieve "oItemsHolder.offsetHeight" (IE only).
  285. if ( FCKBrowserInfo.IsIE )
  286. oPanel.Preload( 0, this.offsetHeight, this ) ;
  287. if ( oItemsHolder.offsetHeight > iMaxHeight )
  288. // {
  289. oPanelBox.style.height = iMaxHeight + 'px' ;
  290. // if ( FCKBrowserInfo.IsGecko )
  291. // oPanelBox.style.overflow = '-moz-scrollbars-vertical' ;
  292. // }
  293. else
  294. oPanelBox.style.height = '' ;
  295. // oPanel.PanelDiv.style.width = specialCombo.PanelWidth + 'px' ;
  296. oPanel.Show( 0, this.offsetHeight, this ) ;
  297. }
  298. // return false ;
  299. }
  300. /*
  301. Sample Combo Field HTML output:
  302. <div class="SC_Field" style="width: 80px;">
  303. <table width="100%" cellpadding="0" cellspacing="0" style="table-layout: fixed;">
  304. <tbody>
  305. <tr>
  306. <td class="SC_FieldLabel"><label>&nbsp;</label></td>
  307. <td class="SC_FieldButton">&nbsp;</td>
  308. </tr>
  309. </tbody>
  310. </table>
  311. </div>
  312. */