/* * 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()); } }