/*
* 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.util;
import java.awt.CheckboxMenuItem;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
/**
* Swing utilities class.
*
* @author Stephane
*/
public class SwingUtil
{
/**
* Class used to wrap a AWT CheckboxMenuItem in a Swing JCheckBoxMenuItem.
*
* @author Stephane
*/
private static class JCheckBoxMenuItemWrapper extends JCheckBoxMenuItem implements ActionListener, ItemListener
{
/**
*
*/
private static final long serialVersionUID = -3283063959812167447L;
final CheckboxMenuItem checkboxMenuItem;
public JCheckBoxMenuItemWrapper(CheckboxMenuItem checkboxMenuItem)
{
super(checkboxMenuItem.getLabel(), checkboxMenuItem.getState());
// keep reference on source MenuItem
this.checkboxMenuItem = checkboxMenuItem;
setActionCommand(checkboxMenuItem.getActionCommand());
checkboxMenuItem.addItemListener(this);
addActionListener(this);
addItemListener(this);
}
@Override
public void actionPerformed(ActionEvent e)
{
// change source with original one
e.setSource(checkboxMenuItem);
// dispatch to original listeners
for (ActionListener al : checkboxMenuItem.getActionListeners())
al.actionPerformed(e);
}
@Override
public void itemStateChanged(ItemEvent e)
{
if (e.getSource() == checkboxMenuItem)
setSelected(checkboxMenuItem.getState());
else
{
final boolean state = isSelected();
if (checkboxMenuItem.getState() != state)
{
checkboxMenuItem.setState(isSelected());
// build event
final ItemEvent iv = new ItemEvent(checkboxMenuItem, ItemEvent.ITEM_STATE_CHANGED, getText(),
state ? ItemEvent.SELECTED : ItemEvent.DESELECTED);
// dispatch to original listeners
for (ItemListener il : checkboxMenuItem.getItemListeners())
il.itemStateChanged(iv);
}
}
}
}
/**
* Class used to wrap a AWT MenuItem in a Swing JMenuItem.
*
* @author Stephane
*/
private static class JMenuItemWrapper extends JMenuItem implements ActionListener
{
/**
*
*/
private static final long serialVersionUID = -3283063959812167447L;
final MenuItem menuItem;
public JMenuItemWrapper(MenuItem menuItem)
{
super(menuItem.getLabel());
// keep reference on source MenuItem
this.menuItem = menuItem;
setActionCommand(menuItem.getActionCommand());
addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e)
{
// change source with original one
e.setSource(menuItem);
// dispatch to original listeners
for (ActionListener al : menuItem.getActionListeners())
al.actionPerformed(e);
}
}
/**
* Convert a AWT MenuBar to a Swing JMenuBar.
*/
public static JMenuBar getJMenuBar(MenuBar menuBar, boolean heavy)
{
final JMenuBar result = new JMenuBar();
if (menuBar != null)
{
for (int i = 0; i < menuBar.getMenuCount(); i++)
result.add(getJMenu(menuBar.getMenu(i), heavy));
}
return result;
}
/**
* Convert a AWT Menu to a Swing JMenu.
*/
public static JMenu getJMenu(Menu menu, boolean heavy)
{
final JMenu result = new JMenu();
if (menu != null)
{
result.setText(menu.getLabel());
if (heavy)
result.getPopupMenu().setLightWeightPopupEnabled(false);
for (int i = 0; i < menu.getItemCount(); i++)
result.add(getJMenuItem(menu.getItem(i), heavy));
}
return result;
}
/**
* Convert a AWT MenuItem to a Swing JMenuItem.
*/
public static JMenuItem getJMenuItem(MenuItem menuItem, boolean heavy)
{
if (menuItem != null)
{
if (menuItem instanceof Menu)
return getJMenu((Menu) menuItem, heavy);
if (menuItem instanceof CheckboxMenuItem)
return new JCheckBoxMenuItemWrapper((CheckboxMenuItem) menuItem);
return new JMenuItemWrapper(menuItem);
}
return new JMenuItem();
}
}