diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/txtstyl_8cpp-source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/txtstyl_8cpp-source.html Tue Mar 30 11:56:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,322 +0,0 @@ - -
-00001 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). -00002 // All rights reserved. -00003 // This component and the accompanying materials are made available -00004 // under the terms of "Eclipse Public License v1.0" -00005 // which accompanies this distribution, and is available -00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". -00007 // -00008 // Initial Contributors: -00009 // Nokia Corporation - initial contribution. -00010 // -00011 // Contributors: -00012 // -00013 // Description: -00014 // -00015 -00016 #include "txtexamp.h" -00017 -00018 #include <txtrich.h> -00019 -00020 CStyleControl::~CStyleControl() -00021 { -00022 delete iTextView; // text view -00023 delete iLayout; // layout -00024 delete iRichText; // contained text object -00025 delete iNormalCharFormatLayer; // char format layer -00026 delete iNormalParaFormatLayer; // para format layer -00027 } -00028 -00029 void CStyleControl::CreateNormalL() -00030 { -00031 // Create the "Normal" style -00032 // = the global format layers upon which all styles will be based. -00033 // Use default formatting except for an increased left margin and line spacing. -00034 CParaFormat* paraFormat=CParaFormat::NewLC(); -00035 TParaFormatMask paraFormatMask; -00036 paraFormat->iLeftMarginInTwips=360; -00037 paraFormatMask.SetAttrib(EAttLeftMargin); -00038 paraFormat->iLineSpacingInTwips=300; -00039 paraFormatMask.SetAttrib(EAttLineSpacing); -00040 // Create the normal (global) style -00041 iNormalParaFormatLayer=CParaFormatLayer::NewL(paraFormat,paraFormatMask); -00042 CleanupStack::PopAndDestroy(); // paraFormat -00043 TCharFormat charFormat; -00044 TCharFormatMask charFormatMask; -00045 charFormatMask.SetAttrib(EAttFontHeight); -00046 iNormalCharFormatLayer=CCharFormatLayer::NewL(charFormat,charFormatMask); -00047 } -00048 -00049 void CStyleControl::CreateStylesL() -00050 { -00051 // Create two new styles, with names "Warning" and "ListBullet", -00052 // add some appropriate formatting and append them to a style list. -00053 _LIT(KStyle,"Warning"); -00054 _LIT(KStyleTwo,"ListBullet"); -00055 CParaFormat* paraFormat=CParaFormat::NewLC(); -00056 TParaFormatMask paraFormatMask; -00057 TCharFormat charFormat; -00058 TCharFormatMask charFormatMask; -00059 // Style 1 - "Warning style" -00060 iStyleOne=CParagraphStyle::NewL( -00061 *iNormalParaFormatLayer,*iNormalCharFormatLayer); // Base it on the "normal" layers -00062 -00063 // Enclose text in a paragraph border -00064 TParaBorder paraBorder; -00065 paraBorder.iLineStyle=TParaBorder::ESolid; -00066 paraBorder.iThickness=4; // border width -00067 paraBorder.iColor=KRgbGray; // set border color to gray -00068 paraBorder.iAutoColor=EFalse; // iColor overrides text color -00069 paraFormat->SetParaBorderL(CParaFormat::EParaBorderTop,paraBorder); -00070 paraFormat->SetParaBorderL(CParaFormat::EParaBorderBottom,paraBorder); -00071 paraFormat->SetParaBorderL(CParaFormat::EParaBorderLeft,paraBorder); -00072 paraFormat->SetParaBorderL(CParaFormat::EParaBorderRight,paraBorder); -00073 paraFormatMask.SetAttrib(EAttTopBorder); -00074 paraFormatMask.SetAttrib(EAttBottomBorder); -00075 paraFormatMask.SetAttrib(EAttRightBorder); -00076 paraFormatMask.SetAttrib(EAttLeftBorder); -00077 iStyleOne->SetL(paraFormat,paraFormatMask); -00078 // Make it bold. -00079 // First, get handle to style 1's character format layer -00080 CCharFormatLayer* charStyleFormatLayer = iStyleOne->CharFormatLayer(); -00081 charFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold); -00082 charFormatMask.SetAttrib(EAttFontStrokeWeight); -00083 // Set the style's character format layer -00084 charStyleFormatLayer->SetL(charFormat,charFormatMask); -00085 // Finally, set its name to "Warning" -00086 iStyleOne->iName=KStyle; -00087 -00088 // Style 2 - "listbullet" -00089 paraFormat->Strip(); // Clear paraformat ready for new style -00090 paraFormatMask.ClearAll(); // Clear mask -00091 iStyleTwo=CParagraphStyle::NewL( -00092 *iNormalParaFormatLayer,*iNormalCharFormatLayer); // Base it on the "normal" layers -00093 paraFormat->iBullet=new(ELeave)TBullet; -00094 paraFormat->iBullet->iHeightInTwips=480; // Size of bullet point character=480 twips -00095 paraFormat->iBullet->iHangingIndent=ETrue; // Indent the rest of the paragraph from the bullet -00096 paraFormatMask.SetAttrib(EAttBullet); -00097 iStyleTwo->SetL(paraFormat,paraFormatMask); -00098 // Finally, set its name to "ListBullet" -00099 iStyleTwo->iName=KStyleTwo; -00100 -00101 // Create style table and insert styles. -00102 iStyleList=CStyleList::NewL(); -00103 RParagraphStyleInfo info1(iStyleOne); -00104 RParagraphStyleInfo info2(iStyleTwo); -00105 iStyleList->AppendL(&info1); -00106 iStyleList->AppendL(&info2); -00107 // Create rich text object based on normal layers, with the style table. -00108 iRichText=CRichText::NewL(iNormalParaFormatLayer,iNormalCharFormatLayer,*iStyleList); -00109 CleanupStack::PopAndDestroy(); // paraFormat -00110 } -00111 -00112 void CStyleControl::UpdateModelL() -00113 { -00114 // Create all constant literal descriptors used in this function, -00115 // e.g. for message text -00116 _LIT(KText1,"Some text using normal style"); -00117 _LIT(KText2,"Text in warning style - based on normal"); -00118 _LIT(KText3,"Text in list bullet style"); -00119 _LIT(KText4,"Some more text in list bullet style"); -00120 _LIT(KText5,"Some text in italics"); -00121 _LIT(KStatus0,"Initialised styles and view"); -00122 _LIT(KStatus1,"Normal"); -00123 _LIT(KStatus2,"Warning style"); -00124 _LIT(KStatus3,"List bullet style"); -00125 _LIT(KStatus4,"Character and paragraph formatting applied to styled text"); -00126 _LIT(KStatus5,"All specific formatting removed from third paragraph"); -00127 _LIT(KStatus6,"Inserted some normal text with specific formatting"); -00128 _LIT(KStatus7,"Applied a style (warning) to text, retaining specific formatting"); -00129 _LIT(KStatus8,"Reset();"); -00130 _LIT(KStatusDefault,"(overshot!!)"); -00131 -00132 -00133 switch (Phase()) -00134 { -00135 // Apply paragraph styles -00136 case 0: -00137 { -00138 // Create the global format layers on which all styles are based. -00139 CreateNormalL(); -00140 // Create text object and styles. -00141 CreateStylesL(); -00142 // Prerequisites for view - viewing rectangle -00143 iViewRect=Rect(); -00144 iViewRect.Shrink(3,3); -00145 // context and device -00146 CWindowGc& gc=SystemGc(); // get graphics context -00147 CBitmapDevice* device=(CBitmapDevice*) (gc.Device()); // device -00148 // layout -00149 iLayout=CTextLayout::NewL(iRichText,iViewRect.Width()); // new layout -00150 // construct layout, giving width of viewing rectangle -00151 // text view -00152 iTextView=CTextView::NewL(iLayout, iViewRect, -00153 device, -00154 device, -00155 &Window(), -00156 0, // no window group -00157 &iCoeEnv->WsSession() -00158 ); -00159 iFormObserver->NotifyStatus(KStatus0); -00160 break; -00161 } -00162 case 1: -00163 // Set some character formatting - applied globally -00164 iCharFormatMask.SetAttrib(EAttFontStrokeWeight); -00165 -00166 iCharFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold); -00167 -00168 // apply formatting - pos and length are irrelevent -00169 iRichText->ApplyCharFormatL(iCharFormat,iCharFormatMask, 0,0); -00170 -00171 // Insert a paragraph using the "normal" (default) formatting. -00172 iRichText->InsertL(0,KText1); -00173 iRichText->InsertL(iRichText->DocumentLength(), -00174 CEditableText::EParagraphDelimiter); -00175 iFormObserver->NotifyStatus(KStatus1); -00176 break; -00177 case 2: -00178 { -00179 // Insert a paragraph in "warning" style -00180 TInt length; -00181 TInt startPos; -00182 iRichText->InsertL(iRichText->DocumentLength(),KText2); -00183 iRichText->InsertL(iRichText->DocumentLength(), -00184 CEditableText::EParagraphDelimiter); -00185 // Get start position of second paragraph -00186 startPos=iRichText->CharPosOfParagraph(length,1); // Not interested in length -00187 // Apply warning style to second paragraph - single character is enough -00188 iRichText->ApplyParagraphStyleL(*iStyleList->At(0).iStyle,startPos,1, -00189 CParagraphStyle::ERetainAllSpecificFormats); -00190 iFormObserver->NotifyStatus(KStatus2); -00191 break; -00192 } -00193 case 3: -00194 // Insert two paragraphs in list bullet style -00195 { -00196 TInt length; -00197 TInt startPos; -00198 // Insert some text in bullet point style -00199 iRichText->InsertL(iRichText->DocumentLength(),KText3); -00200 iRichText->InsertL(iRichText->DocumentLength(), -00201 CEditableText::EParagraphDelimiter); -00202 // end para -00203 iRichText->InsertL(iRichText->DocumentLength(),KText4); -00204 iRichText->InsertL(iRichText->DocumentLength(), -00205 CEditableText::EParagraphDelimiter); -00206 // end para -00207 // Get start position and length of third paragraph -00208 startPos=iRichText->CharPosOfParagraph(length,2); // Interested in length -00209 // Apply list bullet style to 3rd and 4th paragraphs, -00210 // from start of para 2, for length of para2 + 1 characters. -00211 iRichText->ApplyParagraphStyleL(*iStyleList->At(1).iStyle,startPos,length+1, -00212 CParagraphStyle::ERetainAllSpecificFormats); -00213 iFormObserver->NotifyStatus(KStatus3); -00214 break; -00215 } -00216 case 4: -00217 // Apply character and paragraph formatting -00218 // (underlining and right alignment) over a style -00219 { -00220 TInt startPos, length; -00221 // Get start pos and length of third paragraph -00222 startPos=iRichText->CharPosOfParagraph(length,2); -00223 // set underlining -00224 TCharFormat charFormat; -00225 TCharFormatMask charFormatMask; -00226 charFormat.iFontPresentation.iUnderline=EUnderlineOn; -00227 charFormatMask.SetAttrib(EAttFontUnderline); // interested in underlining -00228 // Apply character formatting, from start of para for para length -00229 // minus one char (don't want trailing paragraph delimiter underlined) -00230 iRichText->ApplyCharFormatL(charFormat, charFormatMask,startPos,length-1); -00231 CParaFormat* paraFormat=CParaFormat::NewL(); -00232 TParaFormatMask paraFormatMask; -00233 paraFormat->iHorizontalAlignment=CParaFormat::ERightAlign; -00234 paraFormatMask.SetAttrib(EAttAlignment); -00235 // Apply right alignment to first paragraph. A single character is enough -00236 iRichText->ApplyParaFormatL(paraFormat, paraFormatMask,startPos,1); -00237 iFormObserver->NotifyStatus(KStatus4); -00238 delete paraFormat; -00239 break; -00240 } -00241 case 5: -00242 // Remove all specific formatting from third para -00243 { -00244 TInt startPos, length; -00245 startPos=iRichText->CharPosOfParagraph(length,2); -00246 // Remove all specific character formatting from the paragraph -00247 iRichText->RemoveSpecificCharFormatL(startPos,length); -00248 // Remove all specific para formatting from the paragraph -00249 iRichText->RemoveSpecificParaFormatL(startPos,2); -00250 iFormObserver->NotifyStatus(KStatus5); -00251 break; -00252 } -00253 case 6: -00254 // Insert text in italics at the end of the document -00255 { -00256 TCharFormat charFormat; -00257 TCharFormatMask charFormatMask; -00258 charFormat.iFontSpec.iFontStyle.SetPosture(EPostureItalic); -00259 charFormatMask.SetAttrib(EAttFontPosture); // interested in italic -00260 // Set formatting for all text inserted at this position. -00261 iRichText->SetInsertCharFormatL(charFormat,charFormatMask,iRichText->DocumentLength()); -00262 iRichText->InsertL(iRichText->DocumentLength(),KText5); -00263 iRichText->CancelInsertCharFormat(); // "Insert pending" state cancelled -00264 iRichText->InsertL(iRichText->DocumentLength(), -00265 CEditableText::EParagraphDelimiter); // add a para delimiter at end of paragraph -00266 iFormObserver->NotifyStatus(KStatus6); -00267 break; -00268 } -00269 case 7: -00270 { -00271 // Apply a style to text added in previous case; retain all its specific formatting. -00272 TInt startPos, length; -00273 // Get any document position in the 5th paragraph. Not interested in length. -00274 startPos=iRichText->CharPosOfParagraph(length,4); -00275 iRichText->ApplyParagraphStyleL(*iStyleList->At(0).iStyle,startPos,1, -00276 CParagraphStyle::ERetainAllSpecificFormats); -00277 iFormObserver->NotifyStatus(KStatus7); -00278 break; -00279 } -00280 case 8: -00281 //reset document -00282 iRichText->Reset(); -00283 // message to say what we did -00284 iFormObserver->NotifyStatus(KStatus8); -00285 break; -00286 default: -00287 iFormObserver->NotifyStatus(KStatusDefault); -00288 break; -00289 } -00290 } -00291 -00292 void CStyleControl::Draw(const TRect& aRect) const -00293 { -00294 // draw surround -00295 CGraphicsContext& gc=SystemGc(); // context to draw into -00296 TRect rect=Rect(); // screen boundary -00297 gc.DrawRect(rect); // outline screen boundary -00298 rect.Shrink(1,1); -00299 gc.SetPenColor(KRgbWhite); -00300 gc.DrawRect(rect); -00301 rect.Shrink(1,1); -00302 gc.SetPenColor(KRgbBlack); -00303 gc.DrawRect(rect); -00304 // draw editable text - will work unless OOM -00305 TInt err; -00306 TRAP(err,iTextView->FormatTextL()); -00307 if (err) return; -00308 TRAP(err,iTextView->DrawL(aRect)); -00309 } -00310 -