// EIKBORDR.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <eikbordr.h>
#include <gdi.h>
#include <coedef.h>

#define ECoeAdjMask 0x0f

const TInt KTypeMask		=0x3ff00; 
const TInt KAdjacentMask	=0x000f;

const TInt KBorderShift = 8;
const TInt KDepthShift	= KBorderShift+1;

EXPORT_C TEikBorder::TEikBorder()
	{}

EXPORT_C TEikBorder::TEikBorder(TBorderType aType)
	: iType(STATIC_CAST(TInt,aType)<<KBorderShift)
    {}

EXPORT_C TEikBorder::TEikBorder(TBorderType aType,TCoeAdjacent aAdjacent)
	: iType((STATIC_CAST(TInt,aType)<<KBorderShift)|aAdjacent)
    {}

EXPORT_C void TEikBorder::SetType(TBorderType aType)
    {
    iType&=(~KTypeMask);
    iType|=STATIC_CAST(TInt,aType)<<KBorderShift;
    }

inline TEikBorder::TBorderType TEikBorder::Type() const
    {
    return (TBorderType)((iType&KTypeMask)>>KBorderShift);
    }

EXPORT_C void TEikBorder::SetAdjacent(TInt aAdjacent)
    {
    iType&=(~KAdjacentMask);
    iType|=(KAdjacentMask & aAdjacent);
    }

inline TInt TEikBorder::Depth() const
	{
	return (iType>>KDepthShift)&0x3;
	}

/*inline TBool TEikBorder::HasShadow() const
	{
	return (iType>>KBorderShift)&EShadow;
	}*/

EXPORT_C TBool TEikBorder::HasBorder() const
	{
	return (!(((iType&KTypeMask)>>KBorderShift)==ENoBorder));
	}

EXPORT_C TInt TEikBorder::Adjacent() const
	{
	return iType&KAdjacentMask;
	}

inline TBool TEikBorder::IsSunken() const
	{
	return (iType>>KBorderShift)&ESunken;
	}

EXPORT_C TMargins TEikBorder::Margins() const
    {
    TMargins margins;
    /*TInt top=0;
    TInt bottom=0;
    if (HasBorder())
        {
        const TInt depth = Depth();
        //if (HasShadow() && ((iType&KAdjacentMask)==ECoeAdjNone))
        //    bottom=depth;
        top=depth+1;
        bottom+=depth+1;
        }
    margins.iTop=margins.iLeft=top;
    margins.iBottom=margins.iRight=bottom;
    if (Type()!=ENone)
        {
        if (iType&ECoeAdjRight)
            --margins.iRight;
        if (iType&ECoeAdjBottom)
            --margins.iBottom;
        }*/
	switch (Type())
		{
	// following until borders are finalised
	case ENone:
		margins.iTop=margins.iLeft=0;
		margins.iBottom=margins.iRight=0;
		break;
	case ESingleBlack:
	case ESingleGray:
	    margins.iTop=margins.iLeft=1;
		margins.iBottom=margins.iRight=1;
		break;
	case EShallowRaised:
	    margins.iTop=margins.iLeft=1;
		margins.iBottom=margins.iRight=2;
		break;
	case EDeepRaised:
	case EDeepRaisedWithOutline:
	    margins.iTop=margins.iLeft=3;
		margins.iBottom=margins.iRight=3;
		break;
	case EThickDeepRaisedWithOutline:
		margins.iTop=margins.iLeft=5;
		margins.iBottom=margins.iRight=5;
		break;
	case EShallowSunken:
	    margins.iTop=margins.iLeft=2;
		margins.iBottom=margins.iRight=1;
		break;
	case EDeepSunken:
	case EDeepSunkenWithOutline:
	    margins.iTop=margins.iLeft=3;
		margins.iBottom=margins.iRight=2;
		//margins.iBottom=margins.iRight=3;//!!! for white gray line experiment
		break;
	case EVerticalBar:
	    margins.iTop=margins.iBottom=3;
		margins.iLeft=margins.iRight=2;
		break;
	case EHorizontalBar:
	    margins.iTop=margins.iBottom=2;
		margins.iLeft=margins.iRight=3;
		break;
	/*case EShallowRaisedWithShadow:
	    margins.iTop=margins.iLeft=1;
		margins.iBottom=margins.iRight=3;
		break;
	case EDeepRaisedWithShadow:
	    margins.iTop=margins.iLeft=1;
		margins.iBottom=margins.iRight=5;
		break;*/
	default:
		margins.iTop=margins.iBottom=margins.iLeft=margins.iRight=0;
		break;
		}
    if (Type()!=ENone)
        {
        if (iType&ECoeAdjLeft)
			--margins.iLeft;
		if (iType&ECoeAdjTop)
			--margins.iTop;
		if (iType&ECoeAdjRight)
            --margins.iRight;
        if (iType&ECoeAdjBottom)
            --margins.iBottom;
        }
    return margins;
    }

EXPORT_C TSize TEikBorder::SizeDelta() const
    {
    TMargins margins=Margins();
    return TSize(margins.iLeft+margins.iRight,margins.iTop+margins.iBottom);
    }

EXPORT_C TRect TEikBorder::OuterRect(const TRect& aInnerRect) const
    {
    TRect outer=aInnerRect;
    TMargins margins=Margins();
    outer.iTl.iX-=margins.iLeft;
    outer.iTl.iY-=margins.iTop;
    outer.iBr.iX+=margins.iRight;
    outer.iBr.iY+=margins.iBottom;
    return outer;
    }

EXPORT_C TRect TEikBorder::InnerRect(const TRect& aOuterRect) const
    {
    TRect inner=aOuterRect;
    TMargins margins=Margins();
    inner.iTl.iX+=margins.iLeft;
    inner.iTl.iY+=margins.iTop;
    inner.iBr.iX-=margins.iRight;
    inner.iBr.iY-=margins.iBottom;
    return inner;
    }

EXPORT_C void TEikBorder::Draw(CGraphicsContext& aGc,const TRect& aRect) const
    {
    if (!HasBorder())
        return;
	switch (Type())
		{
	case EDeepRaised:
		DrawDeepRaised(aGc,aRect);
	    aGc.SetPenColor(KRgbBlack);
		return;
	case EDeepRaisedWithOutline:
		DrawDeepRaisedWithOutline(aGc,aRect);
	    aGc.SetPenColor(KRgbBlack);
		return;
	case EThickDeepRaisedWithOutline:
		DrawThickDeepRaisedWithOutline(aGc,aRect);
	    aGc.SetPenColor(KRgbBlack);
		return;
	case EDeepSunkenWithOutline:
	case EDeepSunken:
		DrawDeepSunken(aGc,aRect);
		aGc.SetPenColor(KRgbBlack);
		return;
	case EShallowRaised:
		DrawShallowRaised(aGc,aRect);
	    aGc.SetPenColor(KRgbBlack);
		return;
	case EShallowSunken:
		DrawShallowSunken(aGc,aRect);
	    aGc.SetPenColor(KRgbBlack);
		return;
	case EVerticalBar:
		DrawVerticalBar(aGc,aRect);
	    aGc.SetPenColor(KRgbBlack);
		return;
	case EHorizontalBar:
		DrawHorizontalBar(aGc,aRect);
	    aGc.SetPenColor(KRgbBlack);
		return;
	default:
		break;
		}

	//!!! these all need sorting out
    TRgb tlo=KRgbDarkGray; // top left outer, also shadow
    TRgb tli=KRgbWhite;     // top left inner
    TRgb bri=KRgbDarkGray;  // bottom right inner
    TRgb bro=KRgbBlack;     // bottom right outer
    if (IsSunken())
        {
        tlo=KRgbDarkGray; // !! was DarkGray, is this right?
        tli=KRgbBlack;
        bri=KRgbGray;
        bro=KRgbWhite;
        }
	if (Type()==ESingleGray)
        {
        tlo=KRgbGray;
        tli=KRgbGray;
        bri=KRgbGray;
        bro=KRgbGray;
        }
	if (Type()==ESingleBlack)
        {
        tlo=KRgbBlack;
        tli=KRgbBlack;
        bri=KRgbBlack;
        bro=KRgbBlack;
        }

    const TInt depth = Depth();
    TInt shadowDepth=0;
    /*if (HasShadow() && ((iType&KAdjacentMask)==ECoeAdjNone))
        shadowDepth=depth;*/
    aGc.SetPenColor(tlo);
    TPoint pos=aRect.iTl;
	if (!(iType&ECoeAdjTop))
		{
		aGc.DrawLine(pos,TPoint(aRect.iBr.iX-shadowDepth,pos.iY));
		++pos.iY;
		}
	if (!(iType&ECoeAdjLeft))
		{
		aGc.DrawLine(pos,TPoint(pos.iX,aRect.iBr.iY-shadowDepth));
		++pos.iX;
		}
    aGc.SetPenColor(tli);
    TInt delta=shadowDepth;
    if (!(iType&ECoeAdjRight))
        ++delta;
    {for (TInt ii=0;ii<depth;++ii)
        {
        aGc.DrawLine(pos,TPoint(aRect.iBr.iX-delta-ii,pos.iY));
        ++pos.iY;
        }}
    delta=shadowDepth;
    if (!(iType&ECoeAdjBottom))
        delta+=1;
    {for (TInt ii=0;ii<depth;++ii)
        {
        aGc.DrawLine(pos,TPoint(pos.iX,aRect.iBr.iY-delta-ii));
        ++pos.iX;
        }}
    pos.iX=aRect.iBr.iX-1;
    pos.iY=aRect.iBr.iY-1;
    /*if (shadowDepth)
        {
        aGc.SetPenColor(bri);
        {for (TInt ii=0;ii<shadowDepth;++ii)
            {
            aGc.DrawLine(pos,TPoint(aRect.iTl.iX-1,pos.iY));
            --pos.iY;
            }}
        {for (TInt ii=0;ii<shadowDepth;++ii)
            {
            aGc.DrawLine(pos,TPoint(pos.iX,aRect.iTl.iY-1));
            --pos.iX;
            }}
        }*/
    aGc.SetPenColor(bro);
    if (!(iType&ECoeAdjBottom))
        {
        aGc.DrawLine(pos,TPoint(aRect.iTl.iX-1,pos.iY));
        --pos.iY;
        }
    if (!(iType&ECoeAdjRight))
        {
        aGc.DrawLine(pos,TPoint(pos.iX,aRect.iTl.iY));
        --pos.iX;
        }
    aGc.SetPenColor(bri);
    delta=shadowDepth;
    if (!(iType&ECoeAdjLeft))
        ++delta;
    {for (TInt ii=0;ii<depth;++ii)
        {
        aGc.DrawLine(pos,TPoint(aRect.iTl.iX+ii+delta,pos.iY));
        --pos.iY;
        }}
    delta=shadowDepth;
    if (!(iType&ECoeAdjTop))
        ++delta;
    {for (TInt ii=0;ii<depth;++ii)
        {
        aGc.DrawLine(pos,TPoint(pos.iX,aRect.iTl.iY+ii+delta));
        --pos.iX;
        }}
    aGc.SetPenColor(KRgbBlack);
    }


void TEikBorder::DrawDeepRaisedWithOutline(CGraphicsContext& aGc,const TRect& aRect) const
// !!!This function is to enable different border styles to be tried. It is not written
// with efficiency in mind; it will be optimised when the border style has been
// finalised.
	{
	// left
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iTl.iX,aRect.iBr.iY));
    aGc.SetPenColor(KRgbWhite);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iTl.iX+1,aRect.iBr.iY));
	if (!(iType&ECoeAdjLeft))
		{
		aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY+2),TPoint(aRect.iTl.iX+2,aRect.iBr.iY));
		}

	// top
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iBr.iX,aRect.iTl.iY));
    aGc.SetPenColor(KRgbWhite);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX,aRect.iTl.iY+1));
	if (!(iType&ECoeAdjTop))
		{
	    aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY+2),TPoint(aRect.iBr.iX,aRect.iTl.iY+2));
		}

	// right
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iBr.iX-2,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
    if (!(iType&ECoeAdjRight))
		aGc.DrawLine(TPoint(aRect.iBr.iX-3,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-3,aRect.iBr.iY));
	
	// bottom
	aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iTl.iX,aRect.iBr.iY-1),TPoint(aRect.iBr.iX,aRect.iBr.iY-1));
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-2));
	if (!(iType&ECoeAdjBottom))
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iBr.iY-3),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-3));
	}


void TEikBorder::DrawThickDeepRaisedWithOutline(CGraphicsContext& aGc,const TRect& aRect) const
// !!!This function is to enable different border styles to be tried. It is not written
// with efficiency in mind; it will be optimised when the border style has been
// finalised.
	{
	// left
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iTl.iX,aRect.iBr.iY));
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iTl.iX+1,aRect.iBr.iY));
    aGc.SetPenColor(KRgbWhite);
	aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY+2),TPoint(aRect.iTl.iX+2,aRect.iBr.iY));
	aGc.DrawLine(TPoint(aRect.iTl.iX+3,aRect.iTl.iY+3),TPoint(aRect.iTl.iX+3,aRect.iBr.iY));

	if (!(iType&ECoeAdjLeft))
		{
		aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+4,aRect.iTl.iY+4),TPoint(aRect.iTl.iX+4,aRect.iBr.iY));
		}

	// top
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iBr.iX,aRect.iTl.iY));
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX,aRect.iTl.iY+1));
	
    aGc.SetPenColor(KRgbWhite);
	aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY+2),TPoint(aRect.iBr.iX,aRect.iTl.iY+2));
	aGc.DrawLine(TPoint(aRect.iTl.iX+3,aRect.iTl.iY+3),TPoint(aRect.iBr.iX,aRect.iTl.iY+3));
	
	if (!(iType&ECoeAdjTop))
		{
	    aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+4,aRect.iTl.iY+4),TPoint(aRect.iBr.iX,aRect.iTl.iY+4));
		}

	// right
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
	aGc.DrawLine(TPoint(aRect.iBr.iX-2,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iBr.iX-3,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-3,aRect.iBr.iY));
	aGc.DrawLine(TPoint(aRect.iBr.iX-4,aRect.iTl.iY+3),TPoint(aRect.iBr.iX-4,aRect.iBr.iY));
    
    if (!(iType&ECoeAdjRight))
		aGc.DrawLine(TPoint(aRect.iBr.iX-5,aRect.iTl.iY+4),TPoint(aRect.iBr.iX-5,aRect.iBr.iY));
	
	// bottom
	aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iTl.iX,aRect.iBr.iY-1),TPoint(aRect.iBr.iX,aRect.iBr.iY-1));
    aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-2));
	aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iBr.iY-3),TPoint(aRect.iBr.iX-2,aRect.iBr.iY-3));
	aGc.DrawLine(TPoint(aRect.iTl.iX+3,aRect.iBr.iY-4),TPoint(aRect.iBr.iX-3,aRect.iBr.iY-4));
	if (!(iType&ECoeAdjBottom))
		aGc.DrawLine(TPoint(aRect.iTl.iX+4,aRect.iBr.iY-5),TPoint(aRect.iBr.iX-4,aRect.iBr.iY-5));
	}


#define KEikBorderRaisedBorderColor KRgbBlack
void TEikBorder::DrawDeepRaised(CGraphicsContext& aGc,const TRect& aRect) const
// !!!This function is to enable different border styles to be tried. It is not written
// with efficiency in mind; it will be optimised when the border style has been
// finalised.
	{
	// left
    if (iType&ECoeAdjLeft)
		{
		aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(aRect.iTl,TPoint(aRect.iTl.iX,aRect.iBr.iY-1));
		//aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iTl.iX+1,aRect.iBr.iY-2));
		}
	else
		{
		aGc.SetPenColor(KEikBorderRaisedBorderColor);
		aGc.DrawLine(aRect.iTl,TPoint(aRect.iTl.iX,aRect.iBr.iY));
		aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iTl.iX+1,aRect.iBr.iY-2));
		//aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY+2),TPoint(aRect.iTl.iX+2,aRect.iBr.iY-3));
		}

	// top
	if (iType&ECoeAdjTop)
		{
		aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY),TPoint(aRect.iBr.iX-1,aRect.iTl.iY));
		//aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-2,aRect.iTl.iY+1));
		}
	else
		{
		aGc.SetPenColor(KEikBorderRaisedBorderColor);
		aGc.DrawLine(aRect.iTl,TPoint(aRect.iBr.iX,aRect.iTl.iY));
		aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-1,aRect.iTl.iY+1));
		//aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-2,aRect.iTl.iY+2));
		}

	// right
    const TInt topYPos=(iType&ECoeAdjTop? aRect.iTl.iY : aRect.iTl.iY+1);
	if ((iType&ECoeAdjRight))
		{
		aGc.SetPenColor(KRgbDarkGray);
		aGc.DrawLine(TPoint(aRect.iBr.iX-1,topYPos),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
		aGc.DrawLine(TPoint(aRect.iBr.iX-2,topYPos+1),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
		}
	else
		{
		aGc.SetPenColor(KEikBorderRaisedBorderColor);
		aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
		aGc.SetPenColor(KRgbDarkGray);
		aGc.DrawLine(TPoint(aRect.iBr.iX-2,topYPos),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
		aGc.DrawLine(TPoint(aRect.iBr.iX-3,topYPos+1),TPoint(aRect.iBr.iX-3,aRect.iBr.iY));
		}
	
	// bottom
	const TInt startXPos=(iType&ECoeAdjLeft? aRect.iTl.iX : aRect.iTl.iX+1);
	if ((iType&ECoeAdjBottom))
		{
		aGc.SetPenColor(KRgbDarkGray);
		aGc.DrawLine(TPoint(startXPos,aRect.iBr.iY-1),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-1));
		aGc.DrawLine(TPoint(startXPos+1,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-2));
		}
	else
		{
		aGc.SetPenColor(KEikBorderRaisedBorderColor);
		aGc.DrawLine(TPoint(aRect.iTl.iX,aRect.iBr.iY-1),TPoint(aRect.iBr.iX,aRect.iBr.iY-1));
		aGc.SetPenColor(KRgbDarkGray);
		aGc.DrawLine(TPoint(startXPos,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-2));
		aGc.DrawLine(TPoint(startXPos+1,aRect.iBr.iY-3),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-3));
		}
	}

void TEikBorder::DrawShallowRaised(CGraphicsContext& aGc,const TRect& aRect) const
// !!!This function is to enable different border styles to be tried. It is not written
// with efficiency in mind; it will be optimised when the border style has been
// finalised.
	{
	// left
    aGc.SetPenColor(KEikBorderRaisedBorderColor);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iTl.iX,aRect.iBr.iY));
    if (!(iType&ECoeAdjLeft))
		{
		aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iTl.iX+1,aRect.iBr.iY));
		}

	// top
    aGc.SetPenColor(KEikBorderRaisedBorderColor);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iBr.iX,aRect.iTl.iY));
	if (!(iType&ECoeAdjTop))
		{
		aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX,aRect.iTl.iY+1));
		}

	// right
    aGc.SetPenColor(KEikBorderRaisedBorderColor);
	aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
    if (!(iType&ECoeAdjRight))
		{
	    aGc.SetPenColor(KRgbDarkGray);
		aGc.DrawLine(TPoint(aRect.iBr.iX-2,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
		}
	
	// bottom
	aGc.SetPenColor(KEikBorderRaisedBorderColor);
	aGc.DrawLine(TPoint(aRect.iTl.iX,aRect.iBr.iY-1),TPoint(aRect.iBr.iX,aRect.iBr.iY-1));
	if (!(iType&ECoeAdjBottom))
		{
		aGc.SetPenColor(KRgbDarkGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-2));
		}
	}

void TEikBorder::DrawShallowSunken(CGraphicsContext& aGc,const TRect& aRect) const
// !!!This function is to enable different border styles to be tried. It is not written
// with efficiency in mind; it will be optimised when the border style has been
// finalised.
	{
	// left
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iTl.iX,aRect.iBr.iY));
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iTl.iX+1,aRect.iBr.iY));

	// top
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iBr.iX,aRect.iTl.iY));
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-1,aRect.iTl.iY+1));

	// right
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
	
	// bottom
	aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-1),TPoint(aRect.iBr.iX,aRect.iBr.iY-1));
	}

void TEikBorder::DrawDeepSunken(CGraphicsContext& aGc,const TRect& aRect) const
// !!!This function is to enable different border styles to be tried. It is not written
// with efficiency in mind; it will be optimised when the border style has been
// finalised.
	{
	// left
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iTl.iX,aRect.iBr.iY));
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iTl.iX+1,aRect.iBr.iY-1));
	if (!(iType&ECoeAdjLeft))
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY+2),TPoint(aRect.iTl.iX+2,aRect.iBr.iY-2));

	// top
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iBr.iX,aRect.iTl.iY));
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-1,aRect.iTl.iY+1));
	if (!(iType&ECoeAdjTop))
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-2,aRect.iTl.iY+2));

// do not delete, will probably go back to this plan
	// right
    aGc.SetPenColor(KRgbGray);
	aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
    if (!(iType&ECoeAdjRight))
		aGc.DrawLine(TPoint(aRect.iBr.iX-2,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
	
	// bottom
    aGc.SetPenColor(KRgbGray);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-1),TPoint(aRect.iBr.iX,aRect.iBr.iY-1));
	if (!(iType&ECoeAdjBottom))
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iBr.iY-2),TPoint(aRect.iBr.iX,aRect.iBr.iY-2));

	// right
/*    if ((iType&ECoeAdjRight))
		{
	    aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
		aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iBr.iX-2,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
		}
	else
		{
	    aGc.SetPenColor(KRgbDarkGray);
		aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
	    aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iBr.iX-2,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
		aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iBr.iX-3,aRect.iTl.iY+3),TPoint(aRect.iBr.iX-3,aRect.iBr.iY));
		}
	
	// bottom
	if ((iType&ECoeAdjBottom))
		{
	    aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-1),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-1));
	    aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-2,aRect.iBr.iY-2));
		}
	else
		{
	    aGc.SetPenColor(KRgbDarkGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-1),TPoint(aRect.iBr.iX,aRect.iBr.iY-1));
	    aGc.SetPenColor(KRgbWhite);
		aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-2));
	    aGc.SetPenColor(KRgbGray);
		aGc.DrawLine(TPoint(aRect.iTl.iX+3,aRect.iBr.iY-3),TPoint(aRect.iBr.iX-2,aRect.iBr.iY-3));
		}*/
	}

void TEikBorder::DrawDeepSunkenWithOutline(CGraphicsContext& aGc,const TRect& aRect) const
	{
	DrawDeepSunken(aGc,aRect);//!!! for now
	}

void TEikBorder::DrawVerticalBar(CGraphicsContext& aGc,const TRect& aRect) const
	{
	// left
    aGc.SetPenColor(KRgbWhite);
	aGc.DrawLine(TPoint(aRect.iTl.iX,aRect.iTl.iY+1),TPoint(aRect.iTl.iX,aRect.iBr.iY-1));
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iTl.iX+1,aRect.iBr.iY-2));

	// top
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iBr.iX,aRect.iTl.iY));
    aGc.SetPenColor(KRgbWhite);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-2,aRect.iTl.iY+1));
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-3,aRect.iTl.iY+2));

	// right
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-1));
	aGc.DrawLine(TPoint(aRect.iBr.iX-2,aRect.iTl.iY+2),TPoint(aRect.iBr.iX-2,aRect.iBr.iY-2));
	
	// bottom
	aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iTl.iX,aRect.iBr.iY-1),TPoint(aRect.iBr.iX,aRect.iBr.iY-1));
	aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-2));
	aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iBr.iY-3),TPoint(aRect.iBr.iX-2,aRect.iBr.iY-3));
	}

void TEikBorder::DrawHorizontalBar(CGraphicsContext& aGc,const TRect& aRect) const
	{
	// left
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(aRect.iTl,TPoint(aRect.iTl.iX,aRect.iBr.iY));
    aGc.SetPenColor(KRgbWhite);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY),TPoint(aRect.iTl.iX+1,aRect.iBr.iY));
	aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY),TPoint(aRect.iTl.iX+2,aRect.iBr.iY-1));

	// top
    aGc.SetPenColor(KRgbWhite);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iTl.iY),TPoint(aRect.iBr.iX-2,aRect.iTl.iY));
	aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-3,aRect.iTl.iY+1));

	// right
    aGc.SetPenColor(KRgbBlack);
	aGc.DrawLine(TPoint(aRect.iBr.iX-1,aRect.iTl.iY),TPoint(aRect.iBr.iX-1,aRect.iBr.iY));
    aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iBr.iX-2,aRect.iTl.iY),TPoint(aRect.iBr.iX-2,aRect.iBr.iY));
	aGc.DrawLine(TPoint(aRect.iBr.iX-3,aRect.iTl.iY+1),TPoint(aRect.iBr.iX-3,aRect.iBr.iY-1));
	
	// bottom
	aGc.SetPenColor(KRgbDarkGray);
	aGc.DrawLine(TPoint(aRect.iTl.iX+1,aRect.iBr.iY-1),TPoint(aRect.iBr.iX-1,aRect.iBr.iY-1));
	aGc.DrawLine(TPoint(aRect.iTl.iX+2,aRect.iBr.iY-2),TPoint(aRect.iBr.iX-2,aRect.iBr.iY-2));
	}
