/*
* 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.IcyButton;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
/**
* Basically a JTabbedPane which can handle ExternalizablePanel.
*
* @author Stephane
*/
public class ExtTabbedPanel extends JTabbedPane
{
/**
*
*/
private static final long serialVersionUID = -1217212007327960771L;
private class TabComponent extends JPanel
{
/**
*
*/
private static final long serialVersionUID = 4841789742300589373L;
final ExternalizablePanel extPanel;
final private IcyButton externButton;
final JLabel label;
/**
* needed for data save
*/
final int index;
final String tip;
public TabComponent(String title, Icon icon, ExternalizablePanel panel, String tip, int index)
{
super();
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
setBorder(BorderFactory.createEmptyBorder());
setOpaque(false);
this.index = index;
this.tip = tip;
extPanel = panel;
label = new JLabel(title + " ", icon, SwingConstants.CENTER);
label.setOpaque(false);
externButton = new IcyButton(new IcyIcon(ResourceUtil.ICON_WINDOW_EXPAND, 16));
externButton.setFlat(true);
externButton.setOpaque(false);
externButton.setContentAreaFilled(false);
externButton.setToolTipText("Externalize panel");
externButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// externalize panel
extPanel.externalize();
}
});
add(label);
add(externButton);
validate();
}
public String getTitle()
{
return label.getText().trim();
}
public Icon getIcon()
{
return label.getIcon();
}
public void setTitle(String title)
{
label.setText(title + " ");
}
public void setIcon(Icon icon)
{
label.setIcon(icon);
}
public void setDisabledIcon(Icon disabledIcon)
{
label.setDisabledIcon(disabledIcon);
}
public void setBackgroundAll(Color background)
{
externButton.setBackground(background);
label.setBackground(background);
}
public void setForegroundAll(Color foreground)
{
externButton.setForeground(foreground);
label.setForeground(foreground);
}
}
final private ArrayList<TabComponent> tabComponents;
public ExtTabbedPanel()
{
this(TOP, WRAP_TAB_LAYOUT);
}
public ExtTabbedPanel(int tabPlacement)
{
this(tabPlacement, WRAP_TAB_LAYOUT);
}
public ExtTabbedPanel(int tabPlacement, int tabLayoutPolicy)
{
super(tabPlacement, tabLayoutPolicy);
tabComponents = new ArrayList<TabComponent>();
}
/**
* Find the ExtTabComponent attached to the specified ExternalizablePanel.
*/
protected TabComponent getTabComponent(ExternalizablePanel panel)
{
for (TabComponent extTabComp : tabComponents)
if (extTabComp.extPanel == panel)
return extTabComp;
return null;
}
@Override
public Component add(Component component)
{
// special case of externalizable panel
if (component instanceof ExternalizablePanel)
{
final TabComponent tabComp = getTabComponent((ExternalizablePanel) component);
// already existing ?
if (tabComp != null)
{
// use its parameter
insertTab(tabComp.getTitle(), tabComp.getIcon(), component, tabComp.tip,
Math.min(tabComp.index, getTabCount()));
return component;
}
}
return super.add(component);
}
@Override
public void setIconAt(int index, Icon icon)
{
super.setIconAt(index, icon);
final Component comp = getTabComponentAt(index);
if (comp instanceof TabComponent)
((TabComponent) comp).setIcon(icon);
}
@Override
public void setDisabledIconAt(int index, Icon disabledIcon)
{
super.setDisabledIconAt(index, disabledIcon);
final Component comp = getTabComponentAt(index);
if (comp instanceof TabComponent)
((TabComponent) comp).setDisabledIcon(disabledIcon);
}
@Override
public void setBackgroundAt(int index, Color background)
{
super.setBackgroundAt(index, background);
final Component comp = getTabComponentAt(index);
if (comp instanceof TabComponent)
((TabComponent) comp).setBackgroundAll(background);
}
@Override
public void setForegroundAt(int index, Color foreground)
{
super.setForegroundAt(index, foreground);
final Component comp = getTabComponentAt(index);
if (comp instanceof TabComponent)
((TabComponent) comp).setForegroundAll(foreground);
}
@Override
public void setTitleAt(int index, String title)
{
super.setTitleAt(index, title);
final Component comp = getTabComponentAt(index);
if (comp instanceof TabComponent)
((TabComponent) comp).setTitle(title);
}
@Override
public void insertTab(String title, Icon icon, Component component, String tip, int index)
{
TabComponent tabComp;
if (component instanceof ExternalizablePanel)
{
final ExternalizablePanel panel = (ExternalizablePanel) component;
tabComp = getTabComponent(panel);
// not existing ?
if (tabComp == null)
{
// create the associated tab component
tabComp = new TabComponent(title, icon, panel, tip, index);
// and save it in the list to keep a reference
tabComponents.add(tabComp);
}
// externalized ?
if (panel.isExternalized())
{
// manually set parent and exit
panel.setParent(this);
return;
}
}
else
tabComp = null;
super.insertTab(title, icon, component, tip, index);
// use custom panel for externalizable panel
if (tabComp != null)
setTabComponentAt(index, tabComp);
}
}