// EIKOBJFM.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <apparc.h>
#include <apgdoor.h>
#include <eikobjfm.h>
#include <eikenv.h>
#include <eikapp.h>
#include <eikchkbx.h>
#include <eikpanic.h>
#include <eikpriv.hrh>
#include <eikon.rsg>

//
// class CEikFormatObjectDialog
//

EXPORT_C CEikFormatObjectDialog::CEikFormatObjectDialog(CApaDoor& aDoor,CApaDocument& aDoc,const TSize& aDefaultIconSize)
	:iDoor(aDoor),
	iDocument(aDoc),
	iGlassDoorCapability(TPictureCapability::ENotScaleable,EFalse),
	iIconSizeInTwips(aDefaultIconSize)
    {
 	iDoorFormat = iDoor.Format();
	}

void CEikFormatObjectDialog::PreLayoutDynInitL()
    {
	// 1st page
	// set the checkbox correctly (ie set, unset or dimmed)
	CEikCheckBox* checkBox=STATIC_CAST(CEikCheckBox*,Control(EEikCidObjectFormatIconicCheckBox));
	CApaDocument::TCapability capability=iDocument.Capability();
	if (!capability.CanDrawGlass())
		{
		iGlassDoorCapability=TPictureCapability(TPictureCapability::ENotScaleable,EFalse);
		checkBox->SetState(CEikButtonBase::ESet);
		SetLineDimmedNow(EEikCidObjectFormatIconicCheckBox,ETrue);
		ResetScaleCropControlsL(); // gives all controls "icon" values
		UpdateObjectFormat(CApaDoor::EIconic);
		}
	else 
		{
		if (iDoor.Format()==CApaDoorBase::EIconic)
			{
			CPicture* glassDoor = iDoor.DocumentL()->GlassPictureL();
			SetGlassDoorInfo(*glassDoor);	
			delete glassDoor;
			checkBox->SetState(CEikButtonBase::ESet);
			iDoor.GetSizeInTwips(iIconSizeInTwips);
			ResetScaleCropControlsL(); // gives all controls "icon" values
			UpdateObjectFormat(CApaDoor::EIconic);
			}
		else
			{
			SetGlassDoorInfo(iDoor);	
			checkBox->SetState(CEikButtonBase::EClear);
			SetScaleCropControlsL(); // gives all controls "glass door" settings
			UpdateObjectFormat(CApaDoor::EGlassDoor);
			}
		// check crop for sanity
		__ASSERT_ALWAYS(iGlassDoorCropInTwips.iLeft+iGlassDoorCropInTwips.iRight<=iOriginalGlassDoorSizeInTwips.iWidth,Panic(EEikPanicIllegalCrop));
		__ASSERT_ALWAYS(iGlassDoorCropInTwips.iTop+iGlassDoorCropInTwips.iBottom<=iOriginalGlassDoorSizeInTwips.iHeight,Panic(EEikPanicIllegalCrop));
		__ASSERT_ALWAYS(iGlassDoorCropInTwips.iTop>=0,Panic(EEikPanicIllegalCrop));
		__ASSERT_ALWAYS(iGlassDoorCropInTwips.iBottom>=0,Panic(EEikPanicIllegalCrop));
		__ASSERT_ALWAYS(iGlassDoorCropInTwips.iLeft>=0,Panic(EEikPanicIllegalCrop));
		__ASSERT_ALWAYS(iGlassDoorCropInTwips.iRight>=0,Panic(EEikPanicIllegalCrop));
		}
	//
	// set the text of the caption
	TDesC* caption=iDoor.Caption();
	if (caption->Length())
		SetLabelL(EEikCidObjectFormatDlgLabel,*caption);
	else
		SetLabelL(EEikCidObjectFormatDlgLabel,((CEikApplication*)(iDoor.DocumentL()->Application()))->AppCaption());
	}

void CEikFormatObjectDialog::SetGlassDoorInfo(const CPicture& aGlassDoor)
	{
	aGlassDoor.GetCropInTwips(iGlassDoorCropInTwips);
	aGlassDoor.GetOriginalSizeInTwips(iOriginalGlassDoorSizeInTwips);
	iGlassDoorScaleFactorWidth = aGlassDoor.ScaleFactorWidth();
	iGlassDoorScaleFactorHeight = aGlassDoor.ScaleFactorHeight();
	iGlassDoorCapability = aGlassDoor.Capability();
	}

void CEikFormatObjectDialog::SetScaleCropControlsL()  
	{
	// scaling
	SetFixedPointEditorValueL(EEikCidPictureScaleWidth,iGlassDoorScaleFactorWidth);
	SetFixedPointEditorValueL(EEikCidPictureScaleHeight,iGlassDoorScaleFactorHeight);
	//
	// displayed width
	TInt displayWidth=((iGlassDoorScaleFactorWidth)*(iOriginalGlassDoorSizeInTwips.iWidth-iGlassDoorCropInTwips.iLeft-iGlassDoorCropInTwips.iRight))/1000;
	SetTwipsEditorValueL(EEikCidPictureDisplayWidth,&displayWidth);
	//
	// displayed height
	TInt displayHeight=((iGlassDoorScaleFactorHeight)*(iOriginalGlassDoorSizeInTwips.iHeight-iGlassDoorCropInTwips.iTop-iGlassDoorCropInTwips.iBottom))/1000;
	SetTwipsEditorValueL(EEikCidPictureDisplayHeight,&displayHeight);
	//
	// cropping
	TMargins cropFactor;
	cropFactor.iLeft = 1000*iGlassDoorCropInTwips.iLeft/iOriginalGlassDoorSizeInTwips.iWidth;
	cropFactor.iRight = 1000*iGlassDoorCropInTwips.iRight/iOriginalGlassDoorSizeInTwips.iWidth;
	cropFactor.iTop = 1000*iGlassDoorCropInTwips.iTop/iOriginalGlassDoorSizeInTwips.iHeight;
	cropFactor.iBottom = 1000*iGlassDoorCropInTwips.iBottom/iOriginalGlassDoorSizeInTwips.iHeight;
	SetFixedPointEditorValueL(EEikCidPictureCropLeft,cropFactor.iLeft);
	SetFixedPointEditorValueL(EEikCidPictureCropRight,cropFactor.iRight);
	SetFixedPointEditorValueL(EEikCidPictureCropTop,cropFactor.iTop);
	SetFixedPointEditorValueL(EEikCidPictureCropBottom,cropFactor.iBottom);
	}
									 
void CEikFormatObjectDialog::ResetScaleCropControlsL()  
	{// this method wont be necessary once whole dialog pages can be dimmed
	SetFixedPointEditorValueL(EEikCidPictureScaleWidth,1000);
	SetFixedPointEditorValueL(EEikCidPictureScaleHeight,1000);
	//
	SetTwipsEditorValueL(EEikCidPictureDisplayWidth,&iIconSizeInTwips.iWidth);
	//
	SetTwipsEditorValueL(EEikCidPictureDisplayHeight,&iIconSizeInTwips.iHeight);
	//
	TInt num=0;
	SetTwipsEditorValueL(EEikCidPictureCropLeft,&num);
	SetTwipsEditorValueL(EEikCidPictureCropRight,&num);
	SetTwipsEditorValueL(EEikCidPictureCropTop,&num);
	SetTwipsEditorValueL(EEikCidPictureCropBottom,&num);
	}

									 
void CEikFormatObjectDialog::HandleControlStateChangeL(TInt aControlId)  
	{
	//page 1
	if (aControlId==EEikCidObjectFormatIconicCheckBox)
		{
		CEikCheckBox* checkBox = ((CEikCheckBox*)Control(EEikCidObjectFormatIconicCheckBox));
		if (checkBox->State()==CEikButtonBase::ESet)
			{// dim all controls on the other two panels
			ResetScaleCropControlsL();
			UpdateObjectFormat(CApaDoor::EIconic);
			}
		else
			{
			SetScaleCropControlsL();
			UpdateObjectFormat(CApaDoor::EGlassDoor);
			}
		}
	//
	//page 2
	if (aControlId==EEikCidPictureScaleWidth)
		iChangedFlag|=EPictureScaleWidthChanged;
	else if (aControlId==EEikCidPictureScaleHeight)
		iChangedFlag|=EPictureScaleHeightChanged;
	else if (aControlId==EEikCidPictureDisplayWidth)
		iChangedFlag|=EPictureDisplayWidthChanged;
	else if (aControlId==EEikCidPictureDisplayHeight)
		iChangedFlag|=EPictureDisplayHeightChanged;
	//
	//page 3
	if (aControlId==EEikCidPictureCropLeft || aControlId==EEikCidPictureCropRight)
		iChangedFlag|=EPictureCropLeftRightChanged;
	else if (aControlId==EEikCidPictureCropTop || aControlId==EEikCidPictureCropBottom)
		iChangedFlag|=EPictureCropTopBottomChanged;
	}

void CEikFormatObjectDialog::UpdateObjectFormat(CApaDoor::TFormat aFormat)
	{
	// nb icons are never scalable or croppable
	if (iGlassDoorCapability.iScalingType==TPictureCapability::ENotScaleable || aFormat==CApaDoorBase::EIconic)
		{// dim the scaling controls
		SetLineDimmedNow(EEikCidPictureScaleWidth,ETrue);
		SetLineDimmedNow(EEikCidPictureScaleHeight,ETrue);
		SetLineDimmedNow(EEikCidPictureDisplayWidth,ETrue);
		SetLineDimmedNow(EEikCidPictureDisplayHeight,ETrue);
		}
	else
		{// undim them
		SetLineDimmedNow(EEikCidPictureScaleWidth,EFalse);
		SetLineDimmedNow(EEikCidPictureScaleHeight,EFalse);
		SetLineDimmedNow(EEikCidPictureDisplayWidth,EFalse);
		SetLineDimmedNow(EEikCidPictureDisplayHeight,EFalse);
		}
	if ((!iGlassDoorCapability.iIsCroppable)||(aFormat==CApaDoor::EIconic))
		{// dim the cropping controls
		SetLineDimmedNow(EEikCidPictureCropLeft,ETrue);
		SetLineDimmedNow(EEikCidPictureCropRight,ETrue);
		SetLineDimmedNow(EEikCidPictureCropTop,ETrue);
		SetLineDimmedNow(EEikCidPictureCropBottom,ETrue);
		}
	else
		{// undim them
		SetLineDimmedNow(EEikCidPictureCropLeft,EFalse);
		SetLineDimmedNow(EEikCidPictureCropRight,EFalse);
		SetLineDimmedNow(EEikCidPictureCropTop,EFalse);
		SetLineDimmedNow(EEikCidPictureCropBottom,EFalse);
		}
	}

void CEikFormatObjectDialog::PrepareForFocusTransitionL()
    {
	TSize originalSizeInTwips(0,0);
	iDoor.GetOriginalSizeInTwips(originalSizeInTwips);
	CEikDialog::PrepareForFocusTransitionL();
	//
	// page 3
	if (iChangedFlag&EPictureCropLeftRightChanged)
		{
		TInt leftCropFactor = TwipsEditorValue(EEikCidPictureCropLeft);
		TInt rightCropFactor = TwipsEditorValue(EEikCidPictureCropRight);
		if (leftCropFactor+rightCropFactor>1000)
			iEikonEnv->LeaveWithInfoMsg(R_EIK_INVALID_CROP_MARGIN);
		iGlassDoorCropInTwips.iLeft = originalSizeInTwips.iWidth*leftCropFactor/1000;
		iGlassDoorCropInTwips.iRight = originalSizeInTwips.iWidth*rightCropFactor/1000;
		iChangedFlag&=(~EPictureCropLeftRightChanged);
		iChangedFlag|=EPictureScaleWidthChanged; // so that the other page is adjusted
		}
	else if (iChangedFlag&EPictureCropTopBottomChanged)
		{
		TInt topCropFactor = TwipsEditorValue(EEikCidPictureCropTop);
		TInt bottomCropFactor = TwipsEditorValue(EEikCidPictureCropBottom);
		if (topCropFactor+bottomCropFactor>1000)
			iEikonEnv->LeaveWithInfoMsg(R_EIK_INVALID_CROP_MARGIN);
		iGlassDoorCropInTwips.iTop = originalSizeInTwips.iHeight*topCropFactor/1000;
		iGlassDoorCropInTwips.iBottom = originalSizeInTwips.iHeight*bottomCropFactor/1000;
		iChangedFlag&=(~EPictureCropTopBottomChanged);
		iChangedFlag|=EPictureScaleHeightChanged; // so that the other page is adjusted
		}
	//
	// page 2
	if (iChangedFlag&EPictureScaleWidthChanged)
		{
		iGlassDoorScaleFactorWidth=FixedPointEditorValue(EEikCidPictureScaleWidth);
		TInt displayWidth=(iGlassDoorScaleFactorWidth*(originalSizeInTwips.iWidth-iGlassDoorCropInTwips.iLeft-iGlassDoorCropInTwips.iRight))/1000;
		SetTwipsEditorValueL(EEikCidPictureDisplayWidth,&displayWidth);
		iChangedFlag&=(~EPictureScaleWidthChanged);
		}
	else if (iChangedFlag&EPictureScaleHeightChanged)
		{
		iGlassDoorScaleFactorHeight=FixedPointEditorValue(EEikCidPictureScaleHeight);
		TInt displayHeight=(iGlassDoorScaleFactorHeight*(originalSizeInTwips.iHeight-iGlassDoorCropInTwips.iTop-iGlassDoorCropInTwips.iBottom))/1000;
		SetTwipsEditorValueL(EEikCidPictureDisplayHeight,&displayHeight);
		iChangedFlag&=(~EPictureScaleHeightChanged);
		}
 	else if (iChangedFlag&EPictureDisplayWidthChanged)
		{
		TInt displayWidth=TwipsEditorValue(EEikCidPictureDisplayWidth);
		iGlassDoorScaleFactorWidth=(displayWidth*1000)/(originalSizeInTwips.iWidth-iGlassDoorCropInTwips.iLeft-iGlassDoorCropInTwips.iRight);
		SetFixedPointEditorValueL(EEikCidPictureScaleWidth,iGlassDoorScaleFactorWidth);
		displayWidth=(iGlassDoorScaleFactorWidth*(originalSizeInTwips.iWidth-iGlassDoorCropInTwips.iLeft-iGlassDoorCropInTwips.iRight))/1000;
		SetTwipsEditorValueL(EEikCidPictureDisplayWidth,&displayWidth); //Make sure no rounding error
		iChangedFlag&=(~EPictureDisplayWidthChanged);
		}
	else if (iChangedFlag&EPictureDisplayHeightChanged)
		{
		TInt displayHeight=TwipsEditorValue(EEikCidPictureDisplayHeight);
		iGlassDoorScaleFactorHeight=(displayHeight*1000)/(originalSizeInTwips.iHeight-iGlassDoorCropInTwips.iTop-iGlassDoorCropInTwips.iBottom);
		SetFixedPointEditorValueL(EEikCidPictureScaleHeight,iGlassDoorScaleFactorHeight);
		displayHeight=(iGlassDoorScaleFactorHeight*(originalSizeInTwips.iHeight-iGlassDoorCropInTwips.iTop-iGlassDoorCropInTwips.iBottom))/1000;
		SetTwipsEditorValueL(EEikCidPictureDisplayHeight,&displayHeight);
		iChangedFlag&=(~EPictureDisplayHeightChanged);
		}
	}

TBool CEikFormatObjectDialog::OkToExitL(TInt /*aButtonId*/)
    {
	// set iconic or otherwise...
	CEikCheckBox* checkBox = ((CEikCheckBox*)Control(EEikCidObjectFormatIconicCheckBox));
	if (checkBox->State()==CEikButtonBase::ESet)
		{
		iDoorFormat = CApaDoorBase::EIconic;
		if (iDoorFormat!=iDoor.Format())
			iDoor.SetFormatToIconL();
		}
	else
		{
		iDoorFormat = CApaDoorBase::EGlassDoor;
		if (iDoorFormat!=iDoor.Format())
			iDoor.SetFormatToGlassL();
		}
	//
	TPictureCapability capability=iDoor.Capability();
	//
	// page 2
	if (capability.iScalingType!=TPictureCapability::ENotScaleable)
		{
		iGlassDoorScaleFactorWidth=FixedPointEditorValue(EEikCidPictureScaleWidth);
		iGlassDoorScaleFactorHeight=FixedPointEditorValue(EEikCidPictureScaleHeight);
		iDoor.SetScaleFactor(iGlassDoorScaleFactorWidth,iGlassDoorScaleFactorHeight);
		}
	//
	//page 3
	if (capability.iIsCroppable)
		{
		TSize originalSize;
		iDoor.GetOriginalSizeInTwips(originalSize);
		iGlassDoorCropInTwips.iLeft = TwipsEditorValue(EEikCidPictureCropLeft)*originalSize.iWidth/1000;
		iGlassDoorCropInTwips.iRight = TwipsEditorValue(EEikCidPictureCropRight)*originalSize.iWidth/1000;
		iGlassDoorCropInTwips.iTop = TwipsEditorValue(EEikCidPictureCropTop)*originalSize.iHeight/1000;
		iGlassDoorCropInTwips.iBottom = TwipsEditorValue(EEikCidPictureCropBottom)*originalSize.iHeight/1000;
		iDoor.SetCropInTwips(iGlassDoorCropInTwips);
		}
	//
	return(ETrue);
    }

//
// CEikObjectInfoDialog
//

EXPORT_C CEikObjectInfoDialog::CEikObjectInfoDialog(const TDesC& aCaption)
	:iCaption(aCaption)
	{}

void CEikObjectInfoDialog::PreLayoutDynInitL()
	{
	// set the text of the caption
	SetLabelL(EEikCidObjectFormatDlgLabel,iCaption);
	}
