X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ftext%2FPartContainer.java;h=2b48308b3b54229266ebc0abccfb9847845b3927;hb=6260b73eadb2b4eda1df07ce7f81572c4a696fc9;hp=05bfb3e9ad936162d58b4116545187323b2675c8;hpb=2507337d897f29254e8a831fa161d110140d23e1;p=Sone.git
diff --git a/src/main/java/net/pterodactylus/sone/text/PartContainer.java b/src/main/java/net/pterodactylus/sone/text/PartContainer.java
index 05bfb3e..2b48308 100644
--- a/src/main/java/net/pterodactylus/sone/text/PartContainer.java
+++ b/src/main/java/net/pterodactylus/sone/text/PartContainer.java
@@ -1,5 +1,5 @@
/*
- * Sone - PartContainer.java - Copyright © 2010 David Roden
+ * Sone - PartContainer.java - Copyright © 2010â2013 David Roden
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -17,11 +17,12 @@
package net.pterodactylus.sone.text;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.io.Writer;
+import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.Deque;
+import java.util.Iterator;
import java.util.List;
+import java.util.NoSuchElementException;
/**
* Part implementation that can contain an arbitrary amount of other parts.
@@ -30,7 +31,7 @@ import java.util.List;
*
* @author David âBombeâ Roden
*/
-public class PartContainer implements Part {
+public class PartContainer implements Part, Iterable {
/** The parts to render. */
private final List parts = new ArrayList();
@@ -39,6 +40,16 @@ public class PartContainer implements Part {
// ACCESSORS
//
+ @Override
+ public boolean isPlainText() {
+ return false;
+ }
+
+ @Override
+ public boolean isFreenetLink() {
+ return false;
+ }
+
/**
* Adds a part to render.
*
@@ -49,33 +60,110 @@ public class PartContainer implements Part {
parts.add(part);
}
+ /**
+ * Returns the part at the given index.
+ *
+ * @param index
+ * The index of the part
+ * @return The part
+ */
+ public Part getPart(int index) {
+ return parts.get(index);
+ }
+
+ /**
+ * Removes the part at the given index.
+ *
+ * @param index
+ * The index of the part to remove
+ */
+ public void removePart(int index) {
+ parts.remove(index);
+ }
+
+ /**
+ * Returns the number of parts.
+ *
+ * @return The number of parts
+ */
+ public int size() {
+ return parts.size();
+ }
+
//
// PART METHODS
//
- /**
- * {@inheritDoc}
- */
@Override
- public void render(Writer writer) throws IOException {
+ public String getText() {
+ StringBuilder partText = new StringBuilder();
for (Part part : parts) {
- part.render(writer);
+ partText.append(part.getText());
}
+ return partText.toString();
}
//
- // OBJECT METHODS
+ // ITERABLE METHODS
//
@Override
- public String toString() {
- StringWriter stringWriter = new StringWriter();
- try {
- render(stringWriter);
- } catch (IOException ioe1) {
- /* should never throw, ignore. */
- }
- return stringWriter.toString();
+ @SuppressWarnings("synthetic-access")
+ public Iterator iterator() {
+ return new Iterator() {
+
+ private Deque> partStack = new ArrayDeque>();
+ private Part nextPart;
+ private boolean foundNextPart;
+ private boolean noNextPart;
+
+ {
+ partStack.push(parts.iterator());
+ }
+
+ private void findNext() {
+ if (foundNextPart) {
+ return;
+ }
+ noNextPart = true;
+ while (!partStack.isEmpty()) {
+ Iterator parts = partStack.pop();
+ if (parts.hasNext()) {
+ nextPart = parts.next();
+ partStack.push(parts);
+ if (nextPart instanceof PartContainer) {
+ partStack.push(((PartContainer) nextPart).iterator());
+ } else {
+ noNextPart = false;
+ break;
+ }
+ }
+ }
+ foundNextPart = true;
+ }
+
+ @Override
+ public boolean hasNext() {
+ findNext();
+ return !noNextPart;
+ }
+
+ @Override
+ public Part next() {
+ findNext();
+ if (noNextPart) {
+ throw new NoSuchElementException();
+ }
+ foundNextPart = false;
+ return nextPart;
+ }
+
+ @Override
+ public void remove() {
+ /* ignore. */
+ }
+
+ };
}
}