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