// EIKCHRED.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <eikchred.h>
#include <eikenv.h>
#include <coecobs.h>
#include <eikbordr.h>

#include <eikcolor.h>

#include <eikon.rsg>

#include <eikchmap.h>

const TInt KEikCharEdBorder	=1;
const TInt KEikCharEdMargin=1;

EXPORT_C CEikCharEditor::CEikCharEditor()
	{
	__DECLARE_NAME(_S("CEikCharEditor"));
	}


EXPORT_C CEikCharEditor::~CEikCharEditor()
	{
	}

EXPORT_C void CEikCharEditor::SetChar(TChar aChar)
	{
    iChar=aChar;
	}

EXPORT_C TChar CEikCharEditor::GetChar() const
	{
	return iChar;
	}

EXPORT_C void CEikCharEditor::Reserved_1()	//reserved by coecontrol
	{
	}									  

EXPORT_C void CEikCharEditor::Reserved_2()	//reserved by coecontrol
	{
	}									  

EXPORT_C TKeyResponse CEikCharEditor::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode /*aType*/)
	{
	TInt code = aKeyEvent.iCode;
	if ((code == EKeyDownArrow) || (code == EKeyUpArrow))
		return(EKeyWasNotConsumed);
	if (code==EKeyBackspace)
		code=EKeySpace;
	TChar ch(code);

	TBuf<24> buf;
	iCoeEnv->ReadResource(buf,R_EIK_EDWIN_SHIFT_CTRL_HOTKEYS);
	const TInt hotkeyPos=buf.Locate(TChar(code+'a'-1));
	if (hotkeyPos==EHotKeyInsertChar)
		{
		CEikCharMapDialog* dialog=new(ELeave) CEikCharMapDialog(this);
		dialog->ExecuteLD(R_EIK_DIALOG_CHARMAP);
		return EKeyWasConsumed;
		}

	if (!ch.IsPrint())
	   	iEikonEnv->LeaveWithInfoMsg(0);
	iChar=ch;
	DrawNow();
    ReportEventL(MCoeControlObserver::EEventStateChanged);
    return(EKeyWasConsumed);
	}

EXPORT_C TSize CEikCharEditor::MinimumSize()
	{
	TSize size;
	const CFont* font=iEikonEnv->NormalFont();
	size.iWidth=font->MaxCharWidthInPixels()+(2*KEikCharEdBorder+2*KEikCharEdMargin);
	size.iHeight=font->HeightInPixels()+(2*KEikCharEdBorder+2*KEikCharEdMargin);
	return size;
	}

EXPORT_C void CEikCharEditor::Draw(const TRect& /*aRect*/) const
	{
	CWindowGc& gc=SystemGc();

    TRect rect(Rect());
	TEikBorder border(TEikBorder::ESingleGray);
	border.Draw(gc,rect);
    TRect innerRect=border.InnerRect(rect);
    TBuf<1> buf;
	buf.Append(iChar);
    if (IsFocused())
		{
		gc.SetPenColor(iEikonEnv->ControlColor(EEikColorControlHighlightText, *this));
		gc.SetBrushColor(iEikonEnv->ControlColor(EEikColorControlHighlightBackground, *this)); //KEikCharEditorFocusedBackGroundColor);
		}
	else
		{
		gc.SetBrushColor(iEikonEnv->ControlColor(EEikColorControlBackground, *this)); //KEikCharEditorBackGroundColor);
		gc.SetPenColor(iEikonEnv->ControlColor(EEikColorControlText, *this)); //KEikCharEditorTextColor);
		}
	const CFont* font=iEikonEnv->NormalFont();
    gc.UseFont(font);
	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
    gc.DrawText(buf,innerRect,font->AscentInPixels()+KEikCharEdMargin,CGraphicsContext::ECenter);
	}

EXPORT_C void CEikCharEditor::FocusChanged(TDrawNow aDrawNow)
	{
	if (aDrawNow==EDrawNow)
		DrawNow();
	}

