package be.nikiroo.utils.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import be.nikiroo.utils.StringUtils;
import be.nikiroo.utils.resources.Bundle;
import be.nikiroo.utils.resources.MetaInfo;
/**
* A configuration panel for a {@link Bundle}.
*
* All the items in the given {@link Bundle} will be displayed in editable
* controls, with options to Save, Reset and/or Reset to the application default
* values.
*
* @author niki
*
* @param
* the type of {@link Bundle} to edit
*/
public class ConfigEditor> extends JPanel {
private static final long serialVersionUID = 1L;
private List> items;
/**
* Create a new {@link ConfigEditor} for this {@link Bundle}.
*
* @param type
* a class instance of the item type to work on
* @param bundle
* the {@link Bundle} to sort through
* @param title
* the title to display before the options
*/
public ConfigEditor(Class type, final Bundle bundle, String title) {
this.setLayout(new BorderLayout());
JPanel main = new JPanel();
main.setLayout(new BoxLayout(main, BoxLayout.PAGE_AXIS));
main.setBorder(new EmptyBorder(5, 5, 5, 5));
main.add(new JLabel(title));
items = new ArrayList>();
List> groupedItems = MetaInfo.getItems(type, bundle);
for (MetaInfo item : groupedItems) {
// will init this.items
addItem(main, item, 0);
}
JPanel buttons = new JPanel();
buttons.setLayout(new BoxLayout(buttons, BoxLayout.PAGE_AXIS));
buttons.setBorder(new EmptyBorder(5, 5, 5, 5));
buttons.add(createButton("Reset", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (MetaInfo item : items) {
item.reload();
}
}
}));
buttons.add(createButton("Default", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Object snap = bundle.takeSnapshot();
bundle.reload(true);
for (MetaInfo item : items) {
item.reload();
}
bundle.reload(false);
bundle.restoreSnapshot(snap);
}
}));
buttons.add(createButton("Save", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (MetaInfo item : items) {
item.save(true);
}
try {
bundle.updateFile();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}));
JScrollPane scroll = new JScrollPane(main);
scroll.getVerticalScrollBar().setUnitIncrement(16);
this.add(scroll, BorderLayout.CENTER);
this.add(buttons, BorderLayout.SOUTH);
}
private void addItem(JPanel main, MetaInfo item, int nhgap) {
if (item.isGroup()) {
JPanel bpane = new JPanel(new BorderLayout());
bpane.setBorder(new TitledBorder(item.getName()));
JPanel pane = new JPanel();
pane.setBorder(new EmptyBorder(5, 5, 5, 5));
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
String info = item.getDescription();
info = StringUtils.justifyTexts(info, 100);
if (!info.isEmpty()) {
info = info + "\n";
JTextArea text = new JTextArea(info);
text.setWrapStyleWord(true);
text.setOpaque(false);
text.setForeground(new Color(100, 100, 180));
text.setEditable(false);
pane.add(text);
}
for (MetaInfo subitem : item) {
addItem(pane, subitem, nhgap + 11);
}
bpane.add(pane, BorderLayout.CENTER);
main.add(bpane);
} else {
items.add(item);
main.add(ConfigItem.createItem(item, nhgap));
}
}
/**
* Add an action button for this action.
*
* @param title
* the action title
* @param listener
* the action
*/
private JComponent createButton(String title, ActionListener listener) {
JButton button = new JButton(title);
button.addActionListener(listener);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(new EmptyBorder(2, 10, 2, 10));
panel.add(button, BorderLayout.CENTER);
return panel;
}
}