/*
* SiteMgr.java
*
* Created on July 31, 2007, 8:38 AM
*
* @author pquiring
*/
import java.util.*;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.filechooser.*;
import javaforce.*;
public class SiteMgr extends javax.swing.JDialog implements XML.XMLEvent {
public SiteMgr(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
setComponentOrientation(((parent == null) ? javax.swing.JOptionPane.getRootFrame() : parent).getComponentOrientation());
if (parent != null) setLocationRelativeTo(parent);
clearFields();
setPosition();
xml.setEventListener(this);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
buttonGroup1 = new javax.swing.ButtonGroup();
bConnect = new javax.swing.JButton();
bSave = new javax.swing.JButton();
bDelete = new javax.swing.JButton();
bNewSite = new javax.swing.JButton();
settings = new javax.swing.JPanel();
lHost = new javax.swing.JLabel();
tHost = new javax.swing.JTextField();
lProtocol = new javax.swing.JLabel();
cbProtocol = new javax.swing.JComboBox();
lPort = new javax.swing.JLabel();
tPort = new javax.swing.JTextField();
lUsername = new javax.swing.JLabel();
tUsername = new javax.swing.JTextField();
lPassword = new javax.swing.JLabel();
tPassword = new javax.swing.JPasswordField();
lName = new javax.swing.JLabel();
tName = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
cbX = new javax.swing.JCheckBox();
tX = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
cbY = new javax.swing.JCheckBox();
tY = new javax.swing.JTextField();
cbX11 = new javax.swing.JCheckBox();
cbAutoSize = new javax.swing.JCheckBox();
cbLocalEcho = new javax.swing.JCheckBox();
jLabel3 = new javax.swing.JLabel();
tSSHKey = new javax.swing.JTextField();
selectSSHKey = new javax.swing.JButton();
utf8 = new javax.swing.JRadioButton();
ascii = new javax.swing.JRadioButton();
listScroll = new javax.swing.JScrollPane();
tree = new javax.swing.JTree();
bNewFolder = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle("Site Manager");
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
bConnect.setText("Connect");
bConnect.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bConnectActionPerformed(evt);
}
});
bSave.setText("Save");
bSave.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bSaveActionPerformed(evt);
}
});
bDelete.setText("Delete");
bDelete.setEnabled(false);
bDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bDeleteActionPerformed(evt);
}
});
bNewSite.setText("New Site");
bNewSite.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bNewSiteActionPerformed(evt);
}
});
settings.setBorder(javax.swing.BorderFactory.createTitledBorder("Settings"));
lHost.setText("Host");
tHost.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
anykey(evt);
}
});
lProtocol.setText("Protocol");
cbProtocol.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Telnet (23)", "SSH (22)", "SSL (443)", "ComPort" }));
cbProtocol.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbProtocolItemStateChanged(evt);
}
});
lPort.setText("Port");
tPort.setText("23");
tPort.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
anykey(evt);
}
});
lUsername.setText("Username");
tUsername.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
anykey(evt);
}
});
lPassword.setText("Password");
tPassword.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
anykey(evt);
}
});
lName.setText("Name");
tName.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
anykey(evt);
}
});
jLabel1.setText("Columns");
cbX.setText("Global");
cbX.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
cbX.setMargin(new java.awt.Insets(0, 0, 0, 0));
cbX.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cbXActionPerformed(evt);
}
});
jLabel2.setText("Rows");
cbY.setText("Global");
cbY.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
cbY.setMargin(new java.awt.Insets(0, 0, 0, 0));
cbY.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cbYActionPerformed(evt);
}
});
cbX11.setText("X11 Forwarding");
cbX11.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
cbX11.setEnabled(false);
cbX11.setMargin(new java.awt.Insets(0, 0, 0, 0));
cbX11.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cbX11ActionPerformed(evt);
}
});
cbAutoSize.setText("Auto Sizing");
cbAutoSize.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
cbAutoSize.setMargin(new java.awt.Insets(0, 0, 0, 0));
cbAutoSize.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbAutoSizeItemStateChanged(evt);
}
});
cbLocalEcho.setText("Local Echo");
cbLocalEcho.setBorder(null);
jLabel3.setText("Identity Key");
selectSSHKey.setText("File...");
selectSSHKey.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selectSSHKeyActionPerformed(evt);
}
});
buttonGroup1.add(utf8);
utf8.setText("UTF8");
utf8.setBorder(null);
buttonGroup1.add(ascii);
ascii.setText("ASCII 8bit");
ascii.setBorder(null);
javax.swing.GroupLayout settingsLayout = new javax.swing.GroupLayout(settings);
settings.setLayout(settingsLayout);
settingsLayout.setHorizontalGroup(
settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(settingsLayout.createSequentialGroup()
.addContainerGap()
.addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tName)
.addComponent(tHost)
.addGroup(settingsLayout.createSequentialGroup()
.addComponent(cbProtocol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tPort))
.addComponent(tUsername)
.addComponent(tPassword)
.addGroup(settingsLayout.createSequentialGroup()
.addComponent(tSSHKey)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(selectSSHKey))
.addGroup(settingsLayout.createSequentialGroup()
.addComponent(cbX)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tX))
.addGroup(settingsLayout.createSequentialGroup()
.addComponent(cbY)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tY))
.addGroup(settingsLayout.createSequentialGroup()
.addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(utf8)
.addComponent(jLabel3)
.addComponent(lName)
.addComponent(lHost)
.addGroup(settingsLayout.createSequentialGroup()
.addComponent(lProtocol)
.addGap(46, 46, 46)
.addComponent(lPort))
.addComponent(lUsername)
.addComponent(lPassword)
.addComponent(cbLocalEcho)
.addComponent(jLabel1)
.addComponent(jLabel2)
.addComponent(cbX11)
.addComponent(cbAutoSize)
.addComponent(ascii))
.addGap(0, 75, Short.MAX_VALUE)))
.addContainerGap())
);
settingsLayout.setVerticalGroup(
settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(settingsLayout.createSequentialGroup()
.addComponent(lName)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lHost)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tHost, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lProtocol)
.addComponent(lPort))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(cbProtocol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(tPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lUsername)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lPassword)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(tSSHKey, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(selectSSHKey))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(cbX)
.addComponent(tX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(cbY)
.addComponent(tY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbAutoSize)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbX11)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbLocalEcho)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(utf8)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ascii)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
tree.setModel(xml.getTreeModel());
tree.setDragEnabled(true);
tree.setEditable(true);
tree.setShowsRootHandles(true);
tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
treeValueChanged(evt);
}
});
listScroll.setViewportView(tree);
bNewFolder.setText("New Folder");
bNewFolder.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bNewFolderActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(listScroll, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(bSave, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(bDelete, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(bNewFolder, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(bNewSite, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(bConnect, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(settings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(settings, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addComponent(bConnect)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bSave)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bDelete)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bNewSite)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bNewFolder))
.addComponent(listScroll, javax.swing.GroupLayout.Alignment.LEADING))
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void cbAutoSizeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbAutoSizeItemStateChanged
if (cbAutoSize.isSelected()) {
cbY.setEnabled(false);
cbX.setEnabled(false);
tY.setEditable(false);
tX.setEditable(false);
} else {
cbY.setEnabled(true);
cbX.setEnabled(true);
tY.setEditable(!cbY.isSelected());
tX.setEditable(!cbX.isSelected());
}
}//GEN-LAST:event_cbAutoSizeItemStateChanged
private void cbX11ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbX11ActionPerformed
if (cbProtocol.getSelectedIndex() != 1) cbX11.setSelected(false);
}//GEN-LAST:event_cbX11ActionPerformed
private void cbYActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbYActionPerformed
if (cbY.isSelected()) {
tY.setEditable(false);
tY.setText("");
} else {
tY.setEditable(true);
tY.setText(Integer.toString(Settings.settings.rows));
}
}//GEN-LAST:event_cbYActionPerformed
private void cbXActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbXActionPerformed
if (cbX.isSelected()) {
tX.setEditable(false);
tX.setText("");
} else {
tX.setEditable(true);
tX.setText(Integer.toString(Settings.settings.cols));
}
}//GEN-LAST:event_cbXActionPerformed
private void anykey(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_anykey
if (evt.getKeyChar() == '\"') evt.consume();
if (evt.getKeyChar() == '\'') evt.consume();
}//GEN-LAST:event_anykey
private void bNewFolderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bNewFolderActionPerformed
String name = JOptionPane.showInputDialog(this, null, "Enter Folder Name",
JOptionPane.QUESTION_MESSAGE);
if (name == null) return;
if (!validField(name)) return;
XML.XMLTag parent = selectedTag;
if (parent == null) parent = sitesTag;
if (parent.isLeaf) parent = parent.getParent();
xml.addTag(parent, name, "", "").isNotLeaf = true;
}//GEN-LAST:event_bNewFolderActionPerformed
private void treeValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_treeValueChanged
loadSite();
}//GEN-LAST:event_treeValueChanged
private void cbProtocolItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbProtocolItemStateChanged
tPort.setText(ports[cbProtocol.getSelectedIndex()]);
switch (cbProtocol.getSelectedIndex()) {
case 0: //telnet
case 2: //ssl
tPort.setEditable(true);
tUsername.setEditable(false);
tPassword.setEditable(false);
tSSHKey.setEditable(false);
cbX11.setEnabled(false);
cbX11.setSelected(false);
break;
case 1: //ssh
tPort.setEditable(true);
tUsername.setEditable(true);
tPassword.setEditable(true);
tSSHKey.setEditable(true);
cbX11.setEnabled(true);
break;
case 3: //com
tPort.setEditable(false);
tUsername.setEditable(false);
tPassword.setEditable(false);
tSSHKey.setEditable(false);
if (tHost.getText().length() == 0) {
if (JF.isWindows())
tHost.setText("com1,9600");
else
tHost.setText("/dev/ttyS0,9600");
}
cbX11.setEnabled(false);
cbX11.setSelected(false);
break;
}
}//GEN-LAST:event_cbProtocolItemStateChanged
private void bDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bDeleteActionPerformed
if (selectedTag == null) return;
if (selectedTag.getParent() == null) return;
xml.deleteTag(selectedTag);
clearFields();
}//GEN-LAST:event_bDeleteActionPerformed
private void bNewSiteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bNewSiteActionPerformed
clearFields();
tree.clearSelection();
}//GEN-LAST:event_bNewSiteActionPerformed
private void bSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bSaveActionPerformed
XML.XMLTag parent;
if (!validFields()) return;
if (isNew) {
//save as new connection
parent = getSelectedTag();
if (parent == null) parent = sitesTag;
if (parent.isLeaf) parent = parent.getParent();
selectedTag = xml.addTag(parent, tName.getText(), "", "");
selectedTag.isLeaf = true;
isNew = false;
bDelete.setEnabled(true);
} else {
//save existing connection to selectedTag
xml.setTag(selectedTag, tName.getText(), "", "");
}
xml.addSetTag(selectedTag, "host", "", tHost.getText());
xml.addSetTag(selectedTag, "protocol", "", protocols[cbProtocol.getSelectedIndex()]);
xml.addSetTag(selectedTag, "port", "", tPort.getText());
xml.addSetTag(selectedTag, "username", "", tUsername.getText());
xml.addSetTag(selectedTag, "password", "", encodePassword(new String(tPassword.getPassword())));
xml.addSetTag(selectedTag, "sshkey", "", tSSHKey.getText());
xml.addSetTag(selectedTag, "cols", "", getCols());
xml.addSetTag(selectedTag, "rows", "", getRows());
xml.addSetTag(selectedTag, "x11", "", cbX11.isSelected() ? "true" : "false");
xml.addSetTag(selectedTag, "autosize", "", cbAutoSize.isSelected() ? "true" : "false");
xml.addSetTag(selectedTag, "localecho", "", cbLocalEcho.isSelected() ? "true" : "false");
xml.addSetTag(selectedTag, "utf8", "", utf8.isSelected() ? "true" : "false");
show(selectedTag);
}//GEN-LAST:event_bSaveActionPerformed
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
saveAll();
dispose();
}//GEN-LAST:event_formWindowClosing
private void bConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bConnectActionPerformed
XML.XMLTag child, child2;
if ((selectedTag != null) && (selectedTag.name.equals("folder"))) {
//return all sub-children
int cnt = 0;
for(int a=0;a<selectedTag.getChildCount();a++) {
if (selectedTag.getChildAt(a).name.equals("site")) cnt++;
}
if (cnt == 0) return;
retValue = new SiteDetails[cnt];
cnt = 0;
for(int a=0;a<selectedTag.getChildCount();a++) {
child = selectedTag.getChildAt(a);
if (child.name.equals("site")) {
retValue[cnt] = new SiteDetails();
retValue[cnt].name = child.getName();
for(int b=0;b<child.getChildCount();b++) {
child2 = child.getChildAt(b);
if (child2.name.equals("host")) retValue[cnt].host = child2.content;
if (child2.name.equals("protocol")) retValue[cnt].protocol = child2.content;
if (child2.name.equals("port")) retValue[cnt].port = child2.content;
if (child2.name.equals("username")) retValue[cnt].username = child2.content;
if (child2.name.equals("password")) retValue[cnt].password = decodePassword(child2.content);
if (child2.name.equals("sshkey")) retValue[cnt].sshKey = child2.content;
if (child2.name.equals("cols")) retValue[cnt].sx = getCols(child2.content);
if (child2.name.equals("rows")) retValue[cnt].sy = getRows(child2.content);
if (child2.name.equals("x11")) retValue[cnt].x11 = child2.content.equals("true");
if (child2.name.equals("autosize")) retValue[cnt].autoSize = child2.content.equals("true");
}
//in case rows/cols is not defined
if (retValue[cnt].sx == 0) retValue[cnt].sx = getCols("0");
if (retValue[cnt].sy == 0) retValue[cnt].sy = getRows("0");
cnt++;
}
}
setVisible(false);
return;
}
if (!validFields()) return;
bSaveActionPerformed(null);
saveAll();
retValue = new SiteDetails[1];
retValue[0] = new SiteDetails();
retValue[0].name = tName.getText();
retValue[0].host = tHost.getText();
retValue[0].protocol = protocols[cbProtocol.getSelectedIndex()];
retValue[0].port = tPort.getText();
retValue[0].username = tUsername.getText();
retValue[0].password = new String(tPassword.getPassword());
retValue[0].sshKey = tSSHKey.getText();
retValue[0].sx = getCols(getCols());
retValue[0].sy = getRows(getRows());
retValue[0].autoSize = cbAutoSize.isSelected();
retValue[0].x11 = cbX11.isSelected();
retValue[0].localecho = cbLocalEcho.isSelected();
retValue[0].utf8 = utf8.isSelected();
setVisible(false);
}//GEN-LAST:event_bConnectActionPerformed
private void selectSSHKeyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectSSHKeyActionPerformed
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.addChoosableFileFilter(new FileNameExtensionFilter("PEM", "pem"));
chooser.setMultiSelectionEnabled(false);
chooser.setCurrentDirectory(new File(JF.getUserPath()));
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
tSSHKey.setText(chooser.getSelectedFile().toString());
}
}//GEN-LAST:event_selectSSHKeyActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JRadioButton ascii;
private javax.swing.JButton bConnect;
private javax.swing.JButton bDelete;
private javax.swing.JButton bNewFolder;
private javax.swing.JButton bNewSite;
private javax.swing.JButton bSave;
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JCheckBox cbAutoSize;
private javax.swing.JCheckBox cbLocalEcho;
private javax.swing.JComboBox cbProtocol;
private javax.swing.JCheckBox cbX;
private javax.swing.JCheckBox cbX11;
private javax.swing.JCheckBox cbY;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel lHost;
private javax.swing.JLabel lName;
private javax.swing.JLabel lPassword;
private javax.swing.JLabel lPort;
private javax.swing.JLabel lProtocol;
private javax.swing.JLabel lUsername;
private javax.swing.JScrollPane listScroll;
private javax.swing.JButton selectSSHKey;
private javax.swing.JPanel settings;
private javax.swing.JTextField tHost;
private javax.swing.JTextField tName;
private javax.swing.JPasswordField tPassword;
private javax.swing.JTextField tPort;
private javax.swing.JTextField tSSHKey;
private javax.swing.JTextField tUsername;
private javax.swing.JTextField tX;
private javax.swing.JTextField tY;
private javax.swing.JTree tree;
private javax.swing.JRadioButton utf8;
// End of variables declaration//GEN-END:variables
private boolean isNew = true;
private String protocols[] = { "telnet", "ssh", "ssl", "com" };
private String ports[] = { "23", "22", "443", "0" };
private XML xml = new XML();
private XML.XMLTag selectedTag = null;
private SiteDetails retValue[] = null;
private XML.XMLTag sitesTag = null;
public static SiteDetails[] showSiteMgr(Frame parent) {
SiteMgr mgr = new SiteMgr(parent, true);
mgr.loadAll();
mgr.setVisible(true); //modal = true, therefore this func does not return till dialog is closed
mgr.dispose();
return mgr.retValue;
}
private void show(XML.XMLTag tag) {
tree.makeVisible(new TreePath(tag.getPath())); //ensure everything is visible
// if (tag.isLeaf) return;
for(int a=0;a<tag.getChildCount();a++) show(tag.getChildAt(a));
}
private void loadSite(XML.XMLTag tag, Settings.Site site) {
XML.XMLTag child = xml.addTag(tag, site.name, "", "");
child.isLeaf = true;
show(child);
xml.addTag(child, "host", "", site.host);
xml.addTag(child, "protocol", "", site.protocol);
xml.addTag(child, "port", "", site.port);
xml.addTag(child, "username", "", site.username);
xml.addTag(child, "password", "", decodePassword(site.password));
xml.addTag(child, "sshkey", "", site.sshkey);
xml.addTag(child, "cols", "", "" + site.sx);
xml.addTag(child, "rows", "", "" + site.sy);
xml.addTag(child, "x11", "", site.x11 ? "true" : "false");
xml.addTag(child, "autosize", "", site.autoSize ? "true" : "false");
xml.addTag(child, "localecho", "", site.localEcho ? "true" : "false");
xml.addTag(child, "utf8", "", site.utf8 ? "true" : "false");
}
private void loadFolder(XML.XMLTag tag, Settings.Folder folder) {
show(tag);
tag.setName(folder.name);
for(int a=0;a<folder.site.length;a++) {
loadSite(tag, folder.site[a]);
}
for(int a=0;a<folder.folder.length;a++) {
XML.XMLTag child = xml.addTag(tag, folder.folder[a].name, "", "");
loadFolder(child, folder.folder[a]);
}
}
private void loadAll() {
sitesTag = xml.root;
loadFolder(xml.root, Settings.settings.sites);
}
private void saveSite(XML.XMLTag tag, Settings.Site site) {
site.name = tag.getName();
for(int b=0;b<tag.getChildCount();b++) {
XML.XMLTag child = tag.getChildAt(b);
if (child.name.equals("host")) site.host = child.content;
if (child.name.equals("protocol")) site.protocol = child.content;
if (child.name.equals("port")) site.port = child.content;
if (child.name.equals("username")) site.username = child.content;
if (child.name.equals("password")) site.password = encodePassword(child.content);
if (child.name.equals("sshkey")) site.sshkey = child.content;
if (child.name.equals("cols")) site.sx = JF.atoi(child.content);
if (child.name.equals("rows")) site.sy = JF.atoi(child.content);
if (child.name.equals("autosize")) site.autoSize = child.content.equals("true");
if (child.name.equals("x11")) site.x11 = child.content.equals("true");
if (child.name.equals("localecho")) site.localEcho = child.content.equals("true");
if (child.name.equals("utf8")) site.utf8 = child.content.equals("true");
}
}
private void saveFolder(XML.XMLTag tag, Settings.Folder folder) {
folder.name = tag.getName();
for(int a=0;a<tag.getChildCount();a++) {
XML.XMLTag child = tag.getChildAt(a);
if (child.isLeaf) {
folder.site = Arrays.copyOf(folder.site, folder.site.length+1);
folder.site[folder.site.length-1] = new Settings.Site();
saveSite(child, folder.site[folder.site.length-1]);
} else {
folder.folder = Arrays.copyOf(folder.folder, folder.folder.length+1);
folder.folder[folder.folder.length-1] = new Settings.Folder();
saveFolder(child, folder.folder[folder.folder.length-1]);
}
}
}
private void saveAll() {
Settings.settings.sites = new Settings.Folder();
saveFolder(xml.root, Settings.settings.sites);
Settings.saveSettings();
}
private boolean validField(String str) {
if (str.indexOf('\"') != -1) return false;
if (str.indexOf('\'') != -1) return false;
return true;
}
private boolean validFieldNumber(String str) {
if (!validField(str)) return false;
for(int a=0;a<str.length();a++) if ((str.charAt(a) < '0') || (str.charAt(a) > '9')) return false;
return true;
}
private boolean validFields() {
if (!validField(tName.getText())) return false;
if (tName.getText().length() == 0) return false;
if (!validField(tHost.getText())) return false;
if (tHost.getText().length() == 0) return false;
if (!validFieldNumber(tPort.getText())) return false;
if (tPort.getText().length() == 0) return false;
if (!validField(tUsername.getText())) return false;
if (!validField(new String(tPassword.getPassword()))) return false;
return true;
}
private String encodePassword(String in) {
char ch[] = in.toCharArray();
char xor[] = "jfterm".toCharArray();
char out[] = new char[ch.length * 2];
int xorpos = 0;
for(int a=0;a<ch.length;a++) {
ch[a] ^= xor[xorpos++];
if (xorpos == xor.length) xorpos = 0;
out[a * 2 + 0] = (char)((ch[a] & 0x0f) + 'a');
out[a * 2 + 1] = (char)(((ch[a] & 0xf0) >> 4) + 'b');
}
return new String(out);
}
private String decodePassword(String in) {
char ch[] = in.toCharArray();
if (ch.length % 2 == 1) return "";
char xor[] = "jfterm".toCharArray();
char out[] = new char[ch.length / 2];
int xorpos = 0;
for(int a=0;a<out.length;a++) {
if ((ch[a * 2 + 0] < 'a') || (ch[a * 2 + 0] > 'p')) return "";
if ((ch[a * 2 + 1] < 'b') || (ch[a * 2 + 1] > 'q')) return "";
out[a] = (char)((ch[a * 2 + 0] - 'a') + ((ch[a * 2 + 1] - 'b') << 4));
out[a] ^= xor[xorpos++];
if (xorpos == xor.length) xorpos = 0;
}
return new String(out);
}
private XML.XMLTag getSelectedTag() {
TreePath path = tree.getSelectionPath();
if (path == null) return null;
return xml.getTag(path);
}
private void clearFields() {
tName.setText("");
tHost.setText("");
cbProtocol.setSelectedIndex(0);
tPort.setText("23");
tUsername.setText("");
tUsername.setEditable(false);
tPassword.setText("");
tPassword.setEditable(false);
tSSHKey.setText("");
tSSHKey.setEditable(false);
bDelete.setEnabled(false);
isNew = true;
bDelete.setEnabled(false);
cbX.setSelected(true);
cbX.setEnabled(true);
tX.setEditable(false);
tX.setText("");
cbY.setSelected(true);
cbY.setEnabled(true);
tY.setEditable(false);
tY.setText("");
cbAutoSize.setSelected(false);
cbX11.setSelected(false);
cbLocalEcho.setSelected(false);
utf8.setSelected(true);
selectedTag = null;
}
public String getRows() {
if (cbY.isSelected()) return "0";
return tY.getText();
}
public String getCols() {
if (cbX.isSelected()) return "0";
return tX.getText();
}
public int getRows(String str) {
int ret = JF.atoi(str);
if ((ret <= EditSettings.MIN) || (ret >= EditSettings.MAX)) ret = Settings.settings.rows;
return ret;
}
public int getCols(String str) {
int ret = JF.atoi(str);
if ((ret <= EditSettings.MIN) || (ret >= EditSettings.MAX)) ret = Settings.settings.cols;
return ret;
}
public void setRows(int n) {
if ((n >= EditSettings.MIN) && (n <= EditSettings.MAX)) {
cbY.setSelected(false);
tY.setEditable(true);
tY.setText(Integer.toString(n));
} else {
cbY.setSelected(true);
tY.setEditable(false);
tY.setText("");
}
}
public void setCols(int n) {
if ((n >= EditSettings.MIN) && (n <= EditSettings.MAX)) {
cbX.setSelected(false);
tX.setEditable(true);
tX.setText(Integer.toString(n));
} else {
cbX.setSelected(true);
tX.setEditable(false);
tX.setText("");
}
}
private void loadSite() {
XML.XMLTag tag = getSelectedTag(), child;
if (tag == null) return;
clearFields();
selectedTag = tag;
if (tag.name.equalsIgnoreCase("sites")) return;
if (tag.isLeaf) {
bDelete.setEnabled(true);
} else {
//must be folder
if (selectedTag.getChildCount() == 0) bDelete.setEnabled(true);
return;
}
isNew = false;
/* for(Iterator i = tag.args.iterator(); i.hasNext();) {
XML.XMLAttr attr = (XML.XMLAttr)i.next();
if (attr.name.equalsIgnoreCase("name")) tName.setText(attr.value);
}
*/
tName.setText(tag.getName());
for(int a=0;a<tag.getChildCount();a++) {
child = tag.getChildAt(a);
if (child.name.equalsIgnoreCase("host")) tHost.setText(child.content);
if (child.name.equalsIgnoreCase("protocol")) {
if (child.content.equalsIgnoreCase("telnet")) cbProtocol.setSelectedIndex(0);
if (child.content.equalsIgnoreCase("ssh")) cbProtocol.setSelectedIndex(1);
if (child.content.equalsIgnoreCase("ssl")) cbProtocol.setSelectedIndex(2);
if (child.content.equalsIgnoreCase("com")) cbProtocol.setSelectedIndex(3);
}
if (child.name.equalsIgnoreCase("port")) tPort.setText(child.content);
if (child.name.equalsIgnoreCase("username")) tUsername.setText(child.content);
if (child.name.equalsIgnoreCase("password")) tPassword.setText(decodePassword(child.content));
if (child.name.equalsIgnoreCase("sshkey")) tSSHKey.setText(child.content);
if (child.name.equalsIgnoreCase("rows")) setRows(JF.atoi(child.content));
if (child.name.equalsIgnoreCase("cols")) setCols(JF.atoi(child.content));
if (child.name.equalsIgnoreCase("x11")) cbX11.setSelected(child.content.equals("true"));
if (child.name.equalsIgnoreCase("autosize")) cbAutoSize.setSelected(child.content.equals("true"));
if (child.name.equalsIgnoreCase("localecho")) cbLocalEcho.setSelected(child.content.equals("true"));
if (child.name.equalsIgnoreCase("utf8")) {
if (child.content.equals("true")) utf8.setSelected(true); else ascii.setSelected(true);
}
}
}
private void setPosition() {
Dimension d = getSize();
Rectangle s = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
if ((d.width > s.width) || (d.height > s.height)) {
if (d.width > s.width) d.width = s.width;
if (d.height > s.height) d.height = s.height;
setSize(d);
}
setLocation(s.width/2 - d.width/2, s.height/2 - d.height/2);
}
public void XMLTagAdded(XML.XMLTag tag) {}
public void XMLTagRenamed(XML.XMLTag tag) {
loadSite();
}
}