| 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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 } | 124 } |
| 125 | 125 |
| 126 class SortedTableRow { | 126 class SortedTableRow { |
| 127 final List values; | 127 final List values; |
| 128 SortedTableRow(this.values); | 128 SortedTableRow(this.values); |
| 129 } | 129 } |
| 130 | 130 |
| 131 class SortedTable extends Observable { | 131 class SortedTable extends Observable { |
| 132 final List<SortedTableColumn> columns; | 132 final List<SortedTableColumn> columns; |
| 133 final List<SortedTableRow> rows = new List<SortedTableRow>(); | 133 final List<SortedTableRow> rows = new List<SortedTableRow>(); |
| 134 final List<int> _sortedRows = []; | 134 final List<int> sortedRows = []; |
| 135 | 135 |
| 136 SortedTable(this.columns); | 136 SortedTable(this.columns); |
| 137 | 137 |
| 138 int _sortColumnIndex = 0; | 138 int _sortColumnIndex = 0; |
| 139 set sortColumnIndex(var index) { | 139 set sortColumnIndex(var index) { |
| 140 assert(index >= 0); | 140 assert(index >= 0); |
| 141 assert(index < columns.length); | 141 assert(index < columns.length); |
| 142 _sortColumnIndex = index; | 142 _sortColumnIndex = index; |
| 143 notifyPropertyChange(#getColumnLabel, 0, 1); | 143 notifyPropertyChange(#getColumnLabel, 0, 1); |
| 144 } | 144 } |
| 145 int get sortColumnIndex => _sortColumnIndex; | 145 int get sortColumnIndex => _sortColumnIndex; |
| 146 bool _sortDescending = true; | 146 bool _sortDescending = true; |
| 147 bool get sortDescending => _sortDescending; |
| 148 set sortDescending(var descending) { |
| 149 _sortDescending = descending; |
| 150 notifyPropertyChange(#getColumnLabel, 0, 1); |
| 151 } |
| 152 |
| 153 |
| 154 dynamic getSortKeyFor(int row, int col) { |
| 155 return rows[row].values[col]; |
| 156 } |
| 157 |
| 158 int _sortFuncDescending(int i, int j) { |
| 159 var a = getSortKeyFor(i, _sortColumnIndex); |
| 160 var b = getSortKeyFor(j, _sortColumnIndex); |
| 161 return b.compareTo(a); |
| 162 } |
| 163 |
| 164 int _sortFuncAscending(int i, int j) { |
| 165 var a = getSortKeyFor(i, _sortColumnIndex); |
| 166 var b = getSortKeyFor(j, _sortColumnIndex); |
| 167 return a.compareTo(b); |
| 168 } |
| 147 | 169 |
| 148 void sort() { | 170 void sort() { |
| 171 Stopwatch sw = new Stopwatch()..start(); |
| 149 assert(_sortColumnIndex >= 0); | 172 assert(_sortColumnIndex >= 0); |
| 150 assert(_sortColumnIndex < columns.length); | 173 assert(_sortColumnIndex < columns.length); |
| 151 _sortedRows.sort((i, j) { | 174 if (_sortDescending) { |
| 152 var a = rows[i].values[_sortColumnIndex]; | 175 sortedRows.sort(_sortFuncDescending); |
| 153 var b = rows[j].values[_sortColumnIndex]; | 176 } else { |
| 154 if (_sortDescending) { | 177 sortedRows.sort(_sortFuncAscending); |
| 155 return b.compareTo(a); | 178 } |
| 156 } else { | |
| 157 return a.compareTo(b); | |
| 158 } | |
| 159 }); | |
| 160 notifyPropertyChange(#sortedRows, 0, 1); | |
| 161 } | 179 } |
| 162 | 180 |
| 163 @observable List<int> get sortedRows => _sortedRows; | |
| 164 | |
| 165 void clearRows() { | 181 void clearRows() { |
| 166 rows.clear(); | 182 rows.clear(); |
| 167 _sortedRows.clear(); | 183 sortedRows.clear(); |
| 168 } | 184 } |
| 169 | 185 |
| 170 void addRow(SortedTableRow row) { | 186 void addRow(SortedTableRow row) { |
| 171 _sortedRows.add(rows.length); | 187 sortedRows.add(rows.length); |
| 172 rows.add(row); | 188 rows.add(row); |
| 173 notifyPropertyChange(#sortedRows, 0, 1); | |
| 174 } | 189 } |
| 175 | 190 |
| 176 @reflectable String getFormattedValue(int row, int column) { | 191 String getFormattedValue(int row, int column) { |
| 177 var value = getValue(row, column); | 192 var value = getValue(row, column); |
| 178 var formatter = columns[column].formatter; | 193 var formatter = columns[column].formatter; |
| 179 return formatter(value); | 194 return formatter(value); |
| 180 } | 195 } |
| 181 | 196 |
| 182 @reflectable String getColumnLabel(int column) { | 197 @observable String getColumnLabel(int column) { |
| 183 assert(column >= 0); | 198 assert(column >= 0); |
| 184 assert(column < columns.length); | 199 assert(column < columns.length); |
| 185 // TODO(johnmccutchan): Move expander display decisions into html once | 200 // TODO(johnmccutchan): Move expander display decisions into html once |
| 186 // tables and templates are better supported. | 201 // tables and templates are better supported. |
| 187 const arrowUp = '\u25BC'; | 202 const arrowUp = '\u25BC'; |
| 188 const arrowDown = '\u25B2'; | 203 const arrowDown = '\u25B2'; |
| 189 if (column != _sortColumnIndex) { | 204 if (column != _sortColumnIndex) { |
| 190 return columns[column].label + '\u2003'; | 205 return columns[column].label + '\u2003'; |
| 191 } | 206 } |
| 192 return columns[column].label + (_sortDescending ? arrowUp : arrowDown); | 207 return columns[column].label + (_sortDescending ? arrowUp : arrowDown); |
| 193 } | 208 } |
| 194 | 209 |
| 195 @reflectable dynamic getValue(int row, int column) { | 210 dynamic getValue(int row, int column) { |
| 196 return rows[row].values[column]; | 211 return rows[row].values[column]; |
| 197 } | 212 } |
| 198 } | 213 } |
| OLD | NEW |