/hablar/src/com/calclab/hablar/chat/client/ui/ChatPresenter.java

http://emite.googlecode.com/ · Java · 97 lines · 77 code · 12 blank · 8 comment · 8 complexity · 939b0b90f0e88df682b4ca081fd3946d MD5 · raw file

  1. package com.calclab.hablar.chat.client.ui;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import com.calclab.emite.core.client.events.StateChangedEvent;
  5. import com.calclab.emite.core.client.events.StateChangedHandler;
  6. import com.calclab.emite.core.client.xmpp.stanzas.Message;
  7. import com.calclab.emite.im.client.chat.Chat;
  8. import com.calclab.emite.im.client.chat.ChatStates;
  9. import com.calclab.hablar.core.client.browser.BrowserFocusHandler;
  10. import com.calclab.hablar.core.client.mvp.HablarEventBus;
  11. import com.calclab.hablar.core.client.page.PagePresenter;
  12. import com.calclab.hablar.core.client.validators.Empty;
  13. import com.google.gwt.event.dom.client.FocusEvent;
  14. import com.google.gwt.event.dom.client.FocusHandler;
  15. /**
  16. * Shared code for different chat presenters (currently PairChatPresenter and
  17. * RoomPresenter). Not intended for instance directly
  18. *
  19. */
  20. public class ChatPresenter extends PagePresenter<ChatDisplay> implements ChatPage {
  21. private static final String ODD = "odd";
  22. private static final String EVEN = "even";
  23. private final ArrayList<ChatMessage> messages;
  24. private String currentClass;
  25. private String lastAuthor;
  26. public ChatPresenter(final String pageType, final String id, final HablarEventBus eventBus, final Chat chat,
  27. final ChatDisplay display) {
  28. super(pageType, id, eventBus, display);
  29. messages = new ArrayList<ChatMessage>();
  30. this.currentClass = ODD;
  31. this.lastAuthor = null;
  32. display.getTextBoxFocus().addFocusHandler(new FocusHandler() {
  33. @Override
  34. public void onFocus(final FocusEvent event) {
  35. setVisibility(Visibility.focused);
  36. }
  37. });
  38. chat.addChatStateChangedHandler(true, new StateChangedHandler() {
  39. @Override
  40. public void onStateChanged(final StateChangedEvent event) {
  41. setState(event.getState());
  42. }
  43. });
  44. }
  45. /**
  46. * Add message to the chat display.
  47. */
  48. @Override
  49. public void addMessage(final ChatMessage message) {
  50. final boolean sameAuthor = (lastAuthor == null ? message.author == null : lastAuthor.equals(message.author));
  51. if (!sameAuthor) {
  52. currentClass = currentClass == EVEN ? ODD : EVEN;
  53. lastAuthor = message.author;
  54. }
  55. messages.add(message);
  56. display.addMessage(message, currentClass);
  57. }
  58. @Override
  59. public ArrayList<ChatMessage> getMessages() {
  60. return messages;
  61. }
  62. @Override
  63. public void setVisibility(final Visibility visibility) {
  64. super.setVisibility(visibility);
  65. if ((visibility == Visibility.focused) && BrowserFocusHandler.getInstance().hasFocus()) {
  66. display.setTextBoxFocus(true);
  67. }
  68. }
  69. protected void sendMessage(final Chat chat, final ChatDisplay display) {
  70. final String text = display.getBody().getText().trim();
  71. if (Empty.not(text)) {
  72. final ChatMessage message = new ChatMessage("me", text, ChatMessage.MessageType.sent);
  73. message.color = ColorHelper.ME;
  74. message.setDate(new Date());
  75. addMessage(message);
  76. chat.send(new Message(text));
  77. display.clearAndFocus();
  78. }
  79. }
  80. protected void setState(final String chatState) {
  81. final boolean visible = ChatStates.ready.equals(chatState);
  82. display.setControlsVisible(visible);
  83. display.setStatusVisible(visible);
  84. }
  85. }