diff -r d189ee25cf9d -r 3533d4323edc emailuis/emailui/src/ncsattachmentfield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/src/ncsattachmentfield.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,819 @@ +/* +* Copyright (c) 2007 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: message editor +* +*/ + + +#include "emailtrace.h" +#include +#include +#include +#include +#include +#include + +#include "FreestyleEmailUiLayoutData.h" +#include "FreestyleEmailUiAppui.h" +#include "FreestyleEmailUiTextureManager.h" +#include "FreestyleEmailUiLayoutHandler.h" +#include "ncsattachmentfield.h" +#include "ncsutility.h" +#include "ncsheadercontainer.h" +#include "FSEmail.pan" + + +CNcsAttachmentField* CNcsAttachmentField::NewL( + TInt aLabelTextId, + MNcsFieldSizeObserver* aSizeObserver, + CNcsHeaderContainer* aParentControl ) + { + FUNC_LOG; + CNcsAttachmentField* self = + new ( ELeave ) CNcsAttachmentField( aLabelTextId, aSizeObserver, aParentControl ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CNcsAttachmentField::~CNcsAttachmentField() + { + FUNC_LOG; + iAttachmentLabels.ResetAndDestroy(); + + delete iAttachmentNames; + delete iAttachmentSizes; + + delete iAttachmentBitmap; + delete iAttachmentMask; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::CNcsAttachmentField() +// ----------------------------------------------------------------------------- +// +CNcsAttachmentField::CNcsAttachmentField( TInt aLabelTextId, + MNcsFieldSizeObserver* aSizeObserver, + CNcsHeaderContainer* aParentControl ): + MNcsControl( aSizeObserver ), + iParentControl( aParentControl ), + iLabelTextId ( aLabelTextId ), + iFocusedLabelIndex( KNoAttachmentLabelFocused ) + { + FUNC_LOG; + } + +void CNcsAttachmentField::ConstructL() + { + FUNC_LOG; + CreateIconsL(); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::LineCount() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::LineCount() const + { + FUNC_LOG; + return 0; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::ScrollableLines() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::ScrollableLines() const + { + FUNC_LOG; + return 0; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::GetNumChars() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::GetNumChars() const + { + FUNC_LOG; + return 0; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::CursorLineNumber() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::CursorLineNumber() const + { + FUNC_LOG; + return 0; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::CursorPosition() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::CursorPosition() const + { + FUNC_LOG; + return 0; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::Reposition() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::Reposition(TPoint& aPt, TInt /*aWidth*/ ) + { + FUNC_LOG; + SetPosition( aPt ); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::GetLabelText() +// ----------------------------------------------------------------------------- +// +const TDesC& CNcsAttachmentField::GetLabelText() const + { + FUNC_LOG; + return KNullDesC; + } + +// --------------------------------------------------------------------------- +// CNcsAttachmentField::LayoutLineCount +// --------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::LayoutLineCount() const + { + FUNC_LOG; + return ( IsVisible() ? iAttachmentLabelCount : 0 ); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::Draw() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::Draw( const TRect& /*aRect*/ ) const + { + FUNC_LOG; + CWindowGc& gc = SystemGc(); + + // Draw text box + if ( IsFocused() ) + { + 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; + } + + gc.SetPenStyle( CGraphicsContext::ENullPen ); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.SetBrushColor( imageColor ); + + TRect highlightRect( + iAttachmentLabels[i]->TextHitAreaRect() ); + highlightRect.Grow( 0, 1 ); + gc.DrawRect( highlightRect ); + } + } + } + + // Draw icons + gc.SetBrushStyle( CGraphicsContext::ENullBrush ); + gc.BitBltMasked( iAttachmentIconPos, iAttachmentBitmap, + iAttachmentBitmap->SizeInPixels(), + iAttachmentMask, ETrue ); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::SizeChanged() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::SizeChanged() + { + FUNC_LOG; + LayoutControls(); + UpdateFontSize(); + UpdateColors(); + // The attachment texts needs to be updated when label size changes because it + // may now get truncated differently. + TRAP_IGNORE( UpdateAttachmentTextsL() ); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::PositionChanged() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::PositionChanged() + { + FUNC_LOG; + LayoutControls(); + UpdateColors(); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::MinimumHeight() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::MinimumHeight() const + { + FUNC_LOG; + return 0; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::SetMaxLabelLength() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::SetMaxLabelLength( TInt aMaxLength ) + { + FUNC_LOG; + iMaximumLabelLength = aMaxLength; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::GetMinLabelLength() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::GetMinLabelLength() const + { + FUNC_LOG; + return 0; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::SetContainerWindowL() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::SetContainerWindowL( const CCoeControl& aContainer ) + { + FUNC_LOG; + CCoeControl::SetContainerWindowL( aContainer ); + + UpdateComponentArrayL(); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateComponentArrayL() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateComponentArrayL() + { + FUNC_LOG; + 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::SetTextsLD() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::SetTextsLD( + CDesCArray* aAttachmentNames, CDesCArray* aAttachmentSizes ) + { + FUNC_LOG; + delete iAttachmentNames; + iAttachmentNames = NULL; + iAttachmentNames = aAttachmentNames; + delete iAttachmentSizes; + iAttachmentSizes = NULL; + iAttachmentSizes = aAttachmentSizes; + + if ( iAttachmentNames ) + { + __ASSERT_DEBUG( iAttachmentNames && + iAttachmentSizes && + iAttachmentNames->Count() == iAttachmentSizes->Count(), + Panic( ENcsBasicUi ) ); + + TInt attachmentLabelCountBeforeUpdate( iAttachmentLabelCount ); + + UpdateAttachmentTextsL(); + + // set the focused attachment label + if ( iAttachmentLabelCount == 0 ) + { + // No attachments + iFocusedLabelIndex = KNoAttachmentLabelFocused; + } + else if ( iFocusedLabelIndex >= iAttachmentLabelCount || + attachmentLabelCountBeforeUpdate < iAttachmentLabelCount ) + { + // 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; + } + // In any other case, don't re-set the focused label index + } + else // no attachments + { + iAttachmentLabelCount = 0; + iFocusedLabelIndex = KNoAttachmentLabelFocused; + } + + UpdateComponentArrayL(); + LayoutControls(); + iSizeObserver->UpdateFieldSizeL(); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::FocusedAttachmentLabelIndex() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::FocusedAttachmentLabelIndex() + { + FUNC_LOG; + return iFocusedLabelIndex; + } + +// ----------------------------------------------------------------------------- +// 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 ( ; iSetTextL( *textBuf ); + UpdateFontSize( label ); + UpdateColors( label ); + UpdateSingleAttachmentLabelTextL( label, i ); + + // append then new label to attachment label array + iAttachmentLabels.AppendL( label ); + CleanupStack::Pop( label ); + ++iAttachmentLabelCount; + } + CleanupStack::PopAndDestroy( textBuf ); + } + } + + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::ResizeIcons() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::ResizeIcons() + { + FUNC_LOG; + const TSize frontIconSize( NcsUtility::HeaderDetailIconRect( + Rect(), 1, NcsUtility::EIconFront ).Size() ); + if ( frontIconSize != iAttachmentBitmap->SizeInPixels() ) + { + AknIconUtils::SetSize( iAttachmentBitmap, frontIconSize, + EAspectRatioPreservedAndUnusedSpaceRemoved ); + AknIconUtils::SetSize( iAttachmentMask, frontIconSize, + EAspectRatioPreservedAndUnusedSpaceRemoved ); + } + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::FocusChanged() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::FocusChanged( TDrawNow aDrawNow ) + { + FUNC_LOG; + if ( IsFocused() ) + { + for ( TInt i( 0 ); iSetFocus( i==iFocusedLabelIndex ); + } + // make sure that control is visible on screen + if ( Rect().iTl.iY < 0 ) + { + TPoint pt = TPoint( 0, 0 ); + Reposition( pt,Rect().Width() ); + iSizeObserver->UpdateFieldPosition( this ); + } + else + { + TPoint pos = PositionRelativeToScreen(); + pos.iY += Size().iHeight; + CWsScreenDevice* screenDev = ControlEnv()->ScreenDevice(); + TPixelsAndRotation pix; + screenDev->GetDefaultScreenSizeAndRotation( pix ); + const TInt h = pix.iPixelSize.iHeight; + if ( pos.iY >= h - h / 3 ) + { + TPoint pt = TPoint( 0, h / 3 ); + Reposition( pt,Rect().Width() ); + iSizeObserver->UpdateFieldPosition( this ); + } + } + + if ( iParentControl ) + { + TRAP_IGNORE( iParentControl->SetMskL() ); + } + } + else + { + for ( TInt i( 0 ); iSetFocus( EFalse ); + } + } + + UpdateColors(); + + if ( aDrawNow ) + { + DrawNow(); + } + else + { + DrawDeferred(); + } + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateColors() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateColors() + { + FUNC_LOG; + for ( TInt i( 0 ); iSetUnderlining( ETrue ); + } + + CFreestyleEmailUiAppUi* appUi = + static_cast( ControlEnv()->AppUi() ); + iBorderColor = appUi->LayoutHandler()->ComposerFieldBorderColor(); + iBgColor = appUi->LayoutHandler()->ComposerFieldBackgroundColor(); + } + +// ----------------------------------------------------------------------------- +// 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() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateFontSize() + { + FUNC_LOG; + if ( iAttachmentLabelCount ) + { + // same font used for all labels, so just get the first one's + iEditorFont = NcsUtility::GetLayoutFont( + iAttachmentLabels[0]->Rect(), NcsUtility::ENcsHeaderDetailFont ); + } + for ( TInt i( 0 ); iSetFont( iEditorFont ); + } + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateFontSize() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateFontSize( CNcsLabel* aLabel ) + { + FUNC_LOG; + iEditorFont = NcsUtility::GetLayoutFont( + aLabel->Rect(), NcsUtility::ENcsHeaderDetailFont ); + aLabel->SetFont( iEditorFont ); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::LayoutControls() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::LayoutControls() + { + FUNC_LOG; + const TRect rect( Rect() ); + for ( TInt i( 0 ); 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(); + DrawDeferred(); + } + } + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::CreateIcons() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::CreateIcons() + { + FUNC_LOG; + TRAPD( error, CreateIconsL() ); + return error; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::CreateIconsL() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::CreateIconsL() + { + FUNC_LOG; + CFreestyleEmailUiAppUi* fsAppUi = + static_cast( ControlEnv()->AppUi() ); + delete iAttachmentBitmap; + iAttachmentBitmap = NULL; + delete iAttachmentMask; + iAttachmentMask = NULL; + fsAppUi->FsTextureManager()->ProvideBitmapL( + EAttachmentIcon, iAttachmentBitmap, iAttachmentMask ); + ResizeIcons(); + } + +// ----------------------------------------------------------------------------- +// 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 ); + } +