package org.basex.gui.view.tree;
import org.basex.core.Context;
import org.basex.data.Data;
/**
* This class stores the subtrees.
*
* @author BaseX Team 2005-12, BSD License
* @author Wolfgang Miller
*/
final class TreeSubtree {
/** TreeNodeCache Object, contains cached document. */
private final TreeNodeCache nc;
/** Subtree borders. */
private TreeBorder[][] border;
/**
* Creates new subtree.
* @param d data
* @param atts show attributes
*/
TreeSubtree(final Data d, final boolean atts) {
nc = new TreeNodeCache(d, atts);
}
/**
* Generates subtree borders.
* @param ctx context
*/
void generateBorders(final Context ctx) {
final Data d = ctx.data();
final int[] roots = ctx.current().list;
final int rl = roots.length;
if(rl == 0) return;
border = new TreeBorder[rl][];
for(int i = 0; i < rl; ++i) {
border[i] = nc.subtree(d, roots[i]);
}
}
/**
* Returns pre by given index.
* @param rn root
* @param lv level
* @param ix index
* @return pre
*/
int getPrePerIndex(final int rn, final int lv, final int ix) {
return getPrePerIndex(getTreeBorder(rn, lv), ix);
}
/**
* Returns pre by given index.
* @param bo border
* @param ix index
* @return pre
*/
private int getPrePerIndex(final TreeBorder bo, final int ix) {
final int start = bo.start + ix;
if(start < 0) return -1;
return nc.getPrePerLevelAndIndex(bo.level, start);
}
/**
* Returns index of pre.
* @param rn root
* @param lv level
* @param pre pre
* @return index
*/
int getPreIndex(final int rn, final int lv, final int pre) {
return getPreIndex(getTreeBorder(rn, lv), pre);
}
/**
* Returns index of pre.
* @param bo border
* @param pre pre
* @return index
*/
private int getPreIndex(final TreeBorder bo, final int pre) {
return nc.searchPreIndex(bo.level, pre, pre, bo.start, bo.getEnd())
- bo.start;
}
/**
* Returns level size.
* @param rn root
* @param lv level
* @return size
*/
int levelSize(final int rn, final int lv) {
return getTreeBorder(rn, lv).size;
}
/**
* Returns TreeBorder.
* @param rn root
* @param lv level
* @return TreeBorder
*/
TreeBorder getTreeBorder(final int rn, final int lv) {
return border[rn][lv];
}
/**
* Returns subtree height.
* @param rn root
* @return height
*/
int getSubtreeHeight(final int rn) {
return border.length > rn ? border[rn].length : -1;
}
/**
* Returns maximum subtree height.
* @return max height
*/
int getMaxSubtreeHeight() {
int h = 0;
for(final TreeBorder[] b : border) {
final int hh = b.length;
if(hh > h) h = hh;
}
return h;
}
/**
* Determines the index position of given pre value.
* @param rn root
* @param lv level
* @param pre pre value
* @return the determined index position
*/
int searchPreArrayPos(final int rn, final int lv, final int pre) {
return searchPreArrayPos(getTreeBorder(rn, lv), pre);
}
/**
* Determines the index position of given pre value.
* @param bo border
* @param pre pre value
* @return the determined index position
*/
private int searchPreArrayPos(final TreeBorder bo, final int pre) {
return nc.searchPreArrayPos(bo.level, bo.start, bo.getEnd(), pre)
- bo.start;
}
/**
* Returns subtree borders.
* @param d data
* @param pre pre
* @return subtree borders
*/
TreeBorder[] subtree(final Data d, final int pre) {
return nc.subtree(d, pre);
}
}