You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
363 lines
10 KiB
363 lines
10 KiB
/*
|
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
|
* Copyright (C) 2003-2007 Frederico Caldeira Knabben
|
|
*
|
|
* == BEGIN LICENSE ==
|
|
*
|
|
* Licensed under the terms of any of the following licenses at your
|
|
* choice:
|
|
*
|
|
* - GNU General Public License Version 2 or later (the "GPL")
|
|
* http://www.gnu.org/licenses/gpl.html
|
|
*
|
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
|
* http://www.gnu.org/licenses/lgpl.html
|
|
*
|
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
|
*
|
|
* == END LICENSE ==
|
|
*
|
|
* FCKSpecialCombo Class: represents a special combo.
|
|
*/
|
|
|
|
var FCKSpecialCombo = function( caption, fieldWidth, panelWidth, panelMaxHeight, parentWindow )
|
|
{
|
|
// Default properties values.
|
|
this.FieldWidth = fieldWidth || 100 ;
|
|
this.PanelWidth = panelWidth || 150 ;
|
|
this.PanelMaxHeight = panelMaxHeight || 150 ;
|
|
this.Label = ' ' ;
|
|
this.Caption = caption ;
|
|
this.Tooltip = caption ;
|
|
this.Style = FCK_TOOLBARITEM_ICONTEXT ;
|
|
|
|
this.Enabled = true ;
|
|
|
|
this.Items = new Object() ;
|
|
|
|
this._Panel = new FCKPanel( parentWindow || window, true ) ;
|
|
this._Panel.AppendStyleSheet( FCKConfig.SkinPath + 'fck_editor.css' ) ;
|
|
this._PanelBox = this._Panel.MainNode.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
|
|
this._PanelBox.className = 'SC_Panel' ;
|
|
this._PanelBox.style.width = this.PanelWidth + 'px' ;
|
|
|
|
this._PanelBox.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
|
|
|
|
this._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0] ;
|
|
|
|
if ( FCK.IECleanup )
|
|
FCK.IECleanup.AddItem( this, FCKSpecialCombo_Cleanup ) ;
|
|
|
|
// this._Panel.StyleSheet = FCKConfig.SkinPath + 'fck_contextmenu.css' ;
|
|
// this._Panel.Create() ;
|
|
// this._Panel.PanelDiv.className += ' SC_Panel' ;
|
|
// this._Panel.PanelDiv.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
|
|
// this._ItemsHolderEl = this._Panel.PanelDiv.getElementsByTagName('TD')[0] ;
|
|
}
|
|
|
|
function FCKSpecialCombo_ItemOnMouseOver()
|
|
{
|
|
this.className += ' SC_ItemOver' ;
|
|
}
|
|
|
|
function FCKSpecialCombo_ItemOnMouseOut()
|
|
{
|
|
this.className = this.originalClass ;
|
|
}
|
|
|
|
function FCKSpecialCombo_ItemOnClick()
|
|
{
|
|
this.className = this.originalClass ;
|
|
|
|
this.FCKSpecialCombo._Panel.Hide() ;
|
|
|
|
this.FCKSpecialCombo.SetLabel( this.FCKItemLabel ) ;
|
|
|
|
if ( typeof( this.FCKSpecialCombo.OnSelect ) == 'function' )
|
|
this.FCKSpecialCombo.OnSelect( this.FCKItemID, this ) ;
|
|
}
|
|
|
|
FCKSpecialCombo.prototype.AddItem = function( id, html, label, bgColor )
|
|
{
|
|
// <div class="SC_Item" onmouseover="this.className='SC_Item SC_ItemOver';" onmouseout="this.className='SC_Item';"><b>Bold 1</b></div>
|
|
var oDiv = this._ItemsHolderEl.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
|
|
oDiv.className = oDiv.originalClass = 'SC_Item' ;
|
|
oDiv.innerHTML = html ;
|
|
oDiv.FCKItemID = id ;
|
|
oDiv.FCKItemLabel = label || id ;
|
|
oDiv.FCKSpecialCombo = this ;
|
|
oDiv.Selected = false ;
|
|
|
|
// In IE, the width must be set so the borders are shown correctly when the content overflows.
|
|
if ( FCKBrowserInfo.IsIE )
|
|
oDiv.style.width = '100%' ;
|
|
|
|
if ( bgColor )
|
|
oDiv.style.backgroundColor = bgColor ;
|
|
|
|
oDiv.onmouseover = FCKSpecialCombo_ItemOnMouseOver ;
|
|
oDiv.onmouseout = FCKSpecialCombo_ItemOnMouseOut ;
|
|
oDiv.onclick = FCKSpecialCombo_ItemOnClick ;
|
|
|
|
this.Items[ id.toString().toLowerCase() ] = oDiv ;
|
|
|
|
return oDiv ;
|
|
}
|
|
|
|
FCKSpecialCombo.prototype.SelectItem = function( itemId )
|
|
{
|
|
itemId = itemId ? itemId.toString().toLowerCase() : '' ;
|
|
|
|
var oDiv = this.Items[ itemId ] ;
|
|
if ( oDiv )
|
|
{
|
|
oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ;
|
|
oDiv.Selected = true ;
|
|
}
|
|
}
|
|
|
|
FCKSpecialCombo.prototype.SelectItemByLabel = function( itemLabel, setLabel )
|
|
{
|
|
for ( var id in this.Items )
|
|
{
|
|
var oDiv = this.Items[id] ;
|
|
|
|
if ( oDiv.FCKItemLabel == itemLabel )
|
|
{
|
|
oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ;
|
|
oDiv.Selected = true ;
|
|
|
|
if ( setLabel )
|
|
this.SetLabel( itemLabel ) ;
|
|
}
|
|
}
|
|
}
|
|
|
|
FCKSpecialCombo.prototype.DeselectAll = function( clearLabel )
|
|
{
|
|
for ( var i in this.Items )
|
|
{
|
|
this.Items[i].className = this.Items[i].originalClass = 'SC_Item' ;
|
|
this.Items[i].Selected = false ;
|
|
}
|
|
|
|
if ( clearLabel )
|
|
this.SetLabel( '' ) ;
|
|
}
|
|
|
|
FCKSpecialCombo.prototype.SetLabelById = function( id )
|
|
{
|
|
id = id ? id.toString().toLowerCase() : '' ;
|
|
|
|
var oDiv = this.Items[ id ] ;
|
|
this.SetLabel( oDiv ? oDiv.FCKItemLabel : '' ) ;
|
|
}
|
|
|
|
FCKSpecialCombo.prototype.SetLabel = function( text )
|
|
{
|
|
this.Label = text.length == 0 ? ' ' : text ;
|
|
|
|
if ( this._LabelEl )
|
|
{
|
|
this._LabelEl.innerHTML = this.Label ;
|
|
|
|
// It may happen that the label is some HTML, including tags. This
|
|
// would be a problem because when the user click on those tags, the
|
|
// combo will get the selection from the editing area. So we must
|
|
// disable any kind of selection here.
|
|
FCKTools.DisableSelection( this._LabelEl ) ;
|
|
}
|
|
}
|
|
|
|
FCKSpecialCombo.prototype.SetEnabled = function( isEnabled )
|
|
{
|
|
this.Enabled = isEnabled ;
|
|
|
|
this._OuterTable.className = isEnabled ? '' : 'SC_FieldDisabled' ;
|
|
}
|
|
|
|
FCKSpecialCombo.prototype.Create = function( targetElement )
|
|
{
|
|
var oDoc = FCKTools.GetElementDocument( targetElement ) ;
|
|
var eOuterTable = this._OuterTable = targetElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
|
|
eOuterTable.cellPadding = 0 ;
|
|
eOuterTable.cellSpacing = 0 ;
|
|
|
|
eOuterTable.insertRow(-1) ;
|
|
|
|
var sClass ;
|
|
var bShowLabel ;
|
|
|
|
switch ( this.Style )
|
|
{
|
|
case FCK_TOOLBARITEM_ONLYICON :
|
|
sClass = 'TB_ButtonType_Icon' ;
|
|
bShowLabel = false;
|
|
break ;
|
|
case FCK_TOOLBARITEM_ONLYTEXT :
|
|
sClass = 'TB_ButtonType_Text' ;
|
|
bShowLabel = false;
|
|
break ;
|
|
case FCK_TOOLBARITEM_ICONTEXT :
|
|
bShowLabel = true;
|
|
break ;
|
|
}
|
|
|
|
if ( this.Caption && this.Caption.length > 0 && bShowLabel )
|
|
{
|
|
var oCaptionCell = eOuterTable.rows[0].insertCell(-1) ;
|
|
oCaptionCell.innerHTML = this.Caption ;
|
|
oCaptionCell.className = 'SC_FieldCaption' ;
|
|
}
|
|
|
|
// Create the main DIV element.
|
|
var oField = FCKTools.AppendElement( eOuterTable.rows[0].insertCell(-1), 'div' ) ;
|
|
if ( bShowLabel )
|
|
{
|
|
oField.className = 'SC_Field' ;
|
|
oField.style.width = this.FieldWidth + 'px' ;
|
|
oField.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label> </label></td><td class="SC_FieldButton"> </td></tr></tbody></table>' ;
|
|
|
|
this._LabelEl = oField.getElementsByTagName('label')[0] ; // Memory Leak
|
|
this._LabelEl.innerHTML = this.Label ;
|
|
}
|
|
else
|
|
{
|
|
oField.className = 'TB_Button_Off' ;
|
|
//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;"> </td></tr></tbody></table>' ;
|
|
//oField.innerHTML = '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;"> </td></tr></tbody></table>' ;
|
|
|
|
// Gets the correct CSS class to use for the specified style (param).
|
|
oField.innerHTML = '<table title="' + this.Tooltip + '" class="' + sClass + '" cellspacing="0" cellpadding="0" border="0">' +
|
|
'<tr>' +
|
|
//'<td class="TB_Icon"><img src="' + FCKConfig.SkinPath + 'toolbar/' + this.Command.Name.toLowerCase() + '.gif" width="21" height="21"></td>' +
|
|
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
|
'<td class="TB_Text">' + this.Caption + '</td>' +
|
|
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
|
'<td class="TB_ButtonArrow"><img src="' + FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif" width="5" height="3"></td>' +
|
|
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
|
'</tr>' +
|
|
'</table>' ;
|
|
}
|
|
|
|
|
|
// Events Handlers
|
|
|
|
oField.SpecialCombo = this ;
|
|
|
|
oField.onmouseover = FCKSpecialCombo_OnMouseOver ;
|
|
oField.onmouseout = FCKSpecialCombo_OnMouseOut ;
|
|
oField.onclick = FCKSpecialCombo_OnClick ;
|
|
|
|
FCKTools.DisableSelection( this._Panel.Document.body ) ;
|
|
}
|
|
|
|
function FCKSpecialCombo_Cleanup()
|
|
{
|
|
this._LabelEl = null ;
|
|
this._OuterTable = null ;
|
|
this._ItemsHolderEl = null ;
|
|
this._PanelBox = null ;
|
|
|
|
if ( this.Items )
|
|
{
|
|
for ( var key in this.Items )
|
|
this.Items[key] = null ;
|
|
}
|
|
}
|
|
|
|
function FCKSpecialCombo_OnMouseOver()
|
|
{
|
|
if ( this.SpecialCombo.Enabled )
|
|
{
|
|
switch ( this.SpecialCombo.Style )
|
|
{
|
|
case FCK_TOOLBARITEM_ONLYICON :
|
|
this.className = 'TB_Button_On_Over';
|
|
break ;
|
|
case FCK_TOOLBARITEM_ONLYTEXT :
|
|
this.className = 'TB_Button_On_Over';
|
|
break ;
|
|
case FCK_TOOLBARITEM_ICONTEXT :
|
|
this.className = 'SC_Field SC_FieldOver' ;
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
|
|
function FCKSpecialCombo_OnMouseOut()
|
|
{
|
|
switch ( this.SpecialCombo.Style )
|
|
{
|
|
case FCK_TOOLBARITEM_ONLYICON :
|
|
this.className = 'TB_Button_Off';
|
|
break ;
|
|
case FCK_TOOLBARITEM_ONLYTEXT :
|
|
this.className = 'TB_Button_Off';
|
|
break ;
|
|
case FCK_TOOLBARITEM_ICONTEXT :
|
|
this.className='SC_Field' ;
|
|
break ;
|
|
}
|
|
}
|
|
|
|
function FCKSpecialCombo_OnClick( e )
|
|
{
|
|
// For Mozilla we must stop the event propagation to avoid it hiding
|
|
// the panel because of a click outside of it.
|
|
// if ( e )
|
|
// {
|
|
// e.stopPropagation() ;
|
|
// FCKPanelEventHandlers.OnDocumentClick( e ) ;
|
|
// }
|
|
|
|
var oSpecialCombo = this.SpecialCombo ;
|
|
|
|
if ( oSpecialCombo.Enabled )
|
|
{
|
|
var oPanel = oSpecialCombo._Panel ;
|
|
var oPanelBox = oSpecialCombo._PanelBox ;
|
|
var oItemsHolder = oSpecialCombo._ItemsHolderEl ;
|
|
var iMaxHeight = oSpecialCombo.PanelMaxHeight ;
|
|
|
|
if ( oSpecialCombo.OnBeforeClick )
|
|
oSpecialCombo.OnBeforeClick( oSpecialCombo ) ;
|
|
|
|
// This is a tricky thing. We must call the "Load" function, otherwise
|
|
// it will not be possible to retrieve "oItemsHolder.offsetHeight" (IE only).
|
|
if ( FCKBrowserInfo.IsIE )
|
|
oPanel.Preload( 0, this.offsetHeight, this ) ;
|
|
|
|
if ( oItemsHolder.offsetHeight > iMaxHeight )
|
|
// {
|
|
oPanelBox.style.height = iMaxHeight + 'px' ;
|
|
|
|
// if ( FCKBrowserInfo.IsGecko )
|
|
// oPanelBox.style.overflow = '-moz-scrollbars-vertical' ;
|
|
// }
|
|
else
|
|
oPanelBox.style.height = '' ;
|
|
|
|
// oPanel.PanelDiv.style.width = oSpecialCombo.PanelWidth + 'px' ;
|
|
|
|
oPanel.Show( 0, this.offsetHeight, this ) ;
|
|
}
|
|
|
|
// return false ;
|
|
}
|
|
|
|
/*
|
|
Sample Combo Field HTML output:
|
|
|
|
<div class="SC_Field" style="width: 80px;">
|
|
<table width="100%" cellpadding="0" cellspacing="0" style="table-layout: fixed;">
|
|
<tbody>
|
|
<tr>
|
|
<td class="SC_FieldLabel"><label> </label></td>
|
|
<td class="SC_FieldButton"> </td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
*/ |