--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/smartmessaging/wmlbc/src/WmlState.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,415 @@
+/*
+* 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:
+* This contains all the state specific logic of the bio-control.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "WmlState.h" // Own header
+#include "WmlItemEngine.h"
+#include "WmlBioControl.h" // CWmlBioControl
+#include "WmlBioControl.pan" // Panic
+#include "WmlSubItemBase.h" // CWmlSubItemBase
+
+#include <StringLoader.h> // StringLoader
+#include <msgnamevalue.h> // CMsgNameValue
+#include <msgbiocontrolObserver.h>
+#include <CRichBio.h> // CRichBio
+#include <WMLBC.rsg> // resouce identifiers
+#include <bldvariant.hrh>
+#include <csxhelp/smart.hlp.hrh>
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CWmlStateFactory::NewL()
+// ---------------------------------------------------------
+CWmlStateFactory* CWmlStateFactory::NewL( CWmlBioControl& aBioControl )
+ {
+ CWmlStateFactory* self = new ( ELeave ) CWmlStateFactory;
+ CleanupStack::PushL( self );
+ self->ConstructL( aBioControl );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CWmlStateFactory::ConstructL()
+// ---------------------------------------------------------
+void CWmlStateFactory::ConstructL( CWmlBioControl& aBioControl )
+ {
+ iBioControl = &aBioControl;
+ iStateSingle = new (ELeave) CWmlStateSingle( this, aBioControl );
+ }
+
+// ---------------------------------------------------------
+// CWmlStateFactory::~CWmlStateFactory()
+// ---------------------------------------------------------
+CWmlStateFactory::~CWmlStateFactory()
+ {
+ delete iStateSingle;
+ }
+
+// ---------------------------------------------------------
+// CWmlStateFactory::SetInitialStateL()
+// ---------------------------------------------------------
+void CWmlStateFactory::SetInitialStateL(
+ const TInt aBMCount )
+ {
+ // Pre-condition is that state object is NULL
+ __ASSERT_DEBUG(iState == NULL,
+ Panic(EWmlBCStateObjectAlreadyCreated));
+
+ if ( aBMCount == 0 )
+ {
+ // nothing to show... invalid message.
+ User::Leave( KErrCorrupt );
+ }
+
+ TWmlState state( EWmlBCInitial );
+
+ if ( aBMCount == 1 )
+ {
+ state = EWmlBCViewerBookmarkOne;
+ }
+ else
+ {
+ // invalid message
+ User::Leave( KErrNotSupported );
+ }
+
+ ChangeStateL( state );
+ // Post condition is that we have state object.
+ __ASSERT_DEBUG(iState,
+ Panic(EWmlBCStateObjectNotCreated));
+ }
+
+// ---------------------------------------------------------
+// CWmlStateFactory::ChangeStateL()
+// ---------------------------------------------------------
+void CWmlStateFactory::ChangeStateL( TWmlState aState )
+ {
+ iStateEnum = aState;
+ // Set the correct state object.
+ switch ( aState )
+ {
+ // Single mode
+ case EWmlBCViewerBookmarkOne:
+ {
+ iState = iStateSingle;
+ break;
+ }
+ // Illegal transitions
+ default:
+ {
+ Panic( EIllegalStateTransition );
+ break;
+ }
+ }
+ iState->EnterL( aState );
+ }
+
+// ---------------------------------------------------------
+// CWmlStateFactory::State()
+// ---------------------------------------------------------
+MWmlState& CWmlStateFactory::State() const
+ {
+ return *iState;
+ }
+
+// ---------------------------------------------------------
+// CWmlState::CWmlState()
+// ---------------------------------------------------------
+CWmlState::CWmlState( CWmlStateFactory* aStateFactory,
+ CWmlBioControl& aBioControl) :
+ iStateFactory( aStateFactory ),
+ iBioControl( &aBioControl )
+ {
+ // Nothing more here...
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::CWmlStateSingle()
+// ---------------------------------------------------------
+CWmlStateSingle::CWmlStateSingle( CWmlStateFactory* aStateFactory,
+ CWmlBioControl& aBioControl) :
+ CWmlState( aStateFactory, aBioControl )
+ {
+ // Nothing more here...
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::~CWmlStateSingle()
+// ---------------------------------------------------------
+CWmlStateSingle::~CWmlStateSingle()
+ {
+ // This owns nothing...
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::SetAndGetSizeL()
+// ---------------------------------------------------------
+void CWmlStateSingle::SetAndGetSizeL( TSize& aSize )
+ {
+ iBioControl->iRichBio->SetAndGetSizeL( aSize );
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::HandleBioCommandL()
+// ---------------------------------------------------------
+TBool CWmlStateSingle::HandleBioCommandL( TInt aCommand )
+ {
+ TBool retValue(EFalse);
+ aCommand -= iBioControl->iBioControlObserver.FirstFreeCommand();
+ switch ( aCommand )
+ {
+ case EAddBookmark:
+ {
+ iBioControl->iItemEngine->SaveCurrentItemL();
+ retValue = ETrue;
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ return retValue;
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::CurrentLineRect()
+// ---------------------------------------------------------
+TRect CWmlStateSingle::CurrentLineRect() const
+ {
+ return iBioControl->iRichBio->CurrentLineRect();
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::IsFocusChangePossible()
+// ---------------------------------------------------------
+TBool CWmlStateSingle::IsFocusChangePossible(
+ TMsgFocusDirection aDirection ) const
+ {
+ if (aDirection == EMsgFocusUp)
+ {
+ return CursorInFirstLine();
+ }
+ else
+ {
+ // Focus down will never release the focus out of this.
+ return EFalse;
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::HeaderTextLC()
+// ---------------------------------------------------------
+HBufC* CWmlStateSingle::HeaderTextLC() const
+ {
+ TInt resourceID(0);
+ switch ( iState )
+ {
+ case EWmlBCViewerBookmarkOne:
+ {
+ resourceID = R_QTN_SM_TITLE_ONE_BOOKMARK;
+ break;
+ }
+ default:
+ {
+ // In detail state iState should not be anything else than above.
+ Panic( EIllegalInternalState );
+ break;
+ }
+ }
+ return StringLoader::LoadLC( resourceID );
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::OptionMenuPermissionsL()
+// ---------------------------------------------------------
+void CWmlStateSingle::OptionMenuPermissionsL( TUint32& aPermissions ) const
+ {
+ switch ( iState )
+ {
+ case EWmlBCViewerBookmarkOne:
+ {
+ aPermissions |= EMsgBioCallBack
+ | EMsgBioDelete
+ | EMsgBioMessInfo
+ | EMsgBioMove
+ | EMsgBioHelp
+ | EMsgBioCreateCC;
+ break;
+ }
+ default:
+ {
+ Panic(EIllegalCommandInCurrentState);
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::SetMenuCommandSetL()
+// ---------------------------------------------------------
+void CWmlStateSingle::SetMenuCommandSetL( CEikMenuPane& aMenuPane )
+ {
+ switch ( iState )
+ {
+ case EWmlBCViewerBookmarkOne:
+ {
+ iBioControl->AddMenuItemL( aMenuPane, R_QTN_SM_ADD_BOOKMARKS,
+ EAddBookmark, 1 );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::VirtualHeight()
+// ---------------------------------------------------------
+TInt CWmlStateSingle::VirtualHeight()
+ {
+ TInt height = iBioControl->iRichBio->VirtualHeight();
+ return height;
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::VirtualVisibleTop()
+// ---------------------------------------------------------
+TInt CWmlStateSingle::VirtualVisibleTop()
+ {
+ TInt top = iBioControl->iRichBio->VirtualVisibleTop();
+ return top;
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::IsCursorLocation()
+// ---------------------------------------------------------
+TBool CWmlStateSingle::IsCursorLocation( TMsgCursorLocation aLocation ) const
+ {
+ TBool location( iBioControl->iRichBio->IsCursorLocation( aLocation ) );
+ return location;
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::OfferKeyEventL()
+// ---------------------------------------------------------
+TKeyResponse CWmlStateSingle::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+ TEventCode aType )
+ {
+ return iBioControl->iRichBio->OfferKeyEventL( aKeyEvent, aType );
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::SizeChanged()
+// ---------------------------------------------------------
+void CWmlStateSingle::SizeChanged()
+ {
+ iBioControl->iRichBio->SetExtent(iBioControl->Position(),
+ iBioControl->iRichBio->Size());
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::FocusChanged()
+// ---------------------------------------------------------
+void CWmlStateSingle::FocusChanged( TDrawNow aDrawNow )
+ {
+ iBioControl->iRichBio->SetFocus( iBioControl->IsFocused(), aDrawNow );
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::CreateViewerL()
+// ---------------------------------------------------------
+void CWmlStateSingle::CreateViewerL( const CCoeControl& aContainer )
+ {
+ CRichBio* richBio = CRichBio::NewL( &aContainer, ERichBioModeStandard );
+ CleanupStack::PushL( richBio );
+
+ CWmlSubItemBase& currentItem = iBioControl->iItemEngine->CurrentItem();
+ CArrayPtrFlat<CMsgNameValue>* labelsAndValues =
+ currentItem.LabelsAndValuesLC();
+ TInt count = labelsAndValues->Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ CMsgNameValue* nameValue = labelsAndValues->At( i );
+ richBio->AddItemL( nameValue->Name(), nameValue->Value() );
+ }
+ // We can't check the item because the object actually is
+ // TCleanupItem
+ CleanupStack::PopAndDestroy();// labelsAndValues );
+
+ CleanupStack::Pop( richBio );
+ iBioControl->iRichBio = richBio;
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::CursorInFirstLine()
+// ---------------------------------------------------------
+TBool CWmlStateSingle::CursorInFirstLine() const
+ {
+ return iBioControl->iRichBio->IsCursorLocation(EMsgTop);
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::GetHelpContext()
+// ---------------------------------------------------------
+void CWmlStateSingle::GetHelpContext(TCoeHelpContext& aHelpContext) const
+ {
+ switch ( iState )
+ {
+ case EWmlBCViewerBookmarkOne:
+ {
+ aHelpContext.iContext = KSMART_HLP_ONEBOOKVIEWER;
+ break;
+ }
+ default:
+ {
+ Panic( EIllegalStateTransition );
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmlStateSingle::EnterL()
+// ---------------------------------------------------------
+void CWmlStateSingle::EnterL( TWmlState aState )
+ {
+ // This is a check for valid state transitions.
+ switch ( aState )
+ {
+ case EWmlBCViewerBookmarkOne:
+ {
+ break;
+ }
+ default:
+ {
+ Panic( EIllegalStateTransition );
+ break;
+ }
+ }
+ iState = aState;
+ iBioControl->UpdateHeaderTextL();
+ }
+
+// End of file