Package org.javwer

Source Code of org.javwer.JSUCTab

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( "&", "&amp;" ).replaceAll( "<", "&lt;" ).replaceAll( ">", "&gt;" ).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 );
    }
}
TOP

Related Classes of org.javwer.JSUCTab

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.