com.ikon.frontend.client.widget.chat.ChatRoomPopup.java Source code

Java tutorial

Introduction

Here is the source code for com.ikon.frontend.client.widget.chat.ChatRoomPopup.java

Source

/**
 *  openkm, Open Document Management System (http://www.openkm.com)
 *  Copyright (c) 2006-2013  Paco Avila & Josep Llort
 *
 *  No bytes were intentionally harmed during the development of this application.
 *
 *  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; either version 2 of the License, or
 *  (at your option) any later version.
 *  
 *  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.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.ikon.frontend.client.widget.chat;

import java.util.Iterator;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.ikon.frontend.client.Main;
import com.ikon.frontend.client.service.OKMChatService;
import com.ikon.frontend.client.service.OKMChatServiceAsync;
import com.ikon.frontend.client.util.OKMBundleResources;

/**
 * Chat room popup
 * 
 * @author jllort
 */
public class ChatRoomPopup extends ChatRoomDialogBox {
    private final OKMChatServiceAsync chatService = (OKMChatServiceAsync) GWT.create(OKMChatService.class);

    private final static int DELAY_PENDING_MESSAGE = 1000; // 1 seg
    private final static int DELAY_USERS_IN_ROOM = 3 * 1000; // 3 seg

    private VerticalPanel vPanel;
    private HorizontalPanel hPanel;
    private Button close;
    private TextArea textArea;
    private FlexTable table;
    private ScrollPanel scrollPanel;
    private HTML usersInRoomText;
    private ChatRoomDialogBox singleton;
    private boolean chatRoomActive = true;
    private Image addUserToChatRoom;
    private String connectedRoom = "";

    /**
     * Chat room popup
     */
    public ChatRoomPopup(String user, final String room) {
        // Establishes auto-close when click outside
        super(false, false);
        setText(Main.i18n("chat.room"));
        singleton = this;
        chatRoomActive = true;
        connectedRoom = room;
        usersInRoomText = new HTML("");
        addUserToChatRoom = new Image(OKMBundleResources.INSTANCE.addUserToChatRoom());
        addUserToChatRoom.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                chatService.getUsersInRoom(room, new AsyncCallback<List<String>>() {

                    @Override
                    public void onSuccess(List<String> result) {
                        Main.get().onlineUsersPopup.setAction(OnlineUsersPopup.ACTION_ADD_USER_TO_ROOM, room);
                        Main.get().onlineUsersPopup.setUsersInChat(result);
                        Main.get().onlineUsersPopup.center();
                        Main.get().onlineUsersPopup.refreshOnlineUsers();
                    }

                    @Override
                    public void onFailure(Throwable caught) {
                        Main.get().showError("Logout", caught);
                    }
                });
            }
        });

        close = new Button(Main.i18n("button.close"), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                chatRoomActive = false;
                chatService.closeRoom(room, new AsyncCallback<Object>() {
                    @Override
                    public void onSuccess(Object arg0) {
                        Main.get().mainPanel.bottomPanel.userInfo.removeChatRoom(singleton);
                    }

                    @Override
                    public void onFailure(Throwable caught) {
                        Main.get().showError("Logout", caught);
                    }
                });

                hide();
            }
        });

        vPanel = new VerticalPanel();
        hPanel = new HorizontalPanel();

        HTML space4 = new HTML("");
        hPanel.add(space4);
        hPanel.add(addUserToChatRoom);
        hPanel.add(usersInRoomText);
        HTML space5 = new HTML("");
        hPanel.add(space5);

        hPanel.setCellHorizontalAlignment(addUserToChatRoom, HasAlignment.ALIGN_LEFT);
        hPanel.setCellHorizontalAlignment(usersInRoomText, HasAlignment.ALIGN_RIGHT);
        hPanel.setCellWidth(space4, "5");
        hPanel.setCellWidth(addUserToChatRoom, "189");
        hPanel.setCellWidth(usersInRoomText, "189");
        hPanel.setCellWidth(space5, "5");
        hPanel.setWidth("100%");

        table = new FlexTable();
        table.setBorderWidth(0);
        table.setCellPadding(2);
        table.setCellSpacing(0);
        table.setWidth("100%");

        scrollPanel = new ScrollPanel(table);
        scrollPanel.setSize("388", "225");

        textArea = new TextArea();
        textArea.setSize("390", "50");
        textArea.addKeyUpHandler(new KeyUpHandler() {
            @Override
            public void onKeyUp(KeyUpEvent event) {
                if (KeyCodes.KEY_ENTER == event.getNativeKeyCode() && textArea.getText().length() == 1) {
                    // Case only has typewrite a enter character, reset textArea values
                    textArea.setText("");
                } else if (KeyCodes.KEY_ENTER == event.getNativeKeyCode() && textArea.getText().length() > 1) {
                    textArea.setEnabled(false);
                    chatService.addMessageToRoom(room, formatingMessage(textArea.getText()),
                            new AsyncCallback<Object>() {
                                @Override
                                public void onSuccess(Object result) {
                                    addMessage("<b>" + Main.get().workspaceUserProperties.getUser().getUsername()
                                            + "</b>: " + formatingMessage(textArea.getText()));
                                    textArea.setText("");
                                    textArea.setEnabled(true);
                                }

                                @Override
                                public void onFailure(Throwable caught) {
                                    textArea.setEnabled(true);
                                    Main.get().showError("AddMessageToRoom", caught);
                                }
                            });
                }
            }
        });

        vPanel.add(hPanel);
        HTML space = new HTML();
        vPanel.add(space);
        vPanel.add(scrollPanel);
        HTML space2 = new HTML();
        vPanel.add(space2);
        vPanel.add(textArea);
        HTML space3 = new HTML();
        vPanel.add(space3);
        vPanel.add(close);

        vPanel.setCellHeight(hPanel, "25");
        vPanel.setCellHeight(scrollPanel, "225");
        vPanel.setCellHeight(textArea, "50");
        vPanel.setCellHeight(space, "5");
        vPanel.setCellHeight(space2, "5");
        vPanel.setCellHeight(space3, "5");
        vPanel.setCellHorizontalAlignment(hPanel, HasAlignment.ALIGN_CENTER);
        vPanel.setCellHorizontalAlignment(scrollPanel, HasAlignment.ALIGN_CENTER);
        vPanel.setCellHorizontalAlignment(textArea, HasAlignment.ALIGN_CENTER);
        vPanel.setCellHorizontalAlignment(close, HasAlignment.ALIGN_CENTER);
        vPanel.setCellVerticalAlignment(hPanel, HasAlignment.ALIGN_MIDDLE);
        vPanel.setCellVerticalAlignment(scrollPanel, HasAlignment.ALIGN_MIDDLE);
        vPanel.setCellVerticalAlignment(textArea, HasAlignment.ALIGN_MIDDLE);
        vPanel.setCellVerticalAlignment(close, HasAlignment.ALIGN_MIDDLE);

        scrollPanel.setStyleName("okm-PanelSelected");
        scrollPanel.addStyleName("okm-Input");
        textArea.setStyleName("okm-TextArea");
        close.setStyleName("okm-NoButton");

        vPanel.setWidth("400px");
        vPanel.setHeight("350px");

        setStyleName("okm-Popup");

        refreshUsersInRoom(room); // Refresh users in room

        super.hide();
        setWidget(vPanel);
    }

    /**
     * langRefresh
     */
    public void langRefresh() {
        setText(Main.i18n("chat.room"));
        close.setHTML(Main.i18n("button.close"));
    }

    /**
     * refreshUsersInRoom()
     */
    private void refreshUsersInRoom(final String room) {
        if (chatRoomActive) {
            chatService.usersInRoom(room, new AsyncCallback<String>() {

                @Override
                public void onSuccess(String result) {
                    usersInRoomText.setHTML("(" + result + ") " + Main.i18n("chat.users.in.room"));
                    Timer timer = new Timer() {
                        @Override
                        public void run() {
                            refreshUsersInRoom(room);
                        }
                    };

                    timer.schedule(DELAY_USERS_IN_ROOM);
                }

                @Override
                public void onFailure(Throwable caught) {
                    Main.get().showError("UsersInRoom", caught);
                }
            });
        }
    }

    /**
     * getPendingMessage
     */
    public void getPendingMessage(final String room) {
        if (chatRoomActive) {
            chatService.getPendingMessage(room, new AsyncCallback<List<String>>() {

                @Override
                public void onSuccess(List<String> result) {
                    for (Iterator<String> it = result.iterator(); it.hasNext();) {
                        addMessage(it.next());
                    }

                    Timer timer = new Timer() {
                        @Override
                        public void run() {
                            getPendingMessage(room);
                        }
                    };

                    timer.schedule(DELAY_PENDING_MESSAGE);
                }

                @Override
                public void onFailure(Throwable caught) {
                    Main.get().showError("getPendingMessage", caught);
                }
            });
        }
    }

    /**
     * addMessage
     */
    private void addMessage(String msg) {
        table.setHTML(table.getRowCount(), 0, msg);
        if (table.getOffsetHeight() > scrollPanel.getOffsetHeight()) {
            int position = table.getOffsetHeight() - scrollPanel.getOffsetHeight();
            scrollPanel.setVerticalScrollPosition(position);
        }
    }

    /**
     * formatingMessage
     */
    private String formatingMessage(String msg) {
        return msg.replaceAll("\\n", "</br>");
    }

    /**
     * getRoom
     */
    public String getRoom() {
        return connectedRoom;
    }

    /**
     * setChatRoomActive
     */
    public void setChatRoomActive(boolean active) {
        hide();
        chatRoomActive = active;
    }
}