diff -r 000000000000 -r b16258d2340f applayerprotocols/telnetengine/TUIEDIT/TUIEDIT.CPP --- /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(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); + }