package com.teamkonzept.webman.mainint;
import com.teamkonzept.lib.*;
import java.util.*;
/**
* Dieser Iterator wird benutzt um einen Content Tree zu rendern. Er
* bercksichtigt dabei, ob ein Knoten geffnet oder geschlossen ist und
* stellt die ntigen Templateinformationen zur Verfgung um die Liste der
* Contents baumartig darstellen zu knnen.
*
* @author alex (?)
* @version $Revision: 1.8 $
**/
public class TKOpenContentTreeIterator 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 TKOpenContentTreeIterator( 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 TKOpenContentTreeIterator( 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.clear();
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( "CONTENT_NODE_ID" ) );
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( "CONTENT_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 );
String nodeType = (String) resultRow.getColumn( "CONTENT_NODE_TYPE" );
if(nodeType != null && nodeType.equals(DatabaseDefaults.GROUP)) {
template.set( "IS_GROUP", Boolean.TRUE );
}
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;
}
}
}
|