OLD | NEW |
1 /** | 1 /** |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2000 Simon Hausmann <hausmann@kde.org> | 3 * (C) 2000 Simon Hausmann <hausmann@kde.org> |
4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) | 4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) |
5 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. | 5 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 m_minPreferredLogicalWidth = LayoutUnit(); | 59 m_minPreferredLogicalWidth = LayoutUnit(); |
60 m_maxPreferredLogicalWidth = LayoutUnit(); | 60 m_maxPreferredLogicalWidth = LayoutUnit(); |
61 clearPreferredLogicalWidthsDirty(); | 61 clearPreferredLogicalWidthsDirty(); |
62 } | 62 } |
63 | 63 |
64 void LayoutFrameSet::GridAxis::resize(int size) { | 64 void LayoutFrameSet::GridAxis::resize(int size) { |
65 m_sizes.resize(size); | 65 m_sizes.resize(size); |
66 m_deltas.resize(size); | 66 m_deltas.resize(size); |
67 m_deltas.fill(0); | 67 m_deltas.fill(0); |
68 | 68 |
69 // To track edges for resizability and borders, we need to be (size + 1). This
is because a parent frameset | 69 // To track edges for resizability and borders, we need to be (size + 1). This |
70 // may ask us for information about our left/top/right/bottom edges in order t
o make its own decisions about | 70 // is because a parent frameset may ask us for information about our left/top/ |
71 // what to do. We are capable of tainting that parent frameset's borders, so w
e have to cache this info. | 71 // right/bottom edges in order to make its own decisions about what to do. We |
| 72 // are capable of tainting that parent frameset's borders, so we have to cache |
| 73 // this info. |
72 m_preventResize.resize(size + 1); | 74 m_preventResize.resize(size + 1); |
73 m_allowBorder.resize(size + 1); | 75 m_allowBorder.resize(size + 1); |
74 } | 76 } |
75 | 77 |
76 void LayoutFrameSet::layOutAxis(GridAxis& axis, | 78 void LayoutFrameSet::layOutAxis(GridAxis& axis, |
77 const Vector<HTMLDimension>& grid, | 79 const Vector<HTMLDimension>& grid, |
78 int availableLen) { | 80 int availableLen) { |
79 availableLen = max(availableLen, 0); | 81 availableLen = max(availableLen, 0); |
80 | 82 |
81 int* gridLayout = axis.m_sizes.data(); | 83 int* gridLayout = axis.m_sizes.data(); |
(...skipping 11 matching lines...) Expand all Loading... |
93 int totalPercent = 0; | 95 int totalPercent = 0; |
94 int countRelative = 0; | 96 int countRelative = 0; |
95 int countFixed = 0; | 97 int countFixed = 0; |
96 int countPercent = 0; | 98 int countPercent = 0; |
97 | 99 |
98 float effectiveZoom = style()->effectiveZoom(); | 100 float effectiveZoom = style()->effectiveZoom(); |
99 | 101 |
100 // First we need to investigate how many columns of each type we have and | 102 // First we need to investigate how many columns of each type we have and |
101 // how much space these columns are going to require. | 103 // how much space these columns are going to require. |
102 for (int i = 0; i < gridLen; ++i) { | 104 for (int i = 0; i < gridLen; ++i) { |
103 // Count the total length of all of the fixed columns/rows -> totalFixed | 105 // Count the total length of all of the fixed columns/rows -> totalFixed. |
104 // Count the number of columns/rows which are fixed -> countFixed | 106 // Count the number of columns/rows which are fixed -> countFixed. |
105 if (grid[i].isAbsolute()) { | 107 if (grid[i].isAbsolute()) { |
106 gridLayout[i] = max<int>(grid[i].value() * effectiveZoom, 0); | 108 gridLayout[i] = max<int>(grid[i].value() * effectiveZoom, 0); |
107 totalFixed += gridLayout[i]; | 109 totalFixed += gridLayout[i]; |
108 countFixed++; | 110 countFixed++; |
109 } | 111 } |
110 | 112 |
111 // Count the total percentage of all of the percentage columns/rows -> total
Percent | 113 // Count the total percentage of all of the percentage columns/rows -> |
112 // Count the number of columns/rows which are percentages -> countPercent | 114 // totalPercent. Count the number of columns/rows which are percentages -> |
| 115 // countPercent. |
113 if (grid[i].isPercentage()) { | 116 if (grid[i].isPercentage()) { |
114 gridLayout[i] = max<int>(grid[i].value() * availableLen / 100., 0); | 117 gridLayout[i] = max<int>(grid[i].value() * availableLen / 100., 0); |
115 totalPercent += gridLayout[i]; | 118 totalPercent += gridLayout[i]; |
116 countPercent++; | 119 countPercent++; |
117 } | 120 } |
118 | 121 |
119 // Count the total relative of all the relative columns/rows -> totalRelativ
e | 122 // Count the total relative of all the relative columns/rows -> |
120 // Count the number of columns/rows which are relative -> countRelative | 123 // totalRelative. Count the number of columns/rows which are relative -> |
| 124 // countRelative. |
121 if (grid[i].isRelative()) { | 125 if (grid[i].isRelative()) { |
122 totalRelative += max<int>(grid[i].value(), 1); | 126 totalRelative += max<int>(grid[i].value(), 1); |
123 countRelative++; | 127 countRelative++; |
124 } | 128 } |
125 } | 129 } |
126 | 130 |
127 int remainingLen = availableLen; | 131 int remainingLen = availableLen; |
128 | 132 |
129 // Fixed columns/rows are our first priority. If there is not enough space to
fit all fixed | 133 // Fixed columns/rows are our first priority. If there is not enough space to |
130 // columns/rows we need to proportionally adjust their size. | 134 // fit all fixed columns/rows we need to proportionally adjust their size. |
131 if (totalFixed > remainingLen) { | 135 if (totalFixed > remainingLen) { |
132 int remainingFixed = remainingLen; | 136 int remainingFixed = remainingLen; |
133 | 137 |
134 for (int i = 0; i < gridLen; ++i) { | 138 for (int i = 0; i < gridLen; ++i) { |
135 if (grid[i].isAbsolute()) { | 139 if (grid[i].isAbsolute()) { |
136 gridLayout[i] = (gridLayout[i] * remainingFixed) / totalFixed; | 140 gridLayout[i] = (gridLayout[i] * remainingFixed) / totalFixed; |
137 remainingLen -= gridLayout[i]; | 141 remainingLen -= gridLayout[i]; |
138 } | 142 } |
139 } | 143 } |
140 } else { | 144 } else { |
141 remainingLen -= totalFixed; | 145 remainingLen -= totalFixed; |
142 } | 146 } |
143 | 147 |
144 // Percentage columns/rows are our second priority. Divide the remaining space
proportionally | 148 // Percentage columns/rows are our second priority. Divide the remaining space |
145 // over all percentage columns/rows. IMPORTANT: the size of each column/row is
not relative | 149 // proportionally over all percentage columns/rows. |
146 // to 100%, but to the total percentage. For example, if there are three colum
ns, each of 75%, | 150 // NOTE: the size of each column/row is not relative to 100%, but to the total |
147 // and the available space is 300px, each column will become 100px in width. | 151 // percentage. For example, if there are three columns, each of 75%, and the |
| 152 // available space is 300px, each column will become 100px in width. |
148 if (totalPercent > remainingLen) { | 153 if (totalPercent > remainingLen) { |
149 int remainingPercent = remainingLen; | 154 int remainingPercent = remainingLen; |
150 | 155 |
151 for (int i = 0; i < gridLen; ++i) { | 156 for (int i = 0; i < gridLen; ++i) { |
152 if (grid[i].isPercentage()) { | 157 if (grid[i].isPercentage()) { |
153 gridLayout[i] = (gridLayout[i] * remainingPercent) / totalPercent; | 158 gridLayout[i] = (gridLayout[i] * remainingPercent) / totalPercent; |
154 remainingLen -= gridLayout[i]; | 159 remainingLen -= gridLayout[i]; |
155 } | 160 } |
156 } | 161 } |
157 } else { | 162 } else { |
158 remainingLen -= totalPercent; | 163 remainingLen -= totalPercent; |
159 } | 164 } |
160 | 165 |
161 // Relative columns/rows are our last priority. Divide the remaining space pro
portionally | 166 // Relative columns/rows are our last priority. Divide the remaining space |
162 // over all relative columns/rows. IMPORTANT: the relative value of 0* is trea
ted as 1*. | 167 // proportionally over all relative columns/rows. |
| 168 // NOTE: the relative value of 0* is treated as 1*. |
163 if (countRelative) { | 169 if (countRelative) { |
164 int lastRelative = 0; | 170 int lastRelative = 0; |
165 int remainingRelative = remainingLen; | 171 int remainingRelative = remainingLen; |
166 | 172 |
167 for (int i = 0; i < gridLen; ++i) { | 173 for (int i = 0; i < gridLen; ++i) { |
168 if (grid[i].isRelative()) { | 174 if (grid[i].isRelative()) { |
169 gridLayout[i] = | 175 gridLayout[i] = |
170 (max(grid[i].value(), 1.) * remainingRelative) / totalRelative; | 176 (max(grid[i].value(), 1.) * remainingRelative) / totalRelative; |
171 remainingLen -= gridLayout[i]; | 177 remainingLen -= gridLayout[i]; |
172 lastRelative = i; | 178 lastRelative = i; |
173 } | 179 } |
174 } | 180 } |
175 | 181 |
176 // If we could not evenly distribute the available space of all of the relat
ive | 182 // If we could not evenly distribute the available space of all of the |
177 // columns/rows, the remainder will be added to the last column/row. | 183 // relative columns/rows, the remainder will be added to the last column/ |
178 // For example: if we have a space of 100px and three columns (*,*,*), the r
emainder will | 184 // row. For example: if we have a space of 100px and three columns (*,*,*), |
179 // be 1px and will be added to the last column: 33px, 33px, 34px. | 185 // the remainder will be 1px and will be added to the last column: 33px, |
| 186 // 33px, 34px. |
180 if (remainingLen) { | 187 if (remainingLen) { |
181 gridLayout[lastRelative] += remainingLen; | 188 gridLayout[lastRelative] += remainingLen; |
182 remainingLen = 0; | 189 remainingLen = 0; |
183 } | 190 } |
184 } | 191 } |
185 | 192 |
186 // If we still have some left over space we need to divide it over the already
existing | 193 // If we still have some left over space we need to divide it over the already |
187 // columns/rows | 194 // existing columns/rows |
188 if (remainingLen) { | 195 if (remainingLen) { |
189 // Our first priority is to spread if over the percentage columns. The remai
ning | 196 // Our first priority is to spread if over the percentage columns. The |
190 // space is spread evenly, for example: if we have a space of 100px, the col
umns | 197 // remaining space is spread evenly, for example: if we have a space of |
191 // definition of 25%,25% used to result in two columns of 25px. After this t
he | 198 // 100px, the columns definition of 25%,25% used to result in two columns of |
192 // columns will each be 50px in width. | 199 // 25px. After this the columns will each be 50px in width. |
193 if (countPercent && totalPercent) { | 200 if (countPercent && totalPercent) { |
194 int remainingPercent = remainingLen; | 201 int remainingPercent = remainingLen; |
195 int changePercent = 0; | 202 int changePercent = 0; |
196 | 203 |
197 for (int i = 0; i < gridLen; ++i) { | 204 for (int i = 0; i < gridLen; ++i) { |
198 if (grid[i].isPercentage()) { | 205 if (grid[i].isPercentage()) { |
199 changePercent = (remainingPercent * gridLayout[i]) / totalPercent; | 206 changePercent = (remainingPercent * gridLayout[i]) / totalPercent; |
200 gridLayout[i] += changePercent; | 207 gridLayout[i] += changePercent; |
201 remainingLen -= changePercent; | 208 remainingLen -= changePercent; |
202 } | 209 } |
203 } | 210 } |
204 } else if (totalFixed) { | 211 } else if (totalFixed) { |
205 // Our last priority is to spread the remaining space over the fixed colum
ns. | 212 // Our last priority is to spread the remaining space over the fixed |
206 // For example if we have 100px of space and two column of each 40px, both | 213 // columns. For example if we have 100px of space and two column of each |
207 // columns will become exactly 50px. | 214 // 40px, both columns will become exactly 50px. |
208 int remainingFixed = remainingLen; | 215 int remainingFixed = remainingLen; |
209 int changeFixed = 0; | 216 int changeFixed = 0; |
210 | 217 |
211 for (int i = 0; i < gridLen; ++i) { | 218 for (int i = 0; i < gridLen; ++i) { |
212 if (grid[i].isAbsolute()) { | 219 if (grid[i].isAbsolute()) { |
213 changeFixed = (remainingFixed * gridLayout[i]) / totalFixed; | 220 changeFixed = (remainingFixed * gridLayout[i]) / totalFixed; |
214 gridLayout[i] += changeFixed; | 221 gridLayout[i] += changeFixed; |
215 remainingLen -= changeFixed; | 222 remainingLen -= changeFixed; |
216 } | 223 } |
217 } | 224 } |
218 } | 225 } |
219 } | 226 } |
220 | 227 |
221 // If we still have some left over space we probably ended up with a remainder
of | 228 // If we still have some left over space we probably ended up with a remainder |
222 // a division. We cannot spread it evenly anymore. If we have any percentage | 229 // of a division. We cannot spread it evenly anymore. If we have any |
223 // columns/rows simply spread the remainder equally over all available percent
age columns, | 230 // percentage columns/rows simply spread the remainder equally over all |
224 // regardless of their size. | 231 // available percentage columns, regardless of their size. |
225 if (remainingLen && countPercent) { | 232 if (remainingLen && countPercent) { |
226 int remainingPercent = remainingLen; | 233 int remainingPercent = remainingLen; |
227 int changePercent = 0; | 234 int changePercent = 0; |
228 | 235 |
229 for (int i = 0; i < gridLen; ++i) { | 236 for (int i = 0; i < gridLen; ++i) { |
230 if (grid[i].isPercentage()) { | 237 if (grid[i].isPercentage()) { |
231 changePercent = remainingPercent / countPercent; | 238 changePercent = remainingPercent / countPercent; |
232 gridLayout[i] += changePercent; | 239 gridLayout[i] += changePercent; |
233 remainingLen -= changePercent; | 240 remainingLen -= changePercent; |
234 } | 241 } |
235 } | 242 } |
236 } else if (remainingLen && countFixed) { | 243 } else if (remainingLen && countFixed) { |
237 // If we don't have any percentage columns/rows we only have | 244 // If we don't have any percentage columns/rows we only have fixed columns. |
238 // fixed columns. Spread the remainder equally over all fixed | 245 // Spread the remainder equally over all fixed columns/rows. |
239 // columns/rows. | |
240 int remainingFixed = remainingLen; | 246 int remainingFixed = remainingLen; |
241 int changeFixed = 0; | 247 int changeFixed = 0; |
242 | 248 |
243 for (int i = 0; i < gridLen; ++i) { | 249 for (int i = 0; i < gridLen; ++i) { |
244 if (grid[i].isAbsolute()) { | 250 if (grid[i].isAbsolute()) { |
245 changeFixed = remainingFixed / countFixed; | 251 changeFixed = remainingFixed / countFixed; |
246 gridLayout[i] += changeFixed; | 252 gridLayout[i] += changeFixed; |
247 remainingLen -= changeFixed; | 253 remainingLen -= changeFixed; |
248 } | 254 } |
249 } | 255 } |
(...skipping 16 matching lines...) Expand all Loading... |
266 if (!worked) { | 272 if (!worked) { |
267 for (int i = 0; i < gridLen; ++i) | 273 for (int i = 0; i < gridLen; ++i) |
268 gridLayout[i] -= gridDelta[i]; | 274 gridLayout[i] -= gridDelta[i]; |
269 axis.m_deltas.fill(0); | 275 axis.m_deltas.fill(0); |
270 } | 276 } |
271 } | 277 } |
272 | 278 |
273 void LayoutFrameSet::notifyFrameEdgeInfoChanged() { | 279 void LayoutFrameSet::notifyFrameEdgeInfoChanged() { |
274 if (needsLayout()) | 280 if (needsLayout()) |
275 return; | 281 return; |
276 // FIXME: We should only recompute the edge info with respect to the frame tha
t changed | 282 // FIXME: We should only recompute the edge info with respect to the frame |
277 // and its adjacent frame(s) instead of recomputing the edge info for the enti
re frameset. | 283 // that changed and its adjacent frame(s) instead of recomputing the edge info |
| 284 // for the entire frameset. |
278 computeEdgeInfo(); | 285 computeEdgeInfo(); |
279 } | 286 } |
280 | 287 |
281 void LayoutFrameSet::fillFromEdgeInfo(const FrameEdgeInfo& edgeInfo, | 288 void LayoutFrameSet::fillFromEdgeInfo(const FrameEdgeInfo& edgeInfo, |
282 int r, | 289 int r, |
283 int c) { | 290 int c) { |
284 if (edgeInfo.allowBorder(LeftFrameEdge)) | 291 if (edgeInfo.allowBorder(LeftFrameEdge)) |
285 m_cols.m_allowBorder[c] = true; | 292 m_cols.m_allowBorder[c] = true; |
286 if (edgeInfo.allowBorder(RightFrameEdge)) | 293 if (edgeInfo.allowBorder(RightFrameEdge)) |
287 m_cols.m_allowBorder[c + 1] = true; | 294 m_cols.m_allowBorder[c + 1] = true; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 int borderThickness = frameSet()->border(); | 406 int borderThickness = frameSet()->border(); |
400 LayoutSize size; | 407 LayoutSize size; |
401 LayoutPoint position; | 408 LayoutPoint position; |
402 for (int r = 0; r < rows; r++) { | 409 for (int r = 0; r < rows; r++) { |
403 position.setX(LayoutUnit()); | 410 position.setX(LayoutUnit()); |
404 size.setHeight(LayoutUnit(m_rows.m_sizes[r])); | 411 size.setHeight(LayoutUnit(m_rows.m_sizes[r])); |
405 for (int c = 0; c < cols; c++) { | 412 for (int c = 0; c < cols; c++) { |
406 child->setLocation(position); | 413 child->setLocation(position); |
407 size.setWidth(LayoutUnit(m_cols.m_sizes[c])); | 414 size.setWidth(LayoutUnit(m_cols.m_sizes[c])); |
408 | 415 |
409 // If we have a new size, we need to resize and layout the child. If the s
ize is 0x0 we | 416 // If we have a new size, we need to resize and layout the child. If the |
410 // also need to lay out, since this may mean that we're dealing with a chi
ld frameset | 417 // size is 0x0 we also need to lay out, since this may mean that we're |
411 // that wasn't previously initialized properly, because it was previously
hidden, but | 418 // dealing with a child frameset that wasn't previously initialized |
412 // no longer is, because rows * cols may have increased. | 419 // properly, because it was previously hidden, but no longer is, because |
| 420 // rows * cols may have increased. |
413 if (size != child->size() || size.isEmpty()) { | 421 if (size != child->size() || size.isEmpty()) { |
414 child->setSize(size); | 422 child->setSize(size); |
415 child->setNeedsLayoutAndFullPaintInvalidation( | 423 child->setNeedsLayoutAndFullPaintInvalidation( |
416 LayoutInvalidationReason::SizeChanged); | 424 LayoutInvalidationReason::SizeChanged); |
417 child->layout(); | 425 child->layout(); |
418 } | 426 } |
419 | 427 |
420 position.setX(position.x() + size.width() + borderThickness); | 428 position.setX(position.x() + size.width() + borderThickness); |
421 | 429 |
422 child = child->nextSiblingBox(); | 430 child = child->nextSiblingBox(); |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 return SetCursor; | 571 return SetCursor; |
564 } | 572 } |
565 if (canResizeColumn(roundedPoint)) { | 573 if (canResizeColumn(roundedPoint)) { |
566 cursor = columnResizeCursor(); | 574 cursor = columnResizeCursor(); |
567 return SetCursor; | 575 return SetCursor; |
568 } | 576 } |
569 return LayoutBox::getCursor(point, cursor); | 577 return LayoutBox::getCursor(point, cursor); |
570 } | 578 } |
571 | 579 |
572 } // namespace blink | 580 } // namespace blink |
OLD | NEW |