// TRNGED.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <e32keys.h>
#include <bacell.h>
#include <basched.h>
#include <barsread.h>
#include <coecntrl.h>
#include <eikdef.h>
#include <eikenv.h>
#include <eikappui.h>
#include <eikdialg.h>
#include <eikdialg.hrh>
#include <eikcmds.hrh>
#include <eikfctry.h>
#include <eikmfne.h>
#include <eikmfne.hrh>
#include <eikrnged.h>
#include <eikapp.h>
#include <eikdoc.h>
#include <eikon.rsg>
#include <trnged.rsg>
#include "trnged.hrh"

enum TTRngedPanic
	{
	ETRngedPanicBadFieldType,
	ETRngedPanicWrongControlType1,
	ETRngedPanicWrongControlType2,
	ETRngedPanicBadCommand
	};

LOCAL_C void Panic(TTRngedPanic aPanic)
	{
	User::Panic(_L("TRnged"), aPanic);
	}

//
// CTstDialog
//

class CTstDialog : public CEikDialog
	{
public:
	static TInt CreateAndRunLD(TRangeRef& aRangeRef);
private:
	CTstDialog();
	// framework
	virtual SEikControlInfo CreateCustomControlL(TInt aControlType);
	virtual void GetCustomAutoValue(TAny* aReturnValue, TInt aControlType, const CCoeControl* aControl);
private:
	enum
		{
		EControlId=1,
		EControlType=1000
		};
private:
	};

TInt CTstDialog::CreateAndRunLD(TRangeRef& aRangeRef)
	{
	CTstDialog* dialog=new(ELeave) CTstDialog;
	dialog->ConstructAutoDialogLC(EEikDialogFlagWait, R_EIK_BUTTONS_CANCEL_OK);
	dialog->SetTitleL(_L("Dialog no resource"));
	CEikRangeRefEditor* rangeRefEditor=(CEikRangeRefEditor*)dialog->CreateLineByTypeL(_L("Cell range"), EControlId, EControlType, &aRangeRef);
	HBufC* separatorText=HBufC::NewLC(1);
	*separatorText=_L(":");
	rangeRefEditor->ConstructL(TCellRef(0, 0), TCellRef(200, 200), aRangeRef, separatorText);
	CleanupStack::Pop();
	return dialog->RunLD();
	}

CTstDialog::CTstDialog()
	{
	__DECLARE_NAME(_S("CTstDialog"));
	}

SEikControlInfo CTstDialog::CreateCustomControlL(TInt aControlType)
	{
	__ASSERT_DEBUG(aControlType==EControlType,Panic(ETRngedPanicWrongControlType1));
	SEikControlInfo controlInfo;
	controlInfo.iControl=new(ELeave) CEikRangeRefEditor;
	controlInfo.iTrailerTextId=0;
	controlInfo.iFlags=0;
	return controlInfo;
	}

void CTstDialog::GetCustomAutoValue(TAny* aReturnValue, TInt aControlType, const CCoeControl* aControl)
	{
	__ASSERT_DEBUG(aControlType==EControlType,Panic(ETRngedPanicWrongControlType2));
	*(TRangeRef*)aReturnValue=((CEikRangeRefEditor*)aControl)->RangeRef();
	}

class CTestDialog : public CEikDialog
	{
private:
	// framework
    virtual TBool OkToExitL(TInt aButtonId);
private:
	enum
		{
		EControlId=1,
		EControlType=1000
		};
	};

TBool CTestDialog::OkToExitL(TInt /*aButtonId*/)
	{
	return ETrue;
	}
//
// CTstContainer
//

class CTstContainer : public CCoeControl
	{
public:
	CTstContainer();
	void ConstructL(const TRect& aRect);
	void HandleCommandL(TInt aCommand);
private:
	// framework
	void Draw(const TRect& aRect) const;
	};

CTstContainer::CTstContainer()
	{
	__DECLARE_NAME(_S("CTstContainer"));
	}

void CTstContainer::ConstructL(const TRect& aRect)
	{
	CreateWindowL();
	Window().SetBackgroundColor(TRgb(170, 170, 170));
	SetRectL(aRect);
	ActivateL();
	}

void CTstContainer::HandleCommandL(TInt aCommand)
	{
	switch (aCommand)
		{
	case ETRngedCmdDialogNoResource:
		{
		TRangeRef rangeRef(TCellRef(1, 5), TCellRef(2, 10));
		if (CTstDialog::CreateAndRunLD(rangeRef))
			{
			TBuf<128> buffer=_L("");
			buffer.Format(_L("(%d, %d), (%d, %d)"), rangeRef.iFrom.iRow, rangeRef.iFrom.iCol, rangeRef.iTo.iRow, rangeRef.iTo.iCol);
			iEikonEnv->InfoMsg(buffer);
			}
		}
		break;
	case ETRngedCmdDialog:
		{
		CTestDialog* dialog = new(ELeave) CTestDialog;
		dialog->ExecuteLD(R_TRNGED_DIALOG);
		}
		break;
	case EEikCmdExit:
		CBaActiveScheduler::Exit();
		break;
	default:
		Panic(ETRngedPanicBadCommand);
		}
	}

void CTstContainer::Draw(const TRect&) const
	{
	iEikonEnv->FillTexturedRect(Rect());
	}

//
// CTstAppUi
//

class CTstAppUi : public CEikAppUi
	{
public:
	void ConstructL();
	virtual ~CTstAppUi();
private: // framework
	virtual void HandleCommandL(TInt aCommand);
private:
	CTstContainer* iContainer;
	};

void CTstAppUi::ConstructL()
	{
	BaseConstructL();
	CreateHotKeyControlL(R_TRNGED_HOTKEYS);
	iContainer=new(ELeave) CTstContainer;
	iContainer->ConstructL(ClientRect());
	AddToStackL(iContainer);
	}

CTstAppUi::~CTstAppUi()
	{
	delete iContainer;
	}

void CTstAppUi::HandleCommandL(TInt aCommand)
	{
	iContainer->HandleCommandL(aCommand);
	}

//
// CTstDocument
//

class CTstDocument : public CEikDocument
	{
public:
	CTstDocument(CEikApplication& aApp): CEikDocument(aApp) { }
private: // from CApaDocument
	CEikAppUi* CreateAppUiL();
	};

CEikAppUi* CTstDocument::CreateAppUiL()
	{
    return(new(ELeave) CTstAppUi);
	}

//
// CTstApplication
//

class CTstApplication : public CEikApplication
	{
private: // from CApaApplication
	CApaDocument* CreateDocumentL();
	TUid AppDllUid() const;
	};

const TUid KUidTstApp={202};

TUid CTstApplication::AppDllUid() const
	{
	return(KUidTstApp);
	}

CApaDocument* CTstApplication::CreateDocumentL()
	{
	return(new(ELeave) CTstDocument(*this));
	}

//
// EXPORTed functions
//

EXPORT_C CApaApplication* NewApplication()
	{
	return(new CTstApplication);
	}

GLDEF_C TInt E32Dll(TDllReason)
	{
	return(KErrNone);
	}
