package com.revolsys.swing.component; import java.awt.Component; import java.awt.Container; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.ButtonGroup; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JPopupMenu; import javax.swing.JToolBar; public class ComponentGroup { private final Map<String, ButtonGroup> buttonGroups = new HashMap<>(); private final List<String> groupNames = new ArrayList<>(); private final Map<String, List<Component>> groups = new HashMap<>(); public ComponentGroup() { } public void addComponent(final JComponent container, final Component component) { addComponent(container, "default", component); } public void addComponent(final JComponent container, final String groupName, final Component component) { final List<Component> components = getGroup(groupName); components.add(component); updateComponents(container); } public void addComponent(final JComponent container, final String groupName, final int index, final Component component) { final List<Component> components = getGroup(groupName); if (index < 0) { components.add(component); } else { components.add(index, component); } updateComponents(container); } public void addGroup(final String groupName) { getGroup(groupName); } public void clear() { this.buttonGroups.clear(); this.groupNames.clear(); this.groups.clear(); } public ButtonGroup getButtonGroup(final String groupName) { ButtonGroup buttonGroup = this.buttonGroups.get(groupName); if (buttonGroup == null) { buttonGroup = new ButtonGroup(); this.buttonGroups.put(groupName, buttonGroup); } return buttonGroup; } public List<Component> getGroup(final String groupName) { List<Component> components = this.groups.get(groupName); if (components == null) { components = new ArrayList<>(); this.groups.put(groupName, components); this.groupNames.add(groupName); } return components; } public void removeComponent(final JComponent container, final String groupName, final int index) { final List<Component> components = getGroup(groupName); if (index < components.size()) { components.remove(index); } updateComponents(container); } public void removeGroup(final Container container, final String groupName) { this.buttonGroups.remove(groupName); this.groupNames.remove(groupName); for (final Component component : this.groups.remove(groupName)) { container.remove(component); } } public void setGroupEnabled(final String groupName, final boolean enabled) { final List<Component> components = getGroup(groupName); for (final Component component : components) { component.setEnabled(enabled); } } public void updateComponents(final JComponent container) { container.removeAll(); boolean first = true; for (final String groupName : this.groupNames) { final List<Component> components = this.groups.get(groupName); if (!components.isEmpty()) { if (first) { first = false; } else { if (container instanceof JMenu) { final JMenu menu = (JMenu)container; menu.addSeparator(); } else if (container instanceof JPopupMenu) { final JPopupMenu menu = (JPopupMenu)container; menu.addSeparator(); } else if (container instanceof JToolBar) { final JToolBar toolBar = (JToolBar)container; toolBar.addSeparator(); } } for (final Component component : components) { container.add(component); } } } container.revalidate(); } }