/** * TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L. * Copyright (C) 2007 Autentia Real Bussiness Solution S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.autentia.tnt.jsf.schedule.renderer; import java.io.IOException; import java.io.Serializable; import java.text.DateFormat; import java.util.Date; import java.util.Map; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.el.ValueBinding; import org.apache.commons.lang.StringUtils; import org.apache.myfaces.custom.schedule.HtmlSchedule; import org.apache.myfaces.custom.schedule.model.ScheduleDay; import org.apache.myfaces.custom.schedule.model.ScheduleEntry; import org.apache.myfaces.custom.schedule.renderer.ScheduleEntryRenderer; import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML; import com.autentia.tnt.bean.activity.ActivityScheduleEntry; import com.autentia.tnt.bean.activity.ExternalActivityScheduleEntry; /** * The default implementation of the ScheduleEntryRenderer * * @author Jurgen Lust (latest modification by $Author$) * @version $Revision$ */ public class ExternalActivityScheduleEntryRenderer implements ScheduleEntryRenderer, Serializable { private static final long serialVersionUID = 1L; /** * @see org.apache.myfaces.custom.schedule.renderer.ScheduleEntryRenderer#renderContent(javax.faces.context.FacesContext, * javax.faces.context.ResponseWriter, * org.apache.myfaces.custom.schedule.HtmlSchedule, * org.apache.myfaces.custom.schedule.model.ScheduleDay, * org.apache.myfaces.custom.schedule.model.ScheduleEntry, boolean, * boolean) */ public void renderContent(FacesContext context, ResponseWriter writer, HtmlSchedule schedule, ScheduleDay day, ScheduleEntry entry, boolean compact, boolean selected) throws IOException { if (compact) { renderCompactContent(context, writer, schedule, day, entry, selected); } else { if (selected) { StringBuffer entryStyle = new StringBuffer(); entryStyle.append("height: 100%; width: 100%;"); // the left border of a selected entry should have the same // color as the entry border String entryColor = getColor(context, schedule, entry, selected); if (entryColor != null) { entryStyle.append("border-color: "); entryStyle.append(entryColor); entryStyle.append(";"); } // draw the contents of the selected entry writer.startElement(HTML.DIV_ELEM, null); writer.writeAttribute(HTML.CLASS_ATTR, getStyleClass(schedule, "text"), null); writer.writeAttribute(HTML.STYLE_ATTR, entryStyle.toString(), null); renderDetailedContentText(context, writer, schedule, day, entry, selected); writer.endElement(HTML.DIV_ELEM); } else { renderDetailedContentText(context, writer, schedule, day, entry, selected); } } } protected void renderCompactContent(FacesContext context, ResponseWriter writer, HtmlSchedule schedule, ScheduleDay day, ScheduleEntry entry, boolean selected) throws IOException { StringBuffer text = new StringBuffer(); Date startTime = entry.getStartTime(); if (day.getDayStart().after(entry.getStartTime())) { startTime = day.getDayStart(); } Date endTime = entry.getEndTime(); if (day.getDayEnd().before(entry.getEndTime())) { endTime = day.getDayEnd(); } if (!entry.isAllDay()) { DateFormat format = DateFormat.getTimeInstance(DateFormat.SHORT); text.append(format.format(startTime)); if (!startTime.equals(endTime)) { text.append("-"); text.append(format.format(endTime)); } text.append(": "); } text.append(StringUtils.abbreviate(entry.getTitle(), 20)); writer.startElement(HTML.SPAN_ELEM, schedule); writer.writeAttribute(HTML.CLASS_ATTR, getStyleClass(schedule, "externalActivity"), null); writer.writeText(text.toString(), null); writer.endElement(HTML.SPAN_ELEM); } protected void renderDetailedContentText(FacesContext context, ResponseWriter writer, HtmlSchedule schedule, ScheduleDay day, ScheduleEntry entry, boolean selected) throws IOException { // write the title of the entry if (entry.getTitle() != null) { writer.startElement(HTML.SPAN_ELEM, schedule); writer.writeAttribute(HTML.CLASS_ATTR, getStyleClass(schedule, "title"), null); writer.writeText(entry.getTitle(), null); writer.endElement(HTML.SPAN_ELEM); } if (entry.getSubtitle() != null) { writer.startElement("br", schedule); writer.endElement("br"); writer.startElement(HTML.SPAN_ELEM, schedule); writer.writeAttribute(HTML.CLASS_ATTR, getStyleClass(schedule, "subtitle"), null); writer.writeText(entry.getSubtitle(), null); writer.endElement(HTML.SPAN_ELEM); } } /** * @see org.apache.myfaces.custom.schedule.renderer.ScheduleEntryRenderer#getColor(javax.faces.context.FacesContext, * org.apache.myfaces.custom.schedule.HtmlSchedule, * org.apache.myfaces.custom.schedule.model.ScheduleEntry, boolean) */ public String getColor(FacesContext context, HtmlSchedule schedule, ScheduleEntry entry, boolean selected) { return null; } /** * @see org.apache.myfaces.custom.schedule.renderer.ScheduleEntryRenderer#renderToolTip(javax.faces.context.FacesContext, * javax.faces.context.ResponseWriter, * org.apache.myfaces.custom.schedule.HtmlSchedule, * org.apache.myfaces.custom.schedule.model.ScheduleEntry, boolean) */ public void renderToolTip(FacesContext context, ResponseWriter writer, HtmlSchedule schedule, ScheduleEntry e, boolean selected) throws IOException { StringBuffer buffer = new StringBuffer(); buffer.append("return makeTrue(domTT_activate(this, event, 'caption', '"); ExternalActivityScheduleEntry entry = (ExternalActivityScheduleEntry) e; if (entry.getTitle() != null) { buffer.append(escape(entry.getTitle())); } buffer.append("', 'content', '<i>"); if (entry.getSubtitle() != null) { buffer.append(escape(entry.getSubtitle())); } buffer.append("</i>"); if (entry.getDescription() != null) { buffer.append("<br/>"); buffer.append(escape(entry.getDescription())); } buffer.append("', 'trail', true));"); writer.writeAttribute("onmouseover", buffer.toString(), null); } private String escape(String text) { if (text == null) { return null; } return text.replaceAll("'", "\\\\\'").replaceAll("\n", "\\\\n").replaceAll("\r", "\\\\r"); } /** * <p> * Allow the developer to specify custom CSS classnames for the schedule * component. * </p> * * @param component * the component * @param className * the default CSS classname * @return the custom classname */ protected String getStyleClass(UIComponent component, String className) { // first check if the styleClass property is a value binding expression ValueBinding binding = component.getValueBinding(className); if (binding != null) { String value = (String) binding.getValue(FacesContext.getCurrentInstance()); if (value != null) { return value; } } // it's not a value binding expression, so check for the string value // in the attributes Map attributes = component.getAttributes(); String returnValue = (String) attributes.get(className); return returnValue == null ? className : returnValue; } }