package org.limewire.ui.swing.options;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import net.miginfocom.swing.MigLayout;
import org.limewire.ui.swing.util.I18n;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Advanced Option View.
*/
public class AdvancedOptionPanel extends OptionPanel {
public static final int MULTI_LINE_LABEL_WIDTH = 440;
private static final String SYSTEM = I18n.tr("System");
private static final String LISTENING_PORTS = I18n.tr("Listening Ports");
private static final String PROXY = I18n.tr("Proxy");
private static final String NETWORK_INTERFACE = I18n.tr("Network Interface");
private static final String PERFORMANCE = I18n.tr("Performance");
private static final String FILTERING = I18n.tr("Filtering");
private static final String EXTERNAL_ACCESS = I18n.tr("External Access");
private final CardLayout cardLayout;
private final JPanel cardPanel;
private final JList list;
private final Map<String, Provider<? extends OptionPanel>> providers = new HashMap<String, Provider<? extends OptionPanel>>();
private final Map<String, OptionPanel> panels = new HashMap<String, OptionPanel>();
@Inject
public AdvancedOptionPanel(Provider<ListeningPortsOptionPanel> firewallOptionPanel,
Provider<ProxyOptionPanel> proxyOptionPanel,
Provider<NetworkInterfaceOptionPanel> networkInterfaceOptionPanel,
Provider<PerformanceOptionPanel> performanceOptionPanel,
Provider<FilteringOptionPanel> filteringOptionPanel,
Provider<SystemOptionPanel> systemOptionPanel,
Provider<ExternalAccessOptionPanel> externalAccessOptionPanel) {
providers.put(SYSTEM, systemOptionPanel);
providers.put(LISTENING_PORTS, firewallOptionPanel);
providers.put(PROXY, proxyOptionPanel);
providers.put(NETWORK_INTERFACE, networkInterfaceOptionPanel);
providers.put(PERFORMANCE, performanceOptionPanel);
providers.put(FILTERING, filteringOptionPanel);
providers.put(EXTERNAL_ACCESS, externalAccessOptionPanel);
setLayout(new MigLayout("insets 15, fill, gapy 10", "[][grow]", "[][]"));
list = new JList();
list.setBorder(BorderFactory.createLineBorder(Color.BLACK));
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setPreferredSize(new Dimension(150, 500));
cardLayout = new CardLayout();
cardPanel = new JPanel();
cardPanel.setOpaque(false);
cardPanel.setLayout(cardLayout);
createPanel(SYSTEM);
createList();
add(
new JLabel(
I18n
.tr("We recommend you don't touch these unless you really know what you're doing.")),
"span 2, wrap");
add(list, "growy");
add(cardPanel, "grow");
list.setSelectedIndex(0);
}
@Inject
void register() {
list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
String name = (String) list.getModel().getElementAt(list.getSelectedIndex());
if (!panels.containsKey(name)) {
createPanel(name);
}
cardLayout.show(cardPanel, name);
}
});
}
private void createPanel(String id) {
panels.put(id, providers.get(id).get());
cardPanel.add(panels.get(id), id);
panels.get(id).initOptions();
}
private void createList() {
DefaultListModel model = new DefaultListModel();
model.addElement(SYSTEM);
model.addElement(LISTENING_PORTS);
model.addElement(PROXY);
model.addElement(NETWORK_INTERFACE);
model.addElement(PERFORMANCE);
model.addElement(FILTERING);
model.addElement(EXTERNAL_ACCESS);
list.setModel(model);
}
@Override
ApplyOptionResult applyOptions() {
ApplyOptionResult result = null;
boolean done = false;
Iterator<OptionPanel> it = panels.values().iterator();
while (it.hasNext() && !done) {
OptionPanel panel = it.next();
if (result == null)
result = panel.applyOptions();
else
result.applyResult(panel.applyOptions());
done = !result.isSuccessful();
}
return result;
}
@Override
boolean hasChanged() {
for (OptionPanel panel : panels.values()) {
if (panel.hasChanged())
return true;
}
return false;
}
@Override
public void initOptions() {
for (OptionPanel panel : panels.values()) {
panel.initOptions();
}
}
}