1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #include "../../include/pdfwindow/PDFWindow.h"
8 #include "../../include/pdfwindow/PWL_Wnd.h"
9 #include "../../include/pdfwindow/PWL_EditCtrl.h"
10 #include "../../include/pdfwindow/PWL_ScrollBar.h"
11 #include "../../include/pdfwindow/PWL_Utils.h"
12 #include "../../include/pdfwindow/PWL_Caret.h"
13 #include "../../include/pdfwindow/PWL_FontMap.h"
14 
15 #define IsFloatZero(f)						((f) < 0.0001 && (f) > -0.0001)
16 #define IsFloatBigger(fa,fb)				((fa) > (fb) && !IsFloatZero((fa) - (fb)))
17 #define IsFloatSmaller(fa,fb)				((fa) < (fb) && !IsFloatZero((fa) - (fb)))
18 #define IsFloatEqual(fa,fb)					IsFloatZero((fa)-(fb))
19 
20 /* ---------------------------- CPWL_EditCtrl ------------------------------ */
21 
CPWL_EditCtrl()22 CPWL_EditCtrl::CPWL_EditCtrl() :
23 	m_pEdit(NULL),
24 	m_pEditCaret(NULL),
25 	m_bMouseDown(FALSE),
26 	m_pEditNotify(NULL),
27 	m_nCharSet(DEFAULT_CHARSET),
28 	m_nCodePage(0)
29 {
30 	m_pEdit = IFX_Edit::NewEdit();
31 	ASSERT(m_pEdit != NULL);
32 }
33 
~CPWL_EditCtrl()34 CPWL_EditCtrl::~CPWL_EditCtrl()
35 {
36 	IFX_Edit::DelEdit(m_pEdit);
37 }
38 
OnCreate(PWL_CREATEPARAM & cp)39 void CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM & cp)
40 {
41 	cp.eCursorType = FXCT_VBEAM;
42 }
43 
OnCreated()44 void CPWL_EditCtrl::OnCreated()
45 {
46 	SetFontSize(this->GetCreationParam().fFontSize);
47 
48 	m_pEdit->SetFontMap(this->GetFontMap());
49 	m_pEdit->SetNotify(this);
50 	m_pEdit->Initialize();
51 }
52 
IsWndHorV()53 FX_BOOL CPWL_EditCtrl::IsWndHorV()
54 {
55 	CPDF_Matrix mt = GetWindowMatrix();
56 	CPDF_Point point1(0,1);
57 	CPDF_Point point2(1,1);
58 
59 	mt.Transform(point1.x, point1.y);
60 	mt.Transform(point2.x, point2.y);
61 
62 	return point2.y == point1.y;
63 }
64 
SetCursor()65 void CPWL_EditCtrl::SetCursor()
66 {
67 	if (IsValid())
68 	{
69 		if (IFX_SystemHandler* pSH = GetSystemHandler())
70 		{
71 			if (IsWndHorV())
72 				pSH->SetCursor(FXCT_VBEAM);
73 			else
74 				pSH->SetCursor(FXCT_HBEAM);
75 		}
76 	}
77 }
78 
RePosChildWnd()79 void CPWL_EditCtrl::RePosChildWnd()
80 {
81 	m_pEdit->SetPlateRect(GetClientRect());
82 }
83 
OnNotify(CPWL_Wnd * pWnd,FX_DWORD msg,FX_INTPTR wParam,FX_INTPTR lParam)84 void CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
85 {
86 	CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
87 
88 	switch (msg)
89 	{
90 		case PNM_SETSCROLLINFO:
91 			switch (wParam)
92 			{
93 				case SBT_VSCROLL:
94 					if (CPWL_Wnd * pChild = GetVScrollBar())
95 					{
96 						pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
97 					}
98 					break;
99 			}
100 			break;
101 		case PNM_SETSCROLLPOS:
102 			switch (wParam)
103 			{
104 				case SBT_VSCROLL:
105 					if (CPWL_Wnd * pChild = GetVScrollBar())
106 					{
107 						pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
108 					}
109 					break;
110 			}
111 			break;
112 		case PNM_SCROLLWINDOW:
113 			{
114 				FX_FLOAT fPos = *(FX_FLOAT*)lParam;
115 				switch (wParam)
116 				{
117 					case SBT_VSCROLL:
118 						m_pEdit->SetScrollPos(CPDF_Point(m_pEdit->GetScrollPos().x,fPos));
119 						break;
120 				}
121 			}
122 			break;
123 		case PNM_SETCARETINFO:
124 			{
125 				if (PWL_CARET_INFO * pCaretInfo = (PWL_CARET_INFO *)wParam)
126 				{
127 					this->SetCaret(pCaretInfo->bVisible,
128 						pCaretInfo->ptHead,
129 						pCaretInfo->ptFoot);
130 				}
131 			}
132 			break;
133 	}
134 }
135 
CreateChildWnd(const PWL_CREATEPARAM & cp)136 void CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM & cp)
137 {
138 	if (!IsReadOnly())
139 		CreateEditCaret(cp);
140 }
141 
CreateEditCaret(const PWL_CREATEPARAM & cp)142 void CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM & cp)
143 {
144 	if (!m_pEditCaret)
145 	{
146 		m_pEditCaret = new CPWL_Caret;
147 		m_pEditCaret->SetInvalidRect(GetClientRect());
148 
149 		PWL_CREATEPARAM	ecp = cp;
150 		ecp.pParentWnd = this;
151 		ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP;
152 		ecp.dwBorderWidth = 0;
153 		ecp.nBorderStyle = PBS_SOLID;
154 		ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
155 
156 		m_pEditCaret->Create(ecp);
157 	}
158 }
159 
SetFontSize(FX_FLOAT fFontSize)160 void CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize)
161 {
162 	m_pEdit->SetFontSize(fFontSize);
163 }
164 
GetFontSize() const165 FX_FLOAT CPWL_EditCtrl::GetFontSize() const
166 {
167 	return m_pEdit->GetFontSize();
168 }
169 
OnKeyDown(FX_WORD nChar,FX_DWORD nFlag)170 FX_BOOL CPWL_EditCtrl::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
171 {
172 	if (m_bMouseDown) return TRUE;
173 
174 	FX_BOOL bRet = CPWL_Wnd::OnKeyDown(nChar,nFlag);
175 
176 	//FILTER
177 	switch (nChar)
178 	{
179 	default:
180 		return FALSE;
181 	case FWL_VKEY_Delete:
182 	case FWL_VKEY_Up:
183 	case FWL_VKEY_Down:
184 	case FWL_VKEY_Left:
185 	case FWL_VKEY_Right:
186 	case FWL_VKEY_Home:
187 	case FWL_VKEY_End:
188 	case FWL_VKEY_Insert:
189 	case 'C':
190 	case 'V':
191 	case 'X':
192 	case 'A':
193 	case 'Z':
194 	case 'c':
195 	case 'v':
196 	case 'x':
197 	case 'a':
198 	case 'z':
199 		break;
200 	}
201 
202 	if (nChar == FWL_VKEY_Delete)
203 	{
204 		if (m_pEdit->IsSelected())
205 			nChar = FWL_VKEY_Unknown;
206 	}
207 
208 	switch (nChar)
209 	{
210 		case FWL_VKEY_Delete:
211 			Delete();
212 			return TRUE;
213 		case FWL_VKEY_Insert:
214 			if (IsSHIFTpressed(nFlag))
215 				PasteText();
216 			return TRUE;
217 		case FWL_VKEY_Up:
218 			m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag),FALSE);
219 			return TRUE;
220 		case FWL_VKEY_Down:
221 			m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag),FALSE);
222 			return TRUE;
223 		case FWL_VKEY_Left:
224 			m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag),FALSE);
225 			return TRUE;
226 		case FWL_VKEY_Right:
227 			m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag),FALSE);
228 			return TRUE;
229 		case FWL_VKEY_Home:
230 			m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
231 			return TRUE;
232 		case FWL_VKEY_End:
233 			m_pEdit->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
234 			return TRUE;
235 		case FWL_VKEY_Unknown:
236 			if (!IsSHIFTpressed(nFlag))
237 				Clear();
238 			else
239 				CutText();
240 			return TRUE;
241 		default:
242 			break;
243 	}
244 
245 	return bRet;
246 }
247 
OnChar(FX_WORD nChar,FX_DWORD nFlag)248 FX_BOOL CPWL_EditCtrl::OnChar(FX_WORD nChar, FX_DWORD nFlag)
249 {
250 	if (m_bMouseDown) return TRUE;
251 
252 	CPWL_Wnd::OnChar(nChar,nFlag);
253 
254 	//FILTER
255 	switch (nChar)
256 	{
257 		case 0x0A:
258 		case 0x1B:
259 			return FALSE;
260 		default:
261 			break;
262 	}
263 
264 	FX_BOOL bCtrl = IsCTRLpressed(nFlag);
265 	FX_BOOL bAlt = IsALTpressed(nFlag);
266 	FX_BOOL bShift = IsSHIFTpressed(nFlag);
267 
268 	FX_WORD word = nChar;
269 
270 	if (bCtrl && !bAlt)
271 	{
272 		switch (nChar)
273 		{
274 			case 'C' - 'A' + 1:
275 				this->CopyText();
276 				return TRUE;
277 			case 'V' - 'A' + 1:
278 				this->PasteText();
279 				return TRUE;
280 			case 'X' - 'A' + 1:
281 				this->CutText();
282 				return TRUE;
283 			case 'A' - 'A' + 1:
284 				this->SelectAll();
285 				return TRUE;
286 			case 'Z' - 'A' + 1:
287 				if (bShift)
288 					Redo();
289 				else
290 					Undo();
291 				return TRUE;
292 			default:
293 				if (nChar < 32)
294 					return FALSE;
295 		}
296 	}
297 
298 	if (IsReadOnly()) return TRUE;
299 
300 	if (m_pEdit->IsSelected() && word ==  FWL_VKEY_Back)
301 		word = FWL_VKEY_Unknown;
302 
303 	Clear();
304 
305 	switch (word)
306 	{
307 	case FWL_VKEY_Back:
308 		Backspace();
309 		break;
310 	case FWL_VKEY_Return:
311 		InsertReturn();
312 		break;
313 	case FWL_VKEY_Unknown:
314 		break;
315 	default:
316 		if (IsINSERTpressed(nFlag))
317 			Delete();
318 		InsertWord(word, this->GetCharSet());
319 		break;
320 	}
321 
322 	return TRUE;
323 }
324 
OnLButtonDown(const CPDF_Point & point,FX_DWORD nFlag)325 FX_BOOL CPWL_EditCtrl::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
326 {
327 	CPWL_Wnd::OnLButtonDown(point,nFlag);
328 
329 	if (ClientHitTest(point))
330 	{
331 		if (m_bMouseDown)
332 			this->InvalidateRect();
333 
334 		m_bMouseDown = TRUE;
335 		SetCapture();
336 
337 		m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
338 	}
339 
340 	return TRUE;
341 }
342 
OnLButtonUp(const CPDF_Point & point,FX_DWORD nFlag)343 FX_BOOL CPWL_EditCtrl::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
344 {
345 	CPWL_Wnd::OnLButtonUp(point,nFlag);
346 
347 	if (m_bMouseDown)
348 	{
349 		//can receive keybord message
350 		if (ClientHitTest(point) && !this->IsFocused())
351 			SetFocus();
352 
353 		ReleaseCapture();
354 		m_bMouseDown = FALSE;
355 	}
356 
357 	return TRUE;
358 }
359 
OnMouseMove(const CPDF_Point & point,FX_DWORD nFlag)360 FX_BOOL CPWL_EditCtrl::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
361 {
362 	CPWL_Wnd::OnMouseMove(point,nFlag);
363 
364 	if (m_bMouseDown)
365 		m_pEdit->OnMouseMove(point,FALSE,FALSE);
366 
367 	return TRUE;
368 }
369 
GetContentRect() const370 CPDF_Rect CPWL_EditCtrl::GetContentRect() const
371 {
372 	return m_pEdit->GetContentRect();
373 }
374 
SetEditCaret(FX_BOOL bVisible)375 void CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible)
376 {
377 	CPDF_Point ptHead(0,0),ptFoot(0,0);
378 
379 	if (bVisible)
380 	{
381 		GetCaretInfo(ptHead,ptFoot);
382 	}
383 
384 	CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();
385 	this->IOnSetCaret(bVisible,ptHead,ptFoot,wpTemp);
386 }
387 
GetCaretInfo(CPDF_Point & ptHead,CPDF_Point & ptFoot) const388 void CPWL_EditCtrl::GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const
389 {
390 	if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
391 	{
392 		pIterator->SetAt(m_pEdit->GetCaret());
393 		CPVT_Word word;
394 		CPVT_Line line;
395 		if (pIterator->GetWord(word))
396 		{
397 			ptHead.x = word.ptWord.x + word.fWidth;
398 			ptHead.y = word.ptWord.y + word.fAscent;
399 			ptFoot.x = word.ptWord.x + word.fWidth;
400 			ptFoot.y = word.ptWord.y + word.fDescent;
401 		}
402 		else if (pIterator->GetLine(line))
403 		{
404 			ptHead.x = line.ptLine.x;
405 			ptHead.y = line.ptLine.y + line.fLineAscent;
406 			ptFoot.x = line.ptLine.x;
407 			ptFoot.y = line.ptLine.y + line.fLineDescent;
408 		}
409 	}
410 }
411 
GetCaretPos(FX_INT32 & x,FX_INT32 & y) const412 void CPWL_EditCtrl::GetCaretPos(FX_INT32& x, FX_INT32& y) const
413 {
414 	CPDF_Point ptHead(0,0), ptFoot(0,0);
415 
416 	GetCaretInfo(ptHead,ptFoot);
417 
418 	PWLtoWnd(ptHead, x, y);
419 }
420 
SetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot)421 void CPWL_EditCtrl::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)
422 {
423 	if (m_pEditCaret)
424 	{
425 		if (!IsFocused() || m_pEdit->IsSelected())
426 			bVisible = FALSE;
427 
428 		m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
429 	}
430 }
431 
IsModified() const432 FX_BOOL	CPWL_EditCtrl::IsModified() const
433 {
434 	return m_pEdit->IsModified();
435 }
436 
GetText() const437 CFX_WideString CPWL_EditCtrl::GetText() const
438 {
439 	return m_pEdit->GetText();
440 }
441 
SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)442 void CPWL_EditCtrl::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
443 {
444 	m_pEdit->SetSel(nStartChar, nEndChar);
445 }
446 
GetSel(FX_INT32 & nStartChar,FX_INT32 & nEndChar) const447 void CPWL_EditCtrl::GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const
448 {
449 	m_pEdit->GetSel(nStartChar, nEndChar);
450 }
451 
Clear()452 void CPWL_EditCtrl::Clear()
453 {
454 	if (!IsReadOnly())
455 		m_pEdit->Clear();
456 }
457 
SelectAll()458 void CPWL_EditCtrl::SelectAll()
459 {
460 	m_pEdit->SelectAll();
461 }
462 
Paint()463 void CPWL_EditCtrl::Paint()
464 {
465 	if (m_pEdit)
466 		m_pEdit->Paint();
467 }
468 
EnableRefresh(FX_BOOL bRefresh)469 void CPWL_EditCtrl::EnableRefresh(FX_BOOL bRefresh)
470 {
471 	if (m_pEdit)
472 		m_pEdit->EnableRefresh(bRefresh);
473 }
474 
GetCaret() const475 FX_INT32 CPWL_EditCtrl::GetCaret() const
476 {
477 	if (m_pEdit)
478 		return m_pEdit->GetCaret();
479 
480 	return -1;
481 }
482 
SetCaret(FX_INT32 nPos)483 void CPWL_EditCtrl::SetCaret(FX_INT32 nPos)
484 {
485 	if (m_pEdit)
486 		m_pEdit->SetCaret(nPos);
487 }
488 
GetTotalWords() const489 FX_INT32 CPWL_EditCtrl::GetTotalWords() const
490 {
491 	if (m_pEdit)
492 		return m_pEdit->GetTotalWords();
493 
494 	return 0;
495 }
496 
SetScrollPos(const CPDF_Point & point)497 void CPWL_EditCtrl::SetScrollPos(const CPDF_Point& point)
498 {
499 	if (m_pEdit)
500 		m_pEdit->SetScrollPos(point);
501 }
502 
GetScrollPos() const503 CPDF_Point CPWL_EditCtrl::GetScrollPos() const
504 {
505 	if (m_pEdit)
506 		return m_pEdit->GetScrollPos();
507 
508 	return CPDF_Point(0.0f, 0.0f);
509 }
510 
GetCaretFont() const511 CPDF_Font * CPWL_EditCtrl::GetCaretFont() const
512 {
513 	FX_INT32 nFontIndex = 0;
514 
515 	if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
516 	{
517 		pIterator->SetAt(m_pEdit->GetCaret());
518 		CPVT_Word word;
519 		CPVT_Section section;
520 		if (pIterator->GetWord(word))
521 		{
522 			nFontIndex = word.nFontIndex;
523 		}
524 		else if (HasFlag(PES_RICH))
525 		{
526 			if (pIterator->GetSection(section))
527 			{
528 				nFontIndex = section.WordProps.nFontIndex;
529 			}
530 		}
531 	}
532 
533 	if (IFX_Edit_FontMap * pFontMap = GetFontMap())
534 		return pFontMap->GetPDFFont(nFontIndex);
535 	else
536 		return NULL;
537 }
538 
GetCaretFontSize() const539 FX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const
540 {
541 	FX_FLOAT fFontSize = GetFontSize();
542 
543 	if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
544 	{
545 		pIterator->SetAt(m_pEdit->GetCaret());
546 		CPVT_Word word;
547 		CPVT_Section section;
548 		if (pIterator->GetWord(word))
549 		{
550 			fFontSize = word.fFontSize;
551 		}
552 		else if (HasFlag(PES_RICH))
553 		{
554 			if (pIterator->GetSection(section))
555 			{
556 				fFontSize = section.WordProps.fFontSize;
557 			}
558 		}
559 	}
560 
561 	return fFontSize;
562 }
563 
SetText(FX_LPCWSTR csText)564 void CPWL_EditCtrl::SetText(FX_LPCWSTR csText)
565 {
566 	m_pEdit->SetText(csText);
567 }
568 
CopyText()569 void CPWL_EditCtrl::CopyText()
570 {
571 }
572 
PasteText()573 void CPWL_EditCtrl::PasteText()
574 {
575 }
576 
CutText()577 void CPWL_EditCtrl::CutText()
578 {
579 }
580 
ShowVScrollBar(FX_BOOL bShow)581 void CPWL_EditCtrl::ShowVScrollBar(FX_BOOL bShow)
582 {
583 }
584 
InsertText(FX_LPCWSTR csText)585 void CPWL_EditCtrl::InsertText(FX_LPCWSTR csText)
586 {
587 	if (!IsReadOnly())
588 		m_pEdit->InsertText(csText);
589 }
590 
InsertWord(FX_WORD word,FX_INT32 nCharset)591 void CPWL_EditCtrl::InsertWord(FX_WORD word, FX_INT32 nCharset)
592 {
593 	if (!IsReadOnly())
594 		m_pEdit->InsertWord(word, nCharset);
595 }
596 
InsertReturn()597 void CPWL_EditCtrl::InsertReturn()
598 {
599 	if (!IsReadOnly())
600 		m_pEdit->InsertReturn();
601 }
602 
Delete()603 void CPWL_EditCtrl::Delete()
604 {
605 	if (!IsReadOnly())
606 		m_pEdit->Delete();
607 }
608 
Backspace()609 void CPWL_EditCtrl::Backspace()
610 {
611 	if (!IsReadOnly())
612 		m_pEdit->Backspace();
613 }
614 
CanUndo() const615 FX_BOOL	CPWL_EditCtrl::CanUndo() const
616 {
617 	return !IsReadOnly() && m_pEdit->CanUndo();
618 }
619 
CanRedo() const620 FX_BOOL	CPWL_EditCtrl::CanRedo() const
621 {
622 	return !IsReadOnly() && m_pEdit->CanRedo();
623 }
624 
Redo()625 void CPWL_EditCtrl::Redo()
626 {
627 	if (CanRedo())
628 		m_pEdit->Redo();
629 }
630 
Undo()631 void CPWL_EditCtrl::Undo()
632 {
633 	if (CanUndo())
634 		m_pEdit->Undo();
635 }
636 
IOnSetScrollInfoY(FX_FLOAT fPlateMin,FX_FLOAT fPlateMax,FX_FLOAT fContentMin,FX_FLOAT fContentMax,FX_FLOAT fSmallStep,FX_FLOAT fBigStep)637 void CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
638 												FX_FLOAT fContentMin, FX_FLOAT fContentMax,
639 												FX_FLOAT fSmallStep, FX_FLOAT fBigStep)
640 {
641 	PWL_SCROLL_INFO Info;
642 
643 	Info.fPlateWidth = fPlateMax - fPlateMin;
644 	Info.fContentMin = fContentMin;
645 	Info.fContentMax = fContentMax;
646 	Info.fSmallStep = fSmallStep;
647 	Info.fBigStep = fBigStep;
648 
649 	this->OnNotify(this,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);
650 
651 //	PWL_TRACE("set scroll info:%f\n",fContentMax - fContentMin);
652 
653 	if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
654 		|| IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
655 	{
656 		this->ShowVScrollBar(FALSE);
657 	}
658 	else
659 	{
660 		this->ShowVScrollBar(TRUE);
661 	}
662 }
663 
IOnSetScrollPosY(FX_FLOAT fy)664 void CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy)
665 {
666 //	PWL_TRACE("set scroll position:%f\n",fy);
667 	this->OnNotify(this,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);
668 }
669 
IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot,const CPVT_WordPlace & place)670 void CPWL_EditCtrl::IOnSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot, const CPVT_WordPlace& place)
671 {
672 	PWL_CARET_INFO cInfo;
673 	cInfo.bVisible = bVisible;
674 	cInfo.ptHead = ptHead;
675 	cInfo.ptFoot = ptFoot;
676 
677 	this->OnNotify(this,PNM_SETCARETINFO,(FX_INTPTR)&cInfo,(FX_INTPTR)NULL);
678 }
679 
IOnCaretChange(const CPVT_SecProps & secProps,const CPVT_WordProps & wordProps)680 void CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps)
681 {
682 }
683 
IOnContentChange(const CPDF_Rect & rcContent)684 void CPWL_EditCtrl::IOnContentChange(const CPDF_Rect& rcContent)
685 {
686 	if (this->IsValid())
687 	{
688 		if (m_pEditNotify)
689 		{
690 			m_pEditNotify->OnContentChange(rcContent);
691 		}
692 	}
693 }
694 
IOnInvalidateRect(CPDF_Rect * pRect)695 void CPWL_EditCtrl::IOnInvalidateRect(CPDF_Rect * pRect)
696 {
697 	this->InvalidateRect(pRect);
698 }
699 
GetCharSet() const700 FX_INT32 CPWL_EditCtrl::GetCharSet() const
701 {
702 	if (m_nCharSet < 0)
703 		return DEFAULT_CHARSET;
704 	else
705 		return m_nCharSet;
706 }
707 
GetTextRange(const CPDF_Rect & rect,FX_INT32 & nStartChar,FX_INT32 & nEndChar) const708 void CPWL_EditCtrl::GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
709 {
710 	nStartChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.left, rect.top)));
711 	nEndChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.right, rect.bottom)));
712 }
713 
GetText(FX_INT32 & nStartChar,FX_INT32 & nEndChar) const714 CFX_WideString CPWL_EditCtrl::GetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
715 {
716 	CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar);
717 	CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar);
718 	return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd));
719 }
720 
SetReadyToInput()721 void	CPWL_EditCtrl::SetReadyToInput()
722 {
723 	if (m_bMouseDown)
724 	{
725 		ReleaseCapture();
726 		m_bMouseDown = FALSE;
727 	}
728 }
729