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 |
|