/*
GNU GENERAL PUBLIC LICENSE
Copyright (C) 2006 The Lobo Project
This program 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
verion 2 of the License, or (at your option) any later version.
This program 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 this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Contact info: lobochief@users.sourceforge.net
*/
package org.lobobrowser.primary.gui;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import org.eclipse.jdt.annotation.Nullable;
public class ItemListControl<T> extends JComponent {
private static final long serialVersionUID = 3251022502906426556L;
private final JComboBox<T> comboBox;
private final ItemEditorFactory<T> itemEditorFactory;
public ItemListControl(final ItemEditorFactory<T> ief) {
this.itemEditorFactory = ief;
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
this.comboBox = new JComboBox<>();
this.comboBox.setPreferredSize(new Dimension(100, 24));
this.comboBox.setEditable(false);
final JButton editButton = new JButton();
editButton.setAction(new EditAction(false));
editButton.setText("Edit");
final JButton addButton = new JButton();
addButton.setAction(new EditAction(true));
addButton.setText("Add");
final JButton removeButton = new JButton();
removeButton.setAction(new RemoveAction());
removeButton.setText("Remove");
this.add(this.comboBox);
this.add(editButton);
this.add(addButton);
this.add(removeButton);
}
public void setItems(final Collection<T> items) {
final JComboBox<T> comboBox = this.comboBox;
comboBox.removeAllItems();
for (final T item : items) {
comboBox.addItem(item);
}
}
private T getSelectedItem() {
@SuppressWarnings("unchecked")
final T selectedItem = (T) this.comboBox.getSelectedItem();
return selectedItem;
}
private void addItem(final T item) {
this.comboBox.addItem(item);
this.comboBox.setSelectedItem(item);
}
private void replaceSelectedItem(final T item) {
final int index = this.comboBox.getSelectedIndex();
if (index != -1) {
this.comboBox.removeItemAt(index);
}
this.comboBox.addItem(item);
this.comboBox.setSelectedItem(item);
}
private void removeSelectedItem() {
final int index = this.comboBox.getSelectedIndex();
if (index != -1) {
this.comboBox.removeItemAt(index);
}
}
public Collection<T> getItems() {
final Collection<T> items = new ArrayList<>();
final int count = this.comboBox.getItemCount();
for (int i = 0; i < count; i++) {
items.add(this.comboBox.getItemAt(i));
}
return items;
}
private String editListCaption;
public void setEditorCaption(final String caption) {
this.editListCaption = caption;
}
private class RemoveAction extends AbstractAction {
private static final long serialVersionUID = -2348978279945841470L;
public void actionPerformed(final ActionEvent e) {
if (JOptionPane.showConfirmDialog(ItemListControl.this, "Are you sure you want to remove the selected item?", "Confirm",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
removeSelectedItem();
}
}
}
private class EditAction extends AbstractAction {
private static final long serialVersionUID = -4963725376330300896L;
private final boolean add;
public EditAction(final boolean add) {
this.add = add;
}
public void actionPerformed(final ActionEvent e) {
final Frame parentFrame = SwingTasks.getFrame(ItemListControl.this);
ItemEditorDialog<T> dialog;
if (parentFrame != null) {
dialog = new ItemEditorDialog<>(parentFrame, itemEditorFactory);
} else {
final Dialog parentDialog = SwingTasks.getDialog(ItemListControl.this);
dialog = new ItemEditorDialog<>(parentDialog, itemEditorFactory);
}
dialog.setModal(true);
dialog.setTitle(this.add ? "Add Item" : "Edit Item");
dialog.setCaption(editListCaption);
dialog.pack();
final Dimension size = dialog.getSize();
if (size.width > 400) {
dialog.setSize(new Dimension(400, size.height));
}
dialog.setLocationByPlatform(true);
if (!this.add) {
dialog.setItem(getSelectedItem());
}
dialog.setVisible(true);
final @Nullable T item = dialog.getResultingItem();
if (item != null) {
if (this.add) {
addItem(item);
} else {
replaceSelectedItem(item);
}
}
}
}
}