OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 /** | |
6 * Caches the layout parameters that were specified in CSS during a layout | |
7 * computation. These values are immutable during a layout. | |
8 */ | |
9 // TODO(jmesserly): I would like all fields to be final, but it's too painful | |
10 // to do this right now in Dart. If I create a factory constructor, then I need | |
11 // to create locals, and pass all parameters to the real constructor. Each | |
12 // field ends up being mentioned 4 times instead of just twice. | |
13 class GridLayoutParams extends LayoutParams { | |
14 /** The coordinates of this item in the grid. */ | |
15 int row; | |
16 int column; | |
17 int rowSpan; | |
18 int columnSpan; | |
19 int layer; | |
20 | |
21 /** Alignment within its box */ | |
22 GridItemAlignment rowAlign; | |
23 GridItemAlignment columnAlign; | |
24 | |
25 GridLayoutParams(Positionable view, GridLayout layout) | |
26 : super(view.node) { | |
27 | |
28 // TODO(jmesserly): this can be cleaned up a lot by just passing "view" | |
29 // into the parsers. | |
30 | |
31 rowAlign = new GridItemAlignment.fromString( | |
32 view.customStyle['grid-row-align']); | |
33 columnAlign = new GridItemAlignment.fromString( | |
34 view.customStyle['grid-column-align']); | |
35 | |
36 layer = StringUtils.parseInt(view.customStyle['grid-layer'], 0); | |
37 | |
38 rowSpan = StringUtils.parseInt(view.customStyle['grid-row-span']); | |
39 columnSpan = StringUtils.parseInt(view.customStyle['grid-column-span']); | |
40 | |
41 var line = _GridItemParser.parse( | |
42 view.customStyle['grid-row'], layout.rows); | |
43 if (line != null) { | |
44 row = line.start; | |
45 if (line.length != null) { | |
46 if (rowSpan != null) { | |
47 throw new UnsupportedOperationException( | |
48 'grid-row-span cannot be with grid-row that defines an end'); | |
49 } | |
50 rowSpan = line.length; | |
51 } | |
52 } | |
53 | |
54 line = _GridItemParser.parse( | |
55 view.customStyle['grid-column'], layout.columns); | |
56 | |
57 if (line != null) { | |
58 column = line.start; | |
59 if (line.length != null) { | |
60 if (columnSpan != null) { | |
61 throw new UnsupportedOperationException( | |
62 'grid-column-span cannot be with grid-column that defines an end'); | |
63 } | |
64 columnSpan = line.length; | |
65 } | |
66 } | |
67 | |
68 String cell = _GridTemplateParser.parseCell(view.customStyle['grid-cell']); | |
69 if (cell != null && cell != 'none') { | |
70 // TODO(jmesserly): I didn't see anything spec'd about conflicts and | |
71 // error handling. For now, throw an error on a misconfigured view. | |
72 // CSS is designed to be a permissive language, though, so we should do | |
73 // better and resolve conflicts more intelligently. | |
74 if (row != null || column != null || | |
75 rowSpan != null || columnSpan != null) { | |
76 throw new UnsupportedOperationException( | |
77 'grid-cell cannot be used with grid-row and grid-column'); | |
78 } | |
79 | |
80 if (layout.template == null) { | |
81 throw new UnsupportedOperationException( | |
82 'grid-cell requires that grid-template is set on the parent'); | |
83 } | |
84 | |
85 final rect = layout.template.lookupCell(cell); | |
86 row = rect.row; | |
87 column = rect.column; | |
88 rowSpan = rect.rowSpan; | |
89 columnSpan = rect.columnSpan; | |
90 | |
91 } else { | |
92 // Apply default row, column span values. | |
93 if (rowSpan == null) rowSpan = 1; | |
94 if (columnSpan == null) columnSpan = 1; | |
95 | |
96 if (row == null && column == null) { | |
97 throw new UnsupportedOperationException('grid-flow is not implemented' | |
98 + ' so at least one row or one column must be defined'); | |
99 } | |
100 | |
101 if (row == null) row = 1; | |
102 if (column == null) column = 1; | |
103 } | |
104 | |
105 assert(row > 0 && rowSpan > 0 && column > 0 && columnSpan > 0); | |
106 } | |
107 } | |
OLD | NEW |