// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // @dart = 2.9 part of layout; /** * Caches the layout parameters that were specified in CSS during a layout * computation. These values are immutable during a layout. */ // TODO(jmesserly): I would like all fields to be final, but it's too painful // to do this right now in Dart. If I create a factory constructor, then I need // to create locals, and pass all parameters to the real constructor. Each // field ends up being mentioned 4 times instead of just twice. class GridLayoutParams extends LayoutParams { /** The coordinates of this item in the grid. */ int row; int column; int rowSpan; int columnSpan; int layer; /** Alignment within its box */ GridItemAlignment rowAlign; GridItemAlignment columnAlign; GridLayoutParams(Positionable view, GridLayout layout) : super(view.node) { // TODO(jmesserly): this can be cleaned up a lot by just passing "view" // into the parsers. rowAlign = new GridItemAlignment.fromString(view.customStyle['grid-row-align']); columnAlign = new GridItemAlignment.fromString(view.customStyle['grid-column-align']); layer = StringUtils.parseInt(view.customStyle['grid-layer'], 0); rowSpan = StringUtils.parseInt(view.customStyle['grid-row-span']); columnSpan = StringUtils.parseInt(view.customStyle['grid-column-span']); var line = _GridItemParser.parse(view.customStyle['grid-row'], layout.rows); if (line != null) { row = line.start; if (line.length != null) { if (rowSpan != null) { throw new UnsupportedError( 'grid-row-span cannot be with grid-row that defines an end'); } rowSpan = line.length; } } line = _GridItemParser.parse(view.customStyle['grid-column'], layout.columns); if (line != null) { column = line.start; if (line.length != null) { if (columnSpan != null) { throw new UnsupportedError( 'grid-column-span cannot be with grid-column that defines an end'); } columnSpan = line.length; } } String cell = _GridTemplateParser.parseCell(view.customStyle['grid-cell']); if (cell != null && cell != 'none') { // TODO(jmesserly): I didn't see anything spec'd about conflicts and // error handling. For now, throw an error on a misconfigured view. // CSS is designed to be a permissive language, though, so we should do // better and resolve conflicts more intelligently. if (row != null || column != null || rowSpan != null || columnSpan != null) { throw new UnsupportedError( 'grid-cell cannot be used with grid-row and grid-column'); } if (layout.template == null) { throw new UnsupportedError( 'grid-cell requires that grid-template is set on the parent'); } final rect = layout.template.lookupCell(cell); row = rect.row; column = rect.column; rowSpan = rect.rowSpan; columnSpan = rect.columnSpan; } else { // Apply default row, column span values. if (rowSpan == null) rowSpan = 1; if (columnSpan == null) columnSpan = 1; if (row == null && column == null) { throw new UnsupportedError('grid-flow is not implemented' + ' so at least one row or one column must be defined'); } if (row == null) row = 1; if (column == null) column = 1; } assert(row > 0 && rowSpan > 0 && column > 0 && columnSpan > 0); } }