| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fxfa/app/xfa_fftext.h" | 7 #include "xfa/fxfa/app/xfa_fftext.h" |
| 8 | 8 |
| 9 #include "xfa/fwl/core/fwl_widgetdef.h" | 9 #include "xfa/fwl/core/fwl_widgetdef.h" |
| 10 #include "xfa/fxfa/app/xfa_ffdraw.h" | 10 #include "xfa/fxfa/app/xfa_ffdraw.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 mtRotate.Concat(*pMatrix); | 32 mtRotate.Concat(*pMatrix); |
| 33 } | 33 } |
| 34 CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); | 34 CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); |
| 35 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); | 35 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); |
| 36 if (pTextLayout) { | 36 if (pTextLayout) { |
| 37 CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice(); | 37 CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice(); |
| 38 CFX_RectF rtText; | 38 CFX_RectF rtText; |
| 39 GetRectWithoutRotate(rtText); | 39 GetRectWithoutRotate(rtText); |
| 40 if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { | 40 if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { |
| 41 CXFA_LayoutItem* pItem = this; | 41 CXFA_LayoutItem* pItem = this; |
| 42 if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) { | 42 if (!pItem->GetPrev() && !pItem->GetNext()) { |
| 43 XFA_RectWidthoutMargin(rtText, mgWidget); | 43 XFA_RectWidthoutMargin(rtText, mgWidget); |
| 44 } else { | 44 } else { |
| 45 FX_FLOAT fLeftInset, fRightInset, fTopInset = 0, fBottomInset = 0; | 45 FX_FLOAT fLeftInset, fRightInset, fTopInset = 0, fBottomInset = 0; |
| 46 mgWidget.GetLeftInset(fLeftInset); | 46 mgWidget.GetLeftInset(fLeftInset); |
| 47 mgWidget.GetRightInset(fRightInset); | 47 mgWidget.GetRightInset(fRightInset); |
| 48 if (pItem->GetPrev() == NULL) { | 48 if (!pItem->GetPrev()) { |
| 49 mgWidget.GetTopInset(fTopInset); | 49 mgWidget.GetTopInset(fTopInset); |
| 50 } else if (pItem->GetNext() == NULL) { | 50 } else if (!pItem->GetNext()) { |
| 51 mgWidget.GetBottomInset(fBottomInset); | 51 mgWidget.GetBottomInset(fBottomInset); |
| 52 } | 52 } |
| 53 rtText.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset); | 53 rtText.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset); |
| 54 } | 54 } |
| 55 } | 55 } |
| 56 CFX_Matrix mt; | 56 CFX_Matrix mt; |
| 57 mt.Set(1, 0, 0, 1, rtText.left, rtText.top); | 57 mt.Set(1, 0, 0, 1, rtText.left, rtText.top); |
| 58 CFX_RectF rtClip = rtText; | 58 CFX_RectF rtClip = rtText; |
| 59 mtRotate.TransformRect(rtClip); | 59 mtRotate.TransformRect(rtClip); |
| 60 mt.Concat(mtRotate); | 60 mt.Concat(mtRotate); |
| 61 pTextLayout->DrawString(pRenderDevice, mt, rtClip, GetIndex()); | 61 pTextLayout->DrawString(pRenderDevice, mt, rtClip, GetIndex()); |
| 62 } | 62 } |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 FX_BOOL CXFA_FFText::IsLoaded() { | 65 FX_BOOL CXFA_FFText::IsLoaded() { |
| 66 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); | 66 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); |
| 67 return pTextLayout && !pTextLayout->m_bHasBlock; | 67 return pTextLayout && !pTextLayout->m_bHasBlock; |
| 68 } | 68 } |
| 69 FX_BOOL CXFA_FFText::PerformLayout() { | 69 FX_BOOL CXFA_FFText::PerformLayout() { |
| 70 CXFA_FFDraw::PerformLayout(); | 70 CXFA_FFDraw::PerformLayout(); |
| 71 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); | 71 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); |
| 72 if (!pTextLayout) { | 72 if (!pTextLayout) { |
| 73 return FALSE; | 73 return FALSE; |
| 74 } | 74 } |
| 75 if (!pTextLayout->m_bHasBlock) { | 75 if (!pTextLayout->m_bHasBlock) { |
| 76 return TRUE; | 76 return TRUE; |
| 77 } | 77 } |
| 78 pTextLayout->m_Blocks.RemoveAll(); | 78 pTextLayout->m_Blocks.RemoveAll(); |
| 79 CXFA_LayoutItem* pItem = this; | 79 CXFA_LayoutItem* pItem = this; |
| 80 if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) { | 80 if (!pItem->GetPrev() && !pItem->GetNext()) { |
| 81 return TRUE; | 81 return TRUE; |
| 82 } | 82 } |
| 83 pItem = pItem->GetFirst(); | 83 pItem = pItem->GetFirst(); |
| 84 while (pItem) { | 84 while (pItem) { |
| 85 CFX_RectF rtText; | 85 CFX_RectF rtText; |
| 86 pItem->GetRect(rtText); | 86 pItem->GetRect(rtText); |
| 87 if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { | 87 if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { |
| 88 if (pItem->GetPrev() == NULL) { | 88 if (!pItem->GetPrev()) { |
| 89 FX_FLOAT fTopInset; | 89 FX_FLOAT fTopInset; |
| 90 mgWidget.GetTopInset(fTopInset); | 90 mgWidget.GetTopInset(fTopInset); |
| 91 rtText.height -= fTopInset; | 91 rtText.height -= fTopInset; |
| 92 } else if (pItem->GetNext() == NULL) { | 92 } else if (!pItem->GetNext()) { |
| 93 FX_FLOAT fBottomInset; | 93 FX_FLOAT fBottomInset; |
| 94 mgWidget.GetBottomInset(fBottomInset); | 94 mgWidget.GetBottomInset(fBottomInset); |
| 95 rtText.height -= fBottomInset; | 95 rtText.height -= fBottomInset; |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 pTextLayout->ItemBlocks(rtText, pItem->GetIndex()); | 98 pTextLayout->ItemBlocks(rtText, pItem->GetIndex()); |
| 99 pItem = pItem->GetNext(); | 99 pItem = pItem->GetNext(); |
| 100 } | 100 } |
| 101 pTextLayout->m_bHasBlock = FALSE; | 101 pTextLayout->m_bHasBlock = FALSE; |
| 102 return TRUE; | 102 return TRUE; |
| 103 } | 103 } |
| 104 FX_BOOL CXFA_FFText::OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) { | 104 FX_BOOL CXFA_FFText::OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) { |
| 105 CFX_RectF rtBox; | 105 CFX_RectF rtBox; |
| 106 GetRectWithoutRotate(rtBox); | 106 GetRectWithoutRotate(rtBox); |
| 107 if (!rtBox.Contains(fx, fy)) { | 107 if (!rtBox.Contains(fx, fy)) { |
| 108 return FALSE; | 108 return FALSE; |
| 109 } | 109 } |
| 110 const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy); | 110 const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy); |
| 111 if (NULL == wsURLContent) { | 111 if (!wsURLContent) |
| 112 return FALSE; | 112 return FALSE; |
| 113 } | 113 |
| 114 SetButtonDown(TRUE); | 114 SetButtonDown(TRUE); |
| 115 return TRUE; | 115 return TRUE; |
| 116 } | 116 } |
| 117 |
| 117 FX_BOOL CXFA_FFText::OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) { | 118 FX_BOOL CXFA_FFText::OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) { |
| 118 CFX_RectF rtBox; | 119 CFX_RectF rtBox; |
| 119 GetRectWithoutRotate(rtBox); | 120 GetRectWithoutRotate(rtBox); |
| 120 if (!rtBox.Contains(fx, fy)) { | 121 if (!rtBox.Contains(fx, fy)) |
| 121 return FALSE; | 122 return FALSE; |
| 122 } | 123 return !!GetLinkURLAtPoint(fx, fy); |
| 123 const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy); | |
| 124 if (NULL == wsURLContent) { | |
| 125 return FALSE; | |
| 126 } | |
| 127 return TRUE; | |
| 128 } | 124 } |
| 125 |
| 129 FX_BOOL CXFA_FFText::OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) { | 126 FX_BOOL CXFA_FFText::OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) { |
| 130 if (!IsButtonDown()) { | 127 if (!IsButtonDown()) { |
| 131 return FALSE; | 128 return FALSE; |
| 132 } | 129 } |
| 133 SetButtonDown(FALSE); | 130 SetButtonDown(FALSE); |
| 134 const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy); | 131 const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy); |
| 135 if (NULL == wsURLContent) { | 132 if (!wsURLContent) |
| 136 return FALSE; | 133 return FALSE; |
| 137 } | 134 |
| 138 CXFA_FFDoc* pDoc = GetDoc(); | 135 CXFA_FFDoc* pDoc = GetDoc(); |
| 139 pDoc->GetDocProvider()->GotoURL(pDoc, wsURLContent, FALSE); | 136 pDoc->GetDocProvider()->GotoURL(pDoc, wsURLContent, FALSE); |
| 140 return TRUE; | 137 return TRUE; |
| 141 } | 138 } |
| 139 |
| 142 FWL_WidgetHit CXFA_FFText::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) { | 140 FWL_WidgetHit CXFA_FFText::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) { |
| 143 CFX_RectF rtBox; | 141 CFX_RectF rtBox; |
| 144 GetRectWithoutRotate(rtBox); | 142 GetRectWithoutRotate(rtBox); |
| 145 if (!rtBox.Contains(fx, fy)) | 143 if (!rtBox.Contains(fx, fy)) |
| 146 return FWL_WidgetHit::Unknown; | 144 return FWL_WidgetHit::Unknown; |
| 147 if (!GetLinkURLAtPoint(fx, fy)) | 145 if (!GetLinkURLAtPoint(fx, fy)) |
| 148 return FWL_WidgetHit::Unknown; | 146 return FWL_WidgetHit::Unknown; |
| 149 return FWL_WidgetHit::HyperLink; | 147 return FWL_WidgetHit::HyperLink; |
| 150 } | 148 } |
| 151 const FX_WCHAR* CXFA_FFText::GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy) { | 149 const FX_WCHAR* CXFA_FFText::GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy) { |
| 152 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); | 150 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); |
| 153 if (NULL == pTextLayout) { | 151 if (!pTextLayout) |
| 154 return NULL; | 152 return nullptr; |
| 155 } | 153 |
| 156 FX_FLOAT x(fx), y(fy); | 154 FX_FLOAT x(fx), y(fy); |
| 157 FWLToClient(x, y); | 155 FWLToClient(x, y); |
| 158 const CXFA_PieceLineArray* pPieceLines = pTextLayout->GetPieceLines(); | 156 const CXFA_PieceLineArray* pPieceLines = pTextLayout->GetPieceLines(); |
| 159 int32_t iCount = pPieceLines->GetSize(); | 157 int32_t iCount = pPieceLines->GetSize(); |
| 160 for (int32_t i = 0; i < iCount; i++) { | 158 for (int32_t i = 0; i < iCount; i++) { |
| 161 CXFA_PieceLine* pPieceLine = pPieceLines->GetAt(i); | 159 CXFA_PieceLine* pPieceLine = pPieceLines->GetAt(i); |
| 162 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); | 160 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); |
| 163 for (int32_t j = 0; j < iPieces; j++) { | 161 for (int32_t j = 0; j < iPieces; j++) { |
| 164 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j); | 162 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j); |
| 165 if (pPiece->pLinkData && pPiece->rtPiece.Contains(x, y)) { | 163 if (pPiece->pLinkData && pPiece->rtPiece.Contains(x, y)) { |
| 166 return pPiece->pLinkData->GetLinkURL(); | 164 return pPiece->pLinkData->GetLinkURL(); |
| 167 } | 165 } |
| 168 } | 166 } |
| 169 } | 167 } |
| 170 return NULL; | 168 return nullptr; |
| 171 } | 169 } |
| 172 void CXFA_FFText::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) { | 170 void CXFA_FFText::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) { |
| 173 CFX_RectF rtWidget; | 171 CFX_RectF rtWidget; |
| 174 GetRectWithoutRotate(rtWidget); | 172 GetRectWithoutRotate(rtWidget); |
| 175 fx -= rtWidget.left; | 173 fx -= rtWidget.left; |
| 176 fy -= rtWidget.top; | 174 fy -= rtWidget.top; |
| 177 } | 175 } |
| OLD | NEW |