summaryrefslogtreecommitdiff
path: root/tutorials/java/src/phpdbg/ui/Main.java
diff options
context:
space:
mode:
Diffstat (limited to 'tutorials/java/src/phpdbg/ui/Main.java')
-rw-r--r--tutorials/java/src/phpdbg/ui/Main.java364
1 files changed, 364 insertions, 0 deletions
diff --git a/tutorials/java/src/phpdbg/ui/Main.java b/tutorials/java/src/phpdbg/ui/Main.java
new file mode 100644
index 0000000000..62942cbcd8
--- /dev/null
+++ b/tutorials/java/src/phpdbg/ui/Main.java
@@ -0,0 +1,364 @@
+package phpdbg.ui;
+
+
+import static java.awt.event.KeyEvent.VK_DOWN;
+import static java.awt.event.KeyEvent.VK_ENTER;
+import static java.awt.event.KeyEvent.VK_UP;
+import java.io.IOException;
+import javax.swing.JOptionPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/**
+ *
+ * @author krakjoe
+ */
+public class Main extends javax.swing.JDialog {
+ /**
+ * Creates user interface
+ * @param parent
+ * @param modal
+ */
+ public Main(java.awt.Frame parent, boolean modal) {
+ super(parent, modal);
+ initComponents();
+ }
+
+ /**
+ * 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.
+ */
+ @SuppressWarnings("unchecked")
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ stdoutPopupMenu = new javax.swing.JPopupMenu();
+ resetStdout = new javax.swing.JMenuItem();
+ mainSplit = new javax.swing.JSplitPane();
+ input = new javax.swing.JTextField();
+ outputScrollPane = new javax.swing.JScrollPane();
+ output = new phpdbg.ui.JTerminalPane();
+ host = new javax.swing.JTextField();
+ stdoutPort = new javax.swing.JTextField();
+ stdinCheckBox = new javax.swing.JCheckBox();
+ stdoutCheckBox = new javax.swing.JCheckBox();
+ openButton = new javax.swing.JButton();
+ stdinPort = new javax.swing.JTextField();
+ hostLabel = new javax.swing.JLabel();
+
+ resetStdout.setText("Clear");
+ resetStdout.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ resetStdoutActionPerformed(evt);
+ }
+ });
+ stdoutPopupMenu.add(resetStdout);
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+ setTitle("phpdbg jui");
+
+ mainSplit.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
+ mainSplit.setToolTipText("");
+
+ input.setToolTipText("");
+ input.setEnabled(false);
+ input.addKeyListener(new java.awt.event.KeyAdapter() {
+ public void keyReleased(java.awt.event.KeyEvent evt) {
+ inputKeyReleased(evt);
+ }
+ });
+ mainSplit.setLeftComponent(input);
+
+ outputScrollPane.setViewportView(output);
+
+ mainSplit.setRightComponent(outputScrollPane);
+
+ host.setText("127.0.0.1");
+ host.setToolTipText("Set the hostname, or IPv4 address of the machine running the phpdbg remote console server");
+
+ stdoutPort.setText("8000");
+ stdoutPort.setToolTipText("");
+
+ stdinCheckBox.setSelected(true);
+ stdinCheckBox.setText("stdin:");
+ stdinCheckBox.setToolTipText("Set the port for stdin, or uncheck to disable stdin");
+
+ stdoutCheckBox.setSelected(true);
+ stdoutCheckBox.setText("stdout:");
+ stdoutCheckBox.setToolTipText("Set the port for stdout, or unset to disable stdout");
+
+ openButton.setActionCommand("open");
+ openButton.setLabel("open");
+ openButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ openButtonActionPerformed(evt);
+ }
+ });
+
+ stdinPort.setText("4000");
+ stdinPort.setToolTipText("");
+
+ hostLabel.setText("Hostname:");
+
+ 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()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(mainSplit)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(hostLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(host, javax.swing.GroupLayout.DEFAULT_SIZE, 359, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(stdinCheckBox)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(stdinPort, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(18, 18, 18)
+ .addComponent(stdoutCheckBox)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(stdoutPort, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(openButton)))
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(mainSplit, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+ .addComponent(host, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(openButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(stdoutPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(stdinCheckBox)
+ .addComponent(stdoutCheckBox)
+ .addComponent(stdinPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(hostLabel)))
+ .addContainerGap())
+ );
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void inputKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_inputKeyReleased
+ switch (evt.getKeyCode()) {
+ case VK_ENTER: {
+ if (in != null) {
+ history.add(input.getText());
+ synchronized(in) {
+ in.notifyAll();
+ }
+ }
+ } break;
+
+ case VK_UP: {
+ String last = history.last();
+ if (last.length() > 0) {
+ input.setText(last);
+ }
+ } break;
+
+ case VK_DOWN: {
+ String next = history.next();
+ if (next.length() > 0) {
+ input.setText(next);
+ }
+ } break;
+ }
+ }//GEN-LAST:event_inputKeyReleased
+
+ private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed
+ try {
+ if (!connected) {
+ Integer ports[] = new Integer[2];
+ String address = getHost();
+
+ if (address != null) {
+ ports[0] = stdinCheckBox.isSelected() ? getStdinPort() : -1;
+ ports[1] = stdoutCheckBox.isSelected() ? getStdoutPort() : -1;
+
+ if (ports[0] != 0 && ports[1] != 0) {
+ if (stdinCheckBox.isSelected()) {
+ if (ports[0] > 0) {
+ in = new DBGThread(
+ address, ports[0], this, true);
+ new Thread(in).start();
+ }
+ }
+
+ if (stdoutCheckBox.isSelected()) {
+ if (ports[1] > 0) {
+ out = new DBGThread(
+ address, ports[1], this, false);
+ new Thread(out).start();
+ }
+ }
+ }
+ }
+ } else {
+ if (in != null) {
+ in.quit();
+ }
+ if (out != null) {
+ out.quit();
+ }
+ }
+ } catch (IOException ex) {
+ messageBox(ex.getMessage());
+ }
+ }//GEN-LAST:event_openButtonActionPerformed
+
+ private void resetStdoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetStdoutActionPerformed
+ // TODO add your handling code here:
+ output.setText(null);
+ }//GEN-LAST:event_resetStdoutActionPerformed
+
+ public Boolean isConnected() {
+ return connected;
+ }
+
+ public void setConnected(Boolean isConnected) {
+ synchronized(this) {
+ if (isConnected) {
+ connected = true;
+ openButton.setText("Disconnect");
+ host.setEnabled(false);
+ stdinPort.setEnabled(false);
+ stdinCheckBox.setEnabled(false);
+ if (stdinCheckBox.isSelected()) {
+ input.setEnabled(true);
+ } else input.setEnabled(false);
+ stdoutPort.setEnabled(false);
+ stdoutCheckBox.setEnabled(false);
+ } else {
+ connected = false;
+ openButton.setText("Connect");
+ host.setEnabled(true);
+ stdinPort.setEnabled(true);
+ input.setEnabled(false);
+ stdinCheckBox.setEnabled(true);
+ stdoutPort.setEnabled(true);
+ stdoutCheckBox.setEnabled(true);
+ }
+ }
+ }
+
+ public JTextField getInputField() { return input; }
+ public JTerminalPane getOutputField() { return output; }
+
+ public String getHost() {
+ String address = host.getText();
+ if (address != null && address.length() > 0) {
+ return address;
+ } else {
+ messageBox("Invalid hostname provided !");
+ }
+
+ return null;
+ }
+
+ public Integer getStdinPort() {
+ try {
+ return Integer.parseInt(stdinPort.getText());
+ } catch (NumberFormatException ex) {
+ messageBox("Invalid stdin port provided !");
+ }
+
+ return 0;
+ }
+
+ public Integer getStdoutPort() {
+ try {
+ return Integer.parseInt(stdoutPort.getText());
+ } catch (NumberFormatException ex) {
+ messageBox("Invalid stdout port provided !");
+ }
+
+ return 0;
+ }
+
+ public synchronized void messageBox(String message) {
+ JOptionPane.showMessageDialog(this, message);
+ }
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ /* Set the Nimbus look and feel */
+ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
+ /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
+ * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
+ */
+ try {
+ for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
+ if ("Nimbus".equals(info.getName())) {
+ javax.swing.UIManager.setLookAndFeel(info.getClassName());
+ break;
+ }
+ }
+ } catch (ClassNotFoundException ex) {
+ java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ } catch (InstantiationException ex) {
+ java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ } catch (IllegalAccessException ex) {
+ java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ } catch (javax.swing.UnsupportedLookAndFeelException ex) {
+ java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ }
+ //</editor-fold>
+
+ /* Create and display the dialog */
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override public void run() {
+ dialog = new Main(new javax.swing.JFrame(), true);
+ dialog.addWindowListener(new java.awt.event.WindowAdapter() {
+ @Override
+ public void windowClosing(java.awt.event.WindowEvent e) {
+ if (in != null)
+ in.quit();
+
+ if (out != null)
+ out.quit();
+
+ System.exit(0);
+ }
+ });
+ dialog.setVisible(true);
+ }
+ });
+ }
+
+ private static DBGThread in;
+ private static DBGThread out;
+ private static Main dialog;
+ private static Boolean connected = false;
+ private static History history = new History();
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JTextField host;
+ private javax.swing.JLabel hostLabel;
+ private javax.swing.JTextField input;
+ private javax.swing.JSplitPane mainSplit;
+ private javax.swing.JButton openButton;
+ private phpdbg.ui.JTerminalPane output;
+ private javax.swing.JScrollPane outputScrollPane;
+ private javax.swing.JMenuItem resetStdout;
+ private javax.swing.JCheckBox stdinCheckBox;
+ private javax.swing.JTextField stdinPort;
+ private javax.swing.JCheckBox stdoutCheckBox;
+ private javax.swing.JPopupMenu stdoutPopupMenu;
+ private javax.swing.JTextField stdoutPort;
+ // End of variables declaration//GEN-END:variables
+}