package org.esa.snap.opendap.ui;
import org.esa.snap.core.ui.UIUtils;
import org.esa.snap.core.ui.tool.ToolButtonFactory;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.border.EmptyBorder;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TitledPanel extends JPanel {
public TitledPanel(JComponent titleComponent, JComponent bodyComponent) {
this(titleComponent, bodyComponent, false, false);
}
public TitledPanel(JComponent titleComponent, JComponent bodyComponent, boolean isCollapsible, boolean isInitiallyCollapsed) {
super(new BorderLayout());
final JPanel titleArea = new JPanel(new BorderLayout());
if (titleComponent != null) {
titleArea.add(titleComponent, BorderLayout.WEST);
}
titleArea.add(getSeparator(), BorderLayout.CENTER);
if (isCollapsible) {
titleArea.add(getCollapseButton(bodyComponent, isInitiallyCollapsed), BorderLayout.EAST);
bodyComponent.setVisible(!isInitiallyCollapsed);
}
add(titleArea, BorderLayout.NORTH);
if (bodyComponent != null) {
bodyComponent.setBorder(new EmptyBorder(0, 30, 0, 0));
add(bodyComponent, BorderLayout.CENTER);
}
setBorder(new EmptyBorder(4, 8, 4, 8));
}
private JComponent getCollapseButton(JComponent bodyComponent, boolean isInitiallyCollapsed) {
final AbstractButton hideAndShowButton;
if (isInitiallyCollapsed) {
hideAndShowButton = ToolButtonFactory.createButton(CollapseSupport.expandIcon, false);
hideAndShowButton.setRolloverIcon(CollapseSupport.expandRolloverIcon);
hideAndShowButton.setToolTipText("Expand Panel");
} else {
hideAndShowButton = ToolButtonFactory.createButton(CollapseSupport.collapseIcon, false);
hideAndShowButton.setRolloverIcon(CollapseSupport.collapseRolloverIcon);
hideAndShowButton.setToolTipText("Collapse Panel");
}
hideAndShowButton.addActionListener(new CollapseSupport(isInitiallyCollapsed, bodyComponent, hideAndShowButton));
return hideAndShowButton;
}
private JPanel getSeparator() {
final JSeparator separator = new JSeparator(JSeparator.HORIZONTAL);
final JPanel separatorPanel = new JPanel(new GridBagLayout());
final GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 1;
gbc.weighty = 0;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
separatorPanel.add(separator, gbc);
return separatorPanel;
}
private static class CollapseSupport implements ActionListener {
public boolean componentShown;
private final JComponent bodyComponent;
private final AbstractButton hideAndShowButton;
private static final ImageIcon collapseIcon = UIUtils.loadImageIcon("icons/PanelUp12.png");
private static final ImageIcon collapseRolloverIcon = ToolButtonFactory.createRolloverIcon(collapseIcon);
private static final ImageIcon expandIcon = UIUtils.loadImageIcon("icons/PanelDown12.png");
private static final ImageIcon expandRolloverIcon = ToolButtonFactory.createRolloverIcon(expandIcon);
public CollapseSupport(boolean isInitiallyCollapsed, JComponent bodyComponent, AbstractButton hideAndShowButton) {
this.bodyComponent = bodyComponent;
this.hideAndShowButton = hideAndShowButton;
this.componentShown = !isInitiallyCollapsed;
}
@Override
public void actionPerformed(ActionEvent e) {
componentShown = !componentShown;
bodyComponent.setVisible(componentShown);
if (componentShown) {
hideAndShowButton.setIcon(collapseIcon);
hideAndShowButton.setRolloverIcon(collapseRolloverIcon);
hideAndShowButton.setToolTipText("Collapse Panel");
} else {
hideAndShowButton.setIcon(expandIcon);
hideAndShowButton.setRolloverIcon(expandRolloverIcon);
hideAndShowButton.setToolTipText("Expand Panel");
}
}
}
}