ChatView.java :  » Game » joverseer » org » joverseer » ui » chat » Java Open Source

Java Open Source » Game » joverseer 
joverseer » org » joverseer » ui » chat » ChatView.java
package org.joverseer.ui.chat;

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Locale;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;

//import net.sf.jml.MsnContact;
//import net.sf.jml.MsnMessenger;
//import net.sf.jml.MsnObject;
//import net.sf.jml.MsnSwitchboard;
//import net.sf.jml.MsnUserStatus;
//import net.sf.jml.event.MsnAdapter;
//import net.sf.jml.event.MsnMessageListener;
//import net.sf.jml.impl.MsnMessengerFactory;
//import net.sf.jml.message.MsnControlMessage;
//import net.sf.jml.message.MsnDatacastMessage;
//import net.sf.jml.message.MsnInstantMessage;
//import net.sf.jml.message.MsnMimeMessage;
//import net.sf.jml.message.MsnSystemMessage;
//import net.sf.jml.message.MsnUnknownMessage;

import org.apache.log4j.Logger;
import org.joverseer.domain.Character;
import org.joverseer.domain.Order;
import org.joverseer.game.TurnElementsEnum;
import org.joverseer.support.GameHolder;
import org.joverseer.ui.LifecycleEventsEnum;
import org.joverseer.ui.support.JOverseerEvent;
import org.joverseer.ui.support.dialogs.ErrorDialog;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.MessageSource;
import org.springframework.richclient.application.Application;
import org.springframework.richclient.application.support.AbstractView;
import org.springframework.richclient.dialog.FormBackedDialogPage;
import org.springframework.richclient.dialog.TitledPageApplicationDialog;
import org.springframework.richclient.form.FormModelHelper;
import org.springframework.richclient.image.ImageSource;
import org.springframework.richclient.layout.TableLayoutBuilder;



public class ChatView extends AbstractView implements ApplicationListener {
    //JTextArea text;
    
    Thread chatThread;
    
    JTextPane text;
    JTextField message;
    StyledDocument doc;
    
    ServerSocket serverSocket;
    Socket clientSocket;
    
    boolean connected = false;
    //MsnMessenger messenger;
    static Logger log = Logger.getLogger(ChatView.class);
    
    protected void setMessageEnabled(boolean v) {
        message.setEnabled(v);
    }
    
//    protected void initMessenger(MsnMessenger messenger) {
//    messenger.getOwner().setInitStatus(MsnUserStatus.ONLINE);
//    messenger.addListener(new PrettyMsnListener(this));
//  }
    
    protected JComponent createControl() {
      final ChatView cv = this;
        
        TableLayoutBuilder tlb = new TableLayoutBuilder();
        
        MessageSource messageSource = (MessageSource) getApplicationContext().getBean("messageSource");

//        text = new JTextArea();
//        text.setWrapStyleWord(true);
//        text.setLineWrap(true);
        text = new JTextPane();
        doc = text.getStyledDocument();
        
        Style def = StyleContext.getDefaultStyleContext().
        getStyle(StyleContext.DEFAULT_STYLE);
        Style regular = doc.addStyle("regular", def);
        StyleConstants.setFontFamily(def, "SansSerif");
        Style s = doc.addStyle("button", regular);
        StyleConstants.setAlignment(s, StyleConstants.ALIGN_CENTER);

        JScrollPane scp = new JScrollPane(text);
        scp.setPreferredSize(new Dimension(400, 100));
        tlb.cell(scp, "align=left rowSpec=fill:default:grow colspec=left:410px");
        tlb.gapCol();

        
        TableLayoutBuilder lb = new TableLayoutBuilder();
        JButton startChat = new JButton("C");
        lb.cell(startChat);
        startChat.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                if (connected) {
                    ErrorDialog dlg = new ErrorDialog("Already connected. You must disconnect first.");
                    dlg.showDialog();
                    return;
                }
                final ChatConnection conn = new ChatConnection();
                
                final ConnectToChatServerForm frm = new ConnectToChatServerForm(FormModelHelper.createFormModel(conn));
                
                FormBackedDialogPage page = new FormBackedDialogPage(frm);

                TitledPageApplicationDialog dialog = new TitledPageApplicationDialog(page) {
                    protected void onAboutToShow() {
                    }

                    protected boolean onFinish() {
                        frm.commit();
                        try {
//                           messenger = MsnMessengerFactory.createMsnMessenger(conn.getUsername(),
//                                conn.getPassword());
//                           initMessenger(messenger);
//                           messenger.login();
//                           setMessageEnabled(true);
                        }
                        catch (Exception exc) {
                            setMessageEnabled(false);
                            ErrorDialog d = new ErrorDialog(exc);
                            d.showDialog();
                        }
                        return true;
                    }
                };
                MessageSource ms = (MessageSource)Application.services().getService(MessageSource.class);
                dialog.setTitle(ms.getMessage("editNoteDialog.title", new Object[]{""}, Locale.getDefault()));
                dialog.setModal(false);
                dialog.showDialog();
//                try {
//                    ChatServer cs = new ChatServer();
//                    Thread t = new Thread(cs);
//                    t.start();
//                    messageReceived("Server started!");
//                }
//                catch (Exception exc) {
//                    ErrorDialog d = new ErrorDialog(exc);
//                    d.showDialog();
//                }
            }
        });
        lb.relatedGapRow();
        JButton disconnect = new JButton("D");
        lb.cell(disconnect);
        disconnect.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              disconnect();
            }
        });
        
        
        
        tlb.cell(lb.getPanel(),"align=left");
        tlb.relatedGapRow();
        tlb.relatedGapRow();
        
        message = new JTextField();
        message.setPreferredSize(new Dimension(400, 20));
        message.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
//              String str = message.getText();
//              MsnInstantMessage reply = new MsnInstantMessage();
//                reply.setContent(str);
//                messenger.getActiveSwitchboards()[0].sendMessage(reply);
//                addMsg("you: " + str);
//                message.setText("");
            }
        });
        setMessageEnabled(false);
        tlb.cell(message, "align=left");
//        tlb.gapCol();
//        JButton send = new JButton("Send");
//        tlb.cell(send);
//        send.addActionListener(new ActionListener() {
//            public void actionPerformed(ActionEvent e) {
//                client.sendMessage(message.getText());
//                message.setText("");
//            }
//        });
        tlb.relatedGapRow();
        
        
        
        return tlb.getPanel();
    }
    
    public JButton getAcceptButtonForOrderWrapper(OrderWrapper orderWrapper) {
        final OrderWrapper ow = orderWrapper;
        final JButton button = new JButton();
        final Character c = (Character)GameHolder.instance().getGame().getTurn().getContainer(TurnElementsEnum.Character).findFirstByProperty("id", ow.getCharId());
        if (c == null) return null;
        ImageSource imgSource = (ImageSource) Application.instance().getApplicationContext().getBean("imageSource");
        Icon ico = new ImageIcon(imgSource.getImage("acceptOrder.icon"));
        button.setIcon(ico);
        button.setPreferredSize(new Dimension(16, 10));
        button.setToolTipText("Accept order");
        button.setCursor(Cursor.getDefaultCursor());
        button.setMargin(new Insets(0,0,0,0));
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Order o = c.getOrders()[ow.getOrderIdx()];
                o.setOrderNo(ow.getOrderNo());
                o.setParameters(ow.getParameters());
                Application.instance().getApplicationContext().publishEvent(
                      new JOverseerEvent(LifecycleEventsEnum.OrderChangedEvent.toString(), o, this));
            }
        });
        
        return button;
    }
    
    public JButton getSelectCharButtonForOrderWrapper(OrderWrapper orderWrapper) {
        final OrderWrapper ow = orderWrapper;
        final JButton button = new JButton();
        final Character c = (Character)GameHolder.instance().getGame().getTurn().getContainer(TurnElementsEnum.Character).findFirstByProperty("id", ow.getCharId());
        if (c == null) return null;
        ImageSource imgSource = (ImageSource) Application.instance().getApplicationContext().getBean("imageSource");
        Icon ico = new ImageIcon(imgSource.getImage("selectHexCommand.icon"));
        button.setIcon(ico);
        button.setPreferredSize(new Dimension(16, 16));
        button.setToolTipText("Find char on map");
        button.setCursor(Cursor.getDefaultCursor());
        button.setMargin(new Insets(0,0,0,0));
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Application.instance().getApplicationContext().publishEvent(
                      new JOverseerEvent(LifecycleEventsEnum.SelectedHexChangedEvent.toString(), new Point(c.getX(), c.getY()), this));
            }
        });
        
        return button;
    }
    
    public void orderWrapperReceived(OrderWrapper orderWrapper, String username) {
        String msgStr;
        final OrderWrapper ow = orderWrapper;
        final Character c = (Character)GameHolder.instance().getGame().getTurn().getContainer(TurnElementsEnum.Character).findFirstByProperty("id", ow.getCharId());
        if (c != null) {
            if (c.getHexNo() != ow.getHexNo()) {
                msgStr = username + ": Order for '" + ow.getCharId() + "' but character was found at a different location.";
                addMsg(msgStr);
                return;
            }
            msgStr = username + "> Order for '" + ow.getCharId() + "' " + ow.getOrderNo() + " " + ow.getParameters().replace(Order.DELIM, " ") + ".";
            addMsg(msgStr);
            
            JButton btn = getAcceptButtonForOrderWrapper(ow);
            Style s= doc.addStyle("button", doc.getStyle("regular"));
            StyleConstants.setComponent(s, btn);
            final Style ns = s;
            try {
                doc.insertString(doc.getLength(), " ", ns);
                text.setCaretPosition(doc.getLength()-1);
            }
            catch (Exception exc) {};
//            btn = getSelectCharButtonForOrderWrapper(ow);
//            StyleConstants.setComponent(s, btn);
//            try {
//                doc.insertString(doc.getLength(), " ", doc.getStyle("regular"));
//                doc.insertString(doc.getLength(), " ", ns);
//                text.setCaretPosition(doc.getLength()-1);
//            }
//            catch (Exception exc) {};
        } else {
            msgStr = username + "> order for character " + ow.getCharId() + " but character was not found.";
            addMsg(msgStr);
        }
    }

    
    public void showObject(Object obj) {
        String msgStr = "";
        if (OrderWrapper.class.isInstance(obj)) {
            orderWrapperReceived((OrderWrapper)obj, "");
        } else if (MultiOrderWrapper.class.isInstance(obj)) {
            final MultiOrderWrapper mow = (MultiOrderWrapper)obj;
            addMsg("> " + "sent group of orders.");
            for (OrderWrapper ow : mow.getOrderWrappers()) {
                orderWrapperReceived(ow, "");
            }
            addMsg("");
            //addMsg(msg.getUser().getUsername() + ": " + "Accept all orders.");
            JButton btn = new JButton("Accept all orders in this group");
            btn.setCursor(Cursor.getDefaultCursor());
            btn.setMargin(new Insets(0,0,0,0));
            btn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    for (OrderWrapper ow : mow.getOrderWrappers()) {
                        JButton b = getAcceptButtonForOrderWrapper(ow);  
                        if (b == null) continue;
                        b.doClick();
                    }
                }
            });
            Style s= doc.getStyle("button");
            StyleConstants.setComponent(s, btn);
            final Style ns = s;
            try {
                doc.insertString(doc.getLength(), " ", ns);
                text.setCaretPosition(doc.getLength()-1);
            }
            catch (Exception exc) {};
            addMsg("");

        }
        else {
            msgStr = "> " + obj.toString();
            addMsg(msgStr);
        }
    }

    public void messageReceived(String msg) {
        addMsg( msg);
        //text.setCaretPosition(text.getText().length());
    }

    private void addMsg(String msg) {
        try {
            final String m = msg;
            try {
                doc.insertString(doc.getLength(), "\n" + m, doc.getStyle("regular"));
                text.setCaretPosition(doc.getLength()-1);
            }
            catch (Exception exc) {
                exc.printStackTrace();
            }
        }
        catch (Exception exc) {
            exc.printStackTrace();
        }
    }
    
    public void sendOrder(Order o) {
        //client.sendMessage(new OrderWrapper(o));
        OrderWrapper ow = new OrderWrapper(o);
        String str = "o: ";
//        MsnInstantMessage reply = new MsnInstantMessage();
//        str += ow.charId;
//        str += "##" + ow.getHexNo();
//        str += "##" + ow.orderIdx;
//        str += "##" + ow.orderNo;
//        str += "##" + ow.parameters;
//        
//        reply.setContent(str);
//        messenger.getActiveSwitchboards()[0].sendMessage(reply);
//        addMsg("you: " + str);
        message.setText("");
    }
    
    public void sendOrders(ArrayList<Order> os) {
        MultiOrderWrapper mow = new MultiOrderWrapper();
        for (Order o : os) {
            mow.getOrderWrappers().add(new OrderWrapper(o));
        }      
//        String str = "o: ";
//        OrderWrapper ow = mow.getOrderWrappers().get(0);
//        MsnInstantMessage reply = new MsnInstantMessage();
//        str += ow.charId;
//        str += "##" + ow.getHexNo();
//        str += "##" + ow.orderIdx;
//        str += "##" + ow.orderNo;
//        str += "##" + ow.parameters;
//        
//        reply.setContent(str);
//        messenger.getActiveSwitchboards()[0].sendMessage(reply);
//        addMsg("you: " + str);
    }
    
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        if (applicationEvent instanceof JOverseerEvent) {
            JOverseerEvent e = (JOverseerEvent)applicationEvent;
            if (e.getEventType().equals(LifecycleEventsEnum.SendOrdersByChat.toString())) {
                if (Order.class.isInstance(e.getObject())) {
                    sendOrder((Order)e.getObject());
                } else if (ArrayList.class.isInstance(e.getObject())) {
                    sendOrders((ArrayList<Order>)e.getObject());
                }
                
            } 
        }
    }
    
    protected void disconnect() {
      connected = false;
        setMessageEnabled(false);
        messageReceived("Disconnected from server.");
    }

    
//    private static class PrettyMsnListener extends MsnAdapter {
//      
//      ChatView chatView;
//      
//      
//        public PrettyMsnListener(ChatView chatView) {
//      super();
//      this.chatView = chatView;
//    }
//
//    public void exceptionCaught(MsnMessenger messenger, Throwable throwable) {
//            log.error(messenger + throwable.toString(), throwable);
//        }
//
//        public void loginCompleted(MsnMessenger messenger) {
//            log.info(messenger + " login complete ");
//            chatView.addMsg("login complete");
//        }
//
//        public void logout(MsnMessenger messenger) {
//            log.info(messenger + " logout");
//        }
//
//        public void instantMessageReceived(MsnSwitchboard switchboard,
//                                           MsnInstantMessage message,
//                                           MsnContact friend) {
//          
//          String str = message.getContent();
//          chatView.addMsg(friend.getFriendlyName() +": " + str);
//          if (str.startsWith("o: ")) {
//            OrderWrapper ow = new OrderWrapper();
//            try {
//              str = str.substring(3);
//              String[] ps = str.split("##");
//              ow.charId = ps[0];
//              ow.hexNo = Integer.parseInt(ps[1]);
//              ow.orderIdx = Integer.parseInt(ps[2]);
//              ow.orderNo = Integer.parseInt(ps[3]);
//              ow.parameters = ps[4];
//              chatView.orderWrapperReceived(ow, friend.getFriendlyName());
//            }
//            catch (Exception exc) {
//              chatView.addMsg("Failed to parse order. Error: "+ exc.getMessage());
//            }
//          }
//      
//        }
//
//        public void systemMessageReceived(MsnMessenger messenger,
//                                          MsnSystemMessage message) {
//            log.info(messenger + " recv system message " + message);
//        }
//
//        public void controlMessageReceived(MsnSwitchboard switchboard,
//                                           MsnControlMessage message,
//                                           MsnContact contact) {
//            log.info(switchboard + " recv control message from "
//                     + contact.getEmail());
//            message.setTypingUser(switchboard.getMessenger().getOwner().getEmail().getEmailAddress());
//            switchboard.sendMessage(message, false);
//        }
//
//        public void datacastMessageReceived(MsnSwitchboard switchboard,
//                                            MsnDatacastMessage message,
//                                            MsnContact friend) {
//            log.info(switchboard + " recv datacast message " + message);
//            switchboard.sendMessage(message, false);
//        }
//
//        public void unknownMessageReceived(MsnSwitchboard switchboard,
//                                           MsnUnknownMessage message,
//                                           MsnContact friend) {
//            log.info(switchboard + " recv unknown message " + message);
//        }
//
//        public void contactListInitCompleted(MsnMessenger messenger) {
//            log.info(messenger + " contact list init completeted");
//        }
//
//        public void contactListSyncCompleted(MsnMessenger messenger) {
//            log.info(messenger + " contact list sync completed");
//        }
//
//        public void contactStatusChanged(MsnMessenger messenger,
//                                         MsnContact friend) {
//            log.info(messenger + " friend " + friend.getEmail()
//                     + " status changed from " + friend.getOldStatus() + " to "
//                     + friend.getStatus());
//        }
//
//        public void ownerStatusChanged(MsnMessenger messenger) {
//            log.info(messenger + " status changed from "
//                     + messenger.getOwner().getOldStatus() + " to "
//                     + messenger.getOwner().getStatus());
//        }
//
//        public void contactAddedMe(MsnMessenger messenger, MsnContact friend) {
//            log.info(friend.getEmail() + " add " + messenger);
//        }
//
//        public void contactRemovedMe(MsnMessenger messenger, MsnContact friend) {
//            log.info(friend.getEmail() + " remove " + messenger);
//        }
//
//        public void switchboardClosed(MsnSwitchboard switchboard) {
//            log.info(switchboard + " closed");
//        }
//
//        public void switchboardStarted(MsnSwitchboard switchboard) {
//            log.info(switchboard + " started");
//        }
//
//        public void contactJoinSwitchboard(MsnSwitchboard switchboard,
//                                           MsnContact friend) {
//            log.info(friend.getEmail() + " join " + switchboard);
//        }
//
//        public void contactLeaveSwitchboard(MsnSwitchboard switchboard,
//                                            MsnContact friend) {
//            log.info(friend.getEmail() + " leave " + switchboard);
//        }
//  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.