srecord noeq JFilePathLabel(File file) is Swingable { transient JLabel label; transient JFilePathButton button; bool nameOnly; settable bool iconOnTheLeft; settable bool minWidth; // allow file path to be shortened if layout requires it public transient simplyCached JComponent visualize() { label = jlabel_noAutoToolTip(); if (minWidth) jnarrowLabel(label); button = new JFilePathButton(file); update(); ret layout(); } void setFile(File file) { this.file = file; update(); } void update { setText(label, file == null ? "-" : nameOnly ? fileName(file) : f2s(file)); if (nameOnly) toolTip(file == null ? "No file" : f2s(file), label); button.setFile(file); } JComponent layout() { //ret centerAndEastWithMargin(label, button); var a = button.visualize(); var b = label; ret iconOnTheLeft ? minWidth ? westAndCenterWithMargin(a, b) : jline(a, b) : minWidth ? centerAndEastWithMargin(b, a) : jline(b, a); } void showInExplorer { button.showInExplorer(); } selfType nameOnly() { set nameOnly; this; } }