package com.robonobo.gui.preferences; 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.util.ArrayList; import java.util.List; import javax.swing.*; import com.robonobo.gui.RoboFont; import com.robonobo.gui.components.base.*; import com.robonobo.gui.frames.RobonoboFrame; @SuppressWarnings("serial") public class PrefDialog extends JDialog { Dimension sz = new Dimension(500, 400); List<PrefPanel> prefPanels = new ArrayList<PrefPanel>(); private RobonoboFrame frame; RButton saveBtn, cancelBtn; public PrefDialog(RobonoboFrame frame) { super(frame, true); this.frame = frame; setTitle("robonobo preferences"); setSize(sz); setPreferredSize(sz); double[][] cellSizen = { { 5, TableLayout.FILL, 5 }, { 5, TableLayout.FILL, 5, 30, 5 } }; setLayout(new TableLayout(cellSizen)); 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"); } 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()); ChoicePrefPanel lipPanel = new LocalIpPrefPanel(frame); prefPanels.add(lipPanel); bp.add(lipPanel); bp.add(vertSpacer()); GatewayPrefPanel gPanel = new GatewayPrefPanel(frame); prefPanels.add(gPanel); bp.add(gPanel); bp.add(vertSpacer()); UploadLimitPrefPanel ulPanel = new UploadLimitPrefPanel(frame); prefPanels.add(ulPanel); bp.add(ulPanel); 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.sonarUrl", "Node Locator URL"); prefPanels.add(suPanel); ap.add(suPanel); ap.add(vertSpacer()); StringPrefPanel muPanel = new StringPrefPanel(frame, "robo.midasUrl", "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(); } } } }