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*/) {}