/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.api.gui.util;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.swing.ButtonGroup;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.Icon;
import javax.swing.JMenu;
import javax.swing.JPopupMenu;
import javax.swing.event.ListDataEvent;
public class GroupRadioMenu<T> implements ActionListener, ComboBoxModelAdapter<T>, GroupPopup {
protected final List<RadioMenuItem> itemList;
protected final ButtonGroup group;
protected ComboBoxModel<T> dataModel;
public GroupRadioMenu() {
this.itemList = new ArrayList<>();
this.group = new ButtonGroup();
}
private void init() {
for (RadioMenuItem item : itemList) {
group.remove(item);
}
itemList.clear();
Object selectedItem = dataModel.getSelectedItem();
for (int i = 0; i < dataModel.getSize(); i++) {
Object object = dataModel.getElementAt(i);
Icon icon = null;
if (object instanceof GUIEntry) {
icon = ((GUIEntry) object).getIcon();
}
RadioMenuItem radioMenuItem = new RadioMenuItem(object.toString(), icon, object);
radioMenuItem.setSelected(object == selectedItem);
group.add(radioMenuItem);
itemList.add(radioMenuItem);
radioMenuItem.addActionListener(this);
}
}
public List<RadioMenuItem> getRadioMenuItemListCopy() {
return new ArrayList<>(itemList);
}
@Override
public JPopupMenu createJPopupMenu() {
JPopupMenu popupMouseButtons = new JPopupMenu();
for (int i = 0; i < itemList.size(); i++) {
popupMouseButtons.add(itemList.get(i));
}
return popupMouseButtons;
}
@Override
public JMenu createMenu(String title) {
JMenu menu = new JMenu(title);
for (int i = 0; i < itemList.size(); i++) {
menu.add(itemList.get(i));
}
return menu;
}
@Override
public void contentsChanged(ListDataEvent e) {
setSelected(dataModel.getSelectedItem());
}
@Override
public void intervalAdded(ListDataEvent e) {
// Do nothing
}
@Override
public void intervalRemoved(ListDataEvent e) {
// Do nothing
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof RadioMenuItem) {
RadioMenuItem item = (RadioMenuItem) e.getSource();
if (item.isSelected()) {
dataModel.setSelectedItem(item.getUserObject());
}
}
}
public void setSelected(Object selected) {
if (selected == null) {
group.clearSelection();
} else {
for (int i = 0; i < itemList.size(); i++) {
RadioMenuItem item = itemList.get(i);
if (item.getUserObject() == selected) {
item.setSelected(true);// Do not trigger actionPerformed
dataModel.setSelectedItem(item.getUserObject());
return;
}
}
}
}
public int getSelectedIndex() {
Object sObject = dataModel.getSelectedItem();
for (int i = 0; i < dataModel.getSize(); i++) {
if (Objects.equals(dataModel.getElementAt(i), sObject)) {
return i;
}
}
return -1;
}
public T getSelectedItem() {
return (T) dataModel.getSelectedItem();
}
public ComboBoxModel<T> getModel() {
return dataModel;
}
@Override
public void setModel(ComboBoxModel<T> dataModel) {
if (this.dataModel != null) {
this.dataModel.removeListDataListener(this);
}
if (dataModel != null) {
dataModel.removeListDataListener(this);
}
this.dataModel = Optional.ofNullable(dataModel).orElseGet(DefaultComboBoxModel::new);
init();
this.dataModel.addListDataListener(this);
}
@Override
public void setEnabled(boolean enabled) {
for (int i = 0; i < itemList.size(); i++) {
itemList.get(i).setEnabled(enabled);
}
}
}