--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/notepad/notepad1/LibSrc/NpdPopupList.cpp Wed Sep 01 12:32:31 2010 +0100
@@ -0,0 +1,243 @@
+/*
+* Copyright (c) 2002 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: Implementation of Fetch memos/templates Popup List.
+*
+*/
+
+
+// INCLUDE FILES
+#include <aknPopup.h>
+#include <aknenv.h>
+#include <eikappui.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <vwsdefpartner.h>
+#endif
+
+#include "NpdPopupList.h"
+#include "NpdModel_platsec.h"
+#include "NpdModelObserver.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CNotepadPopupList::NewL
+// -----------------------------------------------------------------------------
+//
+CNotepadPopupList* CNotepadPopupList::NewL(
+ CEikListBox* aListBox,
+ TInt aCbaResource,
+ AknPopupLayouts::TAknPopupLayouts aType,
+ CNotepadModel& aModel )
+ {
+ CNotepadPopupList* self =
+ new(ELeave) CNotepadPopupList( aModel );
+ CleanupStack::PushL(self);
+ self->ConstructL(aListBox, aCbaResource, aType);
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CNotepadPopupList::CNotepadPopupList
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CNotepadPopupList::CNotepadPopupList(
+ CNotepadModel& aModel )
+ :CAknPopupList(), iModel(aModel)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CNotepadPopupList::~CNotepadPopupList
+// destructor
+// -----------------------------------------------------------------------------
+//
+CNotepadPopupList::~CNotepadPopupList()
+ {
+ if ( iFlags & ENotepadObserveView )
+ {
+ iEikonEnv->EikAppUi()->RemoveViewObserver(this);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CNotepadPopupList::EnhancedExecuteLD
+// -----------------------------------------------------------------------------
+//
+TBool CNotepadPopupList::EnhancedExecuteLD( TBool& aFinished )
+ {
+ iEikonEnv->EikAppUi()->AddViewObserverL(this);
+ iFlags |= ENotepadObserveView;
+ TBool returnValue(EFalse);
+ aFinished = ETrue;
+ iFinished = &aFinished;
+
+ TInt count( iModel.MdcaCount() );
+
+ if(0 == count )
+ {
+ ButtonGroupContainer()->SetCommandSetL( R_AVKON_SOFTKEYS_CANCEL );
+ ButtonGroupContainer()->DrawNow();
+ }
+ else
+ {
+ ButtonGroupContainer()->SetCommandSetL(R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT);
+ ButtonGroupContainer()->DrawNow();
+ }
+
+ iReturn = NULL; // to avoid a problem of CAknPopupList::ExecuteLD
+
+ returnValue = ExecuteLD();
+
+ // iFinished should be cleared ('finished' goes out of its extent)
+ iFinished = NULL;
+
+ return returnValue;
+ }
+
+// -----------------------------------------------------------------------------
+// CNotepadPopupList::AttemptExitL
+// -----------------------------------------------------------------------------
+//
+void CNotepadPopupList::AttemptExitL(TBool aAccept)
+ {
+ if ( !iFinished || *iFinished ) // really finished
+ {
+ CAknPopupList::AttemptExitL(aAccept);
+ if ( iFlags & ENotepadIsViewDeactivated )
+ {
+ iEikonEnv->RemoveFromStack(this);
+ CAknEnv::StopSchedulerWaitWithBusyMessage(iWait);
+ }
+ }
+ else // empty -> non-empty
+ {
+ iEikonEnv->RemoveFromStack(this);
+ CAknEnv::StopSchedulerWaitWithBusyMessage(iWait);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CNotepadPopupList::HandleNotepadModelEventL
+//
+// [1]
+// There was a problem in the following sequence;
+// 1. Popup our list with some memos using NpdTest.app,
+// 2. Task switch to Notepad and remove all memos,
+// 3. Task switch to NpdTest.app ( empty popup list ),
+// 4. Task switch to Notepad again and add 3 memos,
+// 5. Task switch to NpdTest.app again,
+// then, the popup list contains 3 memos but the boundary rectangle was
+// corrupted.
+// In order to solve this problem, we add
+// SetupWindowLayout( AknPopupLayouts::EMenuWindow ); // [1]
+// in this function.
+// -----------------------------------------------------------------------------
+//
+void CNotepadPopupList::HandleNotepadModelEventL(
+ TEvent aEvent,
+ TInt /*aParam*/ )
+ {
+ switch ( aEvent )
+ {
+ case EDatabaseChanged:
+ if ( !(iFlags & ENotepadIsViewDeactivated) )
+ {
+ iModel.SyncL(EFalse);
+ }
+ break;
+ case EStartItemArrayChange:
+ iSavedCount = iModel.MdcaCount();
+ iSavedIndex = ListBox()->CurrentItemIndex();
+ break;
+ case ECompleteItemArrayChange:
+ {
+ TInt count( iModel.MdcaCount() );
+ if ( iFinished &&
+ ( iSavedCount > 0 ? count == 0 : count > 0 ) )
+ {
+ if ( iSavedCount == 0 ) // empty -> not empty
+ {
+ *iFinished = EFalse;
+ MakeVisible(ETrue);
+ TKeyEvent key;
+ key.iCode=EKeyEscape;
+ key.iModifiers=0;
+ iCoeEnv->SimulateKeyEventL(key, EEventKey);
+ SetupWindowLayout( AknPopupLayouts::EMenuWindow ); // [1]
+ ButtonGroupContainer()->SetCommandSetL(R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT);
+ ButtonGroupContainer()->DrawNow();
+
+ iEikonEnv->AddSleepingDialogToStackL( this );
+ }
+ else // not empty -> empty
+ {
+ ListBox()->Reset();
+ //ListBox()->HandleItemRemovalL();
+ *iFinished = EFalse;
+ iEikonEnv->RemoveFromStack(this);
+ CAknEnv::StopSchedulerWaitWithBusyMessage(iWait);
+ ButtonGroupContainer()->SetCommandSetL(R_AVKON_SOFTKEYS_CANCEL);
+ ButtonGroupContainer()->DrawNow();
+ SetFocus(EFalse);
+ }
+ }
+ else
+ {
+ if ( count > 0 && iSavedIndex >= count ) // reduced
+ {
+ ListBox()->SetCurrentItemIndex( count - 1 );
+ }
+ ListBox()->HandleItemRemovalL();
+ ListBox()->ScrollBarFrame()->MoveVertThumbTo(
+ ListBox()->CurrentItemIndex() );
+ SetupWindowLayout( AknPopupLayouts::EMenuWindow );
+ DrawNow();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CNotepadPopupList::HandleViewEventL
+// -----------------------------------------------------------------------------
+//
+void CNotepadPopupList::HandleViewEventL(const TVwsViewEvent& aEvent)
+ {
+ switch ( aEvent.iEventType )
+ {
+ case TVwsViewEvent::EVwsActivateView:
+ {
+ iFlags &= ~ENotepadIsViewDeactivated;
+ TRAPD(err, iModel.SyncL(EFalse));
+ if (err != KErrNone)
+ {
+ iCoeEnv->HandleError(err);
+ CAknPopupList::AttemptExitL(EFalse);
+ }
+ }
+ break;
+ case TVwsViewEvent::EVwsDeactivateView:
+ iFlags |= ENotepadIsViewDeactivated;
+ break;
+ default:
+ break;
+ }
+ }
+
+// End of File