You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ar...@apache.org on 2001/07/08 07:03:49 UTC

cvs commit: xml-fop/src/org/apache/fop/fo/pagination PageNumberGenerator.java

arved       01/07/07 22:03:49

  Added:       src/org/apache/fop/fo/pagination PageNumberGenerator.java
  Log:
  Supports page-number formatting
  
  Revision  Changes    Path
  1.1                  xml-fop/src/org/apache/fop/fo/pagination/PageNumberGenerator.java
  
  Index: PageNumberGenerator.java
  ===================================================================
  /*-- $Id: PageNumberGenerator.java,v 1.1 2001/07/08 05:03:48 arved Exp $ --
   * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
   * For details on use and redistribution please refer to the
   * LICENSE file included with these sources.
   */
  
  package org.apache.fop.fo.pagination;
  
  import org.apache.fop.fo.properties.*;
  import org.apache.fop.messaging.MessageHandler;
  
  // Java
  import java.util.*;
  
  /**
   * This class uses the 'format', 'groupingSeparator', 'groupingSize',
   * and 'letterValue' properties on fo:page-sequence to return a String
   * corresponding to the supplied integer page number.
   */
  public class PageNumberGenerator {
  
  	private String format;
  	private char groupingSeparator;
  	private int groupingSize;
  	private int letterValue;
  
  	//constants
  	private int DECIMAL = 1;	// '0*1'
  	private int LOWERALPHA = 2;	// 'a'
  	private int UPPERALPHA = 3;	// 'A'
  	private int LOWERROMAN = 4;	// 'i'
  	private int UPPERROMAN = 5;	// 'I'
  	
  	// flags
  	private int formatType = DECIMAL;
  	private int minPadding = 0;	// for decimal formats
  	
  	// preloaded strings of zeros
  	private String zeros[] = { "", "0", "00", "000", "0000", "00000" };
  	
  	public PageNumberGenerator( String format,
  	char groupingSeparator, int groupingSize, int letterValue ) {
  		this.format = format;
  		this.groupingSeparator = groupingSeparator;
  		this.groupingSize = groupingSize;
  		this.letterValue = letterValue;
  		
  		// the only accepted format strings are currently '0*1' 'a', 'A', 'i'
  		// and 'I'
  		int fmtLen = format.length();
  		if (fmtLen == 1) {
  			if (format.equals("1")) {
  				formatType = DECIMAL;
  				minPadding = 0;
  			} else if (format.equals("a")) {
  				formatType = LOWERALPHA;
  			} else if (format.equals("A")) {
  				formatType = UPPERALPHA;
  			} else if (format.equals("i")) {
  				formatType = LOWERROMAN;
  			} else if (format.equals("I")) {
  				formatType = UPPERROMAN;
  			} else {
  				// token not handled
  				MessageHandler.log("'format' token not recognized; using '1'");
  				formatType = DECIMAL;
  				minPadding = 0;				
  			}
  		}
  		else {
  			// only accepted token is '0+1'at this stage.	 Because of the
  			// wonderful regular expression support in Java, we will resort to a
  			// loop
  			for (int i = 0; i < fmtLen-1; i++) {
  				if (format.charAt(i) != '0') {
  					MessageHandler.log("'format' token not recognized; using '1'");
  					formatType = DECIMAL;
  					minPadding = 0;				
  				} else {
  					minPadding = fmtLen - 1;
  				}
  			}
  		}
  	}
  	
  	public String makeFormattedPageNumber(int number) {
  		String pn = null;
  		if (formatType == DECIMAL) {
  			pn = Integer.toString(number);
  			if (minPadding >= pn.length()) {
  				int nz = minPadding - pn.length() + 1;
  				pn = zeros[nz] + pn;
  			}
  		} else if ((formatType == LOWERROMAN) || (formatType == UPPERROMAN)) {
  			pn = makeRoman(number);
  			if (formatType == UPPERROMAN)
  				pn = pn.toUpperCase();
  		} else {
  			// alphabetic
  			pn = makeAlpha(number);
  			if (formatType == UPPERALPHA)
  				pn = pn.toUpperCase();
  		}
  		return pn;
  	}
  	
  	private String makeRoman( int num ) {
      	int arabic[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
  		String roman[] = { "m", "cm", "d", "cd", "c", "xc", "l", "xl", "x",
  		"ix", "v", "iv", "i" };
  
      	int i = 0;
  		StringBuffer romanNumber = new StringBuffer();
  		
  		while (num > 0) {
  		while (num >= arabic[i]) {
  				num = num - arabic[i];
  				romanNumber.append( roman[i] );
  			}
  			i = i + 1;
  		}
  		return romanNumber.toString();
  	}
  	
  	private String makeAlpha( int num ) {
  		String letters = "abcdefghijklmnopqrstuvwxyz";
  		StringBuffer alphaNumber = new StringBuffer();
  		
  		int base = 26;
  		int rem = 0;
  		
  		num--;
  		if (num < base) {
  			alphaNumber.append(letters.charAt(num));
  		} else {
  			while (num >= base) {
  				rem = num % base;
  				alphaNumber.append(letters.charAt(rem));
  				num = num / base;
  			}
  			alphaNumber.append(letters.charAt(num-1));
  		}
  		return alphaNumber.reverse().toString();
  	}
  }
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: fop-cvs-help@xml.apache.org