Files
ATCS/src/com/gpl/rpg/atcontentstudio/ui/CollapsiblePanel.java
2025-06-21 18:36:37 +02:00

155 lines
4.0 KiB
Java

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);
}
}