// TCOMBO1.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <basched.h>
#include <e32keys.h>
#include <badesca.h>
#include <coecntrl.h>
#include <eikenv.h>
#include <eikappui.h>
#include <eikdef.h>
#include <eikcmbox.h>
#include <eikapp.h>
#include <eikdoc.h>

//
// class CTestContainer
//

class CTestContainer : public CCoeControl
	{
public:
	~CTestContainer();
	void ConstructL();
private: // framework
	TInt CountComponentControls() const;
	CCoeControl* ComponentControl(TInt aIndex) const;
	TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
	void Draw(const TRect& aRect) const; // here tempoarily !!!
private: // new functions
	void CreateCombosL();
private:
	CEikComboBox* iCombo[2];
	};

void CTestContainer::Draw(const TRect& /*aRect*/) const
	{
	iEikonEnv->FillTexturedRect(Rect());
	}

CTestContainer::~CTestContainer()
	{
	delete iCombo[0];
	delete iCombo[1];
	}

void CTestContainer::ConstructL()
	{
	CreateWindowL();
	Window().SetShadowDisabled(ETrue);
	EnableDragEvents();
	Window().SetPointerGrab(ETrue);
	CreateCombosL();
	SetExtentToWholeScreenL();
	ActivateL();
	iCombo[0]->SetFocus(ETrue);
	}

void CTestContainer::CreateCombosL()
	{
	iCombo[0]=new(ELeave) CEikComboBox;
	iCombo[0]->ConstructL(*this,10,10,5);
	CDesCArray* itemArray=new(ELeave) CDesCArrayFlat(5);
	itemArray->AppendL(_L("Item 1"));
	itemArray->AppendL(_L("Item 2"));
	itemArray->AppendL(_L("Item 3"));
	itemArray->AppendL(_L("Item 4xxxx"));
	iCombo[0]->SetArray(itemArray);
	iCombo[0]->SetExtentL(TPoint(100,50),iCombo[0]->MinimumSize());
	//
	iCombo[1]=new(ELeave) CEikComboBox;
	iCombo[1]->ConstructL(*this,10,10,5);
	CDesCArray* itemArray1=new(ELeave) CDesCArrayFlat(5);
	itemArray1->AppendL(_L("Item 1"));
	itemArray1->AppendL(_L("Item 2"));
	itemArray1->AppendL(_L("Item 3"));
	itemArray1->AppendL(_L("Item 4xxxx"));
	iCombo[1]->SetArray(itemArray1);
	TSize size=iCombo[1]->MinimumSize();
	size.iHeight*=2;
	size.iWidth+=50; // make this one bigger than it need be
	iCombo[1]->SetExtentL(TPoint(100,130),size);
	}

TKeyResponse CTestContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
	{
	if (aType!=EEventKey)
		return(EKeyWasNotConsumed);
	CEikComboBox* focused=(iCombo[0]->IsFocused()? iCombo[0] : iCombo[1]);
	TInt code=aKeyEvent.iCode;
	if (aKeyEvent.iModifiers&EModifierCtrl)
		{
		switch(code)
			{
		case CTRL('e'):
			CBaActiveScheduler::Exit();
		case CTRL('a'):
			iCombo[1]->SetFocus(EFalse);
			iCombo[0]->SetFocus(ETrue);
			break;
		case CTRL('b'):
			iCombo[0]->SetFocus(EFalse);
			iCombo[1]->SetFocus(ETrue);
			break;
		default:
			focused->OfferKeyEventL(aKeyEvent,aType);
			}
		}
	else
		{
		switch (code)
			{
		case EKeyEnter:
			focused->InsertTextIntoArrayL();
			break;
		case EKeyEscape:
			{
			CDesCArray* desCArray=((CDesCArray*)focused->Array());
			if(desCArray->Count()>0)
				focused->SetTextL(&((*desCArray)[0]));
			else
				{
				TPtrC ptr;
				focused->SetTextL(&ptr);
				}
			break;
			}
		default:
			focused->OfferKeyEventL(aKeyEvent,aType);
			}
		}
	return(EKeyWasConsumed);
	}

TInt CTestContainer::CountComponentControls() const
	{
	return 2;
	}

CCoeControl* CTestContainer::ComponentControl(TInt aIndex) const
	{
	if (aIndex<2)
		return iCombo[aIndex];
	return NULL;
	}

//
// CComboAppUi
//

class CComboAppUi : public CEikAppUi
	{
public:
	~CComboAppUi();
	void ConstructL();
private: // framework
private:
	CTestContainer* iContainer;
	};

CComboAppUi::~CComboAppUi()
	{
	delete(iContainer);
	}

void CComboAppUi::ConstructL()
	{
	BaseConstructL(ENoAppResourceFile);
	iContainer=new(ELeave) CTestContainer;
	iContainer->ConstructL();
	AddToStackL(iContainer);
	}

//
// CComboDocument
//

class CComboDocument : public CEikDocument
	{
public:
	CComboDocument(CEikApplication& aApp): CEikDocument(aApp) { }
private: // from CApaDocument
	CEikAppUi* CreateAppUiL();
	};

CEikAppUi* CComboDocument::CreateAppUiL()
	{
    return(new(ELeave) CComboAppUi);
	}

//
// CComboApplication
//

class CComboApplication : public CEikApplication
	{
private: // from CApaApplication
	CApaDocument* CreateDocumentL();
	TUid AppDllUid() const;
	TFileName ResourceFileName() const;
	};

TFileName CComboApplication::ResourceFileName() const
	{
	TPtrC empty;
	return(empty);
	}

const TUid KUidComboApp={232};

TUid CComboApplication::AppDllUid() const
	{
	return(KUidComboApp);
	}

CApaDocument* CComboApplication::CreateDocumentL()
	{
	return(new(ELeave) CComboDocument(*this));
	}

//
// EXPORTed functions
//

EXPORT_C CApaApplication* NewApplication()
	{
	return(new CComboApplication);
	}

GLDEF_C TInt E32Dll(TDllReason)
	{
	return(KErrNone);
	}
