1 7 8 package org.jdesktop.swing.decorator; 9 10 import java.util.BitSet ; 11 import java.util.List ; 12 import java.util.Vector ; 13 14 import javax.swing.event.EventListenerList ; 15 16 45 public class FilterPipeline { 46 protected EventListenerList listenerList = new EventListenerList (); 47 private ComponentAdapter adapter = null; 48 private Sorter sorter = null; 49 private final Filter[] filters; 50 51 59 public FilterPipeline(Filter[] inList) { 60 filters = reorderSorters(inList, locateSorters(inList)); 61 62 for (int i = 0; i < filters.length; i++) { 63 if (filters[i].order < 0) { 64 filters[i].order = i; 65 } 66 else { 67 throw new IllegalArgumentException ("Element " + i + 68 " is part of another pipeline."); 69 } 70 } 71 } 73 74 81 void setSorter(Sorter sorter) { 82 this.sorter = sorter; 83 } 84 85 96 public final void assign(ComponentAdapter adapter) { 97 if (adapter == null) { 98 throw new IllegalArgumentException ("null adapter"); 99 } 100 101 if (this.adapter == null) { 103 this.adapter = adapter; 104 for (int i = 0; i < filters.length; i++) { 105 filters[i].assign(this); 106 filters[i].assign(adapter); 107 } 108 } 109 else if (this.adapter != adapter){ 110 throw new IllegalStateException ("Can't bind to a different adapter"); 111 } 112 } 113 114 122 boolean contains(Filter filter) { 123 return (filter.order >= 0) && 124 (filters.length > 0) && (filters[filter.order] == filter); 125 } 126 127 134 Filter first() { 135 return (filters.length > 0) ? filters[0] : null; 136 } 137 138 145 Filter last() { 146 return (filters.length > 0) ? filters[filters.length - 1] : null; 147 } 148 149 157 Filter next(Filter filter) { 158 return last().equals(filter) ? null : filters[filter.order + 1]; 159 } 160 161 169 Filter previous(Filter filter) { 170 return first().equals(filter) ? null : filters[filter.order - 1]; 171 } 172 173 183 protected void filterChanged(Filter filter) { 184 Filter next = contains(filter) ? next(filter) : null; 185 if (next == null) { 186 if (sorter == null) { 187 fireContentsChanged(); 188 } 189 else { 190 sorter.refresh(); } 192 } 193 else { 194 next.refresh(); } 196 } 197 198 203 int getInputSize(Filter filter) { 204 if (contains(filter)) { 205 Filter previous = previous(filter); 206 if (previous == null) { 207 return adapter.getRowCount(); 208 } 209 else { 210 return previous.getSize(); 211 } 212 } 213 else if (filter.getPipeline() == this) { 214 return getOutputSize(); 215 } 216 217 return 0; 218 } 219 220 225 public int getOutputSize() { 226 Filter last = last(); 227 return (last == null) ? adapter.getRowCount() : last.getSize(); 228 } 229 230 235 245 public int convertRowIndexToModel(int row) { 246 Filter last = last(); 247 return (last == null) ? row : last.convertRowIndexToModel(row); 248 } 249 250 int convertRowIndexToModel(Filter filter, int row) { 251 if (contains(filter)) { 252 Filter previous = previous(filter); 253 if (previous == null) { 254 return row; 255 } 256 else { 257 return previous.convertRowIndexToModel(row); 258 } 259 } 260 else { 261 Filter last = last(); 262 if (last == null) { 263 return row; 264 } 265 else { 266 return last.convertRowIndexToModel(row); 267 } 268 } 269 } 270 271 281 public int convertRowIndexToView(int row) { 282 Filter last = last(); 283 return (last == null) ? row : last.convertRowIndexToView(row); 284 } 285 286 int convertRowIndexToView(Filter filter, int row) { 287 if (contains(filter)) { 288 Filter previous = previous(filter); 289 if (previous == null) { 290 return row; 291 } 292 else { 293 return previous.convertRowIndexToView(row); 294 } 295 } 296 else { 297 Filter last = last(); 298 if (last == null) { 299 return row; 300 } 301 else { 302 return last.convertRowIndexToView(row); 303 } 304 } 305 } 306 307 314 public Object getValueAt(int row, int column) { 315 Filter last = last(); 316 return (last == null) ? null : last.getValueAt(row, column); 317 } 318 319 320 Object getInputValueFor(Filter filter, int row, int column) { 321 if (contains(filter)) { 322 Filter previous = previous(filter); 323 if (previous == null) { 324 return adapter.getValueAt(row, adapter.modelToView(column)); 325 } 326 else { 327 return previous.getValueAt(row, column); 328 } 329 } 330 else { 331 Filter last = last(); 332 if (last == null) { 333 return adapter.getValueAt(row, adapter.modelToView(column)); 334 } 335 else { 336 return last.getValueAt(row, column); 337 } 338 } 339 } 340 341 public void setValueAt(Object aValue, int row, int column) { 342 Filter last = last(); 343 if (last != null) { 344 last.setValueAt(aValue, row, column); 345 } 346 } 347 348 void setInputValueFor(Object aValue, Filter filter, int row, int column) { 349 if (contains(filter)) { 350 Filter previous = previous(filter); 351 if (previous == null) { 352 adapter.setValueAt(aValue, row, adapter.modelToView(column)); 353 } 354 else { 355 previous.setValueAt(aValue, row, column); 356 } 357 } 358 else { 359 Filter last = last(); 360 if (last == null) { 361 adapter.setValueAt(aValue, row, adapter.modelToView(column)); 362 } 363 else { 364 last.setValueAt(aValue, row, column); 365 } 366 } 367 } 368 369 public boolean isCellEditable(int row, int column) { 370 Filter last = last(); 371 return (last == null) ? false : last.isCellEditable(row, column); 372 } 373 374 boolean isInputEditableFor(Filter filter, int row, int column) { 375 376 int inputRow = row; 379 if (contains(filter)) { 380 Filter previous = previous(filter); 381 if (previous == null) { 382 return adapter.isCellEditable(inputRow, adapter.modelToView(column)); 383 } 384 else { 385 return previous.isCellEditable(inputRow, column); 386 } 387 } 388 else { 389 Filter last = last(); 390 if (last == null) { 391 return adapter.isCellEditable(inputRow, adapter.modelToView(column)); 392 } 393 else { 394 return last.isCellEditable(inputRow, column); 395 } 396 } 397 } 398 399 413 public void flush() { 414 if ((filters != null) && (filters.length > 0)) { 415 filters[0].refresh(); 416 } 417 else if (sorter != null) { 418 sorter.refresh(); 419 } 420 } 421 422 428 public void addPipelineListener(PipelineListener l) { 429 listenerList.add(PipelineListener.class, l); 430 } 431 432 438 public void removePipelineListener(PipelineListener l) { 439 listenerList.remove(PipelineListener.class, l); 440 } 441 442 453 public PipelineListener[] getPipelineListeners() { 454 return (PipelineListener[]) listenerList.getListeners( 455 PipelineListener.class); 456 } 457 458 463 protected void fireContentsChanged() { 464 Object [] listeners = listenerList.getListenerList(); 465 PipelineEvent e = null; 466 467 for (int i = listeners.length - 2; i >= 0; i -= 2) { 468 if (listeners[i] == PipelineListener.class) { 469 if (e == null) { 470 e = new PipelineEvent(this, PipelineEvent.CONTENTS_CHANGED); 471 } 472 ( (PipelineListener) listeners[i + 1]).contentsChanged(e); 473 } 474 } 475 } 476 477 private List locateSorters(Filter[] inList) { 478 BitSet sortableColumns = new BitSet (); List sorterLocations = new Vector (); 480 for (int i = 0; i < inList.length; i++) { 481 if (inList[i] instanceof Sorter) { 482 int columnIndex = inList[i].getColumnIndex(); 483 if (columnIndex < 0) { 484 throw new IndexOutOfBoundsException ( 485 "Negative column index for filter: " + inList[i]); 486 } 487 488 if (sortableColumns.get(columnIndex)) { 489 throw new IllegalArgumentException ( 490 "Filter "+ i +" attempting to overwrite sorter for column " 491 + columnIndex); 492 } 493 494 sortableColumns.set(columnIndex); sorterLocations.add(new Integer (i)); } 498 } 499 return sorterLocations; 500 } 501 502 private Filter[] reorderSorters(Filter[] inList, List sorterLocations) { 503 Filter[] outList = (Filter[]) inList.clone(); 505 506 int max = sorterLocations.size() - 1; 508 for (int i = 0; i <= max; i++) { 509 int orig = ((Integer ) sorterLocations.get(max - i)).intValue(); 510 int copy = ((Integer ) sorterLocations.get(i)).intValue(); 511 outList[copy] = inList[orig]; 512 } 513 514 return outList; 515 } 516 522 } 523 | Popular Tags |