uifw/AvKon/src/akninfrm.cpp
changeset 0 2f259fa3e83a
child 10 9f56a4e1b8ab
child 14 3320e4e6e8bb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/akninfrm.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,519 @@
+/*
+* 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: 
+*
+*/
+
+
+// Akninfrm.cpp
+//
+// Copyright (c) 1997-2001 Symbian Ltd.  All rights reserved.
+//
+#include <akninfrm.h>
+#include <eikenv.h>
+#include <barsread.h>
+#include <eikedwin.h>
+
+#include <AknsDrawUtils.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <aknlists.h>
+#include <AknsFrameBackgroundControlContext.h>
+
+#include <aknconsts.h>
+#include <avkon.mbg>
+
+#include <aknlayout.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <aknapaclayout.cdl.h>
+#include <AknIconUtils.h>
+
+#include "akntrace.h"
+CAknInputFrame::CAknInputFrame() 
+    {
+    }
+
+EXPORT_C CAknInputFrame::~CAknInputFrame()
+    {
+    AknsUtils::DeregisterControlPosition( iField );
+    delete iIcon;
+    delete iPopupFindCC;
+    delete iPopupListCC;
+    delete iFileName;
+
+    if ( iFlags & EOwnsInputContext )
+        {
+        delete iInputContext;
+        }
+    
+    if ( iFlags & EOwnsField )
+        {
+        delete iField;
+        }
+    }
+
+/**
+ * Creates CAknInputFrame. 
+ * Gets six parameters:
+ * CCoeControl* aField	  - Control, which will be located inside the input frame.
+ * TBool aOwner           - Defines the ownership of the control.
+ * const TDesC& aFileName - Bitmap file name and path.
+ * TInt aBitmapId         - Bitmap Id
+ * TInt aMaskId           - Bitmap Mask Id
+ * TUint32 aFlags		  - Flags	
+ *
+ * 
+ */
+EXPORT_C CAknInputFrame* CAknInputFrame::NewL(CCoeControl* aField, TBool aOwner, const TDesC& aFileName, TInt aBitmapId,
+                                              TInt aMaskId, TUint32 aFlags)
+    {
+    CAknInputFrame* bf = new (ELeave) CAknInputFrame;
+    CleanupStack::PushL(bf);
+    bf->ConstructL(aField, aOwner, aFileName, aBitmapId, aMaskId, aFlags);
+    CleanupStack::Pop();
+    return bf;
+    }
+
+/**
+ * Creates CAknInputFrame. 
+ * Gets six parameters:
+ * CCoeControl* aField	  - Control, which will be located inside the input frame.
+ * TBool aOwner           - Defines the ownership of the control.
+ * CGulIcon* aIcon        - Bitmap file name and path.
+ * TUint32 aFlags		  - Flags	
+ *
+ * 
+ */
+EXPORT_C CAknInputFrame* CAknInputFrame::NewL(CCoeControl* aField,TBool aOwner, CGulIcon* aIcon, TUint32 aFlags)
+    {
+    CAknInputFrame* bf = new (ELeave) CAknInputFrame;
+    CleanupStack::PushL(bf);
+    bf->ConstructL(aField,aOwner, aIcon, aFlags);
+    CleanupStack::Pop();
+    return bf;
+    }
+
+void CAknInputFrame::ConstructL( CCoeControl* aField,
+                                 TBool aOwner,
+                                 CGulIcon* aIcon,
+                                 TUint32 aFlags )
+    {
+    BaseConstructL(aField, aOwner, aFlags);
+    iIcon=aIcon; // May not leave after this
+    }
+
+void CAknInputFrame::ConstructL( CCoeControl* aField,
+                                 TBool aOwner,
+                                 const TDesC& aFileName,
+                                 TInt aBitmapId,
+                                 TInt aMaskId,
+                                 TUint32 aFlags )
+    {
+    BaseConstructL(aField, aOwner, aFlags);
+    iFileName = aFileName.Alloc();
+    iBitmapId = aBitmapId;
+    iMaskId = aMaskId;
+    
+    if(aFileName.Length())
+        {
+        if( aFileName.Compare( KAvkonBitmapFile ) == 0 )
+            {
+            // If the icon comes from Avkon MBM, set skin IID if known
+            switch( aBitmapId )
+                {
+                case EMbmAvkonQgn_indi_find_glass:
+                    iIconSkinID = KAknsIIDQgnIndiFindGlass;
+                    break;
+                case EMbmAvkonQgn_indi_find_glass_pinb:
+                    iIconSkinID = KAknsIIDQgnIndiFindTitle;
+                    break;
+                case EMbmAvkonQgn_indi_find_goto:
+                    iIconSkinID = KAknsIIDQgnIndiFindGoto;
+                    break;
+                default:
+                    iIconSkinID = KAknsIIDNone;
+                    break;
+                }
+            }
+		CAknInputFrame::CreateIconL();
+        }
+    }
+
+void CAknInputFrame::BaseConstructL( CCoeControl* aField, TBool aOwner, TUint32 aFlags )
+    {
+    iFlags = aFlags;
+
+    if ( aField )
+        {
+        aField->SetContainerWindowL(*this);
+        aField->SetObserver(this);
+        static_cast<CEikBorderedControl*>( aField )->SetBorder( TGulBorder::ENone );
+        }
+
+    // Construct context for popup find background
+    if( iFlags & EPopupLayout )
+        {
+        iPopupFindCC = CAknsFrameBackgroundControlContext::NewL( KAknsIIDQsnFrPopup, Rect(), Rect(), EFalse );
+        }
+    // Construct context for popup list background
+    if  ( iFlags & EPopupWindowLayout )
+        {
+        iPopupListCC = CAknsBasicBackgroundControlContext::NewL( KAknsIIDQsnFrPopupCenter, Rect(), EFalse );
+        }
+    
+    if ( aOwner )
+        {
+        iFlags|=EOwnsField;
+        }
+    
+    iField = aField; // May not leave after this
+    iIconSkinID = KAknsIIDNone;
+    }
+
+EXPORT_C void CAknInputFrame::ConstructFromResourceL(TResourceReader& aReader)
+    {
+    TPtrC filename = aReader.ReadTPtrC();
+    TInt32 pid = aReader.ReadInt16();
+    TInt32 mid = aReader.ReadInt16();
+    TInt32 flags = aReader.ReadInt16();
+    const TInt ctrlType = aReader.ReadInt16();
+    TPtrC infoText = aReader.ReadTPtrC(); // discarded, since infotext is deprecated
+
+    CCoeControl* field = EikControlFactory::CreateByTypeL(ctrlType).iControl;
+    CleanupStack::PushL(field);
+    field -> ConstructFromResourceL(aReader);
+    ConstructL(field,ETrue,filename,pid,mid,flags);
+    CleanupStack::Pop(); // field
+    if ((ctrlType==EEikCtGlobalTextEditor) || (ctrlType==EEikCtEdwin))
+        {
+        TMargins8 margins;
+        margins.SetAllValuesTo(0);
+        STATIC_CAST(CEikBorderedControl*,iField)->SetBorder(TGulBorder::ENone);                
+        STATIC_CAST(CEikEdwin*,field)->SetBorderViewMargins(margins);
+        }
+    }
+
+/**
+* Return pointer to field 
+*/
+EXPORT_C CCoeControl* CAknInputFrame::Field() const
+    {
+    return iField;
+    }
+
+EXPORT_C void CAknInputFrame::SetInfoTextL(const TDesC& /*aText*/)
+    {
+    RDebug::Printf("%s: Warning: deprecated method CAknInputFrame::SetInfoTextL() called", __FILE__ );
+    }
+
+/**
+* Sets additional icon to input frame 
+* Gets one parameter:
+* CGulIcon* aIcon          - Icon.
+*/
+void CAknInputFrame::SetIcon( CGulIcon* aIcon )
+    {
+    delete iIcon;
+    iIcon = aIcon;
+    iIconSkinID = KAknsIIDNone;
+    }
+
+TUint CAknInputFrame::Flags() const
+    {
+    return iFlags;
+    }
+
+void CAknInputFrame::SetFlags( TUint aNewFlags )
+    {
+    iFlags = aNewFlags;
+    }
+
+EXPORT_C void CAknInputFrame::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType)
+    {
+    if (aEventType == EEventRequestFocus)
+        {
+        FocusChanged(EDrawNow);
+        }
+    }
+
+void CAknInputFrame::PrepareForFocusLossL()
+    {
+    iField->PrepareForFocusLossL();
+    }
+
+EXPORT_C TKeyResponse CAknInputFrame::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    if ( iField )
+        {
+        return iField->OfferKeyEventL( aKeyEvent, aType );
+        }
+    return EKeyWasNotConsumed;
+    }
+
+void CAknInputFrame::SizeChanged()
+    {
+    // There are 5 different layouts to be handled by this component:
+    // --------------------------------------------------------------
+    // Standard          ( fixed find pane in column lists )
+    // PopupLayout       ( popup find pane in any mainpane list )
+    // PinbLayout        ( used by pinboard app )
+    // ClockAppLayout    ( has been removed from laf - fall back to standard )
+    // PopupWindowLayout ( used by list query and popuplist )
+    _AKNTRACE_FUNC_ENTER;
+    TRect parent( Rect() );       // parent for components
+    TRect editorParent( Rect() ); // parent for the editor
+    TRect rect( Rect() );         // rect of the whole shebang
+    TAknLayoutRect r;            // common temporary layout rect
+
+    TBool apac( AknLayoutUtils::Variant() == EApacVariant && ( iFlags & EShowIndicators ) );
+    
+    TAknWindowComponentLayout outline = AknLayoutScalable_Avkon::input_find_pane();
+    TAknWindowLineLayout iconPos = AknLayoutScalable_Avkon::find_popup_pane_g1().LayoutLine();
+    TAknTextComponentLayout   editor = AknLayoutScalable_Avkon::input_popup_find_pane_t1( apac ? 2 : 0 );
+
+
+    if ( iFlags & EPopupLayout ) // popup find box 
+        {
+        _AKNTRACE( "[%s][%s] PopupLayout", 
+        		"CAknInputFrame", __FUNCTION__ );
+        r.LayoutRect( parent, AknLayoutScalable_Avkon::find_popup_pane() );
+        parent = r.Rect();
+        r.LayoutRect( r.Rect(), AknLayoutScalable_Avkon::input_popup_find_pane_cp() );
+        editorParent = r.Rect();
+        outline  = AknLayoutScalable_Avkon::input_popup_find_pane_cp();
+        iconPos  = AknLayoutScalable_Avkon::find_popup_pane_g1().LayoutLine();
+        editor = AknLayoutScalable_Avkon::input_popup_find_pane_t1( apac ? 2 : 0 );
+        if ( iPopupFindCC )
+            {
+            r.LayoutRect( rect, AknLayoutScalable_Avkon::find_popup_pane() );
+            iPopupFindCC->SetFrameRects( rect, r.Rect() );
+            }
+        }
+    else if ( iFlags & EPinbLayout ) // used by pinboard app
+        {
+        _AKNTRACE( "[%s][%s] PinbLayout", 
+                "CAknInputFrame", __FUNCTION__ );
+        outline = AknLayoutScalable_Apps::input_focus_pane_cp01(0);
+        iconPos = AknLayoutScalable_Apps::find_pinb_pane_g1(0);
+        editor = AknLayoutScalable_Apps::find_pinb_pane_t2( apac ? 1 : 0 );
+        }
+
+    else if ( iFlags & EPopupWindowLayout )     // list query or popup list
+        {
+        _AKNTRACE( "[%s][%s] PopupWindowLayout", 
+                 "CAknInputFrame", __FUNCTION__ );
+        outline = AknLayoutScalable_Avkon::input_popup_find_pane_cp();
+        iconPos = AknLayoutScalable_Avkon::find_popup_pane_g1();
+        
+        TAknTextComponentLayout textComponentLayout(
+            TAknWindowComponentLayout::ComposeText( outline, 
+                AknLayoutScalable_Avkon::input_popup_find_pane_t1( apac ? 2 : 0 ) ) );
+                
+        editor = textComponentLayout;
+        
+        if ( iPopupListCC )
+            {
+            iPopupListCC->SetRect( rect );
+            }
+        }
+    else // standard find pane
+        {
+        _AKNTRACE( "[%s][%s] Standard Layout", 
+                 "CAknInputFrame", __FUNCTION__ );
+        outline = AknLayoutScalable_Avkon::input_find_pane();
+        iconPos = AknLayoutScalable_Avkon::find_pane_g1();
+        editor = AknLayoutScalable_Avkon::input_find_pane_t2( apac ? 1: 0 );
+        r.LayoutRect( rect, AknLayoutScalable_Avkon::input_find_pane() );
+        editorParent = r.Rect();
+        }
+
+
+
+    // --- set size and position of the frame around editor ---
+    r.LayoutRect( parent, outline );
+    iOutlineRect = r.Rect();
+    _AKNTRACE( "[%s][%s] iOutlineRect: %s:%d,%d %s:%d,%d", 
+            "CAknInputFrame", __FUNCTION__, 
+            "LT", iOutlineRect.iTl.iX, iOutlineRect.iTl.iY, 
+            "BR", iOutlineRect.iBr.iX, iOutlineRect.iBr.iY );
+
+    if ( !iInputContext )
+        {
+        // we need to provide own context if one does not exist
+        // because old style drawing did kind of work even
+        // without calling SetInputContext( ... )
+        iInputContext = CAknsFrameBackgroundControlContext::NewL(
+            KAknsIIDQsnFrInput, TRect(0,0,0,0), TRect(0,0,0,0), EFalse );
+        iFlags = iFlags | EOwnsInputContext;
+        // also need to provide skin for the editor in this case
+        static_cast<CEikEdwin*>( iField )->SetSkinBackgroundControlContextL( iInputContext );
+        }
+
+    if ( iInputContext )
+        {
+        // this layout is actually from form!
+        // there exists no layout for find box :-/ but this should do
+        // no help from adaptation layer either
+        r.LayoutRect( iOutlineRect, AknLayoutScalable_Avkon::input_focus_pane_g1() );
+        iInputContext->SetFrameRects( iOutlineRect, r.Rect() );
+
+        // and chain transparent contexts properly
+        MAknsControlContext* bg = iPopupFindCC ? iPopupFindCC : iPopupListCC;
+        if( !bg )
+            {
+            bg = AknsDrawUtils::ControlContext( this );
+            }
+        iInputContext->SetParentContext( bg );
+        }
+
+    // --- set magnifying glass icon size & position ---
+    iMagnIconPos.LayoutRect( parent, iconPos);
+    CFbsBitmap* iconBitmap = iIcon->Bitmap();
+    if ( iconBitmap  )
+        {
+        AknIconUtils::SetSize( iconBitmap, iMagnIconPos.Rect().Size() );
+        }
+    // --- layout the editor ---
+    AknLayoutUtils::LayoutEdwin( static_cast<CEikEdwin*>( iField ),
+                                 editorParent,
+                                 editor.LayoutLine(),
+                                 EAknsCIQsnTextColorsCG25,
+                                 0,
+                                 ETrue );    
+                                 
+    AknsUtils::RegisterControlPosition( iField );  // prevent flicker
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+EXPORT_C TSize CAknInputFrame::MinimumSize()
+    {        
+    return TSize(0,0);
+    }
+ 
+void CAknInputFrame::FocusChanged( TDrawNow aDrawNow )
+    {
+    iField->SetFocus( IsFocused(), aDrawNow );
+    }
+
+void CAknInputFrame::Draw( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc = SystemGc();
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+    TRect rect( Rect() );
+    
+    if ( iFlags & EPopupLayout ) // popup find box
+        {
+        // draw background behind the frame
+        AknsDrawUtils::Background( skin, cc, this, gc, rect );
+        // draw background & frames of popup find window
+        AknsDrawUtils::Background( skin, iPopupFindCC, gc, rect );
+        }
+    else if ( iFlags & EPopupWindowLayout ) // popuplist / list query
+        {    
+        // If softkeys are embedded to popup, background is drawn in popup
+        if ( !( iFlags & EPopupWindowEmbeddedSoftkeys ) )
+            {
+            AknsDrawUtils::Background( skin, iPopupListCC, gc, rect );
+            }
+        }
+    else  // standard fixed find pane or pinboard
+        {
+        // 'this' is required for parent absolute layouts 
+        AknsDrawUtils::Background( skin, cc, this, gc, rect );
+        }
+
+
+    // draw the frame (and bg) around editor. currently same for all layouts
+    // We have to use BackGround() because
+    // - frame is transparent
+    // - frame has parent context if popup layout is used
+    // - frame also acts as background for the editor
+    // 'this' is required for parent absolute layouts 
+    AknsDrawUtils::BackgroundBetweenRects( skin, iInputContext, this, gc, iOutlineRect, iField->Rect() );
+    
+    // draw the icon
+    CFbsBitmap* iconBitmap = iIcon->Bitmap();
+    CFbsBitmap* iconMask = iIcon->Mask();
+    iMagnIconPos.DrawImage( gc, iconBitmap, iconMask );
+    }
+
+
+EXPORT_C void CAknInputFrame::SetLineState(TBool aLineVisible)
+    {
+    if (!aLineVisible)
+        {
+        iFlags |= EFixedFindWithoutLine;
+        }
+    else
+        {
+        iFlags &= ~EFixedFindWithoutLine;
+        }
+    }
+
+EXPORT_C void CAknInputFrame::SetInputContext(CAknsFrameBackgroundControlContext* aContext)
+    {
+    if ( iInputContext && iFlags & EOwnsInputContext )
+        {
+        delete iInputContext;
+        iInputContext = NULL;
+        iFlags = iFlags &~ EOwnsInputContext;
+        }
+    iInputContext = aContext;
+    }
+
+void CAknInputFrame::CreateIconL()
+	{
+    CFbsBitmap *icon;
+    CFbsBitmap *mask;
+    
+    TSize iconSize( 0, 0 );
+    
+    if ( iIcon && iIcon->Bitmap() )
+        {
+        iconSize = iIcon->Bitmap()->SizeInPixels();         
+        }
+    
+    AknsUtils::CreateIconL( AknsUtils::SkinInstance(),
+                                iIconSkinID,
+                                icon, mask, *iFileName, iBitmapId, iMaskId );
+
+    delete iIcon;
+    iIcon = NULL;
+    
+    iIcon = CGulIcon::NewL(icon, mask);                                 
+
+    if ( iconSize != TSize( 0, 0 ) )
+        {
+        AknIconUtils::SetSize( iIcon->Bitmap(), iconSize );
+        }
+	}
+	
+
+
+void CAknInputFrame::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    switch ( aType )
+        {
+        case KAknsMessageSkinChange:
+        case KEikDynamicLayoutVariantSwitch:
+            CreateIconL();
+            break;
+            
+        default:
+            break;
+        }
+    }
+// End of File