csxhelp/src/CSXHLegacyTopicContainer.cpp
branchRCL_3
changeset 17 12f60d9a73b3
parent 16 0d1adf67ec1b
child 18 cbffe13eac63
equal deleted inserted replaced
16:0d1adf67ec1b 17:12f60d9a73b3
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  CCSXHLegacyTopicContainer class definition
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "CSXHLegacyTOC2.h"
       
    20 #include "CSXHLegacyTopicContainer.h"
       
    21 #include "CSXHDocument.h"
       
    22 
       
    23 #include "CSXHAppUi.h"
       
    24 
       
    25 #include <eikrted.h>
       
    26 #include <txtrich.h>
       
    27 #include <aknkeys.h>
       
    28 #include <AknUtils.h>
       
    29 #include <barsread.h>
       
    30 #include <applayout.cdl.h>    //Dynamic layout functions
       
    31 #include <AknsDrawUtils.h> 
       
    32 #include <AknsBasicBackgroundControlContext.h>
       
    33 #include <aknlayoutscalable_apps.cdl.h>
       
    34 #include <aknappui.h>
       
    35 #include <txtfrmat.h> 
       
    36 #include <cshelp.rsg>
       
    37 
       
    38 CCSXHLegacyTopicContainer* CCSXHLegacyTopicContainer::NewL(const TRect& 
       
    39 aRect,CCSXHDocument &aDocument,CCSXHLegacyTOC2 *aTopic)
       
    40     {
       
    41     CCSXHLegacyTopicContainer* self = CCSXHLegacyTopicContainer::NewLC(aRect,aDocument,aTopic);
       
    42     CleanupStack::Pop(self);
       
    43     return self;
       
    44     }
       
    45     
       
    46 CCSXHLegacyTopicContainer* CCSXHLegacyTopicContainer::NewLC(const TRect& 
       
    47 aRect,CCSXHDocument &aDocument,CCSXHLegacyTOC2 *aTopic)
       
    48     {
       
    49     CCSXHLegacyTopicContainer* self = new (ELeave) CCSXHLegacyTopicContainer(aDocument,aTopic);
       
    50     CleanupStack::PushL(self);
       
    51     self->ConstructL(aRect);
       
    52     return self;
       
    53     }
       
    54 
       
    55 CCSXHLegacyTopicContainer::CCSXHLegacyTopicContainer(CCSXHDocument 
       
    56 &aDocument,CCSXHLegacyTOC2 *aTopic):iDocument(aDocument),iTopic(aTopic)
       
    57     {
       
    58     }
       
    59 
       
    60 void CCSXHLegacyTopicContainer::ConstructL(const TRect& aRect/*, CRichText* aText*/)
       
    61     {
       
    62     CreateWindowL();
       
    63     TRect rect(0,0,0,0);
       
    64     // Temporary rect is passed. Correct rect is set in SizeChanged.
       
    65     iSkinContext = CAknsBasicBackgroundControlContext::NewL(
       
    66        KAknsIIDQsnBgAreaMain , rect, EFalse);
       
    67        
       
    68     iText = STATIC_CAST(CRichText*,iTopic->GetTopicContentL());
       
    69     
       
    70     GetTextFormat();
       
    71 
       
    72     iEdwin = new(ELeave) CEikEdwin();
       
    73     TInt flags(CEikEdwin::EKeepDocument |
       
    74                CEikEdwin::EUserSuppliedText |
       
    75                CEikEdwin::ENoAutoSelection |
       
    76                CEikEdwin::EAvkonDisableCursor |
       
    77                CEikEdwin::EReadOnly |
       
    78                CEikEdwin::EDisplayOnly);
       
    79 
       
    80     if ( iText == NULL )
       
    81         {
       
    82         flags = flags & ~CEikEdwin::EUserSuppliedText;
       
    83         }
       
    84 
       
    85     iEdwin->SetContainerWindowL(*this);
       
    86 
       
    87     iEdwin->ConstructL(flags);
       
    88     iEdwin->CreatePreAllocatedScrollBarFrameL()->SetScrollBarVisibilityL(
       
    89                                                  CEikScrollBarFrame::EOff,
       
    90                                                  CEikScrollBarFrame::EAuto);
       
    91     SetTextL(iText);
       
    92     if( iText != NULL )
       
    93         {
       
    94         FormatRichTextL(*iText);
       
    95         }
       
    96     SetRect(aRect);
       
    97     ActivateL();
       
    98     }
       
    99 
       
   100 CCSXHLegacyTopicContainer::~CCSXHLegacyTopicContainer()
       
   101     {
       
   102     delete iEdwin;
       
   103     delete iSkinContext;
       
   104     }
       
   105 
       
   106 void CCSXHLegacyTopicContainer::RefreshL(CCSXHLegacyTOC2 *aTopic)
       
   107     {
       
   108     iTopic = aTopic;
       
   109     iText = STATIC_CAST(CRichText*,iTopic->GetTopicContentL());
       
   110     SetTextL(iText);
       
   111     if( iText != NULL )
       
   112         {
       
   113         FormatRichTextL(*iText);
       
   114         }
       
   115     SizeChanged();
       
   116     }
       
   117 
       
   118 void CCSXHLegacyTopicContainer::SetTextL(CRichText* aText)
       
   119     {
       
   120     if( aText == NULL )
       
   121         {
       
   122         HBufC* errorMessage = iCoeEnv->AllocReadResourceLC( R_TYPE_NO_HELP_TOPICS );
       
   123         iEdwin->SetTextL( errorMessage );
       
   124         CleanupStack::PopAndDestroy( errorMessage ); 
       
   125         }
       
   126     else
       
   127         {
       
   128         iEdwin->SetDocumentContentL(*aText, CEikEdwin::EUseText);
       
   129         iEdwin->SetCursorPosL(0, EFalse);
       
   130         }    
       
   131     }
       
   132 
       
   133 void CCSXHLegacyTopicContainer::FocusChanged(TDrawNow aDrawNow)
       
   134     {
       
   135     if (iEdwin)
       
   136         {
       
   137         iEdwin->SetFocus(IsFocused(), aDrawNow);
       
   138         }
       
   139     }
       
   140 
       
   141 void CCSXHLegacyTopicContainer::GetTextFormat()
       
   142     {
       
   143     
       
   144     TAknMultiLineTextLayout layoutToUse;
       
   145     if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
       
   146         {
       
   147         
       
   148         TAknTextLineLayout layoutnew1 = AknLayoutScalable_Apps::help_list_pane_t1(0).LayoutLine();
       
   149         
       
   150 
       
   151         TAknLayoutScalableParameterLimits limits1 = 
       
   152             AknLayoutScalable_Apps::help_list_pane_t1_ParamLimits();
       
   153             
       
   154         TInt numberoflines = limits1.LastRow() + 1;
       
   155         
       
   156         layoutnew1.iNumberOfLinesShown = numberoflines ;
       
   157     
       
   158         layoutToUse.iC = layoutnew1.iC;
       
   159         layoutToUse.il = layoutnew1.il;
       
   160         layoutToUse.ir = layoutnew1.ir;
       
   161         layoutToUse.iB = layoutnew1.iB;
       
   162         layoutToUse.iW = layoutnew1.iW;
       
   163         layoutToUse.iJ = layoutnew1.iJ;
       
   164         layoutToUse.iFont = layoutnew1.iFont;
       
   165         layoutToUse.iBaselineSkip = layoutnew1.iBaselineSkip;
       
   166         layoutToUse.iNumberOfLinesShown = layoutnew1.iNumberOfLinesShown;
       
   167         }
       
   168     else
       
   169         {
       
   170         layoutToUse = AppLayout::Multiline_Help_texts_Line_1(0);
       
   171         }
       
   172 
       
   173     const CFont* font = AknLayoutUtils::FontFromId(layoutToUse.FontId() /*iFont*/, NULL);
       
   174     iCharFormat.iFontSpec = font->FontSpecInTwips();
       
   175     iCharFormatMask.SetAttrib(EAttFontTypeface);
       
   176     iCharFormatMask.SetAttrib(EAttFontHeight);
       
   177 
       
   178     TRgb color;
       
   179     MAknsSkinInstance* skin = AknsUtils::SkinInstance();
       
   180     TInt error = AknsUtils::GetCachedColor(skin, color, KAknsIIDQsnTextColors, 
       
   181     													EAknsCIQsnTextColorsCG6 );
       
   182     if(error==KErrNone)
       
   183         iCharFormat.iFontPresentation.iTextColor = color;
       
   184     
       
   185     iCharFormatMask.SetAttrib(EAttColor);
       
   186     iCharFormatMask.SetAttrib(EAttFontPosture);    
       
   187  }
       
   188 void CCSXHLegacyTopicContainer::FormatRichTextL( CRichText& aText )
       
   189     {
       
   190     TInt length = aText.DocumentLength();
       
   191     length++;
       
   192     // Apply the general formatting rules...
       
   193     aText.ApplyCharFormatL( iCharFormat, iCharFormatMask, 0, length );
       
   194     
       
   195     TParaFormatMask paraFormatMask;
       
   196 	paraFormatMask.SetAttrib( EAttBullet );
       
   197 	CParaFormat *paraFormat  = new ( ELeave ) CParaFormat;
       
   198 	CleanupStack::PushL(paraFormat);	
       
   199 	TInt paraCount = aText.ParagraphCount();
       
   200 	for(TInt i = 0; i < paraCount ; ++i)
       
   201 		{
       
   202 		TInt paraLength;
       
   203 		TInt paraStart = aText.CharPosOfParagraph(paraLength,i);
       
   204 		
       
   205 		aText.GetParagraphFormatL(paraFormat,paraStart);
       
   206 		if(paraFormat->iBullet)
       
   207 			{
       
   208 			TBullet* bullet = new ( ELeave ) TBullet;
       
   209 			CleanupStack::PushL(bullet);
       
   210 			bullet->iColor = iCharFormat.iFontPresentation.iTextColor;
       
   211 			bullet->iHeightInTwips = iCharFormat.iFontSpec.iHeight;
       
   212 			
       
   213 			CParaFormat* paraFormatNew = new ( ELeave ) CParaFormat;			
       
   214 			paraFormatNew->iBullet = bullet; // ownership xfer
       
   215 			
       
   216 			CleanupStack::Pop();
       
   217 			CleanupStack::PushL(paraFormatNew);
       
   218 			
       
   219 			aText.ApplyParaFormatL( paraFormatNew, paraFormatMask, paraStart, paraLength - 1);
       
   220 			CleanupStack::PopAndDestroy(paraFormatNew);
       
   221 			}
       
   222 		}
       
   223 	CleanupStack::PopAndDestroy(paraFormat);
       
   224     }
       
   225 
       
   226 
       
   227 void CCSXHLegacyTopicContainer::SizeChanged()
       
   228     {
       
   229 	if(iSkinContext)
       
   230         	iSkinContext->SetRect(Rect());
       
   231     if(iEdwin)
       
   232     	{
       
   233     	TRect clientrect = Rect();
       
   234     	if(AknLayoutUtils::LayoutMirrored())
       
   235 			{
       
   236 			clientrect.iTl.iX = clientrect.iTl.iX + (iEdwin->ScrollBarFrame()
       
   237     				->ScrollBarBreadth(CEikScrollBar::EVertical))* 1.1;    		
       
   238 			}
       
   239 		else
       
   240 			{
       
   241     		TInt RectWidth =  clientrect.Width() - (iEdwin->ScrollBarFrame()
       
   242     				->ScrollBarBreadth(CEikScrollBar::EVertical))* 1.1;      
       
   243 			
       
   244     		clientrect.SetWidth(RectWidth);
       
   245 			}
       
   246     	
       
   247        	iEdwin->SetRect(clientrect);
       
   248        	TRAP_IGNORE(iEdwin->ForceScrollBarUpdateL());
       
   249     	}    
       
   250     }
       
   251 
       
   252 // ---------------------------------------------------------
       
   253 // CCsHelpTopicContainer::OfferKeyEventL(...)
       
   254 // Processing a key event
       
   255 //  
       
   256 // (other items were commented in a header).
       
   257 // ---------------------------------------------------------
       
   258 TKeyResponse CCSXHLegacyTopicContainer::OfferKeyEventL(
       
   259                                       const TKeyEvent& aKeyEvent,
       
   260                                       TEventCode aType)
       
   261     {
       
   262     TKeyResponse result(EKeyWasConsumed);
       
   263  
       
   264     switch (aKeyEvent.iCode)
       
   265         {            
       
   266         case EKeyUpArrow:
       
   267             iEdwin->MoveDisplayL(TCursorPosition::EFLineUp);
       
   268             iEdwin->UpdateScrollBarsL();
       
   269             break;
       
   270         case EKeyDownArrow:
       
   271             iEdwin->MoveDisplayL(TCursorPosition::EFLineDown);
       
   272             iEdwin->UpdateScrollBarsL();
       
   273             break;
       
   274         default:
       
   275             result = iEdwin->OfferKeyEventL(aKeyEvent, aType);
       
   276         }
       
   277 
       
   278     return result;
       
   279     }
       
   280 
       
   281 
       
   282 // ---------------------------------------------------------
       
   283 // CCsHelpTopicContainer::CountComponentControls() const
       
   284 //
       
   285 //  
       
   286 // (other items were commented in a header).
       
   287 // ---------------------------------------------------------
       
   288 //
       
   289 TInt CCSXHLegacyTopicContainer::CountComponentControls() const
       
   290     {
       
   291     return 1; // return nbr of controls inside this container
       
   292     }
       
   293 
       
   294 // ---------------------------------------------------------
       
   295 // CCsHelpTopicContainer::ComponentControl(TInt aIndex) const
       
   296 //
       
   297 // (other items were commented in a header).
       
   298 // ---------------------------------------------------------
       
   299 //
       
   300 CCoeControl* CCSXHLegacyTopicContainer::ComponentControl(TInt aIndex) const
       
   301     {
       
   302     switch ( aIndex )
       
   303         {
       
   304         case 0:
       
   305             return iEdwin;
       
   306         default:
       
   307             return NULL;
       
   308         }
       
   309     }
       
   310 
       
   311 // ---------------------------------------------------------
       
   312 // CCsHelpTopicContainer::Draw(..)
       
   313 //
       
   314 // (other items were commented in a header).
       
   315 // ---------------------------------------------------------
       
   316 //
       
   317 void CCSXHLegacyTopicContainer::Draw(const TRect& aRect) const
       
   318     {
       
   319     CWindowGc& gc = SystemGc();
       
   320     gc.Clear(aRect);
       
   321     MAknsSkinInstance* skin = AknsUtils::SkinInstance();
       
   322     if (iSkinContext)
       
   323         {//Draw the skin background
       
   324         AknsDrawUtils::Background(
       
   325             skin, iSkinContext, this, gc, aRect);
       
   326         }
       
   327     }
       
   328 void CCSXHLegacyTopicContainer::HandleResourceChange(TInt aType)
       
   329     {
       
   330      CCSXHAppUi::GetInstance()->PropagateResourceChange(aType);                
       
   331     }
       
   332 
       
   333 void CCSXHLegacyTopicContainer::HandleResourceChangeImpl(TInt aType)
       
   334     {
       
   335     if(aType == KEikDynamicLayoutVariantSwitch)
       
   336         {
       
   337         iEdwin->HandleResourceChange(aType);
       
   338         TRect mainRect; 
       
   339         AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainRect);        
       
   340         SetRect(mainRect);        
       
   341         }
       
   342     else
       
   343         {
       
   344         CCoeControl::HandleResourceChange(aType);
       
   345         }
       
   346     
       
   347     }
       
   348 
       
   349 
       
   350 // ---------------------------------------------------------
       
   351 // CCsHelpTopicContainer::MopSupplyObject()
       
   352 // Pass skin information if need.
       
   353 // ---------------------------------------------------------
       
   354 
       
   355 TTypeUid::Ptr CCSXHLegacyTopicContainer::MopSupplyObject(TTypeUid aId)
       
   356     {
       
   357     if (aId.iUid == MAknsControlContext::ETypeId && iSkinContext)
       
   358         {
       
   359         return MAknsControlContext::SupplyMopObject(aId, iSkinContext);
       
   360         }
       
   361 
       
   362     return CCoeControl::MopSupplyObject(aId);
       
   363     }
       
   364 // End of File