Coverage Report - net.sf.tacos.components.tree.TreeHelper
 
Classes in this File Line Coverage Branch Coverage Complexity
TreeHelper
0% 
0% 
3
 
 1  
 /*
 2  
  * TreeHelper.java
 3  
  *
 4  
  * Created on February 4, 2007, 11:54 PM
 5  
  */
 6  
 
 7  
 package net.sf.tacos.components.tree;
 8  
 
 9  
 import java.util.Stack;
 10  
 import org.apache.tapestry.AbstractComponent;
 11  
 import org.apache.tapestry.IMarkupWriter;
 12  
 import org.apache.tapestry.IRequestCycle;
 13  
 import org.apache.tapestry.engine.NullWriter;
 14  
 
 15  
 /**
 16  
  *
 17  
  * @author andyhot
 18  
  */
 19  0
 public abstract class TreeHelper extends AbstractComponent {
 20  
     
 21  
     private Stack stack;
 22  
     
 23  
     public abstract TreeIterator getTreeIterator();
 24  
     
 25  
     private Stack getCycleStack(IRequestCycle cycle) {
 26  0
         Stack currStack = (Stack) cycle.getAttribute(TreeHelper.class.getName());
 27  0
         if (currStack == null) {
 28  0
             currStack = new Stack();
 29  
         }
 30  0
         return currStack;
 31  
     }
 32  
     
 33  
     private void setCycleStack(IRequestCycle cycle, Stack currStack) {
 34  0
         cycle.setAttribute(TreeHelper.class.getName(), currStack);
 35  0
     }
 36  
 
 37  
     protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {          
 38  0
         stack = getCycleStack(cycle);
 39  0
         if (getTreeIterator() == null) {
 40  0
             finalRenderComponent();
 41  
         } else {  
 42  0
             int diff = getTreeIterator().getDepth() - getTreeIterator().getPreviousDepth();
 43  0
             boolean empty = stack.empty();
 44  
             
 45  0
             if (writer == NullWriter.getSharedInstance()  && cycle.getResponseBuilder().isDynamic()
 46  
                     && (empty || stack.peek()==writer)) {
 47  0
                 renderBody(writer, cycle);
 48  0
                 return;
 49  
             }
 50  
 
 51  0
             if (empty) {
 52  0
                 stack.push(writer.getNestedWriter()); 
 53  0
                 diff = 0;
 54  
             }
 55  0
             IMarkupWriter writerGive = (IMarkupWriter) stack.peek();
 56  0
             normalRenderComponent(writerGive, cycle, diff, empty);
 57  
         }
 58  
         
 59  0
         setCycleStack(cycle, stack);
 60  0
     }
 61  
     
 62  
     protected void finalRenderComponent() {
 63  0
         while (!stack.empty()) {
 64  0
             IMarkupWriter inner = (IMarkupWriter) stack.pop();            
 65  0
             inner.close();
 66  0
         }
 67  0
         stack = null;        
 68  0
         return;
 69  
     }
 70  
     
 71  
     protected void normalRenderComponent(IMarkupWriter writer, IRequestCycle cycle, 
 72  
             int diff, boolean empty) {                    
 73  
         //System.out.println("Doing: " + getClientId() + " Diff:" + diff + "Wr:" + writer);
 74  0
         if (diff==0) {
 75  0
             if (!empty)
 76  0
                 writer.end();
 77  
             
 78  0
             writer.begin("div");            
 79  0
             renderIdAttribute(writer, cycle);
 80  0
             writer.closeTag();
 81  0
             renderBody(writer, cycle);
 82  0
         } else if (diff>0) {            
 83  0
             writer = writer.getNestedWriter();
 84  0
             stack.push(writer);
 85  
             
 86  0
             writer.begin("div");            
 87  0
             renderIdAttribute(writer, cycle);
 88  0
             writer.closeTag();            
 89  0
             renderBody(writer, cycle);            
 90  
         } else {
 91  0
             writer = (IMarkupWriter) stack.pop();
 92  0
             for (int c = diff; c < 0 && !stack.empty(); c++) {
 93  0
                 writer.close();
 94  0
                 writer = (IMarkupWriter) stack.pop();
 95  
             }
 96  0
             if (stack.empty() && cycle.getResponseBuilder().isDynamic()) {
 97  0
                 renderBody(NullWriter.getSharedInstance(), cycle);
 98  0
                 writer.close();
 99  0
                 stack.push(NullWriter.getSharedInstance());
 100  0
                 return;
 101  
             }
 102  
             
 103  0
             writer.end();
 104  0
             stack.push(writer);
 105  
             
 106  0
             writer.begin("div");            
 107  0
             renderIdAttribute(writer, cycle);
 108  0
             writer.closeTag();
 109  0
             renderBody(writer, cycle);
 110  
         }
 111  
         
 112  0
     }
 113  
 
 114  
 }