sclass JGallery_v2 { JPanel panel = jpanel(new VScrollingWrapLayout); settable new ThumbnailCache thumbnailCache; event adaptingButton(JThumbnailButton btn); event fileClicked(File imageFile); void add(File imageFile) { if (imageFile == null) ret; addComponent(panel, makeButton(imageFile)); } JThumbnailButton makeButton(File imageFile) { var btn = new JThumbnailButton(thumbnailCache, imageFile); onClick(btn, rThread { fileClicked(btn.imageFile()) }); adaptingButton(btn); ret btn; } void setImageFiles(Cl imageFiles) { removeAllButtons(); addAll(imageFiles); } void addAll(Iterable imageFiles) { fOr (f : imageFiles) add(f); } L buttons() { ret childrenOfType(panel, JThumbnailButton); } void removeAllButtons { removeAllComponents(panel); } JThumbnailButton findButton(File imageFile) { if (imageFile == null) null; ret first(buttons(), btn -> eq(btn.imageFile, imageFile)); } cachedVisual jscroll_vertical(panel); void unselectAll() swing { for (btn : buttons()) btn.setSelected(false); } JThumbnailButton selectFile(File imageFile) swing { unselectAll(); var btn = findButton(imageFile); if (btn != null) { btn.setSelected(true); scrollIntoView(btn); } ret btn; } }