Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(657)

Side by Side Diff: xfa/src/fwl/core/fwl_gridimp.cpp

Issue 1803723002: Move xfa/src up to xfa/. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/src/fwl/core/fwl_gridimp.h ('k') | xfa/src/fwl/core/fwl_noteimp.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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/fwl/core/fwl_gridimp.h"
8
9 #include "xfa/src/fwl/core/fwl_contentimp.h"
10 #include "xfa/src/fwl/core/fwl_noteimp.h"
11 #include "xfa/src/fwl/core/fwl_targetimp.h"
12 #include "xfa/src/fwl/core/fwl_threadimp.h"
13 #include "xfa/src/fwl/core/fwl_widgetimp.h"
14
15 // static
16 IFWL_Grid* IFWL_Grid::Create(const CFWL_WidgetImpProperties& properties) {
17 IFWL_Grid* pGrid = new IFWL_Grid;
18 CFWL_GridImp* pGridImpl = new CFWL_GridImp(properties, nullptr);
19 pGrid->SetImpl(pGridImpl);
20 pGridImpl->SetInterface(pGrid);
21 return pGrid;
22 }
23 IFWL_Grid::IFWL_Grid() {}
24 FWL_HGRIDCOLROW IFWL_Grid::InsertColRow(FX_BOOL bColumn, int32_t nIndex) {
25 return static_cast<CFWL_GridImp*>(GetImpl())->InsertColRow(bColumn, nIndex);
26 }
27 int32_t IFWL_Grid::CountColRows(FX_BOOL bColumn) {
28 return static_cast<CFWL_GridImp*>(GetImpl())->CountColRows(bColumn);
29 }
30 FWL_HGRIDCOLROW IFWL_Grid::GetColRow(FX_BOOL bColumn, int32_t nIndex) {
31 return static_cast<CFWL_GridImp*>(GetImpl())->GetColRow(bColumn, nIndex);
32 }
33 int32_t IFWL_Grid::GetIndex(FWL_HGRIDCOLROW hColRow) {
34 return static_cast<CFWL_GridImp*>(GetImpl())->GetIndex(hColRow);
35 }
36 FX_FLOAT IFWL_Grid::GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
37 return static_cast<CFWL_GridImp*>(GetImpl())->GetSize(hColRow, eUnit);
38 }
39 FWL_ERR IFWL_Grid::SetSize(FWL_HGRIDCOLROW hColRow,
40 FX_FLOAT fSize,
41 FWL_GRIDUNIT eUnit) {
42 return static_cast<CFWL_GridImp*>(GetImpl())->SetSize(hColRow, fSize, eUnit);
43 }
44 FX_FLOAT IFWL_Grid::GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
45 return static_cast<CFWL_GridImp*>(GetImpl())->GetMinSize(hColRow, eUnit);
46 }
47 FWL_ERR IFWL_Grid::SetMinSize(FWL_HGRIDCOLROW hColRow,
48 FX_FLOAT fSize,
49 FWL_GRIDUNIT eUnit) {
50 return static_cast<CFWL_GridImp*>(GetImpl())
51 ->SetMinSize(hColRow, fSize, eUnit);
52 }
53 FX_FLOAT IFWL_Grid::GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
54 return static_cast<CFWL_GridImp*>(GetImpl())->GetMaxSize(hColRow, eUnit);
55 }
56 FWL_ERR IFWL_Grid::SetMaxSize(FWL_HGRIDCOLROW hColRow,
57 FX_FLOAT fSize,
58 FWL_GRIDUNIT eUnit) {
59 return static_cast<CFWL_GridImp*>(GetImpl())
60 ->SetMaxSize(hColRow, fSize, eUnit);
61 }
62 FX_BOOL IFWL_Grid::DeleteColRow(FWL_HGRIDCOLROW hColRow) {
63 return static_cast<CFWL_GridImp*>(GetImpl())->DeleteColRow(hColRow);
64 }
65 FX_BOOL IFWL_Grid::IsColumn(FWL_HGRIDCOLROW hColRow) {
66 return static_cast<CFWL_GridImp*>(GetImpl())->IsColumn(hColRow);
67 }
68 int32_t IFWL_Grid::GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn) {
69 return static_cast<CFWL_GridImp*>(GetImpl())->GetWidgetPos(pWidget, bColumn);
70 }
71 FWL_ERR IFWL_Grid::SetWidgetPos(IFWL_Widget* pWidget,
72 int32_t iPos,
73 FX_BOOL bColumn) {
74 return static_cast<CFWL_GridImp*>(GetImpl())
75 ->SetWidgetPos(pWidget, iPos, bColumn);
76 }
77 int32_t IFWL_Grid::GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn) {
78 return static_cast<CFWL_GridImp*>(GetImpl())->GetWidgetSpan(pWidget, bColumn);
79 }
80 FWL_ERR IFWL_Grid::SetWidgetSpan(IFWL_Widget* pWidget,
81 int32_t iSpan,
82 FX_BOOL bColumn) {
83 return static_cast<CFWL_GridImp*>(GetImpl())
84 ->SetWidgetSpan(pWidget, iSpan, bColumn);
85 }
86 FX_FLOAT IFWL_Grid::GetWidgetSize(IFWL_Widget* pWidget,
87 FWL_GRIDSIZE eSize,
88 FWL_GRIDUNIT& eUnit) {
89 return static_cast<CFWL_GridImp*>(GetImpl())
90 ->GetWidgetSize(pWidget, eSize, eUnit);
91 }
92 FWL_ERR IFWL_Grid::SetWidgetSize(IFWL_Widget* pWidget,
93 FWL_GRIDSIZE eSize,
94 FX_FLOAT fSize,
95 FWL_GRIDUNIT eUit) {
96 return static_cast<CFWL_GridImp*>(GetImpl())
97 ->SetWidgetSize(pWidget, eSize, fSize, eUit);
98 }
99 FX_BOOL IFWL_Grid::GetWidgetMargin(IFWL_Widget* pWidget,
100 FWL_GRIDMARGIN eMargin,
101 FX_FLOAT& fMargin) {
102 return static_cast<CFWL_GridImp*>(GetImpl())
103 ->GetWidgetMargin(pWidget, eMargin, fMargin);
104 }
105 FWL_ERR IFWL_Grid::SetWidgetMargin(IFWL_Widget* pWidget,
106 FWL_GRIDMARGIN eMargin,
107 FX_FLOAT fMargin) {
108 return static_cast<CFWL_GridImp*>(GetImpl())
109 ->SetWidgetMargin(pWidget, eMargin, fMargin);
110 }
111 FWL_ERR IFWL_Grid::RemoveWidgetMargin(IFWL_Widget* pWidget,
112 FWL_GRIDMARGIN eMargin) {
113 return static_cast<CFWL_GridImp*>(GetImpl())
114 ->RemoveWidgetMargin(pWidget, eMargin);
115 }
116 FX_FLOAT IFWL_Grid::GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit) {
117 return static_cast<CFWL_GridImp*>(GetImpl())->GetGridSize(eSize, eUnit);
118 }
119 FWL_ERR IFWL_Grid::SetGridSize(FWL_GRIDSIZE eSize,
120 FX_FLOAT fSize,
121 FWL_GRIDUNIT eUit) {
122 return static_cast<CFWL_GridImp*>(GetImpl())->SetGridSize(eSize, fSize, eUit);
123 }
124
125 CFWL_GridImp::CFWL_GridImp(const CFWL_WidgetImpProperties& properties,
126 IFWL_Widget* pOuter)
127 : CFWL_ContentImp(properties, pOuter) {
128 m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto;
129 m_Size[FWL_GRIDSIZE_Width].fLength = 0;
130 m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto;
131 m_Size[FWL_GRIDSIZE_Height].fLength = 0;
132 m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed;
133 m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0;
134 m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity;
135 m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0;
136 m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed;
137 m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0;
138 m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity;
139 m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0;
140 }
141 CFWL_GridImp::~CFWL_GridImp() {
142 int32_t iCount = m_Columns.GetSize();
143 for (int32_t i = 0; i < iCount; i++) {
144 delete static_cast<CFWL_GridColRow*>(m_Columns[i]);
145 }
146 m_Columns.RemoveAll();
147 iCount = m_Rows.GetSize();
148 for (int32_t j = 0; j < iCount; j++) {
149 delete static_cast<CFWL_GridColRow*>(m_Rows[j]);
150 }
151 m_Rows.RemoveAll();
152 FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
153 while (ps) {
154 IFWL_Widget* pWidget;
155 CFWL_GridWidgetInfo* pInfo;
156 m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
157 delete pInfo;
158 }
159 m_mapWidgetInfo.RemoveAll();
160 delete m_pDelegate;
161 m_pDelegate = nullptr;
162 }
163 FWL_ERR CFWL_GridImp::GetClassName(CFX_WideString& wsClass) const {
164 wsClass = FWL_CLASS_Grid;
165 return FWL_ERR_Succeeded;
166 }
167 FX_DWORD CFWL_GridImp::GetClassID() const {
168 return FWL_CLASSHASH_Grid;
169 }
170 FWL_ERR CFWL_GridImp::Initialize() {
171 if (CFWL_ContentImp::Initialize() != FWL_ERR_Succeeded)
172 return FWL_ERR_Indefinite;
173 m_pDelegate = new CFWL_GridImpDelegate(this);
174 return FWL_ERR_Succeeded;
175 }
176 FWL_ERR CFWL_GridImp::Finalize() {
177 if (CFWL_ContentImp::Finalize() != FWL_ERR_Succeeded)
178 return FWL_ERR_Indefinite;
179 delete m_pDelegate;
180 m_pDelegate = nullptr;
181 return FWL_ERR_Succeeded;
182 }
183 FWL_ERR CFWL_GridImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
184 if (bAutoSize) {
185 rect.left = 0;
186 rect.top = 0;
187 rect.width = ProcessUnCertainColumns();
188 rect.height = ProcessUnCertainRows();
189 } else {
190 rect = m_pProperties->m_rtWidget;
191 }
192 return FWL_ERR_Succeeded;
193 }
194 FWL_ERR CFWL_GridImp::SetWidgetRect(const CFX_RectF& rect) {
195 CFWL_WidgetImp::SetWidgetRect(rect);
196 return FWL_ERR_Succeeded;
197 }
198 FWL_ERR CFWL_GridImp::Update() {
199 if (IsLocked()) {
200 return FWL_ERR_Indefinite;
201 }
202 ProcessColumns(m_pProperties->m_rtWidget.width);
203 ProcessRows(m_pProperties->m_rtWidget.height);
204 SetAllWidgetsRect();
205 return FWL_ERR_Succeeded;
206 }
207 FWL_ERR CFWL_GridImp::DrawWidget(CFX_Graphics* pGraphics,
208 const CFX_Matrix* pMatrix) {
209 if (!pGraphics)
210 return FWL_ERR_Indefinite;
211 if ((m_pProperties->m_dwStyleExes & FWL_GRIDSTYLEEXT_ShowGridLines) == 0) {
212 return FWL_ERR_Succeeded;
213 }
214 pGraphics->SaveGraphState();
215 if (pMatrix) {
216 pGraphics->ConcatMatrix(pMatrix);
217 }
218 {
219 FX_BOOL bDrawLine = FALSE;
220 CFX_Path path;
221 path.Create();
222 int32_t iColumns = m_Columns.GetSize();
223 for (int32_t i = 1; i < iColumns; i++) {
224 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
225 if (!pColRow) {
226 continue;
227 }
228 bDrawLine = TRUE;
229 path.AddLine(pColRow->m_fActualPos, 0, pColRow->m_fActualPos,
230 m_pProperties->m_rtWidget.height);
231 }
232 int32_t iRows = m_Rows.GetSize();
233 for (int32_t j = 1; j < iRows; j++) {
234 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[j]);
235 if (!pColRow) {
236 continue;
237 }
238 bDrawLine = TRUE;
239 path.AddLine(0, pColRow->m_fActualPos, m_pProperties->m_rtWidget.width,
240 pColRow->m_fActualPos);
241 }
242 if (bDrawLine) {
243 CFX_Color cr(0xFFFF0000);
244 pGraphics->SetStrokeColor(&cr);
245 pGraphics->StrokePath(&path);
246 }
247 }
248 pGraphics->RestoreGraphState();
249 return FWL_ERR_Succeeded;
250 }
251 FWL_ERR CFWL_GridImp::InsertWidget(IFWL_Widget* pChild, int32_t nIndex) {
252 if (!pChild)
253 return FWL_ERR_Indefinite;
254 CFWL_ContentImp::InsertWidget(pChild, nIndex);
255 if (!m_mapWidgetInfo.GetValueAt(pChild)) {
256 CFWL_GridWidgetInfo* pInfo = new CFWL_GridWidgetInfo;
257 m_mapWidgetInfo.SetAt(pChild, pInfo);
258 m_Widgets.Add(pChild);
259 }
260 return FWL_ERR_Succeeded;
261 }
262 FWL_ERR CFWL_GridImp::RemoveWidget(IFWL_Widget* pWidget) {
263 if (!pWidget)
264 return FWL_ERR_Indefinite;
265 CFWL_ContentImp::RemoveWidget(pWidget);
266 if (CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(
267 m_mapWidgetInfo.GetValueAt(pWidget))) {
268 m_mapWidgetInfo.RemoveKey(pWidget);
269 delete pInfo;
270 int32_t nIndex = m_Widgets.Find(pWidget);
271 m_Widgets.RemoveAt(nIndex, 1);
272 }
273 return FWL_ERR_Succeeded;
274 }
275 FWL_HGRIDCOLROW CFWL_GridImp::InsertColRow(FX_BOOL bColumn, int32_t nIndex) {
276 if (bColumn) {
277 if (nIndex < 0 || nIndex > m_Columns.GetSize()) {
278 nIndex = m_Columns.GetSize();
279 }
280 CFWL_GridColRow* pColumn = new CFWL_GridColRow;
281 m_Columns.InsertAt(nIndex, pColumn, 1);
282 return (FWL_HGRIDCOLROW)pColumn;
283 }
284 if (nIndex < 0 || nIndex > m_Rows.GetSize()) {
285 nIndex = m_Rows.GetSize();
286 }
287 CFWL_GridColRow* pRow = new CFWL_GridColRow;
288 m_Rows.InsertAt(nIndex, pRow, 1);
289 return (FWL_HGRIDCOLROW)pRow;
290 }
291 int32_t CFWL_GridImp::CountColRows(FX_BOOL bColumn) {
292 if (bColumn) {
293 return m_Columns.GetSize();
294 }
295 return m_Rows.GetSize();
296 }
297 FWL_HGRIDCOLROW CFWL_GridImp::GetColRow(FX_BOOL bColumn, int32_t nIndex) {
298 if (bColumn) {
299 if (nIndex < 0 || nIndex >= m_Columns.GetSize()) {
300 return NULL;
301 }
302 return (FWL_HGRIDCOLROW)m_Columns[nIndex];
303 }
304 if (nIndex < 0 || nIndex >= m_Rows.GetSize()) {
305 return NULL;
306 }
307 return (FWL_HGRIDCOLROW)m_Rows[nIndex];
308 }
309 int32_t CFWL_GridImp::GetIndex(FWL_HGRIDCOLROW hColRow) {
310 if (IsColumn(hColRow)) {
311 return m_Columns.Find(hColRow);
312 }
313 return m_Rows.Find(hColRow);
314 }
315 FX_FLOAT CFWL_GridImp::GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
316 if (!hColRow)
317 return -1;
318 CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
319 eUnit = pColRow->m_Size.eUnit;
320 return pColRow->m_Size.fLength;
321 }
322 FWL_ERR CFWL_GridImp::SetSize(FWL_HGRIDCOLROW hColRow,
323 FX_FLOAT fSize,
324 FWL_GRIDUNIT eUnit) {
325 if (!hColRow)
326 return FWL_ERR_Indefinite;
327 CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
328 pColRow->m_Size.eUnit = eUnit;
329 pColRow->m_Size.fLength = fSize;
330 return FWL_ERR_Succeeded;
331 }
332 FX_FLOAT CFWL_GridImp::GetMinSize(FWL_HGRIDCOLROW hColRow,
333 FWL_GRIDUNIT& eUnit) {
334 if (!hColRow)
335 return -1;
336 CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
337 eUnit = pColRow->m_MinSize.eUnit;
338 return pColRow->m_MinSize.fLength;
339 }
340 FWL_ERR CFWL_GridImp::SetMinSize(FWL_HGRIDCOLROW hColRow,
341 FX_FLOAT fSize,
342 FWL_GRIDUNIT eUnit) {
343 if (!hColRow)
344 return FWL_ERR_Indefinite;
345 CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
346 pColRow->m_MinSize.eUnit = eUnit;
347 pColRow->m_MinSize.fLength = fSize;
348 return FWL_ERR_Succeeded;
349 }
350 FX_FLOAT CFWL_GridImp::GetMaxSize(FWL_HGRIDCOLROW hColRow,
351 FWL_GRIDUNIT& eUnit) {
352 if (!hColRow)
353 return -1;
354 CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
355 eUnit = pColRow->m_MaxSize.eUnit;
356 return pColRow->m_MaxSize.fLength;
357 }
358 FWL_ERR CFWL_GridImp::SetMaxSize(FWL_HGRIDCOLROW hColRow,
359 FX_FLOAT fSize,
360 FWL_GRIDUNIT eUnit) {
361 if (!hColRow)
362 return FWL_ERR_Indefinite;
363 CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
364 pColRow->m_MaxSize.eUnit = eUnit;
365 pColRow->m_MaxSize.fLength = fSize;
366 return FWL_ERR_Succeeded;
367 }
368 FX_BOOL CFWL_GridImp::DeleteColRow(FWL_HGRIDCOLROW hColRow) {
369 int32_t nIndex = m_Columns.Find(hColRow);
370 if (nIndex >= 0) {
371 m_Columns.RemoveAt(nIndex);
372 delete reinterpret_cast<CFWL_GridColRow*>(hColRow);
373 return TRUE;
374 }
375 nIndex = m_Rows.Find(hColRow);
376 if (nIndex >= 0) {
377 delete reinterpret_cast<CFWL_GridColRow*>(hColRow);
378 m_Rows.RemoveAt(nIndex);
379 return TRUE;
380 }
381 return FALSE;
382 }
383 FX_BOOL CFWL_GridImp::IsColumn(FWL_HGRIDCOLROW hColRow) {
384 return m_Columns.Find(hColRow) != -1;
385 }
386 int32_t CFWL_GridImp::GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn) {
387 CFWL_GridWidgetInfo* pInfo =
388 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
389 if (pInfo) {
390 return bColumn ? pInfo->m_iColumn : pInfo->m_iRow;
391 }
392 return -1;
393 }
394 FWL_ERR CFWL_GridImp::SetWidgetPos(IFWL_Widget* pWidget,
395 int32_t iPos,
396 FX_BOOL bColumn) {
397 CFWL_GridWidgetInfo* pInfo =
398 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
399 if (pInfo) {
400 bColumn ? pInfo->m_iColumn = iPos : pInfo->m_iRow = iPos;
401 }
402 return FWL_ERR_Succeeded;
403 }
404 int32_t CFWL_GridImp::GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn) {
405 CFWL_GridWidgetInfo* pInfo =
406 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
407 if (pInfo) {
408 return bColumn ? pInfo->m_iColumnSpan : pInfo->m_iRowSpan;
409 }
410 return 0;
411 }
412 FWL_ERR CFWL_GridImp::SetWidgetSpan(IFWL_Widget* pWidget,
413 int32_t iSpan,
414 FX_BOOL bColumn) {
415 CFWL_GridWidgetInfo* pInfo =
416 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
417 if (pInfo) {
418 bColumn ? pInfo->m_iColumnSpan = iSpan : pInfo->m_iRowSpan = iSpan;
419 }
420 return FWL_ERR_Succeeded;
421 }
422 FX_FLOAT CFWL_GridImp::GetWidgetSize(IFWL_Widget* pWidget,
423 FWL_GRIDSIZE eSize,
424 FWL_GRIDUNIT& eUnit) {
425 CFWL_GridWidgetInfo* pInfo =
426 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
427 if (pInfo) {
428 eUnit = pInfo->m_Size[eSize].eUnit;
429 return pInfo->m_Size[eSize].fLength;
430 }
431 return 0;
432 }
433 FWL_ERR CFWL_GridImp::SetWidgetSize(IFWL_Widget* pWidget,
434 FWL_GRIDSIZE eSize,
435 FX_FLOAT fSize,
436 FWL_GRIDUNIT eUit) {
437 CFWL_GridWidgetInfo* pInfo =
438 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
439 if (pInfo) {
440 pInfo->m_Size[eSize].fLength = fSize;
441 pInfo->m_Size[eSize].eUnit = eUit;
442 }
443 return FWL_ERR_Succeeded;
444 }
445 FX_BOOL CFWL_GridImp::GetWidgetMargin(IFWL_Widget* pWidget,
446 FWL_GRIDMARGIN eMargin,
447 FX_FLOAT& fMargin) {
448 CFWL_GridWidgetInfo* pInfo =
449 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
450 if (pInfo) {
451 fMargin = pInfo->m_Margin[eMargin];
452 return (pInfo->m_dwMarginFlag & (1 << eMargin)) != 0;
453 }
454 return FALSE;
455 }
456 FWL_ERR CFWL_GridImp::SetWidgetMargin(IFWL_Widget* pWidget,
457 FWL_GRIDMARGIN eMargin,
458 FX_FLOAT fMargin) {
459 CFWL_GridWidgetInfo* pInfo =
460 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
461 if (pInfo) {
462 pInfo->m_Margin[eMargin] = fMargin;
463 pInfo->m_dwMarginFlag |= (1 << eMargin);
464 }
465 return FWL_ERR_Succeeded;
466 }
467 FWL_ERR CFWL_GridImp::RemoveWidgetMargin(IFWL_Widget* pWidget,
468 FWL_GRIDMARGIN eMargin) {
469 CFWL_GridWidgetInfo* pInfo =
470 static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
471 if (pInfo) {
472 pInfo->m_dwMarginFlag &= ~(1 << eMargin);
473 }
474 return FWL_ERR_Succeeded;
475 }
476 FX_FLOAT CFWL_GridImp::GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit) {
477 eUnit = m_Size[eSize].eUnit;
478 return m_Size[eSize].fLength;
479 }
480 FWL_ERR CFWL_GridImp::SetGridSize(FWL_GRIDSIZE eSize,
481 FX_FLOAT fSize,
482 FWL_GRIDUNIT eUit) {
483 m_Size[eSize].fLength = fSize;
484 m_Size[eSize].eUnit = eUit;
485 return FWL_ERR_Succeeded;
486 }
487 CFWL_GridWidgetInfo* CFWL_GridImp::GetWidgetInfo(IFWL_Widget* pWidget) {
488 return static_cast<CFWL_GridWidgetInfo*>(m_mapWidgetInfo.GetValueAt(pWidget));
489 }
490 void CFWL_GridImp::ProcFixedColRow(CFWL_GridColRow* pColRow,
491 int32_t nIndex,
492 FX_FLOAT fColRowSize,
493 FX_BOOL bColumn) {
494 pColRow->m_fActualSize = fColRowSize;
495 FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
496 while (ps) {
497 void* key = nullptr;
498 void* value = nullptr;
499 m_mapWidgetInfo.GetNextAssoc(ps, key, value);
500 IFWL_Widget* pWidget = static_cast<IFWL_Widget*>(key);
501 CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(value);
502 if (bColumn) {
503 if (pInfo->m_iColumn == nIndex && pInfo->m_iColumnSpan == 1) {
504 CalcWidgetWidth(pWidget, pInfo, pColRow->m_fActualSize);
505 }
506 } else {
507 if (pInfo->m_iRow == nIndex && pInfo->m_iRowSpan == 1) {
508 CalcWidgetHeigt(pWidget, pInfo, pColRow->m_fActualSize);
509 }
510 }
511 }
512 }
513 void CFWL_GridImp::ProcAutoColRow(CFWL_GridColRow* pColRow,
514 int32_t nIndex,
515 FX_BOOL bColumn) {
516 if (!pColRow)
517 return;
518 FX_FLOAT fMaxSize = 0, fWidgetSize = 0;
519 FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
520 while (ps) {
521 IFWL_Widget* pWidget = NULL;
522 CFWL_GridWidgetInfo* pInfo = NULL;
523 m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
524 if (!pWidget || !pInfo) {
525 continue;
526 }
527 if (bColumn) {
528 if (pInfo->m_iColumn != nIndex || pInfo->m_iColumnSpan != 1) {
529 continue;
530 }
531 fWidgetSize = CalcAutoColumnWidgetWidth(pWidget, pInfo);
532 if (fMaxSize < fWidgetSize) {
533 fMaxSize = fWidgetSize;
534 }
535 } else {
536 if (pInfo->m_iRow != nIndex || pInfo->m_iRowSpan != 1) {
537 continue;
538 }
539 fWidgetSize = CalcAutoColumnWidgetHeight(pWidget, pInfo);
540 if (fMaxSize < fWidgetSize) {
541 fMaxSize = fWidgetSize;
542 }
543 }
544 }
545 SetColRowActualSize(pColRow, fMaxSize);
546 }
547 void CFWL_GridImp::ProcScaledColRow(CFWL_GridColRow* pColRow,
548 int32_t nIndex,
549 FX_FLOAT fColRowSize,
550 FX_BOOL bColumn) {
551 if (fColRowSize > 0) {
552 ProcFixedColRow(pColRow, nIndex, fColRowSize, bColumn);
553 }
554 }
555 void CFWL_GridImp::CalcWidgetWidth(IFWL_Widget* pWidget,
556 CFWL_GridWidgetInfo* pInfo,
557 FX_FLOAT fColunmWidth) {
558 if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
559 SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
560 } else {
561 FX_FLOAT fWidth = 0;
562 FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
563 FX_BOOL bLeftMargin =
564 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
565 FX_BOOL bRightMargin =
566 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
567 if (bLeftMargin && bRightMargin) {
568 fWidth = fColunmWidth - fLeftMargin - fRightMargin;
569 } else {
570 CFX_RectF rtAuto;
571 pWidget->GetWidgetRect(rtAuto, TRUE);
572 fWidth = rtAuto.Width();
573 }
574 SetWidgetActualWidth(pInfo, fWidth);
575 }
576 }
577 void CFWL_GridImp::CalcWidgetHeigt(IFWL_Widget* pWidget,
578 CFWL_GridWidgetInfo* pInfo,
579 FX_FLOAT fRowHeigt) {
580 if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
581 SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
582 } else {
583 FX_FLOAT fHeight = 0;
584 FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
585 FX_BOOL bTopMargin =
586 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
587 FX_BOOL bBottomMargin =
588 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
589 if (bTopMargin && bBottomMargin) {
590 fHeight = fRowHeigt - fTopMargin - fBottomMargin;
591 } else {
592 CFX_RectF rtAuto;
593 pWidget->GetWidgetRect(rtAuto, TRUE);
594 fHeight = rtAuto.Height();
595 }
596 SetWidgetActualHeight(pInfo, fHeight);
597 }
598 }
599 FX_FLOAT CFWL_GridImp::CalcAutoColumnWidgetWidth(IFWL_Widget* pWidget,
600 CFWL_GridWidgetInfo* pInfo) {
601 FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
602 FX_BOOL bLeftMargin =
603 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
604 FX_BOOL bRightMargin =
605 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
606 if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
607 SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
608 } else {
609 CFX_RectF rtAuto;
610 pWidget->GetWidgetRect(rtAuto, TRUE);
611 FX_FLOAT fWidth = rtAuto.width;
612 SetWidgetActualWidth(pInfo, fWidth);
613 }
614 FX_FLOAT fTotal = pInfo->m_fActualWidth;
615 if (bLeftMargin) {
616 fTotal += fLeftMargin;
617 }
618 if (bRightMargin) {
619 fTotal += fRightMargin;
620 }
621 return fTotal;
622 }
623 FX_FLOAT CFWL_GridImp::CalcAutoColumnWidgetHeight(IFWL_Widget* pWidget,
624 CFWL_GridWidgetInfo* pInfo) {
625 FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
626 FX_BOOL bTopMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
627 FX_BOOL bBottomMargin =
628 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
629 if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
630 SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
631 } else {
632 CFX_RectF rtAuto;
633 pWidget->GetWidgetRect(rtAuto, TRUE);
634 FX_FLOAT fHeight = rtAuto.height;
635 SetWidgetActualHeight(pInfo, fHeight);
636 }
637 FX_FLOAT fTotal = pInfo->m_fActualHeight;
638 if (bTopMargin) {
639 fTotal += fTopMargin;
640 }
641 if (bBottomMargin) {
642 fTotal += fBottomMargin;
643 }
644 return fTotal;
645 }
646 FX_FLOAT CFWL_GridImp::ProcessColumns(FX_FLOAT fWidth) {
647 if (fWidth <= 0) {
648 return ProcessUnCertainColumns();
649 }
650 int32_t iColumns = m_Columns.GetSize();
651 if (iColumns < 1) {
652 return fWidth;
653 }
654 FX_FLOAT fFixedWidth = 0;
655 FX_FLOAT fAutoWidth = 0;
656 CFX_PtrArray autoColumns;
657 CFX_PtrArray scaledColumns;
658 FX_FLOAT fScaledColumnNum = 0;
659 for (int32_t i = 0; i < iColumns; i++) {
660 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
661 if (!pColRow) {
662 continue;
663 }
664 switch (pColRow->m_Size.eUnit) {
665 case FWL_GRIDUNIT_Fixed: {
666 SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
667 fFixedWidth += pColRow->m_fActualSize;
668 break;
669 }
670 case FWL_GRIDUNIT_Auto: {
671 ProcAutoColRow(pColRow, i, TRUE);
672 autoColumns.Add(pColRow);
673 break;
674 }
675 case FWL_GRIDUNIT_Scaled:
676 default: {
677 fScaledColumnNum += pColRow->m_Size.fLength;
678 scaledColumns.Add(pColRow);
679 SetColRowActualSize(pColRow, 0);
680 }
681 }
682 }
683 FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
684 while (ps) {
685 IFWL_Widget* pWidget = NULL;
686 CFWL_GridWidgetInfo* pInfo = NULL;
687 m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
688 if (!pInfo || pInfo->m_iColumnSpan < 2) {
689 continue;
690 }
691 CFX_PtrArray spanAutoColumns;
692 FX_FLOAT fSpanSize = 0;
693 int32_t iAutoColRows = 0;
694 int32_t iScaledColRows = 0;
695 for (int32_t i = 0; i < pInfo->m_iColumnSpan; i++) {
696 CFWL_GridColRow* pColumn = reinterpret_cast<CFWL_GridColRow*>(
697 GetColRow(TRUE, pInfo->m_iColumn + i));
698 if (!pColumn) {
699 break;
700 }
701 fSpanSize += pColumn->m_fActualSize;
702 if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
703 iAutoColRows++;
704 spanAutoColumns.Add(pColumn);
705 } else if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
706 iScaledColRows++;
707 }
708 }
709 if (iAutoColRows < 1) {
710 continue;
711 }
712 FX_FLOAT fWidgetWidth = CalcAutoColumnWidgetWidth(pWidget, pInfo);
713 if (fWidgetWidth > fSpanSize) {
714 if (iScaledColRows > 0) {
715 } else {
716 SetSpanAutoColRowSize(spanAutoColumns, fWidgetWidth - fSpanSize);
717 }
718 }
719 }
720 int32_t iAutoCols = autoColumns.GetSize();
721 for (int32_t k = 0; k < iAutoCols; k++) {
722 fAutoWidth += static_cast<CFWL_GridColRow*>(autoColumns[k])->m_fActualSize;
723 }
724 FX_FLOAT fScaledWidth = fWidth - fFixedWidth - fAutoWidth;
725 if (fScaledWidth > 0 && fScaledColumnNum > 0) {
726 SetScaledColRowsSize(scaledColumns, fScaledWidth, fScaledColumnNum);
727 }
728 return fWidth;
729 }
730 FX_FLOAT CFWL_GridImp::ProcessRows(FX_FLOAT fHeight) {
731 if (fHeight <= 0) {
732 return ProcessUnCertainRows();
733 }
734 int32_t iRows = m_Rows.GetSize();
735 if (iRows < 1) {
736 return fHeight;
737 }
738 FX_FLOAT fFixedHeight = 0;
739 FX_FLOAT fAutoHeigt = 0;
740 CFX_PtrArray autoRows;
741 CFX_PtrArray scaledRows;
742 FX_FLOAT fScaledRowNum = 0;
743 for (int32_t i = 0; i < iRows; i++) {
744 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[i]);
745 if (!pColRow) {
746 continue;
747 }
748 switch (pColRow->m_Size.eUnit) {
749 case FWL_GRIDUNIT_Fixed: {
750 SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
751 fFixedHeight += pColRow->m_fActualSize;
752 break;
753 }
754 case FWL_GRIDUNIT_Auto: {
755 ProcAutoColRow(pColRow, i, FALSE);
756 autoRows.Add(pColRow);
757 break;
758 }
759 case FWL_GRIDUNIT_Scaled:
760 default: {
761 fScaledRowNum += pColRow->m_Size.fLength;
762 scaledRows.Add(pColRow);
763 SetColRowActualSize(pColRow, 0);
764 break;
765 }
766 }
767 }
768 FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
769 while (ps) {
770 IFWL_Widget* pWidget = NULL;
771 CFWL_GridWidgetInfo* pInfo = NULL;
772 m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
773 if (!pInfo || pInfo->m_iRowSpan < 2) {
774 continue;
775 }
776 CFX_PtrArray spanAutoRows;
777 FX_FLOAT fSpanSize = 0;
778 int32_t iAutoColRows = 0;
779 int32_t iScaledColRows = 0;
780 for (int32_t i = 0; i < pInfo->m_iRowSpan; i++) {
781 CFWL_GridColRow* pRow = reinterpret_cast<CFWL_GridColRow*>(
782 GetColRow(FALSE, pInfo->m_iRow + i));
783 if (!pRow) {
784 break;
785 }
786 fSpanSize += pRow->m_fActualSize;
787 if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
788 iAutoColRows++;
789 spanAutoRows.Add(pRow);
790 } else if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
791 iScaledColRows++;
792 }
793 }
794 if (iAutoColRows < 1) {
795 continue;
796 }
797 FX_FLOAT fWidgetHeight = CalcAutoColumnWidgetHeight(pWidget, pInfo);
798 if (fWidgetHeight > fSpanSize) {
799 if (iScaledColRows > 0) {
800 } else {
801 SetSpanAutoColRowSize(spanAutoRows, fWidgetHeight - fSpanSize);
802 }
803 }
804 }
805 int32_t iAutoRows = autoRows.GetSize();
806 for (int32_t k = 0; k < iAutoRows; k++) {
807 fAutoHeigt +=
808 reinterpret_cast<CFWL_GridColRow*>(autoRows[k])->m_fActualSize;
809 }
810 FX_FLOAT fScaledHeight = fHeight - fFixedHeight - fAutoHeigt;
811 if (fScaledHeight > 0 && fScaledRowNum > 0) {
812 SetScaledColRowsSize(scaledRows, fScaledHeight, fScaledRowNum);
813 }
814 return fHeight;
815 }
816 FX_FLOAT CFWL_GridImp::ProcessUnCertainColumns() {
817 int32_t iColumns = m_Columns.GetSize();
818 if (iColumns < 1) {
819 CFWL_GridColRow* pColRow = new CFWL_GridColRow;
820 pColRow->m_Size.eUnit = FWL_GRIDUNIT_Auto;
821 ProcAutoColRow(pColRow, 0, TRUE);
822 FX_FLOAT fWidth = pColRow->m_fActualSize;
823 delete pColRow;
824 return fWidth;
825 }
826 FX_FLOAT fFixedWidth = 0;
827 CFX_PtrArray autoColumns;
828 CFX_PtrArray scaledColumns;
829 FX_FLOAT fScaledColumnNum = 0;
830 FX_FLOAT fScaledMaxPerWidth = 0;
831 for (int32_t i = 0; i < iColumns; i++) {
832 CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(m_Columns[i]);
833 if (!pColRow) {
834 continue;
835 }
836 switch (pColRow->m_Size.eUnit) {
837 case FWL_GRIDUNIT_Fixed: {
838 SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
839 fFixedWidth += pColRow->m_fActualSize;
840 break;
841 }
842 case FWL_GRIDUNIT_Auto: {
843 ProcAutoColRow(pColRow, i, TRUE);
844 autoColumns.Add(pColRow);
845 break;
846 }
847 case FWL_GRIDUNIT_Scaled:
848 default: {
849 ProcAutoColRow(pColRow, i, TRUE);
850 fScaledColumnNum += pColRow->m_Size.fLength;
851 scaledColumns.Add(pColRow);
852 if (pColRow->m_Size.fLength <= 0) {
853 break;
854 }
855 FX_FLOAT fPerWidth = pColRow->m_fActualSize / pColRow->m_Size.fLength;
856 if (fPerWidth > fScaledMaxPerWidth) {
857 fScaledMaxPerWidth = fPerWidth;
858 }
859 }
860 }
861 }
862 iColumns = scaledColumns.GetSize();
863 for (int32_t j = 0; j < iColumns; j++) {
864 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(scaledColumns[j]);
865 if (!pColRow) {
866 continue;
867 }
868 SetColRowActualSize(pColRow, fScaledMaxPerWidth * pColRow->m_Size.fLength);
869 }
870 FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
871 while (ps) {
872 IFWL_Widget* pWidget = NULL;
873 CFWL_GridWidgetInfo* pInfo = NULL;
874 m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
875 if (!pInfo || pInfo->m_iColumnSpan < 2) {
876 continue;
877 }
878 CFX_PtrArray spanAutoColumns;
879 CFX_PtrArray spanScaledColumns;
880 FX_FLOAT fSpanSize = 0;
881 FX_FLOAT fScaledSum = 0;
882 int32_t iAutoColRows = 0;
883 int32_t iScaledColRows = 0;
884 for (int32_t i = 0; i < pInfo->m_iColumnSpan; i++) {
885 CFWL_GridColRow* pColumn = reinterpret_cast<CFWL_GridColRow*>(
886 GetColRow(TRUE, pInfo->m_iColumn + i));
887 if (!pColumn) {
888 break;
889 }
890 fSpanSize += pColumn->m_fActualSize;
891 if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
892 iAutoColRows++;
893 spanAutoColumns.Add(pColumn);
894 } else if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
895 iScaledColRows++;
896 fScaledSum += pColumn->m_Size.fLength;
897 spanScaledColumns.Add(pColumn);
898 }
899 }
900 if (iAutoColRows < 1 && iScaledColRows < 1) {
901 continue;
902 }
903 FX_FLOAT fWidgetWidth = CalcAutoColumnWidgetWidth(pWidget, pInfo);
904 if (fWidgetWidth > fSpanSize) {
905 if (iScaledColRows > 0) {
906 if (fScaledSum <= 0) {
907 continue;
908 }
909 SetSpanScaledColRowSize(spanScaledColumns, fWidgetWidth - fSpanSize,
910 fScaledSum);
911 } else {
912 SetSpanAutoColRowSize(spanAutoColumns, fWidgetWidth - fSpanSize);
913 }
914 }
915 }
916 FX_FLOAT fAutoWidth = 0;
917 int32_t iAutoCols = autoColumns.GetSize();
918 for (int32_t m = 0; m < iAutoCols; m++) {
919 fAutoWidth += static_cast<CFWL_GridColRow*>(autoColumns[m])->m_fActualSize;
920 }
921 FX_FLOAT fScaledWidth = 0;
922 iColumns = scaledColumns.GetSize();
923 for (int32_t n = 0; n < iColumns; n++) {
924 fScaledWidth +=
925 static_cast<CFWL_GridColRow*>(scaledColumns[n])->m_fActualSize;
926 }
927 return fFixedWidth + fAutoWidth + fScaledWidth;
928 }
929 FX_FLOAT CFWL_GridImp::ProcessUnCertainRows() {
930 int32_t iRows = m_Rows.GetSize();
931 if (iRows < 1) {
932 CFWL_GridColRow* pColRow = new CFWL_GridColRow;
933 pColRow->m_Size.eUnit = FWL_GRIDUNIT_Auto;
934 ProcAutoColRow(pColRow, 0, FALSE);
935 FX_FLOAT fWidth = pColRow->m_fActualSize;
936 delete pColRow;
937 return fWidth;
938 }
939 FX_FLOAT fFixedHeight = 0;
940 CFX_PtrArray autoRows;
941 CFX_PtrArray scaledRows;
942 FX_FLOAT fScaledRowNum = 0;
943 FX_FLOAT fScaledMaxPerHeight = 0;
944 for (int32_t i = 0; i < iRows; i++) {
945 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[i]);
946 if (!pColRow) {
947 continue;
948 }
949 switch (pColRow->m_Size.eUnit) {
950 case FWL_GRIDUNIT_Fixed: {
951 SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
952 fFixedHeight += pColRow->m_fActualSize;
953 break;
954 }
955 case FWL_GRIDUNIT_Auto: {
956 ProcAutoColRow(pColRow, i, FALSE);
957 autoRows.Add(pColRow);
958 break;
959 }
960 case FWL_GRIDUNIT_Scaled:
961 default: {
962 ProcAutoColRow(pColRow, i, FALSE);
963 fScaledRowNum += pColRow->m_Size.fLength;
964 scaledRows.Add(pColRow);
965 if (pColRow->m_Size.fLength > 0) {
966 FX_FLOAT fPerHeight =
967 pColRow->m_fActualSize / pColRow->m_Size.fLength;
968 if (fPerHeight > fScaledMaxPerHeight) {
969 fScaledMaxPerHeight = fPerHeight;
970 }
971 }
972 break;
973 }
974 }
975 }
976 iRows = scaledRows.GetSize();
977 for (int32_t j = 0; j < iRows; j++) {
978 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(scaledRows[j]);
979 if (!pColRow) {
980 continue;
981 }
982 SetColRowActualSize(pColRow, fScaledMaxPerHeight * pColRow->m_Size.fLength);
983 }
984 FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
985 while (ps) {
986 void* key = nullptr;
987 void* value = nullptr;
988 m_mapWidgetInfo.GetNextAssoc(ps, key, value);
989 IFWL_Widget* pWidget = static_cast<IFWL_Widget*>(key);
990 CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(value);
991 if (pInfo->m_iRowSpan < 2) {
992 continue;
993 }
994 CFX_PtrArray spanAutoRows;
995 CFX_PtrArray spanScaledRows;
996 FX_FLOAT fSpanSize = 0;
997 FX_FLOAT fScaledSum = 0;
998 int32_t iAutoColRows = 0;
999 int32_t iScaledColRows = 0;
1000 for (int32_t i = 0; i < pInfo->m_iRowSpan; i++) {
1001 CFWL_GridColRow* pRow = reinterpret_cast<CFWL_GridColRow*>(
1002 GetColRow(FALSE, pInfo->m_iRow + i));
1003 if (!pRow) {
1004 break;
1005 }
1006 fSpanSize += pRow->m_fActualSize;
1007 if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
1008 iAutoColRows++;
1009 spanAutoRows.Add(pRow);
1010 } else if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
1011 iScaledColRows++;
1012 fScaledSum += pRow->m_Size.fLength;
1013 spanScaledRows.Add(pRow);
1014 }
1015 }
1016 if (iAutoColRows < 1 && iScaledColRows < 1) {
1017 continue;
1018 }
1019 FX_FLOAT fWidgetHeight = CalcAutoColumnWidgetHeight(pWidget, pInfo);
1020 if (fWidgetHeight > fSpanSize) {
1021 if (iScaledColRows > 0) {
1022 if (fScaledSum <= 0) {
1023 continue;
1024 }
1025 SetSpanScaledColRowSize(spanScaledRows, fWidgetHeight - fSpanSize,
1026 fScaledSum);
1027 } else {
1028 SetSpanAutoColRowSize(spanAutoRows, fWidgetHeight - fSpanSize);
1029 }
1030 }
1031 }
1032 FX_FLOAT fAutoHeigt = 0;
1033 int32_t iAutoRows = autoRows.GetSize();
1034 for (int32_t m = 0; m < iAutoRows; m++) {
1035 fAutoHeigt += static_cast<CFWL_GridColRow*>(autoRows[m])->m_fActualSize;
1036 }
1037 FX_FLOAT fScaledHeight = 0;
1038 iRows = scaledRows.GetSize();
1039 for (int32_t n = 0; n < iRows; n++) {
1040 fScaledHeight +=
1041 static_cast<CFWL_GridColRow*>(scaledRows[n])->m_fActualSize;
1042 }
1043 return fFixedHeight + fAutoHeigt + fScaledHeight;
1044 }
1045 FX_BOOL CFWL_GridImp::SetColRowActualSize(CFWL_GridColRow* pColRow,
1046 FX_FLOAT fSize,
1047 FX_BOOL bSetBeyond) {
1048 if (pColRow->m_MinSize.eUnit == FWL_GRIDUNIT_Fixed &&
1049 fSize < pColRow->m_MinSize.fLength) {
1050 pColRow->m_fActualSize = pColRow->m_MinSize.fLength;
1051 return FALSE;
1052 }
1053 if (pColRow->m_MaxSize.eUnit == FWL_GRIDUNIT_Fixed &&
1054 fSize > pColRow->m_MaxSize.fLength) {
1055 pColRow->m_fActualSize = pColRow->m_MaxSize.fLength;
1056 return FALSE;
1057 }
1058 if (bSetBeyond) {
1059 return TRUE;
1060 }
1061 pColRow->m_fActualSize = fSize;
1062 return TRUE;
1063 }
1064 FX_FLOAT CFWL_GridImp::SetWidgetActualWidth(CFWL_GridWidgetInfo* pInfo,
1065 FX_FLOAT fWidth) {
1066 if (pInfo->m_Size[FWL_GRIDSIZE_MinWidth].eUnit == FWL_GRIDUNIT_Fixed &&
1067 fWidth < pInfo->m_Size[FWL_GRIDSIZE_MinWidth].fLength) {
1068 fWidth = pInfo->m_Size[FWL_GRIDSIZE_MinWidth].fLength;
1069 }
1070 if (pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].eUnit == FWL_GRIDUNIT_Fixed &&
1071 fWidth > pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].fLength) {
1072 fWidth = pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].fLength;
1073 }
1074 pInfo->m_fActualWidth = fWidth;
1075 return fWidth;
1076 }
1077 FX_FLOAT CFWL_GridImp::SetWidgetActualHeight(CFWL_GridWidgetInfo* pInfo,
1078 FX_FLOAT fHeight) {
1079 if (pInfo->m_Size[FWL_GRIDSIZE_MinHeight].eUnit == FWL_GRIDUNIT_Fixed &&
1080 fHeight < pInfo->m_Size[FWL_GRIDSIZE_MinHeight].fLength) {
1081 fHeight = pInfo->m_Size[FWL_GRIDSIZE_MinHeight].fLength;
1082 }
1083 if (pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].eUnit == FWL_GRIDUNIT_Fixed &&
1084 fHeight > pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].fLength) {
1085 fHeight = pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].fLength;
1086 }
1087 pInfo->m_fActualHeight = fHeight;
1088 return fHeight;
1089 }
1090 void CFWL_GridImp::SetAllWidgetsRect() {
1091 FX_FLOAT fStartLeft = 0;
1092 int32_t iColumns = m_Columns.GetSize();
1093 for (int32_t i = 0; i < iColumns; i++) {
1094 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
1095 if (!pColRow) {
1096 continue;
1097 }
1098 pColRow->m_fActualPos = fStartLeft;
1099 fStartLeft += pColRow->m_fActualSize;
1100 }
1101 FX_FLOAT fStartTop = 0;
1102 int32_t iRows = m_Rows.GetSize();
1103 for (int32_t j = 0; j < iRows; j++) {
1104 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[j]);
1105 if (!pColRow) {
1106 continue;
1107 }
1108 pColRow->m_fActualPos = fStartTop;
1109 fStartTop += pColRow->m_fActualSize;
1110 }
1111 FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
1112 while (ps) {
1113 IFWL_Widget* pWidget = NULL;
1114 CFWL_GridWidgetInfo* pInfo = NULL;
1115 m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
1116 if (!pWidget || !pInfo) {
1117 continue;
1118 }
1119 FX_FLOAT fColumnStart = 0;
1120 CFWL_GridColRow* pColumn =
1121 reinterpret_cast<CFWL_GridColRow*>(GetColRow(TRUE, pInfo->m_iColumn));
1122 if (pColumn) {
1123 fColumnStart = pColumn->m_fActualPos;
1124 }
1125 FX_FLOAT fRowStart = 0;
1126 CFWL_GridColRow* pRow =
1127 reinterpret_cast<CFWL_GridColRow*>(GetColRow(FALSE, pInfo->m_iRow));
1128 if (pRow) {
1129 fRowStart = pRow->m_fActualPos;
1130 }
1131 FX_FLOAT fColumnWidth = 0;
1132 if (iColumns > 0) {
1133 for (int32_t j = 0; j < pInfo->m_iColumnSpan; j++) {
1134 CFWL_GridColRow* pCol = reinterpret_cast<CFWL_GridColRow*>(
1135 GetColRow(TRUE, pInfo->m_iColumn + j));
1136 if (!pCol) {
1137 break;
1138 }
1139 fColumnWidth += pCol->m_fActualSize;
1140 }
1141 } else {
1142 fColumnWidth = m_pProperties->m_rtWidget.width;
1143 }
1144 FX_FLOAT fRowHeight = 0;
1145 if (iRows > 0) {
1146 for (int32_t k = 0; k < pInfo->m_iRowSpan; k++) {
1147 CFWL_GridColRow* pR = reinterpret_cast<CFWL_GridColRow*>(
1148 GetColRow(FALSE, pInfo->m_iRow + k));
1149 if (!pR) {
1150 break;
1151 }
1152 fRowHeight += pR->m_fActualSize;
1153 }
1154 } else {
1155 fRowHeight = m_pProperties->m_rtWidget.height;
1156 }
1157 FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
1158 FX_BOOL bLeftMargin =
1159 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
1160 FX_BOOL bRightMargin =
1161 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
1162 FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
1163 FX_BOOL bTopMargin =
1164 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
1165 FX_BOOL bBottomMargin =
1166 GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
1167 if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
1168 SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
1169 } else {
1170 if (bLeftMargin && bRightMargin) {
1171 SetWidgetActualWidth(pInfo, fColumnWidth - fLeftMargin - fRightMargin);
1172 } else {
1173 CFX_RectF rtAuto;
1174 pWidget->GetWidgetRect(rtAuto, TRUE);
1175 SetWidgetActualWidth(pInfo, rtAuto.width);
1176 }
1177 }
1178 if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
1179 SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
1180 } else {
1181 if (bTopMargin && bBottomMargin) {
1182 SetWidgetActualHeight(pInfo, fRowHeight - fTopMargin - fBottomMargin);
1183 } else {
1184 CFX_RectF rtAuto;
1185 pWidget->GetWidgetRect(rtAuto, TRUE);
1186 SetWidgetActualHeight(pInfo, rtAuto.height);
1187 }
1188 }
1189 if (bLeftMargin && bRightMargin &&
1190 pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
1191 fLeftMargin =
1192 fColumnStart + fLeftMargin +
1193 (fColumnWidth - fLeftMargin - fRightMargin - pInfo->m_fActualWidth) /
1194 2;
1195 } else if (bLeftMargin) {
1196 fLeftMargin = fColumnStart + fLeftMargin;
1197 } else if (bRightMargin) {
1198 fLeftMargin =
1199 fColumnStart + fColumnWidth - fRightMargin - pInfo->m_fActualWidth;
1200 } else {
1201 fLeftMargin = fColumnStart;
1202 }
1203 if (bTopMargin && bBottomMargin &&
1204 pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
1205 fTopMargin =
1206 fRowStart + fTopMargin +
1207 (fRowHeight - fTopMargin - fBottomMargin - pInfo->m_fActualHeight) /
1208 2;
1209 } else if (bTopMargin) {
1210 fTopMargin = fRowStart + fTopMargin;
1211 } else if (bBottomMargin) {
1212 fTopMargin =
1213 fRowStart + fRowHeight - fBottomMargin - pInfo->m_fActualHeight;
1214 } else {
1215 fTopMargin = fRowStart;
1216 }
1217 CFX_RectF rtWidget, rtOld;
1218 rtWidget.Set(fLeftMargin, fTopMargin, pInfo->m_fActualWidth,
1219 pInfo->m_fActualHeight);
1220 pWidget->GetWidgetRect(rtOld);
1221 if (rtWidget == rtOld) {
1222 continue;
1223 }
1224 pWidget->SetWidgetRect(rtWidget);
1225 if (rtWidget.width == rtOld.width && rtWidget.height == rtOld.height) {
1226 continue;
1227 }
1228 pWidget->Update();
1229 }
1230 }
1231 FX_BOOL CFWL_GridImp::IsGrid(IFWL_Widget* pWidget) {
1232 if (!pWidget)
1233 return FALSE;
1234 return pWidget->GetClassID() == FWL_CLASSHASH_Grid;
1235 }
1236 void CFWL_GridImp::SetSpanAutoColRowSize(const CFX_PtrArray& spanAutos,
1237 FX_FLOAT fTotalSize) {
1238 int32_t iAutoColRows = spanAutos.GetSize();
1239 if (iAutoColRows < 1) {
1240 return;
1241 }
1242 CFX_PtrArray autoNoMinMaxs;
1243 FX_FLOAT fAutoPer = fTotalSize / iAutoColRows;
1244 for (int32_t j = 0; j < iAutoColRows; j++) {
1245 CFWL_GridColRow* pColumn = static_cast<CFWL_GridColRow*>(spanAutos[j]);
1246 FX_FLOAT fOrgSize = pColumn->m_fActualSize;
1247 if (SetColRowActualSize(pColumn, pColumn->m_fActualSize + fAutoPer, TRUE)) {
1248 autoNoMinMaxs.Add(pColumn);
1249 } else {
1250 fTotalSize -= pColumn->m_fActualSize - fOrgSize;
1251 int32_t iNoMinMax = iAutoColRows - (j + 1 - autoNoMinMaxs.GetSize());
1252 if (iNoMinMax > 0 && fTotalSize > 0) {
1253 fAutoPer = fTotalSize / iNoMinMax;
1254 } else {
1255 break;
1256 }
1257 }
1258 }
1259 int32_t iNormals = autoNoMinMaxs.GetSize();
1260 if (fTotalSize > 0) {
1261 if (iNormals == iAutoColRows) {
1262 fAutoPer = fTotalSize / iNormals;
1263 for (int32_t k = 0; k < iNormals; k++) {
1264 CFWL_GridColRow* pColumn =
1265 static_cast<CFWL_GridColRow*>(autoNoMinMaxs[k]);
1266 pColumn->m_fActualSize += fAutoPer;
1267 }
1268 } else {
1269 SetSpanAutoColRowSize(autoNoMinMaxs, fTotalSize);
1270 }
1271 } else {
1272 }
1273 }
1274 void CFWL_GridImp::SetSpanScaledColRowSize(const CFX_PtrArray& spanScaleds,
1275 FX_FLOAT fTotalSize,
1276 FX_FLOAT fTotalScaledNum) {
1277 int32_t iScaledColRows = spanScaleds.GetSize();
1278 if (iScaledColRows < 1) {
1279 return;
1280 }
1281 CFX_PtrArray autoNoMinMaxs;
1282 FX_FLOAT fPerSize = fTotalSize / fTotalScaledNum;
1283 for (int32_t i = 0; i < iScaledColRows; i++) {
1284 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(spanScaleds[i]);
1285 if (SetColRowActualSize(pColRow, pColRow->m_fActualSize +
1286 fPerSize * pColRow->m_Size.fLength,
1287 TRUE)) {
1288 autoNoMinMaxs.Add(pColRow);
1289 } else {
1290 fTotalSize -= pColRow->m_fActualSize;
1291 fTotalScaledNum -= pColRow->m_Size.fLength;
1292 int32_t iNoMinMax = iScaledColRows - (i + 1 - autoNoMinMaxs.GetSize());
1293 if (iNoMinMax > 0 && fTotalSize > 0) {
1294 fPerSize = fTotalSize / fTotalScaledNum;
1295 } else {
1296 break;
1297 }
1298 }
1299 }
1300 int32_t iNormals = autoNoMinMaxs.GetSize();
1301 if (fTotalSize > 0) {
1302 if (iNormals == iScaledColRows) {
1303 fPerSize = fTotalSize / fTotalScaledNum;
1304 for (int32_t j = 0; j < iNormals; j++) {
1305 CFWL_GridColRow* pColumn =
1306 static_cast<CFWL_GridColRow*>(autoNoMinMaxs[j]);
1307 pColumn->m_fActualSize += fPerSize * pColumn->m_Size.fLength;
1308 }
1309 } else {
1310 SetSpanScaledColRowSize(autoNoMinMaxs, fTotalSize, fTotalScaledNum);
1311 }
1312 } else {
1313 }
1314 }
1315 void CFWL_GridImp::SetScaledColRowsSize(const CFX_PtrArray& spanScaleds,
1316 FX_FLOAT fTotalSize,
1317 FX_FLOAT fTotalScaledNum) {
1318 int32_t iScaledColRows = spanScaleds.GetSize();
1319 if (iScaledColRows < 1) {
1320 return;
1321 }
1322 CFX_PtrArray autoNoMinMaxs;
1323 FX_FLOAT fPerSize = fTotalSize / fTotalScaledNum;
1324 for (int32_t i = 0; i < iScaledColRows; i++) {
1325 CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(spanScaleds[i]);
1326 if (!pColRow) {
1327 continue;
1328 }
1329 FX_FLOAT fSize = fPerSize * pColRow->m_Size.fLength;
1330 FX_FLOAT fOrgSize = pColRow->m_fActualSize;
1331 if (SetColRowActualSize(pColRow, fSize, TRUE)) {
1332 autoNoMinMaxs.Add(pColRow);
1333 } else {
1334 fTotalSize -= pColRow->m_fActualSize - fOrgSize;
1335 fTotalScaledNum -= pColRow->m_Size.fLength;
1336 int32_t iNoMinMax = iScaledColRows - (i + 1 - autoNoMinMaxs.GetSize());
1337 if (iNoMinMax > 0 && fTotalSize > 0) {
1338 fPerSize = fTotalSize / fTotalScaledNum;
1339 } else {
1340 break;
1341 }
1342 }
1343 }
1344 int32_t iNormals = autoNoMinMaxs.GetSize();
1345 if (fTotalSize > 0) {
1346 if (iNormals == iScaledColRows) {
1347 fPerSize = fTotalSize / fTotalScaledNum;
1348 for (int32_t i = 0; i < iNormals; i++) {
1349 CFWL_GridColRow* pColRow =
1350 static_cast<CFWL_GridColRow*>(autoNoMinMaxs[i]);
1351 if (!pColRow) {
1352 continue;
1353 }
1354 FX_FLOAT fSize = fPerSize * pColRow->m_Size.fLength;
1355 pColRow->m_fActualSize = fSize;
1356 }
1357 } else {
1358 SetScaledColRowsSize(autoNoMinMaxs, fTotalSize, fTotalScaledNum);
1359 }
1360 } else {
1361 }
1362 }
1363 CFWL_GridImpDelegate::CFWL_GridImpDelegate(CFWL_GridImp* pOwner)
1364 : m_pOwner(pOwner) {}
1365 int32_t CFWL_GridImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
1366 if (pMessage->GetClassID() != FWL_MSGHASH_Mouse) {
1367 return 0;
1368 }
1369 CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
1370 if (pMsg->m_dwCmd != FWL_MSGMOUSECMD_LButtonDown) {
1371 return 0;
1372 }
1373 return 1;
1374 }
1375 FWL_ERR CFWL_GridImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
1376 const CFX_Matrix* pMatrix) {
1377 return m_pOwner->DrawWidget(pGraphics, pMatrix);
1378 }
OLDNEW
« no previous file with comments | « xfa/src/fwl/core/fwl_gridimp.h ('k') | xfa/src/fwl/core/fwl_noteimp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698