summaryrefslogtreecommitdiffstats
path: root/java/com/tigervnc/vncviewer
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/tigervnc/vncviewer')
-rw-r--r--java/com/tigervnc/vncviewer/CConn.java27
-rw-r--r--java/com/tigervnc/vncviewer/ClipboardDialog.java6
-rw-r--r--java/com/tigervnc/vncviewer/Dialog.java125
-rw-r--r--java/com/tigervnc/vncviewer/OptionsDialog.java1058
-rw-r--r--java/com/tigervnc/vncviewer/PasswdDialog.java175
-rw-r--r--java/com/tigervnc/vncviewer/ServerDialog.java115
-rw-r--r--java/com/tigervnc/vncviewer/VncViewer.java14
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<AbstractButton> 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<prompt.length; i++){
- gbc.fill = GridBagConstraints.NONE;
- gbc.gridx = 0;
- gbc.weightx = 1;
- panel.add(new JLabel(prompt[i]),gbc);
-
- gbc.gridx = 1;
- gbc.fill = GridBagConstraints.HORIZONTAL;
- gbc.weighty = 1;
- if(echo[i]){
+ for (int i = 0; i < prompt.length; i++) {
+ panel.add(new JLabel(prompt[i]),
+ new GridBagConstraints(0, i+1,
+ 1, 1,
+ LIGHT, LIGHT,
+ LINE_START, NONE,
+ new Insets(5, 0, 0, 0),
+ NONE, NONE));
+
+ if(echo[i])
texts[i]=new JTextField(20);
- }
- else{
+ else
texts[i]=new JPasswordField(20);
- }
- panel.add(texts[i], gbc);
- gbc.gridy++;
+
+ panel.add(texts[i],
+ new GridBagConstraints(1, i+1,
+ 1, 1,
+ HEAVY, LIGHT,
+ LINE_START, HORIZONTAL,
+ new Insets(5, 5, 0, 0),
+ NONE, NONE));
}
- if(JOptionPane.showConfirmDialog(null, panel,
- destination+": "+name,
- JOptionPane.OK_CANCEL_OPTION,
- JOptionPane.QUESTION_MESSAGE)
- ==JOptionPane.OK_OPTION){
+ if (JOptionPane.showConfirmDialog(null, panel,
+ destination+": "+name,
+ JOptionPane.OK_CANCEL_OPTION,
+ JOptionPane.QUESTION_MESSAGE)
+ == JOptionPane.OK_OPTION) {
String[] response=new String[prompt.length];
for(int i=0; i<prompt.length; i++){
response[i]=texts[i].getText();
}
- return response;
- }
- else{
+ return response;
+ } else{
return null; // cancel
}
}
@@ -172,4 +202,5 @@ class PasswdDialog extends Dialog implements KeyListener,
JTextField userEntry;
JLabel passwdLabel;
JPasswordField passwdEntry;
+ static LogWriter vlog = new LogWriter("PasswdDialog");
}
diff --git a/java/com/tigervnc/vncviewer/ServerDialog.java b/java/com/tigervnc/vncviewer/ServerDialog.java
index 7b8ee0c7..172bde6f 100644
--- a/java/com/tigervnc/vncviewer/ServerDialog.java
+++ b/java/com/tigervnc/vncviewer/ServerDialog.java
@@ -1,5 +1,5 @@
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
- * Copyright (C) 2011-2013 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
@@ -28,9 +28,12 @@ import java.util.*;
import com.tigervnc.rfb.*;
-class ServerDialog extends Dialog implements
- ActionListener
-{
+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 ServerDialog extends Dialog {
@SuppressWarnings({"unchecked","rawtypes"})
public ServerDialog(OptionsDialog options_,
@@ -39,9 +42,8 @@ class ServerDialog extends Dialog implements
super(true);
cc = cc_;
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
- setResizable(false);
- setSize(new Dimension(340, 135));
setTitle("VNC Viewer: Connection Details");
+ setResizable(false);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
if (VncViewer.nViewers == 1) {
@@ -54,25 +56,14 @@ class ServerDialog extends Dialog implements
});
options = options_;
- getContentPane().setLayout(new GridBagLayout());
-
- JLabel serverLabel = new JLabel("Server:", JLabel.RIGHT);
- if (UserPreferences.get("ServerDialog", "history") != null) {
- String valueStr = UserPreferences.get("ServerDialog", "history");
- 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)));
- }
+ JLabel serverLabel = new JLabel("VNC Server:", JLabel.RIGHT);
+ String valueStr = new String("");
+ if (UserPreferences.get("ServerDialog", "history") != null)
+ valueStr = UserPreferences.get("ServerDialog", "history");
+ server = new MyJComboBox(valueStr.split(","));
+ if (valueStr.equals(""))
+ server.setPrototypeDisplayValue("255.255.255.255:5900");
server.setEditable(true);
editor = server.getEditor();
@@ -88,42 +79,50 @@ class ServerDialog extends Dialog implements
}
});
- JPanel topPanel = new JPanel(new GridBagLayout());
-
- addGBComponent(new JLabel(VncViewer.logoIcon),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,40));
+ Container contentPane = this.getContentPane();
+ contentPane.setLayout(new GridBagLayout());
+ JLabel icon = new JLabel(VncViewer.logoIcon);
optionsButton = new JButton("Options...");
aboutButton = new JButton("About...");
okButton = new JButton("OK");
cancelButton = new JButton("Cancel");
- JPanel buttonPanel = new JPanel(new GridBagLayout());
- buttonPanel.setPreferredSize(new Dimension(340, 40));
- addGBComponent(aboutButton,buttonPanel, 0, 3, 1, 1, 0, 0, 0.2, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(0,5,0,5));
- addGBComponent(optionsButton,buttonPanel, 1, 3, 1, 1, 0, 0, 0, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(0,5,0,5));
- addGBComponent(okButton,buttonPanel, 2, 3, 1, 1, 0, 0, 0.8, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(0,5,0,5));
- addGBComponent(cancelButton,buttonPanel, 3, 3, 1, 1, 0, 0, 0.5, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(0,5,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);
+ contentPane.add(icon,
+ new GridBagConstraints(0, 0,
+ 1, 1,
+ LIGHT, LIGHT,
+ LINE_START, NONE,
+ new Insets(5, 5, 5, 5),
+ NONE, NONE));
+ contentPane.add(serverLabel,
+ new GridBagConstraints(1, 0,
+ 1, 1,
+ LIGHT, LIGHT,
+ LINE_START, NONE,
+ new Insets(5, 10, 5, 5),
+ NONE, NONE));
+ contentPane.add(server,
+ new GridBagConstraints(2, 0,
+ REMAINDER, 1,
+ HEAVY, LIGHT,
+ LINE_START, HORIZONTAL,
+ new Insets(5, 0, 5, 5),
+ NONE, NONE));
+ JPanel buttonPane = new JPanel();
+ buttonPane.setLayout(new GridLayout(1, 4, 5, 5));
+ buttonPane.add(aboutButton);
+ buttonPane.add(optionsButton);
+ buttonPane.add(okButton);
+ buttonPane.add(cancelButton);
+ contentPane.add(buttonPane,
+ new GridBagConstraints(0, 1,
+ REMAINDER, 1,
+ LIGHT, LIGHT,
+ LINE_START, HORIZONTAL,
+ new Insets(5, 5, 5, 5),
+ NONE, NONE));
+ addListeners(this);
pack();
}
@@ -160,12 +159,14 @@ class ServerDialog extends Dialog implements
}
// set params
Configuration.setParam("Server", Hostname.getHost(serverName));
- Configuration.setParam("Port", Integer.toString(Hostname.getPort(serverName)));
+ Configuration.setParam("Port",
+ Integer.toString(Hostname.getPort(serverName)));
// Update the history list
String valueStr = UserPreferences.get("ServerDialog", "history");
String t = (valueStr == null) ? "" : valueStr;
StringTokenizer st = new StringTokenizer(t, ",");
- StringBuffer sb = new StringBuffer().append((String)server.getSelectedItem());
+ StringBuffer sb =
+ new StringBuffer().append((String)server.getSelectedItem());
while (st.hasMoreTokens()) {
String str = st.nextToken();
if (!str.equals((String)server.getSelectedItem()) && !str.equals("")) {
@@ -180,7 +181,7 @@ class ServerDialog extends Dialog implements
CConn cc;
@SuppressWarnings("rawtypes")
- JComboBox server;
+ MyJComboBox server;
ComboBoxEditor editor;
JButton aboutButton, optionsButton, okButton, cancelButton;
OptionsDialog options;
diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java
index 0c54d796..078076f7 100644
--- a/java/com/tigervnc/vncviewer/VncViewer.java
+++ b/java/com/tigervnc/vncviewer/VncViewer.java
@@ -657,7 +657,17 @@ public class VncViewer extends javax.swing.JApplet
"JPEG quality level. "+
"0 = Low, 9 = High",
8);
-
+ StringParameter x509ca
+ = new StringParameter("X509CA",
+ "Path to CA certificate to use when authenticating remote servers "+
+ "using any of the X509 security schemes (X509None, X509Vnc, etc.). "+
+ "Must be in PEM format.",
+ FileUtils.getHomeDir()+".vnc/x509_ca.pem");
+ StringParameter x509crl
+ = new StringParameter("X509CRL",
+ "Path to certificate revocation list to use in conjunction with "+
+ "-X509CA. Must also be in PEM format.",
+ FileUtils.getHomeDir()+".vnc/x509_crl.pem");
StringParameter config
= new StringParameter("config",
"Specifies a configuration file to load.", null);
@@ -665,5 +675,5 @@ public class VncViewer extends javax.swing.JApplet
Thread thread;
Socket sock;
static int nViewers;
- static LogWriter vlog = new LogWriter("main");
+ static LogWriter vlog = new LogWriter("VncViewer");
}