--- /dev/null
+package be.nikiroo.fanfix.data;
+
+import java.io.Serializable;
+
+import be.nikiroo.utils.Image;
+
+/**
+ * A paragraph in a chapter of the story.
+ *
+ * @author niki
+ */
+public class Paragraph implements Cloneable, Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * A paragraph type, that will dictate how the paragraph will be handled.
+ *
+ * @author niki
+ */
+ public enum ParagraphType {
+ /** Normal paragraph (text) */
+ NORMAL,
+ /** Blank line */
+ BLANK,
+ /** A Break paragraph, i.e.: HR (Horizontal Line) or '* * *' or whatever */
+ BREAK,
+ /** Quotation (dialogue) */
+ QUOTE,
+ /** An image (no text) */
+ IMAGE, ;
+
+ /**
+ * This paragraph type is of a text kind (quote or not).
+ *
+ * @param allowEmpty
+ * allow empty text as text, too (blanks, breaks...)
+ * @return TRUE if it is
+ */
+ public boolean isText(boolean allowEmpty) {
+ return (this == NORMAL || this == QUOTE)
+ || (allowEmpty && (this == BLANK || this == BREAK));
+ }
+ }
+
+ private ParagraphType type;
+ private String content;
+ private Image contentImage;
+ private long words;
+
+ /**
+ * Empty constructor, not to use.
+ */
+ @SuppressWarnings("unused")
+ private Paragraph() {
+ // for serialisation purposes
+ }
+
+ /**
+ * Create a new {@link Paragraph} with the given image.
+ *
+ * @param contentImage
+ * the image
+ */
+ public Paragraph(Image contentImage) {
+ this(ParagraphType.IMAGE, null, 1);
+ this.contentImage = contentImage;
+ }
+
+ /**
+ * Create a new {@link Paragraph} with the given values.
+ *
+ * @param type
+ * the {@link ParagraphType}
+ * @param content
+ * the content of this paragraph
+ * @param words
+ * the number of words (or images)
+ */
+ public Paragraph(ParagraphType type, String content, long words) {
+ this.type = type;
+ this.content = content;
+ this.words = words;
+ }
+
+ /**
+ * The {@link ParagraphType}.
+ *
+ * @return the type
+ */
+ public ParagraphType getType() {
+ return type;
+ }
+
+ /**
+ * The {@link ParagraphType}.
+ *
+ * @param type
+ * the type to set
+ */
+ public void setType(ParagraphType type) {
+ this.type = type;
+ }
+
+ /**
+ * The content of this {@link Paragraph} if it is not an image.
+ *
+ * @return the content
+ */
+ public String getContent() {
+ return content;
+ }
+
+ /**
+ * The content of this {@link Paragraph}.
+ *
+ * @param content
+ * the content to set
+ */
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ /**
+ * The content of this {@link Paragraph} if it is an image.
+ *
+ * @return the content
+ */
+ public Image getContentImage() {
+ return contentImage;
+ }
+
+ /**
+ * The number of words (or images) in this {@link Paragraph}.
+ *
+ * @return the number of words
+ */
+ public long getWords() {
+ return words;
+ }
+
+ /**
+ * The number of words (or images) in this {@link Paragraph}.
+ *
+ * @param words
+ * the number of words to set
+ */
+ public void setWords(long words) {
+ this.words = words;
+ }
+
+ /**
+ * Display a DEBUG {@link String} representation of this object.
+ */
+ @Override
+ public String toString() {
+ return String.format("%s: [%s]", "" + type, content == null ? "N/A"
+ : content);
+ }
+
+ @Override
+ public Paragraph clone() {
+ Paragraph para = null;
+ try {
+ para = (Paragraph) super.clone();
+ } catch (CloneNotSupportedException e) {
+ // Did the clones rebel?
+ System.err.println(e);
+ }
+
+ return para;
+ }
+}