import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
import be.nikiroo.utils.resources.Meta.Format;
private Meta meta;
private String value;
- private List<Runnable> reloadListeners = new ArrayList<Runnable>();
+ private List<Runnable> reloadedListeners = new ArrayList<Runnable>();
+ private List<Runnable> saveListeners = new ArrayList<Runnable>();
private String name;
private String description;
if (description == null) {
description = meta.description();
if (meta.info() != null && !meta.info().isEmpty()) {
- description += "\n" + meta.info();
+ description += " (" + meta.info() + ")";
}
}
*/
public void reload() {
value = bundle.getString(id);
- for (Runnable listener : reloadListeners) {
+ for (Runnable listener : reloadedListeners) {
try {
listener.run();
} catch (Exception e) {
}
}
- public void addReloadListener(Runnable listener) {
- reloadListeners.add(listener);
+ // listeners will be called AFTER reload
+ public void addReloadedListener(Runnable listener) {
+ reloadedListeners.add(listener);
}
/**
* Save the current value to the {@link Bundle}.
*/
public void save() {
+ for (Runnable listener : saveListeners) {
+ try {
+ listener.run();
+ } catch (Exception e) {
+ // TODO: error management?
+ e.printStackTrace();
+ }
+ }
bundle.setString(id, value);
}
+ // listeners will be called BEFORE save
+ public void addSaveListener(Runnable listener) {
+ saveListeners.add(listener);
+ }
+
/**
* Create a list of {@link MetaInfo}, one for each of the item in the given
* {@link Bundle}.
return list;
}
- // TODO: by groups, a-là Authors/Sources
+ // TODO: multiple levels?
+ static public <E extends Enum<E>> Map<MetaInfo<E>, List<MetaInfo<E>>> getGroupedItems(
+ Class<E> type, Bundle<E> bundle) {
+ Map<MetaInfo<E>, List<MetaInfo<E>>> map = new TreeMap<MetaInfo<E>, List<MetaInfo<E>>>();
+ Map<MetaInfo<E>, List<MetaInfo<E>>> map1 = new TreeMap<MetaInfo<E>, List<MetaInfo<E>>>();
+
+ List<MetaInfo<E>> ungrouped = new ArrayList<MetaInfo<E>>();
+ for (MetaInfo<E> info : getItems(type, bundle)) {
+ if (info.meta.group()) {
+ List<MetaInfo<E>> list = new ArrayList<MetaInfo<E>>();
+ map.put(info, list);
+ map1.put(info, list);
+ } else {
+ ungrouped.add(info);
+ }
+ }
+
+ for (int i = 0; i < ungrouped.size(); i++) {
+ MetaInfo<E> info = ungrouped.get(i);
+ MetaInfo<E> group = findParent(info, map.keySet());
+ if (group != null) {
+ map.get(group).add(info);
+ ungrouped.remove(i--);
+ }
+ }
+
+ if (ungrouped.size() > 0) {
+ map.put(null, ungrouped);
+ }
+
+ return map;
+ }
+
+ static private <E extends Enum<E>> MetaInfo<E> findParent(MetaInfo<E> info,
+ Set<MetaInfo<E>> candidates) {
+ MetaInfo<E> group = null;
+ for (MetaInfo<E> pcandidate : candidates) {
+ if (info.id.toString().startsWith(pcandidate.id.toString())) {
+ if (group == null
+ || group.id.toString().length() < pcandidate.id
+ .toString().length()) {
+ group = pcandidate;
+ }
+ }
+ }
+
+ return group;
+ }
}
import java.awt.BorderLayout;
import javax.swing.JCheckBox;
+import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
-import javax.swing.border.EmptyBorder;
import be.nikiroo.utils.resources.Bundle;
import be.nikiroo.utils.resources.Meta.Format;
public ConfigItem(final MetaInfo<E> info) {
this.setLayout(new BorderLayout());
- this.setBorder(new EmptyBorder(2, 10, 2, 10));
+ // this.setBorder(new EmptyBorder(2, 10, 2, 10));
if (info.getFormat() == Format.BOOLEAN) {
final JCheckBox field = new JCheckBox();
// Should not happen!
if (state == null) {
System.err
- .println("No default value given for BOOLEAN parameter "
- + info.getName() + ", we consider it is FALSE");
+ .println("No default value given for BOOLEAN parameter \""
+ + info.getName()
+ + "\", we consider it is FALSE");
state = false;
}
field.setSelected(state);
- info.addReloadListener(new Runnable() {
+ info.addReloadedListener(new Runnable() {
@Override
public void run() {
- field.setText(info.getString());
+ Boolean state = info.getBoolean();
+ if (state == null) {
+ info.getDefaultBoolean();
+ }
+ if (state == null) {
+ state = false;
+ }
+
+ field.setSelected(state);
+ }
+ });
+ info.addSaveListener(new Runnable() {
+ @Override
+ public void run() {
+ info.setBoolean(field.isSelected());
}
});
+ this.add(new JLabel(info.getName() + ": "), BorderLayout.WEST);
this.add(field, BorderLayout.CENTER);
} else {
final JTextField field = new JTextField();
field.setToolTipText(info.getDescription());
field.setText(info.getString());
- info.addReloadListener(new Runnable() {
+ info.addReloadedListener(new Runnable() {
@Override
public void run() {
field.setText(info.getString());
}
});
+ info.addSaveListener(new Runnable() {
+ @Override
+ public void run() {
+ info.setString(field.getText());
+ }
+ });
+ this.add(new JLabel(info.getName() + ": "), BorderLayout.WEST);
this.add(field, BorderLayout.CENTER);
}
}