uifw/eikctl/src/EIKMFNE.CPP
branchRCL_3
changeset 56 d48ab3b357f1
parent 55 aecbbf00d063
child 59 978afdc0236f
--- a/uifw/eikctl/src/EIKMFNE.CPP	Tue Aug 31 15:28:30 2010 +0300
+++ b/uifw/eikctl/src/EIKMFNE.CPP	Wed Sep 01 12:16:19 2010 +0100
@@ -104,6 +104,128 @@
     User::Panic(KPanicCat, aPanic);
     }
 
+NONSHARABLE_CLASS(CEikTimeEditorExtension) : public CBase, 
+	public CAknExtendedInputCapabilities::MAknEventObserver 
+    {
+public:
+    static CEikTimeEditorExtension* NewL();
+    virtual ~CEikTimeEditorExtension();
+private: 
+    CEikTimeEditorExtension();
+
+    void ConstructL();
+public:
+    /**
+     * From CAknExtendedInputCapabilities::MAknEventObserver
+     * Handle an event
+     *
+     * @since S60 v9.2
+     * @param aEvent An event, see TInputCapabilitiesEvent
+     * @param aParams Event dependent parameters
+     */
+
+    void HandleInputCapabilitiesEventL( TInt aEvent, TAny* aParams );
+public:
+    CEikTimeEditor * iEditor;
+    };
+
+CEikTimeEditorExtension* CEikTimeEditorExtension::NewL()
+    {
+	CEikTimeEditorExtension* self = new (ELeave) CEikTimeEditorExtension();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+CEikTimeEditorExtension::~CEikTimeEditorExtension()
+    {
+
+    }
+
+CEikTimeEditorExtension::CEikTimeEditorExtension()
+    {
+    }
+
+void CEikTimeEditorExtension::ConstructL()
+    {
+    }
+
+void CEikTimeEditorExtension::HandleInputCapabilitiesEventL( TInt aEvent, TAny* /*aParams*/ )
+	{
+    switch ( aEvent )
+        {
+        case CAknExtendedInputCapabilities::MAknEventObserver::EChangeAmPm:
+        	if ( iEditor )
+	            {
+        	    iEditor->ChangeAmPm();
+	            }
+            break;
+        }
+    return;
+	}
+
+
+NONSHARABLE_CLASS(CEikTimeAndDateEditorExtension) : public CBase, 
+	public CAknExtendedInputCapabilities::MAknEventObserver 
+    {
+public:
+    static CEikTimeAndDateEditorExtension* NewL();
+    virtual ~CEikTimeAndDateEditorExtension();
+private: 
+    CEikTimeAndDateEditorExtension();
+
+    void ConstructL();
+public:
+    /**
+     * From CAknExtendedInputCapabilities::MAknEventObserver
+     * Handle an event
+     *
+     * @since S60 v9.2
+     * @param aEvent An event, see TInputCapabilitiesEvent
+     * @param aParams Event dependent parameters
+     */
+
+    void HandleInputCapabilitiesEventL( TInt aEvent, TAny* aParams );
+public:
+    CEikTimeAndDateEditor * iEditor;
+    };
+
+CEikTimeAndDateEditorExtension* CEikTimeAndDateEditorExtension::NewL()
+    {
+	CEikTimeAndDateEditorExtension* self = new (ELeave) CEikTimeAndDateEditorExtension();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+CEikTimeAndDateEditorExtension::~CEikTimeAndDateEditorExtension()
+    {
+
+    }
+
+CEikTimeAndDateEditorExtension::CEikTimeAndDateEditorExtension()
+    {
+    }
+
+void CEikTimeAndDateEditorExtension::ConstructL()
+    {
+    }
+
+void CEikTimeAndDateEditorExtension::HandleInputCapabilitiesEventL( TInt aEvent, TAny* /*aParams*/ )
+	{
+    switch ( aEvent )
+        {
+        case CAknExtendedInputCapabilities::MAknEventObserver::EChangeAmPm:
+        	if ( iEditor )
+	            {
+        	    iEditor->ChangeAmPm();
+	            }
+            break;
+        }
+    return;
+	}
 NONSHARABLE_CLASS(CEikMfneExtension) : public CBase, public MCoeFepAwareTextEditor 
     {
 public:
@@ -155,7 +277,6 @@
         iExtendedInputCapabilitiesProvider;
     TInt iClipGcToRect; // Mainly for 0/1 values
     TInt iDisablePenInput; // Mainly for 0/1 values
-    TBool iTwiceTap;   
     TBool iCursorShown; 
     TBool iFingerSupport;
     TInt iFingerParam;
@@ -166,6 +287,7 @@
     MTouchFeedback* iFeedback;
     TBool iLaunchPenInputAutomatic;
     TBool iPartialScreenInput;
+    TBool iChangeAmPm;
     };
 
 // Implementation of the extension
@@ -1612,7 +1734,7 @@
     if ( !ConsumesUpAndDownKeys() && (code==EKeyDownArrow || code==EKeyUpArrow))
         return EKeyWasNotConsumed;
 
-    if ((aType==EEventKey) && (iCurrentField!=ENullIndex) && 
+    if ((aType==EEventKey) && (iCurrentField!=ENullIndex) && iExtension &&
         ( aKeyEvent.iRepeats == 0 || code == EKeyLeftArrow || 
             code == EKeyRightArrow || code == EKeyDownArrow || code == EKeyUpArrow ) )
         {
@@ -1742,7 +1864,7 @@
     {
     const CFont& font=*Font();
     TBool drawAllFields = ETrue;
-    if (aHandleDeHighlight)
+    if ( aHandleDeHighlight && iExtension )
         {
         iFields[iCurrentField]->HandleDeHighlight(font, *iEikonEnv, aDataAltered, aError);
         iExtension->iValidateValueCallBack.CallBack();
@@ -1844,7 +1966,7 @@
             return;
             }
         }
-    if ( aAlignment >= ELayoutAlignNone && iExtension )
+    if ( aAlignment >= ELayoutAlignNone )
         {
         iAlignment = aAlignment;
         TUint capabilities = iExtension->
@@ -1931,6 +2053,7 @@
                     iExtension->iDisablePenInput = !( iExtension->iFingerSupport );                    
                     iExtension->iFingerParam = aFeatureParam; 
                     iExtension->iHighlightAll = ( iExtension->iFingerSupport &&
+                        !iExtension->iTouchActivated &&
                         aFeatureParam == EnableWithAllHighlight );                  
                     }
                 else
@@ -1968,6 +2091,26 @@
                     ret = KErrGeneral;
                     }
                 break;
+            case EChangeAmPm:
+                if ( iExtension )
+                    {
+                    iExtension->iChangeAmPm = aFeatureParam;
+                    TUint caps( iExtension->iExtendedInputCapabilities->Capabilities() );
+                    if ( aFeatureParam )
+                        {
+                        caps |= CAknExtendedInputCapabilities::EInputEditorAmPm;
+                        }
+                    else
+                        {
+                        caps &= ~CAknExtendedInputCapabilities::EInputEditorAmPm;
+                        }
+                    iExtension->iExtendedInputCapabilities->SetCapabilities( caps );
+                    }
+                else
+                    {
+                    ret = KErrGeneral;
+                    }
+                break;
             default:
                 ret = KErrNotSupported;
                 break;
@@ -2040,6 +2183,16 @@
                     ret = KErrGeneral;
                     }
                 break;
+            case EChangeAmPm:
+                if ( iExtension )
+                    {
+                    aFeatureParam = iExtension->iChangeAmPm;
+                    }
+                else
+                    {
+                    ret = KErrGeneral;
+                    }
+                break;
             default:
                 ret = KErrNotSupported;
                 break;
@@ -2060,7 +2213,8 @@
         EDisablePenInput,
         EFingerSupport,
         ELaunchPenInputAutomatic,
-        EPartialScreenInput
+        EPartialScreenInput,
+        EChangeAmPm
         };
         
     TBool ret = EFalse;
@@ -2253,18 +2407,12 @@
             }
         if (newField==ENullIndex)
             newField=iCurrentField;
-        if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
-            {
-            iExtension->iTwiceTap = ( iExtension->iFingerSupport ? ETrue : 
-                newField == iCurrentField );            
-            }
 
         if (iExtension && aPointerEvent.iType == TPointerEvent::EButton1Down)
             {
             // Edit feedback on down event in current field, 
             // Edit feedback when changing fields
-            TTouchLogicalFeedback feedback = 
-                ( iExtension->iTwiceTap ? ETouchFeedbackEditor : ETouchFeedbackEditor );
+            TTouchLogicalFeedback feedback = ETouchFeedbackEdit;
             iExtension->iFeedback->InstantFeedback( this, feedback );
             }
         TBool createPopoutIfRequired=((newField==iCurrentField) && aPointerEvent.iType==TPointerEvent::EButton1Down && IsFocused());
@@ -2279,10 +2427,10 @@
         }
     else if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
         {
-        if ( iExtension && !iExtension->iDisablePenInput && iExtension->iTwiceTap )
+        if ( iExtension && !iExtension->iDisablePenInput )
             {
             iExtension->iFeedback->InstantFeedback( this,
-                ETouchFeedbackEditor,
+                ETouchFeedbackEdit,
                 ETouchFeedbackVibra,
                 aPointerEvent );
             LaunchPenInputL();
@@ -2446,7 +2594,7 @@
             {
             if (i>=aFirstField)
                 {
-                if (focused && ( iExtension->iHighlightAll || ( i == iCurrentField 
+                if (focused && iExtension && ( iExtension->iHighlightAll || ( i == iCurrentField 
                     && iFields[i]->HighlightType() == CEikMfneField::EInverseVideo
                     && iFields[i]->FieldText().Length() > 0 ) ) && !isEmpty )
                     {
@@ -2455,10 +2603,7 @@
                     }
                 else 
                     {
-                    if (IsDimmed())
-                        SetGcToDimmedVideo(aGc);
-                    else
-                        SetGcToNormalVideo(aGc);
+
 
                     // Note!! This is taking responsibility away from the CEikMfne Field for drawing
                     // Skin background is drawn for the fields here
@@ -2493,6 +2638,15 @@
                         // Set up null brush GC here for the upcoming draw
                         aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
                         }
+                    // set aGc for drawing field text
+                    if ( IsDimmed() )
+                        {
+                        SetGcToDimmedVideo( aGc );
+                        }
+                    else
+                        {
+                        SetGcToNormalVideo( aGc );
+                        }
                     }
                 // This draw must only draw the text with a null brush or draw block highlight 
                 iFields[i]->Draw(aGc, font, topLeftOfField);
@@ -2703,12 +2857,15 @@
     GetCursorInfo( cursorPosition, cursorHeight, cursorWidth, cursorAscent );
 
     iEikonEnv->DrawCursor(this, cursorPosition, cursorWidth, cursorAscent, cursorHeight);
-    iExtension->iCursorShown = ETrue;
+    if ( iExtension )
+    	{
+        iExtension->iCursorShown = ETrue;
+    	}
     }
 
 void CEikMfne::HideCursor()
     {
-    if ( iExtension->iCursorShown )
+    if ( iExtension && iExtension->iCursorShown )
         {
         iEikonEnv->HideCursor(this);
         iExtension->iCursorShown = EFalse;
@@ -3150,7 +3307,8 @@
     void SetUninitialised(TBool aUninitialised);
     TBool IsUninitialised() const;
     void RefreshFromLocale(const CFont& aFont);
-
+    void ChangeAmPm();
+    TBool HasAmPm();
 private:
     void AddAmPmFieldsIfNecessaryL(CEikMfne& aOwner, TAmPm aAmPm, TLocalePos aPos);
 private:
@@ -3421,7 +3579,25 @@
         (iAmPm && iAmPm->IsUninitialised());
     }
 
-
+void CTimeEditor::ChangeAmPm()
+	{
+	if ( iAmPm && HasAmPm() )
+		{
+	    if ( iAmPm->IdOfCurrentSymbolicItem() == EPm )
+	    	{
+	        iAmPm->SetCurrentSymbolicItemToId(EAm);
+	    	}
+	    else
+	    	{
+            iAmPm->SetCurrentSymbolicItemToId(EPm);
+	    	}
+		}
+	}
+
+TBool CTimeEditor::HasAmPm()
+	{
+	return iAmPm && ( iFlags&EIn12HourFormat );
+	}
 // CDateEditor
 
 class CDateEditor : public CBase
@@ -3819,7 +3995,9 @@
 EXPORT_C CEikTimeEditor::~CEikTimeEditor()
     {
     AKNTASHOOK_REMOVE();
+    iExtension->iExtendedInputCapabilities->UnregisterObserver(iTimeExtension);
     delete iTimeEditor;
+    delete iTimeExtension;
     }
 
 EXPORT_C void CEikTimeEditor::ConstructL(const TTime& aMinimumTime, const TTime& aMaximumTime, const TTime& aInitialTime, TUint32 aFlags)
@@ -3830,6 +4008,10 @@
     iTimeEditor->ConstructFieldsL(*this, aInitialTime, *Font());
     iTimeEditor->RefreshFromLocale(*Font());
     DoSetMinimumAndMaximum(aMinimumTime, aMaximumTime);
+    iTimeExtension = CEikTimeEditorExtension::NewL();
+    iTimeExtension->iEditor = this;
+    iExtension->iExtendedInputCapabilities->RegisterObserver(iTimeExtension);
+    SetFeature( CEikMfne::EChangeAmPm, iTimeEditor->HasAmPm() );
     }
 
 EXPORT_C void CEikTimeEditor::SetMinimumAndMaximum(const TTime& aMinimumTime, const TTime& aMaximumTime)
@@ -3925,6 +4107,19 @@
     return iTimeEditor->IsUninitialised();
     }
 
+void CEikTimeEditor::ChangeAmPm( )
+	{
+	TInt para( 0 );
+    GetFeature( CEikMfne::EChangeAmPm, para );
+	if ( para )
+		{
+	    iTimeEditor->ChangeAmPm();
+	    DrawDeferred();
+	    TRAP_IGNORE ( ReportEventL( MCoeControlObserver::EEventStateChanged ) );
+        ReportUpdate();
+		}
+	return;
+	}
 // CEikDateEditor
 
 EXPORT_C CEikDateEditor::CEikDateEditor()
@@ -3989,18 +4184,24 @@
     return(Date());
     }
 
-EXPORT_C TKeyResponse CEikDateEditor::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
-    {
-    if (iDateEditor->OfferKeyEventL(aKeyEvent, aType)==EKeyWasConsumed)
-        return EKeyWasConsumed;
-    if ( ( aType==EEventKey)&& 
-           ( aKeyEvent.iCode == EKeyLeftArrow || aKeyEvent.iCode == EKeyRightArrow || 
-             aKeyEvent.iCode == EKeyDownArrow || aKeyEvent.iCode == EKeyUpArrow ) )
+EXPORT_C TKeyResponse CEikDateEditor::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+	TKeyResponse ret = EKeyWasNotConsumed;
+    if ( iDateEditor->OfferKeyEventL( aKeyEvent, aType ) == EKeyWasConsumed )
+    	{
+        ret = EKeyWasConsumed;
+    	}
+    else 
     	{
-        iDateEditor->UpdateMaxDay( *Font() );
+	    ret = CEikMfne::OfferKeyEventL( aKeyEvent, aType );
+	    if ( ( aType == EEventKey ) && 
+		     ( aKeyEvent.iCode == EKeyDownArrow || aKeyEvent.iCode == EKeyUpArrow ) )
+		    {
+		    iDateEditor->UpdateMaxDay( *Font() );
+		    this->DrawDeferred();
+		    }
     	}
-
-    return CEikMfne::OfferKeyEventL(aKeyEvent, aType);
+    return ret;
     }
 
 EXPORT_C void CEikDateEditor::ConstructFromResourceL(TResourceReader& aResourceReader)
@@ -4101,8 +4302,10 @@
 EXPORT_C CEikTimeAndDateEditor::~CEikTimeAndDateEditor()
     {
     AKNTASHOOK_REMOVE();
+    iExtension->iExtendedInputCapabilities->UnregisterObserver(iTimeDateExtension);
     delete iTimeEditor;
     delete iDateEditor;
+    delete iTimeDateExtension;
     }
 
 EXPORT_C void CEikTimeAndDateEditor::ConstructL(const TTime& aMinimumTimeAndDate, const TTime& aMaximumTimeAndDate,
@@ -4148,6 +4351,10 @@
     // do stuff that can only be done when all leaving functions have successfully been done
     if (aInterveningText)
         interveningText->SetText(aInterveningText);
+    iTimeDateExtension = CEikTimeAndDateEditorExtension::NewL();
+    iTimeDateExtension->iEditor = this;
+    iExtension->iExtendedInputCapabilities->RegisterObserver(iTimeDateExtension);
+    SetFeature( CEikMfne::EChangeAmPm, iTimeEditor->HasAmPm() );
     }
 
 EXPORT_C void CEikTimeAndDateEditor::SetMinimumAndMaximum(const TTime& aMinimumTimeAndDate, const TTime& aMaximumTimeAndDate)
@@ -4287,6 +4494,19 @@
     {
     }
 
+void CEikTimeAndDateEditor::ChangeAmPm( )
+	{
+	TInt para( 0 );
+    GetFeature( CEikMfne::EChangeAmPm, para );
+	if ( para )
+		{
+	    iTimeEditor->ChangeAmPm();
+	    DrawDeferred();
+	    TRAP_IGNORE ( ReportEventL( MCoeControlObserver::EEventStateChanged ) );
+        ReportUpdate();
+		}
+	return;
+	}
 
 // CEikDurationEditor
 
@@ -4578,10 +4798,19 @@
 EXPORT_C void CEikMfne::MakeVisible( TBool aVisible )
     {
     CEikBorderedControl::MakeVisible( aVisible );
-    if ( !aVisible && iExtension->iCursorShown )
+    if ( !aVisible && iExtension && iExtension->iCursorShown )
         {
         HideCursor();
         }
+    
+    if ( iExtension && !aVisible )
+        {
+        TRAP_IGNORE (
+            iExtension->iExtendedInputCapabilities->ReportEventL( 
+                CAknExtendedInputCapabilities::MAknEventObserver::EClosePenInputRequest, 
+                0 );
+            )
+        }
     }
 
 void CEikMfne::SetValidateCallBack( TCallBack aCallBack )