package com.horstmann.violet.product.diagram.property.text; import com.horstmann.violet.product.diagram.property.text.decorator.OneLineText; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * This class is a container for multi lines of text * * @author Adrian Bobrowski <adrian071993@gmail.com> * @date 16.12.2015 */ public class MultiLineText extends LineText { private interface Command { String execute(OneLineText oneLineString); } public MultiLineText() { super(); setPadding(7,8); } public MultiLineText(Converter converter) { super(converter); setPadding(6,8); } protected MultiLineText(MultiLineText lineText) throws CloneNotSupportedException { super(lineText); rows = new ArrayList<OneLineText>(lineText.getRows()); } @Override public void reconstruction(Converter converter) { super.reconstruction(converter); rows = new ArrayList<OneLineText>(); setPadding(2,8); setText(text); } @Override public final MultiLineText clone() { return (MultiLineText)super.clone(); } @Override protected MultiLineText copy() throws CloneNotSupportedException { return new MultiLineText(this); } @Override final public void setText(String text) { this.text = removeDuplicateEnter(text); getRows().clear(); String[] array = this.text.split("\n", -1); for (String rawRow: array) { getRows().add(converter.toLineString(rawRow)); } setLabelText(toDisplay()); notifyAboutChange(); } /** * @see EditableText#toDisplay() */ @Override final public String toDisplay() { return implode(TO_DISPLAY, "<br>"); } /** * @see EditableText#toEdit() */ @Override final public String toEdit() { return implode(TO_EDIT, "\n"); } /** * @see Object#toString() */ @Override public String toString() { return implode(TO_STRING, "|"); } private String removeDuplicateEnter(String sentence) { return sentence.replaceAll("\\n+", "\n"); } /** * Join rows with a glue string * @param command command to call * @param glue string between each row * @return a string containing a string representation of all rows, with the glue string between each row. */ private String implode(Command command, String glue) { Iterator<OneLineText> iterator = getRows().iterator(); if(iterator.hasNext()) { StringBuilder ret = new StringBuilder(command.execute(iterator.next())); while(iterator.hasNext()) { ret.append(glue).append(command.execute(iterator.next())); } return ret.toString(); } return ""; } /** * @return list of rows */ private List<OneLineText> getRows() { if(null == rows) { rows = new ArrayList<OneLineText>(); setPadding(2,8); setText(text); } return rows; } private String text = ""; private transient List<OneLineText> rows; private static final Command TO_DISPLAY = new Command(){ @Override public String execute(OneLineText oneLineString) { return oneLineString.toDisplay(); } }; private static final Command TO_EDIT = new Command(){ @Override public String execute(OneLineText oneLineString) { return oneLineString.toEdit(); } }; private static final Command TO_STRING = new Command(){ @Override public String execute(OneLineText oneLineString) { return oneLineString.toString(); } }; }