1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/cpwl_edit.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
10*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
11*3ac0a46fSAndroid Build Coastguard Worker #include <sstream>
12*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
13*3ac0a46fSAndroid Build Coastguard Worker
14*3ac0a46fSAndroid Build Coastguard Worker #include "constants/ascii.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/font/cpdf_font.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpvt_word.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/ipvt_fontmap.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_safe_types.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_fillrenderoptions.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_graphstatedata.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_path.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_renderdevice.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/fx_font.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/cpwl_caret.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/cpwl_edit_impl.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/cpwl_scroll_bar.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/cpwl_wnd.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/ipwl_fillernotify.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_fwlevent.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
31*3ac0a46fSAndroid Build Coastguard Worker
CPWL_Edit(const CreateParams & cp,std::unique_ptr<IPWL_FillerNotify::PerWindowData> pAttachedData)32*3ac0a46fSAndroid Build Coastguard Worker CPWL_Edit::CPWL_Edit(
33*3ac0a46fSAndroid Build Coastguard Worker const CreateParams& cp,
34*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<IPWL_FillerNotify::PerWindowData> pAttachedData)
35*3ac0a46fSAndroid Build Coastguard Worker : CPWL_Wnd(cp, std::move(pAttachedData)),
36*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl(std::make_unique<CPWL_EditImpl>()) {
37*3ac0a46fSAndroid Build Coastguard Worker GetCreationParams()->eCursorType = IPWL_FillerNotify::CursorStyle::kVBeam;
38*3ac0a46fSAndroid Build Coastguard Worker }
39*3ac0a46fSAndroid Build Coastguard Worker
~CPWL_Edit()40*3ac0a46fSAndroid Build Coastguard Worker CPWL_Edit::~CPWL_Edit() {
41*3ac0a46fSAndroid Build Coastguard Worker DCHECK(!m_bFocus);
42*3ac0a46fSAndroid Build Coastguard Worker }
43*3ac0a46fSAndroid Build Coastguard Worker
SetText(const WideString & csText)44*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetText(const WideString& csText) {
45*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetText(csText);
46*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Paint();
47*3ac0a46fSAndroid Build Coastguard Worker }
48*3ac0a46fSAndroid Build Coastguard Worker
RepositionChildWnd()49*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::RepositionChildWnd() {
50*3ac0a46fSAndroid Build Coastguard Worker if (CPWL_ScrollBar* pVSB = GetVScrollBar()) {
51*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect rcWindow = m_rcOldWindow;
52*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect rcVScroll =
53*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect(rcWindow.right, rcWindow.bottom,
54*3ac0a46fSAndroid Build Coastguard Worker rcWindow.right + CPWL_ScrollBar::kWidth, rcWindow.top);
55*3ac0a46fSAndroid Build Coastguard Worker
56*3ac0a46fSAndroid Build Coastguard Worker ObservedPtr<CPWL_Edit> this_observed(this);
57*3ac0a46fSAndroid Build Coastguard Worker pVSB->Move(rcVScroll, true, false);
58*3ac0a46fSAndroid Build Coastguard Worker if (!this_observed) {
59*3ac0a46fSAndroid Build Coastguard Worker return false;
60*3ac0a46fSAndroid Build Coastguard Worker }
61*3ac0a46fSAndroid Build Coastguard Worker }
62*3ac0a46fSAndroid Build Coastguard Worker
63*3ac0a46fSAndroid Build Coastguard Worker if (m_pCaret && !HasFlag(PES_TEXTOVERFLOW)) {
64*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect rect = GetClientRect();
65*3ac0a46fSAndroid Build Coastguard Worker if (!rect.IsEmpty()) {
66*3ac0a46fSAndroid Build Coastguard Worker // +1 for caret beside border
67*3ac0a46fSAndroid Build Coastguard Worker rect.Inflate(1.0f, 1.0f);
68*3ac0a46fSAndroid Build Coastguard Worker rect.Normalize();
69*3ac0a46fSAndroid Build Coastguard Worker }
70*3ac0a46fSAndroid Build Coastguard Worker m_pCaret->SetClipRect(rect);
71*3ac0a46fSAndroid Build Coastguard Worker }
72*3ac0a46fSAndroid Build Coastguard Worker
73*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetPlateRect(GetClientRect());
74*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Paint();
75*3ac0a46fSAndroid Build Coastguard Worker return true;
76*3ac0a46fSAndroid Build Coastguard Worker }
77*3ac0a46fSAndroid Build Coastguard Worker
GetClientRect() const78*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect CPWL_Edit::GetClientRect() const {
79*3ac0a46fSAndroid Build Coastguard Worker float width = static_cast<float>(GetBorderWidth() + GetInnerBorderWidth());
80*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect rcClient = GetWindowRect().GetDeflated(width, width);
81*3ac0a46fSAndroid Build Coastguard Worker CPWL_ScrollBar* pVSB = GetVScrollBar();
82*3ac0a46fSAndroid Build Coastguard Worker if (pVSB && pVSB->IsVisible())
83*3ac0a46fSAndroid Build Coastguard Worker rcClient.right -= CPWL_ScrollBar::kWidth;
84*3ac0a46fSAndroid Build Coastguard Worker return rcClient;
85*3ac0a46fSAndroid Build Coastguard Worker }
86*3ac0a46fSAndroid Build Coastguard Worker
SetAlignFormatVerticalCenter()87*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetAlignFormatVerticalCenter() {
88*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAlignmentV(static_cast<int32_t>(PEAV_CENTER));
89*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Paint();
90*3ac0a46fSAndroid Build Coastguard Worker }
91*3ac0a46fSAndroid Build Coastguard Worker
CanSelectAll() const92*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::CanSelectAll() const {
93*3ac0a46fSAndroid Build Coastguard Worker return GetSelectWordRange() != m_pEditImpl->GetWholeWordRange();
94*3ac0a46fSAndroid Build Coastguard Worker }
95*3ac0a46fSAndroid Build Coastguard Worker
CanCopy() const96*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::CanCopy() const {
97*3ac0a46fSAndroid Build Coastguard Worker return !HasFlag(PES_PASSWORD) && m_pEditImpl->IsSelected();
98*3ac0a46fSAndroid Build Coastguard Worker }
99*3ac0a46fSAndroid Build Coastguard Worker
CanCut() const100*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::CanCut() const {
101*3ac0a46fSAndroid Build Coastguard Worker return CanCopy() && !IsReadOnly();
102*3ac0a46fSAndroid Build Coastguard Worker }
103*3ac0a46fSAndroid Build Coastguard Worker
CutText()104*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::CutText() {
105*3ac0a46fSAndroid Build Coastguard Worker if (!CanCut())
106*3ac0a46fSAndroid Build Coastguard Worker return;
107*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->ClearSelection();
108*3ac0a46fSAndroid Build Coastguard Worker }
109*3ac0a46fSAndroid Build Coastguard Worker
OnCreated()110*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::OnCreated() {
111*3ac0a46fSAndroid Build Coastguard Worker SetFontSize(GetCreationParams()->fFontSize);
112*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetFontMap(GetFontMap());
113*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetNotify(this);
114*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Initialize();
115*3ac0a46fSAndroid Build Coastguard Worker
116*3ac0a46fSAndroid Build Coastguard Worker if (CPWL_ScrollBar* pScroll = GetVScrollBar()) {
117*3ac0a46fSAndroid Build Coastguard Worker pScroll->RemoveFlag(PWS_AUTOTRANSPARENT);
118*3ac0a46fSAndroid Build Coastguard Worker pScroll->SetTransparency(255);
119*3ac0a46fSAndroid Build Coastguard Worker }
120*3ac0a46fSAndroid Build Coastguard Worker
121*3ac0a46fSAndroid Build Coastguard Worker SetParamByFlag();
122*3ac0a46fSAndroid Build Coastguard Worker m_rcOldWindow = GetWindowRect();
123*3ac0a46fSAndroid Build Coastguard Worker }
124*3ac0a46fSAndroid Build Coastguard Worker
SetParamByFlag()125*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetParamByFlag() {
126*3ac0a46fSAndroid Build Coastguard Worker if (HasFlag(PES_RIGHT)) {
127*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAlignmentH(2);
128*3ac0a46fSAndroid Build Coastguard Worker } else if (HasFlag(PES_MIDDLE)) {
129*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAlignmentH(1);
130*3ac0a46fSAndroid Build Coastguard Worker } else {
131*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAlignmentH(0);
132*3ac0a46fSAndroid Build Coastguard Worker }
133*3ac0a46fSAndroid Build Coastguard Worker
134*3ac0a46fSAndroid Build Coastguard Worker if (HasFlag(PES_CENTER)) {
135*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAlignmentV(1);
136*3ac0a46fSAndroid Build Coastguard Worker } else {
137*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAlignmentV(0);
138*3ac0a46fSAndroid Build Coastguard Worker }
139*3ac0a46fSAndroid Build Coastguard Worker
140*3ac0a46fSAndroid Build Coastguard Worker if (HasFlag(PES_PASSWORD)) {
141*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetPasswordChar('*');
142*3ac0a46fSAndroid Build Coastguard Worker }
143*3ac0a46fSAndroid Build Coastguard Worker
144*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetMultiLine(HasFlag(PES_MULTILINE));
145*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAutoReturn(HasFlag(PES_AUTORETURN));
146*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE));
147*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAutoScroll(HasFlag(PES_AUTOSCROLL));
148*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->EnableUndo(HasFlag(PES_UNDO));
149*3ac0a46fSAndroid Build Coastguard Worker
150*3ac0a46fSAndroid Build Coastguard Worker if (HasFlag(PES_TEXTOVERFLOW)) {
151*3ac0a46fSAndroid Build Coastguard Worker SetClipRect(CFX_FloatRect());
152*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetTextOverflow(true);
153*3ac0a46fSAndroid Build Coastguard Worker } else {
154*3ac0a46fSAndroid Build Coastguard Worker if (m_pCaret) {
155*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect rect = GetClientRect();
156*3ac0a46fSAndroid Build Coastguard Worker if (!rect.IsEmpty()) {
157*3ac0a46fSAndroid Build Coastguard Worker // +1 for caret beside border
158*3ac0a46fSAndroid Build Coastguard Worker rect.Inflate(1.0f, 1.0f);
159*3ac0a46fSAndroid Build Coastguard Worker rect.Normalize();
160*3ac0a46fSAndroid Build Coastguard Worker }
161*3ac0a46fSAndroid Build Coastguard Worker m_pCaret->SetClipRect(rect);
162*3ac0a46fSAndroid Build Coastguard Worker }
163*3ac0a46fSAndroid Build Coastguard Worker }
164*3ac0a46fSAndroid Build Coastguard Worker }
165*3ac0a46fSAndroid Build Coastguard Worker
DrawThisAppearance(CFX_RenderDevice * pDevice,const CFX_Matrix & mtUser2Device)166*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice,
167*3ac0a46fSAndroid Build Coastguard Worker const CFX_Matrix& mtUser2Device) {
168*3ac0a46fSAndroid Build Coastguard Worker CPWL_Wnd::DrawThisAppearance(pDevice, mtUser2Device);
169*3ac0a46fSAndroid Build Coastguard Worker
170*3ac0a46fSAndroid Build Coastguard Worker const CFX_FloatRect rcClient = GetClientRect();
171*3ac0a46fSAndroid Build Coastguard Worker const BorderStyle border_style = GetBorderStyle();
172*3ac0a46fSAndroid Build Coastguard Worker const int32_t nCharArray = m_pEditImpl->GetCharArray();
173*3ac0a46fSAndroid Build Coastguard Worker bool draw_border = nCharArray > 0 && (border_style == BorderStyle::kSolid ||
174*3ac0a46fSAndroid Build Coastguard Worker border_style == BorderStyle::kDash);
175*3ac0a46fSAndroid Build Coastguard Worker if (draw_border) {
176*3ac0a46fSAndroid Build Coastguard Worker FX_SAFE_INT32 nCharArraySafe = nCharArray;
177*3ac0a46fSAndroid Build Coastguard Worker nCharArraySafe -= 1;
178*3ac0a46fSAndroid Build Coastguard Worker nCharArraySafe *= 2;
179*3ac0a46fSAndroid Build Coastguard Worker draw_border = nCharArraySafe.IsValid();
180*3ac0a46fSAndroid Build Coastguard Worker }
181*3ac0a46fSAndroid Build Coastguard Worker
182*3ac0a46fSAndroid Build Coastguard Worker if (draw_border) {
183*3ac0a46fSAndroid Build Coastguard Worker CFX_GraphStateData gsd;
184*3ac0a46fSAndroid Build Coastguard Worker gsd.m_LineWidth = GetBorderWidth();
185*3ac0a46fSAndroid Build Coastguard Worker if (border_style == BorderStyle::kDash) {
186*3ac0a46fSAndroid Build Coastguard Worker gsd.m_DashArray = {static_cast<float>(GetBorderDash().nDash),
187*3ac0a46fSAndroid Build Coastguard Worker static_cast<float>(GetBorderDash().nGap)};
188*3ac0a46fSAndroid Build Coastguard Worker gsd.m_DashPhase = GetBorderDash().nPhase;
189*3ac0a46fSAndroid Build Coastguard Worker }
190*3ac0a46fSAndroid Build Coastguard Worker
191*3ac0a46fSAndroid Build Coastguard Worker const float width = (rcClient.right - rcClient.left) / nCharArray;
192*3ac0a46fSAndroid Build Coastguard Worker CFX_Path path;
193*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF bottom(0, rcClient.bottom);
194*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF top(0, rcClient.top);
195*3ac0a46fSAndroid Build Coastguard Worker for (int32_t i = 0; i < nCharArray - 1; ++i) {
196*3ac0a46fSAndroid Build Coastguard Worker bottom.x = rcClient.left + width * (i + 1);
197*3ac0a46fSAndroid Build Coastguard Worker top.x = bottom.x;
198*3ac0a46fSAndroid Build Coastguard Worker path.AppendPoint(bottom, CFX_Path::Point::Type::kMove);
199*3ac0a46fSAndroid Build Coastguard Worker path.AppendPoint(top, CFX_Path::Point::Type::kLine);
200*3ac0a46fSAndroid Build Coastguard Worker }
201*3ac0a46fSAndroid Build Coastguard Worker if (!path.GetPoints().empty()) {
202*3ac0a46fSAndroid Build Coastguard Worker pDevice->DrawPath(path, &mtUser2Device, &gsd, 0,
203*3ac0a46fSAndroid Build Coastguard Worker GetBorderColor().ToFXColor(255),
204*3ac0a46fSAndroid Build Coastguard Worker CFX_FillRenderOptions::EvenOddOptions());
205*3ac0a46fSAndroid Build Coastguard Worker }
206*3ac0a46fSAndroid Build Coastguard Worker }
207*3ac0a46fSAndroid Build Coastguard Worker
208*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect rcClip;
209*3ac0a46fSAndroid Build Coastguard Worker CPVT_WordRange wrRange = m_pEditImpl->GetVisibleWordRange();
210*3ac0a46fSAndroid Build Coastguard Worker CPVT_WordRange* pRange = nullptr;
211*3ac0a46fSAndroid Build Coastguard Worker if (!HasFlag(PES_TEXTOVERFLOW)) {
212*3ac0a46fSAndroid Build Coastguard Worker rcClip = GetClientRect();
213*3ac0a46fSAndroid Build Coastguard Worker pRange = &wrRange;
214*3ac0a46fSAndroid Build Coastguard Worker }
215*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->DrawEdit(
216*3ac0a46fSAndroid Build Coastguard Worker pDevice, mtUser2Device, GetTextColor().ToFXColor(GetTransparency()),
217*3ac0a46fSAndroid Build Coastguard Worker rcClip, CFX_PointF(), pRange, GetFillerNotify(), GetAttachedData());
218*3ac0a46fSAndroid Build Coastguard Worker }
219*3ac0a46fSAndroid Build Coastguard Worker
OnSetFocus()220*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::OnSetFocus() {
221*3ac0a46fSAndroid Build Coastguard Worker ObservedPtr<CPWL_Edit> observed_ptr(this);
222*3ac0a46fSAndroid Build Coastguard Worker SetEditCaret(true);
223*3ac0a46fSAndroid Build Coastguard Worker if (!observed_ptr)
224*3ac0a46fSAndroid Build Coastguard Worker return;
225*3ac0a46fSAndroid Build Coastguard Worker
226*3ac0a46fSAndroid Build Coastguard Worker if (!IsReadOnly()) {
227*3ac0a46fSAndroid Build Coastguard Worker CPWL_Wnd::ProviderIface* pProvider = GetProvider();
228*3ac0a46fSAndroid Build Coastguard Worker if (pProvider) {
229*3ac0a46fSAndroid Build Coastguard Worker pProvider->OnSetFocusForEdit(this);
230*3ac0a46fSAndroid Build Coastguard Worker if (!observed_ptr)
231*3ac0a46fSAndroid Build Coastguard Worker return;
232*3ac0a46fSAndroid Build Coastguard Worker }
233*3ac0a46fSAndroid Build Coastguard Worker }
234*3ac0a46fSAndroid Build Coastguard Worker m_bFocus = true;
235*3ac0a46fSAndroid Build Coastguard Worker }
236*3ac0a46fSAndroid Build Coastguard Worker
OnKillFocus()237*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::OnKillFocus() {
238*3ac0a46fSAndroid Build Coastguard Worker ObservedPtr<CPWL_Edit> observed_ptr(this);
239*3ac0a46fSAndroid Build Coastguard Worker CPWL_ScrollBar* pScroll = GetVScrollBar();
240*3ac0a46fSAndroid Build Coastguard Worker if (pScroll && pScroll->IsVisible()) {
241*3ac0a46fSAndroid Build Coastguard Worker if (!pScroll->SetVisible(false)) {
242*3ac0a46fSAndroid Build Coastguard Worker return;
243*3ac0a46fSAndroid Build Coastguard Worker }
244*3ac0a46fSAndroid Build Coastguard Worker if (!observed_ptr) {
245*3ac0a46fSAndroid Build Coastguard Worker return;
246*3ac0a46fSAndroid Build Coastguard Worker }
247*3ac0a46fSAndroid Build Coastguard Worker if (!Move(m_rcOldWindow, true, true)) {
248*3ac0a46fSAndroid Build Coastguard Worker return;
249*3ac0a46fSAndroid Build Coastguard Worker }
250*3ac0a46fSAndroid Build Coastguard Worker }
251*3ac0a46fSAndroid Build Coastguard Worker
252*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SelectNone();
253*3ac0a46fSAndroid Build Coastguard Worker if (!observed_ptr)
254*3ac0a46fSAndroid Build Coastguard Worker return;
255*3ac0a46fSAndroid Build Coastguard Worker
256*3ac0a46fSAndroid Build Coastguard Worker if (!SetCaret(false, CFX_PointF(), CFX_PointF()))
257*3ac0a46fSAndroid Build Coastguard Worker return;
258*3ac0a46fSAndroid Build Coastguard Worker
259*3ac0a46fSAndroid Build Coastguard Worker SetCharSet(FX_Charset::kANSI);
260*3ac0a46fSAndroid Build Coastguard Worker m_bFocus = false;
261*3ac0a46fSAndroid Build Coastguard Worker }
262*3ac0a46fSAndroid Build Coastguard Worker
GetSelectWordRange() const263*3ac0a46fSAndroid Build Coastguard Worker CPVT_WordRange CPWL_Edit::GetSelectWordRange() const {
264*3ac0a46fSAndroid Build Coastguard Worker if (!m_pEditImpl->IsSelected())
265*3ac0a46fSAndroid Build Coastguard Worker return CPVT_WordRange();
266*3ac0a46fSAndroid Build Coastguard Worker
267*3ac0a46fSAndroid Build Coastguard Worker int32_t nStart;
268*3ac0a46fSAndroid Build Coastguard Worker int32_t nEnd;
269*3ac0a46fSAndroid Build Coastguard Worker std::tie(nStart, nEnd) = m_pEditImpl->GetSelection();
270*3ac0a46fSAndroid Build Coastguard Worker
271*3ac0a46fSAndroid Build Coastguard Worker CPVT_WordPlace wpStart = m_pEditImpl->WordIndexToWordPlace(nStart);
272*3ac0a46fSAndroid Build Coastguard Worker CPVT_WordPlace wpEnd = m_pEditImpl->WordIndexToWordPlace(nEnd);
273*3ac0a46fSAndroid Build Coastguard Worker return CPVT_WordRange(wpStart, wpEnd);
274*3ac0a46fSAndroid Build Coastguard Worker }
275*3ac0a46fSAndroid Build Coastguard Worker
IsTextFull() const276*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::IsTextFull() const {
277*3ac0a46fSAndroid Build Coastguard Worker return m_pEditImpl->IsTextFull();
278*3ac0a46fSAndroid Build Coastguard Worker }
279*3ac0a46fSAndroid Build Coastguard Worker
GetCharArrayAutoFontSize(const CPDF_Font * pFont,const CFX_FloatRect & rcPlate,int32_t nCharArray)280*3ac0a46fSAndroid Build Coastguard Worker float CPWL_Edit::GetCharArrayAutoFontSize(const CPDF_Font* pFont,
281*3ac0a46fSAndroid Build Coastguard Worker const CFX_FloatRect& rcPlate,
282*3ac0a46fSAndroid Build Coastguard Worker int32_t nCharArray) {
283*3ac0a46fSAndroid Build Coastguard Worker if (!pFont || pFont->IsStandardFont())
284*3ac0a46fSAndroid Build Coastguard Worker return 0.0f;
285*3ac0a46fSAndroid Build Coastguard Worker
286*3ac0a46fSAndroid Build Coastguard Worker const FX_RECT& rcBBox = pFont->GetFontBBox();
287*3ac0a46fSAndroid Build Coastguard Worker
288*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect rcCell = rcPlate;
289*3ac0a46fSAndroid Build Coastguard Worker float xdiv = rcCell.Width() / nCharArray * 1000.0f / rcBBox.Width();
290*3ac0a46fSAndroid Build Coastguard Worker float ydiv = -rcCell.Height() * 1000.0f / rcBBox.Height();
291*3ac0a46fSAndroid Build Coastguard Worker
292*3ac0a46fSAndroid Build Coastguard Worker return xdiv < ydiv ? xdiv : ydiv;
293*3ac0a46fSAndroid Build Coastguard Worker }
294*3ac0a46fSAndroid Build Coastguard Worker
SetCharArray(int32_t nCharArray)295*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetCharArray(int32_t nCharArray) {
296*3ac0a46fSAndroid Build Coastguard Worker if (!HasFlag(PES_CHARARRAY) || nCharArray <= 0)
297*3ac0a46fSAndroid Build Coastguard Worker return;
298*3ac0a46fSAndroid Build Coastguard Worker
299*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetCharArray(nCharArray);
300*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetTextOverflow(true);
301*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Paint();
302*3ac0a46fSAndroid Build Coastguard Worker
303*3ac0a46fSAndroid Build Coastguard Worker if (!HasFlag(PWS_AUTOFONTSIZE))
304*3ac0a46fSAndroid Build Coastguard Worker return;
305*3ac0a46fSAndroid Build Coastguard Worker
306*3ac0a46fSAndroid Build Coastguard Worker IPVT_FontMap* pFontMap = GetFontMap();
307*3ac0a46fSAndroid Build Coastguard Worker if (!pFontMap)
308*3ac0a46fSAndroid Build Coastguard Worker return;
309*3ac0a46fSAndroid Build Coastguard Worker
310*3ac0a46fSAndroid Build Coastguard Worker float fFontSize = GetCharArrayAutoFontSize(pFontMap->GetPDFFont(0).Get(),
311*3ac0a46fSAndroid Build Coastguard Worker GetClientRect(), nCharArray);
312*3ac0a46fSAndroid Build Coastguard Worker if (fFontSize <= 0.0f)
313*3ac0a46fSAndroid Build Coastguard Worker return;
314*3ac0a46fSAndroid Build Coastguard Worker
315*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetAutoFontSize(false);
316*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetFontSize(fFontSize);
317*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Paint();
318*3ac0a46fSAndroid Build Coastguard Worker }
319*3ac0a46fSAndroid Build Coastguard Worker
SetLimitChar(int32_t nLimitChar)320*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetLimitChar(int32_t nLimitChar) {
321*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetLimitChar(nLimitChar);
322*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Paint();
323*3ac0a46fSAndroid Build Coastguard Worker }
324*3ac0a46fSAndroid Build Coastguard Worker
GetFocusRect() const325*3ac0a46fSAndroid Build Coastguard Worker CFX_FloatRect CPWL_Edit::GetFocusRect() const {
326*3ac0a46fSAndroid Build Coastguard Worker return CFX_FloatRect();
327*3ac0a46fSAndroid Build Coastguard Worker }
328*3ac0a46fSAndroid Build Coastguard Worker
IsVScrollBarVisible() const329*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::IsVScrollBarVisible() const {
330*3ac0a46fSAndroid Build Coastguard Worker CPWL_ScrollBar* pScroll = GetVScrollBar();
331*3ac0a46fSAndroid Build Coastguard Worker return pScroll && pScroll->IsVisible();
332*3ac0a46fSAndroid Build Coastguard Worker }
333*3ac0a46fSAndroid Build Coastguard Worker
OnKeyDown(FWL_VKEYCODE nKeyCode,Mask<FWL_EVENTFLAG> nFlag)334*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnKeyDown(FWL_VKEYCODE nKeyCode, Mask<FWL_EVENTFLAG> nFlag) {
335*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown)
336*3ac0a46fSAndroid Build Coastguard Worker return true;
337*3ac0a46fSAndroid Build Coastguard Worker
338*3ac0a46fSAndroid Build Coastguard Worker if (nKeyCode == FWL_VKEY_Delete) {
339*3ac0a46fSAndroid Build Coastguard Worker WideString strChange;
340*3ac0a46fSAndroid Build Coastguard Worker WideString strChangeEx;
341*3ac0a46fSAndroid Build Coastguard Worker
342*3ac0a46fSAndroid Build Coastguard Worker int nSelStart;
343*3ac0a46fSAndroid Build Coastguard Worker int nSelEnd;
344*3ac0a46fSAndroid Build Coastguard Worker std::tie(nSelStart, nSelEnd) = GetSelection();
345*3ac0a46fSAndroid Build Coastguard Worker
346*3ac0a46fSAndroid Build Coastguard Worker if (nSelStart == nSelEnd)
347*3ac0a46fSAndroid Build Coastguard Worker nSelEnd = nSelStart + 1;
348*3ac0a46fSAndroid Build Coastguard Worker
349*3ac0a46fSAndroid Build Coastguard Worker ObservedPtr<CPWL_Wnd> this_observed(this);
350*3ac0a46fSAndroid Build Coastguard Worker
351*3ac0a46fSAndroid Build Coastguard Worker bool bRC;
352*3ac0a46fSAndroid Build Coastguard Worker bool bExit;
353*3ac0a46fSAndroid Build Coastguard Worker std::tie(bRC, bExit) = GetFillerNotify()->OnBeforeKeyStroke(
354*3ac0a46fSAndroid Build Coastguard Worker GetAttachedData(), strChange, strChangeEx, nSelStart, nSelEnd, true,
355*3ac0a46fSAndroid Build Coastguard Worker nFlag);
356*3ac0a46fSAndroid Build Coastguard Worker
357*3ac0a46fSAndroid Build Coastguard Worker if (!this_observed) {
358*3ac0a46fSAndroid Build Coastguard Worker return false;
359*3ac0a46fSAndroid Build Coastguard Worker }
360*3ac0a46fSAndroid Build Coastguard Worker
361*3ac0a46fSAndroid Build Coastguard Worker if (!bRC)
362*3ac0a46fSAndroid Build Coastguard Worker return false;
363*3ac0a46fSAndroid Build Coastguard Worker if (bExit)
364*3ac0a46fSAndroid Build Coastguard Worker return false;
365*3ac0a46fSAndroid Build Coastguard Worker }
366*3ac0a46fSAndroid Build Coastguard Worker
367*3ac0a46fSAndroid Build Coastguard Worker bool bRet = OnKeyDownInternal(nKeyCode, nFlag);
368*3ac0a46fSAndroid Build Coastguard Worker
369*3ac0a46fSAndroid Build Coastguard Worker // In case of implementation swallow the OnKeyDown event.
370*3ac0a46fSAndroid Build Coastguard Worker if (IsProceedtoOnChar(nKeyCode, nFlag))
371*3ac0a46fSAndroid Build Coastguard Worker return true;
372*3ac0a46fSAndroid Build Coastguard Worker
373*3ac0a46fSAndroid Build Coastguard Worker return bRet;
374*3ac0a46fSAndroid Build Coastguard Worker }
375*3ac0a46fSAndroid Build Coastguard Worker
376*3ac0a46fSAndroid Build Coastguard Worker // static
IsProceedtoOnChar(FWL_VKEYCODE nKeyCode,Mask<FWL_EVENTFLAG> nFlag)377*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::IsProceedtoOnChar(FWL_VKEYCODE nKeyCode,
378*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG> nFlag) {
379*3ac0a46fSAndroid Build Coastguard Worker bool bCtrl = IsPlatformShortcutKey(nFlag);
380*3ac0a46fSAndroid Build Coastguard Worker bool bAlt = IsALTKeyDown(nFlag);
381*3ac0a46fSAndroid Build Coastguard Worker if (bCtrl && !bAlt) {
382*3ac0a46fSAndroid Build Coastguard Worker // hot keys for edit control.
383*3ac0a46fSAndroid Build Coastguard Worker switch (nKeyCode) {
384*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_A:
385*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_C:
386*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_V:
387*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_X:
388*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Z:
389*3ac0a46fSAndroid Build Coastguard Worker return true;
390*3ac0a46fSAndroid Build Coastguard Worker default:
391*3ac0a46fSAndroid Build Coastguard Worker break;
392*3ac0a46fSAndroid Build Coastguard Worker }
393*3ac0a46fSAndroid Build Coastguard Worker }
394*3ac0a46fSAndroid Build Coastguard Worker // control characters.
395*3ac0a46fSAndroid Build Coastguard Worker switch (nKeyCode) {
396*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Escape:
397*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Back:
398*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Return:
399*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Space:
400*3ac0a46fSAndroid Build Coastguard Worker return true;
401*3ac0a46fSAndroid Build Coastguard Worker default:
402*3ac0a46fSAndroid Build Coastguard Worker return false;
403*3ac0a46fSAndroid Build Coastguard Worker }
404*3ac0a46fSAndroid Build Coastguard Worker }
405*3ac0a46fSAndroid Build Coastguard Worker
OnChar(uint16_t nChar,Mask<FWL_EVENTFLAG> nFlag)406*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnChar(uint16_t nChar, Mask<FWL_EVENTFLAG> nFlag) {
407*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown)
408*3ac0a46fSAndroid Build Coastguard Worker return true;
409*3ac0a46fSAndroid Build Coastguard Worker
410*3ac0a46fSAndroid Build Coastguard Worker bool bRC = true;
411*3ac0a46fSAndroid Build Coastguard Worker bool bExit = false;
412*3ac0a46fSAndroid Build Coastguard Worker
413*3ac0a46fSAndroid Build Coastguard Worker if (!IsCTRLKeyDown(nFlag)) {
414*3ac0a46fSAndroid Build Coastguard Worker WideString swChange;
415*3ac0a46fSAndroid Build Coastguard Worker int nSelStart;
416*3ac0a46fSAndroid Build Coastguard Worker int nSelEnd;
417*3ac0a46fSAndroid Build Coastguard Worker std::tie(nSelStart, nSelEnd) = GetSelection();
418*3ac0a46fSAndroid Build Coastguard Worker
419*3ac0a46fSAndroid Build Coastguard Worker switch (nChar) {
420*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kBackspace:
421*3ac0a46fSAndroid Build Coastguard Worker if (nSelStart == nSelEnd)
422*3ac0a46fSAndroid Build Coastguard Worker nSelStart = nSelEnd - 1;
423*3ac0a46fSAndroid Build Coastguard Worker break;
424*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kReturn:
425*3ac0a46fSAndroid Build Coastguard Worker break;
426*3ac0a46fSAndroid Build Coastguard Worker default:
427*3ac0a46fSAndroid Build Coastguard Worker swChange += nChar;
428*3ac0a46fSAndroid Build Coastguard Worker break;
429*3ac0a46fSAndroid Build Coastguard Worker }
430*3ac0a46fSAndroid Build Coastguard Worker
431*3ac0a46fSAndroid Build Coastguard Worker ObservedPtr<CPWL_Wnd> this_observed(this);
432*3ac0a46fSAndroid Build Coastguard Worker
433*3ac0a46fSAndroid Build Coastguard Worker WideString strChangeEx;
434*3ac0a46fSAndroid Build Coastguard Worker std::tie(bRC, bExit) = GetFillerNotify()->OnBeforeKeyStroke(
435*3ac0a46fSAndroid Build Coastguard Worker GetAttachedData(), swChange, strChangeEx, nSelStart, nSelEnd, true,
436*3ac0a46fSAndroid Build Coastguard Worker nFlag);
437*3ac0a46fSAndroid Build Coastguard Worker
438*3ac0a46fSAndroid Build Coastguard Worker if (!this_observed) {
439*3ac0a46fSAndroid Build Coastguard Worker return false;
440*3ac0a46fSAndroid Build Coastguard Worker }
441*3ac0a46fSAndroid Build Coastguard Worker }
442*3ac0a46fSAndroid Build Coastguard Worker
443*3ac0a46fSAndroid Build Coastguard Worker if (!bRC)
444*3ac0a46fSAndroid Build Coastguard Worker return true;
445*3ac0a46fSAndroid Build Coastguard Worker if (bExit)
446*3ac0a46fSAndroid Build Coastguard Worker return false;
447*3ac0a46fSAndroid Build Coastguard Worker
448*3ac0a46fSAndroid Build Coastguard Worker if (IPVT_FontMap* pFontMap = GetFontMap()) {
449*3ac0a46fSAndroid Build Coastguard Worker FX_Charset nOldCharSet = GetCharSet();
450*3ac0a46fSAndroid Build Coastguard Worker FX_Charset nNewCharSet =
451*3ac0a46fSAndroid Build Coastguard Worker pFontMap->CharSetFromUnicode(nChar, FX_Charset::kDefault);
452*3ac0a46fSAndroid Build Coastguard Worker if (nOldCharSet != nNewCharSet) {
453*3ac0a46fSAndroid Build Coastguard Worker SetCharSet(nNewCharSet);
454*3ac0a46fSAndroid Build Coastguard Worker }
455*3ac0a46fSAndroid Build Coastguard Worker }
456*3ac0a46fSAndroid Build Coastguard Worker
457*3ac0a46fSAndroid Build Coastguard Worker return OnCharInternal(nChar, nFlag);
458*3ac0a46fSAndroid Build Coastguard Worker }
459*3ac0a46fSAndroid Build Coastguard Worker
OnMouseWheel(Mask<FWL_EVENTFLAG> nFlag,const CFX_PointF & point,const CFX_Vector & delta)460*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnMouseWheel(Mask<FWL_EVENTFLAG> nFlag,
461*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point,
462*3ac0a46fSAndroid Build Coastguard Worker const CFX_Vector& delta) {
463*3ac0a46fSAndroid Build Coastguard Worker if (!HasFlag(PES_MULTILINE))
464*3ac0a46fSAndroid Build Coastguard Worker return false;
465*3ac0a46fSAndroid Build Coastguard Worker
466*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF ptScroll = GetScrollPos();
467*3ac0a46fSAndroid Build Coastguard Worker if (delta.y > 0)
468*3ac0a46fSAndroid Build Coastguard Worker ptScroll.y += GetFontSize();
469*3ac0a46fSAndroid Build Coastguard Worker else
470*3ac0a46fSAndroid Build Coastguard Worker ptScroll.y -= GetFontSize();
471*3ac0a46fSAndroid Build Coastguard Worker SetScrollPos(ptScroll);
472*3ac0a46fSAndroid Build Coastguard Worker return true;
473*3ac0a46fSAndroid Build Coastguard Worker }
474*3ac0a46fSAndroid Build Coastguard Worker
OnDestroy()475*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::OnDestroy() {
476*3ac0a46fSAndroid Build Coastguard Worker m_pCaret.ExtractAsDangling();
477*3ac0a46fSAndroid Build Coastguard Worker }
478*3ac0a46fSAndroid Build Coastguard Worker
IsWndHorV() const479*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::IsWndHorV() const {
480*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix mt = GetWindowMatrix();
481*3ac0a46fSAndroid Build Coastguard Worker return mt.Transform(CFX_PointF(1, 1)).y == mt.Transform(CFX_PointF(0, 1)).y;
482*3ac0a46fSAndroid Build Coastguard Worker }
483*3ac0a46fSAndroid Build Coastguard Worker
SetCursor()484*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetCursor() {
485*3ac0a46fSAndroid Build Coastguard Worker if (IsValid()) {
486*3ac0a46fSAndroid Build Coastguard Worker GetFillerNotify()->SetCursor(IsWndHorV()
487*3ac0a46fSAndroid Build Coastguard Worker ? IPWL_FillerNotify::CursorStyle::kVBeam
488*3ac0a46fSAndroid Build Coastguard Worker : IPWL_FillerNotify::CursorStyle::kHBeam);
489*3ac0a46fSAndroid Build Coastguard Worker }
490*3ac0a46fSAndroid Build Coastguard Worker }
491*3ac0a46fSAndroid Build Coastguard Worker
GetSelectedText()492*3ac0a46fSAndroid Build Coastguard Worker WideString CPWL_Edit::GetSelectedText() {
493*3ac0a46fSAndroid Build Coastguard Worker return m_pEditImpl->GetSelectedText();
494*3ac0a46fSAndroid Build Coastguard Worker }
495*3ac0a46fSAndroid Build Coastguard Worker
ReplaceAndKeepSelection(const WideString & text)496*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::ReplaceAndKeepSelection(const WideString& text) {
497*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->ReplaceAndKeepSelection(text);
498*3ac0a46fSAndroid Build Coastguard Worker }
499*3ac0a46fSAndroid Build Coastguard Worker
ReplaceSelection(const WideString & text)500*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::ReplaceSelection(const WideString& text) {
501*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->ReplaceSelection(text);
502*3ac0a46fSAndroid Build Coastguard Worker }
503*3ac0a46fSAndroid Build Coastguard Worker
SelectAllText()504*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::SelectAllText() {
505*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SelectAll();
506*3ac0a46fSAndroid Build Coastguard Worker return true;
507*3ac0a46fSAndroid Build Coastguard Worker }
508*3ac0a46fSAndroid Build Coastguard Worker
SetScrollInfo(const PWL_SCROLL_INFO & info)509*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetScrollInfo(const PWL_SCROLL_INFO& info) {
510*3ac0a46fSAndroid Build Coastguard Worker if (CPWL_Wnd* pChild = GetVScrollBar())
511*3ac0a46fSAndroid Build Coastguard Worker pChild->SetScrollInfo(info);
512*3ac0a46fSAndroid Build Coastguard Worker }
513*3ac0a46fSAndroid Build Coastguard Worker
SetScrollPosition(float pos)514*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetScrollPosition(float pos) {
515*3ac0a46fSAndroid Build Coastguard Worker if (CPWL_Wnd* pChild = GetVScrollBar())
516*3ac0a46fSAndroid Build Coastguard Worker pChild->SetScrollPosition(pos);
517*3ac0a46fSAndroid Build Coastguard Worker }
518*3ac0a46fSAndroid Build Coastguard Worker
ScrollWindowVertically(float pos)519*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::ScrollWindowVertically(float pos) {
520*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetScrollPos(CFX_PointF(m_pEditImpl->GetScrollPos().x, pos));
521*3ac0a46fSAndroid Build Coastguard Worker }
522*3ac0a46fSAndroid Build Coastguard Worker
CreateChildWnd(const CreateParams & cp)523*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::CreateChildWnd(const CreateParams& cp) {
524*3ac0a46fSAndroid Build Coastguard Worker if (!IsReadOnly())
525*3ac0a46fSAndroid Build Coastguard Worker CreateEditCaret(cp);
526*3ac0a46fSAndroid Build Coastguard Worker }
527*3ac0a46fSAndroid Build Coastguard Worker
CreateEditCaret(const CreateParams & cp)528*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::CreateEditCaret(const CreateParams& cp) {
529*3ac0a46fSAndroid Build Coastguard Worker if (m_pCaret)
530*3ac0a46fSAndroid Build Coastguard Worker return;
531*3ac0a46fSAndroid Build Coastguard Worker
532*3ac0a46fSAndroid Build Coastguard Worker CreateParams ecp = cp;
533*3ac0a46fSAndroid Build Coastguard Worker ecp.dwFlags = PWS_NOREFRESHCLIP;
534*3ac0a46fSAndroid Build Coastguard Worker ecp.dwBorderWidth = 0;
535*3ac0a46fSAndroid Build Coastguard Worker ecp.nBorderStyle = BorderStyle::kSolid;
536*3ac0a46fSAndroid Build Coastguard Worker ecp.rcRectWnd = CFX_FloatRect();
537*3ac0a46fSAndroid Build Coastguard Worker
538*3ac0a46fSAndroid Build Coastguard Worker auto pCaret = std::make_unique<CPWL_Caret>(ecp, CloneAttachedData());
539*3ac0a46fSAndroid Build Coastguard Worker m_pCaret = pCaret.get();
540*3ac0a46fSAndroid Build Coastguard Worker m_pCaret->SetInvalidRect(GetClientRect());
541*3ac0a46fSAndroid Build Coastguard Worker AddChild(std::move(pCaret));
542*3ac0a46fSAndroid Build Coastguard Worker m_pCaret->Realize();
543*3ac0a46fSAndroid Build Coastguard Worker }
544*3ac0a46fSAndroid Build Coastguard Worker
SetFontSize(float fFontSize)545*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetFontSize(float fFontSize) {
546*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetFontSize(fFontSize);
547*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Paint();
548*3ac0a46fSAndroid Build Coastguard Worker }
549*3ac0a46fSAndroid Build Coastguard Worker
GetFontSize() const550*3ac0a46fSAndroid Build Coastguard Worker float CPWL_Edit::GetFontSize() const {
551*3ac0a46fSAndroid Build Coastguard Worker return m_pEditImpl->GetFontSize();
552*3ac0a46fSAndroid Build Coastguard Worker }
553*3ac0a46fSAndroid Build Coastguard Worker
OnKeyDownInternal(FWL_VKEYCODE nKeyCode,Mask<FWL_EVENTFLAG> nFlag)554*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnKeyDownInternal(FWL_VKEYCODE nKeyCode,
555*3ac0a46fSAndroid Build Coastguard Worker Mask<FWL_EVENTFLAG> nFlag) {
556*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown)
557*3ac0a46fSAndroid Build Coastguard Worker return true;
558*3ac0a46fSAndroid Build Coastguard Worker
559*3ac0a46fSAndroid Build Coastguard Worker bool bRet = CPWL_Wnd::OnKeyDown(nKeyCode, nFlag);
560*3ac0a46fSAndroid Build Coastguard Worker
561*3ac0a46fSAndroid Build Coastguard Worker // FILTER
562*3ac0a46fSAndroid Build Coastguard Worker switch (nKeyCode) {
563*3ac0a46fSAndroid Build Coastguard Worker default:
564*3ac0a46fSAndroid Build Coastguard Worker return false;
565*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Delete:
566*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Up:
567*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Down:
568*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Left:
569*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Right:
570*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Home:
571*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_End:
572*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Insert:
573*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_A:
574*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_C:
575*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_V:
576*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_X:
577*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Z:
578*3ac0a46fSAndroid Build Coastguard Worker break;
579*3ac0a46fSAndroid Build Coastguard Worker }
580*3ac0a46fSAndroid Build Coastguard Worker
581*3ac0a46fSAndroid Build Coastguard Worker if (nKeyCode == FWL_VKEY_Delete && m_pEditImpl->IsSelected())
582*3ac0a46fSAndroid Build Coastguard Worker nKeyCode = FWL_VKEY_Unknown;
583*3ac0a46fSAndroid Build Coastguard Worker
584*3ac0a46fSAndroid Build Coastguard Worker switch (nKeyCode) {
585*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Delete:
586*3ac0a46fSAndroid Build Coastguard Worker Delete();
587*3ac0a46fSAndroid Build Coastguard Worker return true;
588*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Insert:
589*3ac0a46fSAndroid Build Coastguard Worker if (IsSHIFTKeyDown(nFlag))
590*3ac0a46fSAndroid Build Coastguard Worker PasteText();
591*3ac0a46fSAndroid Build Coastguard Worker return true;
592*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Up:
593*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->OnVK_UP(IsSHIFTKeyDown(nFlag));
594*3ac0a46fSAndroid Build Coastguard Worker return true;
595*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Down:
596*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->OnVK_DOWN(IsSHIFTKeyDown(nFlag));
597*3ac0a46fSAndroid Build Coastguard Worker return true;
598*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Left:
599*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->OnVK_LEFT(IsSHIFTKeyDown(nFlag));
600*3ac0a46fSAndroid Build Coastguard Worker return true;
601*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Right:
602*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->OnVK_RIGHT(IsSHIFTKeyDown(nFlag));
603*3ac0a46fSAndroid Build Coastguard Worker return true;
604*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Home:
605*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->OnVK_HOME(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
606*3ac0a46fSAndroid Build Coastguard Worker return true;
607*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_End:
608*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->OnVK_END(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
609*3ac0a46fSAndroid Build Coastguard Worker return true;
610*3ac0a46fSAndroid Build Coastguard Worker case FWL_VKEY_Unknown:
611*3ac0a46fSAndroid Build Coastguard Worker if (!IsSHIFTKeyDown(nFlag))
612*3ac0a46fSAndroid Build Coastguard Worker ClearSelection();
613*3ac0a46fSAndroid Build Coastguard Worker else
614*3ac0a46fSAndroid Build Coastguard Worker CutText();
615*3ac0a46fSAndroid Build Coastguard Worker return true;
616*3ac0a46fSAndroid Build Coastguard Worker default:
617*3ac0a46fSAndroid Build Coastguard Worker break;
618*3ac0a46fSAndroid Build Coastguard Worker }
619*3ac0a46fSAndroid Build Coastguard Worker
620*3ac0a46fSAndroid Build Coastguard Worker return bRet;
621*3ac0a46fSAndroid Build Coastguard Worker }
622*3ac0a46fSAndroid Build Coastguard Worker
OnCharInternal(uint16_t nChar,Mask<FWL_EVENTFLAG> nFlag)623*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnCharInternal(uint16_t nChar, Mask<FWL_EVENTFLAG> nFlag) {
624*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown)
625*3ac0a46fSAndroid Build Coastguard Worker return true;
626*3ac0a46fSAndroid Build Coastguard Worker
627*3ac0a46fSAndroid Build Coastguard Worker CPWL_Wnd::OnChar(nChar, nFlag);
628*3ac0a46fSAndroid Build Coastguard Worker
629*3ac0a46fSAndroid Build Coastguard Worker // FILTER
630*3ac0a46fSAndroid Build Coastguard Worker switch (nChar) {
631*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kNewline:
632*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kEscape:
633*3ac0a46fSAndroid Build Coastguard Worker return false;
634*3ac0a46fSAndroid Build Coastguard Worker default:
635*3ac0a46fSAndroid Build Coastguard Worker break;
636*3ac0a46fSAndroid Build Coastguard Worker }
637*3ac0a46fSAndroid Build Coastguard Worker
638*3ac0a46fSAndroid Build Coastguard Worker bool bCtrl = IsPlatformShortcutKey(nFlag);
639*3ac0a46fSAndroid Build Coastguard Worker bool bAlt = IsALTKeyDown(nFlag);
640*3ac0a46fSAndroid Build Coastguard Worker bool bShift = IsSHIFTKeyDown(nFlag);
641*3ac0a46fSAndroid Build Coastguard Worker
642*3ac0a46fSAndroid Build Coastguard Worker uint16_t word = nChar;
643*3ac0a46fSAndroid Build Coastguard Worker
644*3ac0a46fSAndroid Build Coastguard Worker if (bCtrl && !bAlt) {
645*3ac0a46fSAndroid Build Coastguard Worker switch (nChar) {
646*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kControlC:
647*3ac0a46fSAndroid Build Coastguard Worker CopyText();
648*3ac0a46fSAndroid Build Coastguard Worker return true;
649*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kControlV:
650*3ac0a46fSAndroid Build Coastguard Worker PasteText();
651*3ac0a46fSAndroid Build Coastguard Worker return true;
652*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kControlX:
653*3ac0a46fSAndroid Build Coastguard Worker CutText();
654*3ac0a46fSAndroid Build Coastguard Worker return true;
655*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kControlA:
656*3ac0a46fSAndroid Build Coastguard Worker SelectAllText();
657*3ac0a46fSAndroid Build Coastguard Worker return true;
658*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kControlZ:
659*3ac0a46fSAndroid Build Coastguard Worker if (bShift)
660*3ac0a46fSAndroid Build Coastguard Worker Redo();
661*3ac0a46fSAndroid Build Coastguard Worker else
662*3ac0a46fSAndroid Build Coastguard Worker Undo();
663*3ac0a46fSAndroid Build Coastguard Worker return true;
664*3ac0a46fSAndroid Build Coastguard Worker default:
665*3ac0a46fSAndroid Build Coastguard Worker if (nChar < 32)
666*3ac0a46fSAndroid Build Coastguard Worker return false;
667*3ac0a46fSAndroid Build Coastguard Worker }
668*3ac0a46fSAndroid Build Coastguard Worker }
669*3ac0a46fSAndroid Build Coastguard Worker
670*3ac0a46fSAndroid Build Coastguard Worker if (IsReadOnly())
671*3ac0a46fSAndroid Build Coastguard Worker return true;
672*3ac0a46fSAndroid Build Coastguard Worker
673*3ac0a46fSAndroid Build Coastguard Worker if (m_pEditImpl->IsSelected() && word == pdfium::ascii::kBackspace)
674*3ac0a46fSAndroid Build Coastguard Worker word = pdfium::ascii::kNul;
675*3ac0a46fSAndroid Build Coastguard Worker
676*3ac0a46fSAndroid Build Coastguard Worker ClearSelection();
677*3ac0a46fSAndroid Build Coastguard Worker
678*3ac0a46fSAndroid Build Coastguard Worker switch (word) {
679*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kBackspace:
680*3ac0a46fSAndroid Build Coastguard Worker Backspace();
681*3ac0a46fSAndroid Build Coastguard Worker break;
682*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kReturn:
683*3ac0a46fSAndroid Build Coastguard Worker InsertReturn();
684*3ac0a46fSAndroid Build Coastguard Worker break;
685*3ac0a46fSAndroid Build Coastguard Worker case pdfium::ascii::kNul:
686*3ac0a46fSAndroid Build Coastguard Worker break;
687*3ac0a46fSAndroid Build Coastguard Worker default:
688*3ac0a46fSAndroid Build Coastguard Worker InsertWord(word, GetCharSet());
689*3ac0a46fSAndroid Build Coastguard Worker break;
690*3ac0a46fSAndroid Build Coastguard Worker }
691*3ac0a46fSAndroid Build Coastguard Worker
692*3ac0a46fSAndroid Build Coastguard Worker return true;
693*3ac0a46fSAndroid Build Coastguard Worker }
694*3ac0a46fSAndroid Build Coastguard Worker
OnLButtonDown(Mask<FWL_EVENTFLAG> nFlag,const CFX_PointF & point)695*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnLButtonDown(Mask<FWL_EVENTFLAG> nFlag,
696*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) {
697*3ac0a46fSAndroid Build Coastguard Worker CPWL_Wnd::OnLButtonDown(nFlag, point);
698*3ac0a46fSAndroid Build Coastguard Worker if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) {
699*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown && !InvalidateRect(nullptr))
700*3ac0a46fSAndroid Build Coastguard Worker return true;
701*3ac0a46fSAndroid Build Coastguard Worker
702*3ac0a46fSAndroid Build Coastguard Worker m_bMouseDown = true;
703*3ac0a46fSAndroid Build Coastguard Worker SetCapture();
704*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->OnMouseDown(point, IsSHIFTKeyDown(nFlag),
705*3ac0a46fSAndroid Build Coastguard Worker IsCTRLKeyDown(nFlag));
706*3ac0a46fSAndroid Build Coastguard Worker }
707*3ac0a46fSAndroid Build Coastguard Worker return true;
708*3ac0a46fSAndroid Build Coastguard Worker }
709*3ac0a46fSAndroid Build Coastguard Worker
OnLButtonUp(Mask<FWL_EVENTFLAG> nFlag,const CFX_PointF & point)710*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnLButtonUp(Mask<FWL_EVENTFLAG> nFlag,
711*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) {
712*3ac0a46fSAndroid Build Coastguard Worker CPWL_Wnd::OnLButtonUp(nFlag, point);
713*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown) {
714*3ac0a46fSAndroid Build Coastguard Worker // can receive keybord message
715*3ac0a46fSAndroid Build Coastguard Worker if (ClientHitTest(point) && !IsFocused())
716*3ac0a46fSAndroid Build Coastguard Worker SetFocus();
717*3ac0a46fSAndroid Build Coastguard Worker
718*3ac0a46fSAndroid Build Coastguard Worker ReleaseCapture();
719*3ac0a46fSAndroid Build Coastguard Worker m_bMouseDown = false;
720*3ac0a46fSAndroid Build Coastguard Worker }
721*3ac0a46fSAndroid Build Coastguard Worker return true;
722*3ac0a46fSAndroid Build Coastguard Worker }
723*3ac0a46fSAndroid Build Coastguard Worker
OnLButtonDblClk(Mask<FWL_EVENTFLAG> nFlag,const CFX_PointF & point)724*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnLButtonDblClk(Mask<FWL_EVENTFLAG> nFlag,
725*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) {
726*3ac0a46fSAndroid Build Coastguard Worker CPWL_Wnd::OnLButtonDblClk(nFlag, point);
727*3ac0a46fSAndroid Build Coastguard Worker if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point))
728*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SelectAll();
729*3ac0a46fSAndroid Build Coastguard Worker
730*3ac0a46fSAndroid Build Coastguard Worker return true;
731*3ac0a46fSAndroid Build Coastguard Worker }
732*3ac0a46fSAndroid Build Coastguard Worker
OnRButtonUp(Mask<FWL_EVENTFLAG> nFlag,const CFX_PointF & point)733*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnRButtonUp(Mask<FWL_EVENTFLAG> nFlag,
734*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) {
735*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown)
736*3ac0a46fSAndroid Build Coastguard Worker return false;
737*3ac0a46fSAndroid Build Coastguard Worker
738*3ac0a46fSAndroid Build Coastguard Worker CPWL_Wnd::OnRButtonUp(nFlag, point);
739*3ac0a46fSAndroid Build Coastguard Worker if (!HasFlag(PES_TEXTOVERFLOW) && !ClientHitTest(point))
740*3ac0a46fSAndroid Build Coastguard Worker return true;
741*3ac0a46fSAndroid Build Coastguard Worker
742*3ac0a46fSAndroid Build Coastguard Worker SetFocus();
743*3ac0a46fSAndroid Build Coastguard Worker return false;
744*3ac0a46fSAndroid Build Coastguard Worker }
745*3ac0a46fSAndroid Build Coastguard Worker
OnMouseMove(Mask<FWL_EVENTFLAG> nFlag,const CFX_PointF & point)746*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::OnMouseMove(Mask<FWL_EVENTFLAG> nFlag,
747*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) {
748*3ac0a46fSAndroid Build Coastguard Worker CPWL_Wnd::OnMouseMove(nFlag, point);
749*3ac0a46fSAndroid Build Coastguard Worker
750*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown)
751*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->OnMouseMove(point, false, false);
752*3ac0a46fSAndroid Build Coastguard Worker
753*3ac0a46fSAndroid Build Coastguard Worker return true;
754*3ac0a46fSAndroid Build Coastguard Worker }
755*3ac0a46fSAndroid Build Coastguard Worker
SetEditCaret(bool bVisible)756*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetEditCaret(bool bVisible) {
757*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF ptHead;
758*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF ptFoot;
759*3ac0a46fSAndroid Build Coastguard Worker if (bVisible)
760*3ac0a46fSAndroid Build Coastguard Worker GetCaretInfo(&ptHead, &ptFoot);
761*3ac0a46fSAndroid Build Coastguard Worker
762*3ac0a46fSAndroid Build Coastguard Worker SetCaret(bVisible, ptHead, ptFoot);
763*3ac0a46fSAndroid Build Coastguard Worker // Note, |this| may no longer be viable at this point. If more work needs to
764*3ac0a46fSAndroid Build Coastguard Worker // be done, check the return value of SetCaret().
765*3ac0a46fSAndroid Build Coastguard Worker }
766*3ac0a46fSAndroid Build Coastguard Worker
GetCaretInfo(CFX_PointF * ptHead,CFX_PointF * ptFoot) const767*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::GetCaretInfo(CFX_PointF* ptHead, CFX_PointF* ptFoot) const {
768*3ac0a46fSAndroid Build Coastguard Worker CPWL_EditImpl::Iterator* pIterator = m_pEditImpl->GetIterator();
769*3ac0a46fSAndroid Build Coastguard Worker pIterator->SetAt(m_pEditImpl->GetCaret());
770*3ac0a46fSAndroid Build Coastguard Worker CPVT_Word word;
771*3ac0a46fSAndroid Build Coastguard Worker CPVT_Line line;
772*3ac0a46fSAndroid Build Coastguard Worker if (pIterator->GetWord(word)) {
773*3ac0a46fSAndroid Build Coastguard Worker ptHead->x = word.ptWord.x + word.fWidth;
774*3ac0a46fSAndroid Build Coastguard Worker ptHead->y = word.ptWord.y + word.fAscent;
775*3ac0a46fSAndroid Build Coastguard Worker ptFoot->x = word.ptWord.x + word.fWidth;
776*3ac0a46fSAndroid Build Coastguard Worker ptFoot->y = word.ptWord.y + word.fDescent;
777*3ac0a46fSAndroid Build Coastguard Worker } else if (pIterator->GetLine(line)) {
778*3ac0a46fSAndroid Build Coastguard Worker ptHead->x = line.ptLine.x;
779*3ac0a46fSAndroid Build Coastguard Worker ptHead->y = line.ptLine.y + line.fLineAscent;
780*3ac0a46fSAndroid Build Coastguard Worker ptFoot->x = line.ptLine.x;
781*3ac0a46fSAndroid Build Coastguard Worker ptFoot->y = line.ptLine.y + line.fLineDescent;
782*3ac0a46fSAndroid Build Coastguard Worker }
783*3ac0a46fSAndroid Build Coastguard Worker }
784*3ac0a46fSAndroid Build Coastguard Worker
SetCaret(bool bVisible,const CFX_PointF & ptHead,const CFX_PointF & ptFoot)785*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::SetCaret(bool bVisible,
786*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& ptHead,
787*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& ptFoot) {
788*3ac0a46fSAndroid Build Coastguard Worker if (!m_pCaret)
789*3ac0a46fSAndroid Build Coastguard Worker return true;
790*3ac0a46fSAndroid Build Coastguard Worker
791*3ac0a46fSAndroid Build Coastguard Worker if (!IsFocused() || m_pEditImpl->IsSelected())
792*3ac0a46fSAndroid Build Coastguard Worker bVisible = false;
793*3ac0a46fSAndroid Build Coastguard Worker
794*3ac0a46fSAndroid Build Coastguard Worker ObservedPtr<CPWL_Edit> this_observed(this);
795*3ac0a46fSAndroid Build Coastguard Worker m_pCaret->SetCaret(bVisible, ptHead, ptFoot);
796*3ac0a46fSAndroid Build Coastguard Worker if (!this_observed) {
797*3ac0a46fSAndroid Build Coastguard Worker return false;
798*3ac0a46fSAndroid Build Coastguard Worker }
799*3ac0a46fSAndroid Build Coastguard Worker
800*3ac0a46fSAndroid Build Coastguard Worker return true;
801*3ac0a46fSAndroid Build Coastguard Worker }
802*3ac0a46fSAndroid Build Coastguard Worker
GetText()803*3ac0a46fSAndroid Build Coastguard Worker WideString CPWL_Edit::GetText() {
804*3ac0a46fSAndroid Build Coastguard Worker return m_pEditImpl->GetText();
805*3ac0a46fSAndroid Build Coastguard Worker }
806*3ac0a46fSAndroid Build Coastguard Worker
SetSelection(int32_t nStartChar,int32_t nEndChar)807*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetSelection(int32_t nStartChar, int32_t nEndChar) {
808*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetSelection(nStartChar, nEndChar);
809*3ac0a46fSAndroid Build Coastguard Worker }
810*3ac0a46fSAndroid Build Coastguard Worker
GetSelection() const811*3ac0a46fSAndroid Build Coastguard Worker std::pair<int32_t, int32_t> CPWL_Edit::GetSelection() const {
812*3ac0a46fSAndroid Build Coastguard Worker return m_pEditImpl->GetSelection();
813*3ac0a46fSAndroid Build Coastguard Worker }
814*3ac0a46fSAndroid Build Coastguard Worker
ClearSelection()815*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::ClearSelection() {
816*3ac0a46fSAndroid Build Coastguard Worker if (!IsReadOnly())
817*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->ClearSelection();
818*3ac0a46fSAndroid Build Coastguard Worker }
819*3ac0a46fSAndroid Build Coastguard Worker
SetScrollPos(const CFX_PointF & point)820*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetScrollPos(const CFX_PointF& point) {
821*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->SetScrollPos(point);
822*3ac0a46fSAndroid Build Coastguard Worker }
823*3ac0a46fSAndroid Build Coastguard Worker
GetScrollPos() const824*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF CPWL_Edit::GetScrollPos() const {
825*3ac0a46fSAndroid Build Coastguard Worker return m_pEditImpl->GetScrollPos();
826*3ac0a46fSAndroid Build Coastguard Worker }
827*3ac0a46fSAndroid Build Coastguard Worker
CopyText()828*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::CopyText() {}
829*3ac0a46fSAndroid Build Coastguard Worker
PasteText()830*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::PasteText() {}
831*3ac0a46fSAndroid Build Coastguard Worker
InsertWord(uint16_t word,FX_Charset nCharset)832*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::InsertWord(uint16_t word, FX_Charset nCharset) {
833*3ac0a46fSAndroid Build Coastguard Worker if (!IsReadOnly())
834*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->InsertWord(word, nCharset);
835*3ac0a46fSAndroid Build Coastguard Worker }
836*3ac0a46fSAndroid Build Coastguard Worker
InsertReturn()837*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::InsertReturn() {
838*3ac0a46fSAndroid Build Coastguard Worker if (!IsReadOnly())
839*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->InsertReturn();
840*3ac0a46fSAndroid Build Coastguard Worker }
841*3ac0a46fSAndroid Build Coastguard Worker
Delete()842*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::Delete() {
843*3ac0a46fSAndroid Build Coastguard Worker if (!IsReadOnly())
844*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Delete();
845*3ac0a46fSAndroid Build Coastguard Worker }
846*3ac0a46fSAndroid Build Coastguard Worker
Backspace()847*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::Backspace() {
848*3ac0a46fSAndroid Build Coastguard Worker if (!IsReadOnly())
849*3ac0a46fSAndroid Build Coastguard Worker m_pEditImpl->Backspace();
850*3ac0a46fSAndroid Build Coastguard Worker }
851*3ac0a46fSAndroid Build Coastguard Worker
CanUndo()852*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::CanUndo() {
853*3ac0a46fSAndroid Build Coastguard Worker return !IsReadOnly() && m_pEditImpl->CanUndo();
854*3ac0a46fSAndroid Build Coastguard Worker }
855*3ac0a46fSAndroid Build Coastguard Worker
CanRedo()856*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::CanRedo() {
857*3ac0a46fSAndroid Build Coastguard Worker return !IsReadOnly() && m_pEditImpl->CanRedo();
858*3ac0a46fSAndroid Build Coastguard Worker }
859*3ac0a46fSAndroid Build Coastguard Worker
Undo()860*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::Undo() {
861*3ac0a46fSAndroid Build Coastguard Worker return CanUndo() && m_pEditImpl->Undo();
862*3ac0a46fSAndroid Build Coastguard Worker }
863*3ac0a46fSAndroid Build Coastguard Worker
Redo()864*3ac0a46fSAndroid Build Coastguard Worker bool CPWL_Edit::Redo() {
865*3ac0a46fSAndroid Build Coastguard Worker return CanRedo() && m_pEditImpl->Redo();
866*3ac0a46fSAndroid Build Coastguard Worker }
867*3ac0a46fSAndroid Build Coastguard Worker
SetReadyToInput()868*3ac0a46fSAndroid Build Coastguard Worker void CPWL_Edit::SetReadyToInput() {
869*3ac0a46fSAndroid Build Coastguard Worker if (m_bMouseDown) {
870*3ac0a46fSAndroid Build Coastguard Worker ReleaseCapture();
871*3ac0a46fSAndroid Build Coastguard Worker m_bMouseDown = false;
872*3ac0a46fSAndroid Build Coastguard Worker }
873*3ac0a46fSAndroid Build Coastguard Worker }
874