public ServerDialog(OptionsDialog options_,
                      Options opts_, CConn cc_) {

    super(true);
    cc = cc_;
    opts = opts_;
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    setResizable(false);
    setSize(new Dimension(350, 135));
    setTitle("New TurboVNC Connection");
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        if (VncViewer.nViewers == 1) {
          cc.viewer.exit(1);
        } else {
          ret = false;
          endDialog();
        }
      }
    });

    options = options_;
    getContentPane().setLayout(new GridBagLayout());

    JLabel serverLabel = new JLabel("VNC server:", JLabel.RIGHT);
    String valueStr = null;
    if (opts.serverName != null) {
      String [] s = new String[1];
      s[0] = opts.serverName;
      server = new JComboBox(s);
    } else if ((valueStr = UserPreferences.get("ServerDialog", "history"))
               != null) {
      server = new JComboBox(valueStr.split(","));
    } else {
      server = new JComboBox();
    }

    // Hack to set the left inset on editable JComboBox
    if (UIManager.getLookAndFeel().getID() == "Windows") {
      server.setBorder(BorderFactory.createCompoundBorder(server.getBorder(),
        BorderFactory.createEmptyBorder(0, 2, 0, 0)));
    } else if (UIManager.getLookAndFeel().getID() == "Metal") {
      ComboBoxEditor editor = server.getEditor();
      JTextField jtf = (JTextField)editor.getEditorComponent();
      jtf.setBorder(new CompoundBorder(jtf.getBorder(),
                                       new EmptyBorder(0, 2, 0, 0)));
    }

    server.setEditable(true);
    editor = server.getEditor();

    JPanel topPanel = new JPanel(new GridBagLayout());

    addGBComponent(new JLabel(cc.logo), topPanel,
                   0, 0, 1, 1, 0, 0, 0, 1,
                   GridBagConstraints.HORIZONTAL,
                   GridBagConstraints.LINE_START,
                   new Insets(5, 5, 5, 15));
    addGBComponent(serverLabel, topPanel,
                   1, 0, 1, 1, 0, 0, 0, 1,
                   GridBagConstraints.HORIZONTAL,
                   GridBagConstraints.LINE_END,
                   new Insets(10, 0, 5, 5));
    addGBComponent(server, topPanel,
                   2, 0, 1, 1, 0, 0, 1, 1,
                   GridBagConstraints.HORIZONTAL,
                   GridBagConstraints.CENTER,
                   new Insets(10, 0, 5, 20));

    optionsButton = new JButton("Options...");
    aboutButton = new JButton("About...");
    okButton = new JButton("Connect");
    cancelButton = new JButton("Cancel");
    JPanel buttonPanel = new JPanel(new GridBagLayout());
    buttonPanel.setPreferredSize(new Dimension(350, 40));
    addGBComponent(aboutButton, buttonPanel,
                   0, 3, 1, 1, 0, 0, 0.8, 1,
                   GridBagConstraints.HORIZONTAL,
                   GridBagConstraints.CENTER,
                   new Insets(0, 2, 0, 5));
    addGBComponent(optionsButton, buttonPanel,
                   1, 3, 1, 1, 0, 0, 1, 1,
                   GridBagConstraints.HORIZONTAL,
                   GridBagConstraints.CENTER,
                   new Insets(0, 2, 0, 5));
    addGBComponent(okButton, buttonPanel,
                   2, 3, 1, 1, 0, 0, 0.7, 1,
                   GridBagConstraints.HORIZONTAL,
                   GridBagConstraints.CENTER,
                   new Insets(0, 2, 0, 5));
    addGBComponent(cancelButton, buttonPanel,
                   3, 3, 1, 1, 0, 0, 0.6, 1,
                   GridBagConstraints.HORIZONTAL,
                   GridBagConstraints.CENTER,
                   new Insets(0, 2, 0, 5));

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.anchor = GridBagConstraints.LINE_START;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.gridheight = 1;
    gbc.insets = new Insets(0, 0, 0, 0);
    gbc.ipadx = 0;
    gbc.ipady = 0;
    gbc.weightx = 1;
    gbc.weighty = 1;
    getContentPane().add(topPanel, gbc);
    getContentPane().add(buttonPanel);

    server.addActionListener(this);
    optionsButton.addActionListener(this);
    aboutButton.addActionListener(this);
    okButton.addActionListener(this);
    cancelButton.addActionListener(this);

    pack();
  }