OLD | NEW |
| (Empty) |
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 "xfa/src/fxfa/app/xfa_fftext.h" | |
8 | |
9 #include "xfa/include/fwl/core/fwl_widgetdef.h" | |
10 #include "xfa/include/fxgraphics/fx_graphics.h" | |
11 #include "xfa/src/fxfa/app/xfa_ffapp.h" | |
12 #include "xfa/src/fxfa/app/xfa_ffdoc.h" | |
13 #include "xfa/src/fxfa/app/xfa_ffdraw.h" | |
14 #include "xfa/src/fxfa/app/xfa_ffpageview.h" | |
15 #include "xfa/src/fxfa/app/xfa_ffwidget.h" | |
16 #include "xfa/src/fxfa/app/xfa_textlayout.h" | |
17 | |
18 CXFA_FFText::CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc) | |
19 : CXFA_FFDraw(pPageView, pDataAcc) {} | |
20 CXFA_FFText::~CXFA_FFText() {} | |
21 void CXFA_FFText::RenderWidget(CFX_Graphics* pGS, | |
22 CFX_Matrix* pMatrix, | |
23 FX_DWORD dwStatus, | |
24 int32_t iRotate) { | |
25 if (!IsMatchVisibleStatus(dwStatus)) { | |
26 return; | |
27 } | |
28 { | |
29 CFX_Matrix mtRotate; | |
30 GetRotateMatrix(mtRotate); | |
31 if (pMatrix) { | |
32 mtRotate.Concat(*pMatrix); | |
33 } | |
34 CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus); | |
35 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); | |
36 if (pTextLayout) { | |
37 CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice(); | |
38 CFX_RectF rtText; | |
39 GetRectWithoutRotate(rtText); | |
40 if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { | |
41 CXFA_LayoutItem* pItem = this; | |
42 if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) { | |
43 XFA_RectWidthoutMargin(rtText, mgWidget); | |
44 } else { | |
45 FX_FLOAT fLeftInset, fRightInset, fTopInset = 0, fBottomInset = 0; | |
46 mgWidget.GetLeftInset(fLeftInset); | |
47 mgWidget.GetRightInset(fRightInset); | |
48 if (pItem->GetPrev() == NULL) { | |
49 mgWidget.GetTopInset(fTopInset); | |
50 } else if (pItem->GetNext() == NULL) { | |
51 mgWidget.GetBottomInset(fBottomInset); | |
52 } | |
53 rtText.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset); | |
54 } | |
55 } | |
56 CFX_Matrix mt; | |
57 mt.Set(1, 0, 0, 1, rtText.left, rtText.top); | |
58 CFX_RectF rtClip = rtText; | |
59 mtRotate.TransformRect(rtClip); | |
60 mt.Concat(mtRotate); | |
61 pTextLayout->DrawString(pRenderDevice, mt, rtClip, GetIndex()); | |
62 } | |
63 } | |
64 } | |
65 FX_BOOL CXFA_FFText::IsLoaded() { | |
66 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); | |
67 return pTextLayout && !pTextLayout->m_bHasBlock; | |
68 } | |
69 FX_BOOL CXFA_FFText::PerformLayout() { | |
70 CXFA_FFDraw::PerformLayout(); | |
71 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); | |
72 if (!pTextLayout) { | |
73 return FALSE; | |
74 } | |
75 if (!pTextLayout->m_bHasBlock) { | |
76 return TRUE; | |
77 } | |
78 pTextLayout->m_Blocks.RemoveAll(); | |
79 CXFA_LayoutItem* pItem = this; | |
80 if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) { | |
81 return TRUE; | |
82 } | |
83 pItem = pItem->GetFirst(); | |
84 while (pItem) { | |
85 CFX_RectF rtText; | |
86 pItem->GetRect(rtText); | |
87 if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) { | |
88 if (pItem->GetPrev() == NULL) { | |
89 FX_FLOAT fTopInset; | |
90 mgWidget.GetTopInset(fTopInset); | |
91 rtText.height -= fTopInset; | |
92 } else if (pItem->GetNext() == NULL) { | |
93 FX_FLOAT fBottomInset; | |
94 mgWidget.GetBottomInset(fBottomInset); | |
95 rtText.height -= fBottomInset; | |
96 } | |
97 } | |
98 pTextLayout->ItemBlocks(rtText, pItem->GetIndex()); | |
99 pItem = pItem->GetNext(); | |
100 } | |
101 pTextLayout->m_bHasBlock = FALSE; | |
102 return TRUE; | |
103 } | |
104 FX_BOOL CXFA_FFText::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) { | |
105 CFX_RectF rtBox; | |
106 GetRectWithoutRotate(rtBox); | |
107 if (!rtBox.Contains(fx, fy)) { | |
108 return FALSE; | |
109 } | |
110 const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy); | |
111 if (NULL == wsURLContent) { | |
112 return FALSE; | |
113 } | |
114 SetButtonDown(TRUE); | |
115 return TRUE; | |
116 } | |
117 FX_BOOL CXFA_FFText::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) { | |
118 CFX_RectF rtBox; | |
119 GetRectWithoutRotate(rtBox); | |
120 if (!rtBox.Contains(fx, fy)) { | |
121 return FALSE; | |
122 } | |
123 const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy); | |
124 if (NULL == wsURLContent) { | |
125 return FALSE; | |
126 } | |
127 return TRUE; | |
128 } | |
129 FX_BOOL CXFA_FFText::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) { | |
130 if (!IsButtonDown()) { | |
131 return FALSE; | |
132 } | |
133 SetButtonDown(FALSE); | |
134 const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy); | |
135 if (NULL == wsURLContent) { | |
136 return FALSE; | |
137 } | |
138 CXFA_FFDoc* pDoc = GetDoc(); | |
139 pDoc->GetDocProvider()->GotoURL(pDoc, CFX_WideStringC(wsURLContent), FALSE); | |
140 return TRUE; | |
141 } | |
142 FX_DWORD CXFA_FFText::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) { | |
143 CFX_RectF rtBox; | |
144 GetRectWithoutRotate(rtBox); | |
145 if (!rtBox.Contains(fx, fy)) { | |
146 return FWL_WGTHITTEST_Unknown; | |
147 } | |
148 if (!GetLinkURLAtPoint(fx, fy)) { | |
149 return FWL_WGTHITTEST_Unknown; | |
150 } | |
151 return FWL_WGTHITTEST_HyperLink; | |
152 } | |
153 const FX_WCHAR* CXFA_FFText::GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy) { | |
154 CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout(); | |
155 if (NULL == pTextLayout) { | |
156 return NULL; | |
157 } | |
158 FX_FLOAT x(fx), y(fy); | |
159 FWLToClient(x, y); | |
160 const CXFA_PieceLineArray* pPieceLines = pTextLayout->GetPieceLines(); | |
161 int32_t iCount = pPieceLines->GetSize(); | |
162 for (int32_t i = 0; i < iCount; i++) { | |
163 CXFA_PieceLine* pPieceLine = pPieceLines->GetAt(i); | |
164 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); | |
165 for (int32_t j = 0; j < iPieces; j++) { | |
166 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j); | |
167 if (pPiece->pLinkData && pPiece->rtPiece.Contains(x, y)) { | |
168 return pPiece->pLinkData->GetLinkURL(); | |
169 } | |
170 } | |
171 } | |
172 return NULL; | |
173 } | |
174 void CXFA_FFText::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) { | |
175 CFX_RectF rtWidget; | |
176 GetRectWithoutRotate(rtWidget); | |
177 fx -= rtWidget.left; | |
178 fy -= rtWidget.top; | |
179 } | |
OLD | NEW |