blob: 698c7c621b3862cc5ad5ba9eb1e00eed51834585 [file] [log] [blame]
/*******************************************************************************
* <copyright>
*
* Copyright (c) 2014, 2014 SAP AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eindhoven University of Technology (Albert Hofkamp) - Bug 440796 - initial API, implementation and documentation
*
* </copyright>
*
*******************************************************************************/
package org.eclipse.graphiti.util;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.graphiti.mm.algorithms.styles.Color;
import org.eclipse.graphiti.mm.algorithms.styles.Font;
import org.eclipse.graphiti.mm.algorithms.styles.StylesFactory;
import org.eclipse.graphiti.mm.algorithms.styles.TextStyle;
import org.eclipse.graphiti.mm.algorithms.styles.TextStyleRegion;
import org.eclipse.graphiti.mm.algorithms.styles.UnderlineStyle;
/**
* Class to construct {@link TextStyleRegion}s while adding text.
*
* @since 0.12
*/
public class TextBuilder {
/** Constructed text string. */
private StringBuilder text = new StringBuilder();
/** Number of code points in {@link #text}. */
private int length = 0;
/** Regions created in the collected text. */
private List<TextStyleRegion> regions = new ArrayList<TextStyleRegion>();
/** Partly finished text styles. */
private Map<String, TextBuilderRegion> styles = new LinkedHashMap<String, TextBuilderRegion>();
/**
* Add text to the builder.
*
* @param text
* Text to append.
*/
public void add(String text) {
length += text.length();
this.text.append(text);
}
/**
* Get current length of the collected text.
*
* @return Length of the text collected so far (number of code points).
*/
public int getLength() {
return length;
}
/**
* Is any text added yet?
*
* @return {@code true} if no text added yet, else {@code false}.
*/
public boolean isEmpty() {
return length == 0;
}
/**
* Get the collected text.
*
* @return The concatenated strings previously given through {@link #add}.
*/
@Override
public String toString() {
return text.toString();
}
/**
* Get the regions created and finished for the text.
*
* @return Regions of the text.
*/
public List<TextStyleRegion> getRegions() {
return regions;
}
/**
* Start a new region in the text. Returns the created region for setting
* the style of the new region.
*
* @param name
* Name of the region.
* @return The created region.
*/
public TextBuilderRegion startRegion(String name) {
TextBuilderRegion tbr = new TextBuilderRegion().setStart(length);
styles.put(name, tbr);
return tbr;
}
/**
* Get a previously created and not yet finished region.
*
* @param name
* Name of the region to retrieve.
* @return The queried region if it exists, else {@code null}.
*/
public TextBuilderRegion getRegion(String name) {
return styles.get(name);
}
/**
* Finish a region.
*
* @param name
* Name of the region to finish.
*/
public void finishRegion(String name) {
TextBuilderRegion region = styles.get(name);
styles.remove(name);
if (region != null && region.getStyle() != null) {
TextStyleRegion styleRegion;
styleRegion = StylesFactory.eINSTANCE.createTextStyleRegion();
styleRegion.setStart(region.getStart());
styleRegion.setStyle(region.getStyle());
styleRegion.setEnd(length);
regions.add(styleRegion);
}
}
/**
* Drop a region that was created but not yet finished.
*
* @param name
* Name of the region to forget.
*/
public void forgetRegion(String name) {
styles.remove(name);
}
/**
* Inner class for storing the partial region styles.
*/
public static class TextBuilderRegion {
/** Current style of the region, {@code null} means default style. */
private TextStyle style = null;
/** Start offset of the region in the text. */
private int start = 0;
/** Constructor of the {@link TextBuilderRegion} class. */
public TextBuilderRegion() {
style = null;
}
/**
* Get start offset of the region in the text.
*
* @return The start offset of the region.
*/
public int getStart() {
return start;
}
/**
* Get the text style of the region in the text.
*
* @return The text style, or {@code null} for the default style.
*/
public TextStyle getStyle() {
return style;
}
/** Ensure a non-default style is available for modification. */
private void ensureStyle() {
if (style == null)
style = StylesFactory.eINSTANCE.createTextStyle();
}
/**
* Assign a style to the region of text.
*
* @param style
* Style to assign.
* @return The updated partial region style.
*/
public TextBuilderRegion setStyle(TextStyle style) {
this.style = style;
return this;
}
/**
* Assign a start to the partial region style.
*
* @param start
* New start offset of the region in the text.
* @return The updated partial region style.
*/
public TextBuilderRegion setStart(int start) {
this.start = start;
return this;
}
/**
* Set the underline style for the region.
*
* @param uStyle
* Underline style to assign. {@code null} means disable
* underline.
* @param col
* Color of the underline, {@code null} means skip setting
* the color.
* @return The updated partial region style.
*/
public TextBuilderRegion setUnderline(UnderlineStyle uStyle, Color col) {
ensureStyle();
if (uStyle == null) {
style.setUnderline(false);
} else {
style.setUnderline(true);
style.setUnderlineStyle(uStyle);
}
setUnderline(col);
return this;
}
/**
* Set the underline color for the region.
*
* @param col
* Color of the underline, {@code null} means skip setting
* the color.
* @return The updated partial region style.
*/
public TextBuilderRegion setUnderline(Color col) {
ensureStyle();
if (col != null && style.isUnderline())
style.setUnderlineColor(col);
return this;
}
/**
* Set strikeout for the region.
*
* @param value
* Enable or disable strikeout.
* @param col
* Color of the strikeout, if enabled. {@code null} means
* skip setting of the color.
* @return The updated partial region style.
*/
public TextBuilderRegion setStrikeOut(boolean value, Color col) {
ensureStyle();
style.setStrikeout(value);
if (value && col != null)
style.setStrikeoutColor(col);
return this;
}
/**
* Set the foreground color of the text for the region.
*
* @param col
* Foreground color to set. {@code null} means skip setting
* of the color.
* @return The updated partial region style.
*/
public TextBuilderRegion setForeground(Color col) {
ensureStyle();
if (col != null)
style.setForeground(col);
return this;
}
/**
* Set the background color of the text for the region.
*
* @param col
* Background color to set. {@code null} means skip setting
* of the color.
* @return The updated partial region style.
*/
public TextBuilderRegion setBackground(Color col) {
ensureStyle();
if (col != null)
style.setBackground(col);
return this;
}
/**
* Set the font for the region.
*
* @param font
* Font to set.
* @return The updated partial region style.
*/
public TextBuilderRegion setFont(Font font) {
ensureStyle();
style.setFont(font);
return this;
}
}
}