textinput/peninputhwrtrui/src/truimainview.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputhwrtrui/src/truimainview.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,401 @@
+/*
+* Copyright (c) 2007 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:  Implement of class CTruiMainView
+*
+*/
+
+
+#include <aknViewAppUi.h>
+#include <eikmenup.h>
+#include <trui.rsg>
+#include <akntoolbar.h>
+#include <aknnavide.h>
+#include <akntabgrp.h>
+
+#include "truimainview.h"
+#include "truimainviewcontainer.h"
+#include "trui.hrh"
+#include "truiappui.h"
+#include "truiengine.h"
+#include "truishortcutsview.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+CTruiMainView::CTruiMainView()
+    {
+    }
+
+void CTruiMainView::ConstructL()
+    {
+    BaseConstructL( R_TRUI_MAINVIEW );
+    }
+
+CTruiMainView* CTruiMainView::NewL()
+    {
+    CTruiMainView* self = CTruiMainView::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CTruiMainView* CTruiMainView::NewLC()
+    {
+    CTruiMainView* self = new( ELeave ) CTruiMainView;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+CTruiMainView::~CTruiMainView()
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// From class CAknView.
+// Returns views id.
+// ---------------------------------------------------------------------------
+//
+TUid CTruiMainView::Id() const
+    {
+    return KTruiMainViewId;    
+    }
+    
+// ---------------------------------------------------------------------------
+// From class CAknView.
+// Command handling function.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainView::HandleCommandL( TInt aCommand )
+    {
+    switch ( aCommand )
+        {
+        case EMainViewCharGrid:
+            {
+            // Handle menu item command "Character Grid"
+            iContainer->HandleChooseCharEventL();             
+            }
+            break;
+        case EMainViewSubmenuWestern:
+        case EMainViewSubmenuCyrillic:
+        case EMainViewSubmenuGreek:
+        case EMainViewSubmenuHebrew:
+            {
+            iContainer->HandleLanguageScriptChangedL( aCommand );
+            }
+            break;
+        case EMainViewSubmenuLatinLowerLetter:
+        case EMainViewSubmenuLatinUpperLetter:
+        case EMainViewSubmenuLatinAccent:
+        case EMainViewSubmenuDigital:
+        case EMainViewSubmenuSymbols:
+        case EMainViewSubmenuCyrillicLowerLetters:
+        case EMainViewSubmenuCyrillicUpperLetters:
+        case EMainViewSubmenuCyrillicAccent:        
+        case EMainViewSubmenuGreekLowerLetters:
+        case EMainViewSubmenuGreekUpperLetters:       
+        case EMainViewSubmenuHebrewLetters:        
+            {
+            // Handle character range changed
+            // Get range index in menu pane by range Id
+            CTruiAppUi* appui = static_cast<CTruiAppUi*>( AppUi() );
+            CTruiEngine* engine = appui->HwrEngine();
+            const RArray<TInt>& rangeIdArray = 
+                                engine->GetCurrentSupportedRangesId();
+            TInt indexOfMenuItems = rangeIdArray.Find( aCommand );
+            if ( indexOfMenuItems != KErrNotFound )
+                {
+                // Set current character range by index in Engine
+                engine->SetCharacterRangeByIndexL( indexOfMenuItems );
+
+                // Call iContainer->HandleCharRangeChanged to handle it.
+                iContainer->HandleCharRangeChangedL( indexOfMenuItems, 
+                                                     aCommand );
+                }	        
+            }
+	        break;
+        case EMainViewDeleteCurrentModel:
+            {
+            iContainer->DeleteModelL();
+            }
+            break;
+        case EMainViewDeleteAllModel:
+            {
+            iContainer->DeleteAllModelL();
+            break;
+            }
+        case EMainViewPreviewModel:
+            {
+            iContainer->PreviewCharacterModel();
+            break;
+            }
+        case EMainViewToShortcutsView:
+            {
+            CTruiAppUi* appui = static_cast<CTruiAppUi*>( AppUi() );
+            CAknNavigationDecorator* naviDecorator = appui->GetNaviDecorator();
+            CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>
+                                    ( naviDecorator->DecoratedControl() );
+            tabGroup->SetActiveTabById( ENavigationPaneShortcutsViewTab );
+            // Switch to local view.
+            appui->ActivateLocalViewL( KTruiShortcutsViewId );
+            break;
+            }
+        case EAknSoftkeyExit:
+            {
+            iContainer->PrepareToExitL();
+            AppUi()->HandleCommandL( aCommand );
+            }
+            break;
+        default:
+            {
+            AppUi()->HandleCommandL( aCommand );            
+            }                    
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// From class CAknView.
+// Carried out when View is activated
+// ---------------------------------------------------------------------------
+//
+void CTruiMainView::DoActivateL( const TVwsViewId& /*aPrevViewId*/,
+                  TUid /*aCustomMessageId*/,
+                  const TDesC8& /*aCustomMessage*/ )
+    {
+    // Set title pane
+    CTruiAppUi* appui = static_cast<CTruiAppUi*>( AppUi() );
+    HBufC* titleText = 
+           iEikonEnv->AllocReadResourceLC( R_TRUI_MAINVIEW_TITLEPANE_TEXT );
+    appui->ShowTitlePaneL( *titleText );
+    CleanupStack::PopAndDestroy( titleText );
+
+    iContainer = CTruiMainViewContainer::NewL( ClientRect() );
+    iContainer->SetMopParent( this );
+    AppUi()->AddToStackL( *this, iContainer );    
+    iContainer->SetView( this );
+
+    // Set toolbar
+    CAknToolbar* toolbar = Toolbar();
+    if ( toolbar )
+        {
+        toolbar->SetToolbarObserver( this );
+        toolbar->SetToolbarVisibility( ETrue, EFalse );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAknView.
+// Carried out when View is deactivated
+// ---------------------------------------------------------------------------
+//
+void CTruiMainView::DoDeactivate()
+    {
+    if ( iContainer )
+        {        
+        AppUi()->RemoveFromStack( iContainer );
+        delete iContainer;
+        iContainer = NULL;
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// From class MAknToolbarObserver.
+// Handles toolbar events for a certain toolbar item.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainView::OfferToolbarEventL( TInt aCommand )
+    {
+    switch ( aCommand )
+        {
+        case EMainViewButtonIdGrid:
+            {
+            // Open SCT
+            iContainer->HandleChooseCharEventL();
+            break;
+            }
+        case EMainViewButtonIdPreview:
+            {
+            // Preview character animation
+            iContainer->PreviewCharacterModel();
+            break;
+            }
+        case EMainViewButtonIdDelete:
+            {
+            // Clear HWR box and delete character model
+            iContainer->DeleteModelL();
+            break;
+            }
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// Dynamically initialises a menu pane.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainView::DynInitMenuPaneL( TInt aResourceId, 
+                                      CEikMenuPane* aMenuPane )
+    {
+    // Get engine
+    CTruiAppUi* appui = static_cast<CTruiAppUi*>( AppUi() );
+    CTruiEngine* engine = appui->HwrEngine();
+    
+    if ( aResourceId == R_TRUI_MAINVIEW_MENUPANE )
+        {
+        // Get language script from engine
+        // Determine whether "Language script" will be displayed.
+        aMenuPane->SetItemDimmed( EMainViewLanguageScript, 
+                            ( engine->SupportedLanguageScript().Count() <= 1 ) );
+        
+        // Determine whether "Delete model" will be displayed
+        iDimAllDelete = iContainer->IsAllDelete();
+                       
+        TBool isDimmed = ( iContainer->IsButtonDimmed() && iDimAllDelete ) 
+                         ? ETrue: EFalse;
+        aMenuPane->SetItemDimmed( EMainViewDeleteModel, isDimmed );
+        
+        // Determine whether "Preview model" will be displayed.
+        TBool isPreviewDimmed = iContainer->IsButtonDimmed() ? ETrue: EFalse;
+        aMenuPane->SetItemDimmed( EMainViewPreviewModel, isPreviewDimmed );
+        }    
+    if ( aResourceId == R_TRUI_MAINVIEW_MENU_LANGUAGESCRIPT_CASCADE )
+        {        
+        // Set which items will be displayed by supported language script
+        const RArray<TInt>& languageScriptId = 
+                                           engine->SupportedLanguageScript();
+        aMenuPane->SetItemDimmed( EMainViewSubmenuWestern, ETrue );
+        aMenuPane->SetItemDimmed( EMainViewSubmenuCyrillic, ETrue );
+        aMenuPane->SetItemDimmed( EMainViewSubmenuGreek, ETrue );
+        aMenuPane->SetItemDimmed( EMainViewSubmenuHebrew, ETrue );
+        for ( TInt i = 0; i < languageScriptId.Count(); i++ )
+            {
+            aMenuPane->SetItemDimmed( languageScriptId[i], EFalse );
+            }
+        
+        if ( IsMenuItemDimmed( aMenuPane, EMainViewSubmenuWestern ) )
+            {
+            aMenuPane->DeleteMenuItem( EMainViewSubmenuWestern );
+            }
+        if ( IsMenuItemDimmed( aMenuPane, EMainViewSubmenuCyrillic ) )
+            {
+            aMenuPane->DeleteMenuItem( EMainViewSubmenuCyrillic );
+            }
+        if ( IsMenuItemDimmed( aMenuPane, EMainViewSubmenuGreek ) )
+            {
+            aMenuPane->DeleteMenuItem( EMainViewSubmenuGreek );
+            }
+        if ( IsMenuItemDimmed( aMenuPane, EMainViewSubmenuHebrew ) )
+            {
+            aMenuPane->DeleteMenuItem( EMainViewSubmenuHebrew );
+            }
+        
+        // Set which item will be indicated by current language script         
+        aMenuPane->SetItemButtonState( engine->CurrentLanguageScript(), 
+                                       EEikMenuItemSymbolOn );
+        
+        // Set current selected item
+        TInt pos;
+        aMenuPane->ItemAndPos( engine->CurrentLanguageScript(), pos );
+        aMenuPane->SetSelectedItem( pos );
+        }
+    if ( aResourceId == R_TRUI_MAINVIEW_MENU_CHARRANGE_CASCADE )
+        {
+        // Get language script from model      
+        // Init character range submenu                     
+        InitCharRangeSubMenuL( engine->CurrentLanguageScript(), aMenuPane );
+        
+        if ( engine->CurrentLanguageScript() == EMainViewSubmenuCyrillic )
+            {
+            // Dim cyrillic accent range
+            aMenuPane->SetItemDimmed( EMainViewSubmenuCyrillicAccent, ETrue );
+            }
+
+        // Get the current item's Id
+        TInt rangeId = engine->GetCurrentCharacterRange();
+        
+        // Set which item to be indicated       
+        aMenuPane->SetItemButtonState( rangeId, EEikMenuItemSymbolOn );
+        
+        // Set which item to be highlighted
+        const RArray<TInt>& rangeIdArray = 
+                                      engine->GetCurrentSupportedRangesId();
+        TInt indexOfMenuItems = rangeIdArray.Find( rangeId );
+        if ( indexOfMenuItems != KErrNotFound )
+            {
+            aMenuPane->SetSelectedItem( indexOfMenuItems );
+            }
+        }
+    if ( aResourceId == R_TRUI_MAINVIEW_MENU_DELETE_CASCADE )
+        {
+        aMenuPane->SetItemDimmed( EMainViewDeleteCurrentModel, 
+                                  iContainer->IsButtonDimmed() );
+        aMenuPane->SetItemDimmed( EMainViewDeleteAllModel, iDimAllDelete );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Dynamically initialises the character range menu pane.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainView::InitCharRangeSubMenuL( TInt aScriptId,
+                                           CEikMenuPane* aMenuPane)
+    {
+    // Get the corrent reource ID of MENU_ITEMS by 
+    TInt reourceId = MenuItemsReourceId( aScriptId );
+    // Add these menu items into menu pane
+    aMenuPane->AddMenuItemsL( reourceId );    
+    }
+    
+// ---------------------------------------------------------------------------
+// Get reource ID of menu items for initializing menu pane.
+// ---------------------------------------------------------------------------
+//
+TInt CTruiMainView::MenuItemsReourceId( TInt aScriptId )
+    {
+    TInt reourceId;
+    switch ( aScriptId )
+        {
+        case EMainViewSubmenuWestern:
+            {
+            reourceId = R_TRUI_MAINVIEW_SUBMENU_CHARRANGE_LATIN;
+            }
+            break;            
+        case EMainViewSubmenuCyrillic:
+            {
+            reourceId = R_TRUI_MAINVIEW_SUBMENU_CHARRANGE_CYRILLIC;
+            }
+            break;                    
+        case EMainViewSubmenuGreek:
+            {
+            reourceId = R_TRUI_MAINVIEW_SUBMENU_CHARRANGE_GREEK;
+            }
+            break;        
+        case EMainViewSubmenuHebrew:
+            {
+            reourceId = R_TRUI_MAINVIEW_SUBMENU_CHARRANGE_HEBREW;
+            }        
+            break;
+        default:
+            reourceId = 0;
+            break;            
+        }
+    return reourceId;            
+    }   
+
+// ---------------------------------------------------------------------------
+// Check menu item dimmed by menu item id.
+// ---------------------------------------------------------------------------
+//
+TBool CTruiMainView::IsMenuItemDimmed( CEikMenuPane* aMenuPane, TInt aMenuItemId )
+    {
+    CEikMenuPaneItem::SData& itemdata = aMenuPane->ItemData( aMenuItemId );    
+    return ( itemdata.iFlags & EEikMenuItemDimmed == EEikMenuItemDimmed );    
+    }