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
14CPWL_Label::CPWL_Label() : m_pEdit(NULL)
15{
16	m_pEdit = IFX_Edit::NewEdit();
17
18	ASSERT(m_pEdit != NULL);
19}
20
21CPWL_Label::~CPWL_Label()
22{
23	IFX_Edit::DelEdit(m_pEdit);
24}
25
26CFX_ByteString CPWL_Label::GetClassName() const
27{
28	return "CPWL_Label";
29}
30
31void CPWL_Label::OnCreated()
32{
33	SetParamByFlag();
34	SetFontSize(this->GetCreationParam().fFontSize);
35
36	m_pEdit->SetFontMap(this->GetFontMap());
37	m_pEdit->Initialize();
38
39	if (HasFlag(PES_TEXTOVERFLOW))
40	{
41		SetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f));
42		m_pEdit->SetTextOverflow(TRUE);
43	}
44}
45
46void CPWL_Label::SetText(FX_LPCWSTR csText)
47{
48	m_pEdit->SetText(csText);
49}
50
51void CPWL_Label::RePosChildWnd()
52{
53	m_pEdit->SetPlateRect(GetClientRect());
54}
55
56void CPWL_Label::SetFontSize(FX_FLOAT fFontSize)
57{
58	m_pEdit->SetFontSize(fFontSize);
59}
60
61FX_FLOAT CPWL_Label::GetFontSize() const
62{
63	return m_pEdit->GetFontSize();
64}
65
66void CPWL_Label::SetParamByFlag()
67{
68	if (HasFlag(PES_LEFT))
69	{
70		m_pEdit->SetAlignmentH(0);
71	}
72	else if (HasFlag(PES_MIDDLE))
73	{
74		m_pEdit->SetAlignmentH(1);
75	}
76	else if (HasFlag(PES_RIGHT))
77	{
78		m_pEdit->SetAlignmentH(2);
79	}
80	else
81	{
82		m_pEdit->SetAlignmentH(0);
83	}
84
85	if (HasFlag(PES_TOP))
86	{
87		m_pEdit->SetAlignmentV(0);
88	}
89	else if (HasFlag(PES_CENTER))
90	{
91		m_pEdit->SetAlignmentV(1);
92	}
93	else if (HasFlag(PES_BOTTOM))
94	{
95		m_pEdit->SetAlignmentV(2);
96	}
97	else
98	{
99		m_pEdit->SetAlignmentV(0);
100	}
101
102	if (HasFlag(PES_PASSWORD))
103	{
104		m_pEdit->SetPasswordChar('*');
105	}
106
107	m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE));
108	m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN));
109	m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE));
110	m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL));
111}
112
113void CPWL_Label::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
114{
115	CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
116
117	GetClientRect();
118
119	CPDF_Rect rcClip;
120	CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();
121	CPVT_WordRange* pRange = NULL;
122
123	if (!HasFlag(PES_TEXTOVERFLOW))
124	{
125		rcClip = GetClientRect();
126		pRange = &wrRange;
127	}
128IFX_SystemHandler* pSysHandler = GetSystemHandler();
129	IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pEdit,
130		CPWL_Utils::PWLColorToFXColor(GetTextColor(), this->GetTransparency()),
131		CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), this->GetTransparency()),
132		rcClip, CPDF_Point(0.0f,0.0f), pRange,pSysHandler, NULL);
133}
134
135void CPWL_Label::SetHorzScale(FX_INT32 nHorzScale)
136{
137	m_pEdit->SetHorzScale(nHorzScale);
138}
139
140void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace)
141{
142	m_pEdit->SetCharSpace(fCharSpace);
143}
144
145CPDF_Rect CPWL_Label::GetContentRect() const
146{
147	return m_pEdit->GetContentRect();
148}
149
150void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
151{
152	CPWL_Wnd::GetThisAppearanceStream(sAppStream);
153
154	sAppStream << GetTextAppearanceStream(CPDF_Point(0.0f, 0.0f));
155}
156
157CFX_ByteString CPWL_Label::GetTextAppearanceStream(const CPDF_Point & ptOffset) const
158{
159	CFX_ByteTextBuf sRet;
160	CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset);
161
162	if (sEdit.GetLength() > 0)
163	{
164		sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << "ET\n";
165	}
166
167	return sRet.GetByteString();
168}
169
170CFX_WideString CPWL_Label::GetText() const
171{
172	return m_pEdit->GetText();
173}
174
175void CPWL_Label::SetLimitChar(FX_INT32 nLimitChar)
176{
177	m_pEdit->SetLimitChar(nLimitChar);
178}
179
180FX_INT32 CPWL_Label::GetTotalWords()
181{
182	if (m_pEdit)
183		return m_pEdit->GetTotalWords();
184
185	return 0;
186}
187
188