/* * Context while rendering Pretty Objects * * Copyright 2000 Andy Gill * * $Revision: 1.1 $ * $Date: 2000/09/15 16:14:17 $ */ import java.util.*; /** * @version 0.1 * @author Andy Gill */ class PrettyContext { private int height = 0; public int width; // Max width public int currWidth; // Curr x coord private PrettyContentWidgets text; // Should be the same DocI in model public PrettyContext probation; // If you have a exception handler public PrettyCommand commands; // the remaing pretty commands public PrettyContext(int maxColumn,PrettyCommand pc) { this.width = maxColumn; this.currWidth = 0; text = new PrettyContentWidgets(); probation = null; commands = pc; } public PrettyCommand getNextCommand() { PrettyCommand pc = commands; if (pc != null) { commands = commands.next; } return pc; } public void pushNextCommand(PrettyCommand pc) { PrettyCommand oldPc = commands; commands = pc; pc.next = oldPc; } public void pushHandler() { PrettyContext pc = new PrettyContext(width,commands); pc.currWidth = currWidth; pc.text = new PrettyContentWidgets(text); pc.height = height; pc.probation = probation; // pc is now a copy of this probation = pc; // and we store it as a backup plan if (currWidth > width) { popHandler(); } } public void popHandler() { Message.message("using pop!"); if (probation == null) { // Can't backtrack, so make do with what we have return; } width = probation.width; height = probation.height; currWidth = probation.currWidth; text = probation.text; commands = probation.commands; probation = probation.probation; // Now, we reset the attempt to write on one line // before we start again. if (commands != null) { commands.flattened = false; } } public void print(PrettyStep ps,String str,boolean flattened,int prop) { int psi = -1; if (ps != null) { psi = ps.getBirthId(); } text.addText(psi,Integer.MAX_VALUE,currWidth,height,str,prop); currWidth += str.length(); if (currWidth > width) { popHandler(); } } public void shadow(int b,int d,String str,boolean flattened,int prop) { text.addText(b,d,currWidth,height,str,prop); } public void newline(int n) { height++; currWidth = n; probation = null; } public void setWidgets(PrettyDisplay pd) { pd.setContent(text.pcw); } } final class PrettyContentWidgets { public PrettyContentWidget pcw; public PrettyContentWidgets() { pcw = null; } public PrettyContentWidgets(PrettyContentWidgets pcws) { this.pcw = pcws.pcw; } // text has a life! // <--------> // _ ? "real text" public void addText(int b,int d,int x,int y,String str,int prop) { PrettyContentWidget pcw = new PrettyContentWidget(x,y,str,prop,b,d); pcw.next = this.pcw; if (this.pcw != null) { this.pcw.prec = pcw; } this.pcw = pcw; } public void sendToDisplay(PrettyDisplay pd) { pd.setContent(pcw); } }