/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.gui.component;
import icy.gui.component.button.IcyToggleButton;
import icy.gui.util.ComponentUtil;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import icy.util.GraphicsUtil;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
/**
* @author Stephane
*/
public class PopupPanel extends JPanel
{
private class PopupTitlePanel extends IcyToggleButton
{
/**
*
*/
private static final long serialVersionUID = -6311966421110920079L;
public PopupTitlePanel(String text, Image image)
{
super(text, new IcyIcon(image, 14));
setHorizontalAlignment(SwingConstants.LEADING);
setFocusPainted(false);
if (subPopupPanel)
ComponentUtil.setFixedHeight(this, getTextSize().height);
else
ComponentUtil.setFontBold(this);
addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
refresh();
}
});
}
@Override
public void setText(String text)
{
super.setText(text);
updateIconTextGap();
}
@Override
public void setIcon(Icon defaultIcon)
{
super.setIcon(defaultIcon);
updateIconTextGap();
}
@Override
public void setBounds(int x, int y, int width, int height)
{
super.setBounds(x, y, width, height);
updateIconTextGap();
}
private Dimension getTextSize()
{
final String text = getText();
if (text != null)
{
final Rectangle2D r = GraphicsUtil.getStringBounds(this, text);
return new Dimension((int) r.getWidth(), (int) r.getHeight());
}
return new Dimension(0, 0);
}
private void updateIconTextGap()
{
final int width = getWidth();
final Icon icon = getIcon();
if ((width != 0) && (icon != null))
{
// adjust icon gap to new width
int iconTextGap = (width - getTextSize().width) / 2;
iconTextGap -= (icon.getIconWidth() + 10);
setIconTextGap(iconTextGap);
}
}
}
/**
*
*/
private static final long serialVersionUID = -5208183544572376729L;
protected final PopupTitlePanel topPanel;
protected final JPanel mainPanel;
protected final boolean subPopupPanel;
/**
* @deprecated Use {@link #PopupPanel(String, boolean)} instead
*/
@Deprecated
public PopupPanel(String title, int panelHeight, boolean subPopupPanel)
{
this(title, subPopupPanel);
}
/**
* @deprecated Use {@link #PopupPanel(String, boolean)} instead
*/
@Deprecated
public PopupPanel(String title, int panelHeight)
{
this(title, false);
}
/**
* Create a new popup panel with specified title.
*
* @param title
* Panel title
* @param subPanel
* Determine if this is an embedded popup panel or a normal one.
*/
public PopupPanel(String title, boolean subPanel)
{
super();
subPopupPanel = subPanel;
topPanel = new PopupTitlePanel(title, ResourceUtil.ICON_PANEL_COLLAPSE);
mainPanel = new JPanel();
// if (panelHeight != -1)
// ComponentUtil.setFixedHeight(mainPanel, panelHeight);
setBorder(BorderFactory.createRaisedBevelBorder());
setLayout(new BorderLayout());
add(topPanel, BorderLayout.NORTH);
add(mainPanel, BorderLayout.CENTER);
refresh();
}
/**
* Create a new popup panel with specified title.
*/
public PopupPanel(String title)
{
this(title, false);
}
/**
* @deprecated Use {@link #PopupPanel(String)} instead.
*/
@Deprecated
public PopupPanel()
{
this("no title", false);
}
public String getTitle()
{
return topPanel.getText();
}
public void setTitle(String value)
{
topPanel.setText(value);
}
/**
* @return the title panel
*/
public PopupTitlePanel getTitlePanel()
{
return topPanel;
}
/**
* @return the mainPanel
*/
public JPanel getMainPanel()
{
return mainPanel;
}
/**
* @return the collapsed
*/
public boolean isCollapsed()
{
return !isExpanded();
}
/**
* @return the collapsed
*/
public boolean isExpanded()
{
return topPanel.isSelected();
}
/**
* @param value
* the collapsed to set
*/
public void setExpanded(boolean value)
{
if (topPanel.isSelected() != value)
{
topPanel.setSelected(value);
refresh();
}
}
/**
* @return the subPopupPanel
*/
public boolean isSubPopupPanel()
{
return subPopupPanel;
}
public void expand()
{
setExpanded(true);
}
public void collapse()
{
setExpanded(false);
}
void refresh()
{
if (subPopupPanel)
{
if (topPanel.isSelected())
topPanel.setIcon(new IcyIcon(ResourceUtil.ICON_NODE_EXPANDED, 10));
else
topPanel.setIcon(new IcyIcon(ResourceUtil.ICON_NODE_COLLAPSED, 10));
}
else
{
if (topPanel.isSelected())
topPanel.setIcon(new IcyIcon(ResourceUtil.ICON_NODE_EXPANDED, 14));
else
topPanel.setIcon(new IcyIcon(ResourceUtil.ICON_NODE_COLLAPSED, 14));
}
mainPanel.setVisible(topPanel.isSelected());
}
}