⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jchatroom.java

📁 Vyger offers a D & D and Rogue-like environment in a graphical online roleplay game.
💻 JAVA
字号:
/*
 * Light And Shadow. A Persistent Universe based on Robert Jordan's Wheel of Time Books.
 * Copyright (C) 2001-2002 WOTLAS Team
 *
 * 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.
 */

package wotlas.client.screen;

import wotlas.client.*;

import wotlas.common.chat.ChatRoom;
import wotlas.common.Player;
import wotlas.common.PlayerState;

import wotlas.libs.log.*;

import wotlas.utils.MyHTMLEditorKit;
import wotlas.utils.Tools;

import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.awt.*;
import java.awt.event.*;

import java.io.*;
import java.util.*;


/** Swing Chat Room where messages are displayed...
 *
 * @author Petrus, Aldiss
 */

public class JChatRoom extends JPanel implements MouseListener {

 /*------------------------------------------------------------------------------------*/

  /** ChatRoom display.
   */
  private JPanel chatTab;
  
  /** Panel where messages appear.
   */
  private JChatDisplay chatDisplay;

  /** JList of ChatRoom players.
   */
  private JList playersJList;
  private DefaultListModel playersListModel;

  /** Array of players.
   */
  private Hashtable players;
  
  /** Key of selected player.
   */
  static public String selectedPlayerKey;
  
 /*------------------------------------------------------------------------------------*/

  /** Constructor.<br>
   *  To get ChatRoom component to display in player's interface
   *
   * @param chatRoom the chatRoom to display
   */
  JChatRoom(ChatRoom chatRoom) {
    //super(false);
    super(true);
    setName(chatRoom.getPrimaryKey());
    setLayout(new BorderLayout());
    players = new Hashtable(2);


    // EAST (List of ChatRoom players)
    playersListModel = new DefaultListModel();
    
    playersJList = new JList(playersListModel);
    
    playersJList.addMouseListener(this);
    
    playersJList.setFixedCellWidth(100);

    playersJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    
    PlayersListRenderer playersListRenderer = new PlayersListRenderer();
//    if( selectedPlayer.getPlayerAwayMessage()!=null && !selectedPlayer.isConnectedToGame() ) {
    playersJList.setCellRenderer(playersListRenderer);
    
    JScrollPane listScroller = new JScrollPane(playersJList,
            ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    try {
      chatDisplay = new JChatDisplay(chatRoom);
    } catch( java.io.FileNotFoundException e ) {
      e.printStackTrace();
      return;
    }

    add("Center", chatDisplay.getPanel());

    add("East", listScroller);
    
    appendText("<font color='green'><i>New chat created.</i></font>");

  }

 /*------------------------------------------------------------------------------------*/

  /** To add some players to the JList.
   */
  /*synchronized public void addPlayers(PlayerImpl players[]) {
    for (int i=0; i<players.length; i++) {
      // we detect non valid entries
     	 if(players[i]==null ||  this.players.containsKey( players[i].getPrimaryKey() ))
    	    continue;

      // ok, we add this one...
         playersListModel.addElement(players[i].getFullPlayerName());
         this.players.put( players[i].getPrimaryKey(), players[i] );
    }
  }*/

  /** To add a player to the JList.
   */
  synchronized public void addPlayer(String primaryKey, String senderFullName) {
    if( players.containsKey( primaryKey ) )
        return; // already in this chat
    if (DataManager.SHOW_DEBUG)
      System.out.println("ADDING PLAYER "+primaryKey);
    
    Hashtable playersTable = ClientDirector.getDataManager().getPlayers();
    Player newPlayer = (Player) playersTable.get(primaryKey);

    final PlayerState newPlayerItem;
    
    /*if(newPlayer!=null)
       newPlayerItem = new PlayerState(senderFullName, newPlayer.isConnectedToGame());
    else
       newPlayerItem = new PlayerState(senderFullName, true );
    */
    if(newPlayer!=null)
       newPlayerItem = new PlayerState(senderFullName, newPlayer.getPlayerState().value);
    else {       
       newPlayerItem = new PlayerState(senderFullName, PlayerState.CONNECTED );
    }
    
    players.put( primaryKey, newPlayerItem);  

    if ( newPlayer!=null && newPlayer.isConnectedToGame() ) {
      Runnable runnable = new Runnable() {
        public void run() {
          if (!newPlayerItem.fullName.equals(ClientDirector.getDataManager().getMyPlayer().getFullPlayerName()))
            appendText("<font color='green'>" + newPlayerItem.fullName + " entered the chat...</font>");
          playersListModel.addElement(newPlayerItem);
          revalidate();
          repaint();
        }
      };
      SwingUtilities.invokeLater( runnable );
    } else {
      Runnable runnable = new Runnable() {
        public void run() {          
          playersListModel.addElement(newPlayerItem);       
          revalidate();
          repaint();
        }
      };
      SwingUtilities.invokeLater( runnable );
    }
  }

  /** To remove a player from the JList.
   */
  synchronized public void removePlayer(String primaryKey) {
    if( !players.containsKey( primaryKey ) )
        return; // not in this chat
    if (DataManager.SHOW_DEBUG)
      System.out.println("REMOVING PLAYER "+primaryKey);
     
    final PlayerState oldPlayerItem = (PlayerState) players.get(primaryKey);
    players.remove(primaryKey);

    Runnable runnable = new Runnable() {
      public void run() {
        if (!oldPlayerItem.fullName.equals(ClientDirector.getDataManager().getMyPlayer().getFullPlayerName()))
          appendText("<font color='green'><i>" + oldPlayerItem.fullName + " left the chat...</i></font>");
        playersListModel.removeElement(oldPlayerItem);
        revalidate();
        repaint();
      }
    };
    SwingUtilities.invokeLater( runnable );
  }

  /** To update a player's full name from the JList.
   */
  synchronized public void updatePlayer(String primaryKey, String newName) {
    if( !players.containsKey( primaryKey ) )
        return; // not in this chat
    if (DataManager.SHOW_DEBUG)
      System.out.println("UPDATING PLAYER "+primaryKey);

    final PlayerState oldPlayerItem = (PlayerState) players.get(primaryKey);
    //final PlayerState newPlayerItem = new PlayerState(newName, oldPlayerItem.isNotAway);
    final PlayerState newPlayerItem = new PlayerState(newName, oldPlayerItem.value);
    players.put(primaryKey, newPlayerItem);

    Runnable runnable = new Runnable() {
      public void run() {
        playersListModel.removeElement(oldPlayerItem);
        playersListModel.addElement(newPlayerItem);
        revalidate();
        repaint();
      }
    };
    SwingUtilities.invokeLater( runnable );
  }
  
  /** To update a player's state from the JList.
   */
  /*synchronized public void updatePlayer(String primaryKey, boolean isNotAway) {
    if( !players.containsKey( primaryKey ) )
        return; // not in this chat
    if (DataManager.SHOW_DEBUG)
      System.out.println("UPDATING PLAYER "+primaryKey);

    final PlayerState oldPlayerItem = (PlayerState) players.get(primaryKey);
    final PlayerState newPlayerItem = new PlayerState(oldPlayerItem.fullName, isNotAway);
    players.put(primaryKey, newPlayerItem);

    Runnable runnable = new Runnable() {
      public void run() {
        playersListModel.removeElement(oldPlayerItem);
        playersListModel.addElement(newPlayerItem);
        revalidate();
        repaint();
      }
    };
    SwingUtilities.invokeLater( runnable );
  }*/
  
  /** To update a player's state from the JList.
   */
  synchronized public void updatePlayer(String primaryKey, byte value) {
    if( !players.containsKey( primaryKey ) )
        return; // not in this chat
    if (DataManager.SHOW_DEBUG)
      System.out.println("UPDATING PLAYER "+primaryKey);

    final PlayerState oldPlayerItem = (PlayerState) players.get(primaryKey);
    final PlayerState newPlayerItem = new PlayerState(oldPlayerItem.fullName, value);
    players.put(primaryKey, newPlayerItem);

    Runnable runnable = new Runnable() {
      public void run() {
        playersListModel.removeElement(oldPlayerItem);
        playersListModel.addElement(newPlayerItem);
        revalidate();
        repaint();
      }
    };
    SwingUtilities.invokeLater( runnable );
  }

  /** To remove all players from JList.
   */
  synchronized public void removeAllPlayers() {
    players.clear();

    Runnable runnable = new Runnable() {
      public void run() {
        playersListModel.removeAllElements();
        revalidate();
        repaint();
      }
    };
    SwingUtilities.invokeLater( runnable );

  }

  public Hashtable getPlayers() {
    return players;
  }

 /*------------------------------------------------------------------------------------*/
  
  public void appendText(String s) {
    chatDisplay.appendText(s);
  }
  
   /*------------------------------------------------------------------------------------*/

  /**
   * Invoked when the mouse button is clicked
   */
  public void mouseClicked(MouseEvent e) {}
  /**
   * Invoked when the mouse enters a component
   */
  public void mouseEntered(MouseEvent e) {}
  /**
   * Invoked when the mouse exits a component
   */
  public void mouseExited(MouseEvent e) {}
  /**
   * Invoked when a mouse button has been pressed on a component
   */
  public void mousePressed(MouseEvent e) {}
  /**
   * Invoked when a mouse button has been released on a component
   */
  public void mouseReleased(MouseEvent e) {
    
    if (DataManager.SHOW_DEBUG)
      System.out.println("[JChatRoom] : clic sur (" + e.getX() + "," + e.getY() + ")");
    if (SwingUtilities.isRightMouseButton(e)) {
      return;
    } else {
      if (DataManager.SHOW_DEBUG)
        System.out.println("\tleft clic");
      String selectedPlayerName = ((PlayerState) playersJList.getSelectedValue()).fullName;      
      ClientDirector.getDataManager().getClientScreen().getChatPanel().setInputBoxText("/to:"+selectedPlayerName+":");
    }
    
  }

  class PlayersListRenderer extends JLabel implements ListCellRenderer {
     // This is the only method defined by ListCellRenderer.
     // We just reconfigure the JLabel each time we're called.

     public Component getListCellRendererComponent(
       JList list,
       Object value,            // value to display
       int index,               // cell index
       boolean isSelected,      // is the cell selected
       boolean cellHasFocus)    // the list and the cell have the focus
     {   
        String s = ((PlayerState) value).fullName;
        setText(s);
         
          this.setBackground(list.getBackground());

          /*
          if ( ((PlayerState) value).isNotAway )
	      this.setForeground(list.getForeground());
	  else
	      this.setForeground(Color.gray);
	  */
	  
	  if ( ((PlayerState) value).value == PlayerState.CONNECTED )
	      this.setForeground(list.getForeground());
	  else
	      if ( ((PlayerState) value).value == PlayerState.DISCONNECTED )
	          this.setForeground(Color.lightGray);
	      else
	          this.setForeground(Color.gray);

        this.setEnabled(list.isEnabled());
        this.setFont(list.getFont());
        return this;
     }
  }

}

  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -