sclass ConceptTable { JTable table; Concepts concepts; Class conceptClass; Set dropFields; IPred filter; IF1> postProcess; Runnable afterUpdate; bool latestFirst; int idWidth = 50; IF1 renderer; *(Class *conceptClass) {} JTable getTable() { init(); ret table; } void init { if (table != null) ret; if (concepts == null) concepts = db_mainConcepts(); if (renderer == null) renderer = defaultConceptRendererForTable(conceptClass); table = sexyTable(); temp tempSetTL(awtOnConceptChanges_concepts, concepts); awtOnConceptChanges(table, 1000, r update); } Cl list() { ret main list(concepts, conceptClass); } void update swing { new L data; for (A c : list()) if (filter == null || filter.get(c)) addIfNotNull(data, (Map) renderer.get(c)); if (latestFirst) reverseInPlace(data); data = (L) postProcess(postProcess, data); dataToTable_uneditable(data, table); pcallF(afterUpdate); } }