Author: bdonlan
Date: 2005-01-05 22:27:23 -0500 (Wed, 05 Jan 2005)
New Revision: 526

Added:
   trunk/misc/javer/src/javer/JaverUI.form
   trunk/misc/javer/src/javer/JaverUI.java
   trunk/misc/javer/src/javer/JaverUIPanel.form
   trunk/misc/javer/src/javer/JaverUIPanel.java
Removed:
   trunk/misc/javer/build/
   trunk/misc/javer/dist/
   trunk/misc/javer/src/javer/Main.java
Modified:
   /
   trunk/misc/javer/nbproject/project.properties
   trunk/misc/javer/src/javer/HaverClient.java
Log:
Simple UI; basic messaging support



Property changes on: 
___________________________________________________________________
Name: svk:merge
   - 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local:11190
   + 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local:11195

Modified: trunk/misc/javer/nbproject/project.properties
===================================================================
--- trunk/misc/javer/nbproject/project.properties       2005-01-06 02:28:20 UTC 
(rev 525)
+++ trunk/misc/javer/nbproject/project.properties       2005-01-06 03:27:23 UTC 
(rev 526)
@@ -37,7 +37,7 @@
 javadoc.use=true
 javadoc.version=false
 javadoc.windowtitle=
-main.class=javer.Main
+main.class=javer.JaverUI
 manifest.file=manifest.mf
 platform.active=default_platform
 run.classpath=\

Modified: trunk/misc/javer/src/javer/HaverClient.java
===================================================================
--- trunk/misc/javer/src/javer/HaverClient.java 2005-01-06 02:28:20 UTC (rev 
525)
+++ trunk/misc/javer/src/javer/HaverClient.java 2005-01-06 03:27:23 UTC (rev 
526)
@@ -5,12 +5,14 @@
  */
 
 package javer;
+import java.util.*;
+import java.io.*;
 
 /**
  *
  * @author  bdonlan
  */
-public class HaverClient implements Runnable {
+public class HaverClient extends Thread {
     
     private java.lang.String versionString = "Javer/0.1";
     private java.net.Socket sock = null;
@@ -18,24 +20,29 @@
     private java.io.BufferedReader reader = null;
     private java.util.Map wants = null;
     private java.util.Map serverevents = null;
+    private java.util.Map notifies = null;
     private String uid = null;
+    private Integer lock = new Integer(0);
     
     private void send(String s) throws java.io.IOException {
-        if (sock == null) {
-            throw new IllegalStateException("Not connected to server");
+        synchronized (lock) {
+            if (sock == null) {
+                throw new IllegalStateException("Not connected to server");
+            }
+            writer.print(s + "\r\n");
+            writer.flush();
+            eventDebugMessage(">>> " + s);
         }
-        writer.print(s + "\r\n");
-        writer.flush();
-        System.err.println(">>> " + s);
     }
     
     /** Creates a new instance of HaverClient */
     public HaverClient() {
         initWants();
         initServerEvents();
+        notifies = new HashMap();
     }
 
-    public void connect(String uid, java.net.Socket socket) throws 
java.io.IOException, HaverException {
+    public void connect(String uid, java.net.Socket socket) throws 
java.io.IOException {
         this.sock = socket;
         this.uid = uid;
         writer = new java.io.PrintWriter(
@@ -48,13 +55,14 @@
                 sock.getInputStream()
             ));
         send("HAVER\t" + versionString);
+        start();
     }
     
-    public void connect(String uid, String hostname) throws 
java.io.IOException, HaverException {
+    public void connect(String uid, String hostname) throws 
java.io.IOException {
         connect(uid, hostname, 7070);
     }
     
-    public void connect(String uid, String hostname, int port) throws 
java.io.IOException, HaverException {
+    public void connect(String uid, String hostname, int port) throws 
java.io.IOException {
         java.net.Socket sock = new java.net.Socket(hostname, port);
         connect(uid, sock);
     }
@@ -63,34 +71,37 @@
         while (sock.isConnected()) {
             try {
                 String s = reader.readLine();
-                System.err.println("<<< " + s);
-                dispatchCommand(s);
+                eventDebugMessage("<<< " + s);
+                synchronized (lock) {
+                    dispatchCommand(s);
+                }
             } catch (java.io.IOException e) {
                 return; /* XXX */
             }
         }
     }
 
-    public abstract class ServerHandler {
+    private abstract class ServerHandler {
         public ServerHandler() {}
         public abstract void trigger(String[] line) throws java.io.IOException;
     }
 
-    public abstract class WantHandler {
+    private abstract class WantHandler {
         public WantHandler() {}
         public abstract void trigger(String[] args) throws java.io.IOException;
     }
 
-    public void initWants() {
+    private void initWants() {
         wants = new java.util.HashMap();
         wants.put("IDENT", new WantHandler() {
             public void trigger(String[] args) throws java.io.IOException {
+                eventIdenting();
                 send("IDENT\t" + uid);
             }
         });
     }
     
-    public void initServerEvents() {
+    private void initServerEvents() {
         serverevents = new java.util.HashMap();
         serverevents.put("WANT", new ServerHandler() {
             public void trigger(String[] args) throws java.io.IOException {
@@ -102,13 +113,103 @@
                 h.trigger(args);
             }
         });
+        serverevents.put("ACCEPT", new ServerHandler() {
+            public void trigger(String[] args) {
+                eventIdentAccepted();
+            }
+        });
+        serverevents.put("MSG", new ServerHandler() {
+            public void trigger(String[] args) {
+                String[] msgArgs = subStringArray(args, 4, args.length - 1);
+                eventMessage(args[1], args[2], args[3], msgArgs);
+            }
+        });
+        serverevents.put("JOIN", new ServerHandler() {
+            public void trigger(String[] args) {
+                if (args.length == 2) {
+                    eventChannelJoined(args[1]);
+                } else if (args.length == 3) {
+                    eventChannelJoin(args[1], args[2]);
+                }
+            }
+        });
     }
 
-    public void dispatchCommand(String s) throws java.io.IOException {
+    private void dispatchCommand(String s) throws java.io.IOException {
         String[] parts = s.split("\t");
         ServerHandler h = (ServerHandler) serverevents.get(parts[0]);
         if (h != null) {
             h.trigger(parts);
         }
     }
+    
+    public void join(String channel) throws java.io.IOException {
+        send("JOIN\t" + channel);
+    }
+
+    public void eventIdentAccepted() {
+        /* STUB */
+    }
+
+    public void eventDebugMessage(String s) {
+        /* STUB */
+    }
+
+    public void eventChannelJoined(String where) {
+        /* STUB */
+    }
+
+    public void eventChannelJoin(String where, String who) {
+        /* STUB */
+    }
+
+    public void eventMessage(String where, String who, String type, String[] 
args) {
+        if (type.equals("\"")) {
+            eventNormalMessage(where, who, args[0]);
+        } else if (type.equals(":")) {
+            eventAction(where, who, args[0]);
+        }
+    }
+    
+    public void eventNormalMessage(String where, String who, String arg) {
+        /* STUB */
+    }
+    public void eventAction(String where, String who, String arg) {
+        /* STUB */
+    }
+
+    public final String[] subStringArray(String[] array, int start, int end) {
+        if (start > end) {
+            return new String[0];
+        }
+        String[] newarray = new String[end - start + 1];
+        for (int i = 0; i <= end - start; i++) {
+            newarray[i] = array[start + i];
+        }
+        return newarray;
+    }
+
+    public void sendMessage(String where, String type, String message) throws 
IOException {
+        send("MSG\t" + where + "\t" + type + "\t" + message);
+    }
+    
+    public void sendMessage(String where, String type, String[] message) 
throws IOException {
+        String s = "MSG\t" + where + "\t" + type + "\t";
+        for (int i = 0; i < message.length; i++) {
+            s = s + message[i];
+        }
+        send(s);
+    }
+    
+    public void sendNormalMessage(String where, String message) throws 
IOException {
+        sendMessage(where, "\"", message);
+    }
+    
+    public void sendAction(String where, String message) throws IOException {
+        sendMessage(where, ":", message);
+    }
+
+    public void eventIdenting() {
+        /* STUB */
+    }
 }

Added: trunk/misc/javer/src/javer/JaverUI.form
===================================================================
--- trunk/misc/javer/src/javer/JaverUI.form     2005-01-06 02:28:20 UTC (rev 
525)
+++ trunk/misc/javer/src/javer/JaverUI.form     2005-01-06 03:27:23 UTC (rev 
526)
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.FrameFormInfo">
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <Events>
+    <EventHandler event="windowClosing" 
listener="java.awt.event.WindowListener" 
parameters="java.awt.event.WindowEvent" handler="exitForm"/>
+  </Events>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
+</Form>

Added: trunk/misc/javer/src/javer/JaverUI.java
===================================================================
--- trunk/misc/javer/src/javer/JaverUI.java     2005-01-06 02:28:20 UTC (rev 
525)
+++ trunk/misc/javer/src/javer/JaverUI.java     2005-01-06 03:27:23 UTC (rev 
526)
@@ -0,0 +1,59 @@
+/*
+ * JaverUI.java
+ *
+ * Created on January 5, 2005, 9:27 PM
+ */
+
+package javer;
+
+/**
+ *
+ * @author  bdonlan
+ */
+public class JaverUI extends java.awt.Frame {
+    
+    /** Creates new form JaverUI */
+    public JaverUI() {
+        add(new JaverUIPanel());
+        pack();
+    }
+    
+    /** 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.
+     */
+    private void initComponents() {//GEN-BEGIN:initComponents
+
+        setLayout(new javax.swing.BoxLayout(this, 
javax.swing.BoxLayout.X_AXIS));
+
+        addWindowListener(new java.awt.event.WindowAdapter() {
+            public void windowClosing(java.awt.event.WindowEvent evt) {
+                exitForm(evt);
+            }
+        });
+
+        pack();
+    }//GEN-END:initComponents
+    
+    /** Exit the Application */
+    private void exitForm(java.awt.event.WindowEvent evt) 
{//GEN-FIRST:event_exitForm
+        System.exit(0);
+    }//GEN-LAST:event_exitForm
+    
+    /**
+     * @param args the command line arguments
+     */
+    public static void main(String args[]) {
+        java.awt.EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                new JaverUI().setVisible(true);
+            }
+        });
+    }
+    
+    
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    // End of variables declaration//GEN-END:variables
+    
+}


Property changes on: trunk/misc/javer/src/javer/JaverUI.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/misc/javer/src/javer/JaverUIPanel.form
===================================================================
--- trunk/misc/javer/src/javer/JaverUIPanel.form        2005-01-06 02:28:20 UTC 
(rev 525)
+++ trunk/misc/javer/src/javer/JaverUIPanel.form        2005-01-06 03:27:23 UTC 
(rev 526)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.PanelFormInfo">
+
+  <Layout 
class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+  <SubComponents>
+    <Component class="javax.swing.JTextField" name="input">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="jTextField1"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" 
listener="java.awt.event.ActionListener" 
parameters="java.awt.event.ActionEvent" handler="inputActionPerformed"/>
+        <EventHandler event="keyTyped" listener="java.awt.event.KeyListener" 
parameters="java.awt.event.KeyEvent" handler="inputKeyTyped"/>
+      </Events>
+      <Constraints>
+        <Constraint 
layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" 
value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+          <BorderConstraints direction="South"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+    <Container class="javax.swing.JSplitPane" name="jSplitPane1">
+      <Constraints>
+        <Constraint 
layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" 
value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+          <BorderConstraints direction="Center"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout 
class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
+      <SubComponents>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <Constraints>
+            <Constraint 
layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"
 
value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+              <JSplitPaneConstraints position="left"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout 
class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JTextArea" name="chatWindow">
+            </Component>
+          </SubComponents>
+        </Container>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane2">
+          <Constraints>
+            <Constraint 
layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"
 
value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+              <JSplitPaneConstraints position="right"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout 
class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JList" name="userList">
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>

Added: trunk/misc/javer/src/javer/JaverUIPanel.java
===================================================================
--- trunk/misc/javer/src/javer/JaverUIPanel.java        2005-01-06 02:28:20 UTC 
(rev 525)
+++ trunk/misc/javer/src/javer/JaverUIPanel.java        2005-01-06 03:27:23 UTC 
(rev 526)
@@ -0,0 +1,148 @@
+/*
+ * JaverUIPanel.java
+ *
+ * Created on January 5, 2005, 9:31 PM
+ */
+
+package javer;
+import java.io.*;
+
+/**
+ *
+ * @author  bdonlan
+ */
+public class JaverUIPanel extends java.awt.Panel {
+    
+    Client cli;
+    
+    /** Creates new form JaverUIPanel */
+    public JaverUIPanel() {
+        initComponents();
+        jSplitPane1.setDividerLocation(.8);
+        cli = new Client();
+        try {
+            cli.connect("bd_javer", "odin.haverdev.org", 7070);
+        } catch (IOException e) {
+            putLine(e.getStackTrace().toString());
+        }
+    }
+
+    public final class Client extends HaverClient {
+        public void eventDebugMessage(String s) {
+            putLine(s);
+            super.eventDebugMessage(s);
+        }
+
+        public void eventIdentAccepted() {
+            putLine("Ident accepted.");
+            try {
+                cli.join("lobby");
+            } catch (IOException e) {
+                putLine(e.getStackTrace().toString());
+            }
+            super.eventIdentAccepted();
+        }
+
+        public void eventChannelJoined(String where) {
+            putLine("Joined " + where);
+            super.eventChannelJoined(where);
+        }
+
+        public void eventMessage(String where, String who, String type, 
String[] args) {
+            super.eventMessage(where, who, type, args);
+        }
+
+        public void eventNormalMessage(String where, String who, String arg) {
+            putLine(where + ": <" + who + "> " + arg);
+            super.eventNormalMessage(where, who, arg);
+        }
+
+        public void eventAction(String where, String who, String arg) {
+            putLine(where + ": * " + who + " " + arg);
+            super.eventAction(where, who, arg);
+        }
+
+        public void eventChannelJoin(String where, String who) {
+            putLine(where + ": Joined: " + who);
+            super.eventChannelJoin(where, who);
+        }
+
+        public void eventIdenting() {
+            putLine("Identing to server...");
+            super.eventIdenting();
+        }
+
+    }
+
+    public void putLine(String s) {
+        chatWindow.append(s + "\n");
+    }
+
+    
+    /** 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.
+     */
+    private void initComponents() {//GEN-BEGIN:initComponents
+        input = new javax.swing.JTextField();
+        jSplitPane1 = new javax.swing.JSplitPane();
+        jScrollPane1 = new javax.swing.JScrollPane();
+        chatWindow = new javax.swing.JTextArea();
+        jScrollPane2 = new javax.swing.JScrollPane();
+        userList = new javax.swing.JList();
+
+        setLayout(new java.awt.BorderLayout());
+
+        input.setText("jTextField1");
+        input.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                inputActionPerformed(evt);
+            }
+        });
+        input.addKeyListener(new java.awt.event.KeyAdapter() {
+            public void keyTyped(java.awt.event.KeyEvent evt) {
+                inputKeyTyped(evt);
+            }
+        });
+
+        add(input, java.awt.BorderLayout.SOUTH);
+
+        jScrollPane1.setViewportView(chatWindow);
+
+        jSplitPane1.setLeftComponent(jScrollPane1);
+
+        jScrollPane2.setViewportView(userList);
+
+        jSplitPane1.setRightComponent(jScrollPane2);
+
+        add(jSplitPane1, java.awt.BorderLayout.CENTER);
+
+    }//GEN-END:initComponents
+
+    private void inputKeyTyped(java.awt.event.KeyEvent evt) 
{//GEN-FIRST:event_inputKeyTyped
+        // TODO add your handling code here:
+        if (evt.getKeyChar() == '\n') {
+            String line = input.getText();
+            input.setText("");
+            try {
+                cli.sendNormalMessage("lobby", line);
+            } catch (Exception e) { /* XXX */ }
+        }
+    }//GEN-LAST:event_inputKeyTyped
+
+    private void inputActionPerformed(java.awt.event.ActionEvent evt) 
{//GEN-FIRST:event_inputActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_inputActionPerformed
+    
+    
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JTextArea chatWindow;
+    private javax.swing.JTextField input;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JScrollPane jScrollPane2;
+    private javax.swing.JSplitPane jSplitPane1;
+    private javax.swing.JList userList;
+    // End of variables declaration//GEN-END:variables
+    
+}


Property changes on: trunk/misc/javer/src/javer/JaverUIPanel.java
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: trunk/misc/javer/src/javer/Main.java
===================================================================
--- trunk/misc/javer/src/javer/Main.java        2005-01-06 02:28:20 UTC (rev 
525)
+++ trunk/misc/javer/src/javer/Main.java        2005-01-06 03:27:23 UTC (rev 
526)
@@ -1,29 +0,0 @@
-/*
- * Main.java
- *
- * Created on January 5, 2005, 8:13 PM
- */
-
-package javer;
-
-/**
- *
- * @author  bdonlan
- */
-public class Main {
-    
-    /** Creates a new instance of Main */
-    public Main() {
-    }
-    
-    /**
-     * @param args the command line arguments
-     */
-    public static void main(String[] args) throws java.io.IOException, 
javer.HaverException {
-        // TODO code application logic here
-        HaverClient c = new HaverClient();
-        c.connect("bd_javer", "odin.haverdev.org");
-        c.run();
-    }
-    
-}


Reply via email to