001    package ifs.util;
002    
003    import java.io.PrintStream;
004    
005    /** Prints current progres to {@link PrintStream}.
006     * <br><br>
007     * Example usage:<ul><code>
008     * Progress.getInstance().addProgressListener(new ProgressWriter(System.out));<br>
009     * </code></ul>
010     * <br>
011     * Example output:<ul><code>
012     * Reading course.pl ...       :<br>
013     * Reading altcourse.pl ...    :<br>
014     * Reading room.pl ...         :<br>
015     * Creating rooms ...          : ................................................<br>
016     * Creating variables ...      : ................................................<br>
017     * Reading students.pl ...     :<br>
018     * Reading jenr.pl ...         :<br>
019     * Creating jenrl constraints .: ................................................<br>
020     * Reading add.pl ...          :<br>
021     * Creating group constraints .: ................................................<br>
022     * Creating initial assignment : ................................................<br>
023     * Creating dept. spread constr: ................................................<br>
024     * Input data loaded           : ................................................<br>
025     * Initializing solver         :<br>
026     * Searching for initial soluti: ................................................<br>
027     * Improving found solution ...: ................................................<br>
028     * Improving found solution ...: ................................................<br>
029     * Improving found solution ...: ...................................
030     * </code></ul>
031     *
032     *
033     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
034     * @version 1.0
035    */
036    public class ProgressWriter implements ProgressListener {
037        private PrintStream iTextOut = null;
038        private static int TEXT_LENGTH = 28;
039        private static int DOTS_LENGTH = 48;
040        private int iPrintedDots = -1;
041    
042        public ProgressWriter(PrintStream out) {
043            iTextOut = out;
044        }
045        
046        public void statusChanged(String status) {
047            //iTextOut.println("Status: "+status);
048        }
049    
050        public void phaseChanged(String phase) {
051            if (iPrintedDots>0) {
052                while (iPrintedDots<DOTS_LENGTH) { iTextOut.print("."); iPrintedDots++; }
053            }
054            iTextOut.println();
055            iTextOut.print(expand(phase,TEXT_LENGTH,' ',false)+": ");
056            iPrintedDots = 0;
057            iTextOut.flush();
058        }
059        
060        public void progressChanged(long currentProgress, long maxProgress) {
061            int dotsToPrint = (maxProgress==0?0:(int)((DOTS_LENGTH*currentProgress)/maxProgress));
062            while (iPrintedDots<dotsToPrint) {
063                iTextOut.print(".");
064                iPrintedDots++;
065            }
066            iTextOut.flush();
067        }
068    
069        public void progressSaved() {}
070        public void progressRestored() {}    
071        
072        private static String expand(String source, int length, char ch, boolean beg) {
073            StringBuffer sb = new StringBuffer(source==null?"":source.length()>length?(beg?source.substring(source.length()-length):source.substring(0,length)):source);
074            while (sb.length()<length) {
075                if (beg) sb.insert(0,ch); else sb.append(ch);
076            }
077            return sb.toString();
078        }
079    }