Package com.aelitis.azureus.plugins.net.buddy.swt

Source Code of com.aelitis.azureus.plugins.net.buddy.swt.BuddyPluginViewChat

/*
* Created on Apr 26, 2008
* Created by Paul Gardner
*
* Copyright 2008 Vuze, Inc.  All rights reserved.
*
* 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; version 2 of the License only.
*
* 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 com.aelitis.azureus.plugins.net.buddy.swt;

import java.util.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.utils.LocaleUtilities;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.components.shell.ShellFactory;
import org.gudy.azureus2.ui.swt.mainwindow.Colors;

import com.aelitis.azureus.plugins.net.buddy.BuddyPlugin;
import com.aelitis.azureus.plugins.net.buddy.BuddyPluginAZ2;
import com.aelitis.azureus.plugins.net.buddy.BuddyPluginAZ2ChatListener;
import com.aelitis.azureus.plugins.net.buddy.BuddyPluginBuddy;

public class
BuddyPluginViewChat
  implements BuddyPluginAZ2ChatListener
{
  private BuddyPlugin            plugin;
  private BuddyPluginAZ2.chatInstance    chat;
 
  private LocaleUtilities    lu;
 
  private Shell     shell;
  private StyledText   log;
  private Table    buddy_table;
 
  private List    participants = new ArrayList();
 
  protected
  BuddyPluginViewChat(
    BuddyPlugin            _plugin,
    Display             _display,
    BuddyPluginAZ2.chatInstance    _chat )
  {
    plugin  = _plugin;
    chat  = _chat;
   
    lu    = plugin.getPluginInterface().getUtilities().getLocaleUtilities();
   
    shell = ShellFactory.createMainShell( SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MIN | SWT.MAX );

    shell.addDisposeListener(
      new DisposeListener()
      {
        public void
        widgetDisposed(
          DisposeEvent arg0 )
        {
          closed();
        }
      });
   
    shell.setText( lu.getLocalisedMessageText( "azbuddy.chat.title" ));
       
    Utils.setShellIcon(shell);
   
    GridLayout layout = new GridLayout();
    layout.numColumns = 2;
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    shell.setLayout(layout);
    GridData grid_data = new GridData(GridData.FILL_BOTH );
    shell.setLayoutData(grid_data);

   
    log = new StyledText(shell,SWT.READ_ONLY | SWT.V_SCROLL | SWT.BORDER | SWT.WRAP | SWT.NO_FOCUS );
    grid_data = new GridData(GridData.FILL_BOTH);
    grid_data.horizontalSpan = 1;
    grid_data.horizontalIndent = 4;
    grid_data.widthHint = 300;
    grid_data.heightHint = 400;
    log.setLayoutData(grid_data);
    log.setIndent( 4 );
   
    log.setEditable( false );

    Composite rhs = new Composite(shell, SWT.NONE);
    layout = new GridLayout();
    layout.numColumns = 1;
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    rhs.setLayout(layout);
    grid_data = new GridData(GridData.FILL_BOTH );
    grid_data.widthHint = 150;
    rhs.setLayoutData(grid_data);

      // table
   
    buddy_table = new Table(rhs, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.VIRTUAL);

    String[] headers = {
        "azbuddy.ui.table.name" };

    int[] sizes = { 150 };

    int[] aligns = { SWT.LEFT };

    for (int i = 0; i < headers.length; i++){

      TableColumn tc = new TableColumn(buddy_table, aligns[i]);
       
      tc.setWidth(sizes[i]);

      Messages.setLanguageText(tc, headers[i]);
   

      buddy_table.setHeaderVisible(true);

      grid_data = new GridData(GridData.FILL_BOTH);
      grid_data.heightHint = buddy_table.getHeaderHeight() * 3;
    buddy_table.setLayoutData(grid_data);
   
   
    buddy_table.addListener(
      SWT.SetData,
      new Listener()
      {
        public void
        handleEvent(
          Event event)
        {
          TableItem item = (TableItem)event.item;
         
          int index = buddy_table.indexOf(item);
 
          if ( index < 0 || index >= participants.size()){
           
            return;
          }
         
          BuddyPluginAZ2.chatParticipant  participant = (BuddyPluginAZ2.chatParticipant)participants.get(index);
         
          BuddyPluginBuddy buddy = participant.getBuddy();
         
          if ( buddy == null ){
           
            item.setForeground( 0, Colors.red );
           
          }else if ( buddy.isOnline( false )){
           
            item.setForeground( 0, Colors.black );
           
          }else{
           
            item.setForeground( 0, Colors.grey );
          }
         
          item.setText(0, participant.getName());         
        }
      });
   
   
   
   
      // Text
   
    final Text text = new Text( shell, SWT.MULTI | SWT.V_SCROLL | SWT.WRAP | SWT.BORDER);
    grid_data = new GridData(GridData.FILL_HORIZONTAL );
    grid_data.horizontalSpan = 2;
    grid_data.heightHint = 50;
    text.setLayoutData(grid_data);
       
    text.addKeyListener(
      new KeyListener()
      {
        public void
        keyPressed(
          KeyEvent e)
        {
          if ( e.keyCode == SWT.CR ){
       
            e.doit = false;
           
            sendMessage( text.getText());
           
            text.setText( "" );
          }
        }
       
        public void
        keyReleased(
          KeyEvent e )
        {
        }
      });
   
    text.setFocus();
   
    shell.addListener(
      SWT.Traverse,
      new Listener()
      { 
        public void
        handleEvent(
          Event e )
        {
          if ( e.character == SWT.ESC){
         
            close();
        }
      }
    });
   
    BuddyPluginAZ2.chatParticipant[] existing_participants = chat.getParticipants();
   
    synchronized( participants ){
     
      participants.addAll( Arrays.asList( existing_participants ));
    }
   
    updateTable( false );
   
    BuddyPluginAZ2.chatMessage[] history = chat.getHistory();
   
    for (int i=0;i<history.length;i++){
     
      logChatMessage( history[i].getNickName(), Colors.blue, history[i].getMessage());
    }
   
    chat.addListener( this );
   
      shell.pack();
      Utils.createURLDropTarget(shell, text);
      Utils.centreWindow(shell);
      shell.open();
  }
 
  protected void
  updateTable(
    boolean  async )
  {
    if ( async ){
     
      if ( !buddy_table.isDisposed()){

        buddy_table.getDisplay().asyncExec(
            new Runnable()
            {
              public void
              run()
              {
                if ( buddy_table.isDisposed()){

                  return;
                }
               
                updateTable( false );
              }
            });
      }         
    }else{
     
      buddy_table.setItemCount( participants.size());
      buddy_table.clearAll();
      buddy_table.redraw();
    }
  }
 
  protected void
  close()
  {
    shell.dispose();
  }
 
  protected void
  closed()
  {
    chat.removeListener( this );
   
    chat.destroy();
  }
 
  public void
  participantAdded(
    BuddyPluginAZ2.chatParticipant    participant )
  {
    synchronized( participants ){
     
      participants.add( participant );
    }
   
    updateTable( true );
  }
 
  public void
  participantChanged(
    BuddyPluginAZ2.chatParticipant    participant )
  {
    updateTable( true );
  }
 
  public void
  participantRemoved(
    BuddyPluginAZ2.chatParticipant    participant )
  {
    synchronized( participants ){
     
      participants.remove( participant );
    }
   
    updateTable( true );
  }
 
  protected void
  sendMessage(
    String    text )
  {
    Map  msg = new HashMap();
   
    try{
      msg.put( "line", text.getBytes( "UTF-8" ));
   
    }catch( Throwable e ){
     
      msg.put( "line", text.getBytes());
    }
   
    logChatMessage( plugin.getNickname(), Colors.green, msg );
   
    chat.sendMessage( msg );
  }
 
  public void
  messageReceived(
    final BuddyPluginAZ2.chatParticipant  participant,
    final Map                msg )
  {
    if ( !log.isDisposed()){

      log.getDisplay().asyncExec(
          new Runnable()
          {
            public void
            run()
            {
              if ( log.isDisposed()){

                return;
              }
             
              try{
                logChatMessage( participant.getName(), Colors.blue, msg );
               
              }catch( Throwable e ){
               
                Debug.printStackTrace(e);
              }
            }
          });
    }
  }
 
  protected void
  logChatMessage(
    String    buddy_name,
    Color     colour,
    Map      map )
  {
    byte[]  line = (byte[])map.get( "line" );
   
    String msg;
   
    try{
      msg = new String( line, "UTF-8" );
     
    }catch( Throwable e ){
     
      msg = new String( line );
    }

    if ( buddy_name.length() > 32 ){
     
      buddy_name = buddy_name.substring(0,16) + "...";
    }
   
    int  start = log.getText().length();
   
    if ( msg.startsWith( "/me" )){
     
      msg = msg.substring( 3 ).trim();
     
      String  me = "* " + buddy_name + " " + msg;
     
      log.append( me  );
     
      if ( colour != Colors.black ){
       
        StyleRange styleRange = new StyleRange();
        styleRange.start = start;
        styleRange.length = me.length();
        styleRange.foreground = colour;
        log.setStyleRange(styleRange);
      }
     
      log.append( "\n" );
     
    }else{
      String says = lu.getLocalisedMessageText( "azbuddy.chat.says", new String[]{ buddy_name }) + "\n";
     
      log.append( says );
     
      if ( colour != Colors.black ){
       
        StyleRange styleRange = new StyleRange();
        styleRange.start = start;
        styleRange.length = says.length();
        styleRange.foreground = colour;
        log.setStyleRange(styleRange);
      }
     
      log.append( msg + "\n" );
    }

    log.setSelection( log.getText().length());
  }
}
TOP

Related Classes of com.aelitis.azureus.plugins.net.buddy.swt.BuddyPluginViewChat

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.