package net.thesocialos.client.chat;
import java.util.ArrayList;
import java.util.List;
import net.thesocialos.client.TheSocialOS;
import net.thesocialos.client.app.IApplication;
import net.thesocialos.client.chat.events.ChatCloseConversation;
import net.thesocialos.client.chat.events.ChatHideConversation;
import net.thesocialos.client.chat.events.ChatSendMessage;
import net.thesocialos.client.chat.events.ChatTopConversations;
import net.thesocialos.client.chat.view.ChatConversationView;
import net.thesocialos.client.desktop.DesktopEventOnClose;
import net.thesocialos.client.desktop.DesktopEventOnTop;
import net.thesocialos.client.desktop.DesktopEventonEndDrag;
import net.thesocialos.client.desktop.DesktopUnit;
import net.thesocialos.client.desktop.window.events.WindowCloseEvent;
import net.thesocialos.client.desktop.window.events.WindowDisplay;
import net.thesocialos.client.desktop.window.events.WindowEndDragEvent;
import net.thesocialos.client.desktop.window.events.WindowEventHandler;
import net.thesocialos.client.desktop.window.events.WindowMaximizeEvent;
import net.thesocialos.client.desktop.window.events.WindowMinimizeEvent;
import net.thesocialos.client.desktop.window.events.WindowOnTopEvent;
import net.thesocialos.client.desktop.window.events.WindowResizeEvent;
import net.thesocialos.shared.model.Lines;
import net.thesocialos.shared.model.User;
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.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.googlecode.objectify.Key;
public class ChatConversationPresenter extends DesktopUnit implements IApplication {
public interface Display {
ChatConversationView getChatPanel();
Button getSendButton();
TextArea getSendText();
CellList<Lines> getConversation();
Label lblCharacters();
ScrollPanel getScrollPanel();
Widget asWidget();
}
private String name;
private String image;
private Display display;
private Key<User> userWithChat;
/*
* Los modelos de la cajas de seleccion de los contactos
*/
List<Lines> linesList = new ArrayList<Lines>();
ListDataProvider<Lines> linesDataProvider = new ListDataProvider<Lines>(linesList);
public ChatConversationPresenter(int programID, String appName, String appImageURL, Key<User> userWithChat,
WindowDisplay windoDisplay, Display display) {
super(programID, "Chat Conversation", windoDisplay, TypeUnit.WINDOW, true);
setName(appName);
setImage(appImageURL);
this.display = display;
this.userWithChat = userWithChat;
init();
}
private void init() {
bindHandlers();
initWindow();
linesDataProvider.addDataDisplay(display.getConversation());
}
private void bindHandlers() {
display.getSendButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (!display.getSendText().getText().trim().isEmpty()) {
TheSocialOS.getEventBus().fireEvent(
new ChatSendMessage(userWithChat, display.getSendText().getText()));
display.getSendText().setValue(null);
event.preventDefault();
} else
event.preventDefault();
if ((150 - display.getSendText().getText().length()) < 0)
display.getSendText().setText(display.getSendText().getText().substring(0, 149));
display.lblCharacters().setText(String.valueOf((150 - display.getSendText().getText().length())));
}
});
display.getSendText().addKeyDownHandler(new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)
if (!display.getSendText().getText().trim().isEmpty()) {
TheSocialOS.getEventBus().fireEvent(
new ChatSendMessage(userWithChat, display.getSendText().getText()));
display.getSendText().setValue(null);
event.preventDefault();
} else
event.preventDefault();
if ((150 - display.getSendText().getText().length()) < 0)
display.getSendText().setText(display.getSendText().getText().substring(0, 149));
display.lblCharacters().setText(String.valueOf((150 - display.getSendText().getText().length())));
}
});
windowDisplay.addWindowEvents(new WindowEventHandler() {
@Override
public void onTop(WindowOnTopEvent event) {
TheSocialOS.getEventBus().fireEvent(new ChatTopConversations(userWithChat));
TheSocialOS.getEventBus().fireEvent(new DesktopEventOnTop(ChatConversationPresenter.this));
}
@Override
public void onMinimize(WindowMinimizeEvent windowMinimizeEvent) {
TheSocialOS.getEventBus().fireEvent(new ChatHideConversation(userWithChat));
}
@Override
public void onMaximize(WindowMaximizeEvent windowMaximizeEvent) {
// TODO Auto-generated method stub
}
@Override
public void onEndDrag(WindowEndDragEvent event) {
// TODO Auto-generated method stub
TheSocialOS.getEventBus().fireEvent(new DesktopEventonEndDrag(ChatConversationPresenter.this));
}
@Override
public void onClose(WindowCloseEvent event) {
TheSocialOS.getEventBus().fireEvent(new ChatCloseConversation(userWithChat));
TheSocialOS.getEventBus().fireEvent(new DesktopEventOnClose(ChatConversationPresenter.this));
}
@Override
public void onResize(WindowResizeEvent event) {
// TODO Auto-generated method stub
}
});
}
/**
* Write a messageChat in the window
*
* @param message
* to write in the chat window
*/
public void writeMessage(Lines line) {
linesList.add(line);
linesDataProvider.flush();
linesDataProvider.refresh();
// display.getScrollPanel().scrollToBottom();
// display.getScrollPanel().setVerticalScrollPosition(
// display.getScrollPanel().getMaximumVerticalScrollPosition() - 20);
scrollTobottom();
}
private void scrollTobottom() {
Timer timer = new Timer() {
@Override
public void run() {
display.getScrollPanel().scrollToBottom();
cancel();
}
};
timer.schedule(300);
/*
* Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
* @Override public void execute() { // your commands here } });
*/
}
/**
* Make the window have go on top of the desktop
*/
public void setOnTop() {
TheSocialOS.getEventBus().fireEvent(new DesktopEventOnTop(this));
}
@Override
public String getImage() {
// TODO Auto-generated method stub
return image;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return name;
}
@Override
public void setImage(String image) {
this.image = image;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void close(AbsolutePanel absolutePanel) {
absolutePanel.remove(windowDisplay.getWindow());
}
@Override
public int getZposition() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void open(AbsolutePanel absolutePanel) {
absolutePanel.add(windowDisplay.getWindow(), 20, 50);
windowDisplay.getWindow().setVisible(true);
scrollTobottom();
// absolutePanel.add(display.asWidget(), 20, 50);
}
private void initWindow() {
windowDisplay.setResizable(false);
windowDisplay.setWindowTitle(userWithChat.getName());
display.asWidget().setSize("447px", "323px");
windowDisplay.getWindow().add(display.asWidget());
}
@Override
public void toZPosition(int position) {
// TODO Auto-generated method stub
}
}