/* * * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under * one or more contributor license agreements (see COPYRIGHT for details). * The CA licenses this file to you under the GNU Affero General Public * License version 3, (the "License"); you may not use this file except in * compliance with the License. This file is part of kune. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package cc.kune.events.client.viewer; import java.util.ArrayList; import java.util.Date; import cc.kune.common.client.actions.ui.GuiProvider; import cc.kune.common.client.tooltip.Tooltip; import cc.kune.common.client.ui.UiUtils; import cc.kune.common.shared.i18n.I18nTranslationService; import cc.kune.core.client.dnd.FolderContainerDropController; import cc.kune.core.client.dnd.FolderContentDropController; import cc.kune.core.client.dnd.InboxToContainerDropController; import cc.kune.core.client.dnd.KuneDragController; import cc.kune.core.client.registry.ContentCapabilitiesRegistry; import cc.kune.core.client.resources.CoreResources; import cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView; import cc.kune.events.shared.EventsToolConstants; import cc.kune.gspace.client.armor.GSpaceArmor; import cc.kune.gspace.client.viewers.AbstractFolderViewerPanel; import cc.kune.gspace.client.viewers.ContentTitleWidget; import cc.kune.gspace.client.viewers.items.FolderItemDescriptor; import com.bradrydzewski.gwt.calendar.client.Appointment; import com.bradrydzewski.gwt.calendar.client.Calendar; import com.bradrydzewski.gwt.calendar.client.CalendarSettings; import com.bradrydzewski.gwt.calendar.client.CalendarViews; import com.bradrydzewski.gwt.calendar.client.event.CreateHandler; import com.bradrydzewski.gwt.calendar.client.event.DateRequestHandler; import com.bradrydzewski.gwt.calendar.client.event.DeleteHandler; import com.bradrydzewski.gwt.calendar.client.event.MouseOverEvent; import com.bradrydzewski.gwt.calendar.client.event.MouseOverHandler; import com.bradrydzewski.gwt.calendar.client.event.TimeBlockClickHandler; import com.bradrydzewski.gwt.calendar.client.event.UpdateHandler; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DoubleClickHandler; import com.google.gwt.event.logical.shared.OpenHandler; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.Event.NativePreviewHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.InsertPanel.ForIsWidget; import com.google.gwt.user.client.ui.PopupPanel; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.web.bindery.event.shared.EventBus; // TODO: Auto-generated Javadoc /** * The Class CalendarViewerPanel. * * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado) */ public class CalendarViewerPanel extends AbstractFolderViewerPanel implements CalendarViewerView { /** The calendar. */ private final Calendar calendar; /** The client x. */ private int clientX; /** The client y. */ private int clientY; /** The content title. */ private ContentTitleWidget contentTitle; /** The tooltip panel. */ private PopupPanel tooltipPanel; private String tooltipText; /** * Instantiates a new calendar viewer panel. * * @param gsArmor * the gs armor * @param eventBus * the event bus * @param i18n * the i18n * @param guiProvider * the gui provider * @param res * the res * @param capabilitiesRegistry * the capabilities registry * @param dragController * the drag controller * @param contentDropControllerProv * the content drop controller prov * @param containerDropControllerProv * the container drop controller prov */ @Inject public CalendarViewerPanel(final GSpaceArmor gsArmor, final EventBus eventBus, final I18nTranslationService i18n, final GuiProvider guiProvider, final CoreResources res, final ContentCapabilitiesRegistry capabilitiesRegistry, final KuneDragController dragController, final Provider<FolderContentDropController> contentDropControllerProv, final Provider<FolderContainerDropController> containerDropControllerProv, final InboxToContainerDropController inbDropController) { super(gsArmor, eventBus, i18n, capabilitiesRegistry, dragController, contentDropControllerProv, containerDropControllerProv, inbDropController); calendar = new Calendar(); calendar.setSettings(setCalendarSettings()); widget = calendar; calendar.sinkEvents(Event.ONMOUSEDOWN | Event.ONDBLCLICK | Event.KEYEVENTS | Event.ONMOUSEOVER | Event.ONCLICK); Event.addNativePreviewHandler(new NativePreviewHandler() { @Override public void onPreviewNativeEvent(final NativePreviewEvent eventPrev) { // We store click position in onder to show the menu final NativeEvent natEvent = eventPrev.getNativeEvent(); if (Event.getTypeInt(natEvent.getType()) != Event.ONCLICK) { clientX = natEvent.getClientX(); clientY = natEvent.getClientY(); return; } } }); contentTitle = new ContentTitleWidget(i18n, gsArmor, capabilitiesRegistry.getIconsRegistry()); Window.addResizeHandler(new ResizeHandler() { @Override public void onResize(final ResizeEvent event) { resizeCalendar(); } }); tooltipPanel = new PopupPanel(); Tooltip.to(tooltipPanel, "FIXME"); addMouseOverHandler(new MouseOverHandler<Appointment>() { @Override public void onMouseOver(final MouseOverEvent<Appointment> event) { final Element element = (Element) event.getElement(); tooltipPanel.setPopupPosition(DOM.getAbsoluteLeft(element), DOM.getAbsoluteTop(element) + element.getOffsetHeight()); tooltipPanel.show(); if (Tooltip.getTip().isShowing()) { tooltipPanel.hide(); Tooltip.getTip().hide(); } else { Tooltip.getTip().showTemporally(tooltipPanel, tooltipText); } // NotifyUser.info("On mouse"); } }); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #addAppointment(com.bradrydzewski.gwt.calendar.client.Appointment) */ @Override public void addAppointment(final Appointment appointment) { calendar.addAppointment(appointment); } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.HasAppointments#addAppointments(java * .util.ArrayList) */ @Override public void addAppointments(final ArrayList<Appointment> appointments) { calendar.addAppointments(appointments); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #addClickHandler(com.google.gwt.event.dom.client.ClickHandler) */ @Override public HandlerRegistration addClickHandler(final ClickHandler clickHandler) { return calendar.addHandler(clickHandler, ClickEvent.getType()); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #addCreateHandler * (com.bradrydzewski.gwt.calendar.client.event.CreateHandler) */ @Override public HandlerRegistration addCreateHandler(final CreateHandler<Appointment> handler) { return calendar.addCreateHandler(handler); } /* * (non-Javadoc) * * @see com.bradrydzewski.gwt.calendar.client.event.HasDateRequestHandlers# * addDateRequestHandler * (com.bradrydzewski.gwt.calendar.client.event.DateRequestHandler) */ @Override public HandlerRegistration addDateRequestHandler(final DateRequestHandler<Date> handler) { return calendar.addDateRequestHandler(handler); } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.event.HasDeleteHandlers#addDeleteHandler * (com.bradrydzewski.gwt.calendar.client.event.DeleteHandler) */ @Override public HandlerRegistration addDeleteHandler(final DeleteHandler<Appointment> handler) { return calendar.addDeleteHandler(handler); } /* * (non-Javadoc) * * @see * cc.kune.gspace.client.viewers.AbstractFolderViewerView#addItem(cc.kune. * gspace.client.viewers.items.FolderItemDescriptor, * com.google.gwt.event.dom.client.ClickHandler, * com.google.gwt.event.dom.client.DoubleClickHandler) */ @Override public void addItem(final FolderItemDescriptor item, final ClickHandler clickHandler, final DoubleClickHandler doubleClickHandler) { // Do nothing right now, calendar appointments has a different treatment } /* * (non-Javadoc) * * @see com.bradrydzewski.gwt.calendar.client.event.HasMouseOverHandlers# * addMouseOverHandler * (com.bradrydzewski.gwt.calendar.client.event.MouseOverHandler) */ @Override public HandlerRegistration addMouseOverHandler(final MouseOverHandler<Appointment> handler) { return calendar.addMouseOverHandler(handler); } /* * (non-Javadoc) * * @see * com.google.gwt.event.logical.shared.HasOpenHandlers#addOpenHandler(com. * google.gwt.event.logical.shared.OpenHandler) */ @Override public HandlerRegistration addOpenHandler(final OpenHandler<Appointment> handler) { return calendar.addOpenHandler(handler); } /* * (non-Javadoc) * * @see * com.google.gwt.event.logical.shared.HasSelectionHandlers#addSelectionHandler * (com.google.gwt.event.logical.shared.SelectionHandler) */ @Override public HandlerRegistration addSelectionHandler(final SelectionHandler<Appointment> handler) { return calendar.addSelectionHandler(handler); } /* * (non-Javadoc) * * @see com.bradrydzewski.gwt.calendar.client.event.HasTimeBlockClickHandlers# * addTimeBlockClickHandler * (com.bradrydzewski.gwt.calendar.client.event.TimeBlockClickHandler) */ @Override public HandlerRegistration addTimeBlockClickHandler(final TimeBlockClickHandler<Date> handler) { return calendar.addTimeBlockClickHandler(handler); } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.event.HasUpdateHandlers#addUpdateHandler * (com.bradrydzewski.gwt.calendar.client.event.UpdateHandler) */ @Override public HandlerRegistration addUpdateHandler(final UpdateHandler<Appointment> handler) { return calendar.addUpdateHandler(handler); } /* * (non-Javadoc) * * @see cc.kune.gspace.client.viewers.AbstractFolderViewerPanel#attach() */ @Override public void attach() { calendar.setSettings(setCalendarSettings()); super.attach(); } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.HasAppointments#clearAppointments() */ @Override public void clearAppointments() { if (calendar.getAppointments().size() > 0) { calendar.clearAppointments(); } } /* * (non-Javadoc) * * @see cc.kune.gspace.client.viewers.AbstractFolderViewerPanel#detach() */ @Override public void detach() { super.detach(); } /* * (non-Javadoc) * * @see com.bradrydzewski.gwt.calendar.client.HasLayout#doLayout() */ @Override public void doLayout() { calendar.doLayout(); } /* * (non-Javadoc) * * @see * com.google.gwt.event.shared.HasHandlers#fireEvent(com.google.gwt.event. * shared.GwtEvent) */ @Override public void fireEvent(final GwtEvent<?> event) { calendar.fireEvent(event); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #getClientX() */ @Override public int getClientX() { return clientX; } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #getClientY() */ @Override public int getClientY() { return clientY; } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #getCurrentDate() */ @Override public Date getCurrentDate() { return calendar.getDate(); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #getDate() */ @Override public Date getDate() { return calendar.getDate(); } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.HasAppointments#getSelectedAppointment * () */ @Override public Appointment getSelectedAppointment() { return calendar.getSelectedAppointment(); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #goToday() */ @Override public void goToday() { calendar.setDate(new Date()); // calendar date, not required } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.HasAppointments#hasAppointmentSelected * () */ @Override public boolean hasAppointmentSelected() { return calendar.hasAppointmentSelected(); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #removeAppointment(com.bradrydzewski.gwt.calendar.client.Appointment) */ @Override public void removeAppointment(final Appointment appointment) { calendar.removeAppointment(appointment); } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.HasAppointments#removeAppointment * (com.bradrydzewski.gwt.calendar.client.Appointment, boolean) */ @Override public void removeAppointment(final Appointment appointment, final boolean fireEvents) { calendar.removeAppointment(appointment, fireEvents); } /** * Resize calendar. */ protected void resizeCalendar() { super.resizeHeight(calendar); calendar.doLayout(); } /* * (non-Javadoc) * * @see com.bradrydzewski.gwt.calendar.client.HasLayout#resumeLayout() */ @Override public void resumeLayout() { calendar.resumeLayout(); } /** * Sets the calendar settings. * * @return the calendar settings */ private CalendarSettings setCalendarSettings() { final CalendarSettings settings = new CalendarSettings(); settings.setIntervalsPerHour(4); settings.setPixelsPerInterval(10); // With Single is very annoying // settings.setTimeBlockClickNumber(Click.Single); // settings.setOffsetHourLabels(true); settings.setScrollToHour(8); return settings; } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #setDate(java.util.Date) */ @Override public void setDate(final Date date) { calendar.setDate(date); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #setOnMouseOverTooltipText(java.lang.String) */ @Override public void setOnMouseOverTooltipText(final String text) { this.tooltipText = text; } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.HasAppointments#setSelectedAppointment * (com.bradrydzewski.gwt.calendar.client.Appointment) */ @Override public void setSelectedAppointment(final Appointment appointment) { calendar.setSelectedAppointment(appointment); } /* * (non-Javadoc) * * @see * com.bradrydzewski.gwt.calendar.client.HasAppointments#setSelectedAppointment * (com.bradrydzewski.gwt.calendar.client.Appointment, boolean) */ @Override public void setSelectedAppointment(final Appointment appointment, final boolean fireEvents) { calendar.setSelectedAppointment(appointment, fireEvents); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #setView(com.bradrydzewski.gwt.calendar.client.CalendarViews) */ @Override public void setView(final CalendarViews view) { calendar.setView(view); calendar.scrollToHour(6); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #setView(com.bradrydzewski.gwt.calendar.client.CalendarViews, int) */ @Override public void setView(final CalendarViews view, final int days) { calendar.setView(view, days); calendar.scrollToHour(6); } /* * (non-Javadoc) * * @see * cc.kune.gspace.client.viewers.AbstractFolderViewerPanel#showEmptyMsg(java * .lang.String) */ @Override public void showEmptyMsg(final String emptyMessage) { // Don't do nothing // super.showEmptyMsg(emptyMessage); } /* * (non-Javadoc) * * @see cc.kune.gspace.client.viewers.AbstractFolderViewerPanel#showFolder() */ @Override public void showFolder() { super.showFolder(); gsArmor.enableCenterScroll(false); resizeCalendar(); } /* * (non-Javadoc) * * @see com.bradrydzewski.gwt.calendar.client.HasLayout#suspendLayout() */ @Override public void suspendLayout() { calendar.suspendLayout(); } /* * (non-Javadoc) * * @see * cc.kune.events.client.viewer.CalendarViewerPresenter.CalendarViewerView * #updateTitle(com.bradrydzewski.gwt.calendar.client.CalendarViews) */ @Override public void updateTitle(final CalendarViews currentCalView) { final Date currentDate = getDate(); DateTimeFormat fmt = null; // More info about formats: // http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/i18n/client/DateTimeFormat.html switch (currentCalView) { case DAY: case AGENDA: fmt = DateTimeFormat.getFormat("EEEE, MMMM dd, yyyy"); break; case MONTH: default: fmt = DateTimeFormat.getFormat("MMMM yyyy"); break; } final String dateFormatted = fmt.format(currentDate); final ForIsWidget docHeader = gsArmor.getDocHeader(); UiUtils.clear(docHeader); contentTitle.setTitle(i18n.t("Events in [%s]", dateFormatted), EventsToolConstants.TYPE_ROOT, null, false); docHeader.add(contentTitle); } }