diff options
author | sumedh <sumedh@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-01-31 01:11:13 +0000 |
---|---|---|
committer | sumedh <sumedh@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-01-31 01:11:13 +0000 |
commit | cc9493900799d4488ba598531d5717a46b1c00e6 (patch) | |
tree | 94e987a44b34759751863bddb6a2dbeca0b215fb /java/apps/NexusII/src/NexusClientApplet.java | |
parent | 5d3dc999bd439d7c6c76c35ffcdc02767783623d (diff) | |
download | ATCD-cc9493900799d4488ba598531d5717a46b1c00e6.tar.gz |
Added the Nexus II source code files.
Diffstat (limited to 'java/apps/NexusII/src/NexusClientApplet.java')
-rw-r--r-- | java/apps/NexusII/src/NexusClientApplet.java | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/java/apps/NexusII/src/NexusClientApplet.java b/java/apps/NexusII/src/NexusClientApplet.java new file mode 100644 index 00000000000..58b26930718 --- /dev/null +++ b/java/apps/NexusII/src/NexusClientApplet.java @@ -0,0 +1,494 @@ +/* + $RCSfile$ + $Author$ + + Last Update: $Date$ + $Revision$ + + REVISION HISTORY: + $Log$ + Revision 1.1 1997/01/31 01:10:59 sumedh + Added the Nexus II source code files. + +# Revision 1.3 1996/12/06 07:25:29 rajeev +# Got SetRoomName to work -- needed for LROOMS +# +# Revision 1.2 1996/12/06 04:48:21 rajeev +# added handling for l_users and L_room packets from server +# +# Revision 1.1 1996/12/06 03:37:22 rajeev +# Initial revision +# + + This is the client applet + Part of Nexus-II project !! + Copyright : Aravind Gopalan, Rajeev Bector, Sumedh Mungee +*/ + +// package NexusII; + +// I hate packages + +import java.applet.Applet; +import java.awt.* ; +import java.io.*; +import java.net.*; +import java.util.*; + +//import NexusII.networking.* ; +//import NexusII.client.* ; +//import NexusII.util.* ; + +// get the awtCommand package now +import awtCommand.* ; + +// The applet runs the root thread -- easy access to graphics now ... + +public class NexusClientApplet extends CApplet implements consts,Runnable { + + // Who am I -- will be modified if the /nick command is given + public static String myName = new String("anonymous"); + + /* All Event Handlers */ + + // To check if applet is connected + boolean connected = false; + + // The connector handler + connectionHandler nexusConnector ; + + // join handler + joinHandler nexusJoiner ; + + // command handler + commandParser nexusParser ; + + commandHandler commandLineHandler ; + // Streams for writing and reading from Socket + DataOutputStream outStream; + DataInputStream inStream; + + // Thread which does everything for the applet + Thread mainThread ; + + // this is just a visit + // host where I live actually ;-) + String host; + + // Which server to connect to + Integer serverPort ; + + // Where are the queues for reading and writing + // reader and writers will access these and also the interpretor and dep. + + MT_Bounded_Queue read_q ; + MT_Bounded_Queue write_q ; + MT_Bounded_Queue root_q ; + // Where Aravind writes his commands + MT_Bounded_Queue command_q ; + + + + + // *********************************************************** + // Graphics objects + // *********************************************************** + + // Total applet size + int minWidth_ = 500; + int minHeight_ = 450; + + // State variables needed to be maintained + boolean connected_ = false; + int numRooms_ = 0; + + // Buttons + private CButton bConn; + private CButton bJoin; + private CButton bLeave; + private CButton bRooms; + private CButton bUsers; + + private CTextField tfCommandLine = new CTextField(80); + private CTextField tfRoomName = new CTextField(16); + private List lRooms = new List(10,false); + private Label roomLabel = new Label("Rooms:"); + private List lUsers = new List(10,false); + private Label userLabel = new Label("Users:"); + +// private RoomSpace roomspace = new RoomSpace(); + private Panel roomspace = new Panel(); + + public Dimension preferredSize() { + return minimumSize(); + } + + public Dimension minimumSize() { + return new Dimension(minWidth_, minHeight_); + } + + // ----------------------------------------------------------------- + // Basically draws up all the components (not sub-components) of the + // Applet window ... + // Pretty much straightforward barring quirks of AWT -- ArGo + void SetUpButtons(GridBagLayout gbl, GridBagConstraints gbc) { + // The Connect Button + gbc.weightx = 1.0; + gbc.weighty = 0.5; + gbc.gridx = 2; + gbc.gridy = 1; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.anchor = GridBagConstraints.CENTER; + gbc.ipady = 5; + bConn = new CButton("Connect"); + bConn.setActionCommand(nexusConnector); + gbl.setConstraints(bConn, gbc); + add(bConn); + gbc.ipady = 0; + + // The remaining buttons + gbc.fill = GridBagConstraints.BOTH; + gbc.anchor = GridBagConstraints.CENTER; + gbc.weightx = 1.0; + gbc.weighty = 0.5; + gbc.insets = new Insets(2,2,2,2); + gbc.ipadx = 2; + gbc.ipady = 2; + + // Join Button + gbc.gridx = 0; + gbc.gridy = 3; + bJoin = new CButton("Join"); + gbl.setConstraints(bJoin,gbc); + add(bJoin); + + // Leave Button + gbc.gridx = 1; + gbc.gridy = 3; + bLeave = new CButton("Leave"); + gbl.setConstraints(bLeave,gbc); + add(bLeave); + + // List Rooms Button + gbc.gridx = 0; + gbc.gridy = 4; + bRooms = new CButton("List Rooms"); + gbl.setConstraints(bRooms,gbc); + add(bRooms); + + // List Users Button + gbc.gridx = 1; + gbc.gridy = 4; + bUsers = new CButton("List Users"); + gbl.setConstraints(bUsers,gbc); + add(bUsers); + + } // of SetUpButtons + + void SetUpGraphics() { + + resize(preferredSize()); + + GridBagLayout gbl = new GridBagLayout(); + GridBagConstraints gbc = new GridBagConstraints(); + setFont(new Font("Helvetica", Font.PLAIN, 14)); + setLayout (gbl); + + gbc.weightx = 1.0; + gbc.weighty = 1.0; + + // For the list of rooms + // First the Room list label + gbc.weightx = 0; + gbc.weighty = 0; + gbc.gridx = 0; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.SOUTHWEST; + gbc.fill = GridBagConstraints.NONE; + gbl.setConstraints(roomLabel,gbc); + add(roomLabel); + // Now the Room combo -- list + text field + // the actual list + gbc.weightx = 1.0; + gbc.weighty = 1.0; + gbc.gridy = 1; + gbc.fill = GridBagConstraints.VERTICAL; + gbc.anchor = GridBagConstraints.NORTH; + // gbc.insets = new Insets(0,2,0,2); + gbl.setConstraints(lRooms,gbc); + add(lRooms); + if (DEBUG) + lRooms.addItem("Room_1"); + // The text field + gbc.weightx = 0; + gbc.weighty = 0; + gbc.gridy = 2; + gbc.anchor = GridBagConstraints.NORTH; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.insets = new Insets(0,0,0,0); + gbl.setConstraints(tfRoomName,gbc); + add(tfRoomName); + + // Similarly for the list of users + // label + gbc.weightx = 0; + gbc.weighty = 0; + gbc.gridx = 1; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.SOUTHWEST; + gbc.fill = GridBagConstraints.NONE; + gbc.insets = new Insets(0,0,0,0); + gbl.setConstraints(userLabel,gbc); + add(userLabel); + // The list + gbc.weightx = 1; + gbc.weighty = 1; + gbc.gridy = 1; + gbc.fill = GridBagConstraints.VERTICAL; + gbc.anchor = GridBagConstraints.NORTH; + gbl.setConstraints(lUsers,gbc); + add(lUsers); + if (DEBUG) + lUsers.addItem("USer #1"); + + // Setup all the buttons + SetUpButtons(gbl,gbc) ; + + // The command line + gbc.gridx = 0; + gbc.gridy = 5; + gbc.ipadx = 0; + gbc.ipady = 0; + gbc.insets = new Insets(0,0,0,0); + gbc.gridwidth = GridBagConstraints.REMAINDER; + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.CENTER; + gbl.setConstraints(tfCommandLine,gbc); + add(tfCommandLine); + + + // We are done -- startup with all buttons except connect disabled + OnDisconnect(); + return; + } + + public void init() { + //Get the address of the host the applet was downloaded from + host = getCodeBase().getHost(); + // Get servers portnumber from the home page + serverPort = Integer.valueOf(getParameter("serverport")); + + + // Create the nexusconnector object whose execute will be called later + // on pressing the connect button + nexusConnector = new connectionHandler(host,serverPort,this); + + if(DEBUG){ + System.out.println("Server Portnumber is " + serverPort + "\n"); + } + + // initialize the graphics + SetUpGraphics(); + } // of method init + + public synchronized void start() { + // Aravind will create the "connect" button here and register an instance + + if (DEBUG) { + System.out.println("In start() method."); + } + } + + + // Here is the stop for the applet + // Called when the user goes away from the page + public synchronized void stop() { + if (!DEBUG) { + showStatus("Stop has been called "); + } + + if (connected) { + nexusConnector.execute(null,null,null); + } + } + + + + + // ----------------------------------------------------------------------- + // Public Access functions + public Hashtable Mapper() { + return nexusJoiner.Mapper(); + } + + public String GetRoomName() { + StringTokenizer t = new StringTokenizer(tfRoomName.getText()); + if(t.hasMoreTokens()) { + return t.nextToken(); + } + else + return "" ; + } + + public void AddRoomName(String name) { + int count = lRooms.countItems(); + for (int i=0;i<count;i++) + if (lRooms.getItem(i).equalsIgnoreCase(name)) + return; + lRooms.addItem(name); + } + + public void SetRoomName(String name) { + int count = lRooms.countItems(); + for(int i=0;i<count;i++) { + if(lRooms.getItem(i).equalsIgnoreCase(name)) { + // Have to simulate a select event by doing the selection ourselves + lRooms.select(i); + tfRoomName.setText(lRooms.getSelectedItem()); + tfRoomName.selectAll(); + break ; + } + } + } + + public void sendNickToServer(String name) { + nexusJoiner.sendTestPacket("ROOT","NICK",name,nexusConnector.writer_q()); + } + + + // will run the mainthread + public void run() { + if(DEBUG) { + System.out.println("Root thread is starting -- "); + } + + root_q = new MT_Bounded_Queue(QUEUE_SIZE); + nexusJoiner.Mapper().put("ROOT",root_q); + // continously wait for something to read and then update the graphics + // objects ---- + if(DEBUG) { + nexusJoiner.sendTestPacket("ROOT","LROOMS","a b c d",root_q); + } + + for(;;) { + dataPacket rootPacket = (dataPacket)root_q.dq(); + if(DEBUG) { + System.out.println("Root got a packet --- "); + } + if(rootPacket.contentType().equalsIgnoreCase("LROOMS")) { + update_lrooms(rootPacket.content()); + } + else if(rootPacket.contentType().equalsIgnoreCase("LUSERS")) { + update_lusers(rootPacket.destination(),rootPacket.content()); + } + } + + } + + + + // This method will update the graphics of lrooms + void update_lrooms(String data) { + lRooms.disable(); + tfRoomName.disable(); + lRooms.clear(); + + StringTokenizer t = new StringTokenizer(data); + while(t.hasMoreTokens()) { + lRooms.addItem(t.nextToken()); + } + if (lRooms.countItems() != 0) { + lRooms.select(0); + tfRoomName.setText(lRooms.getItem(0)); + } + tfRoomName.enable(); + lRooms.enable(); + repaint(); + } + + void update_lusers(String name,String data) { + lUsers.disable(); + userLabel.setText("Users: "+ name); + lUsers.clear(); + StringTokenizer t = new StringTokenizer(data); + while(t.hasMoreTokens()) { + lUsers.addItem(t.nextToken()); + } + lUsers.enable(); + repaint(); + } + + // ----------------------------------------------------------------------- + // User Input handling -- ArGo + + // Function to handle Connect button being pressed + public void OnConnect(){ + // Create the event handlers -- + nexusJoiner = new joinHandler(nexusConnector.writer_q(),this); + nexusParser = new commandParser(nexusConnector.writer_q(),this); + commandLineHandler = new commandHandler(this); + // start the main thread in the applets context + mainThread = new Thread(this); + mainThread.start(); + // test + // Graphics here -- + bJoin.enable(); + bJoin.setActionCommand(nexusJoiner); + bLeave.enable(); + bLeave.setActionCommand(nexusJoiner); + bRooms.enable(); + bRooms.setActionCommand(nexusParser); + bUsers.enable(); + bUsers.setActionCommand(nexusParser); + tfCommandLine.enable(); + tfCommandLine.setActionCommand(commandLineHandler); + tfRoomName.enable(); + lRooms.enable(); + lUsers.enable(); + // Change the name to "Disconnect" and ensure that update happens + bConn.setLabel("Disconnect"); + validate(); // Don't know if this is necessary + connected = true; // Applet is now connected + } + + // Function to handle Connect button being pressed + public void OnDisconnect(){ + bJoin.disable(); + bLeave.disable(); + bRooms.disable(); + bUsers.disable(); + tfCommandLine.disable(); + tfRoomName.disable(); + lRooms.disable(); + lUsers.disable(); + // Change the name back to "Connect" and ensure update happens + bConn.setLabel("Connect"); + validate(); + // Stop the ROOT room thread + if (connected) { + mainThread.stop(); + connected = false; // Applet is disconnected + } + } + + // Basically take care of the inputs + public boolean handleEvent(Event event) { + if (event.target == lRooms) { + if (event.id == Event.LIST_SELECT) { // selected the item + tfRoomName.setText(lRooms.getSelectedItem()); + tfRoomName.selectAll(); + if (DEBUG) + System.out.println("Actually handling the select event"); + return true; + } + } + return super.handleEvent(event); + } + + public void update(Graphics g) { + paint(g); + } +} // of class NexusClientApplet + + + |