/* * Copyright 2012-2013 PrimeFaces Extensions. * * Licensed 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. * * $Id$ */ package org.primefaces.extensions.showcase.controller.timeline; import java.io.Serializable; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.TimeZone; import java.util.TreeSet; import javax.annotation.PostConstruct; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import javax.faces.context.FacesContext; import org.primefaces.context.RequestContext; import org.primefaces.extensions.component.timeline.TimelineUpdater; import org.primefaces.extensions.event.timeline.TimelineModificationEvent; import org.primefaces.extensions.model.timeline.TimelineEvent; import org.primefaces.extensions.model.timeline.TimelineModel; import org.primefaces.extensions.showcase.model.timeline.Order; /** * GroupingTimelineController * * @author Oleg Varaksin / last modified by $Author: $ * @version $Revision: 1.0 $ */ @ManagedBean @ViewScoped public class GroupingTimelineController implements Serializable { private TimelineModel model; private TimelineEvent event; // current changed event private List<TimelineEvent> overlappedOrders; // all overlapped orders (events) to the changed order (event) private List<TimelineEvent> ordersToMerge; // selected orders (events) in the dialog which should be merged @PostConstruct protected void initialize() { MessageFormat messageFormat = new MessageFormat("<img src='" + FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath() + "/resources/images/timeline/truck.png' style='vertical-align:middle'>" + "<span style='font-weight:bold;'>Truck {0}</span>"); // initalize markup for group String[] TRUCKS = new String[6]; TRUCKS[0] = messageFormat.format(new String[] {"10"}); TRUCKS[1] = messageFormat.format(new String[] {"11"}); TRUCKS[2] = messageFormat.format(new String[] {"12"}); TRUCKS[3] = messageFormat.format(new String[] {"13"}); TRUCKS[4] = messageFormat.format(new String[] {"14"}); TRUCKS[5] = messageFormat.format(new String[] {"15"}); // create timeline model model = new TimelineModel(); // Server-side dates should be in UTC. They will be converted to a local dates in UI according to provided TimeZone. // Submitted local dates in UI are converted back to UTC, so that server receives all dates in UTC again. Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); int orderNumber = 1; for (String truckText : TRUCKS) { cal.set(2012, Calendar.DECEMBER, 14, 8, 0, 0); for (int i = 0; i < 6; i++) { cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY) + 3 * (Math.random() < 0.2 ? 1 : 0)); Date startDate = cal.getTime(); cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY) + 2 + (int) Math.floor(Math.random() * 4)); Date endDate = cal.getTime(); String imagePath = null; if (Math.random() < 0.25) { imagePath = "/resources/images/timeline/box.png"; } Order order = new Order(orderNumber, imagePath); model.add(new TimelineEvent(order, startDate, endDate, true, truckText)); orderNumber++; } } } public TimelineModel getModel() { return model; } public void onChange(TimelineModificationEvent e) { // get changed event and update the model event = e.getTimelineEvent(); model.update(event); // get overlapped events of the same group as for the changed event TreeSet<TimelineEvent> overlappedEvents = model.getOverlappedEvents(event); if (overlappedEvents == null) { // nothing to merge return; } // list of orders which can be merged in the dialog overlappedOrders = new ArrayList<TimelineEvent>(overlappedEvents); // no pre-selection ordersToMerge = null; // update the dialog's content and show the dialog RequestContext requestContext = RequestContext.getCurrentInstance(); requestContext.update("overlappedOrdersInner"); requestContext.execute("overlapEventsWdgt.show()"); } public void onDelete(TimelineModificationEvent e) { // keep the model up-to-date model.delete(e.getTimelineEvent()); } public void merge() { // merge orders and update UI if the user selected some orders to be merged if (ordersToMerge != null && !ordersToMerge.isEmpty()) { model.merge(event, ordersToMerge, TimelineUpdater.getCurrentInstance(":mainForm:timeline")); } else { FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Nothing to merge, please choose orders to be merged", null); FacesContext.getCurrentInstance().addMessage(null, msg); } overlappedOrders = null; ordersToMerge = null; } public int getSelectedOrder() { if (event == null) { return 0; } return ((Order) event.getData()).getNumber(); } public List<TimelineEvent> getOverlappedOrders() { return overlappedOrders; } public List<TimelineEvent> getOrdersToMerge() { return ordersToMerge; } public void setOrdersToMerge(List<TimelineEvent> ordersToMerge) { this.ordersToMerge = ordersToMerge; } }