/*
* Copyright (C) 2011 Nicolas Peransin. All rights reserved.
* Use is subject to license terms.
*/
package org.mypsycho.swing.app.reflect;
import java.awt.Component;
import java.awt.Container;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import javax.swing.MenuElement;
import javax.swing.RootPaneContainer;
import org.mypsycho.beans.AbstractCollectionExtension;
import org.mypsycho.swing.app.beans.TabPage;
import org.mypsycho.swing.app.utils.SwingHelper;
/**
* Class for ...
* <p>Details</p>
*
* @author Peransin Nicolas
*
*/
public class ComponentCollection extends AbstractCollectionExtension {
public interface ToolBarElement {} // marker for toolbars.
/**
*
*/
public ComponentCollection() {
super(JToolBar.class, Menu.class, Container.class, RootPaneContainer.class, TabPage.class);
}
@Override
public Class<?> getCollectedType(Class<?> collectionType) {
if (Menu.class.isAssignableFrom(collectionType)) { // include PopupMenu
return MenuItem.class;
}
if (MenuBar.class.isAssignableFrom(collectionType)) {
return MenuItem.class;
}
if (JToolBar.class.isAssignableFrom(collectionType)) {
return ToolBarElement.class;
}
// include JPopupMenu, JMenuBar, JMenu
if (MenuElement.class.isAssignableFrom(collectionType)) {
return JMenuItem.class;
}
// if (TabPage.class.isAssignableFrom(collectionType)) { // ?
// return Component.class;
// }
if (JTabbedPane.class.isAssignableFrom(collectionType)) {
return TabPage.class;
}
if (Container.class.isAssignableFrom(collectionType)) {
return Component.class;
}
return null;
}
@Override
public Object get(Object bean, int index) throws IllegalArgumentException {
if (bean instanceof Menu) { // and Popmenu
return ((Menu) bean).getItem(index);
}
if (bean instanceof MenuBar) { // and Popmenu
return ((MenuBar) bean).getMenu(index);
}
if (bean instanceof JMenu) {
return ((JMenu) bean).getItem(index);
}
if (bean instanceof JPopupMenu) {
return ((JPopupMenu) bean).getComponent(index);
}
if (bean instanceof JTabbedPane) {
JTabbedPane tabs = (JTabbedPane) bean;
return (index < tabs.getTabCount()) ? new TabPage(tabs, index) : new TabPage();
}
Container cont = (Container) bean;
return cont.getComponent(index);
}
@Override
public Object get(Object bean, String key) throws IllegalArgumentException {
if (bean instanceof TabPage) {
return SwingHelper.getChild(((TabPage) bean).getComponent(), key);
}
return SwingHelper.getChild((Component) bean, key);
}
@Override
public void set(Object bean, int index, Object value) throws IllegalArgumentException {
if (bean instanceof Menu) {
set((Menu) bean, index, value);
} else if (bean instanceof MenuBar) {
set((MenuBar) bean, index, value);
} else if (bean instanceof JMenu) {
set((JMenu) bean, index, value);
} else if (bean instanceof JPopupMenu) {
set((JPopupMenu) bean, index, value);
} else if (bean instanceof JMenuBar) {
set((JMenuBar) bean, index, value);
} else if (bean instanceof JToolBar) {
set((JToolBar) bean, index, value);
} else {
throw new IllegalArgumentException("Illegal bean " + bean.getClass());
}
}
public void set(MenuBar bean, int index, Object value) throws IllegalArgumentException {
if (bean.getMenuCount() != index) {
throw new IllegalArgumentException("Menu bar must have continuous indexes");
}
bean.add((Menu) value);
}
public void set(Menu bean, int index, Object value) throws IllegalArgumentException {
while (bean.getItemCount() < index) {
bean.addSeparator();
}
if (value == MenuConverter.Type.SEPARATOR) {
bean.insertSeparator(index);
} else {
bean.insert((MenuItem) value, index);
}
}
public void set(JMenu bean, int index, Object value) throws IllegalArgumentException {
while (bean.getItemCount() < index) {
bean.addSeparator();
}
if (bean.getItemCount() > index) {
bean.remove(index);
}
if (value == MenuConverter.Type.SEPARATOR) {
bean.insertSeparator(index);
} else {
bean.insert((JMenuItem) value, index);
}
}
public void set(JToolBar bean, int index, Object value) throws IllegalArgumentException {
while (bean.getComponentCount() < index) {
bean.addSeparator();
}
int count = bean.getComponentCount();
if (count == index) {
if (value == MenuConverter.Type.SEPARATOR) {
bean.addSeparator();
} else {
bean.add((Component) value);
}
} else if ((value != MenuConverter.Type.SEPARATOR) && (count > index)) {
bean.remove(index);
bean.add((Component) value, index);
}
}
public void set(JMenuBar bean, int index, Object value) throws IllegalArgumentException {
while (bean.getComponentCount() < index) {
bean.add(new JMenuItem(" "));
}
int count = bean.getComponentCount();
if (count == index) {
if (value == MenuConverter.Type.SEPARATOR) {
bean.add(new JMenuItem(" "), index);
} else {
bean.add((Component) value);
}
} else if ((value != MenuConverter.Type.SEPARATOR) && (count > index)) {
bean.remove(index);
bean.add((Component) value, index);
}
}
public void set(JPopupMenu bean, int index, Object value) throws IllegalArgumentException {
while (bean.getComponentCount() < index) {
bean.addSeparator();
}
int count = bean.getComponentCount();
if (count == index) {
if (value == MenuConverter.Type.SEPARATOR) {
bean.addSeparator();
} else {
bean.add((Component) value);
}
} else if ((value != MenuConverter.Type.SEPARATOR) && (count > index)) {
bean.remove(index);
bean.add((Component) value, index);
}
}
}