package net.thesocialos.client.chat; import java.util.ArrayList; import java.util.List; import java.util.Map; import net.thesocialos.client.CacheLayer; import net.thesocialos.client.TheSocialOS; import net.thesocialos.client.app.AppConstants; import net.thesocialos.client.chat.events.ChatMenuMinimize; import net.thesocialos.client.chat.events.ChatOpenConversation; import net.thesocialos.client.desktop.DesktopUnit; import net.thesocialos.client.event.AvatarUpdateEvent; import net.thesocialos.client.event.AvatarUpdateEventHandler; import net.thesocialos.shared.ChannelApiEvents.ChApiChatUserChngState.STATETYPE; 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.user.cellview.client.CellList; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.CellPreviewEvent; import com.google.gwt.view.client.CellPreviewEvent.Handler; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.ProvidesKey; import com.google.gwt.view.client.SingleSelectionModel; public class ChatMenuPresenter extends DesktopUnit { public interface Display { Widget asWidget(); CellList<User> getCellContacts(); HorizontalPanel getConversationsPanel(); Label getName(); Label getSurname(); Label getEmail(); Label getStateLabel(); FocusPanel getStateFocus(); HTMLPanel getStateCircle(); Image getAvatar(); Label getMinimizeButton(); Label getUnreadMessages(); } Display display; private static Integer clickCount = new Integer(0); SingleSelectionModel<User> selectionModel; ListDataProvider<User> dataProvider; /* * Los modelos de la cajas de seleccion de los usuarios */ ProvidesKey<User> KEY_USERS_PROVIDER; List<User> usersList = new ArrayList<User>(); ChatManager chatManager; POPUPMenu popUPMenu; public ChatMenuPresenter(Display display, ChatManager chatManager) { super(AppConstants.CHAT, "Chat", null, TypeUnit.STATIC, false); this.display = display; this.chatManager = chatManager; init(); } public void refeshContacts(Map<String, User> result) { usersList.clear(); usersList.addAll(result.values()); dataProvider.flush(); dataProvider.refresh(); } public void changeContactState(String userEmail, STATETYPE stateType, String customMSG) { for (int a = 0; a < dataProvider.getList().size(); a++) if (dataProvider.getList().get(a).getEmail().equalsIgnoreCase(userEmail)) dataProvider.getList().get(a).chatState = stateType; dataProvider.flush(); dataProvider.refresh(); } public void changeUserState(STATETYPE StateType) { display.getStateLabel().setText(StateType.toString()); switch (StateType) { case ONLINE: display.getStateCircle().setStyleName("chatMenu_circle_online"); break; case AFK: display.getStateCircle().setStyleName("chatMenu_circle_away"); break; case BUSY: display.getStateCircle().setStyleName("chatMenu_circle_busy"); break; case OFFLINE: display.getStateCircle().setStyleName("chatMenu_circle_offline"); break; default: break; } } private void init() { selectionModel = new SingleSelectionModel<User>(KEY_USERS_PROVIDER); display.getCellContacts().setSelectionModel(selectionModel); dataProvider = new ListDataProvider<User>(usersList); dataProvider.addDataDisplay(display.getCellContacts()); display.getName().setText(CacheLayer.UserCalls.getUser().getName()); display.getSurname().setText(CacheLayer.UserCalls.getUser().getLastName()); display.getEmail().setText(CacheLayer.UserCalls.getUser().getEmail()); popUPMenu = new POPUPMenu(); /** Avatar set **/ if (CacheLayer.UserCalls.getAvatar() == null) display.getAvatar().setUrl("./images/anonymous_avatar.png"); else display.getAvatar().setUrl(CacheLayer.UserCalls.getAvatar()); handlers(); } private void handlers() { display.getStateFocus().addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (!chatManager.disconnect) popUPMenu.show(event.getClientX(), event.getClientY()); } }); final Timer t = new Timer() { @Override public void run() { System.out.println("click Reseteado"); clickCount = 0; cancel(); } }; display.getCellContacts().addCellPreviewHandler(new Handler<User>() { @Override public void onCellPreview(CellPreviewEvent<User> event) { // System.out.println(event.getValue().getOwnKey()); if (event.getNativeEvent().getType().equalsIgnoreCase("click")) { clickCount++; t.schedule(500); if (clickCount > 1) // System.out.println("double click"); if (!chatManager.disconnect) TheSocialOS.getEventBus().fireEvent(new ChatOpenConversation(event.getValue().getOwnKey())); } } }); display.getMinimizeButton().addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (!chatManager.disconnect) TheSocialOS.getEventBus().fireEvent(new ChatMenuMinimize()); } }); TheSocialOS.getEventBus().addHandler(AvatarUpdateEvent.TYPE, new AvatarUpdateEventHandler() { @Override public void onAvatarUpdate(AvatarUpdateEvent event) { if (CacheLayer.UserCalls.getAvatar() == null) display.getAvatar().setUrl( "./images/anonymous_avatar.png"); else display.getAvatar().setUrl(CacheLayer.UserCalls.getAvatar()); } }); } @Override public void close(AbsolutePanel absolutePanel) { absolutePanel.remove(display.asWidget()); } @Override public int getZposition() { // TODO Auto-generated method stub return 0; } @Override public void open(AbsolutePanel absolutePanel) { absolutePanel.add(display.asWidget()); } @Override public void toZPosition(int position) { // TODO Auto-generated method stub } @Override public void toBack() { } @Override public void toFront() { } public boolean hideRestore() { if (chatManager.isHide) { display.getConversationsPanel().setStyleName("ChatMenu_restore", true); display.getConversationsPanel().setStyleName("ChatMenu_hide", false); display.getUnreadMessages().setText("0"); chatManager.isHide = !chatManager.isHide; return false; } else { display.getConversationsPanel().setStyleName("ChatMenu_restore", false); display.getConversationsPanel().setStyleName("ChatMenu_hide", true); chatManager.isHide = !chatManager.isHide; return true; } } public void disconnected(boolean disconnect) { if (disconnect) { display.getConversationsPanel().setStyleName("ChatMenu_restore", false); display.getConversationsPanel().setStyleName("ChatMenu_hide", true); chatManager.isHide = true; } else { display.getConversationsPanel().setStyleName("ChatMenu_restore", true); display.getConversationsPanel().setStyleName("ChatMenu_hide", false); chatManager.isHide = false; } } /** * Add a unread message on chat bar */ public void addUnreadMessage() { if (chatManager.isHide) display.getUnreadMessages().setText( String.valueOf(Integer.parseInt(display.getUnreadMessages().getText()) + 1)); } private class POPUPMenu { MenuBar menuBar = new MenuBar(true); PopupPanel popUpPanel = new PopupPanel(true); private POPUPMenu() { menuBar.addItem(new MenuItem(STATETYPE.ONLINE.toString(), new Command() { @Override public void execute() { chatManager.changeState(STATETYPE.ONLINE, null); popUpPanel.hide(); } })); menuBar.addItem(new MenuItem(STATETYPE.BUSY.toString(), new Command() { @Override public void execute() { chatManager.changeState(STATETYPE.BUSY, null); popUpPanel.hide(); } })); menuBar.addItem(new MenuItem(STATETYPE.AFK.toString(), new Command() { @Override public void execute() { chatManager.changeState(STATETYPE.AFK, null); popUpPanel.hide(); } })); menuBar.addItem(new MenuItem(STATETYPE.OFFLINE.toString(), new Command() { @Override public void execute() { chatManager.changeState(STATETYPE.OFFLINE, null); popUpPanel.hide(); } })); popUpPanel.add(menuBar); } public void show(int left, int top) { popUpPanel.setPopupPosition(left, top); popUpPanel.show(); } } }