Home | History | Annotate | Download | only in pdfwindow
      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 
     11 CPWL_Label::CPWL_Label() : m_pEdit(NULL) {
     12   m_pEdit = IFX_Edit::NewEdit();
     13   ASSERT(m_pEdit);
     14 }
     15 
     16 CPWL_Label::~CPWL_Label() {
     17   IFX_Edit::DelEdit(m_pEdit);
     18 }
     19 
     20 CFX_ByteString CPWL_Label::GetClassName() const {
     21   return "CPWL_Label";
     22 }
     23 
     24 void 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 
     37 void CPWL_Label::SetText(const FX_WCHAR* csText) {
     38   m_pEdit->SetText(csText);
     39 }
     40 
     41 void CPWL_Label::RePosChildWnd() {
     42   m_pEdit->SetPlateRect(GetClientRect());
     43 }
     44 
     45 void CPWL_Label::SetFontSize(FX_FLOAT fFontSize) {
     46   m_pEdit->SetFontSize(fFontSize);
     47 }
     48 
     49 FX_FLOAT CPWL_Label::GetFontSize() const {
     50   return m_pEdit->GetFontSize();
     51 }
     52 
     53 void 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 
     84 void 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 
    106 void CPWL_Label::SetHorzScale(int32_t nHorzScale) {
    107   m_pEdit->SetHorzScale(nHorzScale);
    108 }
    109 
    110 void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace) {
    111   m_pEdit->SetCharSpace(fCharSpace);
    112 }
    113 
    114 CPDF_Rect CPWL_Label::GetContentRect() const {
    115   return m_pEdit->GetContentRect();
    116 }
    117 
    118 void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
    119   CPWL_Wnd::GetThisAppearanceStream(sAppStream);
    120 
    121   sAppStream << GetTextAppearanceStream(CPDF_Point(0.0f, 0.0f));
    122 }
    123 
    124 CFX_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 
    137 CFX_WideString CPWL_Label::GetText() const {
    138   return m_pEdit->GetText();
    139 }
    140 
    141 void CPWL_Label::SetLimitChar(int32_t nLimitChar) {
    142   m_pEdit->SetLimitChar(nLimitChar);
    143 }
    144 
    145 int32_t CPWL_Label::GetTotalWords() {
    146   if (m_pEdit)
    147     return m_pEdit->GetTotalWords();
    148 
    149   return 0;
    150 }
    151