Changeset 1795


Ignore:
Timestamp:
03/25/2008 11:24:02 AM (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