sclass CollapsibleLeftPanel is Swingable { S sidePanelName; JComponent sideComponent; JSplitPane splitPane; bool collapsed; SingleComponentPanel scp = singleComponentPanel(); *(S *sidePanelName, JComponent *sideComponent, JComponent mainComponent, bool *collapsed) { splitPane = jhsplit(0.25, wrappedSideComponent(), null); updateScp(); } void setCollapsed(bool collapsed) swing { if (this.collapsed != collapsed) { this.collapsed = collapsed; updateScp(); } } void expand { setCollapsed(true); } void collapse { setCollapsed(false); } void updateScp { if (collapsed) scp.set(westAndCenterWithMargin( vstack(expandButton()), mainComponent)); else { splitPane.setRightComponent(mainComponent); scp.set(splitPane); } } JButton expandButton() { ret jimageButton(#1103075, "Expand " + sidePanelName, r expand); } JButton collapseButton() { ret jimageButton(#1103076, "Collapse " + sidePanelName, r collapse); } JComponent wrappedSideComponent() { //ret jSection(sidePanelName, sideComponent); ret northAndCenterWithMargin( westAndCenterWithMargin(collapseButton, jlabel(sidePanelName)) ); } visual scp; }