!7 sclass FilesInDirectory extends DynSCP { new DynModuleRef mate; S dir; L files; transient JTable table; File dirObject() { ret newFile(dir); } JComponent visualize2() { if (table == null) { table = sexyTable(); onDoubleClickOrEnter(table, voidfunc(int row) { final File f = newFile(newFile(dir), (S) getTableCell(table, row, 0)); if (!f.isDirectory()) ret; thread { S info = dm_showNewModule("#1015916/DirectoryInfo"); call(dm_getModule(info), 'setDir, f); call(dm_getModule(info), 'setAllowedToLook, true); S files = dm_showNewModule("#1016457/FilesInDirectory"); call(dm_getModule(files), 'setMate, info); } }); updateTable(); } if (mate! == null) ret jcenteredlabel("Need directory"); ret table; } void update { int oldChangeCount = mate! == null ? -1 : changeCount; try { if (mate! != null && !dm_moduleStillThere(mate!)) mate.set(null); if (mate! == null) if (setField(mate := DynModuleRef(print("Mate: ", dm_findMateOfType(this, 'DirectoryInfo))))) revisualize2(); if (mate == null) ret; setField(dir := (S) call(mate!, 'getDir)); L files = castCall(mate!, 'getFiles); if (this.files != files) setField(+files); } finally { if (changeCount != oldChangeCount) updateTable(); } } void updateTable { if (dir == null || table == null) ret with setModuleName("Files in directory"); L l = sortFilesByDate( fileNamesInDirToFile(new File(dir), files)); dataToTable_uneditable(map(func(File f) -> Map { litorderedmap( "Name" := f.getName(), "Size" := f.isDirectory() ? "Directory" : toK(fileSize(f)) + " K") }, l), table); setModuleName(files == null ? "Not allowed to look in directory " + fileName(dirObject()) : n2(l, "element") + " in directory " + fileName(dirObject())); } void setMate(S id) { mate.set(id); } }