/
ScryMUD/mud/
ScryMUD/mud/grrmud/Boards/
ScryMUD/mud/grrmud/Help/
ScryMUD/mud/grrmud/Pfiles/
ScryMUD/mud/grrmud/PlayerSacks/
ScryMUD/mud/grrmud/PlayerShops/
ScryMUD/mud/grrmud/help_filter/
ScryMUD/mud/hegemon/
ScryMUD/mud/hegemon/data/
ScryMUD/mud/hegemon/data/help/battle/
ScryMUD/mud/hegemon/data/help/client/
ScryMUD/mud/hegemon/data/help/communications/
ScryMUD/mud/hegemon/data/help/skills/
ScryMUD/mud/hegemon/data/help/spells/
ScryMUD/mud/include/
ScryMUD/mud/lib/
ScryMUD/mud/lib/bitfield/
ScryMUD/mud/lib/log/
ScryMUD/mud/lib/string2/
// $Id: InputArea.java,v 1.4 1999/06/05 23:29:12 greear Exp $
// $Revision: 1.4 $  $Author: greear $ $Date: 1999/06/05 23:29:12 $

//
//Hegemon Client Code:  Java Client for ScryMUD Server Code
//Copyright (C) 1998  Ben Greear
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// To contact the Author, Ben Greear:  greear@cyberhighway.net, (preferred)
//                                     greearb@agcs.com
//

import java.awt.event.*;
import java.awt.*;
import java.util.*;

/**  Will hold the input text area, as well as the arrow pane for directions.
 */
public class InputArea extends Panel { 
   TextArea input_field;
   ClientDisplay cd;
   ExitNavigator en;
   HegemonManager hm;
   boolean ctrl_down = false;

   public InputArea(ClientDisplay disp, HegemonManager h) {
      hm = h;
   
      cd = disp;
      en = new ExitNavigator(disp, hm);
      setLayout(new FlowLayout());

      input_field = new TextArea("", 7, 60, TextArea.SCROLLBARS_VERTICAL_ONLY);
      input_field.setBackground(new Color(255, 255, 215));

      input_field.setEnabled(true);
      input_field.requestFocus();
      input_field.addKeyListener(new KeyAdapter() {
         public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
               String str = input_field.getText().trim();
               cd.send(str + "\n");

               Font f = hm.getColorSelectionMgr().getInputFont();
               Color c =  hm.getColorSelectionMgr().getInputSelection();
               if (f != null) {
                  cd.getHegemonScroll().pushFont(f);
               }
               if (c != null) {
                  cd.getHegemonScroll().pushColor(c);
               }
               cd.getHegemonScroll().append(" >>" + str + "\n");
               cd.getOutput().paintScroll(); //flush 

               if (f != null) {
                  cd.getHegemonScroll().popFont();
               }
               if (c != null) {
                  cd.getHegemonScroll().popColor();
               }
                  
               if (hm.getCommandHistory() != null) {
                  hm.getCommandHistory().append(str + "\n");
               }
               input_field.setText("");
            }//if
            else if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
               ctrl_down = true;
            }//if
            else if (e.getKeyCode() == KeyEvent.VK_PAGE_UP) {
               cd.getOutput().do_page_up_adjustment();
            }
            else if (e.getKeyCode() == KeyEvent.VK_PAGE_DOWN) {
               cd.getOutput().do_page_down_adjustment();
            }
            else if (ctrl_down) {
               if (e.getKeyCode() == KeyEvent.VK_P) {
                  input_field.setText(hm.getCommandHistory().getPreviousCmd());
               }//if
               else if (e.getKeyCode() == KeyEvent.VK_N) {
                  input_field.setText(hm.getCommandHistory().getNextCmd());
               }//else
               else if (e.getKeyCode() == KeyEvent.VK_K) {
                  input_field.setText(""); //kill
               }
            }//if
            else {
               super.keyPressed(e);
            }
         }//keyPressed

         public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
               ctrl_down = false;
            }//if
            else {
               super.keyReleased(e);
            }
         }//keyReleased

         });

      add(input_field);
      add(en);
   }//constructor

   public final TextArea getTA() {
      return input_field;
   }

   public final ExitNavigator getExitNavigator() {
      return en;
   }
}//InputArea


/** Holds the directional buttons.  */
class ExitNavigator extends Panel {
   ClientDisplay cd;
   HegemonManager hm;
   Color not_there;
   Color there;

   Button NW;
   Button N;
   Button NE;
   Button W;
   Button up;
   Button down;
   Button E;
   Button SW;
   Button S;
   Button SE;

   Color NW_color;
   Color N_color;
   Color NE_color;
   Color W_color;
   Color up_color;
   Color down_color;
   Color E_color;
   Color SW_color;
   Color S_color;
   Color SE_color;

   public ExitNavigator(ClientDisplay disp, HegemonManager h) {
      cd = disp;
      hm = h;
      not_there = new Color(0, 0, 255);
      there = new Color(0, 255, 0);

      NW = new Button("NW");
      N = new Button("N");
      NE = new Button("NE");
      W = new Button("W");
      up = new Button("UP");
      down = new Button("DOWN");
      E = new Button("E");
      SW = new Button("SW");
      S = new Button("S");
      SE = new Button("SE");

      NW.setBackground(not_there);
      N.setBackground(not_there);
      NE.setBackground(not_there);
      W.setBackground(not_there);
      up.setBackground(not_there);
      down.setBackground(not_there);
      E.setBackground(not_there);
      SW.setBackground(not_there);
      S.setBackground(not_there);
      SE.setBackground(not_there);

      NW.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("northwest");
         }});

      N.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("north");
         }});

      NE.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("northeast");
         }});

      W.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("west");
         }});

      up.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("up");
         }});

      down.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("down");
         }});

      Panel ud = new Panel();
      ud.setLayout(new BorderLayout());
      ud.add(up, "North");
      ud.add(down, "South");

      E.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("east");
         }});

      SW.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("southwest");
         }});

      S.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("south");
         }});

      SE.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            send("southeast");
         }});

      int REM = GridBagConstraints.REMAINDER;
           
      GridBagLayout gridbag = new GridBagLayout();
      GridBagConstraints c = new GridBagConstraints();
      setLayout(gridbag);
      
      c.fill = GridBagConstraints.BOTH;
      c.weightx = c.weighty = 0.0;
      
      c.gridwidth = 1;
      gridbag.setConstraints(NW, c);
      add(NW);

      gridbag.setConstraints(N, c);
      add(N);

      c.gridwidth = REM;
      gridbag.setConstraints(NE, c);
      add(NE);

      c.gridwidth = 1;
      gridbag.setConstraints(W, c);
      add(W);

      gridbag.setConstraints(ud, c);
      add(ud);

      c.gridwidth = REM;
      gridbag.setConstraints(E, c);
      add(E);

      c.gridwidth = 1;
      gridbag.setConstraints(SW, c);
      add(SW);

      gridbag.setConstraints(S, c);
      add(S);

      c.gridwidth = REM;
      gridbag.setConstraints(SE, c);
      add(SE);

   }//constructor

   protected void send(String str) {
      cd.send(str + "\n");
   }//send

   public void setDirs(Vector dirs) {
      String d;

      NW_color = not_there;
      N_color = not_there;
      NE_color = not_there;
      W_color = not_there;
      up_color = not_there;
      down_color = not_there;
      E_color = not_there;
      SW_color = not_there;
      S_color = not_there;
      SE_color = not_there;

      for (int i = 1; i < dirs.size(); i++) {
         d = (String)(dirs.elementAt(i));
         if (d.equalsIgnoreCase("NW")) {
            NW_color = there;
         }
         else if (d.equalsIgnoreCase("N")) {
            N_color = there;
         }
         else if (d.equalsIgnoreCase("NE")) {
            NE_color = there;
         }
         else if (d.equalsIgnoreCase("W")) {
            W_color = there;
         }
         else if (d.equalsIgnoreCase("U")) {
            up_color = there;
         }
         else if (d.equalsIgnoreCase("D")) {
            down_color = there;
         }
         else if (d.equalsIgnoreCase("E")) {
            E_color = there;
         }
         else if (d.equalsIgnoreCase("SW")) {
            SW_color = there;
         }
         else if (d.equalsIgnoreCase("S")) {
            S_color = there;
         }
         else if (d.equalsIgnoreCase("SE")) {
            SE_color = there;
         }
      }//for

      if (NW.getBackground() != NW_color) {
         NW.setBackground(NW_color);
      }
      if (N.getBackground() != N_color) {
         N.setBackground(N_color);
      }
      if (NE.getBackground() != NE_color) {
         NE.setBackground(NE_color);
      }
      if (W.getBackground() != W_color) {
         W.setBackground(W_color);
      }
      if (up.getBackground() != up_color) {
         up.setBackground(up_color);
      }
      if (down.getBackground() != down_color) {
         down.setBackground(down_color);
      }
      if (E.getBackground() != E_color) {
         E.setBackground(E_color);
      }
      if (SW.getBackground() != SW_color) {
         SW.setBackground(SW_color);
      }
      if (S.getBackground() != S_color) {
         S.setBackground(S_color);
      }
      if (SE.getBackground() != SE_color) {
         SE.setBackground(SE_color);
      }

   }//setDirections
}//ExitNavigator