--- /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 <gdi.h>
+#include <eikrted.h> // for CRichTextEditor
+#include <txtrich.h> // for CRichText
+#include <AknUtils.h> // for AknUtils
+#include <AknsUtils.h> // MAknsSkinInstance
+#include <AknsDrawUtils.h> // AknsDrawUtils
+#include <applayout.cdl.h> //layout
+#include <layoutmetadata.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <AknsBasicBackgroundControlContext.h>
+
+#include <widgetmanagerview.rsg>
+#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<CCoeControl*>(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
+