home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / inprise / JSAMPLES.Z / ChessViewer.java < prev    next >
Text File  |  1998-05-08  |  66KB  |  1,830 lines

  1. /*
  2.  * Copyright (c) 1997-1998 Borland International, Inc. All Rights Reserved.
  3.  * 
  4.  * This SOURCE CODE FILE, which has been provided by Borland as part
  5.  * of a Borland product for use ONLY by licensed users of the product,
  6.  * includes CONFIDENTIAL and PROPRIETARY information of Borland.  
  7.  *
  8.  * USE OF THIS SOFTWARE IS GOVERNED BY THE TERMS AND CONDITIONS 
  9.  * OF THE LICENSE STATEMENT AND LIMITED WARRANTY FURNISHED WITH
  10.  * THE PRODUCT.
  11.  *
  12.  * IN PARTICULAR, YOU WILL INDEMNIFY AND HOLD BORLAND, ITS RELATED
  13.  * COMPANIES AND ITS SUPPLIERS, HARMLESS FROM AND AGAINST ANY CLAIMS
  14.  * OR LIABILITIES ARISING OUT OF THE USE, REPRODUCTION, OR DISTRIBUTION
  15.  * OF YOUR PROGRAMS, INCLUDING ANY CLAIMS OR LIABILITIES ARISING OUT OF
  16.  * OR RESULTING FROM THE USE, MODIFICATION, OR DISTRIBUTION OF PROGRAMS
  17.  * OR FILES CREATED FROM, BASED ON, AND/OR DERIVED FROM THIS SOURCE
  18.  * CODE FILE.
  19.  */
  20. //
  21. //
  22. //  ChessViewer.java
  23. //  applet to view a chess pgn file
  24. //
  25. //
  26. package borland.samples.apps.chess.client;
  27.  
  28. import java.awt.* ;
  29. import java.awt.event.*;
  30. import java.net.*;
  31. import java.applet.*;
  32. import java.io.*;
  33. import java.util.*;
  34. import java.beans.*;
  35. import borland.samples.apps.chess.client.board.*;
  36. import borland.jbcl.control.*;
  37. import borland.jbcl.layout.*;
  38. import borland.jbcl.view.*;
  39. import borland.jbcl.model.*;
  40. import borland.jbcl.util.Alignment;
  41. import borland.jbcl.util.VetoException;
  42. import borland.jbcl.util.ImageLoader;
  43. import java.lang.*;
  44. import welcome.Application1;
  45.  
  46. public class ChessViewer extends com.sun.java.swing.JApplet implements ModalParent, Runnable
  47. {
  48.   boolean threadFlag = true;
  49.   ResourceBundle res = ResourceBundle.getBundle("borland.samples.apps.chess.client.Res");
  50.   ColumnView[] columns = new ColumnView[4];
  51.   Button[] navBtn = new Button[8];
  52.    Thread clock;             //This thread does the chessclock
  53.   ClientSender sender;      //This thread sends data to server
  54.   ClientListener ourServer; //the thread that listens to the sever
  55.   boolean imageLoadError = false;
  56.   public boolean isApplet = true;
  57.   boolean loggedon = false;
  58.   boolean doNothing = false;
  59.   boolean hasListeners = false;
  60.   boolean showLibraryGame = true;
  61.  
  62.   String filename ;
  63.   String myName = "";
  64.   String opponentName;       //null when not a live game
  65.   String challenger;       //opponent's name before the challenge is accepted
  66.  
  67.   int listuse ;   //used as enum PlayerList,LIBRARYLIST,MOVELIST,KIBITZ
  68.   Vector listContents;
  69.   Vector libraryListContents;
  70.   Vector pieceGif;
  71.   String subroutine = "Init";
  72.   String msg = " ";
  73.   int movecount=0;  //index of selected item in playerList
  74.   int count = 0;   // size of List playerList
  75.   int importCount = 0;
  76.   boolean moveToken = true;
  77.   Hashtable libraryHash = new Hashtable();
  78.   boolean blackOnTop = true;
  79.   int[] moveSubscript = new int[8];
  80.   static final int PLAYERLIST  = 1;
  81.   static final int LIBRARYLIST = 2;
  82.   static final int MOVELIST    = 0;
  83.   static final int KIBITZ      = 3;
  84.  // static final String PLAYERLIST_LABEL = res.getString("Players");
  85.  // static final String LIBRARYLIST_LABEL = res.getString("Library");
  86.  // static final String res.getString("Moves") = res.getString("Moves");
  87.   boolean okay=true;
  88.   int color = ChessRules.Black; //the color that made the last move
  89.   int yourColor = ChessRules.Black;
  90.   long[] playerTime = new long[2];
  91.   int gameTimeValue;
  92.   long lMoveTime;
  93.   ChessRules game;
  94.   String imageNames ="/images/cmpieces.gif;/images/owlpieces.gif"; //Image parameter default data
  95.   String host = "localhost"; //HOST parameter default data
  96.   //URL selectedImage;
  97.   long     opponentsTimeWhenStopped = 0; //other players time when the applet was suspended
  98.   boolean  timerWasStopped = false; //Was the chessclock thread killed because the applet was suspended?
  99.   long     timeStopped =  0;  //the SystemTime when the applet was suspended.
  100.   LogonDialog pDialog;
  101.   Frame f = null;
  102.  
  103.   GridView gridControl1; //more work to setup than a GridControl, but 500k less to deploy and since we
  104.                                   //we do not use a dataset and we are an applet seemed like a good idea
  105.   SplitPanel splitPanel ;
  106.   Button button0;
  107.   Button button1;
  108.   Button button2;
  109.   Button button3;
  110.   Button button4;
  111.   Button button5;
  112.   Button button6;
  113.   Button button7;
  114.   Label        topName;
  115.   Label        bottomName;
  116.   TextField    chatText;
  117.   Panel        statusPanel;
  118.   BorderLayout appletBorderLayout;
  119.   BorderLayout statusPanelBorderLayout;
  120.   Panel statusButtons;
  121.   GridLayout statusButtonsGridLayout;
  122.   Button sbLogon;
  123.   Button sbChoose;
  124.   Button optionsButton;
  125.   Label statusLine;
  126.   TextArea infoText;
  127.   Panel p;
  128.   GridLayout pGridLayout;
  129.   BorderLayout pBorderLayout;
  130.   Panel w;
  131.   BorderLayout wBorderLayout;
  132.   Panel b;
  133.   BorderLayout bBorderLayout;
  134.   EastPanel ep;
  135.   Panel altButtons;
  136.   GridLayout altButtonsGridLayout;
  137.   TabsetPanel listPanel;
  138.   List libraryList;
  139.   List playerList;
  140.   Chessboard theboard;
  141.   Label topTime;
  142.   Label bottomTime;
  143.   Panel timePanel;
  144.   Panel bottomInfo;
  145.   BorderLayout bottomInfoBorderLayout;
  146.   Panel topInfo;
  147.   BorderLayout topInfoBorderLayout;
  148.   Panel statusLinePanel;
  149.   BorderLayout statusLinePanelBorderLayout;
  150.   TextField moveTime;
  151.   TextField gameTime;
  152.   BorderLayout epLayout;
  153.   Label gameTimeLabel;
  154.   Label minutesLabel;
  155.   Label moveTimeLabel;
  156.  
  157.   public ChessViewer()  {
  158.     //System.out.println ("ChessViewer xtor d");
  159.     listContents = new Vector();
  160.     libraryListContents = new Vector();
  161.     game = new ChessRules();
  162.   }
  163.  
  164.   static public void main(String[] args) {
  165.     ChessViewer app = new ChessViewer();
  166.     app.isApplet = false;
  167.     app.getParameters(args);
  168.     if (args.length == 1 && args[0].equals("?")) {
  169.       String [][] info = app.getParameterInfo();
  170.       if (info != null)
  171.         for (int i=0;i<info.length;i++)
  172.           System.out.println(info[i][0] + "=(" + info[i][0]+ ") " + info[i][2]);
  173.     }
  174.     DecoratedFrame frame = new DecoratedFrame();
  175.     //frame.setLayout(new BorderLayout());
  176.     frame.add(app,BorderLayout.CENTER);
  177.     frame.setTitle(app.res.getString("ChessViewer"));
  178.     frame.setBounds(0,-500,40,30);
  179.     frame.setVisible(false);
  180.     frame.setVisible(true);     //needs to happen before Chessboard.setImage() so image observer is real?
  181.  
  182.     app.init();
  183.     frame.pack();
  184.      // Center the frame
  185.     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  186.     Dimension frameSize = frame.getPreferredSize();
  187.     if (frameSize.height > screenSize.height)
  188.       frameSize.height = screenSize.height;
  189.     if (frameSize.width > screenSize.width)
  190.       frameSize.width = screenSize.width;
  191.     frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
  192.     frame.setVisible(true);
  193.     if (app.pDialog != null)
  194.       app.pDialog.name.requestFocus();
  195.   }
  196.  
  197.   String getParameter(String parmName, String args[]) {
  198.     if (args == null) {
  199.       return getParameter(parmName);
  200.     }
  201.     int i;
  202.     String strArg = parmName + '=';
  203.     String strValue = null;
  204.     for (i = 0; i < args.length; i++) {
  205.       int index = args[i].indexOf('=') + 1;
  206.       if (strArg.equalsIgnoreCase(args[i].substring(0, index))) {
  207.         strValue= args[i].substring(strArg.length());
  208.         if (strValue.startsWith("\"")) {
  209.           strValue = strValue.substring(1);
  210.           if (strValue.endsWith("\""))
  211.             strValue = strValue.substring(0, strValue.length() - 1);
  212.         }
  213.       }
  214.     }
  215.     return strValue;
  216.   }
  217.  
  218.   void getParameters(String args[]) {
  219.     String param;
  220.     param = getParameter(res.getString("IMAGENAME"), args);
  221.     if (param != null)
  222.       imageNames = param;
  223.     param = getParameter("HOST", args);
  224.     if (param != null)
  225.       host = param;
  226.     param = getParameter(res.getString("GAMEPARAMNAME"),args);
  227.     if (param != null)
  228.       filename = param;
  229.   }
  230.  
  231.   public String [] [] getParameterInfo() {
  232.     String[][] info = {
  233.     { res.getString("IMAGENAME"), "String", res.getString("SEMICOLON_DELIMITED") },
  234.         { res.getString("GAMEPARAMNAME"), "String", res.getString("PGN_FILE_TO_LOAD_VERY")},
  235.     { "HOST", "String", res.getString("THE_HOSTNAME_OF_THE") },
  236.     };
  237.     return info;
  238.   }
  239.  
  240.   public String getAppletInfo() {
  241.     return res.getString("Name:_ChessViewer") +
  242.         res.getString("Author:_Greg") +
  243.       res.getString("Created_with_Borland") +
  244.       res.getString("Description:_A_Chess");
  245.  
  246.   }
  247.  
  248.   public void init() {
  249.     try {
  250.       pieceGif = new Vector();
  251.       int i ;
  252.       if (isApplet) {
  253.         getParameters(null);
  254.         host = getCodeBase().getHost(); //Override the host parameter since we are an
  255.                                         //applet and this is only server we are
  256.                                         //capable of talking to
  257.       }
  258.       //parse imageNames into Vector pieceGif
  259.       int index = -1;
  260.       while (true) {
  261.         int nextIndex = imageNames.indexOf(';',index+1);
  262.         if (nextIndex == -1)
  263.           nextIndex = imageNames.length();
  264.         String imageName = imageNames.substring(index+1,nextIndex);
  265.         System.out.println("imageName = " + imageName);
  266.         URL imageURL;
  267.         try {
  268.           if (!isApplet)
  269.             if (imageName.startsWith("file://"))
  270.               imageURL = new URL(imageName);
  271.             else
  272.               imageURL = new URL("http",host,imageName);
  273.           else
  274.             imageURL = new URL(getDocumentBase(),imageName);
  275.           pieceGif.addElement(imageURL);
  276.         }
  277.         catch (Exception e) {
  278.           System.out.println( e + host +"  " +  imageName);
  279.         }
  280.         index = nextIndex;
  281.         if (index >= imageNames.length() -1)
  282.           break;
  283.       }
  284.       int j;
  285.       f = ChessViewer.getFrame(this);
  286.       if (f == null)
  287.         System.out.println("Where is the frame?");
  288.       else
  289.         System.out.println("frame title is " + f.getTitle());
  290.       jbInit();
  291.     }
  292.     catch (Exception e ) {
  293.       System.out.println("chessViewer.init " + e);
  294.       e.printStackTrace();
  295.     }
  296.     game.setPieceValues(0,1,theboard.getPiecePosition());
  297.     game.setPieceColors(0,1,theboard.getColorPosition());
  298.     subroutine = "parsePGNFile";
  299.     URL PGNurl = null;
  300.     listuse = KIBITZ;
  301.     String message;
  302.     InputStream is = null;
  303.  
  304.     try {
  305.       if (filename != null) {
  306.         if (isApplet)
  307.           PGNurl  = new URL(getDocumentBase(),filename);
  308.         else
  309.           PGNurl = new URL("http",host,filename);
  310.  
  311.         is = PGNurl.openStream();
  312.         if (is != null){
  313.           infoText.setText("");
  314.           Reader reader = new InputStreamReader(is);
  315.           BufferedReader bufferedReader = new BufferedReader(reader);
  316.           game.parsePGNFile (bufferedReader);
  317.           listuse = KIBITZ;
  318.              subroutine = "parsePGNFile done";
  319.         }
  320.         else {
  321.             topName.setText(res.getString("COULD_NOT_OPEN") + filename);
  322.         }
  323.       }
  324.       else
  325.         System.out.println("no file specified");
  326.       topName.setText(game.getPlayerB());
  327.       bottomName.setText(game.getPlayerW());
  328.       System.out.println("init start thread");
  329.       clock = new Thread(this);
  330.       //clock.setPriority(Thread.NORM_PRIORITY + 1); //to help the images load
  331.       clock.start();
  332.       clock = null; //don't want the opportunity to kill loading the board image.
  333.       System.out.println("init call fillMoveList");
  334.       fillMoveList();
  335.       color = ChessRules.Black;
  336.       System.out.println("init call dispalypos" );
  337.       logonEnable(false);
  338.       displayPos();
  339.       System.out.println("init back from call dispalypos" );
  340.       if (filename == null)
  341.         startsocket();
  342.     }
  343.     catch( IOException x)  {
  344.       message = x.toString() ;
  345.       if (PGNurl != null)
  346.        message = message +  " "+ PGNurl.toString();
  347.       else
  348.         message = res.getString("QUESTION_MARKS") + message;
  349.       if (bottomName != null)
  350.         bottomName.setText(message);
  351.     }
  352.     catch(Exception e)  {
  353.       System.out.println( "init " + e);
  354.       e.printStackTrace();
  355.       message = e.toString();
  356.       if (topName != null)
  357.         topName.setText(subroutine + count );
  358.       if (bottomName != null)
  359.         bottomName.setText(message);
  360.     }
  361.     try {
  362.       if (is != null)
  363.           is.close();
  364.     }
  365.     catch(Exception e) {}
  366.   }
  367.  
  368.   private void jbInit() throws Exception {
  369.     gridControl1 = (GridView) Beans.instantiate(getClass().getClassLoader(),borland.jbcl.view.GridView.class.getName());
  370.     splitPanel = (SplitPanel) Beans.instantiate(getClass().getClassLoader(),borland.jbcl.control.SplitPanel.class.getName());
  371.     button0 = (Button) Beans.instantiate(getClass().getClassLoader(),java.awt.Button.class.getName());
  372.     button1 = (Button) Beans.instantiate(getClass().getClassLoader(),java.awt.Button.class.getName());
  373.     button2 = (Button) Beans.instantiate(getClass().getClassLoader(),java.awt.Button.class.getName());
  374.     button3 = (Button) Beans.instantiate(getClass().getClassLoader(),java.awt.Button.class.getName());
  375.     button4 = (Button) Beans.instantiate(getClass().getClassLoader(),java.awt.Button.class.getName());
  376.     button5 = (Button) Beans.instantiate(getClass().getClassLoader(),java.awt.Button.class.getName());
  377.     button6 = (Button) Beans.instantiate(getClass().getClassLoader(),java.awt.Button.class.getName());
  378.     button7 = (Button) Beans.instantiate(getClass().getClassLoader(),java.awt.Button.class.getName());
  379.     topName     = (Label)Beans.instantiate(getClass().getClassLoader(),Label.class.getName());
  380.     bottomName  = (Label)Beans.instantiate(getClass().getClassLoader(),Label.class.getName());
  381.     chatText    = (TextField) Beans.instantiate(getClass().getClassLoader(),TextField.class.getName());
  382.     statusPanel = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  383.     appletBorderLayout = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  384.     statusPanelBorderLayout = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  385.     statusButtons = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  386.     statusButtonsGridLayout = (GridLayout)Beans.instantiate(getClass().getClassLoader(),GridLayout.class.getName());
  387.     sbLogon       = (Button) Beans.instantiate(getClass().getClassLoader(),Button.class.getName());
  388.     sbChoose      = (Button) Beans.instantiate(getClass().getClassLoader(),Button.class.getName());
  389.     optionsButton = (Button) Beans.instantiate(getClass().getClassLoader(),Button.class.getName());
  390.     statusLine = (Label)Beans.instantiate(getClass().getClassLoader(),Label.class.getName());
  391.     infoText = (TextArea) Beans.instantiate(getClass().getClassLoader(),TextArea.class.getName());
  392.     p = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  393.     pGridLayout = (GridLayout)Beans.instantiate(getClass().getClassLoader(),GridLayout.class.getName());
  394.     pBorderLayout = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  395.     w = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  396.     wBorderLayout = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  397.     b = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  398.     bBorderLayout = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  399.     ep = (EastPanel)(Panel) Beans.instantiate(getClass().getClassLoader(),EastPanel.class.getName());
  400.     altButtons = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  401.     altButtonsGridLayout = (GridLayout)Beans.instantiate(getClass().getClassLoader(),GridLayout.class.getName());
  402.     listPanel = (TabsetPanel) Beans.instantiate(getClass().getClassLoader(),TabsetPanel.class.getName());
  403.     libraryList = (List)Beans.instantiate(getClass().getClassLoader(),List.class.getName());
  404.     playerList  = (List)Beans.instantiate(getClass().getClassLoader(),List.class.getName());
  405.     theboard = (Chessboard) Beans.instantiate(getClass().getClassLoader(),Chessboard.class.getName());
  406.     topTime = (Label)Beans.instantiate(getClass().getClassLoader(),Label.class.getName());
  407.     bottomTime = (Label)Beans.instantiate(getClass().getClassLoader(),Label.class.getName());
  408.     timePanel = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  409.     bottomInfo = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  410.     bottomInfoBorderLayout = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  411.     topInfo = (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  412.     topInfoBorderLayout  = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  413.     statusLinePanel= (Panel) Beans.instantiate(getClass().getClassLoader(),Panel.class.getName());
  414.     statusLinePanelBorderLayout = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  415.     moveTime = (TextField) Beans.instantiate(getClass().getClassLoader(),TextField.class.getName());
  416.     gameTime = (TextField) Beans.instantiate(getClass().getClassLoader(),TextField.class.getName());
  417.     epLayout = (BorderLayout) Beans.instantiate(getClass().getClassLoader(),BorderLayout.class.getName());
  418.     gameTimeLabel = (Label)Beans.instantiate(getClass().getClassLoader(),Label.class.getName());
  419.     minutesLabel  = (Label)Beans.instantiate(getClass().getClassLoader(),Label.class.getName());
  420.     moveTimeLabel = (Label)Beans.instantiate(getClass().getClassLoader(),Label.class.getName());
  421.     w.setLayout(wBorderLayout);
  422.     b.setLayout(bBorderLayout);
  423.     w.add(b,BorderLayout.SOUTH);
  424.     pGridLayout.setRows(1);
  425.     pGridLayout.setColumns(4);
  426.     p.setLayout(pGridLayout);
  427.     b.add(p,BorderLayout.CENTER);
  428.      theboard.setImage(borland.jbcl.util.ImageLoader.loadFromResource("images/cmpieces.gif",this,game.getClass()));
  429.     button0.setLabel(res.getString("BEGINNING_OF_GAME"));
  430.     navBtn[0] = button0;
  431.     p.add(button0);
  432.     navBtn[1] = button1;
  433.     button1.setLabel(res.getString("BACK_ONE_MOVE"));
  434.     p.add(button1);
  435.     navBtn[3] = button3;
  436.     button3.setLabel(res.getString("FORWARD_ONE_MOVE"));
  437.     p.add(button3);
  438.      navBtn[2] =  button2;
  439.     button2.setLabel(res.getString("END_OF_GAME"));
  440.     p.add(button2);
  441.     b.add(altButtons,BorderLayout.SOUTH);
  442.     altButtonsGridLayout.setRows(1);
  443.     altButtonsGridLayout.setColumns(4);
  444.     altButtons.setLayout(altButtonsGridLayout);
  445.     navBtn[4] = button4;
  446.     button4.setLabel("Branch 1");
  447.     altButtons.add(button4);
  448.     navBtn[5] = button5;
  449.     button5.setLabel("Branch 2");
  450.     altButtons.add(button5);
  451.     navBtn[6] = button6;
  452.     button6.setLabel("Branch 3");
  453.     altButtons.add(button6);
  454.     navBtn[7] = button7;
  455.     button7.setLabel("Branch 4");
  456.     altButtons.add(button7);
  457.  
  458.     BoardButtonActionAdapter boardButtonActionAdapter = new BoardButtonActionAdapter(this);
  459.     for (int i=0;i<8;i++)
  460.       navBtn[i].addActionListener(boardButtonActionAdapter);
  461.  
  462.     PlayerListAdapter playerListAdapter = new PlayerListAdapter(this);
  463.     playerList.addActionListener(playerListAdapter);
  464.     playerList.addItemListener(playerListAdapter);
  465.     LibraryListAdapter libaryListAdapter = new LibraryListAdapter(this);
  466.  
  467.     libraryList.addActionListener(libaryListAdapter);
  468.     libraryList.addItemListener(libaryListAdapter);
  469.     
  470.     infoText.setRows(6);
  471.     infoText.setColumns(25);
  472.     infoText.setEditable(false);
  473.     statusPanel.setLayout(statusPanelBorderLayout);
  474.     statusLine.setText(res.getString("LOGONHINT"));
  475.     chatText.setText(res.getString("CHATHINT"));
  476.     OtherActionAdapter otherActionAdapter =   new OtherActionAdapter(this);
  477.     chatText.addActionListener(otherActionAdapter);
  478.     ep.setLayout(epLayout);
  479.     ep.add(chatText,BorderLayout.NORTH);
  480.  
  481.     statusButtonsGridLayout.setRows(1);
  482.     statusButtonsGridLayout.setColumns(4);
  483.     statusButtons.setLayout(statusButtonsGridLayout);
  484.  
  485.     gameTimeLabel.setText(res.getString("GAMEIN"));
  486.     timePanel.add (gameTimeLabel);
  487.     gameTimeLabel.setAlignment(Label.RIGHT);
  488.     gameTime.setText(res.getString("DEFAULT_GAME_TIME"));
  489.     timePanel.add (gameTime);
  490.  
  491.     minutesLabel.setText(res.getString("MINUTES") );
  492.     timePanel.add  (minutesLabel);
  493.     moveTime.setText(res.getString("DEFAULT_MOVE_TIME"));
  494.     timePanel.add (moveTime);
  495.  
  496.     moveTimeLabel.setText(res.getString("MOVETIME"));
  497.     int[] columnSizes = new int[4];
  498.     columnSizes[0] = 40;
  499.     columnSizes[1] = 50;
  500.     columnSizes[2] = 50;
  501.     columnSizes[3] = 100;
  502.     columns[0] = new ColumnView();
  503.     columns[1] = new ColumnView();
  504.     columns[2] = new ColumnView();
  505.     columns[3] = new ColumnView();
  506.     columns[0].setWidth(columnSizes[0]);
  507.     columns[1].setWidth(columnSizes[1]);
  508.     columns[2].setWidth(columnSizes[2]);
  509.     columns[3].setWidth(columnSizes[3]);
  510.     columns[0].setItemPainter(new TextItemPainter());
  511.     columns[3].setItemEditor(new ExpandingTextItemEditor());
  512.     columns[0].setCaption(res.getString("Move"));
  513.     columns[1].setCaption(res.getString("White"));
  514.     columns[2].setCaption(res.getString("Black"));
  515.     columns[3].setCaption("");
  516.     gridControl1.setColumnViews(columns);
  517.     gridControl1.setRowHeaderVisible(false);
  518.     SizeVector columnSizeVector = new VariableSizeVector(columnSizes);
  519.     gridControl1.setColumnSizes(columnSizeVector);
  520.     gridControl1.setRowSizes(new FixedSizeVector(20));
  521.     GC_ColumnHeaderManager columnManager = new GC_ColumnHeaderManager(columns);
  522.     gridControl1.getColumnHeaderView().setViewManager(columnManager);
  523.     gridControl1.getColumnHeaderView().setModel(columnManager);
  524.     gridControl1.setSelection(new SingleMatrixSelection(gridControl1.getSubfocus()));
  525.     gridControl1.addSubfocusListener(new ChessViewer_gridControl1_SubfocusAdapter(this));
  526.     this.setSize(new Dimension(687, 497));
  527.     gridControl1.setModel(game);
  528.     gridControl1.setViewManager(new BasicViewManager(
  529.         new FocusableItemPainter(
  530.             new SelectableTextItemPainter(Alignment.LEFT | Alignment.MIDDLE)),
  531.             new TextItemEditor(Alignment.LEFT | Alignment.MIDDLE)));
  532.     timePanel.add (moveTimeLabel);
  533.     sbChoose.setLabel(res.getString("COPY_PASTE"));
  534.     statusButtons.add(sbChoose);
  535.     statusButtons.add(optionsButton);
  536.     sbLogon.setLabel(res.getString("LOGOFF") );
  537.     statusButtons.add(sbLogon);
  538.     sbChoose.addActionListener(otherActionAdapter);
  539.     sbLogon.addActionListener(otherActionAdapter);
  540.  
  541.     statusPanel.add(statusButtons,BorderLayout.CENTER);
  542.     statusPanel.add(timePanel,BorderLayout.NORTH);
  543.  
  544.     optionsButton.addActionListener(otherActionAdapter);
  545.     optionsButton.setLabel(res.getString("OPTIONS_"));
  546.  
  547.     statusLinePanel.setLayout(statusLinePanelBorderLayout);
  548.     statusLinePanel.add(statusLine,BorderLayout.CENTER);
  549.  
  550.     statusPanel.add(statusLinePanel,BorderLayout.SOUTH);
  551.     ep.add(statusPanel,BorderLayout.SOUTH);
  552.     getContentPane().setLayout(appletBorderLayout);
  553.     getContentPane().add(w,BorderLayout.WEST);
  554.     getContentPane().add(ep,BorderLayout.EAST);
  555.     ep.add(splitPanel, BorderLayout.CENTER);
  556.    // ep.add(gridControl1, BorderLayout.CENTER);
  557.     splitPanel.add(infoText,  new PaneConstraints("infoText","infoText",PaneConstraints.ROOT,1.0f));
  558.     splitPanel.add(listPanel, new PaneConstraints("listPanel","infoText",PaneConstraints.BOTTOM,0.6f));
  559.    // splitPanel.add(gridControl1, new PaneConstraints("listPanel","infoText",PaneConstraints.BOTTOM,0.6f));
  560.  
  561.     listPanel.add(gridControl1, res.getString("Moves"));
  562.     listPanel.add(playerList, res.getString("Players"));
  563.     listPanel.add(libraryList, res.getString("Library"));
  564.     listPanel.setSelectedTab(res.getString("Players"));
  565.     listPanel.setTabsOnTop(false);
  566.     listPanel.setMargins(new Insets(0, 0, 0, 0));
  567.     listPanel.addSubfocusListener(new ChessViewer_listPanel_SubfocusAdapter(this));
  568.     Font boldFont = new Font(getFont().getName(),Font.BOLD,getFont().getSize());
  569.     bottomName = new Label();
  570.     bottomName.setText(game.getPlayerW());
  571.     bottomName.setFont(boldFont);
  572.     topName.setText(game.getPlayerB());
  573.     topName.setFont(boldFont);
  574.     topInfo.setLayout(topInfoBorderLayout);
  575.     topTime.setFont(boldFont);
  576.     bottomInfo.setLayout(bottomInfoBorderLayout);
  577.     bottomTime.setFont(boldFont);
  578.     bottomInfo.add(bottomName,BorderLayout.CENTER);
  579.     bottomInfo.add(bottomTime, BorderLayout.EAST);
  580.     w.add(theboard, BorderLayout.CENTER);
  581.     topInfo.add(topName, BorderLayout.CENTER);
  582.     topInfo.add(topTime, BorderLayout.EAST);
  583.     w.add(topInfo, BorderLayout.NORTH);
  584.     b.add(bottomInfo, BorderLayout.NORTH);
  585.     bottomTime.setText(res.getString("ZEROTIME"));
  586.     topTime.setText(res.getString("ZEROTIME"));
  587.     theboard.addActionListener(new ChessboardAdapt(this));
  588.  
  589.     //so it comes up pretty in the designer; set to something real in run(); if it can't find the image set in run it will keep using this one
  590.     if (isApplet)
  591.         return;
  592.      theboard.setImage(ImageLoader.loadFromResource("images/cmpieces.gif",this,game.getClass()));
  593.   }
  594.  
  595.   public void fillMoveList() {
  596.     try {
  597.       game.generatePositions();
  598.       System.out.println("FillMoveList returned from generatePositions");
  599.       count = game.getArraySize();
  600.       subroutine= "fillMoveList";
  601.       moveSubscript[0] = 0;
  602.       moveSubscript[1] = 0;
  603.       moveSubscript[2] = count;
  604.       moveSubscript[3] = 0;
  605.       int movenumber;
  606.       for (int i=1;i<=count;i++)    {
  607.         movenumber = game.getMoveNumber(i,0);
  608.         if (movenumber == 0)
  609.           movenumber = game.getMoveNumber(i,1);
  610.         String lineitem =  " " + movenumber +". "+game.getMoveText(i,0)+"  "+game.getMoveText(i,1);
  611.       }
  612.       System.out.println("Added " + count + " lines");
  613.       subroutine= "fillMoveList-end";
  614.     }
  615.     catch (Exception e) {
  616.       System.out.println("fillmovelist " + e);
  617.       e.printStackTrace();
  618.     }
  619.   }
  620.  
  621.   void logonEnable(boolean state) {
  622.     loggedon = state;
  623.     chatText.setEnabled(state);
  624.     if (loggedon)  {
  625.       sbLogon.setEnabled(true); // Once on, only toggle the meaning
  626.       sbLogon.setLabel(res.getString("LOGOFF"));
  627.     }
  628.     else  {
  629.       if (listuse == ChessViewer.MOVELIST)
  630.         gameOver();
  631.       else
  632.         if (listuse == ChessViewer.PLAYERLIST ||
  633.             listuse == ChessViewer.LIBRARYLIST ) {
  634.           setListButtons (ChessViewer.LIBRARYLIST);
  635.           getLibraryList();
  636.         }
  637.       moveToken = true;
  638.       sbLogon.setLabel(res.getString("LOGON"));
  639.     }
  640.   }
  641.  
  642.   public void setListListener(PlayerListListener ll){
  643.      ourServer.listListener = ll;
  644.   }
  645.  
  646.   public void removeListListener(){
  647.     ourServer.listListener = null;
  648.   }
  649.  
  650.   public void startsocket() {
  651.     int port = 100;
  652.     System.out.println("startsocket");
  653.     try {
  654.       statusLine.setText(res.getString("Connecting_"));
  655.       Socket kkSocket =  new Socket(host,port);
  656.       PrintWriter os = new PrintWriter(kkSocket.getOutputStream());
  657.       //DataInputStream is = new DataInputStream(kkSocket.getInputStream());
  658.       BufferedReader is = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
  659.       String fromServer;
  660.       os.println("Hello");
  661.       os.flush();
  662.       if ((fromServer = is.readLine()) != null) {
  663.         System.out.println("CV" +String.valueOf(port) + "Received: " + fromServer);
  664.         port = new Integer(fromServer).intValue();
  665.       }
  666.       os.close();
  667.       is.close();
  668.       kkSocket.close();
  669.       //kkSocket = new Socket("ghamer", port);
  670.       kkSocket = new Socket(host,port);
  671.       ourServer = new ClientListener(this,kkSocket);
  672.       ourServer.start();
  673.       sender = new  ClientSender(kkSocket);
  674.       sender.start();
  675.       pDialog = new LogonDialog(this);
  676.       pDialog.setVisible(true);
  677.     }
  678.     catch (UnknownHostException e) {
  679.       statusLine.setText(res.getString("CONNECTION_ERROR") + e);
  680.       System.err.println(res.getString("UNKNOWN_HOST") + e);
  681.     }
  682.     catch (Exception e) {
  683.       statusLine.setText(res.getString("CONNECTION_ERROR") + e);
  684.       System.err.println("startsocket " + e);
  685.       e.printStackTrace();
  686.     }
  687.   }
  688.  
  689.   public void setModal(boolean value)  {
  690.     doNothing = value;
  691.     //System.out.println("SM Chessboard enable = " + !value);
  692.     theboard.setEnabled(!doNothing);
  693.   }
  694.  
  695.   public void setGameButtons()  {
  696.     int i;
  697.     if (listuse == MOVELIST) {
  698.       navBtn[0].setLabel(res.getString("OFFER_ABORT"));
  699.       navBtn[1].setLabel(res.getString("OFFER_DRAW"));
  700.       navBtn[2].setLabel(res.getString("RESIGN"));
  701.       navBtn[3].setLabel(res.getString("SUSPEND"));
  702.       navBtn[0].setEnabled(true);
  703.       navBtn[1].setEnabled(true);
  704.       navBtn[2].setEnabled(true);
  705.       navBtn[3].setEnabled(true);
  706.       for (i=4;i<8;i++)
  707.         navBtn[i].setVisible(false);
  708.  
  709.     }
  710.     //System.out.println("movecount="+movecount+ " count=" + count);
  711.     if (opponentName != null && listuse != KIBITZ)
  712.       return;
  713.  
  714.     navBtn[0].setEnabled(movecount>0);
  715.     moveSubscript[1] = game.getPreviousSubscript(movecount,color);
  716.     navBtn[1].setEnabled(movecount != 0);
  717.     navBtn[2].setEnabled(movecount<count);
  718.     String message = game.getComment(movecount,color);
  719.     int nxtclr = 0;
  720.     if (color==0)
  721.       nxtclr = 1;
  722.     int initcolor = nxtclr;
  723.  
  724.     int j;
  725.   loops:
  726.     for (i=movecount+color;i<count;i++) { //format the move comment
  727.       for (j=initcolor;j<2;j++) {
  728.         if (game.getMoveNumber(i,j) != 0)
  729.           break loops;
  730.         message = message +  game.getComment(i,j);
  731.       }
  732.       initcolor = 0;
  733.     }
  734.     //infoText.setText(message);  turn on someday when dont need diagnostics
  735.     j = 3;
  736.     boolean moremoves = false;
  737.     for (i=movecount+color;i<=count;i++){ //map the navigation buttons
  738.       if (game.getPreviousSubscript(i,nxtclr) == movecount ||
  739.          (j==3 && game.getMoveNumber(i,nxtclr) != 0)){
  740.           navBtn[j].setLabel(game.getMoveText(i,nxtclr));
  741.         navBtn[j].setVisible(true);
  742.         moremoves = true;
  743.         moveSubscript[j] = i;
  744.         j++;
  745.         if (j > 7)
  746.           break;
  747.       }
  748.     }
  749.     if (moremoves)
  750.       navBtn[3].setEnabled(true); //enable the play button
  751.     else {
  752.       navBtn[3].setLabel(res.getString(">"));
  753.       navBtn[3].setEnabled(false);
  754.       j++;  //never want to hide the play button
  755.     }
  756.     for (i=j;i<8;i++)  //hide the unmapped navigation buttons
  757.       navBtn[i].setVisible(false);
  758.   }
  759.  
  760.   public void tokenMove(String tokenmsg){
  761.     int index = tokenmsg.indexOf(' ');
  762.     int prevsub = Integer.parseInt(tokenmsg.substring(0,index));
  763.     MoveTuple tuple = new MoveTuple(tokenmsg.substring(index+1));
  764.     if (tuple.pieceColor == 0)
  765.       color = 1;
  766.     else
  767.       color = 0;
  768.     movecount = prevsub;
  769.     //    theboard.setPosition(game.getPieceValues(prevsub,color),
  770.     //                   game.getPieceColors(prevsub,color));
  771.     game.setMove(prevsub,color);
  772.     game.moveInfo(tuple,yourColor,false,false);
  773.     updateMoveList();
  774.     System.out.println("tokenMove calling displayPos");
  775.     // displayPos();
  776.   }
  777.  
  778.   void moveInfo()  {
  779.     //System.out.println("moveInfo opponentName=" + opponentName);
  780.     if (listuse == PLAYERLIST || listuse == LIBRARYLIST) {
  781.       listuse = KIBITZ;
  782.       listPanel.setSelectedTab(res.getString("Moves"));
  783.     }
  784.     MoveTuple tuple = theboard.getTuple();
  785.     if (game.moveInfo(tuple,yourColor,opponentName != null,!moveToken  &&  hasListeners)) {
  786.       if (!moveToken  &&  hasListeners) {
  787.           sendMsg("TokenMove",String.valueOf(movecount) + " " + tuple.toString());
  788.           return;
  789.       }
  790.       else {
  791.         updateMoveList();   //will trigger a subfocusChanged which calls displayPos
  792.       }
  793.       //displayPos();
  794.     }
  795.     else {
  796.       //System.out.println("ChessViewer.moveInfo  reason " + game.getReason());
  797.       theboard.setPosition(game.getPieceValues(movecount,color),
  798.                          game.getPieceColors(movecount,color));
  799.       statusLine.setText(game.getReason());
  800.     }
  801.     //displayPos();
  802.     int gameResult = game.isGameOver();
  803.     if (gameResult > 0 && opponentName != null) {
  804.       String msgType = "Resigned";
  805.       String rslt = res.getString("01_Checkmate");
  806.       if (gameResult == 1) {
  807.         if (color == ChessRules.Black)
  808.           rslt = res.getString("10_Checkmate");
  809.       }
  810.       else {
  811.         rslt = res.getString("12_1_2_Stalemate");
  812.         msgType =  "AcceptDraw";
  813.       }
  814.       sendMsg(msgType,rslt);
  815.       statusLine.setText(rslt); //written when resign msg comes back from server
  816.       gameOver(rslt);
  817.     }
  818.   }
  819.  
  820.   // Update movecount & color  to point to the new move
  821.   // If playing someone, punch the clock and send them the move
  822.   void updateMoveList() {
  823.     movecount = game.getLastMoveNumber();
  824.  
  825.     color = game.getWhoMovedLast();
  826.     //System.out.println("lastmoveSub = " + movecount + ",color = " + color);
  827.     String moveString;
  828.     String variation = " ";
  829.     gridControl1.setSubfocus(movecount-1,color + 1);
  830.  
  831.     if (count == movecount)  {
  832.       moveString = Integer.toString(game.getMoveNumber(movecount,color))+
  833.                       ". "+game.getMoveText(movecount,0)+"  "+game.getMoveText(movecount,1);
  834.       moveSubscript[2] = movecount ;
  835.     }
  836.     else {
  837.       int prevsub = game.getPreviousSubscript(movecount,color);
  838.       if (count != prevsub)
  839.         variation = " @" + prevsub + ' ';
  840.       moveString = Integer.toString(game.getMoveNumber(movecount,color))+". "+
  841.       game.getMoveText(movecount,0)+"  "+game.getMoveText(movecount,1);
  842.       moveSubscript[2] = ++count ;
  843.       //count++; //count = newcount;
  844.  
  845.     }
  846.  
  847.     if (clock != null) {
  848.       synchronized (clock) {
  849.         clock.notify();   //punch the clock
  850.       }
  851.     }
  852.     playerTime[color] = playerTime[color] + lMoveTime ;
  853.     if (/*opponentName != null &&*/ hasListeners && sender != null) {
  854.       //System.out.println("Send kibitzers/opponents the move");
  855.       sendMsg("Move",String.valueOf(playerTime[color]) + variation + moveString);
  856.     }
  857.   }
  858.  
  859.   void sendMsg(String msgid,String[] parm) {
  860.     String msg = PersistString.concat(parm);
  861.     sendMsg(msgid,msg);
  862.   }
  863.  
  864.   void sendMsg(String msgid,String msg)  {
  865.     try {
  866.       System.out.println("Sending " + msgid + " " + msg );
  867.       ServerMessage smsg = new ServerMessage(0,msgid,msg);
  868.       if (sender == null )
  869.         System.out.println("sendMsg - sender is null??");
  870.       else {
  871.         synchronized (sender) {
  872.           sender.msgque.addElement(smsg);
  873.           sender.notify();
  874.         }
  875.         if (msgid.equals("Bye") || msgid.equals("Dead"))  {
  876.           System.out.println("sendMsg setting sender to null");
  877.           sender = null;
  878.         }
  879.       }
  880.     }
  881.     catch (Exception e ) {System.out.println("sendMsg " + e); }
  882.   }
  883.  
  884.   public void logonButton() {
  885.     if (loggedon == true) {
  886.       statusLine.setText(res.getString("LOGGED_OFF"));
  887.       logonEnable(false);
  888.       libraryList.removeAll();
  889.       libraryListContents.removeAllElements();
  890.       sendMsg("Bye","");
  891.     }
  892.     else {
  893.       if (pDialog == null)
  894.         startsocket();
  895.       else
  896.         pDialog.okButton.requestFocus();
  897.     }
  898.   }
  899.  
  900.   void chooseGame() {
  901.     String [] gameName = libraryList.getSelectedItems();
  902.     String msg = null;
  903.     if (gameName == null) {
  904.        ImportDlg dlg = new ImportDlg(this,getMoves());
  905.        dlg.setVisible(true);
  906.     }
  907.     else {
  908.     for (int i=0;i<gameName.length;i++) {
  909.        if (libraryHash.containsKey(gameName[i]));
  910.        else
  911.          if (msg == null)
  912.            msg = gameName[i] + "?";
  913.          else
  914.            msg  = msg + gameName[i] + "?";
  915.     }
  916.     if (msg != null)
  917.       sendMsg("GetLibraryGame",msg);
  918.     if (gameName.length == 1)
  919.       showLibraryGame = true;
  920.     else
  921.       showLibraryGame = false;
  922.     if (gameName.length == 1 && msg == null)
  923.        getGame(gameName[0]);
  924.     }
  925.   }
  926.  
  927.   void chooseButton(){
  928.     hasListeners = false;
  929.     if (listuse == PLAYERLIST) {
  930.       String choice = playerList.getSelectedItem();
  931.       int index = playerList.getSelectedIndex();
  932.       if (index == -1) {
  933.         ImportDlg dlg = new ImportDlg(this,getMoves());
  934.         dlg.setVisible(true);
  935.       }
  936.       else {
  937.         String type = "?";
  938.         type = (String) listContents.elementAt(index);
  939.         if (type.equals("G"))
  940.           sendMsg("Resume",String.valueOf(index));
  941.         else
  942.           if (type.equals("P"))
  943.             challenge(choice);
  944.           else
  945.             watch(choice);
  946.       }
  947.     }
  948.     else {
  949.       if (listuse == LIBRARYLIST)
  950.         chooseGame();
  951.       else
  952.         if (listuse == KIBITZ) {
  953.           ImportDlg dlg = new ImportDlg(this,getMoves());
  954.           dlg.setVisible(true);
  955.         }
  956.         else {
  957.           sbChoose.setEnabled(false);
  958.           System.out.println("Choose button was enabled when it shouldn't be");
  959.         }
  960.     }
  961.   }
  962.  
  963.   String getMoves() {
  964.      //StringBuffer moves = new StringBuffer("[White \"" + game.getPlayerW() + "\"]" + "[Black \"" + game.getPlayerB() + "\"]\n");
  965.      StringBuffer moves = new StringBuffer(game.getTags());
  966.      //int max = moveList.getItemCount();
  967.      int max = game.getRowCount();
  968.      int count = 0;
  969.      String movePair;
  970.      for (int i= 1;i <= max; i++) {
  971.        //movePair = moveList.getItem(i);
  972.        movePair = " " + game.getMoveNumber(i,0) + ". " + game.getMoveText(i,0) + " " + game.getMoveText(i,1);
  973.        count = count + movePair.length() + 1;
  974.        if (count > 64)  {
  975.          moves.append("\n" + movePair);
  976.          count = movePair.length() ;
  977.        }
  978.        else
  979.          moves.append(movePair);
  980.      }
  981.      return moves.toString();
  982.   }
  983.  
  984.   void getInfo(String linedata){
  985.     sbChoose.setEnabled(true);
  986.     String user = linedata.substring(0,linedata.lastIndexOf(' '));
  987.     if (user.equals(myName))
  988.       sbChoose.setLabel(res.getString("UPDATE"));
  989.     else {
  990.       sendMsg("Info",user);
  991.       sbChoose.setLabel(res.getString("CHALLENGE"));
  992.     }
  993.   }
  994.  
  995.   void challenge(String linedata) {
  996.     //strip off rating
  997.     challenger = linedata.substring(0,linedata.lastIndexOf(' '));
  998.     if (challenger.equals(myName))
  999.       sendMsg("Information",challenger);
  1000.     else {
  1001.       try {
  1002.         String[] parm = new String[3];
  1003.         parm[0] = gameTime.getText();
  1004.         System.out.println("Challenge " + challenger + " " +  parm[0]) ;
  1005.         gameTimeValue = Integer.parseInt(parm[0]);
  1006.         parm[1] =  moveTime.getText();
  1007.         lMoveTime = Long.parseLong(parm[1]) * 1000;
  1008.         parm[2] = challenger;
  1009.         //String l =  gt +" " + mt +" " + challenger;
  1010.         playerTime[0] = gameTimeValue * 60000;
  1011.         playerTime[1] = playerTime[0];
  1012.         sendMsg("Challenge",PersistString.concat(parm));
  1013.  
  1014.       }
  1015.       catch (NumberFormatException e){
  1016.         statusLine.setText(res.getString("TIME_CONTROL_FIELDS"));
  1017.       }
  1018.     }
  1019.   }
  1020.  
  1021.   void importGame(String gamePGN) {
  1022.     System.out.println("imported game = " + gamePGN);
  1023.     if (gamePGN == null || gamePGN.length() < 20)
  1024.        statusLine.setText(res.getString("PASTE_AND_THEN") );
  1025.     else {
  1026.       importCount++;
  1027.       String name = res.getString("IMPORTEDGAME") + importCount;
  1028.       libraryHash.put(name,gamePGN);
  1029.       getGame(name);
  1030.     }
  1031.   }
  1032.  
  1033.   void boardOptionsDialog() {
  1034.     try {
  1035.       URL[] imageName = new URL[pieceGif.size()];
  1036.       URL currentImage = theboard.getImageURL();
  1037.       //System.out.println("image array size = " + imageName.length);
  1038.       for (int i= 0;i< pieceGif.size();i++) {
  1039.         imageName[i]  = (URL)pieceGif.elementAt(i);
  1040.         //System.out.println("image " + i + "=" + imageName[i].toString());
  1041.         if (currentImage.sameFile(imageName[i]) && i > 0){
  1042.           imageName[i] = imageName[0];
  1043.           imageName[0] = currentImage;
  1044.         }
  1045.       }
  1046.       //System.out.println("ready to call BoardOptions xtor");
  1047.       BoardOptions dlg;
  1048.       dlg = new BoardOptions(this,f,imageName,theboard);
  1049.         
  1050.       System.out.println("back from xtor");
  1051.       Point y = listPanel.getLocation();
  1052.       //Point x = ep.location();
  1053.       dlg.setLocation(0,y.y);
  1054.       dlg.pack();
  1055.       dlg.setVisible(true);
  1056.       System.out.println("back from show");
  1057.     }
  1058.     catch (Exception e) {System.out.println("BoardOptionsDialog " + e); e.printStackTrace(); }
  1059.   }
  1060.  
  1061.   public void otherAction(ActionEvent evt) {
  1062.     if (doNothing) //fake modal dialog on the loose
  1063.        return ;
  1064.     if (evt.getSource().equals(optionsButton))
  1065.        boardOptionsDialog();
  1066.     else if (evt.getSource().equals(sbLogon))
  1067.       logonButton();
  1068.     else if (evt.getSource().equals(chatText))  {
  1069.       sendMsg("Chat",myName + ":" + chatText.getText()) ;
  1070.       chatText.setText("");
  1071.     }
  1072.     else if (evt.getSource().equals(sbChoose))
  1073.       chooseButton();
  1074.   }
  1075.  
  1076.   void boardButtonAction(ActionEvent evt) {
  1077.     if (doNothing) //fake modal dialog on the loose
  1078.        return ;
  1079.     if (listuse == MOVELIST)
  1080.       gameButtons(evt);
  1081.     else
  1082.       navigationButtons(evt);
  1083.   }
  1084.  
  1085.   void getLibraryList() {
  1086.     listuse = LIBRARYLIST;
  1087.     sbChoose.setLabel(res.getString("COPY_PASTE"));
  1088.     if (loggedon) {
  1089.       if (libraryList.getItemCount()==0)
  1090.         sendMsg("LibraryList","") ;
  1091.       else
  1092.         setListButtons(ChessViewer.LIBRARYLIST);
  1093.     }
  1094.     else  {
  1095.       if (libraryList.getItemCount()==0) {
  1096.         libraryListContents.removeAllElements();
  1097.         for (Enumeration e = libraryHash.keys();e.hasMoreElements();) {
  1098.           String gameName = (String) e.nextElement() ;
  1099.           libraryList.addItem(gameName);
  1100.           libraryListContents.addElement("L");
  1101.         }
  1102.       }
  1103.       setListButtons(ChessViewer.LIBRARYLIST);
  1104.     }
  1105.   }
  1106.  
  1107.   void gameButtons(ActionEvent evt) {
  1108.     if (evt.getSource().equals(navBtn[0])) {
  1109.       navBtn[0].setEnabled(false);
  1110.       sendMsg("OfferAbort","") ;
  1111.       statusLine.setText(res.getString("ABORT_OFFERED_TO") + opponentName);
  1112.     }
  1113.     else
  1114.     if (evt.getSource().equals(navBtn[1])) {
  1115.       navBtn[1].setEnabled(false);
  1116.       if (game.claimDraw()) {
  1117.         sendMsg("AcceptDraw"," 1/2-1/2 " + game.getReason() )   ;
  1118.         gameOver("1/2-1/2");
  1119.       }
  1120.       else {
  1121.         sendMsg("OfferDraw","") ;
  1122.         statusLine.setText(res.getString("DRAW_OFFERED_TO") +opponentName);
  1123.       }
  1124.     }
  1125.     else
  1126.     if (evt.getSource().equals(navBtn[2])) {
  1127.       statusLine.setText(res.getString("GAME_OVER"));
  1128.       String result = "1-0 ";
  1129.       if (yourColor == ChessRules.White)
  1130.         result = "0-1 ";
  1131.       game.setComment(movecount,color,result);
  1132.       displayPos();
  1133.       gameOver(result);
  1134.       sendMsg("Resigned",result + myName + res.getString("RESIGNED")) ;
  1135.     }
  1136.     else
  1137.     if (evt.getSource().equals(navBtn[3])) {
  1138.       statusLine.setText(res.getString("GAME_SUSPENDED"));
  1139.       gameOver();
  1140.       hasListeners = false;
  1141.       sendMsg("Suspend","") ;
  1142.     }
  1143.   }
  1144.  
  1145.   public void navigationButtons(ActionEvent evt) {
  1146.     for (int i=0; i< 8;i++) {
  1147.       if (evt.getSource().equals(navBtn[i])) {
  1148.         movecount = moveSubscript[i] ;
  1149.         if (navBtn[i].getLabel() == res.getString("END_OF_GAME")) {
  1150.           color = game.getMoveNumber(movecount, ChessRules.Black) == 0 ?
  1151.                   ChessRules.White : ChessRules.Black;
  1152.         }
  1153.         else if (color==0)
  1154.           color = 1;
  1155.         else
  1156.           if (movecount != 0)  //initial position is Move(0,1)
  1157.             color = 0;
  1158.           break;
  1159.       }
  1160.     }
  1161.  
  1162.     // Note that calling setSubfocus will also invoke the
  1163.     // 'callback' associated with clicking the grid cell of
  1164.     // interest.
  1165.     int subfocusRow, subfocusCol;
  1166.     if (movecount > 0) {
  1167.       // typical case
  1168.       subfocusRow = movecount-1;
  1169.       subfocusCol = color + 1;
  1170.     }
  1171.     else {
  1172.       // initial case, before the game begins
  1173.       movecount = 0;  // just to make sure
  1174.       color = ChessRules.Black;
  1175.       subfocusRow = 0;
  1176.       subfocusCol = 0;
  1177.     }
  1178.     System.err.println("set subfocus to " +
  1179.       subfocusRow + "," + subfocusCol );
  1180.     gridControl1.setSubfocus(subfocusRow, subfocusCol);
  1181.  
  1182.     //displayPos();
  1183.     if (listuse == PLAYERLIST || listuse == LIBRARYLIST) {
  1184.       listuse = KIBITZ;
  1185.       listPanel.setSelectedTab(res.getString("Moves"));
  1186.     }
  1187.   }
  1188.  
  1189.   public void setNames() {
  1190.     //System.out.println("PlayerB="+game.getPlayerB()+" PlayerW="+game.getPlayerW()+" myName="+myName);
  1191.     if (game.getPlayerB().equals(myName)) {
  1192.       if (blackOnTop)
  1193.         switchSides();
  1194.       else {
  1195.         bottomName.setText(game.getPlayerB());
  1196.         topName.setText(game.getPlayerW());
  1197.         bottomTime.setText(formatTime(playerTime[1]));
  1198.         topTime.setText(formatTime(playerTime[0]));
  1199.       }
  1200.     }
  1201.     else {
  1202.       if (!blackOnTop)
  1203.         switchSides();
  1204.       else {
  1205.         bottomName.setText(game.getPlayerW());
  1206.         topName.setText(game.getPlayerB());
  1207.         bottomTime.setText(formatTime(playerTime[0]));
  1208.         topTime.setText(formatTime(playerTime[1]));
  1209.       }
  1210.     }
  1211.   }
  1212.  
  1213.   void newGame(String white,String black) {
  1214.     game.init();
  1215.     game.setPlayerW(white);
  1216.     game.setPlayerB(black);
  1217.     setNames();
  1218.     movecount = 0;
  1219.     color = ChessRules.Black;
  1220.     count =  0;
  1221.     setListButtons(MOVELIST);
  1222.     moveToken = true;
  1223.     if (opponentName != null)    {
  1224.       hasListeners = true;
  1225.       gameTime.setEnabled(false);
  1226.       moveTime.setEnabled(false);
  1227.       gridControl1.setEnabled(false);
  1228.     }
  1229.     else                                       {
  1230.       //System.out.println("NG chessboard enabled");
  1231.       theboard.setEnabled(true);
  1232.     }
  1233.     displayPos();
  1234.     gameTime.setText(String.valueOf(gameTimeValue));
  1235.     moveTime.setText(String.valueOf(lMoveTime/1000));
  1236.  
  1237.     try {
  1238.     if (clock != null)
  1239.       clock.stop();
  1240.     clock = new Thread(this);
  1241.     clock.start();
  1242.     }
  1243.     catch (Exception e) {
  1244.       e.printStackTrace();
  1245.     }
  1246.   }
  1247.  
  1248.   void displayPos()  {
  1249.     if (count > 0 && movecount == count && game.getMoveNumber(movecount,color) == 0)
  1250.       color = 0; //don't step off the end
  1251.     game.setMove(movecount,color);
  1252.     //System.out.println("CV displayPos "+ movecount + "," + color);
  1253.     subroutine = "setPosition";
  1254.     theboard.setPosition(game.getPieceValues(movecount,color),
  1255.                          game.getPieceColors(movecount,color));
  1256.     subroutine = "DisplayPosition";
  1257.     if (listuse == MOVELIST){
  1258.       if (yourColor == color)
  1259.         statusLine.setText(res.getString("WAITING_ON_YOUR"));
  1260.       else
  1261.         statusLine.setText(res.getString("YOUR_MOVE"));
  1262.     }
  1263.     else
  1264.       if (color == ChessRules.Black)
  1265.         statusLine.setText(res.getString("WHITE_TO_MOVE"));
  1266.       else
  1267.         if (color == ChessRules.White)
  1268.           statusLine.setText(res.getString("BLACK_TO_MOVE"));
  1269.         else
  1270.           statusLine.setText(res.getString("Color_")+String.valueOf(color)+"?");
  1271.     setGameButtons();
  1272.   }
  1273.  
  1274.   //the browser is no longer displaying the applet. Let's be nice
  1275.   //and end our chessclock thread if it is running
  1276.   public void stop() {
  1277.     System.out.println("ChessViewer.stop called");
  1278.     if (clock != null) {
  1279.       if (yourColor == 0)
  1280.          opponentsTimeWhenStopped = playerTime[1];
  1281.       else
  1282.          opponentsTimeWhenStopped = playerTime[0];
  1283.       timerWasStopped = true;
  1284.       timeStopped =  System.currentTimeMillis();
  1285.       clock.stop();
  1286.     }
  1287.     clock = null;
  1288.   }
  1289.  
  1290.   //The browser is displaying the applet again. re-start the
  1291.   //chessclock if it was running when the applet was last stopped.
  1292.   public void start() {
  1293.     System.out.println("ChessViewer.start called");
  1294.  
  1295.     long opponentsTimeUsed;
  1296.     long timeAway;
  1297.     if (timerWasStopped) {
  1298.       try {
  1299.         int oppColor = 0;
  1300.         if (yourColor == 0)
  1301.           oppColor = 1;
  1302.         opponentsTimeUsed = opponentsTimeWhenStopped - playerTime[oppColor];
  1303.         timeAway = System.currentTimeMillis() - timeStopped;
  1304.         if (opponentsTimeUsed == 0) {
  1305.           if (color == yourColor)
  1306.             playerTime[oppColor] = playerTime[oppColor] - timeAway;
  1307.           else
  1308.             playerTime[yourColor] = playerTime[yourColor] - timeAway;
  1309.         }
  1310.         else
  1311.           playerTime[yourColor] =  playerTime[yourColor] - timeAway - lMoveTime + opponentsTimeUsed;
  1312.         clock = new Thread(this);
  1313.         clock.start();
  1314.       }
  1315.       catch (Exception e) {
  1316.         e.printStackTrace();
  1317.       }
  1318.     }
  1319.     timerWasStopped = false;
  1320.   }
  1321.  
  1322.   //run gets called whenever a thread gets started
  1323.   public void run() {
  1324.     try{
  1325.       if (threadFlag)  {
  1326.         threadFlag = false;
  1327.        theboard.setImageURL((URL) pieceGif.elementAt(0));
  1328.         validate();
  1329.         repaint();
  1330.         return;
  1331.       }
  1332.       //System.out.println("ChessViewer.run  clock started");
  1333.       clock.setPriority(Thread.MIN_PRIORITY);
  1334.       long time = System.currentTimeMillis();
  1335.       long nexttime;
  1336.       int OnMove = ChessRules.White;
  1337.       if (color == ChessRules.White)
  1338.         OnMove = ChessRules.Black;
  1339.       boolean enableSuspend = true;
  1340.       if (OnMove == yourColor)
  1341.         enableSuspend = false;
  1342.       navBtn[3].setEnabled(enableSuspend);
  1343.       synchronized (clock) {
  1344.         while (true) {
  1345.           try  {
  1346.             clock.wait(1000);
  1347.           }
  1348.           catch (InterruptedException e) {}
  1349.           if (!(OnMove == yourColor ^ enableSuspend))   {
  1350.             enableSuspend = !enableSuspend;
  1351.             navBtn[3].setEnabled(enableSuspend);
  1352.           }
  1353.           nexttime =  System.currentTimeMillis();
  1354.           playerTime[OnMove] = playerTime[OnMove] + time - nexttime ;
  1355.           time = nexttime;
  1356.           if (playerTime[OnMove] < 0) {
  1357.             String rslt = res.getString("BLACK_LOST_ON_TIME");
  1358.             if (OnMove == ChessRules.White)
  1359.               rslt = res.getString("WHITE_LOST_ON_TIME");
  1360.             if (OnMove == yourColor) {
  1361.               sendMsg("Resigned",rslt);
  1362.               //statusLine.setText(rslt);  status given when msg comes back from server
  1363.               gameOver(rslt);
  1364.             }
  1365.           }
  1366.           if (OnMove == 1 && blackOnTop || OnMove == 0 && !blackOnTop)
  1367.             topTime.setText(formatTime(playerTime[OnMove]));
  1368.           else
  1369.             bottomTime.setText(formatTime(playerTime[OnMove]));
  1370.           if (color == ChessRules.White)
  1371.             OnMove = ChessRules.Black;
  1372.           else
  1373.             OnMove = ChessRules.White;
  1374.         }
  1375.       }
  1376.     }
  1377.     catch (ThreadDeath e) {
  1378.       System.out.println("ChessViewer.run died");
  1379.       throw e;
  1380.     }
  1381.   }
  1382.  
  1383.   String formatTime(long milliseconds) {
  1384.     String time;
  1385.     if (milliseconds < 0 )
  1386.       milliseconds = 0;
  1387.     long seconds = milliseconds / 1000;
  1388.     long minutes =  seconds / 60;
  1389.     long hours = minutes / 60;
  1390.     seconds = seconds - (60  * minutes);
  1391.     minutes = minutes - (60 * hours);
  1392.     String sec;
  1393.     String min;
  1394.     if (seconds < 10)
  1395.       sec = "0" + seconds;
  1396.     else
  1397.       sec = String.valueOf(seconds);
  1398.     if (minutes < 10)
  1399.       min = "0" + minutes;
  1400.     else
  1401.       min = String.valueOf(minutes);
  1402.     //if (hours != 0 || minutes > 9)
  1403.       time = String.valueOf(hours) + ":" + min;
  1404.     //else
  1405.     //  time = min + ":" + sec;
  1406.     if (hours != 0 )
  1407.       time = String.valueOf(hours) + ":" + min + ":" + sec;
  1408.     else
  1409.       time = min + ":" + sec;
  1410.     return time;
  1411.   }
  1412.  
  1413.   void fillList(String msg) {
  1414.     //System.out.println("CV processing List");
  1415.     int index = 0;
  1416.     int oldindex = 0;
  1417.     int matchchar = '?';
  1418.     String newname;
  1419.  
  1420.     List c = playerList;
  1421.     Vector v = listContents;
  1422.     if (listuse == LIBRARYLIST) {
  1423.       c = libraryList;
  1424.       v = libraryListContents;
  1425.     }
  1426.     c.removeAll();
  1427.     v.removeAllElements();
  1428.     if (msg != null) {
  1429.       while (index != -1)  {
  1430.         index = msg.indexOf(matchchar,oldindex);
  1431.         if (index != -1) {
  1432.           v.addElement(msg.substring(oldindex,oldindex+1));
  1433.           newname = msg.substring(oldindex+1,index);
  1434.           oldindex = index +1;
  1435.       c.addItem(newname);
  1436.         }
  1437.       }
  1438.     }
  1439.     else
  1440.       c.setVisible(true);
  1441.   }
  1442.  
  1443.   //always add to the end of the array (count is the size of the array)
  1444.   //don't assume the new move comes after the last move
  1445.   //in kibitz mode the board position can be altered to somewhere in the middle
  1446.   void addMove(String movemsg) {
  1447.     //System.out.println("ChessViewer.addMove " + movemsg);
  1448.     int timeIndex = movemsg.indexOf(' ');
  1449.     String time = movemsg.substring(0,timeIndex);
  1450.     long timeremaining = 0;
  1451.     try {
  1452.       timeremaining = Long.parseLong(time);
  1453.     }
  1454.     catch (NumberFormatException e) {
  1455.       System.out.println (time + " is not a number");
  1456.     }
  1457.     int varindex = movemsg.indexOf('@');
  1458.     if (opponentName == null)
  1459.       movecount = count;
  1460.     int prevsub = movecount;
  1461.     if (varindex > timeIndex){
  1462.       timeIndex = movemsg.indexOf(' ',varindex+1);
  1463.       try {
  1464.         prevsub = Integer.parseInt(movemsg.substring(varindex+1,timeIndex));
  1465.       }
  1466.       catch (NumberFormatException e) {
  1467.         System.out.println("could not read variation subscript in " + movemsg) ;
  1468.       }
  1469.     }
  1470.     String movetxt = movemsg.substring(timeIndex + 1);
  1471.     String sMovenum;
  1472.     int spaceindex = movetxt.indexOf('.');
  1473.     sMovenum = movetxt.substring(0,spaceindex);
  1474.     int movenum = Integer.parseInt(sMovenum);
  1475.     spaceindex++;
  1476.     int index = movetxt.indexOf('_');
  1477.     int temp = 0;
  1478.     if (index > 0)
  1479.       temp = movetxt.indexOf(' ',index);
  1480.     //System.out.println("found _ at " + index);
  1481.     //int clr = Chessboard.WhitePiece;
  1482.     int clrsub = ChessRules.White;
  1483.     String moveNotation ;
  1484.     if (index > 0) {      //new line in listbox needed
  1485.       if (prevsub == movecount)
  1486.         prevsub++;
  1487.       movecount++;
  1488.     }
  1489.     if (index > 0 && index > temp) {     //whites move
  1490.       playerTime[0] = timeremaining;
  1491.       if (blackOnTop)
  1492.         bottomTime.setText(formatTime(timeremaining));
  1493.       else
  1494.         topTime.setText(formatTime(timeremaining));
  1495.       //System.out.println("White move  " + movetxt+ index);
  1496.       clrsub = ChessRules.White;
  1497.       moveNotation = movetxt.substring(spaceindex+1,movetxt.lastIndexOf(' '));
  1498.     }
  1499.     else {
  1500.       playerTime[1] = timeremaining;
  1501.       if (blackOnTop)
  1502.         topTime.setText(formatTime(timeremaining));
  1503.       else
  1504.         bottomTime.setText(formatTime(timeremaining));
  1505.       clrsub = ChessRules.Black;
  1506.       moveNotation = movetxt.substring(movetxt.lastIndexOf(' '));
  1507.     }
  1508.     //System.out.println("move is " + Move[movecount][clrsub].Movetxt +
  1509.     //               "; movenum is " + String.valueOf(movenum) +
  1510.     //               "; color=" + String.valueOf(clrsub));
  1511.     game.addMove(movecount,clrsub,moveNotation,movenum,prevsub);
  1512.     gridControl1.setSubfocus(movecount-1,clrsub + 1);
  1513.     color = clrsub;
  1514.     if (clock != null)
  1515.       synchronized (clock) {
  1516.         clock.notify();   //time to punch the chess clock
  1517.       }
  1518.     count = movecount;
  1519.     //displayPos();
  1520.   }
  1521.  
  1522.   void switchSides() {
  1523.     blackOnTop = theboard.switchOrientation();
  1524.     if (blackOnTop) {
  1525.       bottomName.setText(game.getPlayerW());
  1526.       topName.setText(game.getPlayerB());
  1527.       topTime.setText(formatTime(playerTime[1]));
  1528.       bottomTime.setText(formatTime(playerTime[0]));
  1529.     }
  1530.     else {
  1531.       bottomName.setText(game.getPlayerB());
  1532.       topName.setText(game.getPlayerW());
  1533.       topTime.setText(formatTime(playerTime[0]));
  1534.       bottomTime.setText(formatTime(playerTime[1]));
  1535.     }
  1536.   }
  1537.  
  1538.   public void setListButtons(int use)  {
  1539.     listuse = use;
  1540.     switch (use) {
  1541.       case MOVELIST:
  1542.           sbChoose.setEnabled(false);
  1543.         listPanel.setSelectedTab(res.getString("Moves"));
  1544.         break;
  1545.       case PLAYERLIST:
  1546.           sbChoose.setEnabled(true);
  1547.         sbChoose.setLabel(res.getString("COPY_PASTE"));
  1548.         break;
  1549.       case LIBRARYLIST:
  1550.           sbChoose.setEnabled(true);
  1551.         sbChoose.setLabel(res.getString("VIEW"));
  1552.         System.out.println("show library list");
  1553.         break;
  1554.       case KIBITZ:
  1555.         sbChoose.setEnabled(true);
  1556.         sbChoose.setLabel(res.getString("COPY_PASTE"));
  1557.         navBtn[0].setLabel(res.getString("BEGINNING_OF_GAME"));
  1558.         navBtn[1].setLabel(res.getString("BACK_ONE_MOVE"));
  1559.         navBtn[3].setLabel(res.getString("FORWARD_ONE_MOVE"));
  1560.         navBtn[2].setLabel(res.getString("END_OF_GAME"));
  1561.         setGameButtons();
  1562.      }
  1563.   }
  1564.  
  1565.   void gameOver(String result) {
  1566.     game.setResult(result);
  1567.     System.out.println("setResult " + result);
  1568.     gameOver();
  1569.   }
  1570.  
  1571.   void gameOver() {
  1572.     setListButtons(ChessViewer.KIBITZ);
  1573.     gameTime.setEnabled(true);
  1574.     moveTime.setEnabled(true);
  1575.     gridControl1.setEnabled(true);
  1576.     opponentName = null;
  1577.     if (clock != null)
  1578.       clock.stop();
  1579.     timerWasStopped = false;
  1580.     clock = null;
  1581.     if (yourColor == ChessRules.Black)
  1582.       moveToken = false;
  1583.   }
  1584.  
  1585.   public void watch(String gameName) {
  1586.     int index =  gameName.lastIndexOf(':');
  1587.     if (index > 0)                                      
  1588.       sendMsg("Watching",gameName.substring(0,index));
  1589.     else {
  1590.       infoText.setText(res.getString("Cannot_find_game"));
  1591.       System.out.println("Cannot find game " + gameName);
  1592.     }
  1593.   }
  1594.  
  1595.   void getGame(String name) {
  1596.     String gamePGN = (String) libraryHash.get(name) ;
  1597.     try {
  1598.       game.parsePGNFile (new StringReader(gamePGN));
  1599.       infoText.setText(game.getInfo());
  1600.     }
  1601.     catch (Exception e) {}
  1602.     setNames();
  1603.     fillMoveList();
  1604.     movecount = 1;
  1605.     color = 0;
  1606.     setListButtons(ChessViewer.KIBITZ) ;
  1607.     listPanel.setSelectedTab(res.getString("Moves"));
  1608.     setGameButtons();
  1609.     hasListeners = false;
  1610.     displayPos();
  1611.     //System.out.println("ML chessboard enabled");
  1612.     theboard.setEnabled(true);
  1613.     moveToken = true;
  1614.   }
  1615.  
  1616.   public void playerListEvent(AWTEvent evt) {
  1617.     if (doNothing) //fake modal dialog on the loose
  1618.       return ;
  1619.     String listContent = "?";
  1620.     //System.out.println("handling event for list c");
  1621.     int selectedIndex = playerList.getSelectedIndex();
  1622.     //System.out.println("listuse = " + listuse);
  1623.     //System.out.println("listuse = PLAYERLIST");
  1624.     if (selectedIndex >= 0)
  1625.       listContent = (String)listContents.elementAt(selectedIndex);
  1626.     if (listContent.equals("P")) {
  1627.       if (evt.getID() == Event.ACTION_EVENT)
  1628.         challenge(playerList.getSelectedItem());
  1629.       else
  1630.         if (evt.getID() == Event.LIST_SELECT){
  1631.           getInfo(playerList.getSelectedItem());
  1632.         }
  1633.         else
  1634.           if (evt.getID() == Event.LIST_DESELECT)
  1635.             sbChoose.setLabel(res.getString("COPY_PASTE"));
  1636.         }
  1637.         else
  1638.         if (listContent.equals("A")) {
  1639.           if (evt.getID() == Event.ACTION_EVENT)
  1640.             watch(playerList.getSelectedItem());
  1641.         else {
  1642.           sbChoose.setEnabled(true);
  1643.           sbChoose.setLabel(res.getString("OBSERVE"));
  1644.         }
  1645.     }
  1646.     else  {
  1647.       if (listContent.equals("G")) {
  1648.         if (evt.getID() == Event.ACTION_EVENT)
  1649.           sendMsg("Resume",String.valueOf(selectedIndex));
  1650.         else  {
  1651.           sbChoose.setEnabled(true);
  1652.           sbChoose.setLabel(res.getString("RESUME"));
  1653.         }
  1654.       }
  1655.     }
  1656.   }
  1657.  
  1658.   void libraryListEvent(AWTEvent evt) {
  1659.     //System.out.println("Gamelist handle");
  1660.     if (doNothing) //fake modal dialog on the loose
  1661.        return ;
  1662.     if (evt.getID() == Event.ACTION_EVENT)
  1663.       chooseGame();
  1664.     else {
  1665.       int [] selItems = libraryList.getSelectedIndexes();//returns null if multiple selections are not enabled
  1666.       if (selItems == null) {
  1667.         selItems = new int[1]  ;
  1668.         selItems[0] = libraryList.getSelectedIndex();
  1669.       }
  1670.       if (selItems.length == 0)
  1671.         sbChoose.setLabel(res.getString("COPY_PASTE"));
  1672.       else {
  1673.         if (selItems.length == 1)
  1674.           sbChoose.setLabel(res.getString("VIEW"));
  1675.         else
  1676.           sbChoose.setLabel(res.getString("GET"));
  1677.       }
  1678.     }
  1679.   }
  1680.  
  1681.   public static Frame getFrame(Component theComponent) {
  1682.     Component currParent = theComponent;
  1683.     Frame theFrame = null;
  1684.     while (currParent != null)  {
  1685.       if (currParent instanceof Frame){
  1686.         theFrame = (Frame) currParent;
  1687.         break;
  1688.       }
  1689.       currParent = currParent.getParent();
  1690.     }
  1691.     return theFrame;
  1692.   }
  1693.  
  1694.   void gridControl1_subfocusChanged(borland.jbcl.model.MatrixSubfocusEvent e) {
  1695.     if (doNothing) {//fake modal dialog on the loose
  1696.       //System.out.println("do nothing");
  1697.       return ;
  1698.     }
  1699.     if (listuse == MOVELIST || listuse == KIBITZ) {
  1700.       MatrixLocation  test = e.getLocation();
  1701.       if (test != null) {
  1702.         if (test.column < 2)
  1703.           color = 0;
  1704.         else
  1705.           color = 1;
  1706.         if (test.row == 0 && test.column == 0) {
  1707.           // if the very first grid cell is clicked, then go to
  1708.           // initial condition (movecount = 0, color = 1)
  1709.           movecount = 0;
  1710.           color = 1;
  1711.         }
  1712.         else if (test.row >= 0)
  1713.              movecount = test.row+1;
  1714.         //System.out.println("Display cell " + test.row +", "+ test.column);
  1715.         displayPos();
  1716.       }
  1717.     }
  1718.  
  1719.   }
  1720.  
  1721.   void listPanel_subfocusChanging(borland.jbcl.model.VectorSubfocusEvent e) throws VetoException{
  1722.     System.out.println("tabset panel subfocus changing " + e.getLocation());
  1723.     if (listuse == MOVELIST)
  1724.     if (e.getLocation() != MOVELIST && opponentName != null)
  1725.       throw new VetoException() ;
  1726.     else
  1727.       return;
  1728.     if (e.getLocation() == PLAYERLIST) {
  1729.       listuse = PLAYERLIST;
  1730.       sendMsg("List","") ;
  1731.     }
  1732.     else if (e.getLocation() == LIBRARYLIST){
  1733.         listuse = LIBRARYLIST;
  1734.         if (libraryListContents.size() == 0)
  1735.           getLibraryList();
  1736.     }
  1737.     else
  1738.       listuse = KIBITZ;
  1739.    setListButtons(listuse);
  1740.  
  1741.   }
  1742. } //end of class ChessViewer
  1743.  
  1744. class ChessboardAdapt implements ActionListener
  1745. {
  1746.   ChessViewer adaptee;
  1747.   public void actionPerformed(ActionEvent e) {adaptee.moveInfo();}
  1748.   ChessboardAdapt(ChessViewer adaptee) {this.adaptee = adaptee;}
  1749. }
  1750.  
  1751. class OtherActionAdapter implements ActionListener
  1752. {
  1753.   ChessViewer adaptee;
  1754.   public void actionPerformed(ActionEvent e) {adaptee.otherAction(e);}
  1755.   OtherActionAdapter(ChessViewer adaptee) {this.adaptee = adaptee;}
  1756. }
  1757.  
  1758. class BoardButtonActionAdapter implements ActionListener
  1759. {
  1760.   ChessViewer adaptee;
  1761.   public void actionPerformed(ActionEvent e) {adaptee.boardButtonAction(e);}
  1762.   BoardButtonActionAdapter(ChessViewer adaptee) {this.adaptee = adaptee;}
  1763. }
  1764.  
  1765. class PlayerListAdapter implements ActionListener,ItemListener
  1766. {
  1767.   ChessViewer adaptee;
  1768.   PlayerListAdapter(ChessViewer adaptee) {this.adaptee = adaptee;}
  1769.   public void actionPerformed(ActionEvent e) {adaptee.playerListEvent(e);}
  1770.   public void itemStateChanged(ItemEvent e)  {adaptee.playerListEvent(e);}
  1771. }
  1772.  
  1773. class LibraryListAdapter implements ActionListener,ItemListener
  1774. {
  1775.   ChessViewer adaptee;
  1776.   LibraryListAdapter(ChessViewer adaptee) {this.adaptee = adaptee;}
  1777.    public void actionPerformed(ActionEvent e) {adaptee.libraryListEvent(e);}
  1778.    public void itemStateChanged(ItemEvent e)  {adaptee.libraryListEvent(e);}
  1779. }
  1780.  
  1781. class ChessViewer_gridControl1_SubfocusAdapter extends MatrixSubfocusAdapter
  1782. {
  1783.   ChessViewer adaptee;
  1784.   ChessViewer_gridControl1_SubfocusAdapter(ChessViewer adaptee) {
  1785.     this.adaptee = adaptee;
  1786.   }
  1787.   public void subfocusChanged(borland.jbcl.model.MatrixSubfocusEvent e) {
  1788.     adaptee.gridControl1_subfocusChanged(e);
  1789.   }
  1790. }
  1791.  
  1792. class ChessViewer_listPanel_SubfocusAdapter extends VectorSubfocusAdapter
  1793. {
  1794.   ChessViewer adaptee;
  1795.   ChessViewer_listPanel_SubfocusAdapter(ChessViewer adaptee) {
  1796.     this.adaptee = adaptee;
  1797.   }
  1798.  
  1799.   public void subfocusChanging(borland.jbcl.model.VectorSubfocusEvent e) throws VetoException {
  1800.     adaptee.listPanel_subfocusChanging(e);
  1801.   }
  1802. }
  1803.  
  1804. //simple class that does double duty as the
  1805. //grids columnheader viewmanager and model
  1806. class GC_ColumnHeaderManager implements VectorViewManager, VectorModel
  1807. {
  1808.   public GC_ColumnHeaderManager(ColumnView[] columns) {
  1809.     this.columns = columns;
  1810.   }
  1811.  
  1812.   public Object get(int index) {
  1813.     String caption = columns[index].getCaption();
  1814.     if (caption == null)
  1815.       caption =  String.valueOf(index);
  1816.     return caption;
  1817.   }
  1818.  
  1819.   public ItemPainter getPainter(int index, Object data, int state) { return painter; }
  1820.   public ItemEditor getEditor(int index, Object data, int state) { return null; }
  1821.   public int find(Object data) { return -1; }
  1822.   public int getCount() { return columns.length; }
  1823.   public void addModelListener(VectorModelListener listener) { modelListeners.add(listener); }
  1824.   public void removeModelListener(VectorModelListener listener) { modelListeners.remove(listener); }
  1825.  
  1826.   private borland.jbcl.util.EventMulticaster modelListeners = new borland.jbcl.util.EventMulticaster();
  1827.   private ColumnView[] columns;
  1828.   private ItemPainter painter = new TextItemPainter(Alignment.CENTER | Alignment.MIDDLE, new Insets(0,2,0,2));
  1829. }
  1830.