package org.javwer;
import java.util.*;
import java.text.*;
import java.io.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.browser.*;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.packet.DelayInformation;
import org.jivesoftware.smack.*;
public class JSUCTab extends JChatTab {
private JChat parent;
private Presence presence, oldPresence;
private RosterListener rosterListener;
private Chat smackChat;
private String user, nick;
//private StyledText chatText;
//private String textString, filename, user, nick;
private Button sendFileButton, viewVCardButton;
JSUCTab( final JChat f_parent, final String f_user ) {
super();
parent = f_parent;
user = f_user;
if ( parent.getJavwerManager().getJRoster().getRoster().getEntry( StringUtils.parseBareAddress( user ) ) != null )
user = StringUtils.parseBareAddress( user );
tabName = user;
type = Message.Type.CHAT;
if( parent == null )
System.out.println( "tjosdf" );
if ( parent.getJavwerManager().getJRoster().getRoster().getEntry( user ) != null && parent.getJavwerManager().getJRoster().getRoster().getEntry( user ).getName() != null )
nick = parent.getJavwerManager().getJRoster().getRoster().getEntry( user ).getName();
else
nick = user;
tabTitle = nick;
filename = parent.getJavwerManager().getJavwerHomeDir() + "/history_" + tabName.replaceAll( "@", "_at_") + ".html";
if ( filename.indexOf("/") > 0 )
filename = filename.substring(0, filename.indexOf("/") );
textString = "<html><head><link rel=\"stylesheet\" href=\"" + parent.getJavwerManager().getSettingsManager().getStringSetting( "style" ) + "\" type=\"text/css\"></head><body>";
try {
RandomAccessFile tmp = new RandomAccessFile( filename, "r" );
String line;
int maxLength = 10000;
if( tmp.length() > maxLength ) {
tmp.skipBytes( (int)tmp.length() - maxLength );
tmp.readLine();
}
while ( (line = tmp.readLine()) != null )
textString += line;
tmp.close();
if( !parent.getJavwerManager().getSettingsManager().getBooleanSetting( "show_timestamp" ) )
textString = textString.replaceAll( "class=\"timestamp\"", "class=\"hidden\"" );
} catch ( Exception e ) {
}
try {
file = new FileWriter( filename, true );
} catch ( Exception e ) {
textString += "Could not open the File '" + filename + " in 'rw'-Mode<br />";
}
smackChat = parent.getJavwerManager().getConnection().createChat( user );
presence = parent.getJavwerManager().getJRoster().getRoster().getPresence( user );
parent.getJavwerManager().getDisplay().syncExec( new Runnable() {
public void run() {
createGUI();
}
});
rosterListener = new RosterListener() {
public void entriesAdded( Collection col ) {}
public void entriesDeleted( Collection col ) {}
public void entriesUpdated( Collection col ) {}
public void presenceChanged( String f_user ) {
if ( f_user.startsWith( user ) ) {
oldPresence = presence;
presence = parent.getJavwerManager().getJRoster().getRoster().getPresence( user );
parent.getJavwerManager().getJRoster().getJavwerManager().getDisplay().syncExec( new Runnable() {
public void run() {
updateStatus();
}
});
}
}
};
parent.getJavwerManager().getJRoster().getRoster().addRosterListener( rosterListener );
}
public void addMessage( Message message ) {
String timeString = "";
DelayInformation delay = (DelayInformation) message.getExtension( "x", "jabber:x:delay" );
if( delay != null ) {
DateFormat formater = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.MEDIUM );
timeString = "[" + formater.format( delay.getStamp() ) + "] ";
}
if( message.getFrom().startsWith( user ) )
addMessage( timeString + message.getBody(), JVW.MSG.CONTACT );
else
addMessage( timeString + message.getBody(), JVW.MSG.ME );
}
public void addMessage( String f_text, int source ) {
// System.out.println("tab: " + user );
final String text = f_text.replaceAll( "&", "&" ).replaceAll( "<", "<" ).replaceAll( ">", ">" ).replaceAll( "\n", "<br />" );
Calendar cal = Calendar.getInstance();
DateFormat formater = DateFormat.getTimeInstance( DateFormat.MEDIUM );
String currentString = "<span class=\"timestamp\">[" + formater.format( cal.getTime() ) + "]</span> ";
switch ( source ) {
case JVW.MSG.ME: //from me
currentString = currentString + "<span class=\"me_name\">Me:</span><span class=\"me_text\"> " + text + "</span><br />\n";
break;
case JVW.MSG.CONTACT: //from contact
currentString = currentString + "<span class=\"contact_name\">" + nick + ":</span><span class=\"contact_text\"> " + text + "</span><br />\n";
//Set pending messages as tab title
if ( parent.getTabFolder().getSelection() != null && !parent.getTabFolder().getSelection().equals( tabItem ) ) {
pendingMessages++;
parent.getJavwerManager().getDisplay().syncExec( new Runnable() {
public void run() {
tabItem.setText( tabTitle + " (" + pendingMessages + ")" );
}
});
} else {
pendingMessages = 0;
parent.getJavwerManager().getDisplay().syncExec( new Runnable() {
public void run() {
tabItem.setText( tabTitle );
}
});
}
break;
case JVW.MSG.ERROR: //error
currentString = currentString + "<span class=\"error\">Error: " + text + "</span><br />\n";
break;
case JVW.MSG.STATUS: //status
currentString = currentString + "<span class=\"status\">" + nick + "s new status: " + text + "</span><br />\n";
break;
default:
currentString += "Unexpected Event<br />";
}
if ( file != null ) {
try {
file.write( currentString );
file.flush();
} catch ( IOException e ) {
currentString += "Unable to write to Log-File<br />\n";
}
}
if( parent.getJavwerManager().getSettingsManager().getBooleanSetting( "image_smilies" ) )
currentString = parent.getJavwerManager().getGraphicsManager().replaceSmilies( currentString );
if( !parent.getJavwerManager().getSettingsManager().getBooleanSetting( "show_timestamp" ) )
currentString = currentString.replaceAll( "class=\"timestamp\"", "class=\"hidden\"" );
textString += currentString;
parent.getJavwerManager().getDisplay().syncExec( new Runnable() {
public void run() {
chatBrowser.setText( textString );
}
});
}
public String getUser() {
return user;
}
protected void createGUI() {
tabItem = new CTabItem( parent.getTabFolder(), SWT.NONE );
tabItem.setText( tabTitle );
final Composite composite = new Composite( parent.getTabFolder(), SWT.NONE );
GridLayout layout = new GridLayout();
layout.numColumns = 4;
composite.setLayout( layout );
chatBrowser = new Browser( composite, SWT.NONE );
chatBrowser.setText( "" );
chatBrowser.addProgressListener( new ProgressListener() {
public void changed( ProgressEvent e ) {}
public void completed( ProgressEvent e ) {
chatBrowser.execute( "window.scrollBy( 0, document.height )" );
}
});
viewVCardButton = new Button( composite, SWT.PUSH );
viewVCardButton.setText( "View &VCard" );
viewVCardButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
parent.getJavwerManager().getJRoster().displayVCard( user );
}
});
sendFileButton = new Button( composite, SWT.PUSH );
sendFileButton.setText( "Send &File" );
sendFileButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
parent.getJavwerManager().getFileTransferManager().sendFile( user );
}
});
Button addContactButton = new Button( composite, SWT.PUSH );
final RosterEntry entry = parent.getJavwerManager().getJRoster().getRoster().getEntry( user );
if( entry != null && entry.getStatus() == RosterPacket.ItemStatus.SUBSCRIPTION_PENDING )
addContactButton.setText( "&Resend Subscribtion" );
else
addContactButton.setText( "&Add Contact" );
addContactButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
if( entry != null && entry.getStatus() != RosterPacket.ItemStatus.SUBSCRIPTION_PENDING )
parent.getJavwerManager().sendSubscription( Presence.Type.SUBSCRIBE, user );
else
parent.getJavwerManager().getJRoster().addRosterEntry( user );
}
});
if( parent.getJavwerManager().getJRoster().getRoster().contains( user ) && entry.getStatus() != RosterPacket.ItemStatus.SUBSCRIPTION_PENDING )
addContactButton.setEnabled( false );
writeText = new Text( composite, SWT.MULTI | SWT.WRAP );
//LayoutData for StyledText chatBrowser
GridData data = new GridData();
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.minimumHeight = 20;
data.heightHint = 100;
data.horizontalSpan = layout.numColumns;
data.verticalSpan = 2;
chatBrowser.setLayoutData( data );
//LayoutData for sendFileButton
/*
data.top = new FormAttachment( chatBrowser, 3 );
data.left = new FormAttachment( 0 );
sendFileButton.setLayoutData( data );
*/
//LayoutData for Text writeText
data = new GridData();
data.grabExcessHorizontalSpace = true;
//data.grabExcessVerticalSpace = true;
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.horizontalSpan = layout.numColumns;
data.heightHint = 50;
data.minimumHeight = 20;
writeText.setLayoutData( data );
tabItem.setControl( composite );
if( parent.getJavwerManager().getSettingsManager().getBooleanSetting( "image_smilies" ) )
textString = parent.getJavwerManager().getGraphicsManager().replaceSmilies( textString );
chatBrowser.setText( textString );
updateStatus();
writeText.addKeyListener( new KeyListener() {
public void keyReleased( KeyEvent e ) {
if ( e.keyCode == '\r' && e.stateMask == SWT.NONE )
writeText.setText( "" );
}
public void keyPressed( KeyEvent e ) {
if ( e.keyCode == '\r' && e.stateMask == SWT.NONE && !writeText.getText().trim().equalsIgnoreCase( "" ) )
try {
smackChat.sendMessage( writeText.getText() );
addMessage( writeText.getText(), JVW.MSG.ME );
} catch ( XMPPException f ) {
addMessage( "Message ( " + writeText.getText() + " ) could not be sent. " + f + "\n", JVW.MSG.ERROR );
} catch ( IllegalStateException f ) {
addMessage( "Message ( " + writeText.getText() + " ) could not be sent. " + f + "\n", JVW.MSG.ERROR );
}
else if ( e.keyCode == SWT.ESC )
close();
}
});
parent.getJavwerManager().getDisplay().syncExec( new Runnable() {
public void run() {
tabItem.addDisposeListener( new DisposeListener() {
public void widgetDisposed( DisposeEvent e ) {
close();
}
});
}
});
}
private void updateStatus() {
if ( null != presence ) {
tabItem.setImage( parent.getJavwerManager().getGraphicsManager().getStatusIcon( presence.getMode() ) );
if( parent.getJavwerManager().getSettingsManager().getIntSetting( "display_status" ) == JVW.ALWAYS || oldPresence == null || ( parent.getJavwerManager().getSettingsManager().getIntSetting( "display_status" ) == JVW.ON_CHANGE && !presence.getMode().equals( oldPresence.getMode() ) ) ) {
if ( null != presence.getStatus() )
addMessage( presence.getStatus(), JVW.MSG.STATUS );
else
addMessage( presence.getMode().toString(), JVW.MSG.STATUS );
}
} else {
parent.getJavwerManager().getStatusLogManager().addMessage( "Offline", nick, JVW.MSG.STATUS );
tabItem.setImage( parent.getJavwerManager().getGraphicsManager().getStatusIcon( null ) );
if( parent.getJavwerManager().getSettingsManager().getIntSetting( "display_status" ) == JVW.ALWAYS || oldPresence == presence )
addMessage( "Offline", JVW.MSG.STATUS );
}
}
public void close() {
parent.getJavwerManager().getJRoster().getRoster().removeRosterListener( rosterListener );
try {
file.close();
} catch( Exception e ) {
// nothing
}
tabItem.dispose();
parent.closeChatTab( this );
}
}