package com.gmail.dpierron.calibre.opds;
/**
* Class that provides methods for manipulating a set of breadcrumbs.
*
* Breadcrumbs are used to track the basic navigation path through the
* genertated catalog for any specific page. When we get to the final book,
* though it can only show one set of breadcrumbs - the first one generated.
*/
import com.gmail.dpierron.tools.Helper;
import java.util.Vector;
public class Breadcrumbs extends Vector<Breadcrumb> {
public Breadcrumbs() {
super();
}
public static Breadcrumbs newBreadcrumbs(String title, String url) {
return addBreadcrumb(null, title, url);
}
/**
* Take a set of breadcrumbs, and make a copy with a new one added at the end
*
* @param pBreadcrumbs The existing set of breadcrumbs
* @param title The title for the new breadcrumb
* @param url The URL fro the new breadcrumb
* @return
*/
public static Breadcrumbs addBreadcrumb(Breadcrumbs pBreadcrumbs, String title, String url) {
Breadcrumbs breadcrumbs = new Breadcrumbs();
if (pBreadcrumbs != null)
breadcrumbs.addAll(pBreadcrumbs);
breadcrumbs.add(new Breadcrumb(title, url));
return breadcrumbs;
}
/**
* Convert the breadcrumbs ro a string with / between elements
*
* @return
*/
public String toString() {
return Helper.concatenateList("/", this);
}
/**
* Create the string to be displayed as the progress message
* Tries to some optimisation to keep message length down.
*
* @param breadcrumbs
* @return
*/
public static String getProgressText (Breadcrumbs breadcrumbs) {
assert breadcrumbs.size() > 0;
StringBuffer progressText = new StringBuffer();
// Tidy up message removing redundant "starting with" ("splitByLetter.letter") entries
// Not stricly necessary, but improves user experience.
for (int i = 1 ; i < breadcrumbs.size() ; i++) {
String thisElement = breadcrumbs.elementAt(i).toString();
if (i != 1) {
if (i < (breadcrumbs.size()-1)) {
if (breadcrumbs.elementAt(i+1).toString().startsWith(thisElement)) {
// Do not add an element if the next one starts with the same text!
continue;
}
}
progressText.append("/");
}
progressText.append(thisElement);
}
return progressText.toString();
}
}