Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of app; | 5 part of app; |
| 6 | 6 |
| 7 abstract class TableTreeRow extends Observable { | 7 abstract class TableTreeRow extends Observable { |
| 8 final TableTreeRow parent; | 8 final TableTreeRow parent; |
| 9 @observable final int depth; | 9 @observable final int depth; |
| 10 @observable final List<TableTreeRow> children = new List<TableTreeRow>(); | 10 @observable final List<TableTreeRow> children = new List<TableTreeRow>(); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 92 _collapse(row.children[i]); | 92 _collapse(row.children[i]); |
| 93 } | 93 } |
| 94 } | 94 } |
| 95 // Collapse this row. | 95 // Collapse this row. |
| 96 row.expanded = false; | 96 row.expanded = false; |
| 97 // Remove all children. | 97 // Remove all children. |
| 98 int index = _index(row); | 98 int index = _index(row); |
| 99 rows.removeRange(index + 1, index + 1 + childCount); | 99 rows.removeRange(index + 1, index + 1 + childCount); |
| 100 } | 100 } |
| 101 } | 101 } |
| 102 | |
| 103 typedef String ValueFormatter(dynamic value); | |
| 104 | |
| 105 class SortedTableColumn { | |
| 106 static String toStringFormatter(dynamic v) => v != null ? v.toString() : '<nul l>'; | |
|
turnidge
2014/04/17 20:18:54
Line is long.
Cutch
2014/04/17 22:12:39
Done.
| |
| 107 final String label; | |
| 108 final ValueFormatter formatter; | |
| 109 SortedTableColumn.withFormatter(this.label, this.formatter); | |
| 110 SortedTableColumn(this.label) | |
| 111 : formatter = toStringFormatter; | |
| 112 } | |
| 113 | |
| 114 class SortedTableRow { | |
| 115 final List values; | |
| 116 SortedTableRow(this.values); | |
| 117 } | |
| 118 | |
| 119 class SortedTable extends Observable { | |
| 120 final List<SortedTableColumn> columns; | |
| 121 final List<SortedTableRow> rows = new List<SortedTableRow>(); | |
| 122 final List<int> _order = []; | |
|
turnidge
2014/04/17 20:18:54
name - maybe _sortedRows?
Cutch
2014/04/17 22:12:39
Done.
Cutch
2014/04/17 22:12:39
Done.
| |
| 123 | |
| 124 SortedTable(this.columns) { | |
|
turnidge
2014/04/17 20:18:54
drop constructor body -> SortedTable(this.columns)
Cutch
2014/04/17 22:12:39
Done.
| |
| 125 | |
| 126 } | |
| 127 | |
| 128 int _sortColumnIndex = 0; | |
| 129 set sortColumnIndex(var index) { | |
| 130 assert(index >= 0); | |
| 131 assert(index < columns.length); | |
| 132 _sortColumnIndex = index; | |
| 133 notifyPropertyChange(#getColumnLabel, 0, 1); | |
| 134 } | |
| 135 int get sortColumnIndex => _sortColumnIndex; | |
| 136 bool _sortDescending = true; | |
| 137 | |
| 138 void sort() { | |
| 139 assert(_sortColumnIndex >= 0); | |
| 140 assert(_sortColumnIndex < columns.length); | |
| 141 _order.sort((i, j) { | |
| 142 var a = rows[i].values[_sortColumnIndex]; | |
| 143 var b = rows[j].values[_sortColumnIndex]; | |
| 144 if (_sortDescending) { | |
| 145 return b.compareTo(a); | |
| 146 } else { | |
| 147 return a.compareTo(b); | |
| 148 } | |
| 149 }); | |
| 150 notifyPropertyChange(#sortedRows, 0, 1); | |
| 151 } | |
| 152 | |
| 153 @observable List<int> get sortedRows => _order; | |
| 154 | |
| 155 void clearRows() { | |
| 156 rows.clear(); | |
| 157 _order.clear(); | |
| 158 } | |
| 159 | |
| 160 void addRow(SortedTableRow row) { | |
| 161 _order.add(rows.length); | |
| 162 rows.add(row); | |
| 163 notifyPropertyChange(#sortedRows, 0, 1); | |
| 164 } | |
| 165 | |
| 166 @reflectable String getFormattedValue(int row, int column) { | |
| 167 var value = getValue(row, column); | |
| 168 var formatter = columns[column].formatter; | |
| 169 return formatter(value); | |
| 170 } | |
| 171 | |
| 172 @reflectable String getColumnLabel(int column) { | |
| 173 assert(column >= 0); | |
| 174 assert(column < columns.length); | |
| 175 const arrowUp = '\u25BC'; | |
| 176 const arrowDown = '\u25B2'; | |
| 177 const none = ''; | |
|
turnidge
2014/04/17 20:18:54
Is 'none' used?
Cutch
2014/04/17 22:12:39
Dead.
| |
| 178 if (column != _sortColumnIndex) { | |
| 179 return columns[column].label; | |
| 180 } | |
| 181 return columns[column].label + (_sortDescending ? arrowUp : arrowDown); | |
| 182 } | |
| 183 | |
| 184 @reflectable dynamic getValue(int row, int column) { | |
| 185 return rows[row].values[column]; | |
| 186 } | |
| 187 | |
| 188 void dump() { | |
| 189 for (var i = 0; i < rows.length; i++) { | |
| 190 String row = ''; | |
|
turnidge
2014/04/17 20:18:54
Does it make sense to use StringBuffer here?
Cutch
2014/04/17 22:12:39
This code was only used for debugging. Removed.
| |
| 191 for (var j = 0; j < columns.length; j++) { | |
| 192 row += getFormattedValue(i, j) + ' '; | |
| 193 } | |
| 194 print(row); | |
| 195 } | |
| 196 } | |
| 197 } | |
| OLD | NEW |