diff -r 12c456ceeff2 -r 5253a20d2a1e emailuis/emailui/src/ncsattachmentfield.cpp --- a/emailuis/emailui/src/ncsattachmentfield.cpp Thu Jan 07 12:38:38 2010 +0200 +++ b/emailuis/emailui/src/ncsattachmentfield.cpp Mon Jan 18 20:08:26 2010 +0200 @@ -22,6 +22,7 @@ #include #include #include +#include #include "FreestyleEmailUiLayoutData.h" #include "FreestyleEmailUiAppui.h" @@ -30,6 +31,7 @@ #include "ncsattachmentfield.h" #include "ncsutility.h" #include "ncsheadercontainer.h" +#include "FSEmail.pan" CNcsAttachmentField* CNcsAttachmentField::NewL( @@ -39,9 +41,9 @@ { FUNC_LOG; CNcsAttachmentField* self = - new ( ELeave ) CNcsAttachmentField( aSizeObserver, aParentControl ); + new ( ELeave ) CNcsAttachmentField( aLabelTextId, aSizeObserver, aParentControl ); CleanupStack::PushL( self ); - self->ConstructL( aLabelTextId ); + self->ConstructL(); CleanupStack::Pop( self ); return self; } @@ -49,48 +51,34 @@ CNcsAttachmentField::~CNcsAttachmentField() { FUNC_LOG; - delete iAttachmentLabel; + iAttachmentLabels.ResetAndDestroy(); - delete iAttachmentName; - delete iAttachmentSizeDesc; + delete iAttachmentNames; + delete iAttachmentSizes; delete iAttachmentBitmap; delete iAttachmentMask; - - delete iActionMenuBitmap; - delete iActionMenuMask; } // ----------------------------------------------------------------------------- // CNcsAttachmentField::CNcsAttachmentField() // ----------------------------------------------------------------------------- // -CNcsAttachmentField::CNcsAttachmentField( MNcsFieldSizeObserver* aSizeObserver, +CNcsAttachmentField::CNcsAttachmentField( TInt aLabelTextId, + MNcsFieldSizeObserver* aSizeObserver, CNcsHeaderContainer* aParentControl ): MNcsControl( aSizeObserver ), - iParentControl( aParentControl ) + iParentControl( aParentControl ), + iLabelTextId ( aLabelTextId ), + iFocusedLabelIndex( KNoAttachmentLabelFocused ) { FUNC_LOG; } -void CNcsAttachmentField::ConstructL( TInt aLabelTextId ) +void CNcsAttachmentField::ConstructL() { - FUNC_LOG; - // create title label - HBufC* textBuf = StringLoader::LoadLC( aLabelTextId ); - - // create attachment label - iAttachmentLabel = new ( ELeave ) CNcsLabel( *this, NULL ); - iAttachmentLabel->SetTextL( textBuf->Des() ); - - CleanupStack::PopAndDestroy( textBuf ); - - // Platform layout change + FUNC_LOG; CreateIconsL(); - // Platform layout change - - UpdateFontSize(); - UpdateColors(); } // ----------------------------------------------------------------------------- @@ -143,7 +131,6 @@ return 0; } -// Platform layout change // ----------------------------------------------------------------------------- // CNcsAttachmentField::Reposition() // ----------------------------------------------------------------------------- @@ -151,17 +138,8 @@ void CNcsAttachmentField::Reposition(TPoint& aPt, TInt /*aWidth*/ ) { FUNC_LOG; - /* - TSize sz( aWidth, MinimumHeight() ); - if ( Rect() != TRect( aPt, sz ) ) - { - SetExtent( aPt, sz ); - } - aPt.iY += Size().iHeight; - */ SetPosition( aPt ); } -// Platform layout change // ----------------------------------------------------------------------------- // CNcsAttachmentField::GetLabelText() @@ -173,7 +151,6 @@ return KNullDesC; } -// Platform layout change // --------------------------------------------------------------------------- // CNcsAttachmentField::LayoutLineCount // --------------------------------------------------------------------------- @@ -181,9 +158,8 @@ TInt CNcsAttachmentField::LayoutLineCount() const { FUNC_LOG; - return ( IsVisible() ? 1 : 0 ); + return ( IsVisible() ? iAttachmentLabelCount : 0 ); } -// Platform layout change // ----------------------------------------------------------------------------- // CNcsAttachmentField::Draw() @@ -195,57 +171,46 @@ CWindowGc& gc = SystemGc(); // Draw text box - // Drawing removed - if ( IsFocused() ) { - // highlight for label when focused - MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - TRgb imageColor; - if( AknsUtils::GetCachedColor( skin, imageColor, - KAknsIIDFsHighlightColors, EAknsCIFsHighlightColorsCG4 ) != KErrNone ) - { - if( AknsUtils::GetCachedColor( skin, imageColor, - KAknsIIDQsnHighlightColors, EAknsCIQsnHighlightColorsCG2 ) != KErrNone ) - { - imageColor = KRgbBlue; - } - } - - gc.SetPenStyle( CGraphicsContext::ENullPen ); - gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); - gc.SetBrushColor( imageColor ); + TBool highlighedFound( EFalse ); + for ( TInt i( 0 ); !highlighedFound && iIsFocused() ) + { + highlighedFound = ETrue; + // highlight for label when focused + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + TRgb imageColor; + if( KErrNone != AknsUtils::GetCachedColor( + skin, imageColor, + KAknsIIDFsHighlightColors, + EAknsCIFsHighlightColorsCG4 ) && + KErrNone != AknsUtils::GetCachedColor( + skin, imageColor, + KAknsIIDQsnHighlightColors, + EAknsCIQsnHighlightColorsCG2 ) ) + { + imageColor = KRgbBlue; + } - TRect highlightRect( iAttachmentLabel->Rect() ); + gc.SetPenStyle( CGraphicsContext::ENullPen ); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.SetBrushColor( imageColor ); - TInt sizeTextInPixels = iAttachmentLabel->Font()->TextWidthInPixels( - *iAttachmentLabel->Text() ); - - highlightRect.SetWidth( sizeTextInPixels ); - highlightRect.Grow( 0, 1 ); - - if( AknLayoutUtils::LayoutMirrored() ) - { - highlightRect.Move( Rect().Size().iWidth - - highlightRect.Size().iWidth - - highlightRect.iTl.iX - 2, 0 ); - } - - gc.DrawRect( highlightRect ); + TRect highlightRect( + iAttachmentLabels[i]->TextHitAreaRect() ); + highlightRect.Grow( 0, 1 ); + gc.DrawRect( highlightRect ); + } + } } // Draw icons gc.SetBrushStyle( CGraphicsContext::ENullBrush ); - // Platform layout change - gc.BitBltMasked( iAttachmentIconPos, iAttachmentBitmap, - iAttachmentBitmap->SizeInPixels(), iAttachmentMask, ETrue ); - - if( IsFocused() ) - { - gc.BitBltMasked( iActionMenuIconPos, iActionMenuBitmap, - iActionMenuBitmap->SizeInPixels(), iActionMenuMask, ETrue ); - } + iAttachmentBitmap->SizeInPixels(), + iAttachmentMask, ETrue ); } // ----------------------------------------------------------------------------- @@ -255,14 +220,12 @@ void CNcsAttachmentField::SizeChanged() { FUNC_LOG; - LayoutControls(); - // Platform laytout change UpdateFontSize(); UpdateColors(); - // The attachment text needs to be updated when label size changes because it + // The attachment texts needs to be updated when label size changes because it // may now get truncated differently. - TRAP_IGNORE( UpdateAttachmentTextL() ); + TRAP_IGNORE( UpdateAttachmentTextsL() ); } // ----------------------------------------------------------------------------- @@ -272,11 +235,8 @@ void CNcsAttachmentField::PositionChanged() { FUNC_LOG; - // Platform layout change LayoutControls(); UpdateColors(); - - // Platform layout change } // ----------------------------------------------------------------------------- @@ -286,12 +246,6 @@ TInt CNcsAttachmentField::MinimumHeight() const { FUNC_LOG; - // Platform laytout change - /* - TNcsMeasures m = NcsUtility::Measures(); - return m.iAifHeight + m.iAttachmentExtraHeightBottom;*/ - //return NcsUtility::MinimumHeaderSize( Rect(), 1 ).iHeight; - // Platform laytout change return 0; } @@ -316,7 +270,7 @@ } // ----------------------------------------------------------------------------- -// CNcsAttachmentField::SetContainerWindowL() const +// CNcsAttachmentField::SetContainerWindowL() // ----------------------------------------------------------------------------- // void CNcsAttachmentField::SetContainerWindowL( const CCoeControl& aContainer ) @@ -324,129 +278,162 @@ FUNC_LOG; CCoeControl::SetContainerWindowL( aContainer ); - // Create the component array - InitComponentArrayL(); - CCoeControlArray& controls = Components(); - controls.SetControlsOwnedExternally( ETrue ); - controls.AppendLC( iAttachmentLabel ); - CleanupStack::Pop( iAttachmentLabel ); - - // set label properties - UpdateFontSize(); - - // Setup text alignment according the mirrored/normal layout. - if ( AknLayoutUtils::LayoutMirrored() ) - { - iAttachmentLabel->SetAlignment( EHRightVCenter ); - } - else - { - iAttachmentLabel->SetAlignment( EHLeftVCenter ); - } + UpdateComponentArrayL(); } // ----------------------------------------------------------------------------- -// CNcsAttachmentField::SetTextL() +// CNcsAttachmentField::UpdateComponentArrayL() // ----------------------------------------------------------------------------- // -void CNcsAttachmentField::SetTextL( const TDesC& aText ) +void CNcsAttachmentField::UpdateComponentArrayL() { FUNC_LOG; - delete iAttachmentName; - iAttachmentName = NULL; - delete iAttachmentSizeDesc; - iAttachmentSizeDesc = NULL; - - iAttachmentLabel->SetTextL( aText ); - } - -// ----------------------------------------------------------------------------- -// CNcsAttachmentField::SetTextL() -// ----------------------------------------------------------------------------- -// -void CNcsAttachmentField::SetTextL( const TDesC& aAttachmentName, const TDesC& aAttachmentSizeDesc ) - { - FUNC_LOG; - delete iAttachmentName; - iAttachmentName = NULL; - delete iAttachmentSizeDesc; - iAttachmentSizeDesc = NULL; - - iAttachmentName = aAttachmentName.AllocL(); - iAttachmentSizeDesc = aAttachmentSizeDesc.AllocL(); - UpdateAttachmentTextL(); + InitComponentArrayL(); + CCoeControlArray& controls = Components(); + TInt controlsCount( controls.Count() ); + controls.SetControlsOwnedExternally( ETrue ); + + // Create the new component array items if needed + if ( iAttachmentLabelCount > controlsCount ) + { + // append controls for new attachment labels after the existing ones + for ( TInt i( controlsCount ); iSetAlignment( AknLayoutUtils::LayoutMirrored() ? + EHRightVCenter : EHLeftVCenter ); + } + } + // Remove unnecessary component array items from the end + else if ( iAttachmentLabelCount < controlsCount ) + { + for ( TInt i( controlsCount-1 ); i>=iAttachmentLabelCount ; --i ) + { + controls.Remove( iAttachmentLabels[i] ); + } + } } // ----------------------------------------------------------------------------- -// CNcsAttachmentField::UpdateAttachmentTextL() +// CNcsAttachmentField::SetTextsLD() // ----------------------------------------------------------------------------- // -void CNcsAttachmentField::UpdateAttachmentTextL() +void CNcsAttachmentField::SetTextsLD( + CDesCArray* aAttachmentNames, CDesCArray* aAttachmentSizes ) { FUNC_LOG; - if ( iAttachmentName && iAttachmentSizeDesc ) + delete iAttachmentNames; + iAttachmentNames = NULL; + iAttachmentNames = aAttachmentNames; + delete iAttachmentSizes; + iAttachmentSizes = NULL; + iAttachmentSizes = aAttachmentSizes; + + if ( iAttachmentNames ) { - // create decorated size text including the preceeding space character - HBufC* decoratedSize = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_LIST_SIZE, - *iAttachmentSizeDesc ); - HBufC* decoratedSizeWithSpace = HBufC::NewL( decoratedSize->Length() + - KSpace().Length() + - KBidiRleStartChar().Length() + - KBidiPdfChar().Length() ); - decoratedSizeWithSpace->Des().Append( KSpace ); - if ( AknLayoutUtils::LayoutMirrored() ) + __ASSERT_DEBUG( iAttachmentNames && + iAttachmentSizes && + iAttachmentNames->Count() == iAttachmentSizes->Count(), + Panic( ENcsBasicUi ) ); + + TInt attachmentLabelCountBeforeUpdate( iAttachmentLabelCount ); + + UpdateAttachmentTextsL(); + + // set the focused attachment label + if ( iAttachmentLabelCount == 0 ) { - // Put size part into embedded right-to-left block to ensure correct rendering - // even when name part is written from left-to-right. - decoratedSizeWithSpace->Des().Append( KBidiRleStartChar ); - decoratedSizeWithSpace->Des().Append( *decoratedSize ); - decoratedSizeWithSpace->Des().Append( KBidiPdfChar ); + // No attachments + iFocusedLabelIndex = KNoAttachmentLabelFocused; } - else + else if ( iFocusedLabelIndex >= iAttachmentLabelCount || + attachmentLabelCountBeforeUpdate < iAttachmentLabelCount ) { - decoratedSizeWithSpace->Des().Append( *decoratedSize ); + // Set the focused index to last, we get here either if the last + // attachment label in list was removed or a new one was added. + // In either case focused should be the new last attachment label. + iFocusedLabelIndex = iAttachmentLabelCount-1; } - CleanupStack::PopAndDestroy( decoratedSize ); - CleanupStack::PushL( decoratedSizeWithSpace ); - - // clip attachment name to fit the field so that size information has enough space too. - const CFont& font = *iAttachmentLabel->Font(); + // In any other case, don't re-set the focused label index + } + else // no attachments + { + iAttachmentLabelCount = 0; + iFocusedLabelIndex = KNoAttachmentLabelFocused; + } + + UpdateComponentArrayL(); + LayoutControls(); + iSizeObserver->UpdateFieldSizeL(); + } - TInt labelWidth = iAttachmentLabel->Size().iWidth; - TInt sizeTextInPixels = font.TextWidthInPixels( *decoratedSizeWithSpace ); - TInt pixelsLeftForAttachmentName = labelWidth - sizeTextInPixels; +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::FocusedAttachmentLabelIndex() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::FocusedAttachmentLabelIndex() + { + FUNC_LOG; + return iFocusedLabelIndex; + } - HBufC* attachmentText = NULL; // will contain the complete text - // safe check if the size information is too wide for some reason. - if ( pixelsLeftForAttachmentName < 0 ) +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateAttachmentTextsL() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateAttachmentTextsL() + { + FUNC_LOG; + // create new array of labels. + iAttachmentLabelCount = 0; + TInt count = iAttachmentNames->MdcaCount(); + TInt existingLabelCount = iAttachmentLabels.Count(); + TInt i( 0 ); + + // First, set the new texts using existing attachment labels objects + for ( ; iLength() + decoratedSizeWithSpace->Length() ); - attachmentText->Des().Append( *iAttachmentName ); - attachmentText->Des().Append( *decoratedSizeWithSpace ); - TPtr attachmentTextBufferModDes = attachmentText->Des(); - AknTextUtils::ClipToFit( attachmentTextBufferModDes, font, labelWidth ); + // no more re-usable label objects in their array.. break this + // loop and continue with the next one (that creates new labels) + break; } - else - { // normal case - HBufC* attacmentNameBuffer = iAttachmentName->AllocLC(); - TPtr attachmentNameBufferModDes = attacmentNameBuffer->Des(); - AknTextUtils::ClipToFit( attachmentNameBufferModDes, font, pixelsLeftForAttachmentName ); - - attachmentText = HBufC::NewL( attacmentNameBuffer->Length() + decoratedSizeWithSpace->Length() ); - attachmentText->Des().Append( *attacmentNameBuffer ); - attachmentText->Des().Append( *decoratedSizeWithSpace ); - CleanupStack::PopAndDestroy( attacmentNameBuffer ); - CleanupStack::PushL( attachmentText ); + UpdateSingleAttachmentLabelTextL( iAttachmentLabels[i], i ); + ++iAttachmentLabelCount; + } + + // Create new attachment labels if needed + if ( iSetTextL( *textBuf ); + UpdateFontSize( label ); + UpdateColors( label ); + UpdateSingleAttachmentLabelTextL( label, i ); + + // append then new label to attachment label array + iAttachmentLabels.AppendL( label ); + CleanupStack::Pop( label ); + ++iAttachmentLabelCount; } - - iAttachmentLabel->SetTextL( *attachmentText ); - - CleanupStack::PopAndDestroy( attachmentText ); - CleanupStack::PopAndDestroy( decoratedSizeWithSpace ); + CleanupStack::PopAndDestroy( textBuf ); } } -// Platform layout change + // ----------------------------------------------------------------------------- // CNcsAttachmentField::ResizeIcons() // ----------------------------------------------------------------------------- @@ -454,20 +441,16 @@ void CNcsAttachmentField::ResizeIcons() { FUNC_LOG; - const TSize frontIconSize( NcsUtility::HeaderDetailIconRect( Rect(), 1, NcsUtility::EIconFront ).Size() ); + const TSize frontIconSize( NcsUtility::HeaderDetailIconRect( + Rect(), 1, NcsUtility::EIconFront ).Size() ); if ( frontIconSize != iAttachmentBitmap->SizeInPixels() ) { - AknIconUtils::SetSize( iAttachmentBitmap, frontIconSize, EAspectRatioPreservedAndUnusedSpaceRemoved ); - AknIconUtils::SetSize( iAttachmentMask, frontIconSize, EAspectRatioPreservedAndUnusedSpaceRemoved ); - } - const TSize backIconSize( NcsUtility::HeaderDetailIconRect( Rect(), 1, NcsUtility::EIconBack ).Size() ); - if ( backIconSize != iActionMenuBitmap->SizeInPixels() ) - { - AknIconUtils::SetSize( iActionMenuBitmap, backIconSize, EAspectRatioNotPreserved ); - AknIconUtils::SetSize( iActionMenuMask, backIconSize, EAspectRatioNotPreserved ); + AknIconUtils::SetSize( iAttachmentBitmap, frontIconSize, + EAspectRatioPreservedAndUnusedSpaceRemoved ); + AknIconUtils::SetSize( iAttachmentMask, frontIconSize, + EAspectRatioPreservedAndUnusedSpaceRemoved ); } } -// Platform layout change // ----------------------------------------------------------------------------- // CNcsAttachmentField::FocusChanged() @@ -477,9 +460,11 @@ { FUNC_LOG; if ( IsFocused() ) - { - iAttachmentLabel->SetFocus( ETrue ); - + { + for ( TInt i( 0 ); iSetFocus( i==iFocusedLabelIndex ); + } // make sure that control is visible on screen if ( Rect().iTl.iY < 0 ) { @@ -510,10 +495,12 @@ } else { - iAttachmentLabel->SetFocus( EFalse ); + for ( TInt i( 0 ); iSetFocus( EFalse ); + } } - - iAttachmentLabel->SetUnderlining( IsFocused() ); + UpdateColors(); if ( aDrawNow ) @@ -532,58 +519,61 @@ // void CNcsAttachmentField::UpdateColors() { - // Platform layout change - MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - TRgb textColor = KRgbBlack; - - if( IsFocused() ) - { - AknsUtils::GetCachedColor( - skin, - textColor, - KAknsIIDQsnTextColors, - EAknsCIQsnTextColorsCG24 ); - } - else - { - AknsUtils::GetCachedColor( - skin, - textColor, - KAknsIIDQsnTextColors, - EAknsCIQsnTextColorsCG6 ); - } - TRAP_IGNORE( iAttachmentLabel->OverrideColorL( - EColorLabelText, textColor ) ); - - textColor = KRgbBlack; - - TInt err = AknsUtils::GetCachedColor( - skin, - textColor, - KAknsIIDQsnHighlightColors, - EAknsCIQsnHighlightColorsCG3 ); - - TRAP_IGNORE( iAttachmentLabel->OverrideColorL( - EColorLabelTextEmphasis, textColor ) ); - - textColor = KRgbBlack; - - err = AknsUtils::GetCachedColor( - skin, - textColor, - KAknsIIDQsnHighlightColors, - EAknsCIQsnHighlightColorsCG2 ); - - TRAP_IGNORE( iAttachmentLabel->OverrideColorL( - EColorLabelHighlightFullEmphasis, textColor ) ); - // Platform layout change + FUNC_LOG; + for ( TInt i( 0 ); iSetUnderlining( ETrue ); + } + CFreestyleEmailUiAppUi* appUi = static_cast( ControlEnv()->AppUi() ); iBorderColor = appUi->LayoutHandler()->ComposerFieldBorderColor(); iBgColor = appUi->LayoutHandler()->ComposerFieldBackgroundColor(); } -// Platform layout change +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateColors() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateColors( CNcsLabel* aLabel ) + { + FUNC_LOG; + if ( aLabel ) + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + TRgb labelTextColor = KRgbBlack; + TRgb labelEmphasisColor = KRgbBlack; + TRgb labelHighlightFullEmphasisColor = KRgbBlack; + + AknsUtils::GetCachedColor( + skin, + labelTextColor, + KAknsIIDQsnTextColors, + aLabel->IsFocused() ? + EAknsCIQsnTextColorsCG24 : EAknsCIQsnTextColorsCG6 ); + AknsUtils::GetCachedColor( + skin, + labelEmphasisColor, + KAknsIIDQsnHighlightColors, + EAknsCIQsnHighlightColorsCG3 ); + AknsUtils::GetCachedColor( + skin, + labelHighlightFullEmphasisColor, + KAknsIIDQsnHighlightColors, + EAknsCIQsnHighlightColorsCG2 ); + + TRAP_IGNORE( aLabel->OverrideColorL( + EColorLabelText, labelTextColor ) ); + TRAP_IGNORE( aLabel->OverrideColorL( + EColorLabelTextEmphasis, labelEmphasisColor ) ); + TRAP_IGNORE( aLabel->OverrideColorL( + EColorLabelHighlightFullEmphasis, + labelHighlightFullEmphasisColor ) ); + } + } + // ----------------------------------------------------------------------------- // CNcsAttachmentField::UpdateFontSize() // ----------------------------------------------------------------------------- @@ -591,38 +581,29 @@ void CNcsAttachmentField::UpdateFontSize() { FUNC_LOG; - /*if ( iLabelFont ) + if ( iAttachmentLabelCount ) { - ControlEnv()->ScreenDevice()->ReleaseFont( iLabelFont ); - iLabelFont = NULL; + // same font used for all labels, so just get the first one's + iEditorFont = NcsUtility::GetLayoutFont( + iAttachmentLabels[0]->Rect(), NcsUtility::ENcsHeaderDetailFont ); } - - if ( iEditorFont ) + for ( TInt i( 0 ); iScreenDevice()->ReleaseFont( iEditorFont ); - iEditorFont = NULL; + iAttachmentLabels[i]->SetFont( iEditorFont ); } + } - // set label properties - TNcsMeasures m = NcsUtility::Measures(); - if ( !iLabelFont ) - { - TRAP_IGNORE( iLabelFont = NcsUtility::GetNearestFontL(EAknLogicalFontPrimarySmallFont, - m.iLabelFontHeightPx) ); - } - - iTitleLabel->SetFont( iLabelFont ); - - if ( !iEditorFont ) - { - TRAP_IGNORE( iEditorFont = NcsUtility::GetNearestFontL(EAknLogicalFontPrimarySmallFont, - m.iEditorFontHeightPx) ); - } - - iAttachmentLabel->SetFont( iEditorFont );*/ - iEditorFont = NcsUtility::GetLayoutFont( iAttachmentLabel->Rect(), NcsUtility::ENcsHeaderDetailFont ); - iAttachmentLabel->SetFont( iEditorFont ); - } +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateFontSize() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateFontSize( CNcsLabel* aLabel ) + { + FUNC_LOG; + iEditorFont = NcsUtility::GetLayoutFont( + aLabel->Rect(), NcsUtility::ENcsHeaderDetailFont ); + aLabel->SetFont( iEditorFont ); + } // ----------------------------------------------------------------------------- // CNcsAttachmentField::LayoutControls() @@ -632,8 +613,15 @@ { FUNC_LOG; const TRect rect( Rect() ); - NcsUtility::LayoutDetailLabel( iAttachmentLabel, rect ); - UpdateIconPositions( rect ); + for ( TInt i( 0 ); i Platform layout change // ----------------------------------------------------------------------------- // CNcsAttachmentField::HandleResourceChange() @@ -661,14 +648,69 @@ { UpdateFontSize(); UpdateColors(); - // Platform layout change CreateIcons(); - // Platform layout change DrawDeferred(); } } -// Platform layout change +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::HandlePointerEventL() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::HandlePointerEventL( + const TPointerEvent& aPointerEvent ) + { + FUNC_LOG; + CCoeControl::HandlePointerEventL( aPointerEvent ); + + if ( Rect().Contains( aPointerEvent.iPosition ) && + aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + TBool focusedAttachmentLabelIndexChanged( EFalse ); + TInt i( 0 ); + for ( ; iTextHitAreaRect().Contains( + aPointerEvent.iPosition ) ) + { + // tactile feedback + MTouchFeedback* feedback = MTouchFeedback::Instance(); + if ( feedback ) + { + feedback->InstantFeedback( this, ETouchFeedbackBasic ); + } + + if ( iFocusedLabelIndex != i ) + { + focusedAttachmentLabelIndexChanged = ETrue; + iFocusedLabelIndex = i; + } + break; + } + } + + if ( i == iAttachmentLabelCount ) + { + // Pointer event happened outside any of the labels. + // Invalidate focused label index.. this will cause the next + // for loop to set all label focuses to EFalse. + iFocusedLabelIndex = KNoAttachmentLabelFocused; + focusedAttachmentLabelIndexChanged = ETrue; + } + + if ( focusedAttachmentLabelIndexChanged ) + { + // only redraw if focused attachment label changed + for ( TInt i( 0 ); iSetFocus( i==iFocusedLabelIndex ); + } + UpdateColors(); + DrawNow(); + } + } + } + // ----------------------------------------------------------------------------- // CNcsAttachmentField::CreateIcons() // ----------------------------------------------------------------------------- @@ -687,17 +729,91 @@ void CNcsAttachmentField::CreateIconsL() { FUNC_LOG; - CFreestyleEmailUiAppUi* fsAppUi = static_cast( ControlEnv()->AppUi() ); + CFreestyleEmailUiAppUi* fsAppUi = + static_cast( ControlEnv()->AppUi() ); delete iAttachmentBitmap; iAttachmentBitmap = NULL; delete iAttachmentMask; iAttachmentMask = NULL; - fsAppUi->FsTextureManager()->ProvideBitmapL( EAttachmentIcon, iAttachmentBitmap, iAttachmentMask ); - delete iActionMenuBitmap; - iActionMenuBitmap = NULL; - delete iActionMenuMask; - iActionMenuMask = NULL; - fsAppUi->FsTextureManager()->ProvideBitmapL( EListControlMenuIcon, iActionMenuBitmap, iActionMenuMask ); + fsAppUi->FsTextureManager()->ProvideBitmapL( + EAttachmentIcon, iAttachmentBitmap, iAttachmentMask ); ResizeIcons(); } -// Platform layout change + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateSingleAttachmentLabelTextL() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateSingleAttachmentLabelTextL( + CNcsLabel* aLabel, TInt aIndex ) + { + FUNC_LOG; + // create decorated size text including the preceeding space character + HBufC* decoratedSize = StringLoader::LoadLC( + R_FSE_VIEWER_ATTACHMENTS_LIST_SIZE, + iAttachmentSizes->MdcaPoint( aIndex ) ); + HBufC* decoratedSizeWithSpace = HBufC::NewL( + decoratedSize->Length() + + KSpace().Length() + + KBidiRleStartChar().Length() + + KBidiPdfChar().Length() ); + decoratedSizeWithSpace->Des().Append( KSpace ); + if ( AknLayoutUtils::LayoutMirrored() ) + { + // Put size part into embedded right-to-left block to ensure + // correct rendering even when name part is written from + // left-to-right. + decoratedSizeWithSpace->Des().Append( KBidiRleStartChar ); + decoratedSizeWithSpace->Des().Append( *decoratedSize ); + decoratedSizeWithSpace->Des().Append( KBidiPdfChar ); + } + else + { + decoratedSizeWithSpace->Des().Append( *decoratedSize ); + } + CleanupStack::PopAndDestroy( decoratedSize ); + CleanupStack::PushL( decoratedSizeWithSpace ); + + // clip attachment name to fit the field so that size information has + // enough space too. + const CFont& font = *aLabel->Font(); + + TInt labelWidth = aLabel->Size().iWidth; + TInt sizeTextInPixels = + font.TextWidthInPixels( *decoratedSizeWithSpace ); + TInt pixelsLeftForAttachmentName = labelWidth - sizeTextInPixels; + + HBufC* attachmentText = NULL; // will contain the complete text + // safe check if the size information is too wide for some reason. + if ( pixelsLeftForAttachmentName < 0 ) + { + attachmentText = HBufC::NewLC( + iAttachmentNames->MdcaPoint( aIndex ).Length() + + decoratedSizeWithSpace->Length() ); + attachmentText->Des().Append( iAttachmentNames->MdcaPoint( aIndex ) ); + attachmentText->Des().Append( *decoratedSizeWithSpace ); + TPtr attachmentTextBufferModDes = attachmentText->Des(); + AknTextUtils::ClipToFit( attachmentTextBufferModDes, + font, labelWidth ); + } + else + { // normal case + HBufC* attacmentNameBuffer = + iAttachmentNames->MdcaPoint( aIndex ).AllocLC(); + TPtr attachmentNameBufferModDes = attacmentNameBuffer->Des(); + AknTextUtils::ClipToFit( attachmentNameBufferModDes, + font, pixelsLeftForAttachmentName ); + + attachmentText = HBufC::NewL( + attacmentNameBuffer->Length() + + decoratedSizeWithSpace->Length() ); + attachmentText->Des().Append( *attacmentNameBuffer ); + attachmentText->Des().Append( *decoratedSizeWithSpace ); + CleanupStack::PopAndDestroy( attacmentNameBuffer ); + CleanupStack::PushL( attachmentText ); + } + aLabel->SetTextL( *attachmentText ); + CleanupStack::PopAndDestroy( attachmentText ); + CleanupStack::PopAndDestroy( decoratedSizeWithSpace ); + } +