| Index: xfa/src/fxfa/src/app/xfa_fftext.cpp
|
| diff --git a/xfa/src/fxfa/src/app/xfa_fftext.cpp b/xfa/src/fxfa/src/app/xfa_fftext.cpp
|
| index a4dc78eb0041a036ca14d7300e390da2c0c4a8e2..854c72175aefeac1cf295d111e1ea42a15283acb 100644
|
| --- a/xfa/src/fxfa/src/app/xfa_fftext.cpp
|
| +++ b/xfa/src/fxfa/src/app/xfa_fftext.cpp
|
| @@ -1,177 +1,177 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include "xfa/src/foxitlib.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_common.h"
|
| -#include "xfa_ffwidget.h"
|
| -#include "xfa_ffdraw.h"
|
| -#include "xfa_fftext.h"
|
| -#include "xfa_textlayout.h"
|
| -#include "xfa_ffpageview.h"
|
| -#include "xfa_ffdoc.h"
|
| -#include "xfa_ffapp.h"
|
| -CXFA_FFText::CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
|
| - : CXFA_FFDraw(pPageView, pDataAcc) {}
|
| -CXFA_FFText::~CXFA_FFText() {}
|
| -void CXFA_FFText::RenderWidget(CFX_Graphics* pGS,
|
| - CFX_Matrix* pMatrix,
|
| - FX_DWORD dwStatus,
|
| - int32_t iRotate) {
|
| - if (!IsMatchVisibleStatus(dwStatus)) {
|
| - return;
|
| - }
|
| - {
|
| - CFX_Matrix mtRotate;
|
| - GetRotateMatrix(mtRotate);
|
| - if (pMatrix) {
|
| - mtRotate.Concat(*pMatrix);
|
| - }
|
| - CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
|
| - CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
|
| - if (pTextLayout) {
|
| - CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
|
| - CFX_RectF rtText;
|
| - GetRectWithoutRotate(rtText);
|
| - if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
|
| - CXFA_LayoutItem* pItem = this;
|
| - if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
|
| - XFA_RectWidthoutMargin(rtText, mgWidget);
|
| - } else {
|
| - FX_FLOAT fLeftInset, fRightInset, fTopInset = 0, fBottomInset = 0;
|
| - mgWidget.GetLeftInset(fLeftInset);
|
| - mgWidget.GetRightInset(fRightInset);
|
| - if (pItem->GetPrev() == NULL) {
|
| - mgWidget.GetTopInset(fTopInset);
|
| - } else if (pItem->GetNext() == NULL) {
|
| - mgWidget.GetBottomInset(fBottomInset);
|
| - }
|
| - rtText.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
|
| - }
|
| - }
|
| - CFX_Matrix mt;
|
| - mt.Set(1, 0, 0, 1, rtText.left, rtText.top);
|
| - CFX_RectF rtClip = rtText;
|
| - mtRotate.TransformRect(rtClip);
|
| - mt.Concat(mtRotate);
|
| - pTextLayout->DrawString(pRenderDevice, mt, rtClip, GetIndex());
|
| - }
|
| - }
|
| -}
|
| -FX_BOOL CXFA_FFText::IsLoaded() {
|
| - CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
|
| - return pTextLayout != NULL && !pTextLayout->m_bHasBlock;
|
| -}
|
| -FX_BOOL CXFA_FFText::PerformLayout() {
|
| - CXFA_FFDraw::PerformLayout();
|
| - CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
|
| - if (!pTextLayout) {
|
| - return FALSE;
|
| - }
|
| - if (!pTextLayout->m_bHasBlock) {
|
| - return TRUE;
|
| - }
|
| - pTextLayout->m_Blocks.RemoveAll();
|
| - CXFA_LayoutItem* pItem = this;
|
| - if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
|
| - return TRUE;
|
| - }
|
| - pItem = pItem->GetFirst();
|
| - while (pItem) {
|
| - CFX_RectF rtText;
|
| - pItem->GetRect(rtText);
|
| - if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
|
| - if (pItem->GetPrev() == NULL) {
|
| - FX_FLOAT fTopInset;
|
| - mgWidget.GetTopInset(fTopInset);
|
| - rtText.height -= fTopInset;
|
| - } else if (pItem->GetNext() == NULL) {
|
| - FX_FLOAT fBottomInset;
|
| - mgWidget.GetBottomInset(fBottomInset);
|
| - rtText.height -= fBottomInset;
|
| - }
|
| - }
|
| - pTextLayout->ItemBlocks(rtText, pItem->GetIndex());
|
| - pItem = pItem->GetNext();
|
| - }
|
| - pTextLayout->m_bHasBlock = FALSE;
|
| - return TRUE;
|
| -}
|
| -FX_BOOL CXFA_FFText::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
|
| - CFX_RectF rtBox;
|
| - GetRectWithoutRotate(rtBox);
|
| - if (!rtBox.Contains(fx, fy)) {
|
| - return FALSE;
|
| - }
|
| - const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
|
| - if (NULL == wsURLContent) {
|
| - return FALSE;
|
| - }
|
| - SetButtonDown(TRUE);
|
| - return TRUE;
|
| -}
|
| -FX_BOOL CXFA_FFText::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
|
| - CFX_RectF rtBox;
|
| - GetRectWithoutRotate(rtBox);
|
| - if (!rtBox.Contains(fx, fy)) {
|
| - return FALSE;
|
| - }
|
| - const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
|
| - if (NULL == wsURLContent) {
|
| - return FALSE;
|
| - }
|
| - return TRUE;
|
| -}
|
| -FX_BOOL CXFA_FFText::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
|
| - if (!IsButtonDown()) {
|
| - return FALSE;
|
| - }
|
| - SetButtonDown(FALSE);
|
| - const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
|
| - if (NULL == wsURLContent) {
|
| - return FALSE;
|
| - }
|
| - CXFA_FFDoc* pDoc = GetDoc();
|
| - pDoc->GetDocProvider()->GotoURL(pDoc, CFX_WideStringC(wsURLContent), FALSE);
|
| - return TRUE;
|
| -}
|
| -FX_DWORD CXFA_FFText::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
|
| - CFX_RectF rtBox;
|
| - GetRectWithoutRotate(rtBox);
|
| - if (!rtBox.Contains(fx, fy)) {
|
| - return FWL_WGTHITTEST_Unknown;
|
| - }
|
| - if (!GetLinkURLAtPoint(fx, fy)) {
|
| - return FWL_WGTHITTEST_Unknown;
|
| - }
|
| - return FWL_WGTHITTEST_HyperLink;
|
| -}
|
| -const FX_WCHAR* CXFA_FFText::GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
|
| - CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
|
| - if (NULL == pTextLayout) {
|
| - return NULL;
|
| - }
|
| - FX_FLOAT x(fx), y(fy);
|
| - FWLToClient(x, y);
|
| - const CXFA_PieceLineArray* pPieceLines = pTextLayout->GetPieceLines();
|
| - int32_t iCount = pPieceLines->GetSize();
|
| - for (int32_t i = 0; i < iCount; i++) {
|
| - CXFA_PieceLine* pPieceLine = pPieceLines->GetAt(i);
|
| - int32_t iPieces = pPieceLine->m_textPieces.GetSize();
|
| - for (int32_t j = 0; j < iPieces; j++) {
|
| - XFA_LPTEXTPIECE pPiece = pPieceLine->m_textPieces.GetAt(j);
|
| - if (pPiece->pLinkData && pPiece->rtPiece.Contains(x, y)) {
|
| - return pPiece->pLinkData->GetLinkURL();
|
| - }
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -void CXFA_FFText::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) {
|
| - CFX_RectF rtWidget;
|
| - GetRectWithoutRotate(rtWidget);
|
| - fx -= rtWidget.left;
|
| - fy -= rtWidget.top;
|
| -}
|
| +// Copyright 2014 PDFium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| +
|
| +#include "xfa/src/foxitlib.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_common.h"
|
| +#include "xfa_ffwidget.h"
|
| +#include "xfa_ffdraw.h"
|
| +#include "xfa_fftext.h"
|
| +#include "xfa_textlayout.h"
|
| +#include "xfa_ffpageview.h"
|
| +#include "xfa_ffdoc.h"
|
| +#include "xfa_ffapp.h"
|
| +CXFA_FFText::CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
|
| + : CXFA_FFDraw(pPageView, pDataAcc) {}
|
| +CXFA_FFText::~CXFA_FFText() {}
|
| +void CXFA_FFText::RenderWidget(CFX_Graphics* pGS,
|
| + CFX_Matrix* pMatrix,
|
| + FX_DWORD dwStatus,
|
| + int32_t iRotate) {
|
| + if (!IsMatchVisibleStatus(dwStatus)) {
|
| + return;
|
| + }
|
| + {
|
| + CFX_Matrix mtRotate;
|
| + GetRotateMatrix(mtRotate);
|
| + if (pMatrix) {
|
| + mtRotate.Concat(*pMatrix);
|
| + }
|
| + CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
|
| + CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
|
| + if (pTextLayout) {
|
| + CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
|
| + CFX_RectF rtText;
|
| + GetRectWithoutRotate(rtText);
|
| + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
|
| + CXFA_LayoutItem* pItem = this;
|
| + if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
|
| + XFA_RectWidthoutMargin(rtText, mgWidget);
|
| + } else {
|
| + FX_FLOAT fLeftInset, fRightInset, fTopInset = 0, fBottomInset = 0;
|
| + mgWidget.GetLeftInset(fLeftInset);
|
| + mgWidget.GetRightInset(fRightInset);
|
| + if (pItem->GetPrev() == NULL) {
|
| + mgWidget.GetTopInset(fTopInset);
|
| + } else if (pItem->GetNext() == NULL) {
|
| + mgWidget.GetBottomInset(fBottomInset);
|
| + }
|
| + rtText.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
|
| + }
|
| + }
|
| + CFX_Matrix mt;
|
| + mt.Set(1, 0, 0, 1, rtText.left, rtText.top);
|
| + CFX_RectF rtClip = rtText;
|
| + mtRotate.TransformRect(rtClip);
|
| + mt.Concat(mtRotate);
|
| + pTextLayout->DrawString(pRenderDevice, mt, rtClip, GetIndex());
|
| + }
|
| + }
|
| +}
|
| +FX_BOOL CXFA_FFText::IsLoaded() {
|
| + CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
|
| + return pTextLayout != NULL && !pTextLayout->m_bHasBlock;
|
| +}
|
| +FX_BOOL CXFA_FFText::PerformLayout() {
|
| + CXFA_FFDraw::PerformLayout();
|
| + CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
|
| + if (!pTextLayout) {
|
| + return FALSE;
|
| + }
|
| + if (!pTextLayout->m_bHasBlock) {
|
| + return TRUE;
|
| + }
|
| + pTextLayout->m_Blocks.RemoveAll();
|
| + CXFA_LayoutItem* pItem = this;
|
| + if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
|
| + return TRUE;
|
| + }
|
| + pItem = pItem->GetFirst();
|
| + while (pItem) {
|
| + CFX_RectF rtText;
|
| + pItem->GetRect(rtText);
|
| + if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
|
| + if (pItem->GetPrev() == NULL) {
|
| + FX_FLOAT fTopInset;
|
| + mgWidget.GetTopInset(fTopInset);
|
| + rtText.height -= fTopInset;
|
| + } else if (pItem->GetNext() == NULL) {
|
| + FX_FLOAT fBottomInset;
|
| + mgWidget.GetBottomInset(fBottomInset);
|
| + rtText.height -= fBottomInset;
|
| + }
|
| + }
|
| + pTextLayout->ItemBlocks(rtText, pItem->GetIndex());
|
| + pItem = pItem->GetNext();
|
| + }
|
| + pTextLayout->m_bHasBlock = FALSE;
|
| + return TRUE;
|
| +}
|
| +FX_BOOL CXFA_FFText::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
|
| + CFX_RectF rtBox;
|
| + GetRectWithoutRotate(rtBox);
|
| + if (!rtBox.Contains(fx, fy)) {
|
| + return FALSE;
|
| + }
|
| + const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
|
| + if (NULL == wsURLContent) {
|
| + return FALSE;
|
| + }
|
| + SetButtonDown(TRUE);
|
| + return TRUE;
|
| +}
|
| +FX_BOOL CXFA_FFText::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
|
| + CFX_RectF rtBox;
|
| + GetRectWithoutRotate(rtBox);
|
| + if (!rtBox.Contains(fx, fy)) {
|
| + return FALSE;
|
| + }
|
| + const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
|
| + if (NULL == wsURLContent) {
|
| + return FALSE;
|
| + }
|
| + return TRUE;
|
| +}
|
| +FX_BOOL CXFA_FFText::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
|
| + if (!IsButtonDown()) {
|
| + return FALSE;
|
| + }
|
| + SetButtonDown(FALSE);
|
| + const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
|
| + if (NULL == wsURLContent) {
|
| + return FALSE;
|
| + }
|
| + CXFA_FFDoc* pDoc = GetDoc();
|
| + pDoc->GetDocProvider()->GotoURL(pDoc, CFX_WideStringC(wsURLContent), FALSE);
|
| + return TRUE;
|
| +}
|
| +FX_DWORD CXFA_FFText::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
|
| + CFX_RectF rtBox;
|
| + GetRectWithoutRotate(rtBox);
|
| + if (!rtBox.Contains(fx, fy)) {
|
| + return FWL_WGTHITTEST_Unknown;
|
| + }
|
| + if (!GetLinkURLAtPoint(fx, fy)) {
|
| + return FWL_WGTHITTEST_Unknown;
|
| + }
|
| + return FWL_WGTHITTEST_HyperLink;
|
| +}
|
| +const FX_WCHAR* CXFA_FFText::GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
|
| + CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
|
| + if (NULL == pTextLayout) {
|
| + return NULL;
|
| + }
|
| + FX_FLOAT x(fx), y(fy);
|
| + FWLToClient(x, y);
|
| + const CXFA_PieceLineArray* pPieceLines = pTextLayout->GetPieceLines();
|
| + int32_t iCount = pPieceLines->GetSize();
|
| + for (int32_t i = 0; i < iCount; i++) {
|
| + CXFA_PieceLine* pPieceLine = pPieceLines->GetAt(i);
|
| + int32_t iPieces = pPieceLine->m_textPieces.GetSize();
|
| + for (int32_t j = 0; j < iPieces; j++) {
|
| + XFA_LPTEXTPIECE pPiece = pPieceLine->m_textPieces.GetAt(j);
|
| + if (pPiece->pLinkData && pPiece->rtPiece.Contains(x, y)) {
|
| + return pPiece->pLinkData->GetLinkURL();
|
| + }
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +void CXFA_FFText::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) {
|
| + CFX_RectF rtWidget;
|
| + GetRectWithoutRotate(rtWidget);
|
| + fx -= rtWidget.left;
|
| + fy -= rtWidget.top;
|
| +}
|
|
|