diff -r 000000000000 -r 8466d47a6819 emailuis/emailui/src/ncsattachmentfield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/src/ncsattachmentfield.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,703 @@ +/* +* 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 "FreestyleEmailUiLayoutData.h" +#include "FreestyleEmailUiAppui.h" +#include "FreestyleEmailUiTextureManager.h" +#include "FreestyleEmailUiLayoutHandler.h" +#include "ncsattachmentfield.h" +#include "ncsutility.h" +#include "ncsheadercontainer.h" + + +CNcsAttachmentField* CNcsAttachmentField::NewL( + TInt aLabelTextId, + MNcsFieldSizeObserver* aSizeObserver, + CNcsHeaderContainer* aParentControl ) + { + FUNC_LOG; + CNcsAttachmentField* self = + new ( ELeave ) CNcsAttachmentField( aSizeObserver, aParentControl ); + CleanupStack::PushL( self ); + self->ConstructL( aLabelTextId ); + CleanupStack::Pop( self ); + return self; + } + +CNcsAttachmentField::~CNcsAttachmentField() + { + FUNC_LOG; + delete iAttachmentLabel; + + delete iAttachmentName; + delete iAttachmentSizeDesc; + + delete iAttachmentBitmap; + delete iAttachmentMask; + + delete iActionMenuBitmap; + delete iActionMenuMask; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::CNcsAttachmentField() +// ----------------------------------------------------------------------------- +// +CNcsAttachmentField::CNcsAttachmentField( MNcsFieldSizeObserver* aSizeObserver, + CNcsHeaderContainer* aParentControl ): + MNcsControl( aSizeObserver ), + iParentControl( aParentControl ) + { + FUNC_LOG; + } + +void CNcsAttachmentField::ConstructL( TInt aLabelTextId ) + { + 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 + CreateIconsL(); + // Platform layout change + + UpdateFontSize(); + UpdateColors(); + } + +// ----------------------------------------------------------------------------- +// 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; + } + +// Platform layout change +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::Reposition() +// ----------------------------------------------------------------------------- +// +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() +// ----------------------------------------------------------------------------- +// +const TDesC& CNcsAttachmentField::GetLabelText() const + { + FUNC_LOG; + return KNullDesC; + } + +// Platform layout change +// --------------------------------------------------------------------------- +// CNcsAttachmentField::LayoutLineCount +// --------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::LayoutLineCount() const + { + FUNC_LOG; + return ( IsVisible() ? 1 : 0 ); + } +// Platform layout change + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::Draw() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::Draw( const TRect& /*aRect*/ ) const + { + FUNC_LOG; + 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 ); + + TRect highlightRect( iAttachmentLabel->Rect() ); + + 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 ); + } + + // 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 ); + } + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::SizeChanged() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::SizeChanged() + { + FUNC_LOG; + + LayoutControls(); + // Platform laytout change + UpdateFontSize(); + UpdateColors(); + // The attachment text needs to be updated when label size changes because it + // may now get truncated differently. + TRAP_IGNORE( UpdateAttachmentTextL() ); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::PositionChanged() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::PositionChanged() + { + FUNC_LOG; + // Platform layout change + LayoutControls(); + UpdateColors(); + + // Platform layout change + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::MinimumHeight() +// ----------------------------------------------------------------------------- +// +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; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::SetMaxLabelLength() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::SetMaxLabelLength( TInt aMaxLength ) + { + FUNC_LOG; + iMaximumLabelLength = aMaxLength; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::GetMinLabelLength() +// ----------------------------------------------------------------------------- +// +TInt CNcsAttachmentField::GetMinLabelLength() const + { + FUNC_LOG; + return 0; + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::SetContainerWindowL() const +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::SetContainerWindowL( const CCoeControl& aContainer ) + { + 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 ); + } + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::SetTextL() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::SetTextL( const TDesC& aText ) + { + 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(); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateAttachmentTextL() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateAttachmentTextL() + { + FUNC_LOG; + if ( iAttachmentName && iAttachmentSizeDesc ) + { + // 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() ) + { + // 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 = *iAttachmentLabel->Font(); + + TInt labelWidth = iAttachmentLabel->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( iAttachmentName->Length() + decoratedSizeWithSpace->Length() ); + attachmentText->Des().Append( *iAttachmentName ); + attachmentText->Des().Append( *decoratedSizeWithSpace ); + TPtr attachmentTextBufferModDes = attachmentText->Des(); + AknTextUtils::ClipToFit( attachmentTextBufferModDes, font, labelWidth ); + } + 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 ); + } + + iAttachmentLabel->SetTextL( *attachmentText ); + + CleanupStack::PopAndDestroy( attachmentText ); + CleanupStack::PopAndDestroy( decoratedSizeWithSpace ); + } + } + +// Platform layout change +// ----------------------------------------------------------------------------- +// 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 ); + } + const TSize backIconSize( NcsUtility::HeaderDetailIconRect( Rect(), 1, NcsUtility::EIconBack ).Size() ); + if ( backIconSize != iActionMenuBitmap->SizeInPixels() ) + { + AknIconUtils::SetSize( iActionMenuBitmap, backIconSize, EAspectRatioNotPreserved ); + AknIconUtils::SetSize( iActionMenuMask, backIconSize, EAspectRatioNotPreserved ); + } + } +// Platform layout change + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::FocusChanged() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::FocusChanged( TDrawNow aDrawNow ) + { + FUNC_LOG; + if ( IsFocused() ) + { + iAttachmentLabel->SetFocus( ETrue ); + + // 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 + { + iAttachmentLabel->SetFocus( EFalse ); + } + + iAttachmentLabel->SetUnderlining( IsFocused() ); + UpdateColors(); + + if ( aDrawNow ) + { + DrawNow(); + } + else + { + DrawDeferred(); + } + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateColors() +// ----------------------------------------------------------------------------- +// +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 + CFreestyleEmailUiAppUi* appUi = + static_cast( ControlEnv()->AppUi() ); + iBorderColor = appUi->LayoutHandler()->ComposerFieldBorderColor(); + iBgColor = appUi->LayoutHandler()->ComposerFieldBackgroundColor(); + } + +// Platform layout change +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateFontSize() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateFontSize() + { + FUNC_LOG; + /*if ( iLabelFont ) + { + ControlEnv()->ScreenDevice()->ReleaseFont( iLabelFont ); + iLabelFont = NULL; + } + + if ( iEditorFont ) + { + ControlEnv()->ScreenDevice()->ReleaseFont( iEditorFont ); + iEditorFont = NULL; + } + + // 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::LayoutControls() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::LayoutControls() + { + FUNC_LOG; + const TRect rect( Rect() ); + NcsUtility::LayoutDetailLabel( iAttachmentLabel, rect ); + UpdateIconPositions( rect ); + } + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::UpdateIconPositions() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::UpdateIconPositions( const TRect& aRect ) + { + FUNC_LOG; + iAttachmentIconPos = NcsUtility::HeaderDetailIconRect( aRect, 1, NcsUtility::EIconFront ).iTl; + iActionMenuIconPos = NcsUtility::HeaderDetailIconRect( aRect, 1, NcsUtility::EIconBack ).iTl; + } +// Platform layout change + +// ----------------------------------------------------------------------------- +// CNcsAttachmentField::HandleResourceChange() +// ----------------------------------------------------------------------------- +// +void CNcsAttachmentField::HandleResourceChange( TInt aType ) + { + FUNC_LOG; + CCoeControl::HandleResourceChange( aType ); + if ( aType == KAknsMessageSkinChange || + aType == KEikMessageColorSchemeChange ) + { + UpdateFontSize(); + UpdateColors(); + // Platform layout change + CreateIcons(); + // Platform layout change + DrawDeferred(); + } + } + +// Platform layout change +// ----------------------------------------------------------------------------- +// 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 ); + delete iActionMenuBitmap; + iActionMenuBitmap = NULL; + delete iActionMenuMask; + iActionMenuMask = NULL; + fsAppUi->FsTextureManager()->ProvideBitmapL( EListControlMenuIcon, iActionMenuBitmap, iActionMenuMask ); + ResizeIcons(); + } +// Platform layout change