widgetmanager/src/wmdetailsdlg.cpp
changeset 0 f72a12da539e
--- /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(&paraFormat, 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
+