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"]){ //IEreturn 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 selectedif(dojo.doc["selection"]){ //IEif(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 unavailableif(dojo.doc["selection"]){ //IEif(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"]){ //IEvar 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 selectionif(this.getType() == "control"){var p = this.getSelectedElement();if(p){ return p.parentNode; }}else{if(dojo.doc["selection"]){ //IEreturn dojo.doc.selection.createRange().parentElement();}else{var selection = dojo.global.getSelection();if(selection){var node = selection.anchorNode;while(node && (node.nodeType != 1)){ // not an elementnode = 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 selectionvar _s = dojo.doc.selection;if(_s){ //IEif(_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){ // IEvar range = element.ownerDocument.body.createTextRange();range.moveToElementText(element);if(!nochangefocus){range.select();}}else if(_window["getSelection"]){var selection = _window.getSelection();if(selection["setBaseAndExtent"]){ // Safariselection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);}else if(selection["selectAllChildren"]){ // Mozillaselection.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){ // IEtry{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"]){ // Mozillavar range = _document.createRange() ;range.selectNode(element) ;selection.removeAllRanges() ;selection.addRange(range) ;}}}});}