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