applayerprotocols/telnetengine/TUIEDIT/TUIEDIT.CPP
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/telnetengine/TUIEDIT/TUIEDIT.CPP	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,382 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "TUIEDIT.H"
+
+CLineEdit::CLineEdit()
+//
+// Constructor
+//
+	{
+
+//	iHistory=NULL;
+//	iConsole=NULL;
+//	iMaxHistory=0;
+//	iWidth=0;
+//	iHeight=0;
+//	iPos=0;
+//	iOrigin=0;
+//	iLine=0;
+//	iRecall=0;
+//	iBuf=NULL;
+//	iPrompt=_L("");
+	__DECLARE_NAME(_S("CLineEdit"));
+	}
+
+
+CLineEdit::~CLineEdit()
+//
+// Destroy the line editor
+//
+	{
+
+	TInt count=iHistory->Count();
+	while (count--)
+		User::Free((*iHistory)[count]);
+	delete iHistory;
+	}
+
+EXPORT_C CLineEdit* CLineEdit::NewL(CConsoleBase* aConsole,TInt aMaxHistory)
+//
+// Create a new line editor
+//
+	{
+
+	CLineEdit* pE=new(ELeave) CLineEdit;
+	pE->iHistory=new(ELeave) CArrayFixFlat<HBufC*>(aMaxHistory+2);
+	pE->iConsole=aConsole;
+	pE->iMaxHistory=aMaxHistory;
+	pE->iWidth=pE->iConsole->ScreenSize().iWidth;
+	pE->iHeight=pE->iConsole->ScreenSize().iHeight;
+	return(pE);
+	}
+
+TInt CLineEdit::Lines()
+//
+// The number of lines being edited.
+//
+    {
+
+    TInt nL=1;
+    if (Buf().Length()>=iWidth-2-iOrigin)
+		nL+=(Buf().Length()+iOrigin)/(iWidth-2);
+    return(nL);
+    }
+
+TPoint CLineEdit::Where()
+//
+// Return the real cursor position.
+//
+    {
+
+    if (iPos>=(iWidth-2-iOrigin))
+		return(TPoint((iPos+iOrigin)%(iWidth-2),((iPos+iOrigin)/(iWidth-2))+iLine));
+	return(TPoint(iPos+iOrigin,iLine));
+    }
+
+void CLineEdit::ClearLine()
+//
+// Clears the line being edited.
+//
+    {
+
+    if (Buf().Length())
+		{
+		TInt nL=Lines();
+		while (nL--)
+	    	{
+	    	iConsole->SetPos(nL ? 0 : iOrigin,iLine+nL);
+	    	iConsole->ClearToEndOfLine();
+	    	}
+		Buf().Zero();
+		iPos=0;
+		}
+    }
+
+void CLineEdit::ClearLast(TInt aCnt)
+//
+// Clears the last aCnt characters.
+//
+    {
+
+    TInt aPos=iPos;
+    iPos=((TInt)Buf().Length())-aCnt;
+    while (iPos<((TInt)Buf().Length()))
+		{
+		TPoint p=Where();
+		iConsole->SetCursorPosAbs(p);
+		iConsole->ClearToEndOfLine();
+		iPos+=(iWidth-p.iX);
+		}
+    iPos=aPos;
+    }
+
+void CLineEdit::Recall()
+//
+// Recall a line for editing.
+//
+    {
+
+	if (iRecall!=(-1))
+		{
+		ClearLine();
+		HBufC* pL=(*iHistory)[iRecall];
+		Buf()=(*pL);
+		iConsole->Write(Buf());
+		iPos=Buf().Length();
+		TInt nL=Lines();
+		if ((iLine+nL)>(iHeight-2))
+	    	iLine=iHeight-2-nL;
+		Buf()=(*pL);
+		}
+    }
+
+TInt CLineEdit::WordLeft()
+//
+// Position the cursor to the next word left.
+//
+    {
+
+    TInt x=iPos-1;
+    while (x && TChar(Buf()[x]).IsSpace())
+		x--;
+    while (x && TChar(Buf()[x]).IsGraph())
+		x--;
+    if (TChar(Buf()[x]).IsSpace())
+		x++;
+    return(x);
+    }
+
+TInt CLineEdit::WordRight()
+//
+// Position the cursor to the next word right.
+//
+    {
+
+    TInt x=iPos;
+    while (x<(TInt)Buf().Length() && TChar(Buf()[x]).IsGraph())
+		x++;
+    while (x<(TInt)Buf().Length() && TChar(Buf()[x]).IsSpace())
+		x++;
+    return(x);
+    }
+
+void CLineEdit::Cursor()
+//
+// Position the cursor.
+//
+    {
+
+    iConsole->SetCursorPosAbs(Where());
+    }
+
+void CLineEdit::Refresh()
+//
+// Refresh the line.
+//
+    {
+
+	iConsole->SetCursorHeight(ECursorNone);
+    iConsole->SetPos(iOrigin,iLine);
+    iConsole->Write(Buf());
+	Cursor();
+	iConsole->SetCursorHeight(iMode==EEditOverWrite ? ECursorNormal : ECursorInsert);
+    }
+
+EXPORT_C void CLineEdit::Edit(const TDesC& aPrompt,TDes* aBuf)
+//
+// Start the editor or a single key fetch.
+//
+    {
+
+	iBuf=aBuf;
+    iPos=0;
+	Buf().Zero();
+	iMode=EEditOverWrite;
+	iConsole->SetCursorHeight(iMode==EEditOverWrite ? ECursorNormal : ECursorInsert);
+    iConsole->Write(aPrompt);
+	iOrigin=iConsole->WhereX();
+	iLine=iConsole->WhereY();
+	iRecall=(-1);
+    TInt hCount=iHistory->Count();
+    if (hCount>iMaxHistory)
+		hCount=iMaxHistory;
+	FOREVER
+		{
+		TChar gChar=iConsole->Getch();
+		switch (gChar)
+	    	{
+		case EKeyEscape:
+	    	ClearLine();
+			iRecall=(-1);
+	    	break;
+		case EKeyHome:
+	    	iPos=0;
+	    	Cursor();
+	    	break;
+		case EKeyLeftArrow:
+	    	if (iPos)
+                {
+                if(iConsole->KeyModifiers()==EModifierCtrl)
+                    iPos=WordLeft();
+                else
+    				iPos--;
+                Cursor();
+                }
+	    	break;
+		case EKeyRightArrow:
+	    	if (iPos<((TInt)Buf().Length()))
+                {
+                if(iConsole->KeyModifiers()==EModifierCtrl)
+                    iPos=WordRight();
+                else
+    				iPos++;
+                Cursor();
+                }
+	    	break;
+		case EKeyEnd:
+	    	iPos=((TInt)Buf().Length());
+	    	Cursor();
+	    	break;
+		case EKeyPageUp:
+	    	if (hCount==0)
+				break;
+	    	iRecall=hCount-1;
+	    	Recall();
+	    	break;
+		case EKeyUpArrow:
+	    	if (iRecall==(-1))
+				{
+				if (hCount==0)
+		    		break;
+				iRecall=0;
+				}
+	    	else if (iRecall>=(hCount-1))
+				{
+				ClearLine();
+				iRecall=(-1);
+				break;
+				}
+	    	else
+				iRecall++;
+	    	Recall();
+	    	break;
+		case EKeyDownArrow:
+	    	if (iRecall==(-1))
+				{
+				if (hCount==0)
+		    		break;
+				iRecall=hCount-1;
+				}
+	    	else if (iRecall==0)
+				{
+				ClearLine();
+				iRecall=(-1);
+				break;
+				}
+	    	else
+				iRecall--;
+	    	Recall();
+	    	break;
+		case EKeyPageDown:
+	    	if (hCount==0)
+				break;
+	    	iRecall=0;
+	    	Recall();
+	    	break;
+		case EKeyEnter:
+	    	iConsole->SetCursorHeight(ECursorNone);
+	    	iConsole->SetPos(0,iLine+Lines()-1); // CR on the last line
+	    	iConsole->Write(_L("\n")); // Just a line feed
+//			iConsole->SetCursorHeight(iDefaultMode==EEditOverWrite ? ECursorNormal : ECursorInsert);
+	    	iRecall=(-1);
+	    	if (Buf().Length()>2)
+				{
+				if (iHistory->Count()==iMaxHistory+1)
+					{
+					User::Free((*iHistory)[iMaxHistory]);
+		    		iHistory->Delete(iMaxHistory);
+					}
+				HBufC* pB=Buf().Alloc();
+				if (pB!=NULL)
+					{TRAPD(r,iHistory->InsertL(0,pB));}
+				}
+	    	return;
+		case EKeyBackspace:
+	    	if (iPos)
+				{
+				TInt iN=1;
+				if (iConsole->KeyModifiers()==EModifierCtrl)
+		    		iN=iPos-WordLeft();
+				ClearLast(iN);
+				iPos-=iN;
+				Buf().Delete(iPos,iN);
+				Refresh();
+				}
+	    	break;
+		case EKeyDelete:
+	    	if (iPos<((TInt)Buf().Length()))
+				{
+				TInt iN=1;
+				if (iConsole->KeyModifiers()==EModifierCtrl)
+		    		iN=WordRight()-iPos;
+				ClearLast(iN);
+				Buf().Delete(iPos,iN);
+				Refresh();
+				}
+	    	break;
+		case EKeyInsert:
+	    	iMode=(iMode==EEditOverWrite ? EEditInsert : EEditOverWrite);
+			iConsole->SetCursorHeight(iMode==EEditOverWrite ? ECursorNormal : ECursorInsert);
+	    	break;
+		default:
+   	    	if (!gChar.IsPrint())
+				break;
+	    	if (iMode==EEditOverWrite && iPos<((TInt)Buf().Length()))
+				Buf()[iPos++]=(TText)gChar;
+	    	else if (Buf().Length()<0x100)
+				{
+				TInt oL=Lines();
+				TBuf<0x02> b;
+				b.Append(gChar);
+				Buf().Insert(iPos++,b);
+				TInt nL=Lines();
+				if (nL!=oL)
+		    		{
+		    		iConsole->SetCursorHeight(ECursorNone);
+		    		iConsole->SetPos(0,iLine+oL-1);
+		    		iConsole->Write(_L("\n"));
+		    		iConsole->SetPos(0,iLine);
+		    		if (iLine+nL>iHeight-2)
+						iLine=iHeight-2-nL;
+		    		}
+				}
+			else
+				{
+				iConsole->Write(_L("\7"));
+				iConsole->SetPos((iOrigin+iPos)%(iWidth-2),iLine+Lines()-1);
+				break;
+				}
+			Refresh();
+			}
+		}
+	}
+
+
+EXPORT_C void ClientStubOrdinal1() 
+	{
+	_LIT(KStubPanic, "tuiedit.dll Stub");
+	User::Panic(KStubPanic, KErrNotSupported);
+	}