sclass CollapsibleLeftPanel > MetaWithChangeListeners is Swingable { S sidePanelName; JComponent sideComponent, mainComponent; JSplitPane splitPane; settableWithVar bool expanded; SingleComponentPanel scp = singleComponentPanel(); *(bool *expanded, S *sidePanelName, JComponent *sideComponent, JComponent *mainComponent) { splitPane = jhsplit(0.25, wrappedSideComponent(), null); varExpanded().onChangeAndNow(r updateScp); } void expand { setExpanded(true); } void collapse { setExpanded(false); } void updateScp { if (expanded) { splitPane.setRightComponent(mainComponent); scp.set(splitPane); } else scp.set(westAndCenterWithMargin( vstack(expandButton()), mainComponent)); } JComponent expandButton() { ret jClickableImage_instantToolTip(#1103075, "Expand " + sidePanelName, r expand); } JComponent collapseButton() { ret jClickableImage_instantToolTip(#1103076, "Collapse " + sidePanelName, r collapse); } JComponent wrappedSideComponent() { //ret jSection(sidePanelName, sideComponent); ret northAndCenterWithMargin( westAndCenterWithMargin(collapseButton(), jlabel(sidePanelName)), sideComponent ); } visual scp; }