7#include "fpdfsdk/pwl/cpwl_edit.h"
14#include "constants/ascii.h"
15#include "core/fpdfapi/font/cpdf_font.h"
16#include "core/fpdfdoc/cpvt_word.h"
17#include "core/fpdfdoc/ipvt_fontmap.h"
18#include "core/fxcrt/check.h"
19#include "core/fxcrt/fx_safe_types.h"
20#include "core/fxge/cfx_fillrenderoptions.h"
21#include "core/fxge/cfx_graphstatedata.h"
22#include "core/fxge/cfx_path.h"
23#include "core/fxge/cfx_renderdevice.h"
24#include "core/fxge/fx_font.h"
25#include "fpdfsdk/pwl/cpwl_caret.h"
26#include "fpdfsdk/pwl/cpwl_edit_impl.h"
27#include "fpdfsdk/pwl/cpwl_scroll_bar.h"
28#include "fpdfsdk/pwl/cpwl_wnd.h"
29#include "fpdfsdk/pwl/ipwl_fillernotify.h"
30#include "public/fpdf_fwlevent.h"
34 std::unique_ptr<IPWL_FillerNotify::PerWindowData> pAttachedData)
45 m_pEditImpl->SetText(csText);
50 ObservedPtr<CPWL_Edit> this_observed(
this);
51 if (CPWL_ScrollBar* pVSB = this_observed->GetVScrollBar()) {
56 pVSB
->Move(rcVScroll,
true,
false);
68 this_observed->m_pCaret->SetClipRect(rect);
71 this_observed->m_pEditImpl->Paint();
85 m_pEditImpl->SetAlignmentV(
static_cast<int32_t>(PEAV_CENTER));
90 return GetSelectWordRange() != m_pEditImpl->GetWholeWordRange();
94 return !HasFlag(
PES_PASSWORD) && m_pEditImpl->IsSelected();
104 m_pEditImpl->ClearSelection();
109 m_pEditImpl->SetFontMap(GetFontMap());
110 m_pEditImpl->SetNotify(
this);
111 m_pEditImpl->Initialize();
122void CPWL_Edit::SetParamByFlag() {
124 m_pEditImpl->SetAlignmentH(2);
126 m_pEditImpl->SetAlignmentH(1);
128 m_pEditImpl->SetAlignmentH(0);
132 m_pEditImpl->SetAlignmentV(1);
134 m_pEditImpl->SetAlignmentV(0);
138 m_pEditImpl->SetPasswordChar(
'*');
145 m_pEditImpl->EnableUndo(HasFlag(
PES_UNDO));
149 m_pEditImpl->SetTextOverflow(
true);
158 m_pCaret->SetClipRect(rect);
169 const int32_t nCharArray = m_pEditImpl->GetCharArray();
176 draw_border = nCharArraySafe.IsValid();
183 gsd.m_DashArray = {
static_cast<
float>(
GetBorderDash().nDash),
188 const float width = (rcClient
.right - rcClient
.left) / nCharArray;
192 for (int32_t i = 0; i < nCharArray - 1; ++i) {
193 bottom.x = rcClient
.left + width * (i + 1);
198 if (!path.GetPoints().empty()) {
212 m_pEditImpl->DrawEdit(
213 pDevice, mtUser2Device, GetTextColor().ToFXColor(GetTransparency()),
214 rcClip, CFX_PointF(), pRange, GetFillerNotify(), GetAttachedData());
218 ObservedPtr<CPWL_Edit> this_observed(
this);
219 this_observed->SetEditCaret(
true);
220 if (!this_observed) {
223 if (!this_observed->IsReadOnly()) {
227 if (!this_observed) {
232 this_observed->m_bFocus =
true;
236 ObservedPtr<CPWL_Edit> this_observed(
this);
237 CPWL_ScrollBar* pScroll = this_observed->GetVScrollBar();
242 if (!this_observed) {
245 if (!this_observed->Move(this_observed->m_rcOldWindow,
true,
true)) {
249 this_observed->m_pEditImpl->SelectNone();
250 if (!this_observed) {
253 if (!this_observed->SetCaret(
false, CFX_PointF(), CFX_PointF())) {
257 this_observed->m_bFocus =
false;
261 if (!m_pEditImpl->IsSelected())
264 auto [nStart, nEnd] = m_pEditImpl->GetSelection();
266 CPVT_WordPlace wpStart = m_pEditImpl->WordIndexToWordPlace(nStart);
272 return m_pEditImpl->IsTextFull();
277 int32_t nCharArray) {
287 return xdiv < ydiv ? xdiv : ydiv;
294 m_pEditImpl->SetCharArray(nCharArray);
295 m_pEditImpl->SetTextOverflow(
true);
296 m_pEditImpl->Paint();
307 if (fFontSize <= 0.0f)
310 m_pEditImpl->SetAutoFontSize(
false);
311 m_pEditImpl->SetFontSize(fFontSize);
312 m_pEditImpl->Paint();
316 m_pEditImpl->SetLimitChar(nLimitChar);
317 m_pEditImpl->Paint();
324bool CPWL_Edit::IsVScrollBarVisible()
const {
329bool CPWL_Edit::
OnKeyDown(FWL_VKEYCODE nKeyCode,
Mask<FWL_EVENTFLAG> nFlag) {
330 ObservedPtr<CPWL_Edit> this_observed(
this);
331 if (this_observed->m_bMouseDown) {
337 auto [nSelStart, nSelEnd] = this_observed->GetSelection();
338 if (nSelStart == nSelEnd) {
339 nSelEnd = nSelStart + 1;
342 this_observed->GetFillerNotify()->OnBeforeKeyStroke(
343 this_observed->GetAttachedData(), strChange, strChangeEx, nSelStart,
344 nSelEnd,
true, nFlag);
346 if (!this_observed) {
357 bool bRet = this_observed->OnKeyDownInternal(nKeyCode, nFlag);
360 if (this_observed->IsProceedtoOnChar(nKeyCode, nFlag)) {
367bool CPWL_Edit::IsProceedtoOnChar(FWL_VKEYCODE nKeyCode,
368 Mask<FWL_EVENTFLAG> nFlag) {
371 if (bCtrl && !bAlt) {
396bool CPWL_Edit::
OnChar(uint16_t nChar,
Mask<FWL_EVENTFLAG> nFlag) {
397 ObservedPtr<CPWL_Edit> this_observed(
this);
398 if (this_observed->m_bMouseDown) {
401 if (!this_observed->IsCTRLKeyDown(nFlag)) {
403 auto [nSelStart, nSelEnd] = this_observed->GetSelection();
405 case pdfium::ascii::kBackspace:
406 if (nSelStart == nSelEnd)
407 nSelStart = nSelEnd - 1;
417 this_observed->GetFillerNotify()->OnBeforeKeyStroke(
418 this_observed->GetAttachedData(), swChange, strChangeEx, nSelStart,
419 nSelEnd,
true, nFlag);
421 if (!this_observed) {
431 if (
IPVT_FontMap* pFontMap = this_observed->GetFontMap()) {
432 FX_Charset nOldCharSet = this_observed->GetCharSet();
435 if (nOldCharSet != nNewCharSet) {
436 this_observed->SetCharSet(nNewCharSet);
439 return this_observed->OnCharInternal(nChar, nFlag);
458 m_pCaret.ExtractAsDangling();
461bool CPWL_Edit::IsWndHorV()
const {
475 return m_pEditImpl->GetSelectedText();
479 m_pEditImpl->ReplaceAndKeepSelection(text);
483 m_pEditImpl->ReplaceSelection(text);
487 m_pEditImpl->SelectAll();
502 m_pEditImpl->SetScrollPos(CFX_PointF(m_pEditImpl->GetScrollPos().x, pos));
510void CPWL_Edit::CreateEditCaret(
const CreateParams& cp) {
520 auto pCaret = std::make_unique<CPWL_Caret>(ecp, CloneAttachedData());
521 m_pCaret = pCaret.get();
522 m_pCaret->SetInvalidRect(GetClientRect());
523 AddChild(std::move(pCaret));
528 m_pEditImpl->SetFontSize(fFontSize);
529 m_pEditImpl->Paint();
533 return m_pEditImpl->GetFontSize();
536bool CPWL_Edit::OnKeyDownInternal(FWL_VKEYCODE nKeyCode,
537 Mask<FWL_EVENTFLAG> nFlag) {
563 if (nKeyCode == FWL_VKEY_Delete && m_pEditImpl->IsSelected())
575 m_pEditImpl->OnVK_UP(IsSHIFTKeyDown(nFlag));
578 m_pEditImpl->OnVK_DOWN(IsSHIFTKeyDown(nFlag));
581 m_pEditImpl->OnVK_LEFT(IsSHIFTKeyDown(nFlag));
584 m_pEditImpl->OnVK_RIGHT(IsSHIFTKeyDown(nFlag));
587 m_pEditImpl->OnVK_HOME(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
590 m_pEditImpl->OnVK_END(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
605bool CPWL_Edit::OnCharInternal(uint16_t nChar,
Mask<FWL_EVENTFLAG> nFlag) {
624 uint16_t word = nChar;
626 if (bCtrl && !bAlt) {
655 if (m_pEditImpl->IsSelected() && word == pdfium::ascii::kBackspace)
686 m_pEditImpl->OnMouseDown(point, IsSHIFTKeyDown(nFlag),
687 IsCTRLKeyDown(nFlag));
701 m_bMouseDown =
false;
710 m_pEditImpl->SelectAll();
733 m_pEditImpl->OnMouseMove(point,
false,
false);
738void CPWL_Edit::SetEditCaret(
bool bVisible) {
742 GetCaretInfo(&ptHead, &ptFoot);
751 pIterator->SetAt(m_pEditImpl->GetCaret());
755 ptHead->x = word.ptWord.x + word
.fWidth;
756 ptHead->y = word.ptWord.y + word
.fAscent;
757 ptFoot->x = word.ptWord.x + word
.fWidth;
758 ptFoot->y = word.ptWord.y + word
.fDescent;
760 ptHead->x = line.ptLine.x;
762 ptFoot->x = line.ptLine.x;
770 ObservedPtr<CPWL_Edit> this_observed(
this);
771 if (!this_observed->m_pCaret) {
774 if (!this_observed->IsFocused() || this_observed->m_pEditImpl->IsSelected()) {
777 this_observed->m_pCaret->SetCaret(bVisible, ptHead, ptFoot);
778 return !!this_observed;
782 return m_pEditImpl->GetText();
786 m_pEditImpl->SetSelection(nStartChar, nEndChar);
790 return m_pEditImpl->GetSelection();
795 m_pEditImpl->ClearSelection();
799 m_pEditImpl->SetScrollPos(point);
803 return m_pEditImpl->GetScrollPos();
806void CPWL_Edit::CopyText() {}
808void CPWL_Edit::PasteText() {}
810void CPWL_Edit::InsertWord(uint16_t word,
FX_Charset nCharset) {
812 m_pEditImpl->InsertWord(word, nCharset);
815void CPWL_Edit::InsertReturn() {
817 m_pEditImpl->InsertReturn();
820void CPWL_Edit::Delete() {
822 m_pEditImpl->Delete();
825void CPWL_Edit::Backspace() {
827 m_pEditImpl->Backspace();
831 return !IsReadOnly() && m_pEditImpl->CanUndo();
835 return !IsReadOnly() && m_pEditImpl->CanRedo();
839 return CanUndo() && m_pEditImpl->Undo();
843 return CanRedo() && m_pEditImpl->Redo();
849 m_bMouseDown =
false;
constexpr CFX_FloatRect(float l, float b, float r, float t)
constexpr CFX_FloatRect()=default
void Inflate(float x, float y)
CFX_FloatRect & operator=(const CFX_FloatRect &that)=default
CFX_PointF Transform(const CFX_PointF &point) const
void AppendPoint(const CFX_PointF &point, Point::Type type)
bool DrawPath(const CFX_Path &path, const CFX_Matrix *pObject2Device, const CFX_GraphStateData *pGraphState, uint32_t fill_color, uint32_t stroke_color, const CFX_FillRenderOptions &fill_options)
const FX_RECT & GetFontBBox() const
bool IsStandardFont() const
bool GetWord(CPVT_Word &word) const
bool GetLine(CPVT_Line &line) const
static float GetCharArrayAutoFontSize(const CPDF_Font *pFont, const CFX_FloatRect &rcPlate, int32_t nCharArray)
void SetScrollInfo(const PWL_SCROLL_INFO &info) override
void SetFontSize(float fFontSize) override
bool SetCaret(bool bVisible, const CFX_PointF &ptHead, const CFX_PointF &ptFoot)
bool SelectAllText() override
bool OnLButtonUp(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point) override
bool OnKeyDown(FWL_VKEYCODE nKeyCode, Mask< FWL_EVENTFLAG > nFlag) override
CPWL_Edit(const CreateParams &cp, std::unique_ptr< IPWL_FillerNotify::PerWindowData > pAttachedData)
CFX_FloatRect GetFocusRect() const override
bool RepositionChildWnd() override
void SetScrollPosition(float pos) override
void SetAlignFormatVerticalCenter()
void SetCursor() override
WideString GetText() override
bool OnLButtonDblClk(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point) override
void OnSetFocus() override
void ReplaceAndKeepSelection(const WideString &text) override
void ScrollWindowVertically(float pos) override
void SetCharArray(int32_t nCharArray)
void SetSelection(int32_t nStartChar, int32_t nEndChar)
std::pair< int32_t, int32_t > GetSelection() const
void OnKillFocus() override
void SetScrollPos(const CFX_PointF &point)
void SetText(const WideString &csText)
bool OnMouseMove(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point) override
void ReplaceSelection(const WideString &text) override
CFX_FloatRect GetClientRect() const override
bool OnMouseWheel(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point, const CFX_Vector &delta) override
void DrawThisAppearance(CFX_RenderDevice *pDevice, const CFX_Matrix &mtUser2Device) override
bool OnChar(uint16_t nChar, Mask< FWL_EVENTFLAG > nFlag) override
void OnCreated() override
WideString GetSelectedText() override
float GetFontSize() const override
void SetLimitChar(int32_t nLimitChar)
FX_Charset GetCharSet() const
bool OnLButtonDown(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point) override
CFX_PointF GetScrollPos() const
bool OnRButtonUp(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point) override
void CreateChildWnd(const CreateParams &cp) override
void OnDestroy() override
bool CanSelectAll() const
virtual void OnSetFocusForEdit(CPWL_Edit *pEdit)=0
CFX_Matrix GetWindowMatrix() const
static bool IsPlatformShortcutKey(Mask< FWL_EVENTFLAG > nFlag)
bool ClientHitTest(const CFX_PointF &point) const
static bool IsALTKeyDown(Mask< FWL_EVENTFLAG > nFlag)
CFX_Color GetBorderColor() const
BorderStyle GetBorderStyle() const
virtual bool OnChar(uint16_t nChar, Mask< FWL_EVENTFLAG > nFlag)
void RemoveFlag(uint32_t dwFlags)
IPWL_FillerNotify * GetFillerNotify() const
bool HasFlag(uint32_t dwFlags) const
CFX_FloatRect GetWindowRect() const
IPVT_FontMap * GetFontMap() const
void SetTransparency(int32_t nTransparency)
virtual bool OnLButtonUp(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point)
virtual bool OnMouseMove(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point)
static bool IsSHIFTKeyDown(Mask< FWL_EVENTFLAG > nFlag)
virtual bool OnRButtonUp(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point)
virtual bool OnKeyDown(FWL_VKEYCODE nKeyCode, Mask< FWL_EVENTFLAG > nFlag)
int32_t GetBorderWidth() const
CreateParams * GetCreationParams()
virtual void SetScrollInfo(const PWL_SCROLL_INFO &info)
virtual bool InvalidateRect(const CFX_FloatRect *pRect)
virtual bool SetVisible(bool bVisible)
const CPWL_Dash & GetBorderDash() const
int32_t GetInnerBorderWidth() const
virtual void SetScrollPosition(float pos)
virtual void DrawThisAppearance(CFX_RenderDevice *pDevice, const CFX_Matrix &mtUser2Device)
bool Move(const CFX_FloatRect &rcNew, bool bReset, bool bRefresh)
void SetClipRect(const CFX_FloatRect &rect)
virtual bool OnLButtonDblClk(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point)
CPWL_ScrollBar * GetVScrollBar() const
virtual bool OnLButtonDown(Mask< FWL_EVENTFLAG > nFlag, const CFX_PointF &point)
virtual RetainPtr< CPDF_Font > GetPDFFont(int32_t nFontIndex)=0
virtual FX_Charset CharSetFromUnicode(uint16_t word, FX_Charset nOldCharset)=0
WideString & operator+=(wchar_t ch)
#define PWS_AUTOTRANSPARENT
#define PWS_NOREFRESHCLIP
CFX_VTemplate< int32_t > CFX_Vector
CFX_PTemplate< float > CFX_PointF
pdfium::CheckedNumeric< int32_t > FX_SAFE_INT32
constexpr uint8_t kEscape
constexpr uint8_t kReturn
constexpr uint8_t kControlC
constexpr uint8_t kControlZ
constexpr uint8_t kBackspace
constexpr uint8_t kControlX
constexpr uint8_t kNewline
constexpr uint8_t kControlV
constexpr uint8_t kControlA
static constexpr CFX_FillRenderOptions EvenOddOptions()
CPVT_WordRange(const CPVT_WordPlace &begin, const CPVT_WordPlace &end)
fxcrt::WideString WideString