www.pudn.com > NetTest2nd.rar > NetTestContainer.cpp


/* 
============================================================================ 
 Name        : CNetTestContainer from NetTestContainer.h 
 Author      : wayne chen 
 Version     : 1.13 
 Copyright   : Your copyright notice 
 Description : Container control implementation 
============================================================================ 
*/ 
 
// INCLUDE FILES 
#include "NetTestContainer.h" 
 
#include  
#include  
#include  // for avrell style listbox 
#include  
#include  
#include  
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
CNetTestContainer::CNetTestContainer() 
{ 
	iMsgStore = NULL ;  
} 
 
CNetTestContainer::~CNetTestContainer() 
{ 
	delete iScrollBar ; 
	iScrollBar = NULL ; 
	if(iMsgStore) delete iMsgStore ; 
} 
 
void CNetTestContainer::ConstructL(const TRect& rc)  
{ 
	CreateWindowL(); // Creates window 
	SetRect( rc );   // Sets rectangle of frame. 
	InitEditor( rc ) ;  
	ActivateL();     // Activates window. (Ready to draw) 
} 
 
void CNetTestContainer::InitEditor(const TRect& rc)  
{ 
	// setup the font used and the color  
	iNormalBkColor = TRgb(255, 255, 255) ;  
	iNormalFontColor = TRgb(0, 0, 0) ;  
	iReversBkColor = TRgb(0, 0, 255) ;  
	iReversFontColor = TRgb(255, 255, 255) ;  
 
	iNormalFont = (CFont *)CEikonEnv::Static()->TitleFont() ;  
 
	// setup storage and position going to use  
	iMsgStore = NULL ; 
	iWordWrap = EFalse ; 
 
	iTopLine = 0 ;  
	iLeftMargin = 8 ; 
	iRightMargin = 3 ; 
	iTopMargin = 5 ; 
	iLineSpace = 3 ; 
	iBorderWidth = rc.Width() ; 
	iBorderHeight = rc.Height() ; 
 
	// calc how many line in one page  
	iDispLines = iBorderHeight / (iNormalFont->HeightInPixels() + iLineSpace) ; 
 
	// create scroll bar displayed under the display window 
	iScrollBar = new (ELeave) CEikScrollBarFrame(this, this); 
	iScrollBar->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOn); 
} 
 
void CNetTestContainer::SetDescArray(CDesCArray ** pdesc, const TDesC& body)  
{ 
	TInt res        = 0 ;  
	TInt this_end   = 0 ;  
	TInt next_start = 0 ;  
	TInt offset     = 0 ; 
 
	// set default display line number, from first line to display  
	iTopLine = 0 ; 
	// alloc store memory 
	if(*pdesc != NULL) delete *pdesc ;  
 
	*pdesc = new (ELeave) CDesC16ArrayFlat(10) ; 
 
	// copy each line in msg body into CCDesC16ArrayFlat object  
	do { 
		res = CalcLineChar(body.Mid(offset), this_end, next_start); 
		if (res <= 0) { 
			(*pdesc)->AppendL(body.Mid(offset)); 
			break; 
		} else { 
			(*pdesc)->AppendL(body.Mid(offset, this_end)); 
			offset += next_start; 
		} 
	} while(res > 0) ;  
} 
 
void CNetTestContainer::SetScrollBarLineCount()  
{ 
	TInt line_count = 0 ;  
	// Initialize the scroll bar 
	TEikScrollBarModel vSbarModel;	 
	vSbarModel.iThumbSpan = 1;  
	vSbarModel.iThumbPosition = 0;  // iVThumbPosition 
 
	// calculate total lines, both message and reverse color  
	if(iMsgStore &&  
		((iMsgStore->Count() - iDispLines) > 0))  { 
			line_count = iMsgStore->Count() ;  
		} 
 
	// Adjust the scrollbar span for each tab page 
	vSbarModel.iScrollSpan = line_count - iDispLines + 1; 
	iScrollBar->Tile(&vSbarModel); 
} 
 
void CNetTestContainer::SetMsgBody(const TDesC& body)  
{ 
	SetDescArray(&iMsgStore, body) ; 
	SetScrollBarLineCount() ;  
	DrawNow() ;  
} 
 
TInt CNetTestContainer::CalcLineChar(const TDesC& msg, TInt& this_end, TInt& next_start) 
{ 
	TInt len = -1; 
	TUint wd = 0; 
	for (TInt i = 0; i < msg.Length(); i++) { 
		// find enter in the input message  
		if (msg[i] == 0x0A) { // find the [enter] char  
			this_end = len + 1; 
			next_start = len + 2; 
			return len + 2; 
		} else if (msg[i] == 0x0D) {   
			// find change line char some txt may be 0x0d 0x0a 
			// as [enter] char  
			if (i + 1 < msg.Length()) { 
				if (msg[i + 1] == 0x0A) { 
					this_end = len + 1; 
					next_start = len + 3; 
					return len + 3; 
				} else {  
					this_end = len + 1; 
					next_start = len + 2; 
					return len + 2; 
				} 
			} else {  
				this_end = 0; 
				next_start = 0; 
				return 0; 
			} 
		} // end if (msg[i] == 0x0A) ... 
 
		// not an [enter] char, calculate the text width  
		wd = iNormalFont->TextWidthInPixels(msg.Left(i)); 
		if (wd > iBorderWidth - iLeftMargin - iRightMargin) { 
			if (iWordWrap) { 
				for (TInt j = len; j >= 0; j--) { 
					// check whether the ascii code  
					if (msg[j] < 0x30 || msg[j] >= 128) { 
						len = j + 1; 
						break; 
					} 
				} // end for (TInt j = len; j ...  
			} // end if (iWordWrap) ... 
 
			this_end = len; 
			next_start = len; 
			return len; 
		} // end if (wd > iBorderWidth ...  
		len = i; 
	} // end for (TInt i = 0; i ...  
 
	if (wd < iBorderWidth - iLeftMargin - iRightMargin) { 
		this_end = len + 1; 
		next_start = len + 2; 
		return -1; 
	} else { 
		this_end = 0; 
		next_start = 0; 
		return 0; 
	} 
} 
 
void CNetTestContainer::Draw(const TRect& aRect) const  
{ 
	CWindowGc& gc = SystemGc() ; 
 
	// clear current display screen  
	gc.SetPenStyle( CGraphicsContext::ENullPen ) ; 
	gc.SetBrushStyle( CGraphicsContext::ESolidBrush ) ; 
	gc.SetBrushColor( iNormalBkColor ); 
	gc.DrawRect( aRect ); 
 
	// display message and revers color text  
	DispAll(gc) ;  
} 
 
TInt CNetTestContainer::DispMsgBody(CWindowGc& gc, TInt& y, TInt line_step) const  
{ 
	TInt  count = iMsgStore->Count() ;  
	TInt  i ;  
 
	// check whether it is necessary to change pages  
	if (count > iDispLines)	count = iDispLines; 
	for (i = 0; i < count; i++, y += line_step) { 
		if(((TInt)(i+iTopLine)) >= iMsgStore->Count()) break ;  
		gc.DrawText((*iMsgStore)[i + iTopLine], TPoint(iLeftMargin, y)); 
	} 
 
	// return the left lines can be displayed  
	return (iDispLines - i) ;  
} 
 
void CNetTestContainer::DispAll(CWindowGc& gc) const 
{ 
	// init display line position  
	TInt y = iNormalFont->AscentInPixels() + iTopMargin ;  
	// default line distance between each line  
	TUint line_step = iNormalFont->HeightInPixels() + iLineSpace ;  
	TInt  can_disp_line = iDispLines ; // suppose only one page info displayed  
 
	gc.SetPenStyle(CGraphicsContext::ESolidPen); 
	gc.UseFont(iNormalFont) ; 
 
	// display message body and reverse body  
	if(iMsgStore) { 
		// handler for message and revers both exist display  
		can_disp_line = DispMsgBody(gc, y, line_step) ;  
	} 
} 
 
TInt CNetTestContainer::CountComponentControls() const 
{ 
	// no controls used here  
	return 0 ;  
} 
 
CCoeControl* CNetTestContainer::ComponentControl( TInt /*aIndex*/ ) const 
{ 
	// no handlers to be returned here  
	return NULL ;  
} 
 
void CNetTestContainer::SizeChanged() {} 
 
TKeyResponse CNetTestContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, 
											  TEventCode aType) 
{ 
	TInt code = aKeyEvent.iCode; 
	if(aType != EEventKey) return EKeyWasNotConsumed ;  
	switch(code) { 
	case EKeyOK: 
		break ;  
	case EKeyUpArrow: 
		{ 
			if (iTopLine != 0) { 
				iTopLine --; 
				iScrollBar->MoveVertThumbTo(iTopLine); 
				DrawNow(); 
			} 
		} 
		break ;  
	case EKeyDownArrow: 
		{ 
			TInt line_count = 0 ; 
			TInt val = 0 ;  
			if(iMsgStore) line_count = iMsgStore->Count() ;  
 
			val = line_count - iDispLines ;  
			if (val > 0 && (TInt)iTopLine < val) { 
				iTopLine ++; 
				iScrollBar->MoveVertThumbTo(iTopLine); 
				DrawNow(); 
			} 
		} 
		break ;  
	default: 
		break ;  
	} 
	return EKeyWasConsumed ;  
} 
 
void CNetTestContainer::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/) {} 
void CNetTestContainer::HandleScrollEventL(CEikScrollBar* /*aScrollBar*/, TEikScrollEvent /*aEventType*/) {}