source: extensions/FCKEditor/editor/_source/classes/fckspecialcombo.js @ 3295

Last change on this file since 3295 was 3295, checked in by patdenice, 15 years ago

New extension added:
FCK Editor (2.0.a)

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