package org.argeo.app.swt.forms; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.temporal.TemporalAccessor; import org.argeo.api.cms.CmsLog; import org.argeo.eclipse.ui.EclipseUiUtils; /** Utilitary methods to ease implementation of CMS forms */ public class FormUtils { private final static CmsLog log = CmsLog.getLog(FormUtils.class); public final static String DEFAULT_SHORT_DATE_FORMAT = "dd/MM/yyyy"; /** Best effort to convert a String to a calendar. Fails silently */ public static TemporalAccessor parseDate(DateTimeFormatter dateFormat, String calStr) { if (EclipseUiUtils.notEmpty(calStr)) { try { return dateFormat.parse(calStr); // cal = new GregorianCalendar(); // cal.setTime(date); } catch (DateTimeParseException pe) { // Silent log.warn("Unable to parse date: " + calStr + " - msg: " + pe.getMessage()); throw pe; } } return null; } // /** Add a double click listener on tables that display a JCR node list */ // public static void addCanonicalDoubleClickListener(final TableViewer v) { // v.addDoubleClickListener(new IDoubleClickListener() { // // @Override // public void doubleClick(DoubleClickEvent event) { // CmsView cmsView = CmsUiUtils.getCmsView(); // Node node = (Node) ((IStructuredSelection) event.getSelection()) // .getFirstElement(); // try { // cmsView.navigateTo(node.getPath()); // } catch (RepositoryException e) { // throw new CmsException("Unable to get path for node " // + node + " before calling navigateTo(path)", e); // } // } // }); // } // MANAGE ERROR DECORATION // public static ControlDecoration addDecoration(final Text text) { // final ControlDecoration dynDecoration = new ControlDecoration(text, // SWT.LEFT); // Image icon = getDecorationImage(FieldDecorationRegistry.DEC_ERROR); // dynDecoration.setImage(icon); // dynDecoration.setMarginWidth(3); // dynDecoration.hide(); // return dynDecoration; // } // // public static void refreshDecoration(Text text, ControlDecoration deco, // boolean isValid, boolean clean) { // if (isValid || clean) { // text.setBackground(null); // deco.hide(); // } else { // text.setBackground(new Color(text.getDisplay(), 250, 200, 150)); // deco.show(); // } // } // // public static Image getDecorationImage(String image) { // FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault(); // return registry.getFieldDecoration(image).getImage(); // } // // public static void addCompulsoryDecoration(Label label) { // final ControlDecoration dynDecoration = new ControlDecoration(label, // SWT.RIGHT | SWT.TOP); // Image icon = getDecorationImage(FieldDecorationRegistry.DEC_REQUIRED); // dynDecoration.setImage(icon); // dynDecoration.setMarginWidth(3); // } // TODO the read only generation of read only links for various contact type // should be factorised in the cms Utils. /** * Creates the read-only HTML snippet to display in a label with styling enabled * in order to provide a click-able phone number */ public static String getPhoneLink(String value) { return getPhoneLink(value, value); } /** * Creates the read-only HTML snippet to display in a label with styling enabled * in order to provide a click-able phone number * * @param value * @param label a potentially distinct label * @return the link */ public static String getPhoneLink(String value, String label) { StringBuilder builder = new StringBuilder(); builder.append("").append(label).append(""); return builder.toString(); } /** * Creates the read-only HTML snippet to display in a label with styling enabled * in order to provide a click-able mail */ public static String getMailLink(String value) { return getMailLink(value, value); } /** * Creates the read-only HTML snippet to display in a label with styling enabled * in order to provide a click-able mail * * @param value * @param label a potentially distinct label * @return the link */ public static String getMailLink(String value, String label) { StringBuilder builder = new StringBuilder(); value = replaceAmpersand(value); builder.append("").append(label).append(""); return builder.toString(); } /** * Creates the read-only HTML snippet to display in a label with styling enabled * in order to provide a click-able link */ public static String getUrlLink(String value) { return getUrlLink(value, value); } /** * Creates the read-only HTML snippet to display in a label with styling enabled * in order to provide a click-able link */ public static String getUrlLink(String value, String label) { StringBuilder builder = new StringBuilder(); value = replaceAmpersand(value); label = replaceAmpersand(label); if (!(value.startsWith("http://") || value.startsWith("https://"))) value = "http://" + value; builder.append("" + label + ""); return builder.toString(); } private static String AMPERSAND = "&"; /** * Cleans a String by replacing any '&' by its HTML encoding '&' to * avoid SAXParseException while rendering HTML with RWT */ public static String replaceAmpersand(String value) { value = value.replaceAll("&(?![#a-zA-Z0-9]+;)", AMPERSAND); return value; } // Prevents instantiation private FormUtils() { } }