/* * 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(); } }