/*
* Created on Dec 22, 2004
*/
package org.openedit.links;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import com.openedit.util.PathUtilities;
/**
* @author cburkey
*
*/
public class Link implements Serializable {
private static final long serialVersionUID = 6696306680268063277L;
protected String fieldPath;
protected String fieldText;
protected String fieldId;
protected boolean fieldSelected;
protected Link fieldParentLink;
protected List fieldChildren;
protected String fieldUserData;
protected String fieldRedirectPath;
protected String fieldAccessKey;
protected boolean fieldAutoLoadChildren;
protected String fieldPrefix;
protected String fieldPostfix;
protected int fieldRank = 5000;
protected String fieldConfirmText;
public String getConfirmText()
{
return fieldConfirmText;
}
public void setConfirmText(String inConfirmText)
{
fieldConfirmText = inConfirmText;
}
public String getPrefix() {
return fieldPrefix;
}
public void setPrefix(String fieldPrefix) {
this.fieldPrefix = fieldPrefix;
}
public String getPostfix() {
return fieldPostfix;
}
public void setPostfix(String fieldPostfix) {
this.fieldPostfix = fieldPostfix;
}
public String getText() {
return fieldText;
}
public void setText(String inText) {
fieldText = inText;
}
/** I could not decide what to call this TODO: Remove URL */
public String getPath() {
return fieldPath;
}
public String getHref() {
return getPath();
}
public String getUrl() {
return getPath();
}
public String getPageName() {
return PathUtilities.extractPageName(getPath());
}
public void setPath(String inString) {
fieldPath = inString;
}
public String getId() {
return fieldId;
}
public void setId(String inId) {
fieldId = inId;
}
public int getDepth() {
int i = 0;
Link parent = getParentLink();
while (parent != null) {
i++;
parent = parent.getParentLink();
}
return i;
}
public boolean hasChildren() {
return fieldChildren != null && fieldChildren.size() > 0;
}
/**
* Divides the children into rows
*
* @param inRowCount
* @return
*/
public List getChildrenInRows(int inColCount) {
double rowscount = (double) getChildren().size() / (double) inColCount;
List rows = new ArrayList();
for (int i = 0; i < rowscount; i++) {
int start = i * inColCount;
int end = i * inColCount + inColCount;
// start = Math.min
List sublist = getChildren().subList(start,
Math.min(getChildren().size(), end));
rows.add(sublist);
}
return rows;
}
public List getChildren() {
if (fieldChildren == null) {
fieldChildren = new ArrayList();
}
return fieldChildren;
}
public void setChildren(List inChildren) {
fieldChildren = inChildren;
}
public Link getParentLink() {
return fieldParentLink;
}
public void setParentLink(Link inParentLink) {
fieldParentLink = inParentLink;
}
/**
* @param inLink
*/
public void addChild(Link inLink) {
inLink.setParentLink(this);
getChildren().add(inLink);
}
public void insertChild(Link inLink) {
inLink.setParentLink(this);
getChildren().add(0, inLink);
}
/**
* @param inLink
*/
public void removeChild(Link inLink) {
getChildren().remove(inLink);
inLink.setParentLink(null);
}
/**
* @param inLink
*/
public void moveUp(Link inLink) {
int index = getChildren().indexOf(inLink);
if (index != -1 && index != 0) {
getChildren().remove(index);
index--;
getChildren().add(index, inLink);
}
}
/**
* @param inLink
*/
public void moveDown(Link inLink) {
int index = getChildren().indexOf(inLink);
if (index != -1 && index != getChildren().size() - 1) {
getChildren().remove(index);
index++;
getChildren().add(index, inLink);
}
}
/**
* @param inLink
* @return
*/
public Link getChildAbove(Link inLink) {
int count = getChildren().indexOf(inLink);
if (count != -1 && count != 0) {
count--;
Link brother = (Link) getChildren().get(count);
return brother;
}
return null;
}
public Link getChildBelow(Link inLink) {
int count = getChildren().indexOf(inLink);
if (count != -1 && count != getChildren().size() - 1) {
count++;
Link brother = (Link) getChildren().get(count);
return brother;
}
return null;
}
public Link getDecendant(String inId) {
for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
Link child = (Link) iter.next();
if (child.getId().equals(inId)) {
return child;
} else {
Link decendant = child.getDecendant(inId);
if (decendant != null) {
return decendant;
}
}
}
return null;
}
/**
* @param inLink
* @param inParent1
*/
public void addChildNearLocation(Link inLink, Link inParent1) {
int count = getChildren().indexOf(inParent1);
if (count != -1) {
getChildren().add(count + 1, inLink);
} else {
getChildren().add(inLink);
}
inLink.setParentLink(this);
}
/**
* This is a flat list of links. Useful for generating menus or trees in
* velocity
*
* @return
*/
public List list() {
ArrayList fieldAllLinks = new ArrayList();
addLinksToList(this, fieldAllLinks);
return fieldAllLinks;
}
/**
* @param inRootLink
* @param inAllLinks
*/
protected void addLinksToList(Link inRootLink, List inAllLinks) {
inAllLinks.add(inRootLink);
if (inRootLink.hasChildren()) {
for (Iterator iter = inRootLink.getChildren().iterator(); iter
.hasNext();) {
Link element = (Link) iter.next();
addLinksToList(element, inAllLinks);
}
}
}
public String getUserData() {
return fieldUserData;
}
public void setUserData(String inUserData) {
fieldUserData = inUserData;
}
public boolean isSelected() {
return fieldSelected;
}
public void setSelected(boolean inSelected) {
fieldSelected = inSelected;
}
/**
* @return
*/
public boolean isChildSelected() {
if (isSelected()) {
return true;
}
if (hasChildren()) {
for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
Link child = (Link) iter.next();
if (child.isChildSelected()) {
return true;
}
}
}
return false;
}
/**
* @param inUrl
* @return
*/
public boolean isChild(Link inUrl) {
for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
Link element = (Link) iter.next();
if (element == inUrl) {
return true;
}
if (element.isChild(inUrl)) {
return true;
}
}
return false;
}
/**
* @return Returns the redirectPath.
*/
public String getRedirectPath() {
return fieldRedirectPath;
}
/**
* @param inRedirectPath
* The redirectPath to set.
*/
public void setRedirectPath(String inRedirectPath) {
fieldRedirectPath = inRedirectPath;
}
public String getAccessKey() {
return fieldAccessKey;
}
public void setAccessKey(String inAccessKey) {
fieldAccessKey = inAccessKey;
}
public boolean isAutoLoadChildren() {
return fieldAutoLoadChildren;
}
public void setAutoLoadChildren(boolean inAutoLoadChildren) {
fieldAutoLoadChildren = inAutoLoadChildren;
}
public String toString() {
return getHref();
}
public void sortChildren()
{
Collections.sort(getChildren(), new Comparator()
{
public int compare(Object arg0, Object arg1)
{
Link link1 = (Link)arg0;
Link link2 = (Link)arg1;
if( link1.getRank() == link2.getRank())
{
if( link1.getText() != null && link2.getText() != null)
{
return link1.getText().compareTo(link2.getText());
}
return 0;
}
if( link1.getRank() > link2.getRank())
{
return 1;
}
else
{
return -1;
}
}
});
}
public String getDirectory()
{
String path = PathUtilities.extractDirectoryPath(getPath());
// urlpath is the address the link came in on
return path;
}
public List getParents()
{
List parents = new ArrayList();
Link parent = this;
while(parent != null )
{
parents.add(0, parent);
parent = parent.getParentLink();
}
return parents;
}
public int getRank()
{
return fieldRank;
}
public void setRank(int inRank)
{
fieldRank = inRank;
}
}