uifw/EikStd/coctlsrc/EIKCONSW.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/EIKCONSW.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,778 @@
+/*
+* Copyright (c) 1997-1999 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 <e32base.h>
+#include <gdi.h>
+#include <coecntrl.h>
+#include <coemain.h>
+#include <eikconso.h>	// #include's eiksbfrm.h
+#include <eikenv.h>
+#include <barsread.h>
+#include <aknpriv.rsg>
+
+
+void cutmax(TInt &x,TInt max);
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// UpdateScrollBarsL()
+// ===================
+// Updates the thumb positions etc. on the scrollbars.
+// Should be called whenever the datasize, visiblesize or position on the scrollbars have changed.
+// RETURNS ETrue IF ANY SCROLLBARS (DIS)APPEARED
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+EXPORT_C TBool CEikConsoleControl::UpdateScrollbarsL(const TSize &aDataSize,const TSize& aVisibleSize,TPoint aPos)
+	{
+	// complete available area in characters
+	TSize viewInChars( iSize.iWidth / iCharSize.iWidth, iSize.iHeight / iCharSize.iHeight );
+	
+	// remember for next time
+	iLastThumbPos = aPos;
+	TEikScrollBarModel vModel;
+	TEikScrollBarModel hModel;
+	if (iVBarVisibility!=CEikScrollBarFrame::EOff) 
+		{
+		// Vertical
+		vModel.iScrollSpan=aDataSize.iHeight;
+		if ( viewInChars.iHeight > aVisibleSize.iHeight )
+			vModel.iThumbSpan=aVisibleSize.iHeight;
+		else
+			vModel.iThumbSpan=viewInChars.iHeight;
+		vModel.iThumbPosition=aPos.iY;
+		}
+	if (iHBarVisibility!=CEikScrollBarFrame::EOff) 
+		{
+		// Horizontal
+		hModel.iScrollSpan=aDataSize.iWidth;
+		if ( viewInChars.iWidth > aVisibleSize.iWidth )
+			hModel.iThumbSpan=aVisibleSize.iWidth;
+		else
+			hModel.iThumbSpan=viewInChars.iWidth;
+		hModel.iThumbPosition=aPos.iX;
+		}
+	TRect fullRect(iSize);
+	TRect clientRect(iViewInPixels);
+	TEikScrollBarFrameLayout layout;
+	CreateScrollBarFrameLayout(layout);
+	if (iSBFrame->TileL(&hModel,&vModel,clientRect,fullRect,layout))
+		{
+		// something happened, so redetermine the available pixels...
+		iViewInPixels=clientRect.Size();
+		// the visible characters...
+//	zoe
+		iViewInChars = TSize( iViewInPixels.iWidth / iCharSize.iWidth, iViewInPixels.iHeight / iCharSize.iHeight );
+		if (iConsole)
+			{
+			cutmax(iViewInChars.iWidth,iConsole->ScreenSize().iWidth);
+			cutmax(iViewInChars.iHeight,iConsole->ScreenSize().iHeight);
+			}
+		// and clear what's outside the new scope...
+		TPoint br(iViewInChars.iWidth*iCharSize.iWidth, iViewInChars.iHeight*iCharSize.iHeight);
+		const TRgb background=iEikonEnv->ControlColor(EColorControlBackground,*this);
+		ClearPixels(TRect(br.iX,0,iViewInPixels.iWidth,br.iY),background);
+		ClearPixels(TRect(0,br.iY,iViewInPixels.iWidth,iViewInPixels.iHeight),background);
+		// and inform caller that the area has changed...
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+void CEikConsoleControl::CreateScrollBarFrameLayout(TEikScrollBarFrameLayout& aLayout) const
+	{
+	// all margins default to 0
+	aLayout.iTilingMode=TEikScrollBarFrameLayout::EInclusiveRectConstant;
+	aLayout.iClientAreaGranularity=iCharSize;
+	}
+
+
+EXPORT_C void CEikConsoleControl::UpdateArea()
+	{
+	// determine how many characters will fit and how many pixels we thus ACTUALLY need
+//zoe
+	iViewInChars = TSize( iViewInPixels.iWidth / iCharSize.iWidth, iViewInPixels.iHeight / iCharSize.iHeight );
+	if (iConsole)
+		{
+		cutmax(iViewInChars.iWidth,iConsole->ScreenSize().iWidth);
+		cutmax(iViewInChars.iHeight,iConsole->ScreenSize().iHeight);
+		}
+	// clear the area and redraw
+	const TRgb background=iEikonEnv->ControlColor(EColorControlBackground,*this);
+	ClearPixels(iViewInPixels,background);
+	if (iConsole)
+		iConsole->Redraw(PixelsToChars(TRect(iViewInPixels)));
+	}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// HandleScrollEventL()
+// ====================
+// Called when someone "touches the scrollbar".
+// Note that it calls back the owner (a CEikConsoleScreen) to do any real action
+// (specifically, it calls MoveTopLeft(), passing it the required move as a vector)
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C void CEikConsoleControl::HandleScrollEventL(CEikScrollBar* aScrollBar,TEikScrollEvent aEventType)
+	{
+	TInt newThumbPos = aScrollBar->ThumbPosition();
+	TInt pageSize = aScrollBar->Model()->iThumbSpan;
+	const TInt horizontalNudgeFactor = 1;
+	switch (aEventType & KEikScrollEventBarMask)
+		{
+		case KEikScrollEventFromHBar:
+			switch (aEventType)
+				{
+				default:
+					break;
+				case EEikScrollLeft:
+					newThumbPos -= horizontalNudgeFactor;
+					break;
+				case EEikScrollRight:
+					newThumbPos += horizontalNudgeFactor;
+					break;
+				case EEikScrollPageLeft:
+					newThumbPos -= pageSize;
+					break;
+				case EEikScrollPageRight:
+					newThumbPos += pageSize;
+					break;
+				case EEikScrollThumbDragVert:
+				case EEikScrollThumbReleaseVert:
+					// in the case of drag events, the scrollbar automatically updates its thumb pos...
+					break;
+				}
+			iConsole->MoveTopLeft(TPoint(newThumbPos - iLastThumbPos.iX,0));
+			if (aEventType != EEikScrollThumbDragHoriz)
+				aScrollBar->SetModelThumbPosition(newThumbPos);
+			break;
+		case KEikScrollEventFromVBar:
+			switch (aEventType)
+				{
+				default:
+					break;
+				case EEikScrollUp:
+					--newThumbPos;
+					break;
+				case EEikScrollDown:
+					++newThumbPos;
+					break;
+				case EEikScrollPageUp:
+					newThumbPos -= ((pageSize < 2)? 1 : pageSize - 1);
+					break;
+				case EEikScrollPageDown:
+					newThumbPos += ((pageSize < 2)? 1 : pageSize - 1);
+					break;
+				case EEikScrollThumbDragVert:
+				case EEikScrollThumbReleaseVert:
+					// in the case of drag events, the scrollbar automatically updates its thumb pos...
+					break;
+				}
+			iConsole->MoveTopLeft(TPoint(0,newThumbPos - iLastThumbPos.iY));
+			if (aEventType != EEikScrollThumbDragVert)
+				aScrollBar->SetModelThumbPosition(newThumbPos);
+			break;
+		}
+	}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// SetScrollBarVisibility
+// ======================
+// Changes which scroll bars are visible. Returns EFalse if nothing changed.
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C TInt CEikConsoleControl::SetScrollBarVisibilityL(CEikScrollBarFrame::TScrollBarVisibility aHBarVisibility, CEikScrollBarFrame::TScrollBarVisibility aVBarVisibility)
+	{
+	if ((aHBarVisibility==iHBarVisibility)&&(aVBarVisibility==iVBarVisibility))
+		return EFalse;
+	iHBarVisibility=aHBarVisibility;
+	iVBarVisibility=aVBarVisibility;
+	iSBFrame->SetScrollBarVisibilityL(iHBarVisibility, iVBarVisibility);
+	return ETrue;
+	}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// SizeChanged
+// ==========
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C void CEikConsoleControl::SizeChanged()
+	{
+	iViewInPixels=Size(); // new area
+	if (iConsole && iSBFrame)
+		{
+		iConsole->UpdateScrollBars();
+		UpdateArea();
+		}
+	}
+
+EXPORT_C void CEikConsoleControl::FocusChanged(TDrawNow aDrawNow)
+	{
+	if (aDrawNow==ENoDrawNow)
+		return;
+	if (IsFocused())
+		iConsole->DrawCursor();
+	else
+		iConsole->HideCursor();
+	}
+
+EXPORT_C TInt CEikConsoleControl::CountComponentControls() const
+	{
+	return (iSBFrame) ? iSBFrame->CountComponentControls() : NULL;
+	}
+
+EXPORT_C CCoeControl* CEikConsoleControl::ComponentControl(TInt aIndex) const
+	{
+	return iSBFrame->ComponentControl(aIndex);
+	}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// VisibleSize()
+// =============
+// Simply returns the visible size in characters
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C TSize CEikConsoleControl::VisibleSize() const
+	{
+	return iViewInChars;
+	}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// ConstructL
+// ==========
+// Construct and activate a CEikConsoleControl (claiming the specified part of the physical screen)
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C void CEikConsoleControl::ConstructL(TInt aFlags)
+	{
+	// Init screen. Use RBackedUpWindow instead of RWindow if aFlags & CEikConsoleScreen::EUseBackedUpWindow
+	if (aFlags&CEikConsoleScreen::EUseBackedUpWindow)
+		CreateBackedUpWindowL((RWindowTreeNode&)iCoeEnv->RootWin(), EGray4);
+	else
+		{
+		CreateWindowL();
+		Window().SetBackgroundColor(iEikonEnv->ControlColor(EColorControlBackground,*this));
+		}
+	SetExtentToWholeScreen();
+
+	// Create scrollbars
+	iSBFrame=new(ELeave) CEikScrollBarFrame(this, this);
+	iSBFrame->SetScrollBarVisibilityL(iHBarVisibility,iVBarVisibility);
+
+	InitFontSpecL();
+	SetFontL(iFontSpec,NULL);
+
+	// activate
+	ActivateL();
+	}
+
+EXPORT_C void CEikConsoleControl::ConstructL(TPoint aTopLeft,const TSize &aSize,TInt aFlags,TEikConsWinUnits aUnit)
+	{
+	// Init screen. Use RBackedUpWindow instead of RWindow if aFlags & CEikConsoleScreen::EUseBackedUpWindow
+	if (aFlags&CEikConsoleScreen::EUseBackedUpWindow)
+		CreateBackedUpWindowL((RWindowTreeNode&)iCoeEnv->RootWin(), EGray4);
+	else
+		{
+		CreateWindowL();
+		Window().SetBackgroundColor(iEikonEnv->ControlColor(EColorControlBackground,*this));
+		}
+
+	// Create scrollbars
+	iSBFrame=new(ELeave) CEikScrollBarFrame(this, this);
+	iSBFrame->SetScrollBarVisibilityL(iHBarVisibility,iVBarVisibility);
+
+	InitFontSpecL();
+	
+	if (aUnit==EEikConsWinInChars)
+		{
+		CFont *font;
+		iEikonEnv->ScreenDevice()->GetNearestFontInTwips(font,iFontSpec);
+		CFbsFont* fbsFont = (CFbsFont*)font;
+		iCurrentFont=fbsFont;
+		iCharSize.iWidth=fbsFont->MaxNormalCharWidthInPixels();
+		iCharSize.iWidth=fbsFont->CharWidthInPixels('i');
+		iCharSize.iWidth=fbsFont->CharWidthInPixels('M');
+		iCharSize.iHeight=fbsFont->HeightInPixels();
+		
+		SetExtent(TPoint(aTopLeft.iX*iCharSize.iWidth,aTopLeft.iY*iCharSize.iHeight),
+			TSize(aSize.iWidth*iCharSize.iWidth,aSize.iHeight*iCharSize.iHeight));
+		SetFontL(iFontSpec,fbsFont);
+		}
+	else
+		{
+		SetExtent(aTopLeft,aSize);
+		SetFontL(iFontSpec,NULL);
+		}
+	// activate
+	ActivateL();
+	}
+
+void CEikConsoleControl::InitFontSpecL()
+    {
+    HBufC16* typeface = iCoeEnv->AllocReadResourceAsDes16LC(R_AKNPRIV_DEFAULT_CONSOLE_FONTSPEC_TYPEFACE);
+    iFontSpec.iTypeface.iName= *typeface;
+    CleanupStack::PopAndDestroy(typeface);
+
+    TResourceReader reader;
+    iCoeEnv->CreateResourceReaderLC(reader,R_AKNPRIV_DEFAULT_CONSOLE_FONTSPEC_HEIGHT);
+    iFontSpec.iHeight=reader.ReadInt16();
+    CleanupStack::PopAndDestroy(); // reader
+
+#if defined(_UNICODE)
+    iFontSpec.iTypeface.SetIsProportional(EFalse);
+#endif
+    iFontUnderline=EUnderlineOff;
+    iFontSpec.iFontStyle.SetPosture(EPostureUpright);
+    iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// SetRedrawer
+// ===========
+// Define aConsoleScreen as the object responsible for redrawing
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C void CEikConsoleControl::SetRedrawer(CEikConsoleScreen *aConsoleScreen)
+	{
+	iConsole=aConsoleScreen;
+	}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// Constructor and Destructor
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C CEikConsoleControl::CEikConsoleControl()
+	{
+	// *** init color
+	iBackGray16=iEikonEnv->Color(EColorControlBackground);
+	iPenGray16=iEikonEnv->Color(EColorControlText);
+
+	// *** init scrollbar settings and font (however, 0-values are free in construction)
+	// iHBarPresent=FALSE;
+	// iVBarPresent=FALSE;
+	// iLastThumbPos = TPoint(0,0);
+	// iCurrentFont=NULL;
+
+	// *** init cursor
+	iCursorHeightPercentage=20;
+	iTextCursor.iType	= TTextCursor::ETypeRectangle;
+	iTextCursor.iFlags	= 0;
+	iTextCursor.iColor=iEikonEnv->Color(EColorControlBackground);
+	iLastAtt=iLastFontFlags=(ATT_MAXVALUE+1);
+	}
+
+EXPORT_C CEikConsoleControl::~CEikConsoleControl()
+	{
+	iEikonEnv->ReleaseScreenFont(CONST_CAST(CFont*,iCurrentFont));
+	delete(iSBFrame);
+	}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// NextFontL
+// =========
+// Utility function: unload current font (if any) and load new font (specified elsewhere in iFontSpec)
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+void CEikConsoleControl::NextFontL()
+	{
+	CFont* font;
+	User::LeaveIfError(iEikonEnv->ScreenDevice()->GetNearestFontInTwips(font, iFontSpec));
+	CFbsFont* fbsFont = (CFbsFont*)font;
+	iEikonEnv->ReleaseScreenFont(CONST_CAST(CFont*,iCurrentFont)); // note that this only happens if the previous line succeeds!
+	iCurrentFont=fbsFont;
+	}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// SetFontL
+// ========
+// Change the font
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C void CEikConsoleControl::SetFontL(const TFontSpec& aFontSpec,const CFbsFont *aFont)
+	{
+	iFontSpec=aFontSpec;
+	iFontHeight=(TUint16)iFontSpec.iHeight;
+	if (aFont==NULL)
+		NextFontL();
+
+	iCharSize = TSize( iCurrentFont->CharWidthInPixels('M'),iCurrentFont->FontMaxHeight() );
+
+	SetCursorHeight(iCursorHeightPercentage);
+
+	// Determine font flags for new font
+	iFontIsProportional=iCurrentFont->FontSpecInTwips().iTypeface.IsProportional();
+	iLastFontFlags = 0;
+	if (iFontUnderline!=EUnderlineOff)
+		iLastFontFlags|=ATT_UNDERLINE;
+	if (iFontSpec.iFontStyle.Posture()!=EPostureUpright)
+		iLastFontFlags|=ATT_ITALIC;
+	if (iFontSpec.iFontStyle.StrokeWeight()!=EStrokeWeightNormal)
+		iLastFontFlags|=ATT_BOLD;
+
+	UpdateArea();
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+//  Utility functions: convert between character coordinates to pixel coordinates
+//
+////////////////////////////////////////////////////////////////////////////////////////
+
+TPoint CEikConsoleControl::CharsToPixels(TPoint aPos)
+	{
+	return TPoint( iCharSize.iWidth * aPos.iX, iCharSize.iHeight * aPos.iY );
+	}
+
+TRect CEikConsoleControl::CharsToPixels(const TRect &aRect)
+	{
+	return TRect(CharsToPixels(aRect.iTl),CharsToPixels(aRect.iBr));
+	}
+
+TRect CEikConsoleControl::PixelsToChars(const TRect &aRect) 
+	{
+	TRect r = aRect;
+	r.Normalize();
+	r.iTl.iX /= iCharSize.iWidth;
+	r.iBr.iX /= iCharSize.iWidth;
+	r.iBr.iX ++;
+	r.iTl.iY /= iCharSize.iHeight;
+	r.iBr.iY /= iCharSize.iHeight;
+	r.iBr.iY ++;
+	return r;
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+//  Cursor stuff
+//
+////////////////////////////////////////////////////////////////////////////////////////
+
+EXPORT_C void CEikConsoleControl::DrawCursor(TPoint aPosition)
+// Show cursor at character position
+	{
+	//iEikonEnv->RootWin().SetTextCursor(*DrawableWindow(),CharsToPixels(aPosition),iTextCursor);
+	iEikonEnv->DrawCursor(this, CharsToPixels(aPosition), iTextCursor.iWidth, iTextCursor.iAscent, iTextCursor.iHeight);
+	}
+
+EXPORT_C void CEikConsoleControl::HideCursor()
+// Hide cursor 
+	{
+	//iEikonEnv->RootWin().CancelTextCursor();
+	iEikonEnv->HideCursor(this);
+	}
+
+
+EXPORT_C void CEikConsoleControl::SetCursorHeight(TUint aPercentage)
+// Set new cursor height (specified as percentage of font height)
+// Should also be called whenever iCharSize changes!
+// Change will not take effect until the next call to DrawCursor!
+	{
+	iCursorHeightPercentage = aPercentage % 101;
+	iTextCursor.iHeight = ( 99 + (iCharSize.iHeight * iCursorHeightPercentage) ) / 100;
+	iTextCursor.iAscent = iTextCursor.iHeight-iCharSize.iHeight;
+	iTextCursor.iWidth  = iCharSize.iWidth;
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+//  Draw - defers the real work to the owner (a CEikConsoleScreen)
+//
+////////////////////////////////////////////////////////////////////////////////////////
+
+EXPORT_C void CEikConsoleControl::Draw(const TRect& aRect) const
+	{
+	if (iConsole) // if there's no owner, we do nothing
+		{
+		M().iRedrawing=1;
+		TPoint br(iViewInChars.iWidth*iCharSize.iWidth,iViewInChars.iHeight*iCharSize.iHeight);
+		const TRgb background=iEikonEnv->ControlColor(EColorControlBackground,*this);
+		ClearPixels(TRect(br.iX,0,iViewInPixels.iWidth,br.iY),background);
+		ClearPixels(TRect(0,br.iY,iViewInPixels.iWidth,iViewInPixels.iHeight),background);
+		iConsole->Redraw(M().PixelsToChars(aRect)); // Redraw all chars in the rectangle
+		M().iRedrawing=0;
+		}
+	}
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+//  Set up GC based for given attribute
+//
+////////////////////////////////////////////////////////////////////////////////////////
+
+void CEikConsoleControl::InterpretColorBits(TUint aCharacterAttributes)
+// Set iPenGrey16 and iBackGrey16 based on character attribute aCharacterAttributes
+	{
+	if (aCharacterAttributes & ATT_COLORMASK) // is color
+		{
+		const TInt pen16=(aCharacterAttributes&0x0F);
+		iPenGray16=TRgb::Color16(pen16);
+		TInt back16=((aCharacterAttributes&0x70)>>4)*2+1;
+		if (back16==1)
+			back16=0;
+		iBackGray16=TRgb::Color16(back16);
+		}
+	else if ( aCharacterAttributes & ATT_INVERSE )
+		{
+		iBackGray16=iEikonEnv->ControlColor(EColorControlHighlightBackground,*this);
+		iPenGray16=iEikonEnv->ControlColor(EColorControlHighlightText,*this);
+		}
+	else
+		{
+		iBackGray16=iEikonEnv->ControlColor(EColorControlBackground,*this);
+		iPenGray16=iEikonEnv->ControlColor(EColorControlText,*this);
+		}
+	}
+
+void CEikConsoleControl::InterpretAttribute(TUint aCharacterAttributes)
+	{
+	if (iLastAtt!=aCharacterAttributes)
+		{
+		_LIT(KMonospace,"Monospaced");
+		_LIT(KMonodouble,"MONODOUBLE");
+		iLastAtt=aCharacterAttributes;
+		InterpretColorBits(aCharacterAttributes);
+		TUint fontFlags = (aCharacterAttributes & ATT_COLORMASK) ? (0) : (aCharacterAttributes & ATT_IGNORE_INVERSE & ATT_IGNORE_RIGHTLEFT);
+		if (iLastFontFlags!=fontFlags)
+			{
+			iLastFontFlags=fontFlags;
+			iFontUnderline=((fontFlags & ATT_UNDERLINE)? EUnderlineOn: EUnderlineOff);
+			iFontSpec.iFontStyle.SetPosture(((fontFlags & ATT_ITALIC)? EPostureItalic: EPostureUpright));
+			iFontSpec.iFontStyle.SetStrokeWeight(((fontFlags & ATT_BOLD)? EStrokeWeightBold: EStrokeWeightNormal));
+			if (fontFlags & ATT_DOUBLEMASK)
+				{ // double aVisiblePixels
+				if ( (fontFlags & ATT_DOUBLEMASK) == ATT_DOUBLEWIDTH )
+					{ // double width 
+					iFontSpec.iHeight = iFontHeight;
+					if (iFontSpec.iTypeface.iName.Compare(KMonospace)==0 )
+						iFontSpec.iTypeface.iName=KMonodouble; 			//@@@
+					}
+				else
+					{ // double height
+					iFontSpec.iHeight = (TUint16)(iFontHeight*2);
+					if ( iFontSpec.iTypeface.iName.Compare(KMonodouble)==0 )
+						iFontSpec.iTypeface.iName=KMonospace; 			//@@@
+					}
+				}
+			else 
+				{ // normal aVisiblePixels
+				iFontSpec.iHeight = iFontHeight;
+				if ( iFontSpec.iTypeface.iName.Compare(KMonodouble)==0 )
+					iFontSpec.iTypeface.iName=KMonospace; 			//@@@
+				} 
+			TRAP_IGNORE(NextFontL());	// ignore errors. If there is a problem, we'll use the one that was loaded
+			}
+		}
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+//  Basic Graphic services
+//  ======================
+//	NOTE: if iRedrawing, then a redraw is going on, 
+//  i.e. no need to (de)activate gc's or (in)validate rectangles
+//
+////////////////////////////////////////////////////////////////////////////////////////
+
+EXPORT_C void CEikConsoleControl::InvertChars(const TRect &anArea)
+// invert a rectangle of characters
+	{
+	if (!iRedrawing)
+		ActivateGc();
+	CWindowGc& gc=SystemGc();
+	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	const TRgb highlightBackground=iEikonEnv->ControlColor(EColorControlBackground,*this);
+	gc.SetBrushColor(highlightBackground);
+	gc.SetDrawMode(CGraphicsContext::EDrawModeXOR);
+    gc.SetPenStyle(CGraphicsContext::ENullPen);
+    if (!iRedrawing && !IsBackedUp())
+        { 
+        Window().Invalidate(anArea); 
+        Window().BeginRedraw(anArea); 
+        } 
+    
+    gc.DrawRect(CharsToPixels(anArea));
+    if (!iRedrawing && !IsBackedUp())
+        {
+        Window().EndRedraw(); 
+        }
+    
+    gc.SetDrawMode(CGraphicsContext::EDrawModePEN);
+    gc.SetPenStyle(CGraphicsContext::ESolidPen);
+    gc.SetBrushStyle(CGraphicsContext::ENullBrush);
+    if (!iRedrawing)
+        DeactivateGc();
+    }
+
+EXPORT_C void CEikConsoleControl::ScrollChars(const TRect &anArea,const TPoint &aVector)
+// scroll a rectangle of characters by a given vector (character coordinates)
+	{
+	const TRect areaInPixels=CharsToPixels(anArea);
+	Window().Scroll(areaInPixels,CharsToPixels(aVector),areaInPixels);
+	}
+
+void CEikConsoleControl::ClearPixels(const TRect &anArea,TRgb aColor) const
+	{
+	if (!iRedrawing)
+		ActivateGc();
+	CWindowGc& gc=SystemGc();
+	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	gc.SetBrushColor(aColor);
+    gc.SetPenStyle(CGraphicsContext::ENullPen);
+    if (!iRedrawing && !IsBackedUp()) 
+        { 
+        Window().Invalidate(anArea); 
+        Window().BeginRedraw(anArea); 
+        } 
+    
+    gc.DrawRect(anArea);
+    if (!iRedrawing && !IsBackedUp()) 
+        {
+        Window().EndRedraw();
+        }
+    gc.SetPenStyle(CGraphicsContext::ESolidPen);
+    gc.SetBrushStyle(CGraphicsContext::ENullBrush);
+    if (!iRedrawing)
+        DeactivateGc();
+    }
+
+EXPORT_C void CEikConsoleControl::ClearChars(const TRect &anArea,TUint aCharacterAttributes) 
+// Clears a rectangle of characters to the current background color
+	{
+	TRect theArea=CharsToPixels(anArea);
+	InterpretColorBits(aCharacterAttributes); 
+	ClearPixels(theArea,iBackGray16);
+	}
+
+EXPORT_C void CEikConsoleControl::DrawChars(const TDesC &aString,const TPoint &aPosition,TUint aCharacterAttributes)
+// Draw characters at given position using given attribute
+	{
+	InterpretAttribute(aCharacterAttributes);
+	TPoint pos = CharsToPixels(aPosition);
+	TInt topMargin 	= iCurrentFont->AscentInPixels();
+    if ( iCurrentFont->TypeUid() == KCFbsFontUid)
+        {
+        const CFbsFont* fbsFont = (CFbsFont*)iCurrentFont;
+        topMargin = fbsFont->FontMaxAscent();
+        }
+
+	TInt isDouble = ( !(aCharacterAttributes & ATT_COLORMASK) && (aCharacterAttributes & ATT_DOUBLEMASK) );
+	TRect charArea = TRect(pos,iCharSize);
+
+	if (!iRedrawing)
+		ActivateGc();
+	
+	CWindowGc& gc=SystemGc();
+	gc.UseFont(iCurrentFont);
+	gc.SetPenColor(iPenGray16);
+	gc.SetBrushColor(iBackGray16);
+	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	gc.SetUnderlineStyle(iFontUnderline);
+    
+    TInt currentFont_width = iCurrentFont->MaxNormalCharWidthInPixels();
+    if (isDouble || iFontIsProportional || currentFont_width!=iCharSize.iWidth )
+        {
+        TInt leftMargin = 0;
+        
+        if (isDouble)
+            {
+            if (aCharacterAttributes & ATT_RIGHTMASK)
+                leftMargin -= iCharSize.iWidth;
+            if ((aCharacterAttributes & ATT_DOUBLEMASK) == ATT_DOUBLEBOTTOM)
+                topMargin -= iCharSize.iHeight;
+            }
+        
+        if (!iRedrawing && !IsBackedUp()) 
+            {
+            TSize stringSize(iCharSize); 		
+            stringSize.iWidth *= aString.Length();	// calculate on-screen width of line
+            TRect wholestring(pos,stringSize);
+            Window().Invalidate(wholestring); 	
+            Window().BeginRedraw(wholestring); 		// begin draw transaction for whole line
+            } 
+        for ( TInt i=0;i<aString.Length();i++ )
+            {
+            gc.DrawText(aString.Mid(i,1),charArea,topMargin,CGraphicsContext::ELeft,leftMargin);
+            
+            charArea.Move(iCharSize.iWidth,0);
+            if (isDouble)
+                leftMargin = - iCharSize.iWidth - leftMargin;
+            }
+        if (!iRedrawing && !IsBackedUp()) 
+            {
+            Window().EndRedraw();
+            }
+        }
+    else
+        {
+        charArea.iBr.iX += (iCharSize.iWidth*(aString.Length()-1));
+        if (!iRedrawing && !IsBackedUp()) 
+            { 
+            Window().Invalidate(charArea); 
+            Window().BeginRedraw(charArea); 
+            } 
+        gc.DrawText(aString,charArea,topMargin);
+        if (!iRedrawing && !IsBackedUp())
+            {
+            Window().EndRedraw();
+            }
+        }
+    
+    gc.DiscardFont();
+    if (!iRedrawing)
+        DeactivateGc();
+	}
+
+/**
+ * Gets the list of logical colors employed in the drawing of the control,
+ * paired with an explanation of how they are used. Appends the list to aColorUseList.
+ *
+ * @since ER5U 
+ */
+EXPORT_C void CEikConsoleControl::GetColorUseListL(CArrayFix<TCoeColorUse>& /*aColorUseList*/) const
+	{
+	}
+
+/**
+ * Handles a change to the control's resources of type aType
+ * which are shared across the environment, e.g. colors or fonts.
+ *
+ * @since ER5U 
+ */
+EXPORT_C void CEikConsoleControl::HandleResourceChange(TInt aType)
+	{
+	CCoeControl::HandleResourceChange(aType);
+	if (aType==KEikMessageColorSchemeChange)
+		{
+		if (!IsBackedUp())
+			{
+			Window().SetBackgroundColor(iEikonEnv->ControlColor(EColorControlBackground,*this));
+			}
+		}
+	}
+
+// Reserved from CCoeControl
+
+EXPORT_C void CEikConsoleControl::WriteInternalStateL(RWriteStream& /*aWriteStream*/) const
+	{
+	}
+	
+EXPORT_C void CEikConsoleControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CAknControl::HandlePointerEventL(aPointerEvent); 
+    }	
+
+EXPORT_C void* CEikConsoleControl::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+EXPORT_C void CEikConsoleControl::Reserved_2()
+	{
+	}
+