!7 sclass DynSCP extends DynModule { SingleComponentPanel scp; final JComponent visualize() { ret scp = singleComponentPanel(visualize2()); } void unvisualize2() { scp = null; } JComponent visualize2() { null; } void revisualize2() { lock lock; if (scp != null) scp.setComponent(visualize2()); } } sclass LastImagesInDirectory extends DynSCP { /*DirectoryInfo*/O mate; S dir; L allFiles, imageFiles; transient DynamicHStack stack; transient ButtonImageLoader imageLoader; File dirObject() { ret newFile(dir); } JComponent visualize2() { if (stack == null) stack = makeNiceButtons(); if (imageLoader == null) imageLoader = new ButtonImageLoader(buttons); if (mate == null) ret jcenteredlabel("Need directory"); ret jHigherScrollPane(jfullcenter(stack)); } void update { lock lock; int oldChangeCount = changeCount; try { if (mate == null) if (setField(mate := dm_findMateOfType(this, 'DirectoryInfo))) revisualize2(); if (mate == null) ret; setField(dir := (S) call(mate, 'getDir)); L allFiles = castCall(mate, 'getFiles); if (this.allFiles != allFiles) { setField(+allFiles); setField(imageFiles := filterOrNull(allFiles, f isImageFileName)); } } finally { if (changeCount != oldChangeCount) updateButtons(); } } void updateButtons { replaceNiceButtons(buttons, filesForNiceButtons(sortFilesByDate( fileNamesInDirToFile(dir, imageFiles)), f showImage)); imageLoader.update(); } }