package com.revolsys.swing.component; import java.awt.Component; import java.awt.Insets; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.concurrent.Callable; import javax.swing.SwingUtilities; import org.jdesktop.swingx.JXCollapsiblePane; import org.jdesktop.swingx.JXPanel; import org.jdesktop.swingx.VerticalLayout; import com.revolsys.logging.Logs; import com.revolsys.swing.SwingUtil; public class TitleCollapsiblePanel extends BasePanel implements MouseListener { private static final long serialVersionUID = 1L; private final JXCollapsiblePane collapsible; private final Callable<Component> componentFactory; private boolean created = false; public TitleCollapsiblePanel(final String title, final Callable<Component> componentFactory) { this(title, componentFactory, null); } private TitleCollapsiblePanel(final String title, final Callable<Component> componentFactory, final Component component) { super(new VerticalLayout()); this.componentFactory = componentFactory; SwingUtil.setTitledBorder(this, title); this.collapsible = new JXCollapsiblePane(); this.collapsible.setCollapsed(true); this.collapsible.setOpaque(false); ((JXPanel)this.collapsible.getContentPane()).setOpaque(false); add(this.collapsible); if (component != null) { this.collapsible.add(component); this.created = true; } addMouseListener(this); } public TitleCollapsiblePanel(final String title, final Component component) { this(title, null, component); } public boolean isCollapsed() { return this.collapsible.isCollapsed(); } @Override public void mouseClicked(final MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { final Insets insets = getInsets(); final int y = e.getY(); if (y <= insets.top) { final boolean newCollapsed = !isCollapsed(); setCollapsed(newCollapsed); } } } @Override public void mouseEntered(final MouseEvent e) { } @Override public void mouseExited(final MouseEvent e) { } @Override public void mousePressed(final MouseEvent e) { } @Override public void mouseReleased(final MouseEvent e) { } public void setCollapsed(final boolean collapsed) { if (collapsed == false) { synchronized (this) { if (!this.created) { this.created = true; if (this.componentFactory != null) { try { final Component component = this.componentFactory.call(); this.collapsible.add(component); } catch (final Exception e) { Logs.error(this, e); } } } } } this.collapsible.setCollapsed(collapsed); } }