package org.rhq.coregui.client.components.table; import java.util.Date; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; import com.smartgwt.client.widgets.grid.CellFormatter; import com.smartgwt.client.widgets.grid.HoverCustomizer; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; /** * Formats a timestamp (i.e. milliseconds since Epoch). * * @author Ian Springer */ public class TimestampCellFormatter implements CellFormatter { public static final DateTimeFormat DATE_TIME_FORMAT_FULL = DateTimeFormat .getFormat(PredefinedFormat.DATE_TIME_FULL); public static final DateTimeFormat DATE_TIME_FORMAT_LONG = DateTimeFormat .getFormat(PredefinedFormat.DATE_TIME_LONG); public static final DateTimeFormat DATE_TIME_FORMAT_MEDIUM = DateTimeFormat .getFormat(PredefinedFormat.DATE_TIME_MEDIUM); public static final DateTimeFormat DATE_TIME_FORMAT_SHORT = DateTimeFormat .getFormat(PredefinedFormat.DATE_TIME_SHORT); private DateTimeFormat dateTimeFormat; /** * Uses MEDIUM format. */ public TimestampCellFormatter() { this(DATE_TIME_FORMAT_MEDIUM); } public TimestampCellFormatter(DateTimeFormat dateTimeFormat) { super(); this.dateTimeFormat = dateTimeFormat; } public String format(Object value, ListGridRecord record, int rowNum, int colNum) { return format(value, dateTimeFormat); } /** * @param value * @return MEDIUM format for value */ public static String format(Object value) { return format(value, DATE_TIME_FORMAT_MEDIUM); } /** * This is a public static so others can use the same date/time format as the cell formatter, * even if the caller doesn't have data from a cell or list grid. This can keep date formatting * consistent across the app, whether the data is in a cell or not. * * @param value the date to format as a Date, Long, Integer or a String * @param dateTimeFormat the format to use. If null defaults to SHORT format * * @return the formatted date string */ public static String format(Object value, DateTimeFormat dateTimeFormat) { if (value == null) { return ""; } Date date; if (value instanceof Date) { date = (Date) value; } else { long longValue; if (value instanceof Long) { longValue = (Long) value; } else if (value instanceof Integer) { longValue = (Integer) value; } else if (value instanceof String) { try { longValue = Long.parseLong((String) value); } catch (NumberFormatException e) { // allow special string values return (String) value; } } else { throw new IllegalArgumentException("value parameter is not a Date, Long, Integer, or a String."); } if (longValue == 0) { return ""; } date = new Date(longValue); } return (null == dateTimeFormat) ? DATE_TIME_FORMAT_MEDIUM.format(date) : dateTimeFormat.format(date); } public static void prepareDateField(final ListGridField field) { prepareDateField(field, field.getName()); } public static void prepareDateField(final ListGridField field, final String dateTimeAttributeName) { field.setCellFormatter(new TimestampCellFormatter()); field.setShowHover(true); field.setHoverCustomizer(getHoverCustomizer(dateTimeAttributeName)); } public static HoverCustomizer getHoverCustomizer(final String dateTimeAttributeName) { return new HoverCustomizer() { public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) { if (value instanceof Date) { Date attribValue = record.getAttributeAsDate(dateTimeAttributeName); return getHoverDateString(attribValue); } return value.toString(); } }; } /** * Returns an HTML string that can be used in as hover for a date field. * It formats the date in the FULL format. * * @param date * @return HTML string that shows the date in FULL format, * or <code>null</code> if <code>date</code> is <code>null</code> */ public static String getHoverDateString(Date date) { if (date != null) { StringBuilder sb = new StringBuilder("<p style='width:300px'>"); sb.append(format(date, DATE_TIME_FORMAT_FULL)); sb.append("</p>"); return sb.toString(); } else { return null; } } }