std::string TextDomArea::getHighlightedStringInternal(UInt32 lesserLine,UInt32 lesserIndex,UInt32 greaterLine,UInt32 greaterIndex)
{
	std::string firstLine="";
	std::string lastLine="";
	std::string intermediateLines="";
	PlainDocumentLeafElementRefPtr temp1 = dynamic_cast<PlainDocumentLeafElement*>(getLayoutManager()->getRootElement()->getElement(lesserLine));
	std::string temp2 = temp1->getText();
	if(lesserLine== greaterLine)
	{
		return temp2.substr(lesserIndex,greaterIndex-lesserIndex);
	}
	else
	{
		// get the first line 
		firstLine = temp2.substr(lesserIndex);

		// get the last line
		temp1 = dynamic_cast<PlainDocumentLeafElement*>(getLayoutManager()->getRootElement()->getElement(greaterLine));
		temp2 = temp1->getText();
		lastLine = temp2.substr(0,greaterIndex);
	}

	for(UInt32 i=lesserLine+1;i<greaterLine;i++)
	{
		PlainDocumentLeafElementRefPtr theElement = dynamic_cast<PlainDocumentLeafElement*>(getLayoutManager()->getRootElement()->getElement(i));
		intermediateLines+=theElement->getText();
	}

	return firstLine + intermediateLines + lastLine;
}
void FixedHeightLayoutManager::moveCaretEnd(bool isControlPressed)
{
	PlainDocumentLeafElementRefPtr theElement;

	if(isControlPressed)
	{
		_CaretLine = rootElement->getElementCount()-1;
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
		_CaretIndex = theElement->getTextLength()-2;
		getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getDocumentModel()->getEndPosition()-2);
		recalculateCaretPositions();
	}
	else
	{
		UInt32 prevIndex = _CaretIndex;
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
		_CaretIndex = theElement->getTextLength()-2;
		if(_CaretIndex<0)
		{
			SWARNING << "_CaretIndex < 0 .. Setting it to 0"<<std::endl;
			_CaretIndex = 0;
		}
		if(_CaretIndex>prevIndex)
			recalculateCaretPositions();
		getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()+ (_CaretIndex - prevIndex));
	}
}
void FixedHeightLayoutManager::moveCaretLeft(void)
{
	PlainDocumentLeafElementRefPtr theElement; 
	if(_CaretIndex>0)
	{
		// set caret line
		// set caret index

		_CaretIndex--;
		// set caret x,y position
		recalculateCaretPositions();
		// set the caret position wrt DOM
		getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()-1);
	}
	else
	{
		if(_CaretLine>0)
		{
			_CaretLine--;
			theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
			_CaretIndex = theElement->getTextLength()-2;
			if(_CaretIndex<0)_CaretIndex = 0;
			recalculateCaretPositions();
			getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()-2);
		}
	}
}
void TextDomArea::drawHighlightBGInternal(Graphics * const TheGraphics, Real32 Opacity,UInt32 lesserLine,UInt32 lesserIndex,UInt32 greaterLine,UInt32 greaterIndex) const
{
	for(UInt32 i=lesserLine+1;i<greaterLine;i++)
	{
		PlainDocumentLeafElementRefPtr theElement = dynamic_cast<PlainDocumentLeafElement*>(getLayoutManager()->getRootElement()->getElement(i));
		
		if(theElement)
		{
			Pnt2f topLeft,bottomRight;
			getFont()->getBounds(theElement->getText(),topLeft,bottomRight);

			TheGraphics->drawRect(Pnt2f(getLayoutManager()->getGutterSpace() + getLayoutManager()->getGutterSeparation(),i*getLayoutManager()->getHeightOfLine()),Pnt2f(getLayoutManager()->getGutterSpace() + getLayoutManager()->getGutterSeparation()+ bottomRight.x(),(i+1)*getLayoutManager()->getHeightOfLine()),Color4f(0.7,0.7,0.95,1),Opacity);
		}
	}

	if(lesserLine== greaterLine)
	{
		TheGraphics->drawRect(getLayoutManager()->getXYPosition(lesserLine,lesserIndex,true),getLayoutManager()->getXYPosition(greaterLine,greaterIndex,false),Color4f(0.7,0.7,0.95,1),Opacity);
	}
	else
	{
		// draw the first line
		TheGraphics->drawRect(getLayoutManager()->getXYPosition(lesserLine,lesserIndex,true),getLayoutManager()->getEndXYPosition(lesserLine),Color4f(0.7,0.7,0.95,1),Opacity);

		// draw the last line
		TheGraphics->drawRect(getLayoutManager()->getStartXYPosition(greaterLine),getLayoutManager()->getXYPosition(greaterLine,greaterIndex,false),Color4f(0.7,0.7,0.95,1),Opacity);
	}

}
bool FixedHeightLayoutManager::isLastCharacterOfDocument() const
{
	if(_CaretLine == rootElement->getElementCount()-1)
	{
		PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
		if(_CaretIndex >= temp->getTextLength()-2) return true;
	}
	return  false;
}
UInt32 FixedHeightLayoutManager::getNumberOfLeadingSpaces(UInt32 line)
{
	if(line>=rootElement->getElementCount())return 0;
	UInt32 count = 0;
	PlainDocumentLeafElementRefPtr theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(line));
	std::string theString = theElement->getText();
	
	for(UInt32 i=0;i<theString.size(),theString[i]==' ';i++)count++;
	
	return count;
}
void FixedHeightLayoutManager::recalculateCaretPositions(void)
{
	// this function assumes that the caret index and line values are valid and computes the caret x and y positions directly
	_CaretYPosition = /*getParentTextDomArea()->getPosition().y() + */_CaretLine * heightOfLine;
	PlainDocumentLeafElementRefPtr theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
	Pnt2f topLeft,bottomRight;
	std::string theSubstring = theElement->getText();
	theSubstring = theSubstring.substr(0,_CaretIndex);
	getParentTextDomArea()->getFont()->getBounds(theSubstring,topLeft,bottomRight);
	_CaretXPosition = _GutterSpace + _GutterSeparation + bottomRight.x();
}
void FixedHeightLayoutManager::selectAll(void)
{
	HSL = 0;
	HSI = 0;
	HEL = rootElement->getElementCount()-1;
	PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(HEL));
	HEI = temp->getTextLength()-2;

	_CaretLine = HEL;
	_CaretIndex = HEI;
	
	recalculateCaretPositions();
}
Pnt2f FixedHeightLayoutManager::getEndXYPosition(UInt32 lineNumber) const
{
	PlainDocumentLeafElementRefPtr theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(lineNumber));
	if(theElement)
	{
		Pnt2f topLeft,bottomRight;
		getParentTextDomArea()->getFont()->getBounds(theElement->getText(),topLeft,bottomRight);
		return Pnt2f(_GutterSpace + _GutterSeparation + bottomRight.x(),(lineNumber+1)*heightOfLine);
	}
	else
	{
		return Pnt2f(0,0);
	}
}
UInt32 FixedHeightLayoutManager::CaretLineAndIndexToCaretOffsetInDOM(UInt32 CaretLine,UInt32 CaretIndex)
{
	UInt32 offset = 0;
	if(rootElement)
	{
		for(UInt32 i=0;i<CaretLine;i++)
		{
			PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(i));
			offset += temp->getTextLength();
		}
		offset += CaretIndex;
	}
	return offset;
}
void FixedHeightLayoutManager::DoIfLineLongerThanPreferredSize() const
{
	PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));

	Pnt2f topLeft,bottomRight;
	getParentTextDomArea()->getFont()->getBounds(temp->getText(),topLeft,bottomRight);
	
	Vec2f preferredSize = getParentTextDomArea()->getPreferredSize(); 

	if(bottomRight.x() > preferredSize.x())preferredSize.setValues(bottomRight.x(),preferredSize.y());
	
	getParentTextDomArea()->setPreferredSize(preferredSize);

}
char FixedHeightLayoutManager::getNextCharacter(UInt32 _theOriginalCaretIndex,UInt32 _theOriginalCaretLine)
{
	PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_theOriginalCaretLine));
	if(temp->getTextLength()-2 == _theOriginalCaretIndex)
	{
		temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_theOriginalCaretLine+1));
		std::string tempstring = temp->getText();
		return tempstring[0];
	}
	else
	{
		std::string tempstring = temp->getText();
		return tempstring[_theOriginalCaretIndex];
	}
	
}
void FixedHeightLayoutManager::doubleClickHandler(void)
{
	UInt32 initIndex = _CaretIndex;
	PlainDocumentLeafElementRefPtr theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
	std::string theString = theElement->getText();

	Int32 BeginWord = 0;
	Int32 EndWord = theElement->getTextLength();

	if(isPunctuationChar(theString[_CaretIndex]))
	{
		EndWord = _CaretIndex + 1;
		BeginWord = _CaretIndex;
	}
	else
	{
		for(Int32 i = _CaretIndex; i < theElement->getTextLength(); i++)
		{
			if(!isWordChar(theString[i]))
			{
				EndWord = i;
				break;
			}
		}
		for(Int32 i = _CaretIndex; i >= 0; i--)
		{
			if(!isWordChar(theString[i]))
			{
				BeginWord = i + 1;
				break;
			}
		}
	}

	HEL = HSL = _CaretLine;
	HSI = BeginWord;
	HEI = EndWord;

	_CaretIndex = EndWord;

	recalculateCaretPositions();

	getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()+ (EndWord - initIndex));

}
Real32 FixedHeightLayoutManager::calculateWidthOfLongestLine(Element* const rootElement) const
{
	Real32 finalWidth=0.0;
	Real32 currentWidth;

	for(UInt32 i=0;i<rootElement->getElementCount();i++)
	{
		PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(i));

		Pnt2f TopLeft, BottomRight;
		getParentTextDomArea()->getFont()->getBounds(temp->getText(), TopLeft, BottomRight);
		
		currentWidth = BottomRight.x() - TopLeft.x();

		if(currentWidth > finalWidth)finalWidth = currentWidth;
	}
	return finalWidth + 15.0;
}
void FixedHeightLayoutManager::moveCaretDown(void)
{
	PlainDocumentLeafElementRefPtr theElement;
	if(_CaretLine < rootElement->getElementCount()-1)
	{
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
		UInt32 prevIndex = _CaretIndex;
		UInt32 prevLineLength = theElement->getTextLength();
		_CaretLine++;
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
		if(_CaretIndex> theElement->getTextLength()-2)_CaretIndex = theElement->getTextLength()-2;
		if(_CaretIndex<0)_CaretIndex=0;
		recalculateCaretPositions();
		UInt32 charactersToBeForwarded=0;
		charactersToBeForwarded += _CaretIndex;
		charactersToBeForwarded += (prevLineLength - prevIndex);
		getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()+charactersToBeForwarded);
	}
}
bool FixedHeightLayoutManager::isLastCharacterOfLine(UInt32 _theOriginalCaretIndex,UInt32 _theOriginalCaretLine)
{
	if(rootElement)
	{
		PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_theOriginalCaretLine));
		if(temp->getTextLength()-2 == _theOriginalCaretIndex)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else 
	{
		return true;
	}
}
void FixedHeightLayoutManager::moveCaretUp(void)
{
	PlainDocumentLeafElementRefPtr theElement;
	
	if(_CaretLine > 0) 
	{
		UInt32 prevIndex = _CaretIndex;
		UInt32 prevLine = _CaretLine;
		_CaretLine--;
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
		if(_CaretIndex> theElement->getTextLength()-2)_CaretIndex = theElement->getTextLength()-2;
		if(_CaretIndex<0)_CaretIndex=0;
		recalculateCaretPositions();
		UInt32 charactersToBeRewinded=0;
		charactersToBeRewinded += prevIndex;
		charactersToBeRewinded += (theElement->getTextLength() - _CaretIndex);
		getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()-charactersToBeRewinded);
	}
}
Pnt2f FixedHeightLayoutManager::getXYPosition(UInt32 lineNumber,UInt32 index,bool isBeginning) const
{
	PlainDocumentLeafElementRefPtr theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(lineNumber));
	if(theElement)
	{
		std::string substring = theElement->getText();
		substring = substring.substr(0,index);

		Pnt2f topLeft,bottomRight;
		getParentTextDomArea()->getFont()->getBounds(substring,topLeft,bottomRight);

		if(isBeginning)return Pnt2f( _GutterSpace + _GutterSeparation + bottomRight.x(),lineNumber*heightOfLine);
		return Pnt2f(_GutterSpace + _GutterSeparation + bottomRight.x(),(lineNumber+1)*heightOfLine);
	}
	else
	{
		return Pnt2f(0,0);
	}

}
void FixedHeightLayoutManager::moveCaretRight(void)
{
	PlainDocumentLeafElementRefPtr theElement; 
	theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
	if(_CaretIndex>=theElement->getTextLength()-2) 
	{
		if(_CaretLine<rootElement->getElementCount()-1)
		{
			_CaretLine++;
			_CaretIndex = 0;
			recalculateCaretPositions();
			getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()+2);
		}
	}
	else 
	{
		_CaretIndex++;
		recalculateCaretPositions();
		getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()+1);
	}
}
void FixedHeightLayoutManager::populateCache(void)
{
	// cache exists only when the word wrap is enabled
	if(getParentTextDomArea()->getWrapStyleWord()) 
	{
		linesToElements.clear();

		if(getParentTextDomArea()->getDocumentModel())
		{
			ElementRefPtr defaultRoot=getParentTextDomArea()->getDocumentModel()->getDefaultRootElement();
			if(defaultRoot)
			{
				PlainDocumentBranchElementRefPtr rootElement = dynamic_pointer_cast<PlainDocumentBranchElement>(defaultRoot);

				Pnt2f init = getParentTextDomArea()->getPosition();
				Vec2f dimensions = getParentTextDomArea()->getPreferredSize();
				
			
				for(UInt32 i=0;i<rootElement->getElementCount();i++)
				{
					//GlyphViewRefPtr view = GlyphView::create();
					PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(i));
					//view->setElement(ElementRefPtr(temp));
					UInt32 noOfCharacters= temp->getTextLength();

					/* to be edited............
					Real32 totalLengthOfAllCharacters = noOfCharacters * widthOfCharacter;
					UInt32 noOfLines = UInt32(ceil(totalLengthOfAllCharacters / dimensions.x()));

					for(UInt32 j=0;j<noOfLines;j++)
						linesToElements.push_back(i);
					*/
				}
			}
		}

	}
}
void TextDomArea::drawBraceHighlight(Graphics * const TheGraphics, Real32 Opacity) const
{
	if(getLayoutManager()->getBracesHighlightFlag())
	{
		if(getLayoutManager()->getStartingBraceLine() != -1 && getLayoutManager()->getStartingBraceIndex() != -1)
		{
			Pnt2f thePosition = getLayoutManager()->getXYPosition(getLayoutManager()->getStartingBraceLine(),getLayoutManager()->getStartingBraceIndex(),true);
			TheGraphics->drawRect(thePosition,Pnt2f(thePosition.x()+5,thePosition.y()+getLayoutManager()->getHeightOfLine()),Color4f(0.7,0.7,0.0,1.0),Opacity);
		}
		if(getLayoutManager()->getEndingBraceLine() != -1 && getLayoutManager()->getEndingBraceIndex() != -1)
		{
			if(getLayoutManager()->getEndingBraceLine()<getLayoutManager()->getRootElement()->getElementCount())
			{
				PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(getLayoutManager()->getRootElement()->getElement(getLayoutManager()->getEndingBraceLine()));
				if(getLayoutManager()->getEndingBraceIndex() < temp->getTextLength())
				{
					Pnt2f thePosition = getLayoutManager()->getXYPosition(getLayoutManager()->getEndingBraceLine(),getLayoutManager()->getEndingBraceIndex(),true);
					TheGraphics->drawRect(thePosition,Pnt2f(thePosition.x()+5,thePosition.y()+getLayoutManager()->getHeightOfLine()),Color4f(0.7,0.7,0.0,1.0),Opacity);
				}
			}
		}
	}
}
bool PlainTextFileType::write(Document* const Doc, std::ostream &OutputStream,
                    const std::string& FileNameOrExtension)
{
    PlainDocumentRefPtr TheDocument = dynamic_cast<PlainDocument*>(Doc);
    std::vector<Element*> GenericRoots;
    GenericRoots = TheDocument->getRootElements();
    for(UInt32 i=0;i<GenericRoots.size();i++)
    {
        PlainDocumentBranchElementRefPtr RootElement;
        RootElement = dynamic_cast<PlainDocumentBranchElement*>(GenericRoots[i]);    
        
        for(UInt32 j=0;j<RootElement->getElementCount()-1;j++)
        {    
            PlainDocumentLeafElementRefPtr LeafElement;
            LeafElement = dynamic_cast<PlainDocumentLeafElement*>(RootElement->getElement(j));
            OutputStream<<LeafElement->getText();
        }
        PlainDocumentLeafElementRefPtr LeafElement;
        LeafElement = dynamic_cast<PlainDocumentLeafElement*>(RootElement->getElement(RootElement->getElementCount()-1));
        OutputStream<<LeafElement->getText().substr(0,LeafElement->getTextLength()-2);

    }
    return false;
}
void FixedHeightLayoutManager::moveTheCaret(UInt32 dir,bool isShiftPressed,bool isControlPressed)
{

	if(!rootElement || !rootElement->getElementCount()) return;
	UInt32 charactersToBeForwarded;
	PlainDocumentLeafElementRefPtr theElement;
	Int32 tempIndex;
	Int32 tempLine;
	switch(dir)
	{
	case LEFT:
		if(!isShiftPressed)
		{
			if(HSL != HEL || HSI != HEI) // something was highlighted before this
			{
				if(isStartLocationBeforeEndLocation())	
				{					
					_CaretLine = HSL;					// set caret position to the Highlight Starting position
					_CaretIndex = HSI;
					HEI = HSI;
					HEL = HSL;
				}
				else
				{
					_CaretLine = HEL;					// set caret position to the Highlight Ending position
					_CaretIndex = HEI;
					HSI = HEI;
					HSL = HEL;
				}
				recalculateCaretPositions();
			}
			else	// nothing was highlighted before this
			{
				if(!isControlPressed)moveCaretLeft();
				else	moveAndHighlightWord(LEFT);

				HSI = HEI = _CaretIndex;
				HSL = HEL = _CaretLine;
			}
		}
		else	// if shift is pressed
		{
			if(!isControlPressed)moveCaretLeft();
			else	moveAndHighlightWord(LEFT);

			HEI = _CaretIndex;
			HEL = _CaretLine;
		}
		break;
	case RIGHT:	
		if(!isShiftPressed)
		{
			if(HSL != HEL || HSI != HEI) // something was highlighted before this
			{
				if(isStartLocationBeforeEndLocation())	
				{					
					_CaretLine = HEL;					// set caret position to the Highlight Starting position
					_CaretIndex = HEI;
					HSI = HEI;
					HSL = HEL;
				}
				else
				{
					_CaretLine = HSL;					// set caret position to the Highlight Ending position
					_CaretIndex = HSI;
					HEI = HSI;
					HEL = HSL;
				}
				recalculateCaretPositions();
			}
			else	// nothing was highlighted before this
			{
				if(!isControlPressed)moveCaretRight();
				else	moveAndHighlightWord(RIGHT);

				HSI = HEI = _CaretIndex;
				HSL = HEL = _CaretLine;
			}
		}
		else	// if shift is pressed
		{
			if(!isControlPressed)moveCaretRight();
			else	moveAndHighlightWord(RIGHT);

			HEI = _CaretIndex;
			HEL = _CaretLine;
		}
		break;

	case UP:
		if(!isShiftPressed && !isControlPressed)
		{
			if(HSL != HEL || HSI != HEI) // something was highlighted before this
			{
				if(isStartLocationBeforeEndLocation())	
				{					
					_CaretLine = HSL;					// set caret position to the Highlight Starting position
					_CaretIndex = HSI;
					HEI = HSI;
					HEL = HSL;
				}
				else
				{
					_CaretLine = HEL;					// set caret position to the Highlight Ending position
					_CaretIndex = HEI;
					HSI = HEI;
					HSL = HEL;
				}
				moveCaretUp();
			}
			else	// nothing was highlighted before this
			{
				moveCaretUp();
				HSI = HEI = _CaretIndex;
				HSL = HEL = _CaretLine;
			}
		}
		else if(isShiftPressed && !isControlPressed)	// if shift is pressed
		{
			moveCaretUp();
			HEI = _CaretIndex;
			HEL = _CaretLine;
		}
		break;

	case DOWN:	

		if(!isShiftPressed && !isControlPressed)
		{
			if(HSL != HEL || HSI != HEI) // something was highlighted before this
			{
				if(isStartLocationBeforeEndLocation())	
				{					
					_CaretLine = HEL;					// set caret position to the Highlight Starting position
					_CaretIndex = HEI;
					HSI = HEI;
					HSL = HEL;
				}
				else
				{
					_CaretLine = HSL;					// set caret position to the Highlight Ending position
					_CaretIndex = HSI;
					HEI = HSI;
					HEL = HSL;
				}
				moveCaretDown();
			}
			else // nothing was highlighted before this
			{
				moveCaretDown();
				HSI = HEI = _CaretIndex;
				HSL = HEL = _CaretLine;
			}
		}
		else if(isShiftPressed && !isControlPressed)	// if shift is pressed
		{
			moveCaretDown();
			HEI = _CaretIndex;
			HEL = _CaretLine;
		}
		break;

	case HOME:
		moveCaretHome(isControlPressed);
		HEI = _CaretIndex;
		HEL = _CaretLine;
		if(!isShiftPressed)
		{
			HSI = HEI;
			HSL = HEL;
		}
		break;

	case HOMEOFNEXTLINE:
		
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
		 charactersToBeForwarded = theElement->getTextLength()-_CaretIndex;
		_CaretIndex = 0;
		_CaretLine++;
		recalculateCaretPositions();
		getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()+ charactersToBeForwarded);

		break;

	case END:
		moveCaretEnd(isControlPressed);
		HEI = _CaretIndex;
		HEL = _CaretLine;
		if(!isShiftPressed)
		{
			HSI = HEI;
			HSL = HEL;
		}
		break;

	case PAGEUP:
		tempIndex = _CaretIndex;
		tempLine = _CaretLine;
		tempLine -= getLinesToBeDisplayed();
		if(tempLine<0)tempLine = 0;
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(tempLine));
		if(tempIndex > theElement->getTextLength()-2)tempIndex = theElement->getTextLength()-2;

		HEI = tempIndex;
		HEL = tempLine;
		if(!isShiftPressed)
		{
			HSI = HEI;
			HSL = HEL;
		}
		_CaretLine = HEL;					// set caret position to the Highlight Ending position
		_CaretIndex = HEI;
		recalculateCaretPositions();

		break;

	case PAGEDOWN:
		tempIndex = _CaretIndex;
		tempLine = _CaretLine;
		tempLine += getLinesToBeDisplayed();
		if(tempLine>=rootElement->getElementCount())tempLine = rootElement->getElementCount()-1;
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(tempLine));
		if(tempIndex > theElement->getTextLength()-2)tempIndex = theElement->getTextLength()-2;

		HEI = tempIndex;
		HEL = tempLine;
		if(!isShiftPressed)
		{
			HSI = HEI;
			HSL = HEL;
		}
		_CaretLine = HEL;					// set caret position to the Highlight Ending position
		_CaretIndex = HEI;
		recalculateCaretPositions();

		break;
	}
	checkCaretVisibility(dir);
}
void TextDomArea::tabHandler(bool isShiftPressed)
{
	UInt32 lesserLine,greaterLine,lesserIndex;
	DocumentElementAttribute temp;
	UInt32 oldHSI = getLayoutManager()->getHSI();
	UInt32 oldHSL = getLayoutManager()->getHSL();
	UInt32 oldHEI = getLayoutManager()->getHEI();
	UInt32 oldHEL = getLayoutManager()->getHEL();

	PlainDocumentLeafElementRefPtr theElement;
	if(getLayoutManager()->getHSL() <= getLayoutManager()->getHEL())
	{
		lesserLine = getLayoutManager()->getHSL();
		lesserIndex = getLayoutManager()->getHSI();
		greaterLine = getLayoutManager()->getHEL();
	}
	else
	{
		lesserLine = getLayoutManager()->getHEL();
		lesserIndex = getLayoutManager()->getHEI();
		greaterLine = getLayoutManager()->getHSL();
	}

	UInt32 count=0;
	if(getLayoutManager()->isSomethingSelected())
	{
		if(!isShiftPressed)
		{
			for(UInt32 caretLine = lesserLine;caretLine<=greaterLine;caretLine++)
			{
				for(UInt32 i=0;i<getTabSize();i++)
				{
					//getDocumentModel()->insertCharacter(0,caretLine,' ',temp);
					insertCharacterUsingCommandManager(' ',caretLine,0);
				}
				//getLayoutManager()->DoIfLineLongerThanPreferredSize();
			}
		
		}
		else
		{
			for(UInt32 caretLine = lesserLine;caretLine<=greaterLine;caretLine++)
			{
				theElement = dynamic_cast<PlainDocumentLeafElement*>(getLayoutManager()->getRootElement()->getElement(caretLine));
				std::string theString = theElement->getText();
				Int32 i;
				for(i=0;i<theElement->getTextLength()-2,i<getTabSize();i++)
				{
					if(theString[i]!=' ')break;
					if(caretLine == getLayoutManager()->getCaretLine())getLayoutManager()->moveTheCaret(LEFT,false,false);
					if(caretLine == lesserLine)count--;
				}
				theString = theString.substr(i);
				setTextUsingCommandManager(theElement,theString);
				//theElement->setText(theString);
				
			}
			getLayoutManager()->setHSI(0);
			getLayoutManager()->setHSL(lesserLine);
			getLayoutManager()->setHEI(0);
			getLayoutManager()->setHEL(greaterLine);
		}
	}
	else
	{
		if(!isShiftPressed)
		{
			for(UInt32 i=0;i<getTabSize();i++)
			{
				//getDocumentModel()->insertCharacter(getLayoutManager()->getCaretIndex(),getLayoutManager()->getCaretLine(),' ',temp);
				insertCharacterUsingCommandManager(' ',-1,-1);
				//getLayoutManager()->moveTheCaret(RIGHT,false,false);
			}
			//getLayoutManager()->DoIfLineLongerThanPreferredSize();	
		}
		else
		{
			theElement = dynamic_cast<PlainDocumentLeafElement*>(getLayoutManager()->getRootElement()->getElement(getLayoutManager()->getCaretLine()));
			std::string theString = theElement->getText();
			Int32 i,count=0;
			Int32 initIndex = getLayoutManager()->getCaretIndex();
			for(i=getLayoutManager()->getCaretIndex()-1;i>=0,count<getTabSize();i--,count++)
			{
				if(i<0 || theString[i]!=' ')break;
				getLayoutManager()->moveTheCaret(LEFT,false,false);
			}
			theString = theString.substr(0,getLayoutManager()->getCaretIndex())+theString.substr(initIndex);
			setTextUsingCommandManager(theElement,theString);
			//theElement->setText(theString);
		}
	}
}
bool FixedHeightLayoutManager::isLastCharacter(void)
{
	PlainDocumentLeafElementRefPtr theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
	return (_CaretIndex == theElement->getTextLength()-2);
}
void FixedHeightLayoutManager::moveAndHighlightWord(UInt32 dir)
{
	Int32 prevIndex= _CaretIndex;
	Int32 prevLine= _CaretLine;
	bool fromPrevElement = false;
	PlainDocumentLeafElementRefPtr theElement; 
	std::string theString;

	switch(dir)
	{

	case LEFT:
		
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(prevLine));

		if(prevIndex == 0)
		{
			if(prevLine>0)
			{
				prevLine--;
				theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(prevLine));
				prevIndex = theElement->getTextLength()-2;
				_CaretLine = prevLine;
				_CaretIndex = prevIndex;
				fromPrevElement = true;
				getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()-2);
			}
			else break;
		}

		theString = theElement->getText();

		if(prevIndex>0 && isWordChar(theString[prevIndex-1]) == false)fromPrevElement = true;

		for(Int32 i=prevIndex-1; i>=0;)
		{
			if(isWordChar(theString[i]) != fromPrevElement) // this means that when prevIndex is 0, it would indicate the beginning of the line and hence, the ctrl action should take the cursor until a wordchar is found
			{
				_CaretLine = prevLine;
				_CaretIndex = i;	
				getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()-1);
				i--;
			}
			else
			{
				break;
			}
		}
		recalculateCaretPositions();
		break;	// case left complete.

	case RIGHT:
		
		theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(prevLine));

		if(prevIndex >=theElement->getTextLength()-2)
		{
			if(prevLine<rootElement->getElementCount()-1)
			{
				prevLine++;
				prevIndex = 0;
				_CaretLine = prevLine;
				_CaretIndex = prevIndex;
				fromPrevElement = true;
				theElement = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(prevLine));
				getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()+2);
			}
			else break;
		}

		theString = theElement->getText();

		if(isWordChar(theString[prevIndex]) == false)fromPrevElement = true;

		for(UInt32 i=prevIndex; i<theElement->getTextLength()-2;)
		{
			if(isWordChar(theString[i]) != fromPrevElement) // this means that when prevIndex is 0, it would indicate the beginning of the line and hence, the ctrl action should take the cursor until a wordchar is found
			{
				i++;
				_CaretLine = prevLine;
				_CaretIndex = i;	
				getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getCaretPosition()+1);
			}
			else
			{
				break;
			}
		}
		recalculateCaretPositions();
		break;	// Case Right complete.
	}
}
void FixedHeightLayoutManager::findBrace(char theChar,UInt32 direction)
{
	bool found = false;
	Int32 currentLine;
	
	switch(direction)
	{
		case AFTER:
		{
			currentLine = _StartingBraceLine;
			UInt32 val = 1;
			while(currentLine<rootElement->getElementCount())
			{
				PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(currentLine));
				std::string theString = temp->getText();
				if(currentLine == _StartingBraceLine)
				{
					theString = theString.substr(_StartingBraceIndex);
				}
				if(find(theString.begin(),theString.end(),theChar) == theString.end() && find(theString.begin(),theString.end(),oppositeBrace(theChar)) == theString.end())
				{
					currentLine++;
					continue;
				}
				else 
				{
					for(UInt32 i=0;i<theString.size();i++)
					{
						if(theString[i]==theChar)
						{
							val++;
						}						
						else if(theString[i]==oppositeBrace(theChar))
						{
							val--;
							if(val <= 0)
							{
								_EndingBraceIndex = (currentLine == _StartingBraceLine)?(_StartingBraceIndex+i):i;
								_EndingBraceLine = currentLine;
								return;
							}
						}
					}
				}
				currentLine++;
			}
		break;
		}
		case BEFORE:
		{
			currentLine = _EndingBraceLine;
			UInt32 val = 1;
			while(currentLine>=0)
			{
				PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(currentLine));
				std::string theString = temp->getText();
				if(currentLine == _EndingBraceLine)
				{
					theString = theString.substr(0,_EndingBraceIndex);
				}
				if(find(theString.begin(),theString.end(),theChar) == theString.end() && find(theString.begin(),theString.end(),oppositeBrace(theChar)) == theString.end())
				{
					currentLine--;
					continue;
				}
				else 
				{
					for(Int32 i=theString.size()-1;i>=0;i--)
					{
						if(theString[i]==theChar)
						{
							val++;
						}						
						else if(theString[i]==oppositeBrace(theChar))
						{
							val--;
							if(val <= 0)
							{
								_StartingBraceIndex = i;
								_StartingBraceLine = currentLine;
								return;
							}
						}
					}
				}
				currentLine--;
			}
		break;
		}
	}
}
UInt32 FixedHeightLayoutManager::calculateCaretPosition(Pnt2f PointOnComponent,bool isDragging)
{
	if(!insideGutterRegion(PointOnComponent.x()))
	{

		UInt32 pos = 0, noOfCharacters =0;
		UInt32 row = (UInt32(floor((PointOnComponent.y()/* - getParentTextDomArea()->getPosition().y() */) / heightOfLine)));

		_CaretLine = row;
		// calculating the caret line and caret y position
		_CaretYPosition = row * heightOfLine;
		
		Real32 xpos = PointOnComponent.x() - _GutterSpace - _GutterSeparation ;

		if(row>=rootElement->getElementCount())
		{
			_CaretLine = rootElement->getElementCount()-1;
			PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(_CaretLine));
			_CaretIndex = temp->getTextLength()-2;

			recalculateCaretPositions();

			HEL = _CaretLine;
			HEI = _CaretIndex;

			if(!isDragging)
			{
				HSL = HEL;
				HSI = HEI;
			}

			printDebugInformation();

			getParentTextDomArea()->setCaretPosition(getParentTextDomArea()->getDocumentModel()->getEndPosition()-2);
			return 0;	
		}
		for(UInt32 i=0;i<_CaretLine;i++)
		{
			PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(i));
			noOfCharacters= temp->getTextLength();
			pos += noOfCharacters;
		}
		PlainDocumentLeafElementRefPtr temp = dynamic_cast<PlainDocumentLeafElement*>(rootElement->getElement(row));

		noOfCharacters = 0;

		std::string temptext = temp->getText();
		Pnt2f topLeft,bottomRight;

		std::string ttemp = ""; 

		Real32 widthSoFar = 0.0;
		_CaretIndex = 0;

		for(UInt32 i=0;i<temp->getTextLength()-2;i++)
		{
			ttemp = temptext[i];
			getParentTextDomArea()->getFont()->getBounds(ttemp,topLeft,bottomRight);

			if(widthSoFar + bottomRight.x() <= xpos) 
			{
				noOfCharacters++;
				widthSoFar += bottomRight.x();
				_CaretIndex++;
			}
			else
			{
				break;
			}
			
		}

		_CaretXPosition = _GutterSpace + _GutterSeparation + widthSoFar;
		pos += noOfCharacters;

		HEL = _CaretLine;
		HEI = _CaretIndex;

		if(!isDragging)
		{
			HSL = HEL;
			HSI = HEI;
		}

		printDebugInformation();

		getParentTextDomArea()->setCaretPosition(pos);
		return pos;
	}
}