diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/txtview_8cpp_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/txtview_8cpp_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,336 @@ + + +
+ +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 CViewControl::~CViewControl() +00021 { +00022 delete iTextView; // text view +00023 delete iLayout; // text layout +00024 delete iRichText; // contained text object +00025 delete iCharFormatLayer; // char format layer +00026 delete iParaFormatLayer; // para format layer +00027 delete iBitmap; // line cursor character bitmap +00028 } +00029 +00030 void CViewControl::UpdateModelL() +00031 { +00032 // Create all constant literal descriptors used in this function, +00033 // e.g. for message text +00034 +00035 _LIT(KText1, "To be, or not to be, that is the question; \ +00036 whether 'tis nobler in the mind to suffer the \ +00037 slings and arrows of outrageous fortune, or \ +00038 to stand against a sea of troubles, and by \ +00039 opposing end them."); +00040 _LIT(KText4,"Format band set. Num formatted lines=%d"); +00041 _LIT(KText5,"Format band unset. Num formatted lines=%d"); +00042 _LIT(KPathAndFile,"\\resource\\apps\\cursors.mbm"); +00043 _LIT(KCDrive,"\\"); +00044 _LIT(KZDrive,"Z:"); +00045 _LIT(KStatus0,"Initialised - with grey fill colour"); +00046 _LIT(KStatus1,"Added lots of text"); +00047 _LIT(KStatus2,"Selected first paragraph"); +00048 _LIT(KStatus3,"Formatted the selected text (and cancelled selection)"); +00049 _LIT(KStatus6,"Set 20 pixel line cursor margin and 2 cursors"); +00050 _LIT(KStatus7,"Reset the view rectangle - old wrapping still applies"); +00051 _LIT(KStatus8,"Text wrapping set to new view rectangle"); +00052 _LIT(KStatus9,"View rectangle and wrap width reset"); +00053 _LIT(KStatus10,"Horizontal scroll left"); +00054 _LIT(KStatus11,"Scrolling DOWN, blank space NOT scrolled"); +00055 _LIT(KStatus12,"Back to top and horizontal scroll right"); +00056 _LIT(KStatus13,"Reset();"); +00057 _LIT(KStatusDefault,"(overshot!!)"); +00058 +00059 switch (Phase()) +00060 { +00061 case 0: +00062 { +00063 // Preparation for following cases: +00064 TCharFormat charFormat; +00065 TCharFormatMask charFormatMask; +00066 iUpdateModelDoesRedraw=ETrue; +00067 // NextPhaseL() should call DrawNow() for the first case only +00068 // Create rich text object to be displayed in the text view +00069 iParaFormatLayer=CParaFormatLayer::NewL(); // required para format +00070 iCharFormatLayer=CCharFormatLayer::NewL(); // required char format +00071 // empty text objects +00072 iRichText=CRichText::NewL(iParaFormatLayer, iCharFormatLayer); +00073 // prerequisites for view - viewing rectangle +00074 iViewRect=Rect(); +00075 iViewRect.Shrink(3,3); +00076 // context and device +00077 CWindowGc& gc=SystemGc(); // get graphics context +00078 CBitmapDevice* device=(CBitmapDevice*) (gc.Device()); // device +00079 // Construct the layout object used by the text view, +00080 // specifying wrap width (= width of viewing rectangle) +00081 iLayout=CTextLayout::NewL(iRichText,iViewRect.Width()); +00082 // Construct text view +00083 iTextView=CTextView::NewL(iLayout, iViewRect, +00084 device, +00085 device, +00086 &Window(), +00087 &iCoeEnv->RootWin(), // window group, needed for cursor +00088 &iCoeEnv->WsSession() +00089 ); // new view +00090 // Set paragraph fill color and font height. +00091 // For visibility, set font height to 10 point. +00092 charFormatMask.SetAttrib(EAttFontHeight); +00093 // height attribute only is relevant +00094 charFormat.iFontSpec.iHeight=200; // set to 10 point (200 twips) +00095 iRichText->ApplyCharFormatL(charFormat,charFormatMask,0,0); +00096 // Apply grey paragraph fill colour +00097 CParaFormat* paraFormat=CParaFormat::NewL(); +00098 TParaFormatMask paraFormatMask; +00099 paraFormat->iFillColor=TRgb(204,204,204); // Light grey +00100 paraFormatMask.SetAttrib(EAttFillColor); +00101 // fill colour attribute only is relevant +00102 iRichText->ApplyParaFormatL(paraFormat,paraFormatMask,0,0); +00103 iTextView->FormatTextL(); +00104 iFormObserver->NotifyStatus(KStatus0); +00105 delete paraFormat; +00106 break; +00107 } +00108 case 1: +00109 { +00110 // Set some character formatting +00111 iCharFormatMask.SetAttrib(EAttFontStrokeWeight); +00112 +00113 iCharFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold); +00114 +00115 // apply formatting - pos and length are irrelevent +00116 iRichText->ApplyCharFormatL(iCharFormat,iCharFormatMask, 0,0); +00117 +00118 // insert lots of text +00119 for (TInt count=0;count<5;count++) // insert a paragraph, *5 +00120 { +00121 iRichText->InsertL(iRichText->DocumentLength(),KText1); // text +00122 iRichText->InsertL(iRichText->DocumentLength(), +00123 CEditableText::EParagraphDelimiter); // end para +00124 }; +00125 TCursorSelection selection(0, iRichText->DocumentLength()); +00126 // start and length of the inserted block +00127 iTextView->HandleInsertDeleteL(selection, 0); +00128 // zero deleted characters +00129 iFormObserver->NotifyStatus(KStatus1); +00130 break; +00131 } +00132 case 2: +00133 { +00134 // Select the first paragraph +00135 TInt pos=1; +00136 TUint scanMask=CPlainText::EScanToUnitEnd; +00137 iRichText->ScanParas(pos,scanMask); +00138 // get end position of current para +00139 // move cursor to end of para and select it +00140 iTextView->SetDocPosL(pos,ETrue); // ETrue = select the range +00141 iFormObserver->NotifyStatus(KStatus2); +00142 break; +00143 } +00144 case 3: +00145 { +00146 // Apply italics to the selected region +00147 TCursorSelection cursorSelection; +00148 TCharFormat charFormat; +00149 TCharFormatMask charFormatMask; +00150 // Set italics +00151 charFormat.iFontSpec.iFontStyle.SetPosture(EPostureItalic); +00152 charFormatMask.SetAttrib(EAttFontPosture); +00153 // font posture attribute only is relevant +00154 cursorSelection=iTextView->Selection(); // get range of selection +00155 TInt lowerPos=cursorSelection.LowerPos(); +00156 TInt length=cursorSelection.Length(); +00157 // Apply formatting to range +00158 iRichText->ApplyCharFormatL(charFormat,charFormatMask,lowerPos,length); +00159 iTextView->HandleRangeFormatChangeL(cursorSelection); // reformat from here +00160 iTextView->CancelSelectionL(); // remove selection and redraw +00161 iFormObserver->NotifyStatus(KStatus3); +00162 break; +00163 } +00164 case 4: +00165 { +00166 TBuf<80> message; +00167 // Set formatting to the band only and display the number of formatted lines. +00168 iLayout->SetAmountToFormat(CTextLayout::EFFormatBand); +00169 iTextView->HandleGlobalChangeL(); // global layout change +00170 message.Format(KText4,iLayout->NumFormattedLines()); +00171 iFormObserver->NotifyStatus(message); +00172 break; +00173 } +00174 case 5: +00175 { +00176 TBuf<80> message; +00177 // Set formatting to the whole document, then display the number of +00178 // formatted lines. +00179 iLayout->SetAmountToFormat(CTextLayout::EFFormatAllText); +00180 iTextView->HandleGlobalChangeL(); // global layout change +00181 message.Format(KText5,iLayout->NumFormattedLines()); +00182 iFormObserver->NotifyStatus(message); +00183 break; +00184 } +00185 case 6: +00186 { +00187 // Set line cursor margin and line cursor bitmap +00188 iTextView->SetMarginWidths(0,20); // zero label margin, 20 pixel line cursor margin +00189 iTextView->DrawL(iViewRect); // update the view (SetMarginWidths() doesn't redraw) +00190 // Load in bitmap to represent line cursor. +00191 iBitmap=new(ELeave) CFbsBitmap(); +00192 TBufC<40> pathandfile(KPathAndFile); +00193 TParse bitmapFileName; +00194 TBufC<2> c_drive(KCDrive); +00195 TBufC<2> z_drive(KZDrive); +00196 +00197 bitmapFileName.Set(pathandfile,&c_drive,NULL); +00198 +00199 if (iBitmap->Load(bitmapFileName.FullName())) +00200 // can't find cursor bitmap on C: drive, so try Z: +00201 { +00202 bitmapFileName.Set(pathandfile,&z_drive,NULL); +00203 iBitmap->Load(bitmapFileName.FullName()); +00204 iTextView->SetLineCursorBitmap(iBitmap); +00205 iTextView->SetCursorVisibilityL(TCursor::EFCursorVisible, +00206 TCursor::EFCursorFlashing); +00207 // both cursors now visible - flashing text cursor +00208 iFormObserver->NotifyStatus(KStatus6); +00209 } +00210 break; +00211 } +00212 case 7: +00213 { +00214 // Reset the view rectangle. +00215 // Before doing this, clear the existing one, +00216 // (the view should really be implemented as a control, in a container control, +00217 // and then the background would get cleared nicely by the container). +00218 ActivateGc(); +00219 SystemGc().Clear(iViewRect); +00220 DeactivateGc(); +00221 // Shrink the view rectangle by 40 pixels both directions +00222 iViewRect.Shrink(40,40); +00223 iTextView->SetViewRect(iViewRect); +00224 iTextView->DrawL(iViewRect); // Redraw the completely revamped view +00225 // (SetViewRect() does not do a redraw) +00226 iFormObserver->NotifyStatus(KStatus7); +00227 break; +00228 } +00229 case 8: +00230 { +00231 // Wrap text to new view rectangle. +00232 // New wrap width = new view rect width minus total margin width. +00233 // First calculate the total margin width. +00234 TInt labelMarginWidth; +00235 TInt lineCursorMarginWidth; +00236 iTextView->MarginWidths(labelMarginWidth,lineCursorMarginWidth); +00237 iLayout->SetWrapWidth(iViewRect.Width()-(labelMarginWidth+lineCursorMarginWidth)); +00238 iLayout->ForceNoWrapping(EFalse); // Ensure wrapping on +00239 iTextView->HandleGlobalChangeL(); +00240 iFormObserver->NotifyStatus(KStatus8); +00241 break; +00242 } +00243 case 9: +00244 { +00245 // Reset view rectangle back to old dimensions and set wrapping +00246 // width accordingly +00247 TInt labelMarginWidth; +00248 TInt lineCursorMarginWidth; +00249 iTextView->MarginWidths(labelMarginWidth,lineCursorMarginWidth); +00250 iViewRect.Grow(40,40); +00251 // Increase view rectangle by 40 pixels both directions +00252 iTextView->SetViewRect(iViewRect); +00253 iLayout->SetWrapWidth(iViewRect.Width()-(labelMarginWidth+lineCursorMarginWidth)); +00254 iTextView->HandleGlobalChangeL(); +00255 iFormObserver->NotifyStatus((KStatus9)); +00256 break; +00257 } +00258 case 10: +00259 // Horizontal scrolling +00260 iTextView->SetHorizontalScrollJump(40); // scroll jump is 40 pixels +00261 iTextView->ScrollDisplayL(TCursorPosition::EFLeft,CTextLayout::EFAllowScrollingBlankSpace); +00262 // scroll to the left (scrolling blank space is allowed) +00263 iFormObserver->NotifyStatus(KStatus10); +00264 break; +00265 case 11: +00266 { +00267 // Vertical scrolling +00268 iFormObserver->NotifyStatus(KStatus11); +00269 TInt pixelsScrolled; +00270 // Scroll down to the bottom of the document, +00271 do +00272 pixelsScrolled=iTextView->ScrollDisplayL(TCursorPosition::EFLineDown, +00273 CTextLayout::EFDisallowScrollingBlankSpace); +00274 while (pixelsScrolled); +00275 break; +00276 } +00277 case 12: +00278 { +00279 // Horizontal scroll back to left margin and to top of doc +00280 iFormObserver->NotifyStatus(KStatus12); +00281 TInt pixelsScrolled; +00282 do +00283 pixelsScrolled=iTextView->ScrollDisplayL(TCursorPosition::EFLineUp); +00284 while (pixelsScrolled); +00285 iTextView->ScrollDisplayL(TCursorPosition::EFRight); +00286 // scroll right (horizontal scroll jump value=40 pixels) +00287 break; +00288 } +00289 case 13: +00290 { +00291 // Reset document. +00292 iRichText->Reset(); // change whole document! +00293 iTextView->FormatTextL(); // so format the whole lot +00294 iTextView->DrawL(iViewRect); // and draw it afresh +00295 iFormObserver->NotifyStatus(KStatus13); +00296 break; +00297 } +00298 default: +00299 iFormObserver->NotifyStatus(KStatusDefault); +00300 break; +00301 } +00302 } +00303 +00304 void CViewControl::Draw(const TRect& aRect) const +00305 { +00306 // draw surround +00307 CGraphicsContext& gc=SystemGc(); // context to draw into +00308 TRect rect=Rect(); // screen boundary +00309 gc.DrawRect(rect); // outline screen boundary +00310 rect.Shrink(1,1); +00311 gc.SetPenColor(KRgbWhite); +00312 gc.DrawRect(rect); +00313 rect.Shrink(1,1); +00314 gc.SetPenColor(KRgbBlack); +00315 gc.DrawRect(rect); +00316 // draw editable text - will work unless OOM +00317 TInt err; +00318 TRAP(err,iTextView->DrawL(aRect)); +00319 } +00320 +