// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code 
*/

#ifndef __TSTAPP_H__
#define __TSTAPP_H__

#if !defined(__APPARC_H__)
#include <apparc.h>
#endif

#include <eikapp.h>
#include <eikdoc.h>
#include <apgdoor.h>
#include <eikappui.h>

// classes defined:
class CTestApp;
class CTestAppDoc;
//

#define KTestAppDefaultFileName _L("TestApp.doc")
const TInt KTestAppUidValue=10;
const TUid KUidTestApp={KTestAppUidValue};
const TUid KUidTestAppHeadStream={200};
const TInt KNarrowRelUidValue=268435578;
const TUid KUidNarrowRel={KNarrowRelUidValue}; // so it'll run under arm...
#define KTestAppUidType TUidType(KUidNarrowRel,KUidApp,KUidTestApp)


class CTestApp : public CEikApplication
	{
public:
	static CTestApp* NewL(); // the gated function
	// from CApaApplication
	void PreDocConstructL();
	CEikDocument* CreateDocumentL();
	TDesC& Caption(); // return the app title in current system language
	TUid AppDllUid()const;
	
	CDictionaryStore* OpenIniFileLC(RFs& aFs)const;
	void Capability(TDes8& aInfo)const;
	~CTestApp();

private:
	CTestApp();
	void ConstructL();
	
private:
	TBuf<8> iCaption;
	RFs iFs;
	};

class CBasicAppUi : public CEikAppUi
	{
public:
	inline CBasicAppUi() {}
private:
	virtual void ConstructL();
	};

class CTestAppDoc : public CEikDocument, public MApaEmbeddedDocObserver
	{
public:
	static CTestAppDoc* NewL(CEikApplication& aApp);
	~CTestAppDoc();

	inline void EmbedNewDocL(const TApaApplicationFactory& aTestFac); // exported so I can call it from testcode
	inline void EditEmbeddedDocL(TInt aDocNum) {EmbeddedDoor(aDocNum)->DocumentL()->EditL(this);}
	inline CApaDoor* EmbeddedDoor(TInt aDocNum)const {return (CApaDoor*)((*iEmbedList)[aDocNum].iPicture.AsPtr());}
	virtual CEikAppUi* CreateAppUiL();
	
// from MApaEmbeddedDocObserver
	void NotifyExit(MApaEmbeddedDocObserver::TExitMode aMode);
// from CApaDocument
	void NewDocumentL(); 
	CFileStore* CreateFileStoreLC(RFs& aFs,const TDesC& aFileName);
	void SaveL();
	//
	void PrintL(const CStreamStore& aSourceStore);
	void EditL(MApaEmbeddedDocObserver* aContainer,TBool aReadOnly); 
	TBool IsEmpty()const; // return ETrue if the document is empty
	TBool HasChanged()const;
	//
	// storage functions
	void StoreL(CStreamStore& aStore,CStreamDictionary& aStreamDic)const;
	void RestoreL(const CStreamStore& aStore,const CStreamDictionary& aStreamDic);
	void DetachFromStoreL(CPicture::TDetach aDegree);

protected:
	CTestAppDoc(CEikApplication& aApp);
	void ConstructL();

	void InternalizeL(RReadStream& aStream);
	void ExternalizeL(RWriteStream& aStream)const;
	void StoreComponentsL(CStreamStore& aStore,CStoreMap& aMap)const;
	void RestoreComponentsL(const CStreamStore& aStore);

	// utility functions
public:
	TInt iValue; // the "contents" of this test document
	CArrayFixFlat<TPictureHeader>* iEmbedList;
	CStreamStore* iStore;
	TBool iHasChanged;
	};

inline void CTestAppDoc::EmbedNewDocL(const TApaApplicationFactory& aTestFac)
	{
	TPictureHeader header;
	header.iPictureType = KUidPictureTypeDoor;

	CApaDocument* doc=Process()->AddNewDocumentL(aTestFac);

	RFs& fs=Process()->FsSession();
	header.iPicture = CApaDoor::NewLC(fs,*doc,TSize(500,500));

	iEmbedList->AppendL(header);
	CleanupStack::Pop(); // iPicture
	}


#endif

