diff -r 000000000000 -r f72a12da539e widgetmanager/src/wmdetailsdlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgetmanager/src/wmdetailsdlg.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,525 @@ +/* +* Copyright (c) 2008 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: +* Implementation of the widget details dlg for WidgetManager +* +*/ + +// INCLUDE FILES +#include +#include // for CRichTextEditor +#include // for CRichText +#include // for AknUtils +#include // MAknsSkinInstance +#include // AknsDrawUtils +#include //layout +#include +#include +#include +#include + +#include +#include "widgetmanager.hrh" +#include "wmdetailsdlg.h" + + +// CONSTANTS + + +// MEMBER FUNCTIONS + +// --------------------------------------------------------- +// FullScreenRect +// rectangle representing the screen +// --------------------------------------------------------- +// +TRect FullScreenRect() + { + TRect screen; + CCoeEnv* env = CCoeEnv::Static(); + if ( env ) + { + CWsScreenDevice* screenDevice = env->ScreenDevice(); + if ( screenDevice ) + screen.SetRect( TPoint(0,0), screenDevice->SizeInPixels() ); + } + return screen; + } + +// --------------------------------------------------------- +// CWmDetailsDlg::NewL +// --------------------------------------------------------- +// +CWmDetailsDlg* CWmDetailsDlg::NewL( + const TDesC& aName, + const TDesC& aDescription, + TBool aCanBeAdded, + const CFbsBitmap* aLogoBmp, + const CFbsBitmap* aLogoMask, + CAknsBasicBackgroundControlContext* aBgContext ) + { + CWmDetailsDlg* self = new ( ELeave ) CWmDetailsDlg( aCanBeAdded ); + CleanupStack::PushL( self ); + self->ConstructL( aName, aDescription, aLogoBmp, aLogoMask, aBgContext ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CWmDetailsDlg::CWmDetailsDlg +// --------------------------------------------------------- +// +CWmDetailsDlg::CWmDetailsDlg( TBool aCanBeAdded ) + : CAknDialog(), + iCanBeAdded( aCanBeAdded ) + { + iBorder = TGulBorder::ERaisedControl; + } + +// --------------------------------------------------------- +// CWmDetailsDlg::~CWmDetailsDlg +// --------------------------------------------------------- +// +CWmDetailsDlg::~CWmDetailsDlg() + { + iEikonEnv->RemoveFromStack( iRtEditor ); + iEikonEnv->RemoveFromStack( this ); + delete iRtEditor; + delete iName; + delete iDescription; + delete iLogoBmp; + delete iLogoMask; + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::ExecuteLD +// ----------------------------------------------------------------------------- +// +TInt CWmDetailsDlg::ExecuteLD() + { + if ( iCanBeAdded ) + { + return CAknDialog::ExecuteLD( R_WM_DETAILS_ADD_DIALOG ); + } + else + { + return CAknDialog::ExecuteLD( R_WM_DETAILS_ONLY_DIALOG ); + } + } + +// --------------------------------------------------------- +// CWmDetailsDlg::ConstructL +// --------------------------------------------------------- +// +void CWmDetailsDlg::ConstructL( + const TDesC& aName, + const TDesC& aDescription, + const CFbsBitmap* aLogoBmp, + const CFbsBitmap* aLogoMask, + CAknsBasicBackgroundControlContext* aBgContext ) + { + if ( !aLogoBmp ) + { + User::Leave( KErrArgument ); + } + + CAknDialog::ConstructL( R_AVKON_DIALOG_EMPTY_MENUBAR ); + + iBgContext = aBgContext; + iName = aName.AllocL(); + iDescription = aDescription.AllocL(); + + // create bitmap and duplicate handle + iLogoBmp = new ( ELeave ) CFbsBitmap; + TSize newSize = TSize( aLogoBmp->SizeInPixels().iWidth , + aLogoBmp->SizeInPixels().iHeight ); + User::LeaveIfError( iLogoBmp->Create( newSize, aLogoBmp->DisplayMode() ) ); + User::LeaveIfError( iLogoBmp->Duplicate( aLogoBmp->Handle() ) ); + + if ( aLogoMask ) + { + iLogoMask = new ( ELeave ) CFbsBitmap; + newSize = TSize( aLogoMask->SizeInPixels().iWidth , + aLogoMask->SizeInPixels().iHeight ); + User::LeaveIfError( iLogoMask->Create( newSize, aLogoMask->DisplayMode() ) ); + User::LeaveIfError( iLogoMask->Duplicate( aLogoMask->Handle() ) ); + } + + iEikonEnv->AddWindowShadow( static_cast(this) ); + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::OkToExitL +// ----------------------------------------------------------------------------- +// +TBool CWmDetailsDlg::OkToExitL( TInt aButtonId ) + { + if ( aButtonId == ECbaAddToHs || + aButtonId == EAknSoftkeyClose ) + { + // Close dlg + return ETrue; + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::PreLayoutDynInitL +// ----------------------------------------------------------------------------- +// +void CWmDetailsDlg::PreLayoutDynInitL() + { + iRtEditor = new(ELeave) CEikRichTextEditor(); + iRtEditor->ConstructL( this, + 0, + 0, + CEikEdwin::EReadOnly | + CEikEdwin::ENoAutoSelection | + CEikEdwin::EAvkonDisableCursor | + CEikEdwin::EDisplayOnly ); + iRtEditor->SetContainerWindowL(*this); + iRtEditor->SetAknEditorFlags( + EAknEditorFlagEnableScrollBars | + EEikEdwinAvkonDisableCursor | + EEikEdwinDisplayOnly | + EEikEdwinReadOnly ); + + iRtEditor->SetSkinBackgroundControlContextL( iBgContext ); + + CEikScrollBarFrame* scrollBarFrame = iRtEditor->CreateScrollBarFrameL(); + scrollBarFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EOff ); + + InsertAndFormatContentL(); + iRtEditor->UpdateScrollBarsL(); + } + +//------------------------------------------------------------------------------ +// CWmDetailsDlg::InsertAndFormatContentL +//------------------------------------------------------------------------------ +// +void CWmDetailsDlg::InsertAndFormatContentL() + { + CRichText* richText = iRtEditor->RichText(); + const TInt KMinTxtLength = 100; + + richText->Reset(); + if ( iDescription->Des().Length() <= KMinTxtLength ) + { + richText->InsertL( richText->DocumentLength(), + CEditableText::ELineBreak ); + } + richText->InsertL( richText->DocumentLength(), *iDescription ); + + // change the color of the text according to the skin color + TRgb color = KRgbBlack; + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + AknsUtils::GetCachedColor(skin, color, KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG6 ); + + // Format text + iRtEditor->SetSelectionL( 0, richText->DocumentLength() ); + + // Get a logical font to base my font on: + const CFont* logicalFont = AknLayoutUtils::FontFromId(EAknLogicalFontPrimarySmallFont); + // Extract font information + TFontSpec fontspec = logicalFont->FontSpecInTwips(); + TCharFormat charFormat(fontspec.iTypeface.iName, fontspec.iHeight); + TCharFormatMask charFormatMask; + CParaFormat paraFormat; + TParaFormatMask paraFormatMask; + paraFormat.iHorizontalAlignment = CParaFormat::EJustifiedAlign; + charFormat.iFontPresentation.iTextColor = color; + paraFormatMask.SetAttrib(EAttAlignment); + charFormatMask.SetAttrib(EAttFontTypeface); + charFormatMask.SetAttrib(EAttFontHeight); + charFormatMask.SetAttrib(EAttColor); + iRtEditor->ApplyParaFormatL(¶Format, paraFormatMask); + iRtEditor->ApplyCharFormatL(charFormat, charFormatMask); + iRtEditor->ClearSelectionL(); + } + +//------------------------------------------------------------------------------ +// CWmDetailsDlg::CountComponentControls +//------------------------------------------------------------------------------ +// +TInt CWmDetailsDlg::CountComponentControls() const + { + return iRtEditor ? 1 : 0; + } + +//------------------------------------------------------------------------------ +// CWmDetailsDlg::ComponentControl +//------------------------------------------------------------------------------ +// +CCoeControl* CWmDetailsDlg::ComponentControl(TInt aIndex) const + { + switch (aIndex) + { + case 0: + return iRtEditor; + default: + return NULL; + } + } + +//------------------------------------------------------------------------------ +// CWmDetailsDlg::ActivateL +//------------------------------------------------------------------------------ +// +void CWmDetailsDlg::ActivateL() + { + CAknDialog::ActivateL(); + iEikonEnv->EikAppUi()->AddToStackL( this, ECoeStackPriorityDialog ); + iEikonEnv->EikAppUi()->AddToStackL( iRtEditor ); + iRtEditor->SetFocus( ETrue ); + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::WmDetailsDialogRect +// ----------------------------------------------------------------------------- +// +TRect CWmDetailsDlg::WmDetailsDialogRect() + { + TRect mainPane, dlgRect; + TPoint topLeft; + TInt desiredW, desiredH; + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::EApplicationWindow, mainPane ); + + if ( Layout_Meta_Data::IsLandscapeOrientation() ) + { + desiredW = ( mainPane.Width() - (mainPane.Width()/4) ); + desiredH = ( mainPane.Height() - (mainPane.Height()/5) ); + topLeft.iX = ( ( mainPane.Width() - desiredW ) /2); + topLeft.iY = ( ( mainPane.Height() - desiredH ) /2); + dlgRect.SetRect( topLeft, TSize( desiredW, desiredH ) ); + } + else + { + desiredH = ( mainPane.Height() - (mainPane.Height()/4) ); + desiredW = ( mainPane.Width() - (mainPane.Width()/5) ); + topLeft.iX = ( ( mainPane.Width() - desiredW ) /2); + topLeft.iY = ( ( mainPane.Height() - desiredH ) /2); + dlgRect.SetRect( topLeft, TSize( desiredW, desiredH ) ); + } + return dlgRect; + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::SetSizeAndPosition +// ----------------------------------------------------------------------------- +// +void CWmDetailsDlg::SetSizeAndPosition( const TSize& /*aSize*/ ) + { + SetRect( WmDetailsDialogRect() ); + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::SizeChanged +// ----------------------------------------------------------------------------- +// +void CWmDetailsDlg::SizeChanged() + { + CAknDialog::SizeChanged(); + TRect rect = Rect(); + if ( iBgContext ) { iBgContext->SetRect( FullScreenRect() ); } + if ( iRtEditor ) + { + const TInt offSet = 5; + TRect cbaRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EControlPane, cbaRect ); + + TInt logoH = iLogoBmp->SizeInPixels().iHeight; + + TInt height, width; + if ( Layout_Meta_Data::IsLandscapeOrientation() ) + { + height = ( (rect.Height() - logoH) - (cbaRect.Height() * 2) - offSet ); + } + else + { + height = ( (rect.Height() - logoH) - (cbaRect.Height() * 1.5) - offSet ); + } + + width = ( rect.Width() - (CEikScrollBar::DefaultScrollBarBreadth() * 4 ) - offSet ); + TPoint point = TPoint( rect.iTl.iX + offSet, rect.iTl.iY + logoH + offSet ); + TSize size = TSize( width, height ); + iRtEditor->SetRect( TRect( point, size ) ); + TRAP_IGNORE( + iRtEditor->SetSkinBackgroundControlContextL( iBgContext ); + InsertAndFormatContentL(); ); + } + } + +// ---------------------------------------------------------------------------- +// CWmDetailsDlg::SupplyMopObject +// ---------------------------------------------------------------------------- +// +TTypeUid::Ptr CWmDetailsDlg::MopSupplyObject( TTypeUid aId ) + { + if ( aId.iUid == MAknsControlContext::ETypeId ) + { + return MAknsControlContext::SupplyMopObject( aId, iBgContext ); + } + return CAknDialog::MopSupplyObject( aId ); + } + +// ---------------------------------------------------------------------------- +// CWmDetailsDlg::OfferKeyEventL +// ---------------------------------------------------------------------------- +// +TKeyResponse CWmDetailsDlg::OfferKeyEventL( const TKeyEvent& aKeyEvent,TEventCode aType ) + { + if (aType == EEventKey) + { + switch (aKeyEvent.iCode) + { + case EKeyEscape: + { + // framework calls this when dialog must shut down + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + case EKeyDownArrow: + { + if ( iRtEditor ) + { + iRtEditor->MoveCursorL(TCursorPosition::EFPageDown, EFalse); + return EKeyWasConsumed; + } + } + case EKeyUpArrow: + { + if ( iRtEditor ) + { + iRtEditor->MoveCursorL(TCursorPosition::EFPageUp, EFalse); + return EKeyWasConsumed; + } + } + default: + { + if ( iRtEditor ) + { + return iRtEditor->OfferKeyEventL( aKeyEvent, aType ); + } + break; + } + } + } + return CAknDialog::OfferKeyEventL( aKeyEvent, aType); + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::Draw +// ----------------------------------------------------------------------------- +// +void CWmDetailsDlg::Draw( const TRect& /*aRect*/ ) const + { + CWindowGc& gc = SystemGc(); + TRect rect = Rect(); + TRect innerRect( rect ); + TRgb color = KRgbBlack; + const TInt offSet = 5; + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + + // draw background + if ( !AknsDrawUtils::Background( skin, cc, this, gc, innerRect ) ) + { + gc.SetPenStyle( CGraphicsContext::ENullPen ); + gc.SetBrushStyle( CGraphicsContext::ENullBrush ); + gc.SetBrushColor( AKN_LAF_COLOR( 0 ) ); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.DrawRect( innerRect ); + gc.SetBrushStyle( CGraphicsContext::ENullBrush ); + } + + // to fix scrollbar background issue in richtext editor + if ( iRtEditor ) + { + MAknsControlContext* ccRte = AknsDrawUtils::ControlContext( iRtEditor ); + AknsDrawUtils::Background( skin, ccRte, iRtEditor, gc, iRtEditor->Rect() ); + } + + // draw logo + TRect bmpRect( TPoint(0,0), TSize( iLogoBmp->SizeInPixels() ) ); + TPoint point = TPoint( innerRect.iTl.iX + offSet, + innerRect.iTl.iY + offSet ); + + if ( iLogoBmp && iLogoMask ) + { + gc.BitBltMasked( point, iLogoBmp, + bmpRect, iLogoMask, ETrue ); + } + else + { + gc.BitBlt( point, iLogoBmp, bmpRect ); + } + + // draw name + point.iX += (bmpRect.Width() + offSet); + + AknsUtils::GetCachedColor( + skin, color, + KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 ); + + // DRAW TEXT + const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimaryFont ); + gc.UseFont( font ); + gc.SetPenColor( color ); + gc.SetPenStyle( CGraphicsContext::ESolidPen ); + point.iY += (bmpRect.Height() - (font->HeightInPixels() /2 ) ); + CGraphicsContext::TDrawTextParam param; + + HBufC* buf = iName->Des().Alloc(); + if ( buf ) + { + TPtr bufPtr = buf->Des(); + TextUtils::ClipToFit( bufPtr, *font, (innerRect.Width() - point.iX ) ); + gc.DrawText( bufPtr ,point, param ); + delete buf; + } + else + { + gc.DrawText( *iName ,point, param ); + } + + gc.DiscardFont(); + + // draw the rounded rectangle as border + const TInt KFrameRoundRadius = 3; + const TInt KBorderWidth = 2; + gc.SetPenSize( TSize( KBorderWidth, KBorderWidth ) ); + gc.DrawRoundRect( innerRect, TSize( KFrameRoundRadius, KFrameRoundRadius ) ); + + // draw shadow + gc.SetBrushStyle(CGraphicsContext::ESolidBrush); + gc.SetPenStyle( CGraphicsContext::ESolidPen ); + gc.SetBrushColor( color ); + gc.SetPenColor( color ); + TRect rightShadowArea = Rect(); + rightShadowArea.iTl.iX = rightShadowArea.iBr.iX - offSet; + rightShadowArea.iTl.iY += offSet/2; + gc.DrawRect(rightShadowArea); + TRect bottomShadowArea = Rect(); + bottomShadowArea.iTl.iX += offSet/2; + bottomShadowArea.iTl.iY += bottomShadowArea.iBr.iY - offSet; + gc.DrawRect( bottomShadowArea ); + gc.SetBrushStyle( CGraphicsContext::ENullBrush ); + gc.SetPenStyle( CGraphicsContext::ENullPen ); + } + +// End of File +