package com.gpl.rpg.atcontentstudio.ui; import javax.swing.*; import javax.swing.border.TitledBorder; import java.awt.*; import java.awt.event.*; public class CollapsiblePanel extends JPanel { private static final long serialVersionUID = 319384990345722150L; String title; TitledBorder border; public CollapsiblePanel(String title) { super(); this.title = title; border = BorderFactory.createTitledBorder(title); setBorder(border); BorderLayout borderLayout = new BorderLayout(); setLayout(borderLayout); addMouseListener(mouseListener); } MouseListener mouseListener = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { toggleVisibility(); } }; ComponentListener contentComponentListener = new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { updateBorderTitle(); } @Override public void componentHidden(ComponentEvent e) { updateBorderTitle(); } }; public String getTitle() { return title; } public void setTitle(String title) { String oldTitle = this.title; this.title = title; firePropertyChange("title", oldTitle, this.title); updateBorderTitle(); } @Override public Component add(Component comp) { comp.addComponentListener(contentComponentListener); Component r = super.add(comp); updateBorderTitle(); return r; } @Override public Component add(String name, Component comp) { comp.addComponentListener(contentComponentListener); Component r = super.add(name, comp); updateBorderTitle(); return r; } @Override public Component add(Component comp, int index) { comp.addComponentListener(contentComponentListener); Component r = super.add(comp, index); updateBorderTitle(); return r; } @Override public void add(Component comp, Object constraints) { comp.addComponentListener(contentComponentListener); super.add(comp, constraints); updateBorderTitle(); } @Override public void add(Component comp, Object constraints, int index) { comp.addComponentListener(contentComponentListener); super.add(comp, constraints, index); updateBorderTitle(); } @Override public void remove(int index) { Component comp = getComponent(index); comp.removeComponentListener(contentComponentListener); super.remove(index); } @Override public void remove(Component comp) { comp.removeComponentListener(contentComponentListener); super.remove(comp); } @Override public void removeAll() { for (Component c : getComponents()) { c.removeComponentListener(contentComponentListener); } super.removeAll(); } protected void toggleVisibility() { toggleVisibility(hasInvisibleComponent()); } protected void toggleVisibility(boolean visible) { for (Component c : getComponents()) { c.setVisible(visible); } updateBorderTitle(); } protected void updateBorderTitle() { String arrow = ""; if (getComponentCount() > 0) { arrow = (hasInvisibleComponent() ? "[+] " : "[-] "); } border.setTitle(arrow + title); repaint(); } protected final boolean hasInvisibleComponent() { for (Component c : getComponents()) { if (!c.isVisible()) { return true; } } return false; } public void collapse() { toggleVisibility(false); } public void expand() { toggleVisibility(true); } public void setExpanded(boolean expand) { toggleVisibility(expand); } }