fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlCandidateSelected.cpp
branchRCL_3
changeset 56 8152b1f1763a
parent 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlCandidateSelected.cpp	Wed Oct 13 14:55:58 2010 +0300
@@ -0,0 +1,309 @@
+/*
+* Copyright (c) 2002-2004 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:           
+*       Provides the CAknFepUICtrlCandidateSelected methods.
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <uikon/eikdefmacros.h>
+#endif
+#include <eiklabel.h>
+#include <AknUtils.h>
+#include <AknsDrawUtils.h>
+#include "AknFepUIAvkonCtrlCandidateSelected.h"
+#include "AknFepUIAvkonCtrlPinyinPopup.h"
+#include "AknFepUiInterfacePanic.h"
+#include <skinlayout.cdl.h>
+
+class CEikLabel;
+
+CAknFepUICtrlCandidateSelected* CAknFepUICtrlCandidateSelected::NewL(RWindowTreeNode& aParent)
+    {
+    CAknFepUICtrlCandidateSelected* self = new(ELeave) CAknFepUICtrlCandidateSelected;
+    CleanupStack::PushL(self);
+    self->ConstructL(aParent);
+    CleanupStack::Pop();
+    return self;
+    }
+
+CAknFepUICtrlCandidateSelected::~CAknFepUICtrlCandidateSelected()
+    {
+    delete iOrdinalLabel;
+    delete iCandidateLabel;
+    }
+
+void CAknFepUICtrlCandidateSelected::SetText(TPtrC aCharacter)
+    {
+    // make sure that we only copy as many characters as we can show
+    TInt textLen = aCharacter.Length();
+    TInt textLength = textLen > EMaxSelectedCandidateLength? EMaxSelectedCandidateLength:textLen;
+    TPtrC newText = aCharacter.Left(textLength);
+    TPtr ptr = iBuffer.Des();
+    if(ptr != newText)
+        {
+        ptr.Copy(newText);
+        // ignore any errors... we have guaranteed that the descriptor already has sufficient characters to avoid a realloc
+        TRAP_IGNORE( iCandidateLabel->SetTextL(iBuffer)); 
+        }
+    }
+
+void CAknFepUICtrlCandidateSelected::SetOrdinal(TInt aOrdinal)
+    {
+    __ASSERT_DEBUG(aOrdinal < CAknFepUICtrlPinyinPopup::EMaxPhraseCandidate, AknFepUiInterfacePanic(EAknFepUiInterfacePanicNewVisibleCountExceedsRange));
+    __ASSERT_DEBUG(aOrdinal >= 0, AknFepUiInterfacePanic(EAknFepUiInterfacePanicNewVisibleCountExceedsRange));
+
+    TBuf<2> buf;
+    buf.Format(_L("%d"), aOrdinal);
+    TRAP_IGNORE(iOrdinalLabel->SetTextL(buf));
+    }
+
+void CAknFepUICtrlCandidateSelected::SetCandidateMode(CAknFepUICtrlCandidatePane::TCandidateMode aMode)
+    {
+    if(iCandidateMode != aMode)
+        {
+        iCandidateMode = aMode;
+        
+        LayoutRects();
+        LayoutContainedControls();
+        DrawDeferred();
+        }
+    }
+
+void CAknFepUICtrlCandidateSelected::SetLayout(CAknFepUICtrlContainerChinese::TPaneLayout aLayout)
+    {
+    iPaneLayout = aLayout;
+    }
+
+void CAknFepUICtrlCandidateSelected::ShowOrdinal(TBool aValue)
+	{
+	if(!COMPARE_BOOLS(iShowOrdinal,aValue))
+		{
+		iShowOrdinal = aValue;
+		UpdateLabelVisibility();
+		}
+	}
+
+void CAknFepUICtrlCandidateSelected::SizeChanged()
+    {
+    LayoutRects();
+    LayoutContainedControls();
+    }
+
+TInt CAknFepUICtrlCandidateSelected::CountComponentControls() const
+    {
+    CCoeControl* controls[] = 
+        {
+        iOrdinalLabel,
+        iCandidateLabel
+        } ;
+
+    TInt count = 0 ;
+    for (TUint ii = 0 ; ii < (sizeof(controls) / sizeof(CCoeControl*)) ; ii++)
+        if(controls[ii])
+            count++ ;
+    return count ;
+    }
+
+CCoeControl* CAknFepUICtrlCandidateSelected::ComponentControl(TInt aIndex) const 
+    {
+    CCoeControl* controls[] = 
+        {
+        iOrdinalLabel,
+        iCandidateLabel
+        } ;
+
+    for (TUint ii = 0; (ii < sizeof(controls) / sizeof(CCoeControl*)) ; ii++)
+        if (controls[ii] && aIndex-- == 0)
+            return controls[ii] ;
+    // shouldn't be called while no components.
+    return NULL ;
+    }
+
+void CAknFepUICtrlCandidateSelected::Draw(const TRect& /*aRect*/) const
+    {
+    CWindowGc& gc = SystemGc();
+
+    TBool skinnedDraw = EFalse;
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    TRect outerRect;
+    TRect innerRect;
+    CalculateFrameRects(outerRect, innerRect);
+
+    // draw the whole frame background according to the containing context, which in this case
+    // is the candidate pane, to avoid corner drawing mess and to cope with masked grid frame centre
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext(this);
+    AknsDrawUtils::DrawBackground(skin, cc, this, gc, 
+        outerRect.iTl, outerRect, KAknsDrawParamDefault);
+
+    skinnedDraw = AknsDrawUtils::DrawFrame(skin, gc, outerRect, innerRect,
+        KAknsIIDQsnFrGrid, KAknsIIDQsnFrGridCenter); 
+
+    if(!skinnedDraw)
+        {
+        iRectShadow.DrawRect(gc);
+        iRectHighlight.DrawRect(gc);
+        }
+    }
+
+void CAknFepUICtrlCandidateSelected::ConstructL(RWindowTreeNode& aParent)
+    {
+    CreateWindowL(aParent);
+
+    iOrdinalLabel = new(ELeave) CEikLabel;
+    iOrdinalLabel->SetBufferReserveLengthL(EOneCandidate);
+    iOrdinalLabel->SetContainerWindowL(*this);
+
+    // force label to contain required number of characters from the outset
+    iCandidateLabel = new(ELeave) CEikLabel;
+    iCandidateLabel->SetBufferReserveLengthL(EMaxSelectedCandidateLength); // this will do a realloc now, so no need to later
+    iCandidateLabel->SetContainerWindowL(*this);
+    }
+
+CAknFepUICtrlCandidateSelected::CAknFepUICtrlCandidateSelected()
+    : 
+    iCandidateMode(CAknFepUICtrlCandidatePane::ECandidateModeNormal),
+    iPaneLayout(CAknFepUICtrlContainerChinese::ELayoutCandidate),
+    iShowOrdinal(ETrue)
+    {
+    }
+
+void CAknFepUICtrlCandidateSelected::LayoutRects()
+    {
+    TRect rect = Rect();
+    iRectShadow.LayoutRect(rect, AKN_LAYOUT_WINDOW_Candidate_selection_highlight_Line_1(rect));
+    iRectHighlight.LayoutRect(rect, AKN_LAYOUT_WINDOW_Candidate_selection_highlight_Line_2(rect));
+    }
+
+void CAknFepUICtrlCandidateSelected::LayoutContainedControls()
+    {
+    TRect rect = Rect();
+
+    // layout candidate label
+    TAknTextLineLayout candidateLayout = AKN_LAYOUT_TEXT_Chinese_universal_FEP_candidate_pane_texts_Line_1;
+    TAknTextLineLayout ordinalLayout = AKN_LAYOUT_TEXT_Chinese_universal_FEP_candidate_pane_texts_Line_3; 
+    candidateLayout.il = candidateLayout.il - ordinalLayout.il;
+
+    TAknLayoutText layoutCandidate;
+    layoutCandidate.LayoutText(rect,candidateLayout);
+    
+    const CFont* font = layoutCandidate.Font();
+    TInt labelWidthInPixels = 0;
+    if(font)
+	    {
+	    TInt bufLength = iBuffer.Length();
+	    if(bufLength != 0)
+		    {
+		    TPtrC newChars = iBuffer.Left(bufLength);
+		    labelWidthInPixels = font->TextWidthInPixels(newChars);
+		    }
+	    }
+    TRect rectCandidate = layoutCandidate.TextRect();
+    if(labelWidthInPixels == 0)
+	    {
+	    rectCandidate.iTl.iX = 0;
+	    }
+    rectCandidate.SetWidth(labelWidthInPixels);
+    iCandidateLabel->SetRect(rectCandidate);
+    iCandidateLabel->SetFont(font);
+    
+    // layout ordinal label
+    TBufC16<1> buf;
+    TPtr16 ptr = buf.Des();
+    ptr = (*(iOrdinalLabel->Text())).Left(EOneCandidate);
+
+    TAknLayoutText layoutOrdinal;
+    ordinalLayout.il = 0;
+	
+    layoutOrdinal.LayoutText(rect,ordinalLayout);
+    
+    const CFont* fontOrdinal = layoutOrdinal.Font();
+    
+    TRect ordinalRect = layoutOrdinal.TextRect();
+
+    // inserted in 2006.03.29
+    TPoint ordinalPosition;
+    // end inserting
+    TInt ordinalWidth = fontOrdinal->TextWidthInPixels(ptr);
+    
+    /* removing in 2006.03.29
+    ordinalRect.iTl.iX = rectCandidate.iTl.iX - ordinalWidth;
+    ordinalRect.iTl.iY = rectCandidate.iTl.iY;
+
+    ordinalRect.SetWidth(ordinalWidth);
+    ordinalRect.SetHeight(fontOrdinal->HeightInPixels());
+    */ // end removing
+
+    // inserted in 2006.03.29
+    ordinalPosition.iX = rectCandidate.iTl.iX - ordinalWidth;
+    ordinalPosition.iY = rectCandidate.iTl.iY;
+
+    ordinalRect = TRect(ordinalPosition,
+                        TPoint(ordinalPosition.iX + ordinalRect.Width(),
+                               ordinalPosition.iY + ordinalRect.Height()));
+    // end inserting
+
+    iOrdinalLabel->SetRect(ordinalRect);
+    iOrdinalLabel->SetFont(fontOrdinal);
+
+    // override with skin text color
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    TRgb labelTextColor;
+
+    AknsUtils::GetCachedColor(skin, labelTextColor, 
+                              KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG11);
+
+    TRAP_IGNORE( 
+	    iCandidateLabel->OverrideColorL(EColorLabelText, labelTextColor);
+	    iOrdinalLabel->OverrideColorL(EColorLabelText, labelTextColor);
+	    );
+    }
+
+void CAknFepUICtrlCandidateSelected::CalculateFrameRects(TRect& aOuterRect, TRect& aInnerRect) const
+    {
+    TRect windowRect = Rect();
+
+    TAknLayoutRect topLeft;
+    topLeft.LayoutRect(windowRect, SkinLayout::Highlight_skin_placing__grid__Line_2());
+
+    TAknLayoutRect bottomRight;
+    bottomRight.LayoutRect(windowRect, SkinLayout::Highlight_skin_placing__grid__Line_5());
+
+    aOuterRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr);
+    aInnerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl);
+    }
+
+void CAknFepUICtrlCandidateSelected::UpdateLabelVisibility()
+	{
+	if(iShowOrdinal)
+		{
+		iOrdinalLabel->MakeVisible(ETrue);
+		}
+	else
+		{
+		iOrdinalLabel->MakeVisible(EFalse);
+		}
+	}
+
+// End of file