Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dijit._editor.selection"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dijit._editor.selection"] = true;
dojo.provide("dijit._editor.selection");

// FIXME:
//              all of these methods branch internally for IE. This is probably
//              sub-optimal in terms of runtime performance. We should investigate the
//              size difference for differentiating at definition time.

dojo.mixin(dijit._editor.selection, {
        getType: function(){
                // summary: Get the selection type (like document.select.type in IE).
                if(dojo.doc["selection"]){ //IE
                        return dojo.doc.selection.type.toLowerCase();
                }else{
                        var stype = "text";

                        // Check if the actual selection is a CONTROL (IMG, TABLE, HR, etc...).
                        var oSel;
                        try{
                                oSel = dojo.global.getSelection();
                        }catch(e){ /*squelch*/ }

                        if(oSel && oSel.rangeCount==1){
                                var oRange = oSel.getRangeAt(0);
                                if(     (oRange.startContainer == oRange.endContainer) &&
                                        ((oRange.endOffset - oRange.startOffset) == 1) &&
                                        (oRange.startContainer.nodeType != 3 /* text node*/)
                                ){
                                        stype = "control";
                                }
                        }
                        return stype;
                }
        },

        getSelectedText: function(){
                // summary:
                //              Return the text (no html tags) included in the current selection or null if no text is selected
                if(dojo.doc["selection"]){ //IE
                        if(dijit._editor.selection.getType() == 'control'){
                                return null;
                        }
                        return dojo.doc.selection.createRange().text;
                }else{
                        var selection = dojo.global.getSelection();
                        if(selection){
                                return selection.toString();
                        }
                }
        },

        getSelectedHtml: function(){
                // summary:
                //              Return the html of the current selection or null if unavailable
                if(dojo.doc["selection"]){ //IE
                        if(dijit._editor.selection.getType() == 'control'){
                                return null;
                        }
                        return dojo.doc.selection.createRange().htmlText;
                }else{
                        var selection = dojo.global.getSelection();
                        if(selection && selection.rangeCount){
                                var frag = selection.getRangeAt(0).cloneContents();
                                var div = document.createElement("div");
                                div.appendChild(frag);
                                return div.innerHTML;
                        }
                        return null;
                }
        },

        getSelectedElement: function(){
                // summary:
                //              Retrieves the selected element (if any), just in the case that
                //              a single element (object like and image or a table) is
                //              selected.
                if(this.getType() == "control"){
                        if(dojo.doc["selection"]){ //IE
                                var range = dojo.doc.selection.createRange();
                                if(range && range.item){
                                        return dojo.doc.selection.createRange().item(0);
                                }
                        }else{
                                var selection = dojo.global.getSelection();
                                return selection.anchorNode.childNodes[ selection.anchorOffset ];
                        }
                }
        },

        getParentElement: function(){
                // summary:
                //              Get the parent element of the current selection
                if(this.getType() == "control"){
                        var p = this.getSelectedElement();
                        if(p){ return p.parentNode; }
                }else{
                        if(dojo.doc["selection"]){ //IE
                                return dojo.doc.selection.createRange().parentElement();
                        }else{
                                var selection = dojo.global.getSelection();
                                if(selection){
                                        var node = selection.anchorNode;

                                        while(node && (node.nodeType != 1)){ // not an element
                                                node = node.parentNode;
                                        }

                                        return node;
                                }
                        }
                }
        },

        hasAncestorElement: function(/*String*/tagName /* ... */){
                // summary:
                //              Check whether current selection has a  parent element which is
                //              of type tagName (or one of the other specified tagName)
                return (this.getAncestorElement.apply(this, arguments) != null);
        },

        getAncestorElement: function(/*String*/tagName /* ... */){
                // summary:
                //              Return the parent element of the current selection which is of
                //              type tagName (or one of the other specified tagName)

                var node = this.getSelectedElement() || this.getParentElement();
                return this.getParentOfType(node, arguments);
        },

        isTag: function(/*DomNode*/node, /*Array*/tags){
                if(node && node.tagName){
                        var _nlc = node.tagName.toLowerCase();
                        for(var i=0; i<tags.length; i++){
                                var _tlc = String(tags[i]).toLowerCase();
                                if(_nlc == _tlc){
                                        return _tlc;
                                }
                        }
                }
                return "";
        },

        getParentOfType: function(/*DomNode*/node, /*Array*/tags){
                while(node){
                        if(this.isTag(node, tags).length){
                                return node;
                        }
                        node = node.parentNode;
                }
                return null;
        },

        remove: function(){
                // summary: delete current selection
                var _s = dojo.doc.selection;
                if(_s){ //IE
                        if(_s.type.toLowerCase() != "none"){
                                _s.clear();
                        }
                        return _s;
                }else{
                        _s = dojo.global.getSelection();
                        _s.deleteFromDocument();
                        return _s;
                }
        },

        selectElementChildren: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
                // summary:
                //              clear previous selection and select the content of the node
                //              (excluding the node itself)
                var _window = dojo.global;
                var _document = dojo.doc;
                element = dojo.byId(element);
                if(_document.selection && dojo.body().createTextRange){ // IE
                        var range = element.ownerDocument.body.createTextRange();
                        range.moveToElementText(element);
                        if(!nochangefocus){
                                range.select();
                        }
                }else if(_window["getSelection"]){
                        var selection = _window.getSelection();
                        if(selection["setBaseAndExtent"]){ // Safari
                                selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
                        }else if(selection["selectAllChildren"]){ // Mozilla
                                selection.selectAllChildren(element);
                        }
                }
        },

        selectElement: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
                // summary:
                //              clear previous selection and select element (including all its children)
                var _document = dojo.doc;
                element = dojo.byId(element);
                if(_document.selection && dojo.body().createTextRange){ // IE
                        try{
                                var range = dojo.body().createControlRange();
                                range.addElement(element);
                                if(!nochangefocus){
                                        range.select();
                                }
                        }catch(e){
                                this.selectElementChildren(element,nochangefocus);
                        }
                }else if(dojo.global["getSelection"]){
                        var selection = dojo.global.getSelection();
                        // FIXME: does this work on Safari?
                        if(selection["removeAllRanges"]){ // Mozilla
                                var range = _document.createRange() ;
                                range.selectNode(element) ;
                                selection.removeAllRanges() ;
                                selection.addRange(range) ;
                        }
                }
        }
});

}