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 |