proper timeout handling for input subsys
[picodrive.git] / platform / uiq3 / Dialogs.cpp
CommitLineData
cc68a136 1/*******************************************************************\r
2 *\r
3 * File: Dialogs.cpp\r
4 *\r
5 * Author: Peter van Sebille (peter@yipton.net)\r
6 *\r
7 * Modified/adapted for picodriveN by notaz, 2006\r
8 *\r
9 * (c) Copyright 2006, notaz\r
10 * (c) Copyright 2002, Peter van Sebille\r
11 * All Rights Reserved\r
12 *\r
13 *******************************************************************/\r
14\r
15#include "Dialogs.h"\r
16#include "Engine.h"\r
17#include "picodrive.hrh"\r
146cd4bf 18#include "rsc/picodrive.rsg"\r
cc68a136 19\r
20#include "version.h"\r
21#include "CSimpleTextParser.h"\r
22#include <txtrich.h> // CRichText\r
23#include <eikrted.h> // CEikRichTextEditor\r
24#include <qikvertoptionbuttonlist.h> // CEikHorOptionButtonList\r
25#include <eikopbut.h> // CEikOptionButton\r
26#include <eikedwin.h> // CEikEdwin\r
ca482e5d 27#include <quartzkeys.h> // EQuartzKeyTwoWayDown\r
cc68a136 28\r
ca482e5d 29#include <qikcommand.h>\r
30#include "../common/emu.h"\r
cc68a136 31\r
32\r
33/************************************************\r
34 *\r
35 * config Dialog\r
36 *\r
37 ************************************************/\r
38\r
ca482e5d 39CPicoConfigDialog::CPicoConfigDialog(_currentConfig_t &cfg) : config(cfg)\r
cc68a136 40{\r
41}\r
42\r
43void CPicoConfigDialog::PostLayoutDynInitL()\r
44{\r
45 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
46 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
47 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );\r
ca482e5d 48// CEikCheckBox *chkbox_acctmng= (CEikCheckBox*) Control( ECtlOptUseAccTiming );\r
cc68a136 49 CEikCheckBox *chkbox_sram = (CEikCheckBox*) Control( ECtlOptUseSRAM );\r
50 CEikCheckBox *chkbox_fps = (CEikCheckBox*) Control( ECtlOptShowFPS );\r
51 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );\r
52 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );\r
53 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );\r
54 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );\r
55 CEikChoiceListBase *combo_sndq = (CEikChoiceListBase*) Control( ECtlOptSndQuality );\r
56 CEikCheckBox *chkbox_6bpad = (CEikCheckBox*) Control( ECtlOpt6ButtonPad );\r
57 CEikCheckBox *chkbox_gzipst = (CEikCheckBox*) Control( ECtlOptGzipStates );\r
ca482e5d 58// CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );\r
cc68a136 59 CEikChoiceListBase *combo_region = (CEikChoiceListBase*) Control( ECtlOptRegion );\r
60 CEikOptionButton *opt_fit2 = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit2 );\r
ca482e5d 61 CEikCheckBox *chkbox_cdda = (CEikCheckBox*) Control( ECtlOptCDcdda );\r
62 CEikCheckBox *chkbox_pcm = (CEikCheckBox*) Control( ECtlOptCDpcm );\r
63 CEikCheckBox *chkbox_ramcart= (CEikCheckBox*) Control( ECtlOptCDramcart );\r
64 CEikCheckBox *chkbox_sclrot = (CEikCheckBox*) Control( ECtlOptCDscalerot );\r
65 CEikCheckBox *chkbox_bsync = (CEikCheckBox*) Control( ECtlOptCDbettersync );\r
cc68a136 66\r
ca482e5d 67 buttons_rot ->SetButtonById(ECtlOptRotation0 + config.rotation);\r
68 buttons_disp->SetButtonById(ECtlOptScreenModeCenter + config.scaling);\r
69 chkbox_sram ->SetState(config.EmuOpt & 1 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
70 chkbox_fps ->SetState(config.EmuOpt & 2 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
71 chkbox_sound ->SetState(config.EmuOpt & 4 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
72 chkbox_gzipst ->SetState(config.EmuOpt & 8 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
73 chkbox_z80 ->SetState(config.s_PicoOpt& 4 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
74 chkbox_ym2612 ->SetState(config.s_PicoOpt& 1 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
75 chkbox_sn76496->SetState(config.s_PicoOpt& 2 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
76 chkbox_altrend->SetState(config.s_PicoOpt& 0x10? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
77 chkbox_6bpad ->SetState(config.s_PicoOpt& 0x20? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
78// chkbox_acctmng->SetState(config.s_PicoOpt& 0x40? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
79// chkbox_accsprt->SetState(config.s_PicoOpt& 0x80? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
80 chkbox_cdda ->SetState(config.s_PicoOpt&0x0800?CEikButtonBase::ESet : CEikButtonBase::EClear);\r
81 chkbox_pcm ->SetState(config.s_PicoOpt&0x0400?CEikButtonBase::ESet : CEikButtonBase::EClear);\r
82 chkbox_ramcart->SetState(config.s_PicoOpt&0x8000?CEikButtonBase::ESet : CEikButtonBase::EClear);\r
83 chkbox_sclrot ->SetState(config.s_PicoOpt&0x1000?CEikButtonBase::ESet : CEikButtonBase::EClear);\r
84 chkbox_bsync ->SetState(config.s_PicoOpt&0x2000?CEikButtonBase::ESet : CEikButtonBase::EClear);\r
cc68a136 85\r
86 // dim "fit2" if we are not in 0 or 180 mode\r
ca482e5d 87 if (config.rotation != TPicoConfig::PRot0 && config.rotation != TPicoConfig::PRot180)\r
88 opt_fit2->SetDimmed(ETrue);\r
cc68a136 89 // dim some stuff for alternative renderer\r
ca482e5d 90 if (config.s_PicoOpt & 0x10) {\r
cc68a136 91 // dim accurate sprites\r
ca482e5d 92 //chkbox_accsprt->SetState(CEikButtonBase::EClear);\r
93 //chkbox_accsprt->SetDimmed(ETrue);\r
cc68a136 94 // dim fit\r
95 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180)\r
96 ((CEikOptionButton*)(buttons_disp->ComponentControl(TPicoConfig::PMFit)))->SetDimmed(ETrue);\r
97 }\r
98\r
ca482e5d 99 TInt sel = 0;\r
100 switch (config.s_PsndRate) {\r
101 case 11025: sel = 1; break;\r
102 case 16000: sel = 2; break;\r
103 case 22050: sel = 3; break;\r
104 case 44100: sel = 4; break;\r
105 }\r
106 sel += (config.s_PicoOpt&8) ? 5 : 0;\r
cc68a136 107 if (sel >= 10) sel = 0;\r
108 combo_sndq->SetCurrentItem(sel);\r
ca482e5d 109\r
110 switch(config.s_PicoRegion) {\r
cc68a136 111 case 1: sel = 4; break;\r
112 case 2: sel = 3; break;\r
113 case 4: sel = 2; break;\r
114 case 8: sel = 1; break;\r
115 default:sel = 0; // auto\r
116 }\r
117 combo_region->SetCurrentItem(sel);\r
118}\r
119\r
120TBool CPicoConfigDialog::OkToExitL(TInt aButtonId)\r
121{\r
122 if(aButtonId != EEikBidOk) return ETrue;\r
123\r
124 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
125 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
126 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );\r
ca482e5d 127// CEikCheckBox *chkbox_acctmng= (CEikCheckBox*) Control( ECtlOptUseAccTiming );\r
cc68a136 128 CEikCheckBox *chkbox_sram = (CEikCheckBox*) Control( ECtlOptUseSRAM );\r
129 CEikCheckBox *chkbox_fps = (CEikCheckBox*) Control( ECtlOptShowFPS );\r
130 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );\r
131 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );\r
132 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );\r
133 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );\r
134 CEikChoiceListBase *combo_sndq = (CEikChoiceListBase*) Control( ECtlOptSndQuality );\r
135 CEikCheckBox *chkbox_6bpad = (CEikCheckBox*) Control( ECtlOpt6ButtonPad );\r
136 CEikCheckBox *chkbox_gzipst = (CEikCheckBox*) Control( ECtlOptGzipStates );\r
ca482e5d 137// CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );\r
cc68a136 138 CEikChoiceListBase *combo_region = (CEikChoiceListBase*) Control( ECtlOptRegion );\r
ca482e5d 139 CEikCheckBox *chkbox_cdda = (CEikCheckBox*) Control( ECtlOptCDcdda );\r
140 CEikCheckBox *chkbox_pcm = (CEikCheckBox*) Control( ECtlOptCDpcm );\r
141 CEikCheckBox *chkbox_ramcart= (CEikCheckBox*) Control( ECtlOptCDramcart );\r
142 CEikCheckBox *chkbox_sclrot = (CEikCheckBox*) Control( ECtlOptCDscalerot );\r
143 CEikCheckBox *chkbox_bsync = (CEikCheckBox*) Control( ECtlOptCDbettersync );\r
144\r
145 config.rotation = (TPicoConfig::TPicoScreenRotation) (buttons_rot->LabeledButtonId() - ECtlOptRotation0);\r
146 config.scaling = (TPicoConfig::TPicoScreenMode) (buttons_disp->LabeledButtonId() - ECtlOptScreenModeCenter);\r
cc68a136 147\r
ca482e5d 148 if(chkbox_sram ->State() == CEikButtonBase::ESet) config.EmuOpt |= 1; else config.EmuOpt &= ~1;\r
149 if(chkbox_fps ->State() == CEikButtonBase::ESet) config.EmuOpt |= 2; else config.EmuOpt &= ~2;\r
150 if(chkbox_sound ->State() == CEikButtonBase::ESet) config.EmuOpt |= 4; else config.EmuOpt &= ~4;\r
151 if(chkbox_gzipst ->State() == CEikButtonBase::ESet) config.EmuOpt |= 8; else config.EmuOpt &= ~8;\r
152 if(chkbox_z80 ->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 4; else config.s_PicoOpt&= ~4;\r
153 if(chkbox_ym2612 ->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 1; else config.s_PicoOpt&= ~1;\r
154 if(chkbox_sn76496->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 2; else config.s_PicoOpt&= ~2;\r
155 if(chkbox_altrend->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 0x10;else config.s_PicoOpt&= ~0x10;\r
156 if(chkbox_6bpad ->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 0x20;else config.s_PicoOpt&= ~0x20;\r
157// if(chkbox_acctmng->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 0x40;else config.s_PicoOpt&= ~0x40;\r
158// if(chkbox_accsprt->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 0x80;else config.s_PicoOpt&= ~0x80;\r
159 if(chkbox_cdda ->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x0800; else config.s_PicoOpt&= ~0x0800;\r
160 if(chkbox_pcm ->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x0400; else config.s_PicoOpt&= ~0x0400;\r
161 if(chkbox_ramcart->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x8000; else config.s_PicoOpt&= ~0x8000;\r
162 if(chkbox_sclrot ->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x1000; else config.s_PicoOpt&= ~0x1000;\r
163 if(chkbox_bsync ->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x2000; else config.s_PicoOpt&= ~0x2000;\r
cc68a136 164\r
165 TInt sel = combo_sndq->CurrentItem();\r
ca482e5d 166 if(sel >= 5) { config.s_PicoOpt |= 8; sel-=5; } else config.s_PicoOpt &= ~8;\r
167 switch (sel) {\r
168 default:config.s_PsndRate = 8000; break;\r
169 case 1: config.s_PsndRate = 11025; break;\r
170 case 2: config.s_PsndRate = 16000; break;\r
171 case 3: config.s_PsndRate = 22050; break;\r
172 case 4: config.s_PsndRate = 44100; break;\r
173 }\r
174\r
175 switch (combo_region->CurrentItem()) {\r
176 case 4: config.s_PicoRegion = 1; break;\r
177 case 3: config.s_PicoRegion = 2; break;\r
178 case 2: config.s_PicoRegion = 4; break;\r
179 case 1: config.s_PicoRegion = 8; break;\r
180 default:config.s_PicoRegion = 0; // auto\r
cc68a136 181 }\r
182\r
183 return ETrue;\r
184}\r
185\r
186// simple GUI stuff needs lots of code\r
187void CPicoConfigDialog::HandleControlStateChangeL(TInt aControlId)\r
188{\r
ca482e5d 189 if (aControlId == ECtlOptEnableSound)\r
190 {\r
cc68a136 191 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );\r
192 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );\r
193 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );\r
194 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );\r
195\r
196 if(chkbox_sound->State() == CEikButtonBase::ESet) {\r
197 // check all sound chips too, but only if they all are not set\r
198 if((chkbox_z80->State() | chkbox_ym2612->State() | chkbox_sn76496->State()) == CEikButtonBase::EClear) { // (==0)\r
199 chkbox_z80 ->SetState(CEikButtonBase::ESet);\r
200 chkbox_ym2612 ->SetState(CEikButtonBase::ESet);\r
201 chkbox_sn76496->SetState(CEikButtonBase::ESet);\r
202 chkbox_z80 ->DrawDeferred();\r
203 chkbox_ym2612 ->DrawDeferred();\r
204 chkbox_sn76496->DrawDeferred();\r
205 }\r
206 } else {\r
207 // clear everything, but only if everything is set\r
208 if((chkbox_z80->State() & chkbox_ym2612->State() & chkbox_sn76496->State()) == CEikButtonBase::ESet) { // (==1)\r
209 chkbox_z80 ->SetState(CEikButtonBase::EClear);\r
210 chkbox_ym2612 ->SetState(CEikButtonBase::EClear);\r
211 chkbox_sn76496->SetState(CEikButtonBase::EClear);\r
212 chkbox_z80 ->DrawDeferred();\r
213 chkbox_ym2612 ->DrawDeferred();\r
214 chkbox_sn76496->DrawDeferred();\r
215 }\r
216 }\r
ca482e5d 217 }\r
218 else if(aControlId == ECtlOptUseAltRend || aControlId == ECtlOptRotation)\r
219 {\r
cc68a136 220 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );\r
ca482e5d 221// CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );\r
cc68a136 222 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
223 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
224 CEikOptionButton *opt_fit = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit );\r
225 CEikOptionButton *opt_fit2 = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit2 );\r
226\r
227 TBool dimmed = chkbox_altrend->State() == CEikButtonBase::ESet;\r
228 // show/hide more stuff for alternative renderer\r
ca482e5d 229// chkbox_accsprt->SetDimmed(dimmed);\r
cc68a136 230 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180) {\r
231 opt_fit->SetDimmed(dimmed);\r
232 if(dimmed && buttons_disp->LabeledButtonId() == ECtlOptScreenModeFit)\r
233 buttons_disp->SetButtonById(ECtlOptScreenModeFit2);\r
234 }\r
235 else opt_fit->SetDimmed(EFalse);\r
ca482e5d 236// chkbox_accsprt->DrawDeferred();\r
cc68a136 237 buttons_disp->DrawDeferred();\r
238\r
239 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180) {\r
240 opt_fit2->SetDimmed(EFalse);\r
241 } else {\r
242 if(opt_fit2->State() == CEikButtonBase::ESet) {\r
243 buttons_disp->SetButtonById(ECtlOptScreenModeFit);\r
244 buttons_disp->DrawDeferred();\r
245 }\r
246 opt_fit2->SetDimmed(ETrue);\r
247 }\r
248 opt_fit2->DrawDeferred();\r
249 }\r
250}\r
251\r
252\r
253/************************************************\r
254 *\r
255 * About Dialog\r
256 *\r
257 ************************************************/\r
258\r
259void CAboutDialog::PostLayoutDynInitL()\r
260{\r
261 TBuf<16> versionText;\r
262 TBuf<512> text;\r
263\r
264 #if (KPicoBuildNumber != 0)\r
265 versionText.Format(_L("%d.%d%d"), KPicoMajorVersionNumber, KPicoMinorVersionNumber, KPicoBuildNumber);\r
266 #else\r
267 versionText.Format(_L("%d.%d"), KPicoMajorVersionNumber, KPicoMinorVersionNumber);\r
268 #endif\r
269\r
270 CEikRichTextEditor* richTextEd = LocateControlByUniqueHandle<CEikRichTextEditor>(ECtlPicoAboutText);\r
271 User::LeaveIfNull(richTextEd);\r
272\r
273 HBufC *aboutFormat = CEikonEnv::Static()->AllocReadResourceLC(R_PICO_TEXT_ABOUT);\r
274 CSimpleTextFormatParser *parser = CSimpleTextFormatParser::NewLC();\r
275\r
276 text.Format(*aboutFormat, &versionText);\r
277 parser->ParseL(text, *richTextEd->RichText());\r
278\r
279 richTextEd->UpdateAllFieldsL(); // Updates all the fields in the document\r
280\r
281 CleanupStack::PopAndDestroy(parser);\r
282 CleanupStack::PopAndDestroy(aboutFormat);\r
283}\r
284\r
285/*************************************************************\r
286*\r
287* Credits dialog\r
288*\r
289**************************************************************/\r
290\r
291void CCreditsDialog::PreLayoutDynInitL()\r
292{\r
293 CEikEdwin *edwin = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
294 User::LeaveIfNull(edwin);\r
295\r
296 CDesCArrayFlat* desArray = CEikonEnv::Static()->ReadDesCArrayResourceL(R_PICO_TBUF_CREDITS);\r
297 CleanupStack::PushL(desArray);\r
298\r
299 edwin->SetTextLimit(2048); // to prevent stupid "too big" warning\r
300 TInt count = desArray->Count();\r
301 for (TInt i = 0; i < count; i++)\r
302 {\r
303 edwin->Text()->InsertL(edwin->TextLength(), desArray->operator[](i));\r
304 edwin->Text()->InsertL(edwin->TextLength(), CEditableText::ELineBreak);\r
305 }\r
306 CleanupStack::PopAndDestroy(desArray);\r
307}\r
308\r
309TKeyResponse CCreditsDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)\r
310{\r
311 if (aType == EEventKey)\r
312 {\r
313 CEikEdwin *edwin = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
314 User::LeaveIfNull(edwin);\r
315\r
316 if (aKeyEvent.iCode == EQuartzKeyTwoWayDown)\r
317 {\r
318 edwin->MoveDisplayL(TCursorPosition::EFLineDown);\r
319 edwin->UpdateScrollBarsL();\r
320 return EKeyWasConsumed;\r
321 }\r
322 else if (aKeyEvent.iCode == EQuartzKeyTwoWayUp)\r
323 {\r
324 edwin->MoveDisplayL(TCursorPosition::EFLineUp);\r
325 edwin->UpdateScrollBarsL();\r
326 return EKeyWasConsumed;\r
327 }\r
328 }\r
329 return CQikSimpleDialog::OfferKeyEventL(aKeyEvent, aType);\r
330}\r
331\r
332/*************************************************************\r
333*\r
334* Debug dialog\r
335*\r
336**************************************************************/\r
337\r
338CDebugDialog::CDebugDialog(char *t)\r
339{\r
340 Mem::Copy(iText, t, 1024);\r
341 iText[1023] = 0;\r
342}\r
343\r
344void CDebugDialog::PreLayoutDynInitL()\r
345{\r
346 char *p = iText, *line = iText;\r
347 TBool end=0;\r
348 TBuf<128> tbuf;\r
349 CEikEdwin *editor = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
350\r
351 while(!end) {\r
352 while(*p && *p != '\r' && *p != '\n') p++;\r
353 if(!*p) end=1;\r
354 *p = 0;\r
355 TPtrC8 ptr((TUint8*) line);\r
356 tbuf.Copy(ptr);\r
357 editor->Text()->InsertL(editor->TextLength(), tbuf);\r
358 editor->Text()->InsertL(editor->TextLength(), CEditableText::ELineBreak);\r
359 line = ++p;\r
360 }\r
361}\r