package org.swellrt.client.editor; import org.waveprotocol.wave.client.editor.content.paragraph.Paragraph; import org.waveprotocol.wave.client.editor.content.paragraph.Paragraph.LineStyle; import org.waveprotocol.wave.model.conversation.AnnotationConstants; import org.waveprotocol.wave.model.util.CollectionUtils; import org.waveprotocol.wave.model.util.ReadableStringSet; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class TextEditorDefinitions { public interface LineStyleFactory { public Map<String, Paragraph.LineStyle> getStyles(); } public static final String PARAGRAPH_ANNOTATION_PREFIX = "paragraph"; public static final String STYLE_ANNOTATION_PREFIX = "style"; public enum ParagraphAnnotation { LIST_STYLE_TYPE(PARAGRAPH_ANNOTATION_PREFIX + "/" + "listStyleType", null, new LineStyleFactory() { @Override public Map<String, LineStyle> getStyles() { Map<String, LineStyle> m = new HashMap<String, LineStyle>(); m.put("decimal", Paragraph.listStyle(Paragraph.LIST_STYLE_DECIMAL)); m.put("unordered", Paragraph.listStyle(null)); return m; } }), TEXT_ALIGN(PARAGRAPH_ANNOTATION_PREFIX + "/" + "textAlign", "left", new LineStyleFactory() { @Override public Map<String, LineStyle> getStyles() { Map<String, LineStyle> m = new HashMap<String, LineStyle>(); m.put("left", Paragraph.Alignment.LEFT); m.put("center", Paragraph.Alignment.CENTER); m.put("right", Paragraph.Alignment.RIGHT); m.put("justify", Paragraph.Alignment.JUSTIFY); return m; } }), HEADER(PARAGRAPH_ANNOTATION_PREFIX + "/" + "header", "none", new LineStyleFactory() { @Override public Map<String, LineStyle> getStyles() { Map<String, LineStyle> m = new HashMap<String, LineStyle>(); m.put("h1", Paragraph.regularStyle("h1")); m.put("h2", Paragraph.regularStyle("h2")); m.put("h3", Paragraph.regularStyle("h3")); m.put("h4", Paragraph.regularStyle("h4")); m.put("h5", Paragraph.regularStyle("h5")); m.put("none", Paragraph.regularStyle("")); return m; } }); public static ParagraphAnnotation fromString(String str) { if (str.equals(PARAGRAPH_ANNOTATION_PREFIX + "/" + "listStyleType")) return LIST_STYLE_TYPE; if (str.equals(PARAGRAPH_ANNOTATION_PREFIX + "/" + "textAlign")) return TEXT_ALIGN; if (str.equals(PARAGRAPH_ANNOTATION_PREFIX + "/" + "header")) return HEADER; return null; } String name; String defaultValue; Map<String, LineStyle> values; private ParagraphAnnotation(String name, String defaultValue, LineStyleFactory valuesFactory) { this.name = name; this.values = valuesFactory.getStyles(); this.defaultValue = defaultValue; } public LineStyle getLineStyleForValue(String value) { if (value == null || value.isEmpty()) return values.get(defaultValue); return values.get(value); } public Map<String, LineStyle> getLineStyles() { return Collections.unmodifiableMap(values); } @Override public String toString() { return this.name; } } /** * List of annotations that applies at character level */ public static final ReadableStringSet CARET_ANNOTATIONS = CollectionUtils.newStringSet( AnnotationConstants.STYLE_BG_COLOR, AnnotationConstants.STYLE_COLOR, AnnotationConstants.STYLE_FONT_FAMILY, AnnotationConstants.STYLE_FONT_SIZE, AnnotationConstants.STYLE_FONT_STYLE, AnnotationConstants.STYLE_FONT_WEIGHT, AnnotationConstants.STYLE_TEXT_DECORATION, AnnotationConstants.STYLE_VERTICAL_ALIGN, AnnotationConstants.LINK_AUTO, AnnotationConstants.LINK_MANUAL, AnnotationConstants.LINK_PREFIX ); public static final ReadableStringSet PARAGRAPH_ANNOTATIONS = CollectionUtils.newStringSet( ParagraphAnnotation.LIST_STYLE_TYPE.toString(), ParagraphAnnotation.TEXT_ALIGN.toString(), ParagraphAnnotation.HEADER.toString()); public static boolean isParagraphAnnotation(String annotationName) { return annotationName != null && annotationName.startsWith(PARAGRAPH_ANNOTATION_PREFIX); } public static boolean isStyleAnnotation(String annotationName) { return annotationName != null && annotationName.startsWith(STYLE_ANNOTATION_PREFIX); } }