org.apache.openmeetings.web.components.user.calendar.CalendarPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.openmeetings.web.components.user.calendar.CalendarPanel.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License") +  you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.openmeetings.web.components.user.calendar;

import static org.apache.wicket.ajax.attributes.CallbackParameter.context;
import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
import static org.apache.wicket.ajax.attributes.CallbackParameter.resolved;

import java.util.Calendar;

import org.apache.openmeetings.data.calendar.daos.AppointmentDao;
import org.apache.openmeetings.persistence.beans.calendar.Appointment;
import org.apache.openmeetings.web.app.Application;
import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.components.UserPanel;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxCallListener;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.json.JSONArray;
import org.apache.wicket.ajax.json.JSONException;
import org.apache.wicket.ajax.json.JSONObject;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.request.handler.TextRequestHandler;

public class CalendarPanel extends UserPanel {

    private static final long serialVersionUID = -6536379497642291437L;

    @Override
    public void onMenuPanelLoad(AjaxRequestTarget target) {
        target.appendJavaScript("calendarInit();");
    }

    public CalendarPanel(String id) {
        super(id);
        WebMarkupContainer calendar = new WebMarkupContainer("calendar");
        calendar.setOutputMarkupId(true);
        calendar.setMarkupId("calendar");
        add(calendar);

        final CalendarForm form = new CalendarForm("appointment",
                new CompoundPropertyModel<Appointment>(new Appointment()));
        add(form);

        //fetchEvents
        add(new AbstractDefaultAjaxBehavior() {
            private static final long serialVersionUID = 6880514947331946407L;

            @Override
            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
                super.updateAjaxAttributes(attributes);
                attributes.setDataType("json");
                attributes.setWicketAjaxResponse(false);
                attributes.getAjaxCallListeners().add(new AjaxCallListener().onSuccess("callback(data);"));
            }

            @Override
            public void renderHead(Component component, IHeaderResponse response) {
                super.renderHead(component, response);
                response.render(
                        JavaScriptHeaderItem.forScript("var fetchEventsFunc = "
                                + this.getCallbackFunction(context("start"), context("end"), context("callback"),
                                        resolved("_start", "start.getTime()"), resolved("_end", "end.getTime()"))
                                + ";", "fetchEventsFunc"));
            }

            @Override
            protected void respond(AjaxRequestTarget target) {
                Calendar start = WebSession.getCalendar();
                start.setTimeInMillis(
                        getRequestCycle().getRequest().getRequestParameters().getParameterValue("_start").toLong());
                Calendar end = WebSession.getCalendar();
                end.setTimeInMillis(
                        getRequestCycle().getRequest().getRequestParameters().getParameterValue("_end").toLong());
                JSONArray events = new JSONArray();
                for (Appointment a : Application.getBean(AppointmentDao.class)
                        .getAppointmentsByRange(WebSession.getUserId(), start.getTime(), end.getTime())) {
                    try {
                        events.put(new JSONObject().put("id", a.getAppointmentId())
                                .put("title", a.getAppointmentName())
                                .put("description", a.getAppointmentDescription())
                                .put("start", WebSession.getDateFormat().format(a.getAppointmentStarttime()))
                                .put("end", WebSession.getDateFormat().format(a.getAppointmentEndtime()))
                                .put("allDay", false));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                getRequestCycle().scheduleRequestHandlerAfterCurrent(
                        new TextRequestHandler("application/json", "UTF-8", events.toString()));
            }
        });
        //dropEvent
        add(new DropResizeBehavior(true, "dropEventFunc"));
        //resizeEvent
        add(new DropResizeBehavior(false, "resizeEventFunc"));
        //create on click-and-drag
        add(new AbstractDefaultAjaxBehavior() {
            private static final long serialVersionUID = 6880514947331946407L;

            @Override
            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
                super.updateAjaxAttributes(attributes);
                attributes.getAjaxCallListeners()
                        .add(new AjaxCallListener().onSuccess("$('#appointment').dialog('open');"));
            }

            @Override
            public void renderHead(Component component, IHeaderResponse response) {
                super.renderHead(component, response);
                response.render(JavaScriptHeaderItem.forScript(
                        "var selectFunc = " + this.getCallbackFunction(context("start"), context("end"),
                                context("allDay"), context("jsEvent"), context("view"),
                                resolved("_start", "start.getTime()"), resolved("_end", "end.getTime()")) + ";",
                        "selectFunc"));
            }

            @Override
            protected void respond(AjaxRequestTarget target) {
                Calendar start = WebSession.getCalendar();
                start.setTimeInMillis(
                        getRequestCycle().getRequest().getRequestParameters().getParameterValue("_start").toLong());
                Calendar end = WebSession.getCalendar();
                end.setTimeInMillis(
                        getRequestCycle().getRequest().getRequestParameters().getParameterValue("_end").toLong());

                if (start.equals(end)) {
                    end.add(Calendar.HOUR_OF_DAY, 1);
                }
                Appointment a = new Appointment();
                a.setAppointmentStarttime(start.getTime());
                a.setAppointmentEndtime(end.getTime());
                form.setModelObject(a);

                target.add(form);
            }
        });
        //eventClick
        add(new AbstractDefaultAjaxBehavior() {
            private static final long serialVersionUID = 6880514947331946407L;

            @Override
            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
                super.updateAjaxAttributes(attributes);
                attributes.getAjaxCallListeners()
                        .add(new AjaxCallListener().onSuccess("$('#appointment').dialog('open');"));
            }

            @Override
            public void renderHead(Component component, IHeaderResponse response) {
                super.renderHead(component, response);
                response.render(
                        JavaScriptHeaderItem.forScript(
                                "var eventClickFunc = " + this.getCallbackFunction(context("event"),
                                        context("jsEvent"), context("view"), resolved("_id", "event.id")) + ";",
                                "eventClickFunc"));
            }

            @Override
            protected void respond(AjaxRequestTarget target) {
                Appointment a = Application.getBean(AppointmentDao.class).getAppointmentById(
                        getRequestCycle().getRequest().getRequestParameters().getParameterValue("_id").toLong());
                form.setModelObject(a);

                target.add(form);
            }
        });
    }

    private class DropResizeBehavior extends AbstractDefaultAjaxBehavior {
        private static final long serialVersionUID = -3060872155563135236L;
        private boolean drop = false;
        private String funcName;

        DropResizeBehavior(boolean drop, String funcName) {
            this.drop = drop;
            this.funcName = funcName;
        }

        @Override
        protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
            super.updateAjaxAttributes(attributes);
            attributes.getAjaxCallListeners().add(new AjaxCallListener().onFailure("revertFunc();"));
        }

        @Override
        public void renderHead(Component component, IHeaderResponse response) {
            super.renderHead(component, response);
            response.render(
                    JavaScriptHeaderItem.forScript(
                            "var " + funcName + " = "
                                    + (drop ? this.getCallbackFunction(
                                            context("event"), explicit("dayDelta"), explicit("minuteDelta"),
                                            context("allDay"), context("revertFunc"), context("jsEvent"),
                                            context("ui"), context("view"), resolved("_id", "event.id"))
                                            : this.getCallbackFunction(context("event"), explicit("dayDelta"),
                                                    explicit("minuteDelta"), context("revertFunc"),
                                                    context("jsEvent"), context("ui"), context("view"),
                                                    resolved("_id", "event.id")))
                                    + ";",
                            funcName));
        }

        @Override
        protected void respond(AjaxRequestTarget target) {
            AppointmentDao dao = Application.getBean(AppointmentDao.class);
            Appointment a = dao.getAppointmentById(
                    getRequestCycle().getRequest().getRequestParameters().getParameterValue("_id").toLong());

            int dayDelta = getRequestCycle().getRequest().getRequestParameters().getParameterValue("dayDelta")
                    .toInt();
            int minuteDelta = getRequestCycle().getRequest().getRequestParameters().getParameterValue("minuteDelta")
                    .toInt();

            Calendar cal = WebSession.getCalendar();
            if (drop) {
                cal.setTime(a.getAppointmentStarttime());
                cal.add(Calendar.DATE, dayDelta);
                cal.add(Calendar.MINUTE, minuteDelta);
                a.setAppointmentStarttime(cal.getTime());
            }
            cal.setTime(a.getAppointmentEndtime());
            cal.add(Calendar.DATE, dayDelta);
            cal.add(Calendar.MINUTE, minuteDelta);
            a.setAppointmentEndtime(cal.getTime());

            dao.updateAppointment(a);
        }
    }
}