InternetExplorerSelection.js
Summary
Adapts Internet Explorer's Selection object to an interface like Mozilla's.
History: The original code was written by Jorgen Horstink (http://jorgenhorstink.nl/2006/03/11/w3c-range-in-internet-explorer/).
It was extensively modified by David Kingma.
This version has been adapted for use with Mozile by James A. Overton.
Key changes include wrapping the objects in the Mozile namespace, so as to minimize the impact on other scripts in the same page.
Version: 0.8
$Id: overview-summary-InternetExplorerSelection.js.html,v 1.9 2006/08/23 23:30:17 jameso Exp $
Author: James A. Overton
mozile.require("mozile.dom");
mozile.require("mozile.xpath");
mozile.require("mozile.dom.InternetExplorerRange");
mozile.provide("mozile.dom.InternetExplorerSelection");
mozile.dom.InternetExplorerSelection = function() {
this._selection = document.selection;
this.anchorNode = null;
this.anchorOffset = null;
this.focusNode = null;
this.focusOffset = null;
this.isCollapsed = null;
this.rangeCount = 0;
this._direction = this._LTR;
this._init();
}
mozile.dom.InternetExplorerSelection.prototype._LTR = 1;
mozile.dom.InternetExplorerSelection.prototype._RTL = -1;
mozile.dom.InternetExplorerSelection.prototype._init = function(range) {
if(!range) range = this.getRangeAt(0);
if(!this._direction) this._direction = this._LTR;
if(range && range.startContainer) {
if(this._direction == this._LTR) {
this.anchorNode = range.startContainer;
this.anchorOffset = range.startOffset;
this.focusNode = range.endContainer;
this.focusOffset = range.endOffset;
}
else {
this.anchorNode = range.endContainer;
this.anchorOffset = range.endOffset;
this.focusNode = range.startContainer;
this.focusOffset = range.startOffset;
}
this.isCollapsed = range.collapsed;
}
else {
this.anchorNode = null;
this.anchorOffset = null;
this.focusNode = null;
this.focusOffset = null;
this.isCollapsed = true;
}
this.rangeCount = this._selection.createRangeCollection().length;
}
mozile.dom.InternetExplorerSelection.prototype.getRangeAt = function (index) {
var textRange = this._selection.createRangeCollection().item(index).duplicate();
var range;
if(this._lastTextRange && this._lastTextRange.isEqual(textRange)) {
range = this._lastRange;
}
else {
range = new mozile.dom.InternetExplorerRange(textRange);
range._init();
this._lastTextRange = textRange.duplicate();
this._lastRange = range;
this._direction = this._LTR;
}
return range.cloneRange();
}
mozile.dom.InternetExplorerSelection.prototype.collapse = function (parentNode, offset) {
try {
var range = this.getRangeAt(0);
range.setStart(parentNode, offset);
range.setEnd(parentNode, offset);
range.collapse(false);
this._direction = this._LTR;
this._init(range);
this._lastTextRange = range._range.duplicate();
this._lastRange = range;
range._range.select();
} catch(e) {
mozile.debug.debug("mozile.dom.InternetExplorerSelection.collapse", "Error: "+ mozile.dumpError(e));
}
}
mozile.dom.InternetExplorerSelection.prototype.extend = function (parentNode, offset) {
var range = this.getRangeAt(0);
var direction;
if(parentNode == range.startContainer &&
range.startOffset <= offset) {
direction = this._LTR;
}
else if(parentNode == range.endContainer &&
range.endOffset >= offset){
direction = this._RTL;
}
else if(parentNode == range.startContainer.parentNode &&
range.startContainer.nodeType == mozile.dom.TEXT_NODE &&
mozile.dom.getIndex(range.startContainer) <= offset) {
direction = this._LTR;
}
else if(parentNode == range.endContainer.parentNode &&
range.endContainer.nodeType == mozile.dom.TEXT_NODE &&
mozile.dom.getIndex(range.endContainer) >= offset) {
direction = this._RTL;
}
else {
var ancestor = mozile.dom.getCommonAncestor(parentNode, range.commonAncestorContainer)
var treeWalker = document.createTreeWalker(ancestor, mozile.dom.NodeFilter.SHOW_ALL, null, false);
treeWalker.currentNode = this.anchorNode;
while(treeWalker.previousNode()) {
if(treeWalker.currentNode == parentNode) {
direction = this._RTL;
break;
}
}
if(!direction) direction = this._LTR;
}
if(direction == this._LTR) range.setEnd(parentNode, offset);
else if(direction == this._RTL) range.setStart(parentNode, offset);
else return;
this._direction = direction;
this._init(range);
this._lastTextRange = range._range.duplicate();
this._lastRange = range;
range._range.select();
}
mozile.dom.InternetExplorerSelection.prototype.collapseToStart = function () {
var range = this.getRangeAt(0);
range.collapse(true);
this._init(range);
range._range.select();
}
mozile.dom.InternetExplorerSelection.prototype.collapseToEnd = function () {
var range = this.getRangeAt(0);
range.collapse();
this._init(range);
range._range.select();
}
mozile.dom.InternetExplorerSelection.prototype.selectAllChildren = function (parentNode) {
var range = this.getRangeAt(0);
range.selectNodeContents(parentNode);
this._init(range);
range._range.select();
}
mozile.dom.InternetExplorerSelection.prototype.addRange = function (range) {
this._direction = this._LTR;
this._init(range);
range._range.select();
}
mozile.dom.InternetExplorerSelection.prototype.removeRange = function (range) {
range.collapse();
this._init(range);
}
mozile.dom.InternetExplorerSelection.prototype.removeAllRanges = function () {
this._selection.empty();
this._init();
}
mozile.dom.InternetExplorerSelection.prototype.deleteFromDocument = function () {
this._selection.clear();
this._init();
}
mozile.dom.InternetExplorerSelection.prototype.selectionLanguageChange = function () {}
mozile.dom.InternetExplorerSelection.prototype.toString = function () {
var range = this.getRangeAt(0);
return range.toString();
}
mozile.dom.InternetExplorerSelection.prototype.containsNode = function (aNode, aPartlyContained) {
alert('mozile.dom.InternetExplorerSelection.containsNode() is not implemented yet');
}
mozile.dom.InternetExplorerSelection.prototype.store = mozile.dom.Selection.prototype.store;
mozile.dom.InternetExplorerSelection.prototype.restore = mozile.dom.Selection.prototype.restore;
mozile.dom.Selection.restoreSelection = function (r) {
var range = new mozile.Range();
try {
range.setStart(r.startContainer, r.startOffset);
range.setEnd(r.endContainer, r.endOffset);
} catch(e) {}
var s = new mozile.dom.Selection();
s.removeAllRanges();
s.addRange(range);
}
Documentation generated by
JSDoc on Wed Aug 23 18:45:51 2006