package kornell.gui.client.personnel; import java.util.ArrayList; import com.google.gwt.core.client.Scheduler; import com.google.gwt.place.shared.Place; import com.google.gwt.place.shared.PlaceChangeEvent; import com.google.gwt.place.shared.PlaceController; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.PopupPanel; import com.google.web.bindery.event.shared.EventBus; import kornell.api.client.Callback; import kornell.api.client.ChatThreadsClient; import kornell.api.client.KornellSession; import kornell.core.entity.EntityFactory; import kornell.core.to.CourseClassTO; import kornell.core.to.CourseClassesTO; import kornell.core.to.UnreadChatThreadsTO; import kornell.core.to.UserInfoTO; import kornell.gui.client.ViewFactory; import kornell.gui.client.event.ComposeMessageEvent; import kornell.gui.client.event.ComposeMessageEventHandler; import kornell.gui.client.event.CourseClassesFetchedEvent; import kornell.gui.client.event.CourseClassesFetchedEventHandler; import kornell.gui.client.event.LoginEvent; import kornell.gui.client.event.LoginEventHandler; import kornell.gui.client.event.UnreadMessagesFetchedEvent; import kornell.gui.client.event.UnreadMessagesPerThreadFetchedEvent; import kornell.gui.client.presentation.admin.AdminPlace; import kornell.gui.client.presentation.admin.courseclass.courseclass.AdminCourseClassPlace; import kornell.gui.client.presentation.classroom.ClassroomPlace; import kornell.gui.client.presentation.message.MessagePlace; import kornell.gui.client.presentation.message.compose.MessageComposePresenter; import kornell.gui.client.presentation.message.compose.MessageComposeView; import kornell.gui.client.presentation.vitrine.VitrinePlace; import kornell.gui.client.util.view.Positioning; public class MrPostman implements ComposeMessageEventHandler, LoginEventHandler, CourseClassesFetchedEventHandler { private static PopupPanel popup; private EventBus bus; private KornellSession session; private ViewFactory viewFactory; private EntityFactory entityFactory; private ChatThreadsClient chatThreadsClient; private PlaceController placeCtrl; private MessageComposeView.Presenter messageComposePresenter; private Timer unreadMessagesCountTimer; private Timer unreadMessagesCountPerThreadTimer; private ArrayList<CourseClassTO> helpCourseClasses; public MrPostman(ViewFactory viewFactory, EventBus bus, KornellSession session, PlaceController placeCtrl, EntityFactory entityFactory, CourseClassesTO courseClassesTO) { this.viewFactory = viewFactory; this.bus = bus; this.session = session; this.entityFactory = entityFactory; this.chatThreadsClient = session.chatThreads(); this.placeCtrl = placeCtrl; filterHelpCourseClasses(courseClassesTO); initializeMessagePresenters(); // initializeUnreadMessagesCountTimer(); initializeUnreadMessagesCountPerThreadTimer(); this.bus.addHandler(ComposeMessageEvent.TYPE, this); this.bus.addHandler(LoginEvent.TYPE, this); this.bus.addHandler(CourseClassesFetchedEvent.TYPE, this); } private void initializeMessagePresenters() { viewFactory.getMessagePresenter(); viewFactory.getMessagePresenterClassroomGlobalChat(); viewFactory.getMessagePresenterClassroomTutorChat(); if (session.hasAnyAdminRole()) { viewFactory.getMessagePresenterCourseClass(); } this.messageComposePresenter = new MessageComposePresenter(placeCtrl, session, viewFactory, entityFactory); } private void initializeUnreadMessagesCountPerThreadTimer() { Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { getUnreadMessagesPerThread(); } }); unreadMessagesCountPerThreadTimer = new Timer() { public void run() { getUnreadMessagesPerThread(); } }; // Schedule the timer to run every 30 seconds unreadMessagesCountPerThreadTimer.scheduleRepeating(30 * 1000); bus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() { @Override public void onPlaceChange(PlaceChangeEvent event) { Place place = event.getNewPlace(); if (place instanceof MessagePlace || place instanceof AdminCourseClassPlace || place instanceof ClassroomPlace) { getUnreadMessagesPerThread(true); } if (popup != null && popup.isShowing()) { boolean showingPlacePanel = !(place instanceof VitrinePlace || place instanceof ClassroomPlace || place instanceof AdminPlace); int popupPosition = showingPlacePanel ? Positioning.NORTH_BAR_PLUS : Positioning.NORTH_BAR; popup.setPopupPosition(popup.getAbsoluteLeft(), popupPosition); } } }); } private void getUnreadMessagesPerThread() { getUnreadMessagesPerThread(false); } private void getUnreadMessagesPerThread(boolean forceFetch) { if (forceFetch || !(placeCtrl.getWhere() instanceof VitrinePlace)) { chatThreadsClient.getTotalUnreadCountsPerThread( new Callback<UnreadChatThreadsTO>() { @Override public void ok(UnreadChatThreadsTO unreadChatThreadsTO) { bus.fireEvent(new UnreadMessagesPerThreadFetchedEvent(unreadChatThreadsTO .getUnreadChatThreadTOs())); } }); } } @Override public void onLogin(UserInfoTO user) { // Fetch all messages after 2 seconds new Timer() { public void run() { getUnreadMessagesPerThread(true); } }.schedule(2 * 1000); } @Override public void onCourseClassesFetched(CourseClassesFetchedEvent event) { filterHelpCourseClasses(event.getCourseClassesTO()); } private void filterHelpCourseClasses(CourseClassesTO courseClassesTO) { this.helpCourseClasses = new ArrayList<CourseClassTO>(); if (courseClassesTO != null) { for (CourseClassTO courseClassTO : courseClassesTO.getCourseClasses()) { if ((courseClassTO.getEnrollment() != null || courseClassTO.getCourseClass().isPublicClass()) && !courseClassTO.getCourseClass().isInvisible()) { this.helpCourseClasses.add(courseClassTO); } } } } @Override public void onComposeMessage(ComposeMessageEvent event) { if (popup == null || !popup.isShowing()) { messageComposePresenter.init(helpCourseClasses); show(event.isShowingPlacePanel()); } else { hide(); } } @SuppressWarnings("unused") private void initializeUnreadMessagesCountTimer() { Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { getUnreadMessages(); } }); unreadMessagesCountTimer = new Timer() { public void run() { getUnreadMessages(); } }; // Schedule the timer to run every 2 minutes unreadMessagesCountTimer.scheduleRepeating(2 * 60 * 1000); } private void getUnreadMessages() { if (!(placeCtrl.getWhere() instanceof VitrinePlace)) { chatThreadsClient.getTotalUnreadCount(new Callback<String>() { @Override public void ok(String unreadMessagesCount) { bus.fireEvent(new UnreadMessagesFetchedEvent(unreadMessagesCount)); } }); } } public void show(boolean showingPlacePanel) { if (popup == null) { popup = new PopupPanel(false, false); popup.addStyleName("messagesPopup"); FlowPanel panel = new FlowPanel(); if (messageComposePresenter != null) { panel.add(messageComposePresenter.asWidget()); } popup.setGlassEnabled(false); popup.add(panel); popup.center(); } popup.show(); popup.setPopupPosition(popup.getAbsoluteLeft(), showingPlacePanel ? Positioning.NORTH_BAR_PLUS : Positioning.NORTH_BAR); } public static void hide() { if (popup != null) { popup.hide(); } } }