diff -r 000000000000 -r eb1f2e154e89 textinput/peninputcommonctrls/src/peninputdropdownlist/peninputcandidate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputcommonctrls/src/peninputdropdownlist/peninputcandidate.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,334 @@ +/* +* Copyright (c) 2002-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: candidate stands for every cell in drop down list +* +*/ + + +#include +#include +#include +#include + +#include "peninputcandidate.h" +#include "peninputdropdownlist.h" + +_LIT(KEllipsis, "\x2026"); + +// ======== MEMBER FUNCTIONS ======== + +// Implementation of Class CCandidate + +CCandidate* CCandidate::NewL(const TDesC& aString, + MFepCtrlDropdownListContext* aOwner) + { + CCandidate* self = new (ELeave) CCandidate(aString, aOwner); // Q: is here will call ctor of base class? + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +void CCandidate::ConstructL() + { + iDisplayText = iCandidate.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CCandidate::CCandidate +// construct function +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCandidate::CCandidate(const TDesC& aString, MFepCtrlDropdownListContext* aOwner) +: iCandidate(aString),iBaselineOffset(0), iOwner(aOwner) + { + } + +// ----------------------------------------------------------------------------- +// CCandidate::~CCandidate +// destructor function +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCandidate::~CCandidate() + { + delete iDisplayText; + } + +// ----------------------------------------------------------------------------- +// CCandidate::GetCandidate +// get candidate string +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const TDesC& CCandidate::GetCandidate() + { + return iCandidate; + } + +// ----------------------------------------------------------------------------- +// CCandidate::GetRect +// get rect of the candidate +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const TRect& CCandidate::GetRect() const + { + return iRect; + } + +// ----------------------------------------------------------------------------- +// CCandidate::Move +// move rect of the candidate +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCandidate::Move(const TPoint& aOffsetPoint) + { + iRect.Move(aOffsetPoint); + } + +// ----------------------------------------------------------------------------- +// CCandidate::SetPosition +// set position for the candidate +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCandidate::SetPositionL(const TPoint& aLeftTopPosition, + TInt aWidthForOneUnit, + TInt aHeight, + const CFont* aTextFont, + TInt aCellHorizontalMargin) + { + iTextFont = aTextFont; + + // Calculate base line offset + iBaselineOffset = aHeight/2 + aTextFont->AscentInPixels()/2 ; + + // Calculate the cell for the candidate + //const TInt cellCount = CalculateCells(aWidthForOneUnit, aTextFont); + const TInt cellCount = CalculateDisplayTextL(aWidthForOneUnit, aTextFont, iOwner->GetColNum()); + + // modified by txin + // original: + /* + iRect.iBr = aLeftTopPosition; + + iRect.SetRect(aLeftTopPosition, + TSize(cellCount * aWidthForOneUnit + (cellCount - 1) * aCellHorizontalMargin, + aHeight)); + */ + // if owner's horizontal direction is RToL, then aLeftTopPosition actually mean RightTop pos + TInt candHDir = iOwner->CandHDirection(); + TSize candSize = TSize(cellCount * aWidthForOneUnit + (cellCount - 1) * aCellHorizontalMargin, + aHeight); + (candHDir == CFepCtrlDropdownList::ECandFromLToR) ? + iRect.SetRect(aLeftTopPosition, candSize) : + iRect.SetRect(TPoint(aLeftTopPosition.iX - candSize.iWidth, aLeftTopPosition.iY), candSize); + // end modify + + return cellCount; + } + +// ----------------------------------------------------------------------------- +// CCandidate::DrawText +// draw text of the candidate +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCandidate::DrawText(CFbsBitGc& aGc, const CGraphicsContext::TTextAlign aAlignment, + const TInt aTextMargin, TRgb aTextColor, + TRgb aSpecialTextColor, const TDesC& aFixedText) + { + + aGc.SetBrushStyle(CGraphicsContext::ENullBrush); + if ( aFixedText.Length() == 0 ) + { + // If fixed text has no any data + aGc.SetPenColor(aTextColor); + if(TBidiText::TextDirectionality( *iDisplayText ) == TBidiText:: ERightToLeft) + { + // If find the fixed text in the candidate and the index is equal to 0 + TInt posX = 0; + if(!iTextFont) + { + iTextFont = iOwner->GetFont(); + } + if ( aAlignment == CGraphicsContext::ECenter ) + { + posX = iRect.iTl.iX + + (iRect.Width() - iTextFont->TextWidthInPixels(*iDisplayText)) / 2; + } + else if ( aAlignment == CGraphicsContext::ELeft ) + { + posX = iRect.iTl.iX + aTextMargin; + } + else if ( aAlignment == CGraphicsContext::ERight ) + { + posX = iRect.iTl.iX + iRect.Width() - + iTextFont->TextWidthInPixels(*iDisplayText) - aTextMargin; + } + + CGraphicsContext::TDrawTextExtendedParam param; + param.iParRightToLeft = ETrue; + aGc.DrawTextExtended(*iDisplayText, TPoint(posX,iRect.iTl.iY + iBaselineOffset), param); + } + else + { + aGc.DrawText( *iDisplayText, iRect, iBaselineOffset, aAlignment); + } + } + else + { + if ( iCandidate.Find(aFixedText) == 0 ) + { + // If find the fixed text in the candidate and the index is equal to 0 + TInt posX = 0; + if(!iTextFont) + { + iTextFont = iOwner->GetFont(); + } + if ( aAlignment == CGraphicsContext::ECenter ) + { + posX = iRect.iTl.iX + + (iRect.Width() - iTextFont->TextWidthInPixels(iCandidate)) / 2; + } + else if ( aAlignment == CGraphicsContext::ELeft ) + { + posX = iRect.iTl.iX + aTextMargin; + } + else if ( aAlignment == CGraphicsContext::ERight ) + { + posX = iRect.iTl.iX + iRect.Width() - + iTextFont->TextWidthInPixels(iCandidate) - aTextMargin; + } + + + // Draw Fixed text + aGc.SetPenColor(aTextColor); + aGc.DrawText(aFixedText, TPoint(posX,iRect.iTl.iY + iBaselineOffset)); + + // Snatch the special text + TPtrC buf = iCandidate.Mid(aFixedText.Length()); + + // Set X position for the special text + posX = posX + iTextFont->TextWidthInPixels(aFixedText); + + // Draw special text + aGc.SetPenColor(aSpecialTextColor); + aGc.DrawText(buf, TPoint(posX, iRect.iTl.iY + iBaselineOffset)); + } + else + { + aGc.SetPenColor(aTextColor); + if(TBidiText::TextDirectionality( iCandidate ) == TBidiText:: ERightToLeft) + { + // If find the fixed text in the candidate and the index is equal to 0 + TInt posX = 0; + if(!iTextFont) + { + iTextFont = iOwner->GetFont(); + } + if ( aAlignment == CGraphicsContext::ECenter ) + { + posX = iRect.iTl.iX + + (iRect.Width() - iTextFont->TextWidthInPixels(iCandidate)) / 2; + } + else if ( aAlignment == CGraphicsContext::ELeft ) + { + posX = iRect.iTl.iX + aTextMargin; + } + else if ( aAlignment == CGraphicsContext::ERight ) + { + posX = iRect.iTl.iX + iRect.Width() - + iTextFont->TextWidthInPixels(iCandidate) - aTextMargin; + } + + CGraphicsContext::TDrawTextExtendedParam param; + param.iParRightToLeft = ETrue; + aGc.DrawTextExtended(iCandidate, TPoint(posX,iRect.iTl.iY + iBaselineOffset), param); + } + else + { + aGc.DrawText( iCandidate, iRect, iBaselineOffset, CGraphicsContext::ECenter); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CCandidate::CalculateCells +// calculate the cell for the candidate +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCandidate::CalculateCells(const TInt aWidthForOneUnit, + const CFont* aTextFont, + const TDesC& aText) + { + const TInt width = aTextFont->TextWidthInPixels(aText) + 2 * iOwner->GetTextMargin(); + + if (width <= aWidthForOneUnit) + { + return 1; + } + + return (width + aWidthForOneUnit + + iOwner->GetCellHorizontalMargin() - 1)/(aWidthForOneUnit + iOwner->GetCellHorizontalMargin()); + } + +TInt CCandidate::CalculateDisplayTextL(const TInt aWidthForOneUnit, + const CFont* aTextFont, + TInt aColNum) + { + TInt cellcnt = CalculateCells(aWidthForOneUnit, aTextFont, *iDisplayText); + + if (cellcnt <= aColNum) + { + return cellcnt; + } + + TPtr ptr = iDisplayText->Des(); + + if (iOwner->CandTruncateType() == CFepCtrlDropdownList::ECandTruncateFromBeginning) + { + while (cellcnt > aColNum && ptr.Length() > 0) + { + ptr.Delete(0, 1); + cellcnt = CalculateCells(aWidthForOneUnit, aTextFont, ptr); + } + } + else if (iOwner->CandTruncateType() == CFepCtrlDropdownList::ECandTruncateAsEllipsis) + { + while (cellcnt > aColNum && ptr.Length() > 1) + { + ptr.Delete(ptr.Length()-2, 2); + ptr.Append(KEllipsis); + cellcnt = CalculateCells(aWidthForOneUnit, aTextFont, ptr); + } + } + else if (iOwner->CandTruncateType() == CFepCtrlDropdownList::ECandTruncateFromEnd) + { + while (cellcnt > aColNum && ptr.Length() > 0) + { + ptr.Delete(ptr.Length()-1, 1); + cellcnt = CalculateCells(aWidthForOneUnit, aTextFont, ptr); + } + } + + return cellcnt; + } + +// End Of File