CPDFDoc_Environment::GetAnnotHandlerMgr() never returns nullptr.
[pdfium.git] / fpdfsdk / src / pdfwindow / PWL_Label.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../include/pdfwindow/PDFWindow.h"
8 #include "../../include/pdfwindow/PWL_Wnd.h"
9 #include "../../include/pdfwindow/PWL_Label.h"
10 #include "../../include/pdfwindow/PWL_Utils.h"
11
12 /* ---------------------------- CPWL_Label ------------------------------ */
13
14 CPWL_Label::CPWL_Label() : m_pEdit(NULL) {
15   m_pEdit = IFX_Edit::NewEdit();
16
17   ASSERT(m_pEdit != NULL);
18 }
19
20 CPWL_Label::~CPWL_Label() {
21   IFX_Edit::DelEdit(m_pEdit);
22 }
23
24 CFX_ByteString CPWL_Label::GetClassName() const {
25   return "CPWL_Label";
26 }
27
28 void CPWL_Label::OnCreated() {
29   SetParamByFlag();
30   SetFontSize(GetCreationParam().fFontSize);
31
32   m_pEdit->SetFontMap(GetFontMap());
33   m_pEdit->Initialize();
34
35   if (HasFlag(PES_TEXTOVERFLOW)) {
36     SetClipRect(CPDF_Rect(0.0f, 0.0f, 0.0f, 0.0f));
37     m_pEdit->SetTextOverflow(TRUE);
38   }
39 }
40
41 void CPWL_Label::SetText(const FX_WCHAR* csText) {
42   m_pEdit->SetText(csText);
43 }
44
45 void CPWL_Label::RePosChildWnd() {
46   m_pEdit->SetPlateRect(GetClientRect());
47 }
48
49 void CPWL_Label::SetFontSize(FX_FLOAT fFontSize) {
50   m_pEdit->SetFontSize(fFontSize);
51 }
52
53 FX_FLOAT CPWL_Label::GetFontSize() const {
54   return m_pEdit->GetFontSize();
55 }
56
57 void CPWL_Label::SetParamByFlag() {
58   if (HasFlag(PES_LEFT)) {
59     m_pEdit->SetAlignmentH(0);
60   } else if (HasFlag(PES_MIDDLE)) {
61     m_pEdit->SetAlignmentH(1);
62   } else if (HasFlag(PES_RIGHT)) {
63     m_pEdit->SetAlignmentH(2);
64   } else {
65     m_pEdit->SetAlignmentH(0);
66   }
67
68   if (HasFlag(PES_TOP)) {
69     m_pEdit->SetAlignmentV(0);
70   } else if (HasFlag(PES_CENTER)) {
71     m_pEdit->SetAlignmentV(1);
72   } else if (HasFlag(PES_BOTTOM)) {
73     m_pEdit->SetAlignmentV(2);
74   } else {
75     m_pEdit->SetAlignmentV(0);
76   }
77
78   if (HasFlag(PES_PASSWORD)) {
79     m_pEdit->SetPasswordChar('*');
80   }
81
82   m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE));
83   m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN));
84   m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE));
85   m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL));
86 }
87
88 void CPWL_Label::DrawThisAppearance(CFX_RenderDevice* pDevice,
89                                     CPDF_Matrix* pUser2Device) {
90   CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
91
92   GetClientRect();
93
94   CPDF_Rect rcClip;
95   CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();
96   CPVT_WordRange* pRange = NULL;
97
98   if (!HasFlag(PES_TEXTOVERFLOW)) {
99     rcClip = GetClientRect();
100     pRange = &wrRange;
101   }
102   IFX_SystemHandler* pSysHandler = GetSystemHandler();
103   IFX_Edit::DrawEdit(
104       pDevice, pUser2Device, m_pEdit,
105       CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()),
106       CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), GetTransparency()),
107       rcClip, CPDF_Point(0.0f, 0.0f), pRange, pSysHandler, NULL);
108 }
109
110 void CPWL_Label::SetHorzScale(int32_t nHorzScale) {
111   m_pEdit->SetHorzScale(nHorzScale);
112 }
113
114 void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace) {
115   m_pEdit->SetCharSpace(fCharSpace);
116 }
117
118 CPDF_Rect CPWL_Label::GetContentRect() const {
119   return m_pEdit->GetContentRect();
120 }
121
122 void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
123   CPWL_Wnd::GetThisAppearanceStream(sAppStream);
124
125   sAppStream << GetTextAppearanceStream(CPDF_Point(0.0f, 0.0f));
126 }
127
128 CFX_ByteString CPWL_Label::GetTextAppearanceStream(
129     const CPDF_Point& ptOffset) const {
130   CFX_ByteTextBuf sRet;
131   CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset);
132
133   if (sEdit.GetLength() > 0) {
134     sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit
135          << "ET\n";
136   }
137
138   return sRet.GetByteString();
139 }
140
141 CFX_WideString CPWL_Label::GetText() const {
142   return m_pEdit->GetText();
143 }
144
145 void CPWL_Label::SetLimitChar(int32_t nLimitChar) {
146   m_pEdit->SetLimitChar(nLimitChar);
147 }
148
149 int32_t CPWL_Label::GetTotalWords() {
150   if (m_pEdit)
151     return m_pEdit->GetTotalWords();
152
153   return 0;
154 }