messagingappbase/smartmessaging/wmlbc/src/WmlState.cpp
changeset 0 72b543305e3a
--- /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