Changeset 2362

Show
Ignore:
Timestamp:
2008-08-18 12:40:37 (5 months ago)
Author:
alfonsoml
Message:

Add support for THead in the table dialog. #2430

Location:
FCKeditor/trunk
Files:
60 modified

Legend:

Unmodified
Added
Removed
  • FCKeditor/trunk/editor/dialog/common/fck_dialog_common.js

    r2056 r2362  
    313313        oDest.style.cssText = oSource.style.cssText ; 
    314314} 
     315 
     316/** 
     317* Replaces a tag with another one, keeping its contents: 
     318* for example TD --> TH, and TH --> TD. 
     319* input: the original node, and the new tag name 
     320* http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-renameNode 
     321*/ 
     322function RenameNode( oNode , newTag ) 
     323{ 
     324        // TODO: if the browser natively supports document.renameNode call it. 
     325        // does any browser currently support it in order to test? 
     326 
     327        // Only rename element nodes. 
     328        if ( oNode.nodeType != 1 )  
     329                return null ; 
     330 
     331        // If it's already correct exit here. 
     332        if ( oNode.nodeName == newTag ) 
     333                return oNode ; 
     334 
     335        var oDoc = oNode.ownerDocument ; 
     336        // Create the new node 
     337        var newNode = oDoc.createElement( newTag ) ; 
     338 
     339        // Copy all attributes 
     340        CopyAttributes( oNode, newNode, {} ) ; 
     341 
     342        // Move children to the new node 
     343        FCKDomTools.MoveChildren( oNode, newNode ) ; 
     344 
     345        // Finally replace the node and return the new one 
     346        oNode.parentNode.replaceChild( newNode, oNode ) ; 
     347 
     348        return newNode ; 
     349} 
  • FCKeditor/trunk/editor/dialog/fck_table.html

    r1565 r2362  
    3232var dialog      = window.parent ; 
    3333var oEditor = dialog.InnerDialogLoaded() ; 
    34 var dialogArguments = dialog.Args() ; 
    35  
    36 // Gets the document DOM 
    37 var oDOM = oEditor.FCK.EditorDocument ; 
     34 
     35var FCKDomTools = oEditor.FCKDomTools ; 
    3836 
    3937// Gets the table if there is one selected. 
    4038var table ; 
    4139var e = dialog.Selection.GetSelectedElement() ; 
     40var hasColumnHeaders ; 
    4241 
    4342if ( ( !e && document.location.search.substr(1) == 'Parent' ) || ( e && e.tagName != 'TABLE' ) ) 
     
    8887                var eCaption = oEditor.FCKDomTools.GetFirstChild( table, 'CAPTION' ) ; 
    8988                if ( eCaption ) document.getElementById('txtCaption').value = eCaption.innerHTML ; 
     89                 
     90                hasColumnHeaders = true ; 
     91                // Check if all the first cells in every row are TH 
     92                for (var row=0; row<table.rows.length; row++) 
     93                { 
     94                        // If just one cell isn't a TH then it isn't a header column 
     95                        if ( table.rows[row].cells[0].nodeName != 'TH' ) 
     96                        { 
     97                                hasColumnHeaders = false ; 
     98                                 
     99                                break; 
     100                        } 
     101                } 
     102 
     103                // Check if the table contains <thead> 
     104                if ((table.tHead !== null) )  
     105                { 
     106                        if (hasColumnHeaders) 
     107                                GetE('selHeaders').value = 'both' ; 
     108                        else 
     109                                GetE('selHeaders').value = 'row' ; 
     110                } 
     111                else 
     112                { 
     113                        if (hasColumnHeaders) 
     114                                GetE('selHeaders').value = 'col' ; 
     115                        else 
     116                                GetE('selHeaders').value = '' ; 
     117                } 
     118 
    90119 
    91120                document.getElementById('txtRows').disabled    = true ; 
     
    105134        var bExists = ( table != null ) ; 
    106135 
     136        var oDoc = oEditor.FCK.EditorDocument ;  
    107137        if ( ! bExists ) 
    108                 table = oEditor.FCK.EditorDocument.createElement( "TABLE" ) ; 
     138                table = oDoc.createElement( "TABLE" ) ; 
    109139 
    110140        // Removes the Width and Height styles 
     
    130160                if ( !eCaption ) 
    131161                { 
    132                         eCaption = oEditor.FCK.EditorDocument.createElement( 'CAPTION' ) ; 
     162                        eCaption = oDoc.createElement( 'CAPTION' ) ; 
    133163                        table.insertBefore( eCaption, table.firstChild ) ; 
    134164                } 
     
    146176        } 
    147177 
     178        var headers = GetE('selHeaders').value ; 
     179        if ( bExists ) 
     180        { 
     181                // Should we make a <thead>? 
     182                if ( table.tHead==null && (headers=='row' || headers=='both') ) 
     183                { 
     184                        var oThead = table.createTHead() ; 
     185                        var tbody = FCKDomTools.GetFirstChild( table, 'TBODY' ) ; 
     186                        var theRow= FCKDomTools.GetFirstChild( tbody, 'TR' ) ; 
     187 
     188                        //now change TD to TH: 
     189                        for (var i = 0; i<theRow.childNodes.length ; i++)  
     190                        { 
     191                                var th = RenameNode(theRow.childNodes[i], 'TH') ; 
     192                                if (th != null)  
     193                                        th.scope='col' ; 
     194                        } 
     195                        oThead.appendChild( theRow ) ; 
     196                } 
     197 
     198                if ( table.tHead!==null && !(headers=='row' || headers=='both') ) 
     199                { 
     200                        // Move the row out of the THead and put it in the TBody: 
     201                        var tHead = table.tHead ; 
     202                        var tbody = FCKDomTools.GetFirstChild( table, 'TBODY' ) ; 
     203 
     204                        var previousFirstRow = tbody.firstChild ; 
     205                        while ( tHead.firstChild )  
     206                        { 
     207                                var theRow = tHead.firstChild ; 
     208                                for (var i = 0; i < theRow.childNodes.length ; i++ )  
     209                                { 
     210                                        var newCell = RenameNode( theRow.childNodes[i], 'TD' ) ; 
     211                                        if ( newCell != null )  
     212                                                newCell.removeAttribute( 'scope' ) ; 
     213                                } 
     214                                tbody.insertBefore( theRow, previousFirstRow ) ; 
     215                        } 
     216                        table.removeChild( tHead ) ; 
     217                } 
     218 
     219                // Should we make all first cells in a row TH? 
     220                if ( (!hasColumnHeaders)  && (headers=='col' || headers=='both') ) 
     221                { 
     222                        for( var row=0 ; row < table.rows.length ; row++ ) 
     223                        { 
     224                                var newCell = RenameNode(table.rows[row].cells[0], 'TH') ; 
     225                                if ( newCell != null )  
     226                                        newCell.scope = 'row' ; 
     227                        } 
     228                } 
     229 
     230                // Should we make all first TH-cells in a row make TD? If 'yes' we do it the other way round :-) 
     231                if ( (hasColumnHeaders)  && !(headers=='col' || headers=='both') ) 
     232                { 
     233                        for( var row=0 ; row < table.rows.length ; row++ ) 
     234                        { 
     235                                var oRow = table.rows[row] ; 
     236                                if ( oRow.parentNode.nodeName == 'TBODY' ) 
     237                                { 
     238                                        var newCell = RenameNode(oRow.cells[0], 'TD') ; 
     239                                        if (newCell != null)  
     240                                                newCell.removeAttribute( 'scope' ) ; 
     241                                } 
     242                        } 
     243                } 
     244        } 
     245 
    148246        if (! bExists) 
    149247        { 
    150                 var iRows = document.getElementById('txtRows').value ; 
    151                 var iCols = document.getElementById('txtColumns').value ; 
    152  
    153                 for ( var r = 0 ; r < iRows ; r++ ) 
    154                 { 
     248                var iRows = GetE('txtRows').value ; 
     249                var iCols = GetE('txtColumns').value ; 
     250 
     251                var startRow = 0 ; 
     252                // Should we make a <thead> ? 
     253                if (headers=='row' || headers=='both') 
     254                { 
     255                        startRow++ ; 
     256                        var oThead = table.createTHead() ; 
    155257                        var oRow = table.insertRow(-1) ; 
     258                        oThead.appendChild(oRow); 
     259                         
    156260                        for ( var c = 0 ; c < iCols ; c++ ) 
    157261                        { 
    158                                 var oCell = oRow.insertCell(-1) ; 
     262                                var oThcell = oDoc.createElement( 'TH' ) ;  
     263                                oThcell.scope = 'col' ; 
     264                                oRow.appendChild( oThcell ) ; 
     265                                if ( oEditor.FCKBrowserInfo.IsGeckoLike ) 
     266                                        oEditor.FCKTools.AppendBogusBr( oThcell ) ; 
     267                        } 
     268                } 
     269 
     270                // Opera automatically creates a tbody when a thead has been added 
     271                var oTbody = FCKDomTools.GetFirstChild( table, 'TBODY' ) ; 
     272                if ( !oTbody ) 
     273                { 
     274                        // make TBODY if it doesn't exist 
     275                        oTbody = oDoc.createElement( 'TBODY' ) ;  
     276                        table.appendChild( oTbody ) ; 
     277                } 
     278                for ( var r = startRow ; r < iRows; r++ )  
     279                { 
     280                        var oRow = oDoc.createElement( 'TR' ) ; 
     281                        oTbody.appendChild(oRow) ; 
     282 
     283                        var startCol = 0 ; 
     284                        // Is the first column a header? 
     285                        if (headers=='col' || headers=='both') 
     286                        { 
     287                                var oThcell = oDoc.createElement( 'TH' ) ; 
     288                                oThcell.scope = 'row' ; 
     289                                oRow.appendChild( oThcell ) ; 
     290                                if ( oEditor.FCKBrowserInfo.IsGeckoLike ) 
     291                                        oEditor.FCKTools.AppendBogusBr( oThcell ) ; 
     292 
     293                                startCol++ ; 
     294                        } 
     295                        for ( var c = startCol ; c < iCols ; c++ ) 
     296                        { 
     297                                // IE will leave the TH at the end of the row if we use now oRow.insertCell(-1)  
     298                                var oCell = oDoc.createElement( 'TD' ) ; 
     299                                oRow.appendChild( oCell ) ; 
    159300                                if ( oEditor.FCKBrowserInfo.IsGeckoLike ) 
    160301                                        oEditor.FCKTools.AppendBogusBr( oCell ) ; 
     
    179320                                        <tr> 
    180321                                                <td valign="top"> 
    181                                                         <table cellspacing="0" cellpadding="0" border="0"> 
     322                                                        <table cellspacing="1" cellpadding="0" border="0"> 
    182323                                                                <tr> 
    183324                                                                        <td> 
     
    195336                                                                </tr> 
    196337                                                                <tr> 
    197                                                                         <td> 
    198                                                                                 &nbsp;</td> 
    199                                                                         <td> 
    200                                                                                 &nbsp;</td> 
     338                                                                        <td><span fcklang="DlgTableHeaders">Headers</span>:</td> 
     339                                                                        <td> 
     340                                                                                &nbsp;<select id="selHeaders"> 
     341                                                                                        <option fcklang="DlgTableHeadersNone" value="">None</option> 
     342                                                                                        <option fcklang="DlgTableHeadersRow" value="row">First row</option> 
     343                                                                                        <option fcklang="DlgTableHeadersColumn" value="col">First column</option> 
     344                                                                                        <option fcklang="DlgTableHeadersBoth" value="both">Both</option> 
     345                                                                                </select> 
     346                                                                        </td> 
    201347                                                                </tr> 
    202348                                                                <tr> 
     
    245391                                                                </tr> 
    246392                                                                <tr> 
    247                                                                         <td> 
    248                                                                                 &nbsp;</td> 
    249                                                                         <td> 
    250                                                                                 &nbsp;</td> 
    251                                                                         <td> 
    252                                                                                 &nbsp;</td> 
     393                                                                        <td colspan="3">&nbsp;</td> 
    253394                                                                </tr> 
    254395                                                                <tr> 
  • FCKeditor/trunk/editor/lang/af.js

    r2222 r2362  
    309309DlgTableCaption         : "Beskreiwing", 
    310310DlgTableSummary         : "Opsomming", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/ar.js

    r2222 r2362  
    309309DlgTableCaption         : "الوصف", 
    310310DlgTableSummary         : "الخلاصة", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/bg.js

    r2222 r2362  
    309309DlgTableCaption         : "Заглавие", 
    310310DlgTableSummary         : "Резюме", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/bn.js

    r2222 r2362  
    309309DlgTableCaption         : "শীর্ষক", 
    310310DlgTableSummary         : "সারাংশ", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/bs.js

    r2222 r2362  
    309309DlgTableCaption         : "Naslov", 
    310310DlgTableSummary         : "Summary",    //MISSING 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/ca.js

    r2315 r2362  
    309309DlgTableCaption         : "Títol", 
    310310DlgTableSummary         : "Resum", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/cs.js

    r2316 r2362  
    309309DlgTableCaption         : "Popis", 
    310310DlgTableSummary         : "Souhrn", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/da.js

    r2222 r2362  
    309309DlgTableCaption         : "Titel", 
    310310DlgTableSummary         : "Resume", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/de.js

    r2307 r2362  
    309309DlgTableCaption         : "Überschrift", 
    310310DlgTableSummary         : "Inhaltsübersicht", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/el.js

    r2222 r2362  
    309309DlgTableCaption         : "Υπέρτιτλος", 
    310310DlgTableSummary         : "Περίληψη", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/en-au.js

    r2327 r2362  
    309309DlgTableCaption         : "Caption", 
    310310DlgTableSummary         : "Summary", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/en-ca.js

    r2327 r2362  
    309309DlgTableCaption         : "Caption", 
    310310DlgTableSummary         : "Summary", 
     311DlgTableHeaders         : "Headers",    //MISSING 
     312DlgTableHeadersNone             : "None",       //MISSING 
     313DlgTableHeadersColumn   : "First column",       //MISSING 
     314DlgTableHeadersRow              : "First Row",  //MISSING 
     315DlgTableHeadersBoth             : "Both",       //MISSING 
    311316 
    312317// Table Cell Dialog 
  • FCKeditor/trunk/editor/lang/en.js

    r2209 r2362  
    309309DlgTableCaption         : "Caption", 
    310310DlgTableSummary         : "Summary", 
     311DlgTableHeaders         : "Headers", 
     312DlgTableHeadersNone             : "None", 
     313DlgTableHeadersColumn   : "First column", 
     314DlgTableHeadersRow              : "First Row", 
     315DlgTableHeadersBoth             : "Both",