diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/akninfrm.cpp --- /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 +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#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( 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( 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( 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