!7 static JTable table; static L dataDirectories; static L l; p-substance { table = showTable(ll(), "Data Directories"); final SingleThread updater = awtCalcEvery(table, 1000, 0, "update"); tablePopupMenuItem(table, "Update", r { dataDirectories = null; updater.go("update") }); hideConsole(); } svoid update { L dd = listDirs(javaxDataDir()); // list everything if (neq(dd, dataDirectories)) render(dd); } svoid render(L dataDirectories) { //print("Update."); titleStatus(table, "Updating..."); main.dataDirectories = dataDirectories; new L l; for (File dir : dataDirectories) { S name = dir.getName(); l.add(litmap("Program", name, "Program name", isSnippetID(name) ? getSnippetTitle_cached(name) : "", "Files", numFiles(dir), "Data Size", toK(directorySize(dir)) + " K")); } l = sortByCalculatedField(l, func(Map m) { parseSnippetIDOpt(getString(m, "Program")) }); showTable(table, main.l = l); noTitleStatus(table); }