uifw/EikStd/cdlgsrc/EIKHFDLG.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/cdlgsrc/EIKHFDLG.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,656 @@
+/*
+* Copyright (c) 1997-1999 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:
+*
+*/
+
+
+#ifdef _DEBUG
+// subvert private protection on CCoeEnv for border drawer
+// use a name unlikely to be repeated in any included header
+#define SetAppStartupInstrumentationEventIdBaseL SetAppStartupInstrumentationEventIdBaseL(TInt aAppStartupInstrumentationEventIdBase); friend class CCoeRedrawer; void FuncWhichDoesntReallyExist
+#include <coemain.h>
+#undef iExtra
+#endif
+
+#include <eikenv.h>
+#include <eikdebug.h>
+#include <eikon.hrh>
+#include <eikhfdlg.h>
+#include <eikappui.h>
+#include <eikcdlg.rsg>
+#include <aknsettingitemlist.h>
+#include <AknDlgShut.h>
+#include <AknDialog.h>
+#include <aknnotewrappers.h>
+#include <aknnotedialog.h>
+
+NONSHARABLE_CLASS(CSchedulerShaker) : public CTimer
+	{
+public:
+	CSchedulerShaker();
+	~CSchedulerShaker();
+	void ConstructL();
+	void Go();
+private:
+	void RunL();
+	void DoCancel();
+private:
+	TBool iStarted;
+	};
+
+CSchedulerShaker::CSchedulerShaker() : CTimer(CActive::EPriorityStandard)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CSchedulerShaker::~CSchedulerShaker()
+	{
+	Cancel();
+	}
+
+void CSchedulerShaker::ConstructL()
+	{
+	CTimer::ConstructL();
+	}
+
+void CSchedulerShaker::Go()
+	{
+	After(20000);
+	}
+
+void CSchedulerShaker::RunL()
+	{
+	Go();
+	iStarted = !iStarted;
+	if (iStarted)
+		CActiveScheduler::Start();
+	else
+		CActiveScheduler::Stop();
+	}
+
+void CSchedulerShaker::DoCancel()
+	{
+	CTimer::DoCancel();
+	if (iStarted)
+		CActiveScheduler::Stop();
+	iStarted = EFalse;
+	}
+
+
+NONSHARABLE_CLASS(CEikHeapFailSettingList) : public CAknSettingItemList
+	{
+public:
+	CEikHeapFailSettingList(TEikHeapFailModel& aModel);
+	CAknSettingItem* CreateSettingItemL( TInt identifier );
+
+private:
+	TEikHeapFailModel& iModel;
+	};
+
+CEikHeapFailSettingList::CEikHeapFailSettingList(TEikHeapFailModel& aModel)
+: iModel(aModel)
+	{}
+
+CAknSettingItem* CEikHeapFailSettingList::CreateSettingItemL( TInt identifier )
+	{
+	CAknSettingItem* settingItem=0;
+
+	switch (identifier)
+		{
+		case 1:
+			settingItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(identifier, iModel.iHeapFailType);
+			break;
+		case 2:
+			settingItem = new (ELeave) CAknIntegerEdwinSettingItem(identifier, iModel.iHeapFailRate);
+			break;
+		case 3:
+			settingItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(identifier, iModel.iWservFailType);
+			break;
+		case 4:
+			settingItem = new (ELeave) CAknIntegerEdwinSettingItem(identifier, iModel.iWservFailRate);
+			break;
+		case 5:
+			settingItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(identifier, iModel.iFileFailType);
+			break;
+		case 6:
+			settingItem = new (ELeave) CAknIntegerEdwinSettingItem(identifier, iModel.iFileFailRate);
+			break;
+		}
+
+	return settingItem;
+	}
+
+NONSHARABLE_CLASS(CEikHeapFailDialog) : public CEikDialog
+	{
+public:
+	CEikHeapFailDialog(TEikHeapFailModel& aModel);
+	SEikControlInfo CreateCustomControlL(TInt aControlType);
+	TBool OkToExitL(TInt aButtonId);
+private:
+	TEikHeapFailModel& iModel;
+	};
+
+CEikHeapFailDialog::CEikHeapFailDialog(TEikHeapFailModel& aModel)
+: iModel(aModel)
+	{}
+
+SEikControlInfo CEikHeapFailDialog::CreateCustomControlL(TInt aControlType)
+	{
+	SEikControlInfo controlInfo;
+	controlInfo.iControl = NULL;
+	controlInfo.iTrailerTextId = 0;
+	controlInfo.iFlags = 0;
+    
+	switch (aControlType)
+        {
+	case 10000:
+	    controlInfo.iControl = new (ELeave) CEikHeapFailSettingList(iModel);
+	    break;
+	default:
+		break;
+		}
+
+	return controlInfo;
+	}
+
+TBool CEikHeapFailDialog::OkToExitL(TInt /*aButtonId*/)
+	{
+	STATIC_CAST(CAknSettingItemList*, Control(EEikHeapFailSettingListId))->StoreSettingsL();
+
+	TBuf<84> msg;
+	RWsSession& wsSession=iEikonEnv->WsSession();
+	switch (iModel.iHeapFailType)
+		{
+		case EEikCidHeapFailOff:
+			{
+			_LIT(KMsg,"Heap failure off ");
+			msg.Append(KMsg);
+			__UHEAP_SETFAIL(RHeap::ENone,iModel.iHeapFailRate);
+			break;
+			} 
+		case EEikCidHeapFailTypeBackRandom:
+			{
+			_LIT(KMsg,"Setting random heap failure ");
+			msg.Append(KMsg);
+			__UHEAP_SETFAIL(RHeap::ERandom,iModel.iHeapFailRate);
+			break;
+			} 
+		case EEikCidHeapFailTypeBackDeterministic:
+			{
+			_LIT(KMsg,"Setting deterministic heap failure ");
+			msg.Append(KMsg);
+			__UHEAP_SETFAIL(RHeap::EDeterministic,iModel.iHeapFailRate);
+			break;
+			}
+		default: 
+			return EFalse;
+		}
+	switch (iModel.iWservFailType)
+		{
+		case EEikCidWservHeapFailOff:
+			{
+			wsSession.HeapSetFail(RHeap::ENone,iModel.iWservFailRate);
+			break;
+			} 
+		case EEikCidWservHeapFailTypeBackRandom:
+			{
+			wsSession.HeapSetFail(RHeap::ERandom,iModel.iWservFailRate);
+			break;
+			} 
+		case EEikCidWservHeapFailTypeBackDeterministic:
+			{
+			wsSession.HeapSetFail(RHeap::EDeterministic,iModel.iWservFailRate);
+			break;
+			}
+		default: 
+			return EFalse;
+		}
+	if (iModel.iFileFailType)
+		{
+		_LIT(KMsg,"and file failure on");
+		msg.Append(KMsg);
+#if defined(_DEBUG)
+		TInt KFileFailError=-9999;
+		iCoeEnv->FsSession().SetErrorCondition(KFileFailError,iModel.iFileFailRate);
+#endif
+		}
+	else
+		{
+		_LIT(KMsg,"and file failure off");
+		msg.Append(KMsg);
+#if defined(_DEBUG)
+		TInt KFsNoErrRate=1000000;
+		iCoeEnv->FsSession().SetErrorCondition(KErrNone,KFsNoErrRate);
+#endif
+		}
+	iEikonEnv->InfoMsg(msg);
+	return ETrue;
+	}
+
+
+//
+//	class CEikDebugWin
+//
+
+void CEikDebugWin::Draw(const TRect& aRect) const
+	{
+	CGraphicsContext& gc=SystemGc();
+	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	gc.SetPenStyle(CGraphicsContext::ENullPen);
+	SystemGc().DrawRect(aRect);
+	}
+	
+EXPORT_C void CEikDebugWin::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CCoeControl::HandlePointerEventL(aPointerEvent); 
+    }	
+	
+void CEikDebugWin::ConstructL()
+    {
+    CreateWindowL();
+    SetExtentToWholeScreen();
+    Window().SetBackgroundColor(KRgbGray);
+    ActivateL();
+    DrawNow();
+    iCoeEnv->Flush(300000);
+    }
+
+
+#ifdef _DEBUG
+//
+// classs CCoeRedrawer and CCoeEnvExtra
+// subversively replaces cones redrawer active object to add borders to everything
+// DEBUG ONLY
+//
+class CCoeRedrawer;
+
+// maintain against src\common\generic\app-framework\cone\inc\coeenvextra.h
+NONSHARABLE_CLASS(CCoeEnvExtra) : public CBase
+	{
+public:
+	CCoeRedrawer* iRedrawer;
+	};
+
+NONSHARABLE_CLASS(CCoeRedrawer) : public CActive
+	{
+public:
+	CCoeRedrawer(CCoeEnv* aCoeEnv);
+	~CCoeRedrawer();
+private:
+	void Queue();
+	// from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	void DrawBorders(CCoeControl* aControl, TRgb& aCol);
+private:
+	RWsSession& iWsSession;
+	CCoeEnv* iCoeEnv;
+	CCoeRedrawer* iRedrawer;
+	};
+
+CCoeRedrawer::CCoeRedrawer(CCoeEnv* aCoeEnv)
+	:CActive(EActivePriorityRedrawEvents), iWsSession(aCoeEnv->WsSession()), iCoeEnv(aCoeEnv)
+	{
+	CActiveScheduler::Add(this);
+
+	iRedrawer = iCoeEnv->iExtra->iRedrawer;
+	iRedrawer->Cancel();
+
+	Queue();
+	}
+
+CCoeRedrawer::~CCoeRedrawer()
+	{
+	Cancel();
+	iRedrawer->Queue();
+	}
+
+void CCoeRedrawer::Queue()
+	{
+	iWsSession.RedrawReady(&iStatus);
+	SetActive();
+	}
+
+void CCoeRedrawer::RunL()
+	{
+	TWsRedrawEvent redraw;
+	iWsSession.GetRedraw(redraw);
+	CCoeControl* window=(CCoeControl*)redraw.Handle();
+	if (window)
+		{
+		window->HandleRedrawEvent(redraw.Rect());
+
+		TRgb col(KRgbGray);
+		DrawBorders(window, col);
+		}
+
+	Queue(); // do this at the end to flush the window-server client-side buffer *after* HandleRedrawEvent has done any drawing
+	}
+
+void CCoeRedrawer::DoCancel()
+	{
+	iWsSession.RedrawReadyCancel();
+	}
+
+void CCoeRedrawer::DrawBorders(CCoeControl* aControl, TRgb& aCol)
+	{
+	RDrawableWindow* window = aControl->DrawableWindow();
+	if (window)
+		{
+		TRect rect = aControl->Rect();
+		CWindowGc& gc = iCoeEnv->SystemGc();
+		gc.Activate(*window);
+		gc.SetBrushStyle(CGraphicsContext::ENullBrush);
+		gc.SetPenStyle(CGraphicsContext::ESolidPen);
+		aCol.SetRed((aCol.Red() + 17) % 256);
+		aCol.SetGreen((aCol.Green() + 199) % 256);
+		aCol.SetBlue((aCol.Blue() + 111) % 256);
+		gc.SetPenColor(aCol);
+		gc.DrawRect(rect);
+		gc.Deactivate();
+		}
+
+	TInt count = aControl->CountComponentControls();
+	for (TInt ii=0; ii<count; ii++)
+		{
+		DrawBorders(aControl->ComponentControl(ii), aCol);
+		}
+	}
+
+#endif
+
+
+// 
+// CAknMovableDialog 
+//
+//
+
+NONSHARABLE_CLASS(CAknMovableDialog) : public CAknDialog
+	{
+public:
+	CAknMovableDialog();
+	TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
+private:
+	void AttemptMoveBy( TPoint aMoveBy );
+	
+
+	};
+
+/**
+ * Constructor 
+ */
+CAknMovableDialog::CAknMovableDialog() 
+	{
+	}
+
+/**
+ * Traps the arrow keys and moves the dialog
+ */
+TKeyResponse CAknMovableDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+    {
+
+	const TInt KMoveByHorizontal =  6;
+	const TInt KMoveByVertical = 8;
+
+	if ( aType == EEventKey )
+		{
+		TPoint aMoveBy(0,0);
+		switch (aKeyEvent.iCode)
+			{
+			case EKeyUpArrow:
+				aMoveBy.SetXY( 0, -KMoveByVertical );
+				break;
+			case EKeyDownArrow:
+				aMoveBy.SetXY( 0, KMoveByVertical );
+				break;
+			case EKeyLeftArrow:
+				aMoveBy.SetXY( -KMoveByHorizontal, 0 );
+				break;
+			case EKeyRightArrow:
+				aMoveBy.SetXY( KMoveByHorizontal, 0 );
+				break;
+			default:
+				// No action
+				break;
+			}
+
+			if (aMoveBy.iX != 0  || aMoveBy.iY != 0 ) // Key is not consumed any other key
+				{
+				AttemptMoveBy( aMoveBy );
+				return EKeyWasConsumed;
+				}
+		}
+	
+	return CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+    }
+
+/**
+*  This method is called "Attempt" because it will not move the dialog too far away 
+* from the screen - to avoid it getting lost.  It does not leave.
+*
+*/
+void CAknMovableDialog::AttemptMoveBy( TPoint aMoveBy )
+	{
+	// The dialog is a window-owning control, so we have to be aware of the coordinate system used at all times.
+	TPoint pos = Position(); // Relative to screen
+	TRect rect = Rect();
+	pos += aMoveBy;		// New top left corner
+	rect.Move( pos );
+	// This test prevents the dialog from escaping off into the distance
+	TRect screenRect = iCoeEnv->ScreenDevice()->SizeInPixels();
+	if ( rect.Intersects(  screenRect ) )
+		{
+		SetRect( rect );
+		}
+	}
+
+
+
+
+//
+// class CEikDebugKeys
+//
+
+void CEikDebugKeys::ConstructL()
+    {
+    CCoeAppUi* appUi=iEikonEnv->EikAppUi();
+    appUi->AddToStackL(this,ECoeStackPriorityEnvironmentFilter,ECoeStackFlagRefusesFocus|ECoeStackFlagSharable);
+	iModel.iHeapFailRate=500;
+	iModel.iHeapFailType=EEikCidHeapFailOff;
+	iModel.iWservFailRate=500;
+	iModel.iWservFailType=EEikCidWservHeapFailOff;
+	iModel.iFileFailRate=5;
+	iModel.iFileFailType=EFalse;
+	iSchedulerShaker = new(ELeave) CSchedulerShaker;
+	iSchedulerShaker->ConstructL();
+    }
+
+void CEikDebugKeys::Release()
+	{
+	CCoeAppUi* appUi=iEikonEnv->EikAppUi();
+	if (appUi)
+        appUi->RemoveFromStack(this);
+#ifdef _DEBUG
+	delete iPhantomBorderDrawer;
+#endif
+	delete iSchedulerShaker;
+	delete this;
+    }
+
+TKeyResponse CEikDebugKeys::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+    {
+    if (aType!=EEventKey || ((aKeyEvent.iModifiers&EAllStdModifiers)!=EAllStdModifiers))
+        return(EKeyWasNotConsumed);
+	TInt code=aKeyEvent.iCode;
+    if (code<CTRL('a') || code>CTRL('z'))
+        return(EKeyWasNotConsumed);
+    switch (code)
+        {
+    case CTRL('a'):
+        iEikonEnv->AllocInfoMsg();
+        break;
+	case CTRL('b'):
+        iEikonEnv->FservAllocInfoMsg();
+		break;
+	case CTRL('c'):
+        iEikonEnv->WservAllocInfoMsg();
+		break;
+	case CTRL('f'):
+		{
+		_LIT(KMsg,"Enabling Wserv auto-flush");
+		InfoNote(KMsg);
+		iEikonEnv->WsSession().SetAutoFlush(ETrue);
+		break;
+		}
+	case CTRL('g'):
+		{
+		iEikonEnv->WsSession().SetAutoFlush(EFalse);
+		_LIT(KMsg,"Wserv auto-flush disabled");
+		InfoNote(KMsg);
+		break;
+		}
+	case CTRL('j'):
+		{
+#ifdef _DEBUG
+		if (iPhantomBorderDrawer)
+			{
+			delete iPhantomBorderDrawer;
+			iPhantomBorderDrawer = 0;
+			}
+		else
+			{
+			iPhantomBorderDrawer = new(ELeave)CCoeRedrawer(iCoeEnv);
+			}
+		CEikDebugWin* win=new(ELeave) CEikDebugWin;
+		CleanupStack::PushL(win);
+		win->ConstructL();
+		CleanupStack::PopAndDestroy();
+#endif
+		break;
+		}
+	case CTRL('l'):
+		{
+		AknDialogShutter::ShutDialogsL(*iEikonEnv);
+		break;
+		}
+	case CTRL('m'):
+		{
+		// Put up Avkon "Move Me" dialog
+		CEikDialog* dialog=new(ELeave) CAknMovableDialog;
+		dialog->ExecuteLD(R_EIK_DIALOG_MOVEME);
+		break;
+		}
+	case CTRL('n'):
+		{
+		if (iSchedulerShaker->IsActive())
+			{
+			_LIT(KMsg,"Scheduler shaker stopped");
+			InfoNote(KMsg);
+			iSchedulerShaker->Cancel();
+			}
+		else
+			{
+			_LIT(KMsg,"Scheduler shaker started");
+			InfoNote(KMsg);
+			iSchedulerShaker->Go();
+			}
+		break;
+		}
+	case CTRL('p'):
+		__UHEAP_RESET;
+		(new(ELeave) CEikHeapFailDialog(iModel))->ExecuteLD(R_EIK_HEAP_FAIL_DIALOG);
+		break;
+	case CTRL('q'):
+		{
+		__UHEAP_RESET;
+		_LIT(KMsg,"Heap failure mode reset");
+		InfoNote(KMsg);
+		break;
+		}
+	case CTRL('r'):
+		{
+		CEikDebugWin* win=new(ELeave) CEikDebugWin;
+		CleanupStack::PushL(win);
+		win->ConstructL();
+		CleanupStack::PopAndDestroy();
+		break;
+		}
+	case CTRL('t'):
+		iEikonEnv->DisplayTaskList();
+		break;
+	case CTRL('v'):
+		if (iVerbose)
+			{
+			iVerbose=EFalse;
+			_LIT(KMsg,"Verbose info messages disabled");
+			InfoNote(KMsg);
+			}
+		else
+			{
+			iVerbose=ETrue;
+			_LIT(KMsg,"Verbose info messages enabled");
+			InfoNote(KMsg);
+			}
+		iEikonEnv->SetVerboseInfoReporting(iVerbose);
+		break;
+	case CTRL('y'):
+		{
+		_LIT(KMsg,"Mounting system as X:");
+		InfoNote(KMsg);
+		RFs& fs=iEikonEnv->FsSession();
+		User::LeaveIfError(fs.AddFileSystem(_L("EFAT")));
+		fs.MountFileSystem(_L("Fat"),EDriveX);
+		RFormat format;
+		TInt count;
+		User::LeaveIfError(format.Open(fs,_L("X:"),EHighDensity,count));
+		while (count)
+			format.Next(count);
+		format.Close();
+		}
+		break;
+	case CTRL('z'):
+		{
+		RWsSession& wS=iEikonEnv->WsSession();
+		TInt wgId=wS.GetFocusWindowGroup();
+		TWsEvent wsEvent;
+        TKeyEvent event={0,0,0,0};
+		_LIT(KMsg,"Sending ASCII chars A-J as repeated keypresses to app");
+		InfoNote(KMsg);
+		for (TInt i=65; i<75; i++)
+			{
+			event.iCode=i;
+			*(wsEvent.Key())=event;
+			wsEvent.SetType(EEventKey);
+			wsEvent.SetTimeNow();
+			wS.SendEventToWindowGroup(wgId, wsEvent);
+			}
+		}
+		break;
+      	}
+    return(EKeyWasConsumed);
+    }
+
+void CEikDebugKeys::InfoNote(const TDesC& aDes)
+	{
+	TRAP_IGNORE(
+	  CAknInformationNote* note = new (ELeave) CAknInformationNote;
+	  note->ExecuteLD(aDes);
+	 );
+	}
+	
+EXPORT_C void CEikDebugKeys::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CCoeControl::HandlePointerEventL(aPointerEvent); 
+    }