package com.robonobo.gui.sheets; import static com.robonobo.gui.RoboColor.*; import info.clearthought.layout.TableLayout; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.InetAddress; import java.util.*; import java.util.List; import javax.swing.*; import com.robonobo.common.util.NetUtil; import com.robonobo.gui.RoboFont; import com.robonobo.gui.components.base.*; import com.robonobo.gui.frames.RobonoboFrame; import com.robonobo.gui.preferences.*; @SuppressWarnings("serial") public class PreferencesSheet extends Sheet { Dimension sz = new Dimension(500, 400); List<PrefPanel> prefPanels = new ArrayList<PrefPanel>(); private RButton saveBtn; private RButton cancelBtn; public PreferencesSheet(RobonoboFrame f) { super(f); setSize(sz); setPreferredSize(sz); double[][] cellSizen = { { 5, TableLayout.FILL, 5 }, { 5, TableLayout.FILL, 5, 30, 5 } }; setLayout(new TableLayout(cellSizen)); setBackground(LIGHT_GRAY); setOpaque(true); JTabbedPane tabPane = new JTabbedPane(); tabPane.setFont(RoboFont.getFont(12, true)); tabPane.setBackground(MID_GRAY); tabPane.addTab("Basic", new JScrollPane(createBasicPanel())); tabPane.addTab("Advanced", new JScrollPane(createAdvancedPanel())); tabPane.setSelectedIndex(0); add(tabPane, "1,1"); add(createButtonPanel(), "1,3"); } @Override public void onShow() { saveBtn.requestFocusInWindow(); } @Override public JButton defaultButton() { return saveBtn; } private JPanel createButtonPanel() { JPanel p = new JPanel(); p.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); p.setLayout(new BoxLayout(p, BoxLayout.LINE_AXIS)); cancelBtn = new RRedGlassButton("Cancel"); cancelBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doCancel(); } }); p.add(cancelBtn); p.add(Box.createHorizontalStrut(10)); saveBtn = new RGlassButton("Save"); saveBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doSave(); } }); p.add(saveBtn); return p; } private JPanel createBasicPanel() { JPanel bp = new JPanel(); bp.setLayout(new BoxLayout(bp, BoxLayout.Y_AXIS)); bp.setName("playback.background.panel"); FilePrefPanel dfPanel = new FilePrefPanel(frame, "robo.finishedDownloadsDirectory", "Downloads Folder", true); prefPanels.add(dfPanel); bp.add(dfPanel); bp.add(vertSpacer()); IntPrefPanel mrdPanel = new IntPrefPanel(frame, "robo.maxRunningDownloads", "Max Simultaneous Downloads", false); prefPanels.add(mrdPanel); bp.add(mrdPanel); bp.add(vertSpacer()); Set<InetAddress> localIps = NetUtil.getLocalInetAddresses(frame.ctrl.getConfig().getAllowLoopbackAddress()); String[] ipArr = new String[localIps.size()]; int i = 0; for (InetAddress addr : localIps) { ipArr[i++] = addr.getHostAddress(); } ChoicePrefPanel lipPanel = new ChoicePrefPanel(frame, "mina.localAddress", "Local IP Address", ipArr); prefPanels.add(lipPanel); bp.add(lipPanel); bp.add(vertSpacer()); GatewayPrefPanel gPanel = new GatewayPrefPanel(frame); prefPanels.add(gPanel); bp.add(gPanel); bp.add(Box.createVerticalGlue()); return bp; } private JPanel createAdvancedPanel() { JPanel ap = new JPanel(); ap.setLayout(new BoxLayout(ap, BoxLayout.Y_AXIS)); ap.setName("playback.background.panel"); StringPrefPanel suPanel = new StringPrefPanel(frame, "robo.sonarServerUrl", "Node Locator URL"); prefPanels.add(suPanel); ap.add(suPanel); ap.add(vertSpacer()); StringPrefPanel muPanel = new StringPrefPanel(frame, "robo.metadataServerUrl", "Metadata Server URL"); prefPanels.add(muPanel); ap.add(muPanel); ap.add(vertSpacer()); StringPrefPanel buPanel = new StringPrefPanel(frame, "wang.bankUrl", "Bank URL"); prefPanels.add(buPanel); ap.add(buPanel); ap.add(vertSpacer()); BoolPrefPanel llPanel = new BoolPrefPanel(frame, "mina.locateLocalNodes", "Locate Local Nodes"); prefPanels.add(llPanel); ap.add(llPanel); ap.add(vertSpacer()); BoolPrefPanel lrPanel = new BoolPrefPanel(frame, "mina.locateRemoteNodes", "Locate Remote Nodes"); prefPanels.add(lrPanel); ap.add(lrPanel); ap.add(vertSpacer()); ap.add(Box.createVerticalGlue()); return ap; } private Component vertSpacer() { return Box.createRigidArea(new Dimension(0, 5)); } private void doCancel() { for (PrefPanel pp : prefPanels) { pp.resetValue(); } setVisible(false); } private void doSave() { List<PrefPanel> changedPrefs = new ArrayList<PrefPanel>(); for (PrefPanel pp : prefPanels) { if (pp.hasChanged()) changedPrefs.add(pp); } if (changedPrefs.size() == 0) setVisible(false); else { int retVal = JOptionPane.showConfirmDialog(this, "Changing preferences requires robonobo to be restarted. Are you ready to restart now?", "Restart robonobo?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if(retVal == JOptionPane.YES_OPTION) { for (PrefPanel pp : changedPrefs) { pp.applyChanges(); } frame.ctrl.saveConfig(); frame.restart(); } } } }