1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_EditCtrl.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpvt_section.h"
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpvt_word.h"
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_font.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/fxedit/fxet_edit.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_Caret.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_FontMap.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_Utils.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_fwlevent.h"
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPWL_EditCtrl::CPWL_EditCtrl()
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pEdit(new CFX_Edit),
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pEditCaret(nullptr),
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bMouseDown(false),
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_nCharSet(FXFONT_DEFAULT_CHARSET),
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_nCodePage(0) {}
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPWL_EditCtrl::~CPWL_EditCtrl() {}
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM& cp) {
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  cp.eCursorType = FXCT_VBEAM;
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::OnCreated() {
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetFontSize(GetCreationParam().fFontSize);
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEdit->SetFontMap(GetFontMap());
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEdit->SetNotify(this);
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEdit->Initialize();
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPWL_EditCtrl::IsWndHorV() {
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Matrix mt = GetWindowMatrix();
4333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  return mt.Transform(CFX_PointF(1, 1)).y == mt.Transform(CFX_PointF(0, 1)).y;
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::SetCursor() {
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsValid()) {
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CFX_SystemHandler* pSH = GetSystemHandler()) {
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (IsWndHorV())
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pSH->SetCursor(FXCT_VBEAM);
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      else
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pSH->SetCursor(FXCT_HBEAM);
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::RePosChildWnd() {
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEdit->SetPlateRect(GetClientRect());
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd,
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             uint32_t msg,
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             intptr_t wParam,
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             intptr_t lParam) {
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (msg) {
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_SETSCROLLINFO:
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      switch (wParam) {
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case SBT_VSCROLL:
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (CPWL_Wnd* pChild = GetVScrollBar()) {
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pChild->OnNotify(pWnd, PNM_SETSCROLLINFO, wParam, lParam);
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_SETSCROLLPOS:
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      switch (wParam) {
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case SBT_VSCROLL:
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (CPWL_Wnd* pChild = GetVScrollBar()) {
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pChild->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam);
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_SCROLLWINDOW: {
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_FLOAT fPos = *(FX_FLOAT*)lParam;
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      switch (wParam) {
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case SBT_VSCROLL:
9033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann          m_pEdit->SetScrollPos(CFX_PointF(m_pEdit->GetScrollPos().x, fPos));
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_SETCARETINFO: {
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (PWL_CARET_INFO* pCaretInfo = (PWL_CARET_INFO*)wParam) {
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        SetCaret(pCaretInfo->bVisible, pCaretInfo->ptHead, pCaretInfo->ptFoot);
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM& cp) {
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsReadOnly())
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CreateEditCaret(cp);
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM& cp) {
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEditCaret)
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEditCaret = new CPWL_Caret;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEditCaret->SetInvalidRect(GetClientRect());
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  PWL_CREATEPARAM ecp = cp;
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ecp.pParentWnd = this;
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP;
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ecp.dwBorderWidth = 0;
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ecp.nBorderStyle = BorderStyle::SOLID;
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ecp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0);
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEditCaret->Create(ecp);
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize) {
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEdit->SetFontSize(fFontSize);
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPWL_EditCtrl::GetFontSize() const {
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pEdit->GetFontSize();
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPWL_EditCtrl::OnKeyDown(uint16_t nChar, uint32_t nFlag) {
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bMouseDown)
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bRet = CPWL_Wnd::OnKeyDown(nChar, nFlag);
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // FILTER
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (nChar) {
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Delete:
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Up:
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Down:
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Left:
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Right:
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Home:
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_End:
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Insert:
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'C':
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'V':
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'X':
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'A':
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'Z':
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'c':
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'v':
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'x':
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'a':
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 'z':
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nChar == FWL_VKEY_Delete && m_pEdit->IsSelected())
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nChar = FWL_VKEY_Unknown;
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (nChar) {
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Delete:
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      Delete();
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Insert:
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (IsSHIFTpressed(nFlag))
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        PasteText();
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Up:
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag), false);
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Down:
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag), false);
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Left:
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag), false);
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Right:
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag), false);
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Home:
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag));
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_End:
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pEdit->OnVK_END(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag));
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Unknown:
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!IsSHIFTpressed(nFlag))
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        Clear();
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      else
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CutText();
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRet;
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPWL_EditCtrl::OnChar(uint16_t nChar, uint32_t nFlag) {
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bMouseDown)
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnChar(nChar, nFlag);
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // FILTER
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (nChar) {
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 0x0A:
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 0x1B:
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bCtrl = IsCTRLpressed(nFlag);
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bAlt = IsALTpressed(nFlag);
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bShift = IsSHIFTpressed(nFlag);
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t word = nChar;
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bCtrl && !bAlt) {
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (nChar) {
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 'C' - 'A' + 1:
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CopyText();
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 'V' - 'A' + 1:
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        PasteText();
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 'X' - 'A' + 1:
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CutText();
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 'A' - 'A' + 1:
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        SelectAll();
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 'Z' - 'A' + 1:
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (bShift)
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          Redo();
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        else
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          Undo();
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      default:
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (nChar < 32)
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return false;
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsReadOnly())
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pEdit->IsSelected() && word == FWL_VKEY_Back)
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    word = FWL_VKEY_Unknown;
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Clear();
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (word) {
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Back:
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      Backspace();
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Return:
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      InsertReturn();
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FWL_VKEY_Unknown:
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      InsertWord(word, GetCharSet());
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
27733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannbool CPWL_EditCtrl::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnLButtonDown(point, nFlag);
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ClientHitTest(point)) {
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_bMouseDown)
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      InvalidateRect();
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bMouseDown = true;
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SetCapture();
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEdit->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag));
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
29333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannbool CPWL_EditCtrl::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) {
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnLButtonUp(point, nFlag);
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bMouseDown) {
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // can receive keybord message
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (ClientHitTest(point) && !IsFocused())
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      SetFocus();
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ReleaseCapture();
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bMouseDown = false;
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
30833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannbool CPWL_EditCtrl::OnMouseMove(const CFX_PointF& point, uint32_t nFlag) {
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnMouseMove(point, nFlag);
310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bMouseDown)
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->OnMouseMove(point, false, false);
313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_FloatRect CPWL_EditCtrl::GetContentRect() const {
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pEdit->GetContentRect();
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::SetEditCaret(bool bVisible) {
32233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  CFX_PointF ptHead;
32333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  CFX_PointF ptFoot;
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bVisible)
32533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    GetCaretInfo(&ptHead, &ptFoot);
326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IOnSetCaret(bVisible, ptHead, ptFoot, wpTemp);
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
33133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CPWL_EditCtrl::GetCaretInfo(CFX_PointF* ptHead, CFX_PointF* ptFoot) const {
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pIterator->SetAt(m_pEdit->GetCaret());
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Word word;
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Line line;
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pIterator->GetWord(word)) {
33733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ptHead->x = word.ptWord.x + word.fWidth;
33833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ptHead->y = word.ptWord.y + word.fAscent;
33933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ptFoot->x = word.ptWord.x + word.fWidth;
34033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ptFoot->y = word.ptWord.y + word.fDescent;
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (pIterator->GetLine(line)) {
34233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ptHead->x = line.ptLine.x;
34333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ptHead->y = line.ptLine.y + line.fLineAscent;
34433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ptFoot->x = line.ptLine.x;
34533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ptFoot->y = line.ptLine.y + line.fLineDescent;
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::SetCaret(bool bVisible,
35033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                             const CFX_PointF& ptHead,
35133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                             const CFX_PointF& ptFoot) {
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pEditCaret) {
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!IsFocused() || m_pEdit->IsSelected())
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bVisible = false;
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPWL_EditCtrl::GetText() const {
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pEdit->GetText();
362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::SetSel(int32_t nStartChar, int32_t nEndChar) {
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEdit->SetSel(nStartChar, nEndChar);
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::GetSel(int32_t& nStartChar, int32_t& nEndChar) const {
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEdit->GetSel(nStartChar, nEndChar);
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::Clear() {
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsReadOnly())
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEdit->Clear();
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::SelectAll() {
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEdit->SelectAll();
379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::Paint() {
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->Paint();
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::EnableRefresh(bool bRefresh) {
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->EnableRefresh(bRefresh);
387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPWL_EditCtrl::GetCaret() const {
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pEdit->GetCaret();
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::SetCaret(int32_t nPos) {
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetCaret(nPos);
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPWL_EditCtrl::GetTotalWords() const {
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pEdit->GetTotalWords();
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
40133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CPWL_EditCtrl::SetScrollPos(const CFX_PointF& point) {
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetScrollPos(point);
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
40533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_PointF CPWL_EditCtrl::GetScrollPos() const {
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pEdit->GetScrollPos();
407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPWL_EditCtrl::GetCaretFont() const {
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nFontIndex = 0;
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pIterator->SetAt(m_pEdit->GetCaret());
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Word word;
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Section section;
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pIterator->GetWord(word)) {
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nFontIndex = word.nFontIndex;
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (HasFlag(PES_RICH)) {
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pIterator->GetSection(section)) {
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nFontIndex = section.WordProps.nFontIndex;
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IPVT_FontMap* pFontMap = GetFontMap())
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pFontMap->GetPDFFont(nFontIndex);
426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nullptr;
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const {
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fFontSize = GetFontSize();
432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pIterator->SetAt(m_pEdit->GetCaret());
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Word word;
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_Section section;
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pIterator->GetWord(word)) {
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fFontSize = word.fFontSize;
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (HasFlag(PES_RICH)) {
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pIterator->GetSection(section)) {
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fFontSize = section.WordProps.fFontSize;
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return fFontSize;
446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::SetText(const CFX_WideString& wsText) {
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetText(wsText);
450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::CopyText() {}
453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::PasteText() {}
455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::CutText() {}
457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::ShowVScrollBar(bool bShow) {}
459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::InsertText(const CFX_WideString& wsText) {
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsReadOnly())
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->InsertText(wsText, FXFONT_DEFAULT_CHARSET);
463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::InsertWord(uint16_t word, int32_t nCharset) {
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsReadOnly())
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEdit->InsertWord(word, nCharset);
468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::InsertReturn() {
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsReadOnly())
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEdit->InsertReturn();
473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::Delete() {
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsReadOnly())
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEdit->Delete();
478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::Backspace() {
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsReadOnly())
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEdit->Backspace();
483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPWL_EditCtrl::CanUndo() const {
486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return !IsReadOnly() && m_pEdit->CanUndo();
487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPWL_EditCtrl::CanRedo() const {
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return !IsReadOnly() && m_pEdit->CanRedo();
491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::Redo() {
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CanRedo())
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEdit->Redo();
496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::Undo() {
499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CanUndo())
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEdit->Undo();
501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin,
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_FLOAT fPlateMax,
505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_FLOAT fContentMin,
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_FLOAT fContentMax,
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_FLOAT fSmallStep,
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_FLOAT fBigStep) {
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  PWL_SCROLL_INFO Info;
510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Info.fPlateWidth = fPlateMax - fPlateMin;
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Info.fContentMin = fContentMin;
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Info.fContentMax = fContentMax;
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Info.fSmallStep = fSmallStep;
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Info.fBigStep = fBigStep;
516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (intptr_t)&Info);
518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsFloatBigger(Info.fPlateWidth, Info.fContentMax - Info.fContentMin) ||
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      IsFloatEqual(Info.fPlateWidth, Info.fContentMax - Info.fContentMin)) {
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ShowVScrollBar(false);
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ShowVScrollBar(true);
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy) {
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (intptr_t)&fy);
529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::IOnSetCaret(bool bVisible,
53233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                const CFX_PointF& ptHead,
53333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                const CFX_PointF& ptFoot,
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                const CPVT_WordPlace& place) {
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  PWL_CARET_INFO cInfo;
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  cInfo.bVisible = bVisible;
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  cInfo.ptHead = ptHead;
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  cInfo.ptFoot = ptFoot;
539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnNotify(this, PNM_SETCARETINFO, (intptr_t)&cInfo, (intptr_t) nullptr);
541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps& secProps,
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   const CPVT_WordProps& wordProps) {}
545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::IOnContentChange(const CFX_FloatRect& rcContent) {}
547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::IOnInvalidateRect(CFX_FloatRect* pRect) {
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  InvalidateRect(pRect);
550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPWL_EditCtrl::GetCharSet() const {
5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_nCharSet < 0 ? FXFONT_DEFAULT_CHARSET : m_nCharSet;
554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_EditCtrl::GetTextRange(const CFX_FloatRect& rect,
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 int32_t& nStartChar,
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 int32_t& nEndChar) const {
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nStartChar = m_pEdit->WordPlaceToWordIndex(
56033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pEdit->SearchWordPlace(CFX_PointF(rect.left, rect.top)));
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nEndChar = m_pEdit->WordPlaceToWordIndex(
56233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pEdit->SearchWordPlace(CFX_PointF(rect.right, rect.bottom)));
563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPWL_EditCtrl::GetText(int32_t& nStartChar,
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t& nEndChar) const {
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar);
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar);
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd));
570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_EditCtrl::SetReadyToInput() {
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bMouseDown) {
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ReleaseCapture();
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bMouseDown = false;
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
578