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.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; /** * Really Advanced Option View. */ public class ReallyAdvancedOptionPanel extends OptionPanel { public static final int MULTI_LINE_LABEL_WIDTH = 440; private static final String FIREWALL = I18n.tr("Firewall"); 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 BITTORRENT = I18n.tr("BitTorrent"); private static final String FILTERING = I18n.tr("Filtering"); private static final String SPAM = I18n.tr("Spam"); private CardLayout cardLayout; private JPanel cardPanel; private JList list; private Map<String, Provider<? extends OptionPanel>> providers = new HashMap<String, Provider<? extends OptionPanel>>(); private Map<String, OptionPanel> panels = new HashMap<String, OptionPanel>(); @Inject public ReallyAdvancedOptionPanel(Provider<FirewallOptionPanel> firewallOptionPanel, Provider<ProxyOptionPanel> proxyOptionPanel, Provider<NetworkInterfaceOptionPanel> networkInterfaceOptionPanel, Provider<PerformanceOptionPanel> performanceOptionPanel, Provider<BitTorrentOptionPanel> bitTorrentOptionPanel, Provider<FilteringOptionPanel> filteringOptionPanel, Provider<SpamOptionPanel> spamOptionPanel) { providers.put(FIREWALL, firewallOptionPanel); providers.put(PROXY, proxyOptionPanel); providers.put(NETWORK_INTERFACE, networkInterfaceOptionPanel); providers.put(PERFORMANCE, performanceOptionPanel); providers.put(BITTORRENT, bitTorrentOptionPanel); providers.put(FILTERING, filteringOptionPanel); providers.put(SPAM, spamOptionPanel); setLayout(new MigLayout("insets 15 15 15 15, fillx, gapy 10", "fill", "fill")); setOpaque(false); 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(FIREWALL); 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(FIREWALL); model.addElement(PROXY); model.addElement(NETWORK_INTERFACE); model.addElement(PERFORMANCE); model.addElement(BITTORRENT); model.addElement(FILTERING); model.addElement(SPAM); list.setModel(model); } @Override boolean applyOptions() { boolean restartRequired = false; for(OptionPanel panel : panels.values()) { restartRequired |= panel.applyOptions(); } return restartRequired; } @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(); } } }