From a5e18bd7d5388561b3527feac80efd90daa2a95f Mon Sep 17 00:00:00 2001 From: "Brian P. Hinz" Date: Thu, 17 Mar 2016 22:34:52 -0400 Subject: [PATCH] Various fixes to Java viewer UI Significant improvements to the Java viewer UI to make it more robust and tolerant of new tabs, fonts, etc. TextFields and editable ComboBoxes that are specific to integer values now only accept integer input. --- java/com/tigervnc/vncviewer/CConn.java | 27 +- .../tigervnc/vncviewer/ClipboardDialog.java | 6 +- java/com/tigervnc/vncviewer/Dialog.java | 125 +- .../com/tigervnc/vncviewer/OptionsDialog.java | 1058 +++++++++++------ java/com/tigervnc/vncviewer/PasswdDialog.java | 175 +-- java/com/tigervnc/vncviewer/ServerDialog.java | 115 +- java/com/tigervnc/vncviewer/VncViewer.java | 14 +- 7 files changed, 1014 insertions(+), 506 deletions(-) diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java index 9a794737..dbb2a293 100644 --- a/java/com/tigervnc/vncviewer/CConn.java +++ b/java/com/tigervnc/vncviewer/CConn.java @@ -39,6 +39,7 @@ import java.awt.event.*; import java.io.IOException; import java.io.InputStream; +import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.jar.Attributes; @@ -884,8 +885,10 @@ public class CConn extends CConnection implements options.encNone.setEnabled(false); options.encTLS.setEnabled(false); options.encX509.setEnabled(false); - options.ca.setEnabled(false); - options.crl.setEnabled(false); + options.x509ca.setEnabled(false); + options.caButton.setEnabled(false); + options.x509crl.setEnabled(false); + options.crlButton.setEnabled(false); options.secIdent.setEnabled(false); options.secNone.setEnabled(false); options.secVnc.setEnabled(false); @@ -966,11 +969,23 @@ public class CConn extends CConnection implements } } } + File caFile = new File(viewer.x509ca.getValue()); + if (caFile.exists() && caFile.canRead()) + options.x509ca.setText(caFile.getAbsolutePath()); + File crlFile = new File(viewer.x509crl.getValue()); + if (crlFile.exists() && crlFile.canRead()) + options.x509crl.setText(crlFile.getAbsolutePath()); options.encNone.setEnabled(options.secVeNCrypt.isSelected()); options.encTLS.setEnabled(options.secVeNCrypt.isSelected()); options.encX509.setEnabled(options.secVeNCrypt.isSelected()); - options.ca.setEnabled(options.secVeNCrypt.isSelected()); - options.crl.setEnabled(options.secVeNCrypt.isSelected()); + options.x509ca.setEnabled(options.secVeNCrypt.isSelected() && + options.encX509.isSelected()); + options.caButton.setEnabled(options.secVeNCrypt.isSelected() && + options.encX509.isSelected()); + options.x509crl.setEnabled(options.secVeNCrypt.isSelected() && + options.encX509.isSelected()); + options.crlButton.setEnabled(options.secVeNCrypt.isSelected() && + options.encX509.isSelected()); options.secIdent.setEnabled(options.secVeNCrypt.isSelected()); options.secPlain.setEnabled(options.secVeNCrypt.isSelected()); options.sendLocalUsername.setEnabled(options.secPlain.isSelected()|| @@ -1057,6 +1072,10 @@ public class CConn extends CConnection implements cp.qualityLevel = viewer.qualityLevel.getValue(); encodingChange = true; } + if (!options.x509ca.getText().equals("")) + CSecurityTLS.x509ca.setParam(options.x509ca.getText()); + if (!options.x509crl.getText().equals("")) + CSecurityTLS.x509crl.setParam(options.x509crl.getText()); viewer.sendLocalUsername.setParam(options.sendLocalUsername.isSelected()); viewer.viewOnly.setParam(options.viewOnly.isSelected()); diff --git a/java/com/tigervnc/vncviewer/ClipboardDialog.java b/java/com/tigervnc/vncviewer/ClipboardDialog.java index e7aa7e96..441846cf 100644 --- a/java/com/tigervnc/vncviewer/ClipboardDialog.java +++ b/java/com/tigervnc/vncviewer/ClipboardDialog.java @@ -30,7 +30,7 @@ import javax.swing.text.*; import com.tigervnc.rfb.LogWriter; -class ClipboardDialog extends Dialog implements ActionListener { +class ClipboardDialog extends Dialog { private class VncTransferHandler extends TransferHandler { // Custom TransferHandler designed to limit the size of outbound @@ -109,14 +109,12 @@ class ClipboardDialog extends Dialog implements ActionListener { JPanel pb = new JPanel(); clearButton = new JButton("Clear"); pb.add(clearButton); - clearButton.addActionListener(this); sendButton = new JButton("Send to VNC server"); pb.add(sendButton); - sendButton.addActionListener(this); cancelButton = new JButton("Cancel"); pb.add(cancelButton); - cancelButton.addActionListener(this); getContentPane().add("South", pb); + addListeners(this); pack(); } diff --git a/java/com/tigervnc/vncviewer/Dialog.java b/java/com/tigervnc/vncviewer/Dialog.java index 4b82eb93..3d24619b 100644 --- a/java/com/tigervnc/vncviewer/Dialog.java +++ b/java/com/tigervnc/vncviewer/Dialog.java @@ -1,5 +1,5 @@ /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * Copyright (C) 2011-2014 Brian P. Hinz + * Copyright (C) 2011-2016 Brian P. Hinz * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,9 +30,18 @@ package com.tigervnc.vncviewer; import java.awt.*; import java.awt.Dialog.*; +import java.awt.event.*; import javax.swing.*; +import javax.swing.border.*; +import javax.swing.text.*; -class Dialog extends JDialog { +class Dialog extends JDialog implements ActionListener, + ItemListener, + KeyListener { + + // GridBag weights + static double HEAVY = 1.0; + static double LIGHT = 0.0; public Dialog(boolean modal) { setIconImage(VncViewer.frameIcon); @@ -78,30 +87,98 @@ class Dialog extends JDialog { // initDialog() can be overridden in a derived class. Typically it is used // to make sure that checkboxes have the right state, etc. - public void initDialog() { + public void initDialog() { } + + public void actionPerformed(ActionEvent e) { } + public void itemStateChanged(ItemEvent e) { } + public void keyTyped(KeyEvent event) { } + public void keyReleased(KeyEvent event) { } + public void keyPressed(KeyEvent event) { } + + protected void addListeners(Container c) { + for (Component ch : c.getComponents()) { + if (ch instanceof JCheckBox) + ((JCheckBox)ch).addItemListener(this); + else if (ch instanceof JButton) + ((JButton)ch).addActionListener(this); + else if (ch instanceof JComboBox) + ((JComboBox)ch).addActionListener(this); + else if (ch instanceof JTextField) + ((JTextField)ch).addKeyListener(this); + else if (ch instanceof Container) + addListeners((Container)ch); + } + } + + public int getButtonLabelInset(AbstractButton b) { + // Aligning components vertically to the label of + // a JCheckbox is absurdly difficult. JCheckBox's + // getIcon() method generally returns null, so we + // have to resort to querying the UIManager in + // order to determine the width of the checkbox. + // The default values are based on Nimbus. + int width = 18; + int gap = 4; + + Icon ico = b.getIcon(); + if (ico == null) { + if (b instanceof JCheckBox) + ico = (Icon)UIManager.get("CheckBox.icon"); + else if (b instanceof JRadioButton) + ico = (Icon)UIManager.get("RadioButton.icon"); + } + if (ico != null) + width = Math.max(width, ico.getIconWidth()); + if (b != null) + gap = Math.max(gap, b.getIconTextGap()); + + return width + gap; } - public void addGBComponent(JComponent c, JComponent cp, - int gx, int gy, - int gw, int gh, - int gipx, int gipy, - double gwx, double gwy, - int fill, int anchor, - Insets insets) - { - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = anchor; - gbc.fill = fill; - gbc.gridx = gx; - gbc.gridy = gy; - gbc.gridwidth = gw; - gbc.gridheight = gh; - gbc.insets = insets; - gbc.ipadx = gipx; - gbc.ipady = gipy; - gbc.weightx = gwx; - gbc.weighty = gwy; - cp.add(c, gbc); + protected class GroupedJRadioButton extends JRadioButton { + public GroupedJRadioButton(String l, ButtonGroup g, JComponent c) { + super(l); + c.add(this); + if (g != null) + g.add(this); + } + } + + protected class MyJComboBox extends JComboBox { + public MyJComboBox(Object[] items) { + super(items); + // Hack to set the left inset on editable JComboBox + if (UIManager.getLookAndFeel().getID().equals("Windows")) { + this.setBorder(BorderFactory.createCompoundBorder(this.getBorder(), + BorderFactory.createEmptyBorder(0,1,0,0))); + } else if (UIManager.getLookAndFeel().getID().equals("Metal")) { + ComboBoxEditor editor = this.getEditor(); + JTextField jtf = (JTextField)editor.getEditorComponent(); + jtf.setBorder(new CompoundBorder(jtf.getBorder(), new EmptyBorder(0,2,0,0))); + } + } + + public MyJComboBox() { + new MyJComboBox(null); + } + + @Override + public void setPrototypeDisplayValue(Object prototypeDisplayValue) { + // Even with setPrototypeDisplayValue set JComboxBox resizes + // itself when setEditable(true) is called. + super.setPrototypeDisplayValue(prototypeDisplayValue); + boolean e = isEditable(); + setEditable(false); + Dimension d = getPreferredSize(); + setPreferredSize(d); + setEditable(e); + } + + public void setDocument(PlainDocument doc) { + ComboBoxEditor editor = this.getEditor(); + JTextField jtf = (JTextField)editor.getEditorComponent(); + jtf.setDocument(doc); + } } private Window fullScreenWindow; diff --git a/java/com/tigervnc/vncviewer/OptionsDialog.java b/java/com/tigervnc/vncviewer/OptionsDialog.java index e2cd7c8b..3bd74e27 100644 --- a/java/com/tigervnc/vncviewer/OptionsDialog.java +++ b/java/com/tigervnc/vncviewer/OptionsDialog.java @@ -1,5 +1,5 @@ /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * Copyright (C) 2011-2015 Brian P. Hinz + * Copyright (C) 2011-2016 Brian P. Hinz * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,18 +26,58 @@ import java.text.Format; import java.text.NumberFormat; import javax.swing.*; import javax.swing.border.*; +import javax.swing.UIManager.*; +import javax.swing.text.*; +import java.util.*; +import java.util.Map.Entry; + import com.tigervnc.rfb.*; -class OptionsDialog extends Dialog implements - ActionListener, - ItemListener -{ +import static java.awt.GridBagConstraints.BOTH; +import static java.awt.GridBagConstraints.CENTER; +import static java.awt.GridBagConstraints.HORIZONTAL; +import static java.awt.GridBagConstraints.LINE_END; +import static java.awt.GridBagConstraints.LINE_START; +import static java.awt.GridBagConstraints.PAGE_START; +import static java.awt.GridBagConstraints.NONE; +import static java.awt.GridBagConstraints.RELATIVE; +import static java.awt.GridBagConstraints.REMAINDER; +import static java.awt.GridBagConstraints.VERTICAL; + +class OptionsDialog extends Dialog { + + private class IntegerDocument extends PlainDocument { + private int limit; + + IntegerDocument(int limit) { + super(); + this.limit = limit; + } + + public void insertString(int offset, String str, AttributeSet a) + throws BadLocationException { + if (str == null || !str.matches("^[0-9]+$")) return; + if ((getLength() + str.length()) > limit) + java.awt.Toolkit.getDefaultToolkit().beep(); + else + super.insertString(offset, str, a); + } + } private class IntegerTextField extends JFormattedTextField { - public IntegerTextField(Format format) { - super(format); + public IntegerTextField(int digits) { + super(); + this.setDocument(new IntegerDocument(digits)); + Font f = getFont(); + String template = String.format("%0"+digits+"d", 0); + int w = getFontMetrics(f).stringWidth(template) + + getMargin().left + getMargin().right + + getInsets().left + getInsets().right; + int h = getPreferredSize().height; + setPreferredSize(new Dimension(w, h)); } + @Override protected void processFocusEvent(final FocusEvent e) { if (e.isTemporary()) @@ -50,277 +90,603 @@ class OptionsDialog extends Dialog implements } // Constants - // Static variables static LogWriter vlog = new LogWriter("OptionsDialog"); CConn cc; - JPanel FormatPanel, InputsPanel, MiscPanel, DefaultsPanel, SecPanel, ScreenPanel; - JCheckBox autoSelect, customCompressLevel, noJpeg; @SuppressWarnings({"rawtypes"}) JComboBox menuKey, compressLevel, qualityLevel, scalingFactor; ButtonGroup encodingGroup, colourGroup; - JRadioButton zrle, hextile, tight, raw; - JRadioButton fullColour, mediumColour, lowColour, veryLowColour; - JCheckBox viewOnly, acceptClipboard, sendClipboard, acceptBell; - JCheckBox desktopSize, fullScreen, fullScreenAllMonitors, shared, useLocalCursor; - JCheckBox secVeNCrypt, encNone, encTLS, encX509; - JCheckBox secNone, secVnc, secPlain, secIdent, sendLocalUsername; - JButton okButton, cancelButton; - JButton ca, crl; - JButton cfLoadButton, cfSaveAsButton, defSaveButton, defReloadButton, defClearButton; - JTextField desktopWidth, desktopHeight; + JRadioButton zrle, hextile, tight, raw, fullColour, mediumColour, + lowColour, veryLowColour; + JCheckBox autoSelect, customCompressLevel, noJpeg, viewOnly, + acceptClipboard, sendClipboard, acceptBell, desktopSize, + fullScreen, fullScreenAllMonitors, shared, useLocalCursor, + secVeNCrypt, encNone, encTLS, encX509, secNone, secVnc, + secPlain, secIdent, sendLocalUsername; + JButton okButton, cancelButton, caButton, crlButton, cfLoadButton, + cfSaveAsButton, defSaveButton, defReloadButton, defClearButton; + JTextField desktopWidth, desktopHeight, x509ca, x509crl; + JTabbedPane tabPane; @SuppressWarnings({"rawtypes","unchecked"}) public OptionsDialog(CConn cc_) { super(true); cc = cc_; - setResizable(false); setTitle("VNC Viewer Options"); + setResizable(false); getContentPane().setLayout( new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); - JTabbedPane tabPane = new JTabbedPane(); + tabPane = new JTabbedPane(); tabPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); - ButtonGroup encodingGroup = new ButtonGroup(); - ButtonGroup colourGroup = new ButtonGroup(); + encodingGroup = new ButtonGroup(); + colourGroup = new ButtonGroup(); + int indent = 0; // Compression tab - FormatPanel=new JPanel(new GridBagLayout()); - + JPanel FormatPanel = new JPanel(); + FormatPanel.setLayout(new BoxLayout(FormatPanel, + BoxLayout.PAGE_AXIS)); + FormatPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); + + JPanel autoSelectPane = new JPanel(); + autoSelectPane.setLayout(new BoxLayout(autoSelectPane, + BoxLayout.LINE_AXIS)); + autoSelectPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); autoSelect = new JCheckBox("Auto Select"); - autoSelect.addItemListener(this); - - JPanel encodingPanel = new JPanel(new GridBagLayout()); - encodingPanel.setBorder(BorderFactory.createTitledBorder("Preferred encoding")); - tight = addRadioCheckbox("Tight", encodingGroup, encodingPanel); - zrle = addRadioCheckbox("ZRLE", encodingGroup, encodingPanel); - hextile = addRadioCheckbox("Hextile", encodingGroup, encodingPanel); - raw = addRadioCheckbox("Raw", encodingGroup, encodingPanel); + autoSelectPane.add(autoSelect); + autoSelectPane.add(Box.createHorizontalGlue()); + + JPanel encodingPanel = new JPanel(new GridLayout(4, 1)); + encodingPanel. + setBorder(BorderFactory.createTitledBorder("Preferred encoding")); + tight = new GroupedJRadioButton("Tight", + encodingGroup, encodingPanel); + zrle = new GroupedJRadioButton("ZRLE", + encodingGroup, encodingPanel); + hextile = new GroupedJRadioButton("Hextile", + encodingGroup, encodingPanel); + raw = new GroupedJRadioButton("Raw", encodingGroup, encodingPanel); + + JPanel colourPanel = new JPanel(new GridLayout(4, 1)); + colourPanel.setBorder(BorderFactory.createTitledBorder("Color level")); + fullColour = new GroupedJRadioButton("Full (all available colors)", + colourGroup, colourPanel); + mediumColour = new GroupedJRadioButton("Medium (256 colors)", + colourGroup, colourPanel); + lowColour = new GroupedJRadioButton("Low (64 colours)", + colourGroup, colourPanel); + veryLowColour = new GroupedJRadioButton("Very low(8 colors)", + colourGroup, colourPanel); + + JPanel encodingPane = new JPanel(new GridLayout(1, 2, 5, 0)); + encodingPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); + encodingPane.add(encodingPanel); + encodingPane.add(colourPanel); JPanel tightPanel = new JPanel(new GridBagLayout()); customCompressLevel = new JCheckBox("Custom Compression Level"); - customCompressLevel.addItemListener(this); Object[] compressionLevels = { 1, 2, 3, 4, 5, 6 }; - compressLevel = new JComboBox(compressionLevels); - JLabel compressionLabel = new JLabel("Level (1=fast, 6=best [4-6 are rarely useful])"); + compressLevel = new MyJComboBox(compressionLevels); + ((MyJComboBox)compressLevel).setDocument(new IntegerDocument(1)); + compressLevel.setPrototypeDisplayValue("0."); + compressLevel.setEditable(true); + JLabel compressionLabel = + new JLabel("Level (1=fast, 6=best [4-6 are rarely useful])"); noJpeg = new JCheckBox("Allow JPEG Compression"); - noJpeg.addItemListener(this); Object[] qualityLevels = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - qualityLevel = new JComboBox(qualityLevels); + qualityLevel = new MyJComboBox(qualityLevels); + qualityLevel.setPrototypeDisplayValue("0."); JLabel qualityLabel = new JLabel("Quality (0=poor, 9=best)"); - // Hack to set the left inset on editable JComboBox - if (UIManager.getLookAndFeel().getID() == "Windows") { - compressLevel.setBorder(BorderFactory.createCompoundBorder(compressLevel.getBorder(), - BorderFactory.createEmptyBorder(0,1,0,0))); - } else if (UIManager.getLookAndFeel().getID() == "Metal") { - ComboBoxEditor editor = compressLevel.getEditor(); - JTextField jtf = (JTextField)editor.getEditorComponent(); - jtf.setBorder(new CompoundBorder(jtf.getBorder(), new EmptyBorder(0,2,0,0))); - } - Dimension size = compressLevel.getPreferredSize(); - compressLevel.setEditable(true); - compressLevel.setPreferredSize(size); - addGBComponent(customCompressLevel, tightPanel, 0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(0,0,0,0)); - addGBComponent(compressLevel, tightPanel, 0, 1, 1, 1, 2, 2, 0, 0, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(0,20,0,0)); - addGBComponent(compressionLabel, tightPanel, 1, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,5,0,0)); - addGBComponent(noJpeg, tightPanel, 0, 2, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(4,0,0,0)); - addGBComponent(qualityLevel, tightPanel, 0, 3, 1, 1, 2, 2, 0, 0, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(0,20,0,0)); - addGBComponent(qualityLabel, tightPanel, 1, 3, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,5,0,0)); + tightPanel.add(customCompressLevel, + new GridBagConstraints(0, 0, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 0, 0), + NONE, NONE)); + indent = getButtonLabelInset(customCompressLevel); + tightPanel.add(compressLevel, + new GridBagConstraints(0, 1, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, indent, 0, 0), + NONE, NONE)); + tightPanel.add(compressionLabel, + new GridBagConstraints(1, 1, + 1, 1, + HEAVY, LIGHT, + LINE_START, HORIZONTAL, + new Insets(0, 5, 0, 0), + NONE, NONE)); + tightPanel.add(noJpeg, + new GridBagConstraints(0, 2, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(5, 0, 0, 0), + NONE, NONE)); + indent = getButtonLabelInset(noJpeg); + tightPanel.add(qualityLevel, + new GridBagConstraints(0, 3, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, indent, 0, 0), + NONE, NONE)); + tightPanel.add(qualityLabel, + new GridBagConstraints(1, 3, + 1, 1, + HEAVY, NONE, + LINE_START, HORIZONTAL, + new Insets(0, 5, 0, 0), + NONE, NONE)); + tightPanel.add(Box.createRigidArea(new Dimension(5,0)), + new GridBagConstraints(0, 4, + REMAINDER, REMAINDER, + HEAVY, HEAVY, + LINE_START, BOTH, + new Insets(0, 0, 0, 0), + NONE, NONE)); + FormatPanel.add(autoSelectPane); + FormatPanel.add(encodingPane); + FormatPanel.add(tightPanel); - JPanel colourPanel = new JPanel(new GridBagLayout()); - colourPanel.setBorder(BorderFactory.createTitledBorder("Color level")); - fullColour = addRadioCheckbox("Full (all available colors)", colourGroup, colourPanel); - mediumColour = addRadioCheckbox("Medium (256 colors)", colourGroup, colourPanel); - lowColour = addRadioCheckbox("Low (64 colours)", colourGroup, colourPanel); - veryLowColour = addRadioCheckbox("Very low(8 colors)", colourGroup, colourPanel); + // security tab + JPanel SecPanel = new JPanel(); + SecPanel.setLayout(new BoxLayout(SecPanel, + BoxLayout.PAGE_AXIS)); + SecPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); + + JPanel vencryptPane = new JPanel(); + vencryptPane.setLayout(new BoxLayout(vencryptPane, + BoxLayout.LINE_AXIS)); + vencryptPane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0)); + secVeNCrypt = new JCheckBox("Extended encryption and "+ + "authentication methods (VeNCrypt)"); + vencryptPane.add(secVeNCrypt); + vencryptPane.add(Box.createHorizontalGlue()); + + JPanel encrPanel = new JPanel(new GridBagLayout()); + encrPanel.setBorder(BorderFactory.createTitledBorder("Encryption")); + encNone = new JCheckBox("None"); + encTLS = new JCheckBox("Anonymous TLS"); + encX509 = new JCheckBox("TLS with X.509 certificates"); + JLabel caLabel = new JLabel("X.509 CA Certificate"); + x509ca = new JTextField(); + x509ca.setName(Configuration.getParam("x509ca").getName()); + caButton = new JButton("Browse"); + JLabel crlLabel = new JLabel("X.509 CRL file"); + x509crl = new JTextField(); + x509crl.setName(Configuration.getParam("x509crl").getName()); + crlButton = new JButton("Browse"); + encrPanel.add(encNone, + new GridBagConstraints(0, 0, + REMAINDER, 1, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + encrPanel.add(encTLS, + new GridBagConstraints(0, 1, + REMAINDER, 1, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + encrPanel.add(encX509, + new GridBagConstraints(0, 2, + 3, 1, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 0, 0), + NONE, NONE)); + indent = getButtonLabelInset(encX509); + encrPanel.add(caLabel, + new GridBagConstraints(0, 3, + 1, 1, + LIGHT, LIGHT, + LINE_END, NONE, + new Insets(0, indent, 5, 0), + 0, 0)); + encrPanel.add(x509ca, + new GridBagConstraints(1, 3, + 1, 1, + HEAVY, LIGHT, + LINE_START, HORIZONTAL, + new Insets(0, 5, 5, 0), + 0, 0)); + encrPanel.add(caButton, + new GridBagConstraints(2, 3, + 1, 1, + LIGHT, LIGHT, + LINE_START, VERTICAL, + new Insets(0, 5, 5, 0), + 0, 0)); + encrPanel.add(crlLabel, + new GridBagConstraints(0, 4, + 1, 1, + LIGHT, LIGHT, + LINE_END, NONE, + new Insets(0, indent, 0, 0), + 0, 0)); + encrPanel.add(x509crl, + new GridBagConstraints(1, 4, + 1, 1, + HEAVY, LIGHT, + LINE_START, HORIZONTAL, + new Insets(0, 5, 0, 0), + 0, 0)); + encrPanel.add(crlButton, + new GridBagConstraints(2, 4, + 1, 1, + LIGHT, LIGHT, + LINE_START, VERTICAL, + new Insets(0, 5, 0, 0), + 0, 0)); - addGBComponent(autoSelect,FormatPanel, 0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(4,5,0,5)); - addGBComponent(encodingPanel,FormatPanel, 0, 1, 1, 1, 2, 2, 3, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,5,0,5)); - addGBComponent(colourPanel,FormatPanel, 1, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_END, new Insets(0,0,0,5)); - addGBComponent(tightPanel,FormatPanel, 0, 2, 2, GridBagConstraints.REMAINDER, 2, 2, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(0,5,0,5)); + JPanel authPanel = new JPanel(new GridBagLayout()); + authPanel.setBorder(BorderFactory.createTitledBorder("Authentication")); + + secNone = new JCheckBox("None"); + secVnc = new JCheckBox("Standard VNC"); + secPlain = new JCheckBox("Plaintext"); + secIdent = new JCheckBox("Ident"); + sendLocalUsername = new JCheckBox("Send Local Username"); + authPanel.add(secNone, + new GridBagConstraints(0, 0, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + authPanel.add(secVnc, + new GridBagConstraints(0, 1, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + authPanel.add(secPlain, + new GridBagConstraints(0, 2, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 2, 0), + NONE, NONE)); + authPanel.add(secIdent, + new GridBagConstraints(0, 3, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(2, 0, 0, 0), + NONE, NONE)); + authPanel.add(sendLocalUsername, + new GridBagConstraints(1, 2, + 1, 2, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(2, 20, 2, 0), + NONE, NONE)); + + SecPanel.add(vencryptPane, + new GridBagConstraints(0, 0, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, HORIZONTAL, + new Insets(0, 0, 4, 0), + NONE, NONE)); + SecPanel.add(encrPanel, + new GridBagConstraints(0, 1, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, HORIZONTAL, + new Insets(0, 0, 4, 0), + NONE, NONE)); + SecPanel.add(authPanel, + new GridBagConstraints(0, 2, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, HORIZONTAL, + new Insets(0, 0, 4, 0), + NONE, NONE)); + SecPanel.add(Box.createRigidArea(new Dimension(0,0)), + new GridBagConstraints(0, RELATIVE, + REMAINDER, REMAINDER, + HEAVY, HEAVY, + LINE_START, BOTH, + new Insets(0, 0, 0, 0), + NONE, NONE)); // Input tab - InputsPanel=new JPanel(new GridBagLayout()); + JPanel inputPanel = new JPanel(new GridBagLayout()); + inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); viewOnly = new JCheckBox("View Only (ignore mouse & keyboard)"); - viewOnly.addItemListener(this); acceptClipboard = new JCheckBox("Accept clipboard from server"); - acceptClipboard.addItemListener(this); sendClipboard = new JCheckBox("Send clipboard to server"); - sendClipboard.addItemListener(this); JLabel menuKeyLabel = new JLabel("Menu Key"); String[] menuKeys = new String[MenuKey.getMenuKeySymbolCount()]; for (int i = 0; i < MenuKey.getMenuKeySymbolCount(); i++) menuKeys[i] = KeyEvent.getKeyText(MenuKey.getMenuKeySymbols()[i].keycode); menuKey = new JComboBox(menuKeys); - menuKey.addItemListener(this); - addGBComponent(viewOnly,InputsPanel, 0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5)); - addGBComponent(acceptClipboard,InputsPanel, 0, 1, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5)); - addGBComponent(sendClipboard,InputsPanel, 0, 2, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5)); - addGBComponent(menuKeyLabel,InputsPanel, 0, 3, 1, GridBagConstraints.REMAINDER, 2, 2, 1, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(8,8,0,5)); - addGBComponent(menuKey,InputsPanel, 1, 3, 1, GridBagConstraints.REMAINDER, 2, 2, 25, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(4,5,0,5)); + + inputPanel.add(viewOnly, + new GridBagConstraints(0, 0, + REMAINDER, 1, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + inputPanel.add(acceptClipboard, + new GridBagConstraints(0, 1, + REMAINDER, 1, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + inputPanel.add(sendClipboard, + new GridBagConstraints(0, 2, + REMAINDER, 1, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + inputPanel.add(menuKeyLabel, + new GridBagConstraints(0, 3, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 0, 0), + NONE, NONE)); + inputPanel.add(menuKey, + new GridBagConstraints(1, 3, + 1, 1, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(0, 5, 0, 0), + NONE, NONE)); + inputPanel.add(Box.createRigidArea(new Dimension(5, 0)), + new GridBagConstraints(0, 4, + REMAINDER, REMAINDER, + HEAVY, HEAVY, + LINE_START, BOTH, + new Insets(0, 0, 0, 0), + NONE, NONE)); // Screen tab - ScreenPanel=new JPanel(new GridBagLayout()); + JPanel ScreenPanel = new JPanel(new GridBagLayout()); + ScreenPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); desktopSize = new JCheckBox("Resize remote session on connect"); - desktopSize.addItemListener(this); desktopSize.setEnabled(!cc.viewer.embed.getValue() && (cc.viewer.desktopSize.getValue() != null)); - NumberFormat format = NumberFormat.getIntegerInstance(); - format.setMaximumIntegerDigits(5); - format.setMinimumIntegerDigits(0); - format.setGroupingUsed(false); - desktopWidth = new IntegerTextField(format); - desktopWidth.setColumns(4); + desktopWidth = new IntegerTextField(5); desktopWidth.setEnabled(desktopSize.isSelected()); - desktopHeight = new IntegerTextField(format); - desktopHeight.setColumns(4); + desktopHeight = new IntegerTextField(5); desktopHeight.setEnabled(desktopSize.isSelected()); - JPanel desktopSizePanel = new JPanel(); + JPanel desktopSizePanel = + new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); desktopSizePanel.add(desktopWidth); - desktopSizePanel.add(new JLabel("x")); + desktopSizePanel.add(new JLabel(" x ")); desktopSizePanel.add(desktopHeight); fullScreen = new JCheckBox("Full-screen mode"); - fullScreen.addItemListener(this); fullScreen.setEnabled(!cc.viewer.embed.getValue()); - fullScreenAllMonitors = new JCheckBox("Enable full-screen mode over all monitors"); - fullScreenAllMonitors.addItemListener(this); + fullScreenAllMonitors = + new JCheckBox("Enable full-screen mode over all monitors"); fullScreenAllMonitors.setEnabled(!cc.viewer.embed.getValue()); JLabel scalingFactorLabel = new JLabel("Scaling Factor"); Object[] scalingFactors = { "Auto", "Fixed Aspect Ratio", "50%", "75%", "95%", "100%", "105%", "125%", "150%", "175%", "200%", "250%", "300%", "350%", "400%" }; - scalingFactor = new JComboBox(scalingFactors); - // Hack to set the left inset on editable JComboBox - if (UIManager.getLookAndFeel().getID() == "Windows") { - scalingFactor.setBorder(BorderFactory.createCompoundBorder(scalingFactor.getBorder(), - BorderFactory.createEmptyBorder(0,1,0,0))); - } else if (UIManager.getLookAndFeel().getID() == "Metal") { - ComboBoxEditor sfe = scalingFactor.getEditor(); - JTextField sfeTextField = (JTextField)sfe.getEditorComponent(); - sfeTextField.setBorder(new CompoundBorder(sfeTextField.getBorder(), - new EmptyBorder(0,2,0,0))); - } + scalingFactor = new MyJComboBox(scalingFactors); scalingFactor.setEditable(true); - scalingFactor.addItemListener(this); scalingFactor.setEnabled(!cc.viewer.embed.getValue()); - addGBComponent(desktopSize,ScreenPanel, 0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5)); - addGBComponent(desktopSizePanel,ScreenPanel, 0, 1, 2, 1, 2, 2, 1, 0, GridBagConstraints.REMAINDER, GridBagConstraints.LINE_START, new Insets(0,20,0,0)); - addGBComponent(fullScreen,ScreenPanel, 0, 2, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,5,0,5)); - addGBComponent(fullScreenAllMonitors,ScreenPanel, 0, 3, 4, 1, 2, 2, 1, 0, GridBagConstraints.REMAINDER, GridBagConstraints.LINE_START, new Insets(4,25,0,5)); - addGBComponent(scalingFactorLabel,ScreenPanel, 0, 4, 1, GridBagConstraints.REMAINDER, 2, 2, 1, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(8,8,0,5)); - addGBComponent(scalingFactor,ScreenPanel, 1, 4, 1, GridBagConstraints.REMAINDER, 2, 2, 25, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(4,5,0,5)); + ScreenPanel.add(desktopSize, + new GridBagConstraints(0, 0, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 0, 0), + NONE, NONE)); + indent = getButtonLabelInset(desktopSize); + ScreenPanel.add(desktopSizePanel, + new GridBagConstraints(0, 1, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, indent, 0, 0), + NONE, NONE)); + ScreenPanel.add(fullScreen, + new GridBagConstraints(0, 2, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + indent = getButtonLabelInset(fullScreen); + ScreenPanel.add(fullScreenAllMonitors, + new GridBagConstraints(0, 3, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, indent, 4, 0), + NONE, NONE)); + ScreenPanel.add(scalingFactorLabel, + new GridBagConstraints(0, 4, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + ScreenPanel.add(scalingFactor, + new GridBagConstraints(1, 4, + 1, 1, + HEAVY, LIGHT, + LINE_START, NONE, + new Insets(0, 5, 4, 0), + NONE, NONE)); + ScreenPanel.add(Box.createRigidArea(new Dimension(5, 0)), + new GridBagConstraints(0, 5, + REMAINDER, REMAINDER, + HEAVY, HEAVY, + LINE_START, BOTH, + new Insets(0, 0, 0, 0), + NONE, NONE)); // Misc tab - MiscPanel=new JPanel(new GridBagLayout()); - - shared = new JCheckBox("Shared connection (do not disconnect other viewers)"); - shared.addItemListener(this); + JPanel MiscPanel = new JPanel(new GridBagLayout()); + MiscPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); + shared = + new JCheckBox("Shared connection (do not disconnect other viewers)"); useLocalCursor = new JCheckBox("Render cursor locally"); - useLocalCursor.addItemListener(this); acceptBell = new JCheckBox("Beep when requested by the server"); - acceptBell.addItemListener(this); - addGBComponent(shared,MiscPanel, 0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5)); - addGBComponent(useLocalCursor,MiscPanel, 0, 1, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,5,0,5)); - addGBComponent(acceptBell,MiscPanel, 0, 2, 2, 1, 2, 2, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(4,5,0,5)); + MiscPanel.add(shared, + new GridBagConstraints(0, 0, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + MiscPanel.add(useLocalCursor, + new GridBagConstraints(0, 1, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + MiscPanel.add(acceptBell, + new GridBagConstraints(0, 2, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 4, 0), + NONE, NONE)); + MiscPanel.add(Box.createRigidArea(new Dimension(5, 0)), + new GridBagConstraints(0, 3, + REMAINDER, REMAINDER, + HEAVY, HEAVY, + LINE_START, BOTH, + new Insets(0, 0, 0, 0), + NONE, NONE)); - // load/save tab - DefaultsPanel=new JPanel(new GridBagLayout()); + // load/save tab + JPanel loadSavePanel = new JPanel(new GridBagLayout()); + loadSavePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); JPanel configPanel = new JPanel(new GridBagLayout()); - configPanel.setBorder(BorderFactory.createTitledBorder("Configuration File")); + configPanel. + setBorder(BorderFactory.createTitledBorder("Configuration File")); cfLoadButton = new JButton("Load"); - cfLoadButton.addActionListener(this); - addGBComponent(cfLoadButton,configPanel, 0, 0, 1, 1, 0, 0, 0, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); cfSaveAsButton = new JButton("Save As..."); - cfSaveAsButton.addActionListener(this); - addGBComponent(cfSaveAsButton,configPanel, 0, 1, 1, 1, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); + configPanel.add(cfLoadButton, + new GridBagConstraints(0, 0, + 1, 1, + HEAVY, LIGHT, + CENTER, HORIZONTAL, + new Insets(0, 0, 5, 0), + NONE, NONE)); + configPanel.add(cfSaveAsButton, + new GridBagConstraints(0, 1, + 1, 1, + HEAVY, HEAVY, + CENTER, HORIZONTAL, + new Insets(0, 0, 0, 0), + NONE, NONE)); JPanel defaultsPanel = new JPanel(new GridBagLayout()); defaultsPanel.setBorder(BorderFactory.createTitledBorder("Defaults")); defClearButton = new JButton("Clear"); - defClearButton.addActionListener(this); - addGBComponent(defClearButton,defaultsPanel, 0, 0, 1, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); defReloadButton = new JButton("Reload"); - defReloadButton.addActionListener(this); - addGBComponent(defReloadButton,defaultsPanel, 0, 1, 1, 1, 0, 0, 0, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); defSaveButton = new JButton("Save"); - defSaveButton.addActionListener(this); - addGBComponent(defSaveButton,defaultsPanel, 0, 2, 1, 1, 0, 0, 0, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); - - addGBComponent(configPanel,DefaultsPanel, 0, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,5,4,5)); - addGBComponent(defaultsPanel,DefaultsPanel, 1, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,0,4,5)); - - // security tab - SecPanel=new JPanel(new GridBagLayout()); - - JPanel encryptionPanel = new JPanel(new GridBagLayout()); - encryptionPanel.setBorder(BorderFactory.createTitledBorder("Encryption")); - encNone = addCheckbox("None", null, encryptionPanel); - encTLS = addCheckbox("Anonymous TLS", null, encryptionPanel); - encX509 = addJCheckBox("TLS with X.509 certificates", null, encryptionPanel, new GridBagConstraints(0,2,3,1,1,1,GridBagConstraints.LINE_START,GridBagConstraints.REMAINDER,new Insets(0,0,0,0),0,0)); - - ca = new JButton("Load CA certificate"); - ca.addActionListener(this); - crl = new JButton("Load CRL certificate"); - crl.addActionListener(this); - addGBComponent(ca, encryptionPanel, 0, 3, 1, 1, 2, 2, 1, 0, GridBagConstraints.NONE, GridBagConstraints.LINE_START, new Insets(2,20,2,2)); - addGBComponent(crl, encryptionPanel, 1, 3, 1, 1, 2, 2, 1, 0, GridBagConstraints.NONE, GridBagConstraints.LINE_START, new Insets(2,2,2,2)); - - JPanel authPanel = new JPanel(new GridBagLayout()); - authPanel.setBorder(BorderFactory.createTitledBorder("Authentication")); - secNone = addCheckbox("None", null, authPanel); - secVnc = addCheckbox("Standard VNC", null, authPanel); - secPlain = addJCheckBox("Plaintext", null, authPanel, new GridBagConstraints(0,2,1,1,1,1,GridBagConstraints.LINE_START,GridBagConstraints.NONE,new Insets(0,0,0,5),0,0)); - secIdent = addJCheckBox("Ident", null, authPanel, new GridBagConstraints(0,3,1,1,1,1,GridBagConstraints.LINE_START,GridBagConstraints.NONE,new Insets(0,0,0,5),0,0)); - sendLocalUsername = new JCheckBox("Send Local Username"); - sendLocalUsername.addItemListener(this); - addGBComponent(sendLocalUsername, authPanel, 1, 2, 1, 2, 0, 0, 2, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,20,0,0)); - - secVeNCrypt = new JCheckBox("Extended encryption and authentication methods (VeNCrypt)"); - secVeNCrypt.addItemListener(this); - addGBComponent(secVeNCrypt,SecPanel, 0, 0, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(4,5,0,30)); - addGBComponent(encryptionPanel,SecPanel, 0, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.NONE, GridBagConstraints.LINE_START, new Insets(0,10,2,5)); - addGBComponent(authPanel,SecPanel, 0, 3, 1, 1, 2, 2, 1, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(2,10,2,5)); - - tabPane.add(FormatPanel); - tabPane.add(ScreenPanel); - tabPane.add(InputsPanel); - tabPane.add(MiscPanel); - tabPane.add(DefaultsPanel); - tabPane.add(SecPanel); + defaultsPanel.add(defClearButton, + new GridBagConstraints(0, 0, + 1, 1, + HEAVY, LIGHT, + CENTER, HORIZONTAL, + new Insets(0, 0, 5, 0), + NONE, NONE)); + defaultsPanel.add(defReloadButton, + new GridBagConstraints(0, 1, + 1, 1, + HEAVY, LIGHT, + CENTER, HORIZONTAL, + new Insets(0, 0, 5, 0), + NONE, NONE)); + defaultsPanel.add(defSaveButton, + new GridBagConstraints(0, 2, + 1, 1, + HEAVY, HEAVY, + CENTER, HORIZONTAL, + new Insets(0, 0, 0, 0), + NONE, NONE)); + + loadSavePanel.add(configPanel, + new GridBagConstraints(0, 0, + 1, 1, + HEAVY, LIGHT, + PAGE_START, HORIZONTAL, + new Insets(0, 0, 0, 0), + NONE, NONE)); + loadSavePanel.add(Box.createRigidArea(new Dimension(5, 0)), + new GridBagConstraints(1, 1, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 0, 0), + NONE, NONE)); + loadSavePanel.add(defaultsPanel, + new GridBagConstraints(2, 0, + 1, 1, + HEAVY, LIGHT, + PAGE_START, HORIZONTAL, + new Insets(0, 0, 0, 0), + NONE, NONE)); + loadSavePanel.add(Box.createRigidArea(new Dimension(5, 0)), + new GridBagConstraints(0, 1, + REMAINDER, REMAINDER, + HEAVY, HEAVY, + LINE_START, BOTH, + new Insets(0, 0, 0, 0), + NONE, NONE)); + + // tabPane tabPane.addTab("Compression", FormatPanel); tabPane.addTab("Security", SecPanel); - tabPane.addTab("Input", InputsPanel); + tabPane.addTab("Input", inputPanel); tabPane.addTab("Screen", ScreenPanel); tabPane.addTab("Misc", MiscPanel); - tabPane.addTab("Load / Save", DefaultsPanel); - tabPane.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); - + tabPane.addTab("Load / Save", loadSavePanel); + tabPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + // Resize the tabPane if necessary to prevent scrolling + Insets tpi = + (Insets)UIManager.get("TabbedPane:TabbedPaneTabArea.contentMargins"); + int minWidth = tpi.left + tpi.right; + for (int i = 0; i < tabPane.getTabCount(); i++) + minWidth += tabPane.getBoundsAt(i).width; + int minHeight = tabPane.getPreferredSize().height; + if (tabPane.getPreferredSize().width < minWidth) + tabPane.setPreferredSize(new Dimension(minWidth, minHeight)); + + // button pane okButton = new JButton("OK"); - okButton.setPreferredSize(new Dimension(90,30)); - okButton.addActionListener(this); cancelButton = new JButton("Cancel"); - cancelButton.setPreferredSize(new Dimension(90,30)); - cancelButton.addActionListener(this); - JPanel buttonPane = new JPanel(); - buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); - buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); - buttonPane.add(Box.createHorizontalGlue()); + JPanel buttonPane = new JPanel(new GridLayout(1, 5, 10, 10)); + buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 5)); + buttonPane.add(Box.createRigidArea(new Dimension())); + buttonPane.add(Box.createRigidArea(new Dimension())); + buttonPane.add(Box.createRigidArea(new Dimension())); buttonPane.add(okButton); - buttonPane.add(Box.createRigidArea(new Dimension(5,0))); buttonPane.add(cancelButton); - buttonPane.add(Box.createRigidArea(new Dimension(5,0))); - - this.getContentPane().add(tabPane); - this.getContentPane().add(buttonPane); + this.add(tabPane); + this.add(buttonPane); + addListeners(this); pack(); - } public void initDialog() { @@ -367,21 +733,29 @@ class OptionsDialog extends Dialog implements } } UserPreferences.set("global", "NoJPEG", !noJpeg.isSelected()); - UserPreferences.set("global", "QualityLevel", (Integer)qualityLevel.getSelectedItem()); - UserPreferences.set("global", "CustomCompressLevel", customCompressLevel.isSelected()); - UserPreferences.set("global", "CompressLevel", (Integer)compressLevel.getSelectedItem()); + UserPreferences.set("global", + "QualityLevel", (Integer)qualityLevel.getSelectedItem()); + UserPreferences.set("global", + "CustomCompressLevel", customCompressLevel.isSelected()); + UserPreferences.set("global", + "CompressLevel", (Integer)compressLevel.getSelectedItem()); UserPreferences.set("global", "ViewOnly", viewOnly.isSelected()); - UserPreferences.set("global", "AcceptClipboard", acceptClipboard.isSelected()); + UserPreferences.set("global", + "AcceptClipboard", acceptClipboard.isSelected()); UserPreferences.set("global", "SendClipboard", sendClipboard.isSelected()); - String menuKeyStr = MenuKey.getMenuKeySymbols()[menuKey.getSelectedIndex()].name; + String menuKeyStr = + MenuKey.getMenuKeySymbols()[menuKey.getSelectedIndex()].name; UserPreferences.set("global", "MenuKey", menuKeyStr); String desktopSizeString = - desktopSize.isSelected() ? desktopWidth.getText() + "x" + desktopHeight.getText() : ""; + desktopSize.isSelected() ? + desktopWidth.getText() + "x" + desktopHeight.getText() : ""; UserPreferences.set("global", "DesktopSize", desktopSizeString); UserPreferences.set("global", "FullScreen", fullScreen.isSelected()); - UserPreferences.set("global", "FullScreenAllMonitors", fullScreenAllMonitors.isSelected()); + UserPreferences.set("global", + "FullScreenAllMonitors", fullScreenAllMonitors.isSelected()); UserPreferences.set("global", "Shared", shared.isSelected()); - UserPreferences.set("global", "UseLocalCursor", useLocalCursor.isSelected()); + UserPreferences.set("global", + "UseLocalCursor", useLocalCursor.isSelected()); UserPreferences.set("global", "AcceptBell", acceptBell.isSelected()); String scaleString = scalingFactor.getSelectedItem().toString(); if (scaleString.equalsIgnoreCase("Auto")) { @@ -400,11 +774,14 @@ class OptionsDialog extends Dialog implements UserPreferences.set("viewer", "secVnc", secVnc.isSelected()); UserPreferences.set("viewer", "secPlain", secPlain.isSelected()); UserPreferences.set("viewer", "secIdent", secIdent.isSelected()); - UserPreferences.set("global", "SendLocalUsername", sendLocalUsername.isSelected()); - if (CSecurityTLS.x509ca.getValueStr() != "") - UserPreferences.set("viewer", "x509ca", CSecurityTLS.x509ca.getValueStr()); - if (CSecurityTLS.x509crl.getValueStr() != "") - UserPreferences.set("viewer", "x509crl", CSecurityTLS.x509crl.getValueStr()); + UserPreferences.set("global", + "SendLocalUsername", sendLocalUsername.isSelected()); + if (!CSecurityTLS.x509ca.getValueStr().equals("")) + UserPreferences.set("viewer", "x509ca", + CSecurityTLS.x509ca.getValueStr()); + if (!CSecurityTLS.x509crl.getValueStr().equals("")) + UserPreferences.set("viewer", "x509crl", + CSecurityTLS.x509crl.getValueStr()); } private void restorePreferences() { @@ -443,24 +820,32 @@ class OptionsDialog extends Dialog implements } } noJpeg.setSelected(!UserPreferences.getBool("global", "NoJPEG")); - qualityLevel.setSelectedItem(UserPreferences.getInt("global", "QualityLevel")); - customCompressLevel.setSelected(UserPreferences.getBool("global", "CustomCompressLevel")); - compressLevel.setSelectedItem(UserPreferences.getInt("global", "CompressLevel")); + qualityLevel.setSelectedItem(UserPreferences.getInt("global", + "QualityLevel")); + customCompressLevel.setSelected(UserPreferences.getBool("global", + "CustomCompressLevel")); + compressLevel.setSelectedItem(UserPreferences.getInt("global", + "CompressLevel")); viewOnly.setSelected(UserPreferences.getBool("global", "ViewOnly")); - acceptClipboard.setSelected(UserPreferences.getBool("global", "AcceptClipboard")); - sendClipboard.setSelected(UserPreferences.getBool("global", "SendClipboard")); + acceptClipboard.setSelected(UserPreferences.getBool("global", + "AcceptClipboard")); + sendClipboard.setSelected(UserPreferences.getBool("global", + "SendClipboard")); menuKey.setSelectedItem(UserPreferences.get("global", "MenuKey")); - desktopSize.setSelected(UserPreferences.get("global", "DesktopSize") != null); + desktopSize.setSelected(UserPreferences.get("global", "DesktopSize") + != null); if (desktopSize.isSelected()) { String desktopSizeString = UserPreferences.get("global", "DesktopSize"); desktopWidth.setText(desktopSizeString.split("x")[0]); desktopHeight.setText(desktopSizeString.split("x")[1]); } fullScreen.setSelected(UserPreferences.getBool("global", "FullScreen")); - fullScreenAllMonitors.setSelected(UserPreferences.getBool("global", "FullScreenAllMonitors")); + fullScreenAllMonitors.setSelected(UserPreferences.getBool("global", + "FullScreenAllMonitors")); if (shared.isEnabled()) shared.setSelected(UserPreferences.getBool("global", "Shared")); - useLocalCursor.setSelected(UserPreferences.getBool("global", "UseLocalCursor")); + useLocalCursor.setSelected(UserPreferences.getBool("global", + "UseLocalCursor")); acceptBell.setSelected(UserPreferences.getBool("global", "AcceptBell")); String scaleString = UserPreferences.get("global", "ScalingFactor"); if (scaleString != null) { @@ -473,14 +858,16 @@ class OptionsDialog extends Dialog implements } } if (secVeNCrypt.isEnabled()) { - secVeNCrypt.setSelected(UserPreferences.getBool("viewer", "secVeNCrypt", true)); + secVeNCrypt.setSelected(UserPreferences.getBool("viewer", + "secVeNCrypt", true)); if (secVeNCrypt.isSelected()) { encNone.setSelected(UserPreferences.getBool("viewer", "encNone", true)); encTLS.setSelected(UserPreferences.getBool("viewer", "encTLS", true)); encX509.setSelected(UserPreferences.getBool("viewer", "encX509", true)); secPlain.setSelected(UserPreferences.getBool("viewer", "secPlain", true)); secIdent.setSelected(UserPreferences.getBool("viewer", "secIdent", true)); - sendLocalUsername.setSelected(UserPreferences.getBool("global", "SendLocalUsername")); + sendLocalUsername.setSelected(UserPreferences.getBool("global", + "SendLocalUsername")); } } if (secNone.isEnabled()) @@ -489,44 +876,6 @@ class OptionsDialog extends Dialog implements secVnc.setSelected(UserPreferences.getBool("viewer", "secVnc", true)); } - JRadioButton addRadioCheckbox(String str, ButtonGroup group, JPanel panel) { - JRadioButton c = new JRadioButton(str); - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.LINE_START; - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.weightx = 1; - gbc.weighty = 1; - panel.add(c,gbc); - group.add(c); - c.addItemListener(this); - return c; - } - - JCheckBox addCheckbox(String str, ButtonGroup group, JPanel panel) { - JCheckBox c = new JCheckBox(str); - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.LINE_START; - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.weightx = 1; - gbc.weighty = 1; - panel.add(c,gbc); - if (group != null) - group.add(c); - c.addItemListener(this); - return c; - } - - JCheckBox addJCheckBox(String str, ButtonGroup group, JPanel panel, - GridBagConstraints gbc) { - JCheckBox c = new JCheckBox(str); - panel.add(c,gbc); - if (group != null) - group.add(c); - c.addItemListener(this); - - return c; - } - public void endDialog() { super.endDialog(); if (cc.viewport != null && cc.viewport.isVisible()) { @@ -537,103 +886,126 @@ class OptionsDialog extends Dialog implements public void actionPerformed(ActionEvent e) { Object s = e.getSource(); - if (s instanceof JButton && (JButton)s == okButton) { - if (cc != null) cc.getOptions(); - endDialog(); - } else if (s instanceof JButton && (JButton)s == cancelButton) { - endDialog(); - } else if (s instanceof JButton && (JButton)s == cfLoadButton) { - JFileChooser fc = new JFileChooser(); - fc.setDialogTitle("Path to configuration file"); - fc.setApproveButtonText("OK"); - fc.setFileHidingEnabled(false); - int ret = fc.showOpenDialog(this); - if (ret == JFileChooser.APPROVE_OPTION) { - String filename = fc.getSelectedFile().toString(); - if (filename != null) - Configuration.load(filename); + if (s instanceof JButton) { + JButton button = (JButton)s; + if (button == okButton) { + JTextField[] fields = + { x509ca, x509crl }; + for (JTextField field : fields) { + if (field.getText() != null && !field.getText().equals("")) { + File f = new File(field.getText()); + if (!f.exists() || !f.canRead()) { + String msg = new String("The file "+f.getAbsolutePath()+ + " specified for option "+field.getName()+ + " does not exist or cannot be read. Please "+ + "correct before proceeding."); + JOptionPane.showMessageDialog(this, msg, "WARNING", + JOptionPane.WARNING_MESSAGE); + return; + } + } + } + if (cc != null) cc.getOptions(); + endDialog(); + } else if (button == cancelButton) { + endDialog(); + } else if (button == cfLoadButton) { + JFileChooser fc = new JFileChooser(); + fc.setDialogTitle("Path to configuration file"); + fc.setApproveButtonText("OK"); + fc.setFileHidingEnabled(false); + int ret = fc.showOpenDialog(this); + if (ret == JFileChooser.APPROVE_OPTION) { + String filename = fc.getSelectedFile().toString(); + if (filename != null) + Configuration.load(filename); + cc.setOptions(); + } + } else if (button == cfSaveAsButton) { + JFileChooser fc = new JFileChooser(); + fc.setDialogTitle("Save current configuration as:"); + fc.setApproveButtonText("OK"); + fc.setFileHidingEnabled(false); + int ret = fc.showOpenDialog(this); + if (ret == JFileChooser.APPROVE_OPTION) { + String filename = fc.getSelectedFile().toString(); + if (filename != null) + Configuration.save(filename); + } + } else if (button == defSaveButton) { + updatePreferences(); + UserPreferences.save(); + } else if (button == defReloadButton) { + restorePreferences(); + } else if (button == defClearButton) { + UserPreferences.clear(); cc.setOptions(); + } else if (button == caButton) { + JFileChooser fc = + new JFileChooser(new File(CSecurityTLS.getDefaultCA())); + fc.setDialogTitle("Path to X509 CA certificate"); + fc.setApproveButtonText("OK"); + fc.setFileHidingEnabled(false); + int ret = fc.showOpenDialog(this); + if (ret == JFileChooser.APPROVE_OPTION) + x509ca.setText(fc.getSelectedFile().toString()); + } else if (button == crlButton) { + JFileChooser fc = + new JFileChooser(new File(CSecurityTLS.getDefaultCRL())); + fc.setDialogTitle("Path to X509 CRL file"); + fc.setApproveButtonText("OK"); + fc.setFileHidingEnabled(false); + int ret = fc.showOpenDialog(this); + if (ret == JFileChooser.APPROVE_OPTION) + x509crl.setText(fc.getSelectedFile().toString()); } - } else if (s instanceof JButton && (JButton)s == cfSaveAsButton) { - JFileChooser fc = new JFileChooser(); - fc.setDialogTitle("Save current configuration as:"); - fc.setApproveButtonText("OK"); - fc.setFileHidingEnabled(false); - int ret = fc.showOpenDialog(this); - if (ret == JFileChooser.APPROVE_OPTION) { - String filename = fc.getSelectedFile().toString(); - if (filename != null) - Configuration.save(filename); - } - } else if (s instanceof JButton && (JButton)s == defSaveButton) { - updatePreferences(); - UserPreferences.save(); - } else if (s instanceof JButton && (JButton)s == defReloadButton) { - restorePreferences(); - } else if (s instanceof JButton && (JButton)s == defClearButton) { - UserPreferences.clear(); - cc.setOptions(); - } else if (s instanceof JButton && (JButton)s == ca) { - JFileChooser fc = new JFileChooser(new File(CSecurityTLS.getDefaultCA())); - fc.setDialogTitle("Path to X509 CA certificate"); - fc.setApproveButtonText("OK"); - fc.setFileHidingEnabled(false); - int ret = fc.showOpenDialog(this); - if (ret == JFileChooser.APPROVE_OPTION) - CSecurityTLS.x509ca.setParam(fc.getSelectedFile().toString()); - } else if (s instanceof JButton && (JButton)s == crl) { - JFileChooser fc = new JFileChooser(new File(CSecurityTLS.getDefaultCRL())); - fc.setDialogTitle("Path to X509 CRL file"); - fc.setApproveButtonText("OK"); - fc.setFileHidingEnabled(false); - int ret = fc.showOpenDialog(this); - if (ret == JFileChooser.APPROVE_OPTION) - CSecurityTLS.x509crl.setParam(fc.getSelectedFile().toString()); } } public void itemStateChanged(ItemEvent e) { Object s = e.getSource(); - if (s instanceof JCheckBox && (JCheckBox)s == autoSelect) { - zrle.setEnabled(!autoSelect.isSelected()); - hextile.setEnabled(!autoSelect.isSelected()); - tight.setEnabled(!autoSelect.isSelected()); - raw.setEnabled(!autoSelect.isSelected()); - fullColour.setEnabled(!autoSelect.isSelected()); - mediumColour.setEnabled(!autoSelect.isSelected()); - lowColour.setEnabled(!autoSelect.isSelected()); - veryLowColour.setEnabled(!autoSelect.isSelected()); - } - if (s instanceof JCheckBox && (JCheckBox)s == customCompressLevel) { - compressLevel.setEnabled(customCompressLevel.isSelected()); - } - if (s instanceof JCheckBox && (JCheckBox)s == desktopSize) { - desktopWidth.setEnabled(desktopSize.isSelected()); - desktopHeight.setEnabled(desktopSize.isSelected()); - } - if (s instanceof JCheckBox && (JCheckBox)s == noJpeg) { - qualityLevel.setEnabled(noJpeg.isSelected()); - } - if (s instanceof JCheckBox && (JCheckBox)s == secVeNCrypt) { - encNone.setEnabled(secVeNCrypt.isSelected()); - encTLS.setEnabled(secVeNCrypt.isSelected()); - encX509.setEnabled(secVeNCrypt.isSelected()); - ca.setEnabled(secVeNCrypt.isSelected()); - crl.setEnabled(secVeNCrypt.isSelected()); - secIdent.setEnabled(secVeNCrypt.isSelected()); - secPlain.setEnabled(secVeNCrypt.isSelected()); - sendLocalUsername.setEnabled(secVeNCrypt.isSelected()); - } - if (s instanceof JCheckBox && (JCheckBox)s == encNone) { - secNone.setSelected(encNone.isSelected() && - UserPreferences.getBool("viewer", "secNone", true)); - secVnc.setSelected(encNone.isSelected() && - UserPreferences.getBool("viewer", "secVnc", true)); - } - if (s instanceof JCheckBox && (JCheckBox)s == secIdent || - s instanceof JCheckBox && (JCheckBox)s == secPlain) { - sendLocalUsername.setEnabled(secIdent.isSelected()||secPlain.isSelected()); + if (s instanceof JCheckBox) { + JCheckBox item = (JCheckBox)s; + boolean enable = item.isSelected(); + if (item == autoSelect) { + ButtonGroup[] groups = { encodingGroup, colourGroup }; + for (ButtonGroup grp : groups) { + Enumeration elems = grp.getElements(); + while (elems.hasMoreElements()) + elems.nextElement().setEnabled(!enable); + } + } else if (item == customCompressLevel) { + compressLevel.setEnabled(enable); + } else if (item == desktopSize) { + desktopWidth.setEnabled(enable); + desktopHeight.setEnabled(enable); + } else if (item == noJpeg) { + qualityLevel.setEnabled(enable); + } else if (item == encX509) { + x509ca.setEnabled(enable); + x509crl.setEnabled(enable); + caButton.setEnabled(enable); + crlButton.setEnabled(enable); + } else if (item == secVeNCrypt) { + encNone.setEnabled(enable); + encTLS.setEnabled(enable); + encX509.setEnabled(enable); + x509ca.setEnabled(enable && encX509.isSelected()); + x509crl.setEnabled(enable && encX509.isSelected()); + caButton.setEnabled(enable && encX509.isSelected()); + crlButton.setEnabled(enable && encX509.isSelected()); + secIdent.setEnabled(enable); + secPlain.setEnabled(enable); + sendLocalUsername.setEnabled(enable); + } else if (item == encNone) { + secNone.setSelected(enable && + UserPreferences.getBool("viewer", "secNone", true)); + secVnc.setSelected(enable && + UserPreferences.getBool("viewer", "secVnc", true)); + } else if (item == secIdent || item == secPlain) { + sendLocalUsername.setEnabled(secIdent.isSelected() || + secPlain.isSelected()); + } } } - } diff --git a/java/com/tigervnc/vncviewer/PasswdDialog.java b/java/com/tigervnc/vncviewer/PasswdDialog.java index edd95540..26a138d6 100644 --- a/java/com/tigervnc/vncviewer/PasswdDialog.java +++ b/java/com/tigervnc/vncviewer/PasswdDialog.java @@ -22,13 +22,20 @@ package com.tigervnc.vncviewer; import java.awt.*; import java.awt.event.*; import javax.swing.*; + import com.jcraft.jsch.*; +import com.tigervnc.rfb.*; + +import static java.awt.GridBagConstraints.HORIZONTAL; +import static java.awt.GridBagConstraints.LINE_START; +import static java.awt.GridBagConstraints.NONE; +import static java.awt.GridBagConstraints.REMAINDER; -class PasswdDialog extends Dialog implements KeyListener, - UserInfo, +class PasswdDialog extends Dialog implements UserInfo, UIKeyboardInteractive { - public PasswdDialog(String title, boolean userDisabled, boolean passwdDisabled) { + public PasswdDialog(String title, + boolean userDisabled, boolean passwdDisabled) { super(true); setResizable(false); setTitle(title); @@ -38,28 +45,45 @@ class PasswdDialog extends Dialog implements KeyListener, } }); - JPanel p1 = new JPanel(); + JPanel p1 = new JPanel(new GridBagLayout()); + p1.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + userLabel = new JLabel("Username:"); - p1.add(userLabel); + userLabel.setEnabled(!userDisabled); + p1.add(userLabel, new GridBagConstraints(0, 0, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 0, 0), + NONE, NONE)); userEntry = new JTextField(30); userEntry.setEnabled(!userDisabled); - userLabel.setEnabled(!userDisabled); - p1.add(userEntry); - userEntry.addKeyListener(this); + p1.add(userEntry, new GridBagConstraints(1, 0, + 1, 1, + HEAVY, LIGHT, + LINE_START, REMAINDER, + new Insets(0, 5, 0, 0), + NONE, NONE)); - JPanel p2 = new JPanel(); passwdLabel = new JLabel("Password:"); - passwdLabel.setPreferredSize(userLabel.getPreferredSize()); - p2.add(passwdLabel); + passwdLabel.setEnabled(!passwdDisabled); + p1.add(passwdLabel, new GridBagConstraints(0, 1, + 1, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(5, 0, 0, 0), + NONE, NONE)); passwdEntry = new JPasswordField(30); passwdEntry.setEnabled(!passwdDisabled); - passwdLabel.setEnabled(!passwdDisabled); - p2.add(passwdEntry); - passwdEntry.addKeyListener(this); + p1.add(passwdEntry, new GridBagConstraints(1, 1, + 1, 1, + HEAVY, LIGHT, + LINE_START, REMAINDER, + new Insets(5, 5, 0, 0), + NONE, NONE)); - getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS)); - getContentPane().add(p1); - getContentPane().add(p2); + this.add(p1); + addListeners(this); pack(); if (userEntry.isEnabled()) { userEntry.requestFocus(); @@ -68,10 +92,6 @@ class PasswdDialog extends Dialog implements KeyListener, } } - /** Handle the key-typed event. */ - public void keyTyped(KeyEvent event) { } - /** Handle the key-released event. */ - public void keyReleased(KeyEvent event) { } /** Handle the key-pressed event. */ public void keyPressed(KeyEvent event) { Object s = event.getSource(); @@ -79,7 +99,8 @@ class PasswdDialog extends Dialog implements KeyListener, if (event.getKeyCode() == KeyEvent.VK_ENTER) { endDialog(); } - } else if (s instanceof JPasswordField && (JPasswordField)s == passwdEntry) { + } else if (s instanceof JPasswordField + && (JPasswordField)s == passwdEntry) { if (event.getKeyCode() == KeyEvent.VK_ENTER) { endDialog(); } @@ -89,81 +110,90 @@ class PasswdDialog extends Dialog implements KeyListener, public String getPassword() { return new String(passwdEntry.getPassword()); } - public String getPassphrase(){ return null; } - public boolean promptPassphrase(String message){ return false; } - public boolean promptPassword(String message){ + + public String getPassphrase() { return null; } + public boolean promptPassphrase(String message) { return false; } + + public boolean promptPassword(String message) { setTitle(message); showDialog(); - if (passwdEntry != null) - return true; + if (userEntry.isEnabled()) + if (userEntry.getText().equals("")) + return false; + if (passwdEntry.isEnabled()) + if (!passwdEntry.getText().equals("")) + return true; return false; } - public void showMessage(String message){ - JOptionPane.showMessageDialog(null, message); + + public void showMessage(String message) { + JOptionPane.showMessageDialog(null, message, "Message", + JOptionPane.PLAIN_MESSAGE); } - public boolean promptYesNo(String str){ - Object[] options={ "yes", "no" }; - int foo=JOptionPane.showOptionDialog(null, + + public boolean promptYesNo(String str) { + Object[] options={ "YES", "NO" }; + int ret=JOptionPane.showOptionDialog(null, str, "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); - return foo==0; + return (ret == 0); } + public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, - boolean[] echo){ - Container panel = new JPanel(); - panel.setLayout(new GridBagLayout()); - - GridBagConstraints gbc = - new GridBagConstraints(0,0,1,1,1,1, - GridBagConstraints.NORTHWEST, - GridBagConstraints.NONE, - new Insets(0,0,0,0),0,0); - gbc.weightx = 1.0; - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.gridx = 0; - panel.add(new JLabel(instruction), gbc); - gbc.gridy++; - - gbc.gridwidth = GridBagConstraints.RELATIVE; + boolean[] echo) { + vlog.info("OK"); + Container panel = new JPanel(new GridBagLayout()); + ((JPanel)panel).setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + + panel.add(new JLabel(instruction), + new GridBagConstraints(0, 0, + REMAINDER, 1, + LIGHT, LIGHT, + LINE_START, NONE, + new Insets(0, 0, 0, 0), + NONE, NONE)); JTextField[] texts=new JTextField[prompt.length]; - for(int i=0; i