package com.teamkonzept.webman.mainint;
import com.teamkonzept.lib.*;
import de.webman.sitetree.eventhandler.SiteTreeUtils;
import java.util.*;
/**
* Iterator fuer die Navigationsanzeige im Sitetree
* @author $Author: alex $
* @version $Revision: 1.8 $
*/
public class TKOpenSiteTreeIterator implements TKListIterator {
TKListIterator oldIterator;
String listName;
TKDBResult dbResult;
int lastLeft = -1;
int lastRight = -1;
int destId = -1;
Stack parents;
int level;
int levels = 0;
int maxlevels;
public TKOpenSiteTreeIterator( TKDBResult dbResult, TKListIterator oldIterator, String listName, int maxlevels )
{
this.oldIterator = oldIterator;
this.listName = listName;
this.dbResult = dbResult;
this.parents = new Stack();
this.level = 0;
this.maxlevels = maxlevels;
}
public TKOpenSiteTreeIterator( TKDBResult dbResult, TKListIterator oldIterator, String listName, int destId, int maxlevels )
{
this.oldIterator = oldIterator;
this.listName = listName;
this.dbResult = dbResult;
this.destId = destId;
this.parents = new Stack();
this.level = 0;
this.maxlevels = maxlevels;
}
public boolean apply( TKTemplate template, int i, String currListName )
{
if( currListName.equalsIgnoreCase( listName ) )
{
if( i >= dbResult.size() )
{
if( !parents.empty() ) parents.pop();
level = 0;
lastLeft = -1;
lastRight = -1;
return false;
}
TKDBResultRow resultRow = (TKDBResultRow)(dbResult.get( i ));
if( !TKDBTemplate.prepareTemplate( resultRow,template ) ) return false;
try {
int myId = Integer.parseInt( (String) resultRow.getColumn( "SITE_NODE_ID" ) );
// vollstaendigen Pfad ins Template
String path = SiteTreeUtils.getCurrentPath(new Integer(myId));
template.set("PATH", path);
if( destId != -1 && myId == destId ) {
template.set( "IS_DESTINATION", Boolean.TRUE );
}
int thisLeft = Integer.parseInt( (String) resultRow.getColumn( "LEFT_NR" ) );
int thisRight = Integer.parseInt( (String) resultRow.getColumn( "RIGHT_NR" ) );
String tmp = (String) resultRow.getColumn( "SITE_NODE_PARENT" );
int thisParent = ( tmp == null || tmp.equals("") )?myId:Integer.parseInt( tmp );
String nodeId = (String) resultRow.getColumn( "NODE_ID" );
int thisPar = ( nodeId.equals("") )?myId+1:Integer.parseInt( nodeId );
if( nodeId.equals("") ) {
template.set( "IS_LEAF", Boolean.TRUE );
}
else if( thisPar == myId ) {
template.set( "IS_CLOSED", Boolean.TRUE );
}
else {
template.set( "IS_OPEN", Boolean.TRUE );
}
if( i == 0 ) template.set( "IS_ROOT", Boolean.TRUE );
if( thisLeft > lastLeft && thisRight < lastRight ) {
parents.push( new Integer( thisParent ) );
level++;
}
else if( !parents.empty() ) {
// wenn der oberste parent im stack gleich dem aktuellen parent, dann gleiche ebene
// und nix tun
// wenn der aktuelle parent tiefer im stack liegt, dann entspr. viele ebenen zurueck und
// level neu setzen
if( !(parents.peek().equals( new Integer (thisParent))) ) {
while( !parents.empty() ) {
if( parents.pop().equals( new Integer( thisParent )) ) {
parents.push( new Integer( thisParent ) );
break;
}
level--;
}
}
}
levels = level;
template.set( "LEVEL", new Integer( level ) );
template.set( "CURR_COLSPAN", new Integer( maxlevels-level+1 ) );
lastLeft = thisLeft;
lastRight = thisRight;
}
catch ( Throwable th ) {
throw new Error( th.getMessage() );
}
return true;
}
else if( currListName.equalsIgnoreCase( "LEVELS" ) ) {
return (--levels >= 0);
}
else if( oldIterator != null ) {
return oldIterator.apply( template, i, currListName );
}
else {
return false;
}
}
}
|