selectionStart,selectionEnd));
selectionStart,selectionEnd, newStart,newEnd));
	public void select(int start, int end)	{		int newStart, newEnd;		boolean newBias;		if(start <= end)		{			newStart = start;			newEnd = end;			newBias = false;		}		else		{			newStart = end;			newEnd = start;			newBias = true;		}		if(newStart < 0 || newEnd > getDocumentLength())		{			throw new IllegalArgumentException("Bounds out of"				+ " range: " + newStart + "," +				newEnd);		}		// If the new position is the same as the old, we don't		// do all this crap, however we still do the stuff at		// the end (clearing magic position, scrolling)		if(newStart != selectionStart || newEnd != selectionEnd			|| newBias != biasLeft)		{			updateBracketHighlight(end);			int newStartLine = getLineOfOffset(newStart);			int newEndLine = getLineOfOffset(newEnd);			painter.invalidateLineRange(selectionStartLine,selectionEndLine);			painter.invalidateLineRange(newStartLine,newEndLine);			document.addUndoableEdit(new CaretUndo(				selectionStart,selectionEnd));			selectionStart = newStart;			selectionEnd = newEnd;			selectionStartLine = newStartLine;			selectionEndLine = newEndLine;			biasLeft = newBias;			fireCaretEvent();		}		// When the user is typing, etc, we don't want the caret		// to blink		blink = true;		caretTimer.restart();		// Disable rectangle select if selection start = selection end		if(selectionStart == selectionEnd)			rectSelect = false;		// Clear the `magic' caret position used by up/down		magicCaret = -1;		scrollToCaret();	}