--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/Ussd/src/UssdNaviPane.cpp Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,313 @@
+/*
+* Copyright (c) 2005 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: Declares navi pane control for application.
+*
+*/
+
+
+// INCLUDE FILES
+#include <gsmuset.h> // CCnvCharacterSetConverter
+#include <aknenv.h> // CAknEnv
+#include <aknnavide.h> // CAknNavigationDecorator
+#include <aknEditStateIndicator.h>
+#include <AknIndicatorContainer.h>
+#include <aknnavilabel.h>
+#include "UssdComms.h"
+
+#include "UssdAppUi.h"
+#include "UssdNaviPane.h"
+
+#include <AknUtils.h>
+// CONSTANTS
+
+// Unicode char codes for GSM 03.38 7 bit ext table characters
+static const TUint KUssdEdEuroSymbol = 0x20ac;
+static const TUint KUssdEdLeftSquareBracket = 0x5b;
+static const TUint KUssdEdReverseSolidus = 0x5c;
+static const TUint KUssdEdRightSquareBracket = 0x5d;
+static const TUint KUssdEdCircumflexAccent = 0x5e;
+static const TUint KUssdEdLeftCurlyBracket = 0x7b;
+static const TUint KUssdEdVerticalLine = 0x7c;
+static const TUint KUssdEdRightCurlyBracket = 0x7d;
+static const TUint KUssdEdTilde = 0x7e;
+static const TUint KUssdDownwardsArrowLeft = 0x21B2;
+static const TUint KUssdDownwardsArrowRight = 0x21B3;
+static const TUint KUssdCharDwithLine = 0xD0;
+static const TUint KUssdCharBigRhoo = 0xDE;
+static const TUint KUssdCharSmallDelta = 0xF0;
+static const TUint KUssdCharSmallFii = 0xFE;
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CUssdNaviPane::CUssdNaviPane
+// C++ constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CUssdNaviPane::CUssdNaviPane( CUssdAppUi& aAppUi ): iAppUi( aAppUi )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CUssdNaviPane::NewL
+//
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+CUssdNaviPane* CUssdNaviPane::NewL( CUssdAppUi& aAppUi )
+ {
+ CUssdNaviPane* self = new ( ELeave ) CUssdNaviPane( aAppUi );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CUssdNaviPane::ConstructL
+//
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUssdNaviPane::ConstructL()
+ {
+
+ CreateExtraNaviLabelL();
+
+ iCharacterSetConverter = CCnvCharacterSetConverter::NewL();
+
+ iCharacterSetConverter->PrepareToConvertToOrFromL(
+ KCharacterSetIdentifierSms7Bit,
+ iCoeEnv->FsSession() );
+
+ iCharacterSetConverter->SetDowngradeForExoticLineTerminatingCharacters(
+ CCnvCharacterSetConverter::EDowngradeExoticLineTerminatingCharactersToJustLineFeed );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CUssdNaviPane::~CUssdNaviPane
+//
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CUssdNaviPane::~CUssdNaviPane()
+ {
+
+ if ( iNaviPane && iNaviDecorator )
+ {
+ iNaviPane->Pop( iNaviDecorator );
+ delete iNaviDecorator;
+ iNaviDecorator = NULL;
+ iNaviPane = NULL;
+ }
+
+ delete iCharacterSetConverter;
+ iCharacterSetConverter = NULL;
+
+ iNaviLabel = NULL;
+
+ }
+
+// ----------------------------------------------------
+// CUssdNaviPane::CreateExtraNaviLabelL
+// Creates an extra navi label.
+// (other items were commented in a header).
+// ----------------------------------------------------
+//
+void CUssdNaviPane::CreateExtraNaviLabelL()
+ {
+
+ CEikStatusPane* sp = iAppUi.StatusPane();
+ iNaviPane = static_cast<CAknNavigationControlContainer*>(
+ sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+
+ iNaviDecorator = iNaviPane->CreateNavigationLabelL(
+ KNullDesC );
+ iNaviLabel = static_cast<CAknNaviLabel*>(
+ iNaviDecorator->DecoratedControl() );
+ iNaviPane->PushL( *iNaviDecorator ) ;
+
+ }
+
+// ---------------------------------------------------------
+// CUssdNaviPane::UpdateMsgLengthL
+// Update the message length information to navipane
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CUssdNaviPane::UpdateMsgLengthL( const TDesC& aInputString,
+ CCoeControl* aControl )
+ {
+ TInt maxLen(0);
+ const TInt txtLen = aInputString.Length();
+
+ HBufC* digitBuffer = HBufC::NewLC( EAknMaxIntegerDigits );
+ TPtr bufPtr( digitBuffer->Des() );
+
+ if ( NeedsToBeSentAsUnicodeL( aInputString ) )
+ {
+ bufPtr.AppendNum( KUssdEditorMaxLenght/2 - txtLen );
+ maxLen=KUssdEditorMaxLenght/2;
+ }
+ else
+ {
+ TInt extendedCount = CountExtendedTableChars( aInputString );
+ TInt totalLen = KUssdEditorMaxLenght - ( txtLen + extendedCount );
+ if ( totalLen < 0 ) // last was alphabet extended when one left
+ {
+ GenerateBackSpaceKeyL( aControl );
+ extendedCount--;
+ totalLen = totalLen+2;
+ }
+ bufPtr.AppendNum( totalLen );
+ maxLen=KUssdEditorMaxLenght-extendedCount;
+ }
+
+ AknTextUtils::LanguageSpecificNumberConversion( bufPtr );
+
+ // Giving msg length string to indicator container
+ MAknEditingStateIndicator* stateIndicator =
+ iAvkonEnv->EditingStateIndicator();
+ if ( stateIndicator )
+ {
+ CAknIndicatorContainer* iIndicatorContainerSMS =
+ stateIndicator->IndicatorContainer();
+ if ( iIndicatorContainerSMS )
+ {
+ iIndicatorContainerSMS->SetIndicatorState(
+ TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ),
+ EAknIndicatorStateOn );
+ iIndicatorContainerSMS->SetIndicatorValueL(
+ TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ),
+ *digitBuffer );
+ }
+ }
+
+ iNaviLabel->SetTextL( *digitBuffer );
+ CleanupStack::PopAndDestroy( digitBuffer );
+
+ return maxLen;
+ }
+
+
+// ---------------------------------------------------------
+// CUssdNaviPane::NeedsToBeSentAsUnicodeL
+// Checks if there are any unicode characters in the message
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CUssdNaviPane::NeedsToBeSentAsUnicodeL( const TDesC& aInputString ) const
+ {
+
+ TBool needsToBeSentAsUnicode = EFalse;
+
+ for ( TPtrC remainderOfInputString( aInputString );
+ remainderOfInputString.Length()>0 ; )
+ {
+ TBuf8<KUssdEditorMaxLenght> notUsedForeignParam;
+ TInt numberOfUnconvertibleCharacters = 0;
+ const TInt returnValue =
+ iCharacterSetConverter->ConvertFromUnicode(
+ notUsedForeignParam,
+ remainderOfInputString,
+ numberOfUnconvertibleCharacters );
+ if ( ( returnValue < 0 ) ||
+ ( numberOfUnconvertibleCharacters > 0 ))
+ // if there was an error in trying to do the conversion, or if
+ // there was an unconvertible character (e.g. a Chinese character)
+ {
+ TUint uChar;
+ for ( TInt i = 0;i < remainderOfInputString.Length();i++ )
+ {
+ uChar = TUint( remainderOfInputString[ i ] );
+ if ( uChar == KUssdDownwardsArrowLeft ||
+ uChar == KUssdDownwardsArrowRight ||
+ uChar == KUssdCharDwithLine ||
+ uChar == KUssdCharBigRhoo ||
+ uChar == KUssdCharSmallDelta ||
+ uChar == KUssdCharSmallFii )
+ {
+ numberOfUnconvertibleCharacters--;
+ }
+ }
+
+ if ( returnValue < 0 || numberOfUnconvertibleCharacters > 0 )
+ {
+ // if there was an error in trying to do the conversion, or if there was an
+ // unconvertible character (e.g. a Chinese character)
+ needsToBeSentAsUnicode = ETrue;
+ break;
+ }
+ }
+
+ remainderOfInputString.Set(
+ remainderOfInputString.Right( returnValue ) );
+ }
+ return needsToBeSentAsUnicode;
+ }
+
+// ---------------------------------------------------------
+// CUssdNaviPane::CountExtendedTableChars
+// Counts if there are 7bit extended table characters in message
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CUssdNaviPane::CountExtendedTableChars( const TDesC& aInputString ) const
+ {
+ const TInt total = aInputString.Length();
+ TInt extChars = 0;
+
+ TUint uChar;
+ for ( TInt i=0; i < total; i++ )
+ {
+ uChar = TUint(aInputString[i]);
+ if (( uChar == KUssdEdLeftSquareBracket) ||
+ ( uChar == KUssdEdReverseSolidus ) ||
+ ( uChar == KUssdEdRightSquareBracket ) ||
+ ( uChar == KUssdEdCircumflexAccent ) ||
+ ( uChar == KUssdEdLeftCurlyBracket ) ||
+ ( uChar == KUssdEdVerticalLine ) ||
+ ( uChar == KUssdEdRightCurlyBracket ) ||
+ ( uChar == KUssdEdTilde ) ||
+ ( uChar == KUssdEdEuroSymbol ))
+ {
+ extChars = extChars + 1;
+ }
+ }
+ return extChars;
+ }
+
+// ---------------------------------------------------------
+// CUssdNaviPane::GenerateBackSpaceKeyL
+// Generates a backspace key press event.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CUssdNaviPane::GenerateBackSpaceKeyL( CCoeControl* aControl )
+ {
+ TKeyEvent keyEvent;
+ keyEvent.iCode = EKeyBackspace;
+ keyEvent.iScanCode = EStdKeyBackspace;
+ keyEvent.iRepeats = 1;
+ keyEvent.iModifiers = 0;
+ TEventCode type = EEventKey;
+
+ if ( aControl )
+ {
+ aControl->OfferKeyEventL( keyEvent, type );
+ }
+ }
+
+// End of File