package org.jbehave.eclipse.editor.text.style; import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.eclipse.swt.graphics.RGB; import org.jbehave.eclipse.util.New; public class TextStyle { public static final String COMMENT = "comment"; public static final String META_DEFAULT = "meta_default"; public static final String META_KEYWORD = "meta_keyword"; public static final String EXAMPLE_TABLE_DEFAULT = "example_table_default"; public static final String EXAMPLE_TABLE_KEYWORD = "example_table_keyword"; public static final String EXAMPLE_TABLE_SEPARATOR = "example_table_separator"; public static final String EXAMPLE_TABLE_CELL = "example_table_cell"; public static final String SCENARIO_DEFAULT = "scenario_default"; public static final String SCENARIO_KEYWORD = "scenario_keyword"; public static final String STEP_DEFAULT = "step_default"; public static final String STEP_KEYWORD = "step_keyword"; public static final String STEP_PARAMETER = "step_parameter"; public static final String STEP_PARAMETER_VALUE = "step_parameter_value"; public static final String STEP_EXAMPLE_TABLE_SEPARATOR = "step_example_table_separator"; public static final String STEP_EXAMPLE_TABLE_CELL = "step_example_table_cell"; public static final String NARRATIVE_DEFAULT = "narrative_default"; public static final String NARRATIVE_KEYWORD = "narrative_keyword"; public static final String DEFAULT = "default"; public static final String ERROR = "error"; private final String key; private RGB foreground; private RGB background; private boolean italic; private boolean bold; // private RGB currentLineHighlight; private final TextStyle parent; private List<TextStyle> children = New.arrayList(); public TextStyle(String key, TextStyle parent) { this.key = key; this.parent = parent; } public TextStyle getParent() { return parent; } public boolean isRoot() { return parent == null; } public String getKey() { return key; } public String getPath() { List<String> keys = New.arrayList(); TextStyle ts = this; while (ts != null) { keys.add(ts.getKey()); ts = ts.parent; } Collections.reverse(keys); return StringUtils.join(keys, "."); } public void setForeground(RGB foreground) { this.foreground = foreground; } public boolean hasForeground() { return foreground != null; } public RGB getForegroundOrDefault() { if (foreground == null) { if (parent != null) return parent.getForegroundOrDefault(); else return new RGB(0, 0, 0); } return foreground; } public void setBackground(RGB background) { this.background = background; } public boolean hasBackground() { return background != null; } public RGB getBackgroundOrDefault() { if (background == null) { if (parent != null) return parent.getBackgroundOrDefault(); else return new RGB(255, 255, 255); } return background; } public boolean isBold() { return bold; } public void setBold(boolean bold) { this.bold = bold; } public boolean isItalic() { return italic; } public void setItalic(boolean italic) { this.italic = italic; } public void setCurrentLineHighlight(RGB currentLineHighlight) { this.currentLineHighlight = currentLineHighlight; } public RGB getCurrentLineHighlight() { return currentLineHighlight; } public List<TextStyle> getChildren() { return children; } public TextStyle newChild(String key) { TextStyle child = new TextStyle(key, this); children.add(child); return child; } public Map<String, TextStyle> createMap() { Map<String, TextStyle> styles = New.hashMap(); recursivelyFill(styles); return styles; } protected void recursivelyFill(Map<String, TextStyle> styles) { if (parent == null) { styles.put(DEFAULT, this); } else styles.put(key, this); for (TextStyle child : getChildren()) child.recursivelyFill(styles); } @Override public String toString() { return "TextStyle [key=" + key + ", foreground=" + foreground + ", background=" + background + ", italic=" + italic + ", bold=" + bold + "]"; } private TextStyle root; private TextStyle getRoot() { if (root == null) { TextStyle ts = this; while (true) { if (ts.parent == null) break; ts = ts.parent; } root = ts; } return root; } public boolean isForegroundSameAsRoot() { RGB tcolor = getForegroundOrDefault(); RGB rcolor = getRoot().getForegroundOrDefault(); return tcolor.equals(rcolor); } public boolean isBackgroundSameAsRoot() { RGB tcolor = getBackgroundOrDefault(); RGB rcolor = getRoot().getBackgroundOrDefault(); return tcolor.equals(rcolor); } }