// EIKMOVER.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <eikmover.h>
#include <eikgrip.h>
#include <barsread.h>
#include <eikenv.h>

#include <eikcolor.h>

const TInt KEikMoverMargin=3; 
const TInt KEikMoverTextPadding=10;
const TInt KEikMoverMinLineLength=10;

enum TEikMoverFlags
	{
	EEikMoverActive		=0x01,
	EEikMoverPressed	=0x02
	};

EXPORT_C CEikMover::~CEikMover()
    {
    delete(iText);
    }

EXPORT_C CEikMover::CEikMover()
	{
	__DECLARE_NAME(_S("CEikMover"));
	SetNonFocusing();
	iFont=iEikonEnv->NormalFont();
	iTitleLeftMargin = KEikMoverMargin;
	}

EXPORT_C void CEikMover::SetContainerWindowL(const CCoeControl& aContainer)
	{
	CCoeControl::SetContainerWindowL(aContainer);
	iParentControl=&((CCoeControl&)aContainer);
	}

EXPORT_C void CEikMover::SetTitleLeftMargin(TInt aLeftMargin)
	{
	iTitleLeftMargin = aLeftMargin;
	}

EXPORT_C void CEikMover::SetText(HBufC* aText)
    {
	if (iText!=aText)
		delete iText;
    iText=aText;
    }

EXPORT_C void CEikMover::SetTextL(const TDesC& aText)
    {
    HBufC* tmp=aText.AllocL();
    delete(iText);
    iText=tmp;
    }

EXPORT_C void CEikMover::ConstructFromResourceL(TResourceReader& aReader)
    {
    iText=aReader.ReadHBufCL();
    }

EXPORT_C void CEikMover::SetActive(TBool aActive)
	{
	if (aActive)
		iMoverFlags|=EEikMoverActive;
	else
		iMoverFlags&=(~(EEikMoverActive|EEikMoverPressed));
	}

EXPORT_C TBool CEikMover::Active() const
	{
	return iMoverFlags&EEikMoverActive;
	}

EXPORT_C void CEikMover::SetFont(const CFont* aFont)
	{
	// if pointer is null use the title font
	iFont=(aFont)? aFont : iEikonEnv->NormalFont();
	}

EXPORT_C TSize CEikMover::MinimumSize()
    {
	TSize size;
    size.iWidth=2*KEikMoverMargin+2*KEikMoverTextPadding+2*KEikMoverMinLineLength;
	if (iText)
    	size.iWidth+=iFont->TextWidthInPixels(*iText);
    size.iHeight=iFont->HeightInPixels()+2*KEikMoverMargin;
	return size;
    }

EXPORT_C void CEikMover::Draw(const TRect& /*aRect*/) const
    {
	CWindowGc& gc=SystemGc();
    TRect rect=Rect();
	const TRgb bgColor=iEikonEnv->ControlColor((iMoverFlags&EEikMoverPressed? 
							EEikColorDialogTitlePressed : EEikColorDialogTitle),*this);
	const TRgb textColor=iEikonEnv->ControlColor((iMoverFlags&EEikMoverPressed?
							EEikColorDialogTitleTextPressed : EEikColorDialogTitleText),*this);
	gc.SetBrushColor(bgColor);
	gc.Clear(rect);
	gc.SetPenColor(KRgbGray);
	gc.DrawLine(TPoint(rect.iTl.iX,rect.iBr.iY-1),TPoint(rect.iBr.iX,rect.iBr.iY-1));

	// TInt textWidth=iText? iFont->TextWidthInPixels(*iText): 0;
	TRect textRect=rect;
	textRect.iTl.iX += iTitleLeftMargin;
	//textRect.Shrink((Size().iWidth-(textWidth+2*KEikMoverMargin))/2,0);
	// draw the text
    gc.SetPenColor(textColor);
	gc.SetBrushStyle(CGraphicsContext::ENullBrush);
	gc.UseFont(iFont);
	const TInt ascent=iFont->AscentInPixels();
	const TInt fontHeight=iFont->HeightInPixels();
	const TInt offset=(textRect.Height()+1)/2+(ascent-((fontHeight+1)/2));
    gc.DrawText(iText? TPtrC(*iText): TPtrC(),textRect,offset,CGraphicsContext::ELeft);
	
	// draw the grips
/*
	if (iMoverFlags&EEikMoverActive)
		{
		TEikGrip grip(TEikGrip::EHorizontal);
		TRect gripRect(rect.iTl, TPoint(textRect.iTl.iX, textRect.iBr.iY));
		gripRect.Shrink(0,KEikMoverMargin);
		gripRect.iTl.iX+=KEikMoverMargin;
		gripRect.iBr.iX-=KEikMoverTextPadding;
		grip.Draw(gc,gripRect);
		gripRect.iTl=TPoint(textRect.iBr.iX, textRect.iTl.iY);
		gripRect.iBr=rect.iBr;
		gripRect.Shrink(0,KEikMoverMargin);
		gripRect.iBr.iX-=KEikMoverMargin;
		gripRect.iTl.iX+=KEikMoverTextPadding;
		grip.Draw(gc,gripRect);
		}
*/
    }

EXPORT_C void CEikMover::HandlePointerEventL(const TPointerEvent& aPointerEvent)
    {
	if (!Active())
		return;
    TBool recordPos=ETrue;
    TPoint pos=aPointerEvent.iParentPosition; // !! should be relative to screen not to parent (see below...)
    TPointerEvent::TType type=aPointerEvent.iType;
    if (type==TPointerEvent::EButton1Down)
		{
		iMoverFlags|=EEikMoverPressed;
		DrawNow();
		}
    else
        {
        TRect screenRect(TPoint(0,0),iEikonEnv->ScreenDevice()->SizeInPixels());
        screenRect.Shrink(2,2);
        if (!screenRect.Contains(pos)) // !! this assumes parent window is screen (see above...)
            recordPos=EFalse;
        else
            {
            TPoint offset=pos-iPointerDownPos;
            if (offset.iX || offset.iY)
                {
                TPoint origin=Window().Position();
				if (iParentControl)
					iParentControl->SetPosition(origin+offset);
                }
            }
        if (type==TPointerEvent::EButton1Up)
			{
			iMoverFlags&=(~EEikMoverPressed);
			DrawNow();
			}
        }
    if (recordPos)
        iPointerDownPos=pos;
    }

//
// Reserved functions from CCoeControl
//

EXPORT_C void CEikMover::Reserved_1()
	{
	}

EXPORT_C void CEikMover::Reserved_2()
	{
	}


