package com.usemodj.forum; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import com.usemodj.forum.domain.Forum; public class BBLoop { Map elements; BBWalker walker; List preserve = new ArrayList(); boolean looping = false; int index; List elementValues; Forum forum; public BBLoop( Map elements) { this.elements = elements; this.elementValues = (null == elements? Collections.EMPTY_LIST: new ArrayList( elements.values())); index =0; } public static BBLoop start( Map elements, BBWalker walker) { BBLoop a = new BBLoop( elements); if( null == a.elements) return null; a.walker = walker; return a; } public boolean step() { //TODO: INDEX BOUND //if ( !is_array($this->elements) || !current($this->elements) || !is_object($this->walker) ) // return false; if( null == this.elementValues || this.elementValues.size()<1) return false; if( !this.looping){ this.index =0; this.forum = (Forum) this.elementValues.get(index); this.looping = true; } else { if( this.elementValues.size() <= index +1) return false; this.forum = (Forum) this.elementValues.get(++index); } //if ( !$args = func_get_args() ) // $args = array( 0 ); //echo call_user_func_array( array(&$this->walker, 'step'), array_merge(array(current($this->elements)), $args) ); this.walker.step( forum, 0); return true; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } public void reinstate() { //foreach ( $this->_preserve as $key => $value ) // $GLOBALS[$key] = $value; //TODO: reinstate() } public boolean isLooping() { return looping; } public void setLooping(boolean looping) { this.looping = looping; } public String pad( String pad, int offset) { return StringUtils.repeat( pad, this.walker.depth -1); } public List getClasses() { List classes = new ArrayList(); Forum prev = null; Forum next = null; Forum current = (Forum) this.elementValues.get( this.index); if( this.index -1 >= 0) prev = (Forum) this.elementValues.get(this.index-1); else this.index = 0; if( this.index +1 < this.elementValues.size()) next = (Forum) this.elementValues.get( this.index +1); else this.index = this.elementValues.size() -1; if( null != next && next.getForumParent() == current.getForumId()) classes.add( "bb-parent"); else if( null != next && next.getForumParent() == current.getForumParent()) classes.add( "bb-precedes-sibling"); else classes.add("bb-last-child"); if( null != prev && current.getForumParent() == prev.getForumId()) classes.add( "bb-first-child"); else if( null != prev && current.getForumParent() == prev.getForumParent()) classes.add( "bb-follows-sibling"); else if( null != prev) classes.add( "bb-follows-niece"); if( this.walker.depth > 1) classes.add( "bb-child"); else classes.add( "bb-root"); return classes; } }