Changeset 1795


Ignore:
Timestamp:
03/25/08 11:24:02 (7 years ago)
Author:
fredck
Message:

Fixed #1990 : In IE, dialogs using API calls which deals with the selection, like InsertHtml now can be sure the selection will be placed in the correct position.

Location:
FCKeditor/trunk
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • FCKeditor/trunk/_whatsnew.html

    r1793 r1795  
    134134                        the caret will not any more move to the previous line when selecting a Format style 
    135135                        inside an empty paragraph.</li> 
     136                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1990">#1990</a>] In IE, 
     137                        dialogs using API calls which deals with the selection, like InsertHtml now can 
     138                        be sure the selection will be placed in the correct position.</li> 
    136139        </ul> 
    137140        <h3> 
  • FCKeditor/trunk/editor/_source/commandclasses/fcklistcommands.js

    r1565 r1795  
    146146                                { 
    147147                                        rangeQueue = [] ; 
    148                                         var selectionObject = FCK.EditorWindow.getSelection() ; 
     148                                        var selectionObject = FCKSelection.GetSelection() ; 
    149149                                        if ( selectionObject && listGroups.length == 0 ) 
    150150                                                rangeQueue.push( selectionObject.getRangeAt( 0 ) ) ; 
  • FCKeditor/trunk/editor/_source/internals/fck.js

    r1790 r1795  
    661661                var elementName = element.nodeName.toLowerCase() ; 
    662662 
     663                FCKSelection.Restore() ; 
     664 
    663665                // Create a range for the selection. V3 will have a new selection 
    664666                // object that may internally supply this feature. 
     
    864866                // Prevent the caret from going between the body and the padding node in Firefox. 
    865867                // i.e. <body>|<p></p></body> 
    866                 var sel = FCK.EditorWindow.getSelection() ; 
     868                var sel = FCKSelection.GetSelection() ; 
    867869                if ( sel && sel.rangeCount == 1 ) 
    868870                { 
  • FCKeditor/trunk/editor/_source/internals/fck_gecko.js

    r1741 r1795  
    8989                var moveCursor = function() 
    9090                { 
    91                         var selection = FCK.EditorWindow.getSelection() ; 
     91                        var selection = FCKSelection.GetSelection() ; 
    9292                        var range = selection.getRangeAt(0) ; 
    9393                        if ( ! range || ! range.collapsed ) 
     
    449449{ 
    450450        FCK._FillEmptyBlock( FCK.EditorDocument.body.firstChild ) ; 
    451         var sel = FCK.EditorWindow.getSelection() ; 
     451        var sel = FCKSelection.GetSelection() ; 
    452452        if ( !sel || sel.rangeCount < 1 ) 
    453453                return ; 
  • FCKeditor/trunk/editor/_source/internals/fck_ie.js

    r1587 r1795  
    9494{ 
    9595        // Don't fire the event if no document is loaded. 
    96         if ( FCK.EditorDocument ) 
     96        if ( !FCK.IsSelectionChangeLocked && FCK.EditorDocument ) 
    9797                FCK.Events.FireEvent( "OnSelectionChange" ) ; 
    9898} 
     
    156156 
    157157        // Gets the actual selection. 
    158         var oSel = FCK.EditorDocument.selection ; 
     158        var oSel = FCKSelection.GetSelection() ; 
    159159 
    160160        // Deletes the actual selection contents. 
  • FCKeditor/trunk/editor/_source/internals/fckdialog.js

    r1776 r1795  
    8686 
    8787        return { 
    88                 SelectionData : null, 
    89  
    9088                /** 
    9189                 * Opens a dialog window using the standard dialog template. 
     
    103101                                Editor : window, 
    104102                                CustomValue : customValue,              // Optional 
    105                                 SelectionData : null, 
    106103                                TopWindow : topWindow 
    107104                        } 
    108105 
    109                         var currentInstance = FCK.ToolbarSet.CurrentInstance ; 
    110  
    111                         // IE doens't support multiple selections, even if in different 
    112                         // IFRAMEs, like the dialog, so the current selection must be saved to 
    113                         // be restored in the dialog code. 
    114                         if ( FCKBrowserInfo.IsIE && !topDialog ) 
    115                         { 
    116                                 // Ensures the editor has the selection focus. (#1801) 
    117                                 currentInstance.Focus() ; 
    118  
    119                                 var editorDocument = ( currentInstance.EditMode == FCK_EDITMODE_WYSIWYG ? 
    120                                                 currentInstance.EditorDocument : 
    121                                                 FCKTools.GetElementDocument( currentInstance.EditingArea.Textarea ) ) ; 
    122                                 var selection = editorDocument.selection ; 
    123                                 var range ; 
    124  
    125                                 if ( selection ) 
    126                                 { 
    127                                         range = selection.createRange() ; 
    128  
    129                                         // Ensure that the range comes from the editor document. 
    130                                         if ( range ) 
    131                                         { 
    132                                                 if ( range.parentElement && FCKTools.GetElementDocument( range.parentElement() ) != editorDocument ) 
    133                                                         range = null ; 
    134                                                 else if ( range.item && FCKTools.GetElementDocument( range.item(0) )!= editorDocument ) 
    135                                                         range = null ; 
    136                                         } 
    137                                 } 
    138  
    139                                 this.SelectionData = range ; 
    140                         } 
     106                        FCK.ToolbarSet.CurrentInstance.Selection.Save() ; 
    141107 
    142108                        // Calculate the dialog position, centering it on the screen. 
     
    194160                        { 
    195161                                // Set the Focus in the browser, so the "OnBlur" event is not 
    196                                 // fired. In IE, there is no need to d othat because the dialog 
     162                                // fired. In IE, there is no need to do that because the dialog 
    197163                                // already moved the selection to the editing area before 
    198164                                // closing (EnsureSelection). Also, the Focus() call here 
     
    204170                                // Bug #1918: Assigning topDialog = null directly causes IE6 to crash. 
    205171                                setTimeout( function(){ topDialog = null ; }, 0 ) ; 
    206                                 this.SelectionData = null ; 
     172 
     173                                // Release the previously saved selection. 
     174                                FCK.ToolbarSet.CurrentInstance.Selection.Release() ; 
    207175                        } 
    208176                }, 
  • FCKeditor/trunk/editor/_source/internals/fckselection_gecko.js

    r1565 r1795  
    3131 
    3232        var sel ; 
    33         try { sel = FCK.EditorWindow.getSelection() ; } catch (e) {} 
     33        try { sel = this.GetSelection() ; } catch (e) {} 
    3434 
    3535        if ( sel && sel.rangeCount == 1 ) 
     
    5252FCKSelection.GetSelectedElement = function() 
    5353{ 
    54         var selection = !!FCK.EditorWindow && FCK.EditorWindow.getSelection() ; 
     54        var selection = !!FCK.EditorWindow && this.GetSelection() ; 
    5555        if ( !selection || selection.rangeCount < 1 ) 
    5656                return null ; 
     
    7373        else 
    7474        { 
    75                 var oSel = FCK.EditorWindow.getSelection() ; 
     75                var oSel = this.GetSelection() ; 
    7676                if ( oSel ) 
    7777                { 
     
    118118        else 
    119119        { 
    120                 var oSel = FCK.EditorWindow.getSelection() ; 
     120                var oSel = this.GetSelection() ; 
    121121                if ( oSel && oSel.rangeCount > 0 ) 
    122122                { 
     
    136136        oRange.selectNode( element ) ; 
    137137 
    138         var oSel = FCK.EditorWindow.getSelection() ; 
     138        var oSel = this.GetSelection() ; 
    139139        oSel.removeAllRanges() ; 
    140140        oSel.addRange( oRange ) ; 
     
    143143FCKSelection.Collapse = function( toStart ) 
    144144{ 
    145         var oSel = FCK.EditorWindow.getSelection() ; 
     145        var oSel = this.GetSelection() ; 
    146146 
    147147        if ( toStart == null || toStart === true ) 
     
    157157        if ( ! oContainer && FCK.EditorWindow ) 
    158158        { 
    159                 try             { oContainer = FCK.EditorWindow.getSelection().getRangeAt(0).startContainer ; } 
     159                try             { oContainer = this.GetSelection().getRangeAt(0).startContainer ; } 
    160160                catch(e){} 
    161161        } 
     
    177177        var oContainer = this.GetSelectedElement() ; 
    178178        if ( ! oContainer ) 
    179                 oContainer = FCK.EditorWindow.getSelection().getRangeAt(0).startContainer ; 
     179                oContainer = this.GetSelection().getRangeAt(0).startContainer ; 
    180180 
    181181        while ( oContainer ) 
     
    192192{ 
    193193        // Gets the actual selection. 
    194         var oSel = FCK.EditorWindow.getSelection() ; 
     194        var oSel = this.GetSelection() ; 
    195195 
    196196        // Deletes the actual selection contents. 
     
    202202        return oSel ; 
    203203} 
     204 
     205/** 
     206 * Returns the native selection object. 
     207 */ 
     208FCKSelection.GetSelection = function() 
     209{ 
     210        return FCK.EditorWindow.getSelection() ; 
     211} 
     212 
     213// The following are IE only features (we don't need then in other browsers 
     214// currently). 
     215FCKSelection.Save = function() 
     216{} 
     217FCKSelection.Restore = function() 
     218{} 
     219FCKSelection.Release = function() 
     220{} 
  • FCKeditor/trunk/editor/_source/internals/fckselection_ie.js

    r1565 r1795  
    2929        try 
    3030        { 
    31                 var ieType = FCK.EditorDocument.selection.type ; 
     31                var ieType = FCKSelection.GetSelection().type ; 
    3232                if ( ieType == 'Control' || ieType == 'Text' ) 
    3333                        return ieType ; 
    3434 
    35                 if ( FCK.EditorDocument.selection.createRange().parentElement ) 
     35                if ( this.GetSelection().createRange().parentElement ) 
    3636                        return 'Text' ; 
    3737        } 
     
    5050        if ( this.GetType() == 'Control' ) 
    5151        { 
    52                 var oRange = FCK.EditorDocument.selection.createRange() ; 
     52                var oRange = this.GetSelection().createRange() ; 
    5353 
    5454                if ( oRange && oRange.item ) 
    55                         return FCK.EditorDocument.selection.createRange().item(0) ; 
     55                        return this.GetSelection().createRange().item(0) ; 
    5656        } 
    5757        return null ; 
     
    7070 
    7171                default : 
    72                         return FCK.EditorDocument.selection.createRange().parentElement() ; 
     72                        return this.GetSelection().createRange().parentElement() ; 
    7373        } 
    7474} ; 
     
    102102{ 
    103103        FCK.Focus() ; 
    104         FCK.EditorDocument.selection.empty() ; 
     104        this.GetSelection().empty() ; 
    105105        var oRange ; 
    106106        try 
     
    125125        if ( this.GetType() == 'Text' ) 
    126126        { 
    127                 var oRange = FCK.EditorDocument.selection.createRange() ; 
     127                var oRange = this.GetSelection().createRange() ; 
    128128                oRange.collapse( toStart == null || toStart === true ) ; 
    129129                oRange.select() ; 
     
    136136        var oContainer ; 
    137137 
    138         if ( FCK.EditorDocument.selection.type == "Control" ) 
     138        if ( this.GetSelection().type == "Control" ) 
    139139        { 
    140140                oContainer = this.GetSelectedElement() ; 
     
    142142        else 
    143143        { 
    144                 var oRange  = FCK.EditorDocument.selection.createRange() ; 
     144                var oRange  = this.GetSelection().createRange() ; 
    145145                oContainer = oRange.parentElement() ; 
    146146        } 
     
    163163                return null ; 
    164164 
    165         if ( FCK.EditorDocument.selection.type == "Control" ) 
    166         { 
    167                 oRange = FCK.EditorDocument.selection.createRange() ; 
     165        if ( this.GetSelection().type == "Control" ) 
     166        { 
     167                oRange = this.GetSelection().createRange() ; 
    168168                for ( i = 0 ; i < oRange.length ; i++ ) 
    169169                { 
     
    177177        else 
    178178        { 
    179                 oRange  = FCK.EditorDocument.selection.createRange() ; 
     179                oRange  = this.GetSelection().createRange() ; 
    180180                oNode = oRange.parentElement() ; 
    181181        } 
     
    190190{ 
    191191        // Gets the actual selection. 
    192         var oSel = FCK.EditorDocument.selection ; 
     192        var oSel = this.GetSelection() ; 
    193193 
    194194        // Deletes the actual selection contents. 
     
    200200        return oSel ; 
    201201} ; 
     202 
     203/** 
     204 * Returns the native selection object. 
     205 */ 
     206FCKSelection.GetSelection = function() 
     207{ 
     208        this.Restore() ; 
     209        return FCK.EditorDocument.selection ; 
     210} 
     211 
     212FCKSelection.Save = function() 
     213{ 
     214        // Ensures the editor has the selection focus. (#1801) 
     215        FCK.Focus() ; 
     216 
     217        var editorDocument = FCK.EditorDocument ; 
     218         
     219        if ( !editorDocument ) 
     220                return ; 
     221 
     222        var selection = editorDocument.selection ; 
     223        var range ; 
     224 
     225        if ( selection ) 
     226        { 
     227                range = selection.createRange() ; 
     228 
     229                // Ensure that the range comes from the editor document. 
     230                if ( range ) 
     231                { 
     232                        if ( range.parentElement && FCKTools.GetElementDocument( range.parentElement() ) != editorDocument ) 
     233                                range = null ; 
     234                        else if ( range.item && FCKTools.GetElementDocument( range.item(0) )!= editorDocument ) 
     235                                range = null ; 
     236                } 
     237        } 
     238 
     239        this.SelectionData = range ; 
     240} 
     241 
     242FCKSelection.Restore = function() 
     243{ 
     244        if ( this.SelectionData ) 
     245        { 
     246                FCK.IsSelectionChangeLocked = true ; 
     247 
     248                try  
     249                { 
     250                        this.SelectionData.select() ; 
     251                } 
     252                catch ( e ) {} 
     253 
     254                FCK.IsSelectionChangeLocked = false ; 
     255        } 
     256} 
     257 
     258FCKSelection.Release = function() 
     259{ 
     260        delete this.SelectionData ;                      
     261} 
  • FCKeditor/trunk/editor/_source/internals/fcktablehandler_gecko.js

    r1565 r1795  
    2626        var aCells = new Array() ; 
    2727 
    28         var oSelection = FCK.EditorWindow.getSelection() ; 
     28        var oSelection = FCKSelection.GetSelection() ; 
    2929 
    3030        // If the selection is a text. 
  • FCKeditor/trunk/editor/_source/internals/fcktablehandler_ie.js

    r1565 r1795  
    3232        var aCells = new Array() ; 
    3333 
    34         var oRange = FCK.EditorDocument.selection.createRange() ; 
     34        var oRange = FCKSelection.GetSelection().createRange() ; 
    3535//      var oParent = oRange.parentElement() ; 
    3636        var oParent = FCKSelection.GetParentElement() ; 
  • FCKeditor/trunk/editor/_source/internals/fckundo.js

    r1565 r1795  
    3232FCKUndo._GetBookmark = function() 
    3333{ 
     34        FCKSelection.Restore() ; 
     35 
    3436        var range = new FCKDomRange( FCK.EditorWindow ) ; 
    3537        try 
  • FCKeditor/trunk/editor/dialog/common/fck_dialog_common.js

    r1792 r1795  
    281281                                oldNode = null ; 
    282282 
    283                                 if ( oEditor.FCKDialog.SelectionData ) 
     283                                if ( oEditor.FCK.Selection.SelectionData ) 
    284284                                { 
    285                                         // Trick to refresh the selection object and avoid error in fckdialog.html Selection.EnsureSelection 
     285                                        // Trick to refresh the selection object and avoid error in 
     286                                        // fckdialog.html Selection.EnsureSelection 
    286287                                        var oSel = oEditor.FCK.EditorDocument.selection ; 
    287                                         oEditor.FCKDialog.SelectionData = oSel.createRange() ; // Now oSel.type will be 'None' reflecting the real situation 
     288                                        oEditor.FCK.Selection.SelectionData = oSel.createRange() ; // Now oSel.type will be 'None' reflecting the real situation 
    288289                                } 
    289290                        } 
    290291                        oNewNode = oEditor.FCK.InsertElement( oNewNode ) ; 
    291292 
    292                         // FCKDialog.SelectionData is broken by now since we've deleted the previously selected element. 
    293                         // So we need to reassign it. 
    294                         if ( oEditor.FCKDialog.SelectionData ) 
     293                        // FCK.Selection.SelectionData is broken by now since we've 
     294                        // deleted the previously selected element. So we need to reassign it. 
     295                        if ( oEditor.FCK.Selection.SelectionData ) 
    295296                        { 
    296297                                var range = oEditor.FCK.EditorDocument.body.createControlRange() ; 
    297298                                range.add( oNewNode ) ; 
    298                                 oEditor.FCKDialog.SelectionData = range ; 
     299                                oEditor.FCK.Selection.SelectionData = range ; 
    299300                        } 
    300301                } 
  • FCKeditor/trunk/editor/dialog/fck_image/fck_image.js

    r1598 r1795  
    251251                else                    // Creating a new link. 
    252252                { 
    253                         dialog.Selection.EnsureSelection() ; 
    254  
    255253                        if ( !bHasImage ) 
    256254                                oEditor.FCKSelection.SelectNode( oImage ) ; 
  • FCKeditor/trunk/editor/dialog/fck_link/fck_link.js

    r1774 r1795  
    639639 
    640640        // Select the (first) link. 
    641         dialog.Selection.EnsureSelection() ; 
    642641        oEditor.FCKSelection.SelectNode( aLinks[0] ); 
    643642 
  • FCKeditor/trunk/editor/dialog/fck_smiley.html

    r1565 r1795  
    5050function InsertSmiley( url ) 
    5151{ 
    52         dialog.Selection.EnsureSelection() ; 
    53  
    5452        oEditor.FCKUndo.SaveUndoStep() ; 
    5553 
  • FCKeditor/trunk/editor/dialog/fck_specialchar.html

    r1565 r1795  
    4444{ 
    4545        oEditor.FCKUndo.SaveUndoStep() ; 
    46         parent.Selection.EnsureSelection() ; 
    4746        oEditor.FCK.InsertHtml( charValue || "" ) ; 
    4847        window.parent.Cancel() ; 
  • FCKeditor/trunk/editor/dialog/fck_tablecell.html

    r1565 r1795  
    3737 
    3838// Array of selected Cells 
    39 dialog.Selection.EnsureSelection() ; 
    4039var aCells = oEditor.FCKTableHandler.GetSelectedCells() ; 
    4140 
  • FCKeditor/trunk/editor/fckdialog.html

    r1777 r1795  
    376376 
    377377// Selection related functions. 
    378 var Selection = function() 
    379 { 
    380         return { 
    381                 /** 
    382                  * Ensures that the editing area contains an active selection. This is a 
    383                  * requirement for IE, as it looses the selection when the focus moves to other 
    384                  * frames. 
    385                  */ 
    386                 EnsureSelection : function() 
    387                 { 
    388                         if ( FCKDialog.SelectionData ) 
    389                         { 
    390                                 try 
    391                                 { 
    392                                         FCKDialog.SelectionData.select() ; 
    393                                 } 
    394                                 catch ( e ) {} 
    395                         } 
    396                 }, 
    397  
    398                 /** 
    399                  * Get the FCKSelection object for the editor instance. 
    400                  */ 
    401                 GetSelection : function() 
    402                 { 
    403                         this.EnsureSelection() ; 
    404                         return FCK.Selection ; 
    405                 }, 
    406  
    407                 /** 
    408                  * Get the selected element in the editing area (for object selections). 
    409                  */ 
    410                 GetSelectedElement : function() 
    411                 { 
    412                         return this.GetSelection().GetSelectedElement() ; 
    413                 } 
    414         } ; 
    415 }() ; 
     378//(Became simple shortcuts after the fix for #1990) 
     379var Selection = 
     380{ 
     381        /** 
     382         * Ensures that the editing area contains an active selection. This is a 
     383         * requirement for IE, as it looses the selection when the focus moves to other 
     384         * frames. 
     385         */ 
     386        EnsureSelection : function() 
     387        { 
     388                FCK.Selection.Restore() ; 
     389        }, 
     390 
     391        /** 
     392         * Get the FCKSelection object for the editor instance. 
     393         */ 
     394        GetSelection : function() 
     395        { 
     396                return FCK.Selection ; 
     397        }, 
     398 
     399        /** 
     400         * Get the selected element in the editing area (for object selections). 
     401         */ 
     402        GetSelectedElement : function() 
     403        { 
     404                return FCK.Selection.GetSelectedElement() ; 
     405        } 
     406} 
    416407 
    417408// Tab related functions. 
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy