diff -r 5f0182e07bfb -r 5456b4e8b3a8 idlehomescreen/widgetmanager/src/wmdetailsdlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/widgetmanager/src/wmdetailsdlg.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,585 @@ +/* +* 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 + +#include "widgetmanager.hrh" +#include "wmdetailsdlg.h" +#include "wmimageconverter.h" + + +// CONSTANTS + + +// MEMBER FUNCTIONS + +// --------------------------------------------------------- +// CWmDetailsDlg::NewL +// --------------------------------------------------------- +// +CWmDetailsDlg* CWmDetailsDlg::NewL( + const TDesC& aName, + const TDesC& aDescription, + TBool aCanBeAdded, + const TDesC& aIconStr, + const CFbsBitmap& aDefaultIcon, + const CFbsBitmap& aDefaultIconMask ) + { + CWmDetailsDlg* self = new ( ELeave ) CWmDetailsDlg( aCanBeAdded ); + CleanupStack::PushL( self ); + self->ConstructL( + aName, + aDescription, + aIconStr, + aDefaultIcon, + aDefaultIconMask ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CWmDetailsDlg::CWmDetailsDlg +// --------------------------------------------------------- +// +CWmDetailsDlg::CWmDetailsDlg( TBool aCanBeAdded ) + : CAknDialog(), + iCanBeAdded( aCanBeAdded ), + iNeedToScroll( EFalse ) + { + iBorder = TGulBorder::ERaisedControl; + } + +// --------------------------------------------------------- +// CWmDetailsDlg::~CWmDetailsDlg +// --------------------------------------------------------- +// +CWmDetailsDlg::~CWmDetailsDlg() + { + StopMarquee(); + iEikonEnv->RemoveFromStack( iRtEditor ); + iEikonEnv->RemoveFromStack( this ); + delete iRtEditor; + delete iMarquee; + delete iName; + delete iDescription; + delete iLogoBmp; + delete iLogoMask; + delete iBgContext; + delete iImageConverter; + } + +// ----------------------------------------------------------------------------- +// 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 TDesC& aIconStr, + const CFbsBitmap& aDefaultIcon, + const CFbsBitmap& aDefaultIconMask ) + { + + CAknDialog::ConstructL( R_AVKON_DIALOG_EMPTY_MENUBAR ); + + iBgContext = CAknsBasicBackgroundControlContext::NewL( + KAknsIIDQsnFrPopupCenter, TRect(0,0,1,1), EFalse); + + iName = aName.AllocL(); + iDescription = aDescription.AllocL(); + + iImageConverter = CWmImageConverter::NewL(); + + // Main window + TRect mainPane; + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::EApplicationWindow, mainPane ); + + // Dialog + TAknLayoutRect dlgWindowRect; + TAknWindowLineLayout dlgWindow = AknLayoutScalable_Apps + ::popup_wgtman_window().LayoutLine(); + dlgWindowRect.LayoutRect( mainPane, dlgWindow ); + + // Heading + TAknLayoutRect layoutRect; + TAknWindowLineLayout headingPane = AknLayoutScalable_Apps + ::wgtman_heading_pane().LayoutLine(); + layoutRect.LayoutRect( dlgWindowRect.Rect(), headingPane ); + + // Icon + TAknLayoutRect iconRect; + TAknWindowLineLayout icongrapichs = AknLayoutScalable_Apps + ::wgtman_heading_pane_g1().LayoutLine(); + iconRect.LayoutRect( layoutRect.Rect(), icongrapichs ); + + iImageConverter->HandleIconString( + iconRect.Rect().Size(), + aIconStr, + iLogoBmp, + iLogoMask ); + + // if icon creation fails use defaults + if ( !iLogoBmp || !iLogoMask ) + { + delete iLogoBmp; iLogoBmp = NULL; + delete iLogoMask; iLogoMask = NULL; + + iLogoBmp = new ( ELeave ) CFbsBitmap; + iLogoMask = new ( ELeave ) CFbsBitmap; + + TSize size = iconRect.Rect().Size(); + User::LeaveIfError( + iLogoBmp->Create( size, aDefaultIcon.DisplayMode() ) ); + User::LeaveIfError( + iLogoMask->Create( size, aDefaultIconMask.DisplayMode() ) ); + + iLogoBmp->Duplicate( aDefaultIcon.Handle() ); + iLogoMask->Duplicate( aDefaultIconMask.Handle() ); + + // Resize default icons only when they are really needed + AknIconUtils::SetSize( + iLogoBmp, size, EAspectRatioPreserved ); + AknIconUtils::SetSize( + iLogoMask, size, EAspectRatioPreserved ); + } + + 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->EnableKineticScrollingL( ETrue ); + + CEikScrollBarFrame* scrollBarFrame = iRtEditor->CreateScrollBarFrameL(); + scrollBarFrame->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + + iMarquee = CAknMarqueeControl::NewL(); + TCallBack callback( RedrawCallback, this ); + iMarquee->SetRedrawCallBack( callback ); + iMarquee->SetLoops( 1 ); + iMarquee->SetContainerWindowL( *this ); + + InsertAndFormatContentL(); + iRtEditor->UpdateScrollBarsL(); + } + +//------------------------------------------------------------------------------ +// CWmDetailsDlg::InsertAndFormatContentL +//------------------------------------------------------------------------------ +// +void CWmDetailsDlg::InsertAndFormatContentL() + { + CRichText* richText = iRtEditor->RichText(); + + richText->Reset(); + 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::ELeftAlign; + charFormat.iFontPresentation.iTextColor = color; + paraFormatMask.SetAttrib(EAttAlignment); + charFormatMask.SetAttrib(EAttFontTypeface); + charFormatMask.SetAttrib(EAttFontHeight); + paraFormatMask.SetAttrib(EAttLineSpacing); + charFormatMask.SetAttrib(EAttColor); + iRtEditor->ApplyParaFormatL(¶Format, paraFormatMask); + iRtEditor->ApplyCharFormatL(charFormat, charFormatMask); + iRtEditor->ClearSelectionL(); + } + +//------------------------------------------------------------------------------ +// CWmDetailsDlg::CountComponentControls +//------------------------------------------------------------------------------ +// +TInt CWmDetailsDlg::CountComponentControls() const + { + TInt count( 0 ); + if ( iRtEditor ) + count++; + if ( iMarquee ) + count++; + return count; + } + +//------------------------------------------------------------------------------ +// CWmDetailsDlg::ComponentControl +//------------------------------------------------------------------------------ +// +CCoeControl* CWmDetailsDlg::ComponentControl(TInt aIndex) const + { + switch (aIndex) + { + case 0: + return iRtEditor; + case 1: + return iMarquee; + default: + return NULL; + } + } + +//------------------------------------------------------------------------------ +// CWmDetailsDlg::ActivateL +//------------------------------------------------------------------------------ +// +void CWmDetailsDlg::ActivateL() + { + CAknDialog::ActivateL(); + iEikonEnv->EikAppUi()->AddToStackL( this, ECoeStackPriorityDialog ); + iEikonEnv->EikAppUi()->AddToStackL( iRtEditor ); + iRtEditor->SetFocus( ETrue ); + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::SetSizeAndPosition +// ----------------------------------------------------------------------------- +// +void CWmDetailsDlg::SetSizeAndPosition( const TSize& /*aSize*/ ) + { + TRect mainPane; + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::EApplicationWindow, mainPane ); + TAknWindowLineLayout dlgWindow = AknLayoutScalable_Apps + ::popup_wgtman_window().LayoutLine(); + AknLayoutUtils::LayoutControl( this, mainPane, dlgWindow ); + } + +// ----------------------------------------------------------------------------- +// CWmDetailsDlg::SizeChanged +// ----------------------------------------------------------------------------- +// +void CWmDetailsDlg::SizeChanged() + { + CAknDialog::SizeChanged(); + TRect rect = Rect(); + if ( iBgContext ) { iBgContext->SetRect( rect ); } + if ( iRtEditor ) + { + TAknLayoutRect layoutRect; + TAknWindowLineLayout contentPane = AknLayoutScalable_Apps + ::wgtman_content_pane().LayoutLine(); + TAknWindowLineLayout rtePane = AknLayoutScalable_Apps + ::wgtman_list_pane().LayoutLine(); + layoutRect.LayoutRect( rect, contentPane ); + AknLayoutUtils::LayoutControl( iRtEditor, layoutRect.Rect(), rtePane ); + CEikScrollBarFrame* sbFrame = iRtEditor->ScrollBarFrame(); + if ( sbFrame && + sbFrame->ScrollBarVisibility( + CEikScrollBar::EVertical ) != CEikScrollBarFrame::EOff && + sbFrame->VerticalScrollBar()->IsVisible() ) + { + CEikScrollBar* scrollBar = sbFrame->VerticalScrollBar(); + TAknWindowLineLayout scrollPane = AknLayoutScalable_Apps + ::scroll_pane_cp036().LayoutLine(); + AknLayoutUtils::LayoutControl( scrollBar, layoutRect.Rect(), scrollPane ); + } + TRAP_IGNORE( + iRtEditor->SetSkinBackgroundControlContextL( iBgContext ); + InsertAndFormatContentL(); ); + + StartMarquee(); + } + } + +// ---------------------------------------------------------------------------- +// 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; + + 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 ); + } + + // draw logo + TAknLayoutRect layoutRect; + TAknWindowLineLayout headingPane = AknLayoutScalable_Apps + ::wgtman_heading_pane().LayoutLine(); + layoutRect.LayoutRect( rect, headingPane ); + + TAknLayoutRect logoLayout; + logoLayout.LayoutRect( layoutRect.Rect(),AknLayoutScalable_Apps + ::wgtman_heading_pane_g1().LayoutLine() ); + + if( iLogoBmp && iLogoMask ) + { + gc.DrawBitmapMasked( logoLayout.Rect(), + iLogoBmp, + TRect(TPoint(0, 0), iLogoBmp->SizeInPixels()), + iLogoMask, + EFalse ); + } + + AknsUtils::GetCachedColor( + skin, color, + KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 ); + + // DRAW TEXT + TAknTextLineLayout titleTextLayout = + AknLayoutScalable_Apps::wgtman_heading_pane_t1().LayoutLine(); + TAknLayoutText textLayoutTitle; + textLayoutTitle.LayoutText( layoutRect.Rect(), titleTextLayout ); + + const CFont* font = textLayoutTitle.Font(); + if ( !font ) + { + font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimaryFont ); + } + + gc.UseFont( font ); + gc.SetPenColor( color ); + gc.SetPenStyle( CGraphicsContext::ESolidPen ); + + TBool truncate( ETrue ); + + // check if name needs scrolling + if ( textLayoutTitle.Font()->TextWidthInPixels( *iName ) > + textLayoutTitle.TextRect().Width() && IsFocused() ) + { + const_cast(*this).iNeedToScroll = ETrue; + const_cast(*this).StartMarquee(); + truncate = iMarquee->DrawText( + gc, textLayoutTitle.TextRect(), *iName, + (textLayoutTitle.TextRect().Height() - font->FontMaxDescent()), + CGraphicsContext::ELeft, *font ); + } + + if ( truncate ) + { + const_cast(*this).StopMarquee(); + textLayoutTitle.DrawText( gc, *iName, ETrue, color ); + } + + 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 ) ); + } + +// --------------------------------------------------------- +// CWmDetailsDlg::RedrawCallback +// --------------------------------------------------------- +// +TInt CWmDetailsDlg::RedrawCallback( TAny* aPtr ) + { + CWmDetailsDlg* self = + static_cast( aPtr ); + if ( !self->iNeedToScroll ) + { + self->StopMarquee(); + } + self->DrawDeferred(); + return static_cast( ETrue ); + } + +// --------------------------------------------------------- +// CWmDetailsDlg::StartMarquee +// --------------------------------------------------------- +// +void CWmDetailsDlg::StartMarquee() + { + if ( iMarquee && iNeedToScroll && + !iMarquee->IsMarqueeOn() ) + { + iMarquee->Reset(); + iMarquee->EnableMarquee( iNeedToScroll ); + iMarquee->Start(); + } + } + +// --------------------------------------------------------- +// CWmDetailsDlg::StopMarquee +// --------------------------------------------------------- +// +void CWmDetailsDlg::StopMarquee() + { + if ( iMarquee && iMarquee->IsMarqueeOn() ) + { + iMarquee->EnableMarquee( EFalse ); + iMarquee->Stop(); + } + } + +// --------------------------------------------------------- +// CWmDetailsDlg::FocusChanged +// --------------------------------------------------------- +// +void CWmDetailsDlg::FocusChanged( TDrawNow aDrawNow ) + { + CCoeControl::FocusChanged( aDrawNow ); + ( IsFocused() ? StartMarquee() : StopMarquee() ); + } + + +// End of File +