home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / java / text / MessageFormat.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  9.7 KB  |  482 lines

  1. package java.text;
  2.  
  3. import java.util.Date;
  4. import java.util.Locale;
  5.  
  6. public class MessageFormat extends Format {
  7.    private Locale locale = Locale.getDefault();
  8.    private String pattern = "";
  9.    private Format[] formats = new Format[10];
  10.    private int[] offsets = new int[10];
  11.    private int[] argumentNumbers = new int[10];
  12.    private int maxOffset = -1;
  13.    private static final String[] typeList = new String[]{"", "", "number", "", "date", "", "time", "", "choice"};
  14.    private static final String[] modifierList = new String[]{"", "", "currency", "", "percent", "", "integer"};
  15.    private static final String[] dateModifierList = new String[]{"", "", "short", "", "medium", "", "long", "", "full"};
  16.  
  17.    public MessageFormat(String var1) {
  18.       this.applyPattern(var1);
  19.    }
  20.  
  21.    public void setLocale(Locale var1) {
  22.       this.locale = var1;
  23.    }
  24.  
  25.    public Locale getLocale() {
  26.       return this.locale;
  27.    }
  28.  
  29.    public void applyPattern(String var1) {
  30.       StringBuffer[] var2 = new StringBuffer[4];
  31.  
  32.       for(int var3 = 0; var3 < var2.length; ++var3) {
  33.          var2[var3] = new StringBuffer();
  34.       }
  35.  
  36.       int var4 = 0;
  37.       int var5 = 0;
  38.       boolean var6 = false;
  39.       int var7 = 0;
  40.  
  41.       for(int var8 = 0; var8 < var1.length(); ++var8) {
  42.          char var9 = var1.charAt(var8);
  43.          if (var4 == 0) {
  44.             if (var9 == '\'') {
  45.                if (var8 + 1 < var1.length() && var1.charAt(var8 + 1) == '\'') {
  46.                   var2[var4].append(var9);
  47.                   ++var8;
  48.                } else {
  49.                   var6 = !var6;
  50.                }
  51.             } else if (var9 == '{' && !var6) {
  52.                var4 = 1;
  53.             } else {
  54.                var2[var4].append(var9);
  55.             }
  56.          } else if (var6) {
  57.             var2[var4].append(var9);
  58.             if (var9 == '\'') {
  59.                var6 = false;
  60.             }
  61.          } else {
  62.             switch (var9) {
  63.                case '\'':
  64.                   var6 = true;
  65.                default:
  66.                   var2[var4].append(var9);
  67.                   break;
  68.                case ',':
  69.                   if (var4 < 3) {
  70.                      ++var4;
  71.                   } else {
  72.                      var2[var4].append(var9);
  73.                   }
  74.                   break;
  75.                case '{':
  76.                   ++var7;
  77.                   var2[var4].append(var9);
  78.                   break;
  79.                case '}':
  80.                   if (var7 == 0) {
  81.                      var4 = 0;
  82.                      this.makeFormat(var8, var5, var2);
  83.                      ++var5;
  84.                   } else {
  85.                      --var7;
  86.                      var2[var4].append(var9);
  87.                   }
  88.             }
  89.          }
  90.       }
  91.  
  92.       this.pattern = var2[0].toString();
  93.    }
  94.  
  95.    public String toPattern() {
  96.       int var1 = 0;
  97.       StringBuffer var2 = new StringBuffer();
  98.  
  99.       for(int var3 = 0; var3 <= this.maxOffset; ++var3) {
  100.          copyAndFixQuotes(this.pattern, var1, this.offsets[var3], var2);
  101.          var1 = this.offsets[var3];
  102.          var2.append('{');
  103.          var2.append(this.argumentNumbers[var3]);
  104.          if (this.formats[var3] != null) {
  105.             if (this.formats[var3] instanceof DecimalFormat) {
  106.                if (this.formats[var3].equals(NumberFormat.getInstance(this.locale))) {
  107.                   var2.append(",number");
  108.                } else if (this.formats[var3].equals(NumberFormat.getCurrencyInstance(this.locale))) {
  109.                   var2.append(",number,currency");
  110.                } else if (this.formats[var3].equals(NumberFormat.getPercentInstance(this.locale))) {
  111.                   var2.append(",number,percent");
  112.                } else if (this.formats[var3].equals(this.getIntegerFormat(this.locale))) {
  113.                   var2.append(",number,integer");
  114.                } else {
  115.                   var2.append(",number," + ((DecimalFormat)this.formats[var3]).toPattern());
  116.                }
  117.             } else if (this.formats[var3] instanceof SimpleDateFormat) {
  118.                if (this.formats[var3].equals(DateFormat.getDateInstance(2, this.locale))) {
  119.                   var2.append(",date");
  120.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(3, this.locale))) {
  121.                   var2.append(",date,short");
  122.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(2, this.locale))) {
  123.                   var2.append(",date,medium");
  124.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(1, this.locale))) {
  125.                   var2.append(",date,long");
  126.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(0, this.locale))) {
  127.                   var2.append(",date,full");
  128.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(2, this.locale))) {
  129.                   var2.append(",time");
  130.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(3, this.locale))) {
  131.                   var2.append(",time,short");
  132.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(2, this.locale))) {
  133.                   var2.append(",time,medium");
  134.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(1, this.locale))) {
  135.                   var2.append(",time,long");
  136.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(0, this.locale))) {
  137.                   var2.append(",time,full");
  138.                } else {
  139.                   var2.append(",date," + ((SimpleDateFormat)this.formats[var3]).toPattern());
  140.                }
  141.             } else if (this.formats[var3] instanceof ChoiceFormat) {
  142.                var2.append(",choice," + ((ChoiceFormat)this.formats[var3]).toPattern());
  143.             }
  144.          }
  145.  
  146.          var2.append('}');
  147.       }
  148.  
  149.       copyAndFixQuotes(this.pattern, var1, this.pattern.length(), var2);
  150.       return var2.toString();
  151.    }
  152.  
  153.    public void setFormats(Format[] var1) {
  154.       try {
  155.          this.formats = (Format[])var1.clone();
  156.       } catch (Exception var2) {
  157.       }
  158.    }
  159.  
  160.    public void setFormat(int var1, Format var2) {
  161.       this.formats[var1] = var2;
  162.    }
  163.  
  164.    public Format[] getFormats() {
  165.       try {
  166.          return (Format[])this.formats.clone();
  167.       } catch (Exception var1) {
  168.          return this.formats;
  169.       }
  170.    }
  171.  
  172.    public final StringBuffer format(Object[] var1, StringBuffer var2, FieldPosition var3) {
  173.       return this.format(var1, var2, var3, 0);
  174.    }
  175.  
  176.    public static String format(String var0, Object[] var1) {
  177.       MessageFormat var2 = new MessageFormat(var0);
  178.       return ((Format)var2).format(var1);
  179.    }
  180.  
  181.    public final StringBuffer format(Object var1, StringBuffer var2, FieldPosition var3) {
  182.       return this.format(var1, var2, var3, 0);
  183.    }
  184.  
  185.    public Object[] parse(String var1, ParsePosition var2) {
  186.       Object[] var3 = new Object[10];
  187.       int var4 = 0;
  188.       int var5 = var2.index;
  189.       ParsePosition var6 = new ParsePosition(0);
  190.  
  191.       for(int var7 = 0; var7 <= this.maxOffset; ++var7) {
  192.          int var8 = this.offsets[var7] - var4;
  193.          if (var8 != 0 && !this.pattern.regionMatches(var4, var1, var5, var8)) {
  194.             return null;
  195.          }
  196.  
  197.          var5 += var8;
  198.          var4 += var8;
  199.          if (this.formats[var7] == null) {
  200.             int var9 = var7 != this.maxOffset ? this.offsets[var7 + 1] : this.pattern.length();
  201.             int var10 = var1.indexOf(this.pattern.substring(var4, var9), var5);
  202.             if (var10 < 0) {
  203.                return null;
  204.             }
  205.  
  206.             var3[this.argumentNumbers[var7]] = var1.substring(var5, var10);
  207.             var5 = var10;
  208.          } else {
  209.             var6.index = var5;
  210.             var3[this.argumentNumbers[var7]] = this.formats[var7].parseObject(var1, var6);
  211.             if (var6.index == var5) {
  212.                return null;
  213.             }
  214.  
  215.             var5 = var6.index;
  216.          }
  217.       }
  218.  
  219.       int var12 = this.pattern.length() - var4;
  220.       if (var12 != 0 && !this.pattern.regionMatches(var4, var1, var5, var12)) {
  221.          return null;
  222.       } else {
  223.          var2.index = var5 + var12;
  224.          return var3;
  225.       }
  226.    }
  227.  
  228.    public Object[] parse(String var1) throws ParseException {
  229.       ParsePosition var2 = new ParsePosition(0);
  230.       Object[] var3 = this.parse(var1, var2);
  231.       if (var2.index == 0) {
  232.          throw new ParseException("MessageFormat parse error!", 0);
  233.       } else {
  234.          return var3;
  235.       }
  236.    }
  237.  
  238.    public Object parseObject(String var1, ParsePosition var2) {
  239.       return this.parse(var1, var2);
  240.    }
  241.  
  242.    public Object clone() {
  243.       MessageFormat var1 = (MessageFormat)super.clone();
  244.       var1.formats = (Format[])this.formats.clone();
  245.  
  246.       for(int var2 = 0; var2 < this.formats.length; ++var2) {
  247.          if (this.formats[var2] != null) {
  248.             var1.formats[var2] = (Format)this.formats[var2].clone();
  249.          }
  250.       }
  251.  
  252.       var1.offsets = (int[])this.offsets.clone();
  253.       var1.argumentNumbers = (int[])this.argumentNumbers.clone();
  254.       return var1;
  255.    }
  256.  
  257.    public boolean equals(Object var1) {
  258.       if (this == var1) {
  259.          return true;
  260.       } else if (this.getClass() != var1.getClass()) {
  261.          return false;
  262.       } else {
  263.          MessageFormat var2 = (MessageFormat)var1;
  264.          return this.maxOffset == var2.maxOffset && this.pattern.equals(var2.pattern) && Utility.objectEquals(this.locale, var2.locale) && Utility.arrayEquals(this.offsets, var2.offsets) && Utility.arrayEquals(this.argumentNumbers, var2.argumentNumbers) && Utility.arrayEquals(this.formats, var2.formats);
  265.       }
  266.    }
  267.  
  268.    public int hashCode() {
  269.       return this.pattern.hashCode();
  270.    }
  271.  
  272.    private StringBuffer format(Object[] var1, StringBuffer var2, FieldPosition var3, int var4) {
  273.       int var5 = 0;
  274.  
  275.       for(int var6 = 0; var6 <= this.maxOffset; ++var6) {
  276.          var2.append(this.pattern.substring(var5, this.offsets[var6]));
  277.          var5 = this.offsets[var6];
  278.          int var7 = this.argumentNumbers[var6];
  279.          if (var7 >= var1.length) {
  280.             throw new IllegalArgumentException("Argument # > Arg length");
  281.          }
  282.  
  283.          Object var8 = var1[var7];
  284.          boolean var10 = false;
  285.          String var9;
  286.          if (this.formats[var6] != null) {
  287.             var9 = this.formats[var6].format(var8);
  288.             var10 = this.formats[var6] instanceof ChoiceFormat;
  289.          } else if (var8 instanceof Number) {
  290.             var9 = NumberFormat.getInstance(this.locale).format(var8);
  291.          } else if (var8 instanceof Date) {
  292.             var9 = DateFormat.getDateTimeInstance(3, 3, this.locale).format(var8);
  293.          } else {
  294.             if (!(var8 instanceof String)) {
  295.                System.out.println("Unknown object of type:" + var8.getClass().getName());
  296.                throw new IllegalArgumentException("Unknown argument");
  297.             }
  298.  
  299.             var9 = (String)var8;
  300.          }
  301.  
  302.          if (var10 && var9.indexOf(123) >= 0) {
  303.             MessageFormat var11 = new MessageFormat(var9);
  304.             var11.format(var1, var2, var3, var4);
  305.          } else {
  306.             var2.append(var9);
  307.          }
  308.       }
  309.  
  310.       var2.append(this.pattern.substring(var5, this.pattern.length()));
  311.       return var2;
  312.    }
  313.  
  314.    private void makeFormat(int var1, int var2, StringBuffer[] var3) {
  315.       try {
  316.          int var4 = Integer.parseInt(var3[1].toString());
  317.          if (var4 < 0 || var4 > 9) {
  318.             throw new NumberFormatException();
  319.          }
  320.  
  321.          this.maxOffset = var2;
  322.          this.offsets[var2] = var3[0].length();
  323.          this.argumentNumbers[var2] = var4;
  324.       } catch (Exception var10) {
  325.          throw new IllegalArgumentException("argument number too large at ");
  326.       }
  327.  
  328.       Object var5;
  329.       var5 = null;
  330.       label61:
  331.       switch (findKeyword(var3[2].toString(), typeList)) {
  332.          case 0:
  333.             break;
  334.          case 1:
  335.          case 2:
  336.             switch (findKeyword(var3[3].toString(), modifierList)) {
  337.                case 0:
  338.                   var5 = NumberFormat.getInstance(this.locale);
  339.                   break label61;
  340.                case 1:
  341.                case 2:
  342.                   var5 = NumberFormat.getCurrencyInstance(this.locale);
  343.                   break label61;
  344.                case 3:
  345.                case 4:
  346.                   var5 = NumberFormat.getPercentInstance(this.locale);
  347.                   break label61;
  348.                case 5:
  349.                case 6:
  350.                   var5 = this.getIntegerFormat(this.locale);
  351.                   break label61;
  352.                default:
  353.                   var5 = NumberFormat.getInstance(this.locale);
  354.  
  355.                   try {
  356.                      ((DecimalFormat)var5).applyPattern(var3[3].toString());
  357.                      break label61;
  358.                   } catch (Exception var9) {
  359.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  360.                   }
  361.             }
  362.          case 3:
  363.          case 4:
  364.             switch (findKeyword(var3[3].toString(), dateModifierList)) {
  365.                case 0:
  366.                   var5 = DateFormat.getDateInstance(2, this.locale);
  367.                   break label61;
  368.                case 1:
  369.                case 2:
  370.                   var5 = DateFormat.getDateInstance(3, this.locale);
  371.                   break label61;
  372.                case 3:
  373.                case 4:
  374.                   var5 = DateFormat.getDateInstance(2, this.locale);
  375.                   break label61;
  376.                case 5:
  377.                case 6:
  378.                   var5 = DateFormat.getDateInstance(1, this.locale);
  379.                   break label61;
  380.                case 7:
  381.                case 8:
  382.                   var5 = DateFormat.getDateInstance(0, this.locale);
  383.                   break label61;
  384.                default:
  385.                   var5 = DateFormat.getDateInstance(2, this.locale);
  386.  
  387.                   try {
  388.                      ((SimpleDateFormat)var5).applyPattern(var3[3].toString());
  389.                      break label61;
  390.                   } catch (Exception var8) {
  391.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  392.                   }
  393.             }
  394.          case 5:
  395.          case 6:
  396.             switch (findKeyword(var3[3].toString(), dateModifierList)) {
  397.                case 0:
  398.                   var5 = DateFormat.getTimeInstance(2, this.locale);
  399.                   break label61;
  400.                case 1:
  401.                case 2:
  402.                   var5 = DateFormat.getTimeInstance(3, this.locale);
  403.                   break label61;
  404.                case 3:
  405.                case 4:
  406.                   var5 = DateFormat.getTimeInstance(2, this.locale);
  407.                   break label61;
  408.                case 5:
  409.                case 6:
  410.                   var5 = DateFormat.getTimeInstance(1, this.locale);
  411.                   break label61;
  412.                case 7:
  413.                case 8:
  414.                   var5 = DateFormat.getTimeInstance(0, this.locale);
  415.                   break label61;
  416.                default:
  417.                   var5 = DateFormat.getTimeInstance(2, this.locale);
  418.  
  419.                   try {
  420.                      ((SimpleDateFormat)var5).applyPattern(var3[3].toString());
  421.                      break label61;
  422.                   } catch (Exception var7) {
  423.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  424.                   }
  425.             }
  426.          case 7:
  427.          case 8:
  428.             try {
  429.                var5 = new ChoiceFormat(var3[3].toString());
  430.                break;
  431.             } catch (Exception var6) {
  432.                throw new IllegalArgumentException("Choice Pattern incorrect, error at ");
  433.             }
  434.          default:
  435.             throw new IllegalArgumentException("unknown format type at ");
  436.       }
  437.  
  438.       this.formats[var2] = (Format)var5;
  439.       var3[1].setLength(0);
  440.       var3[2].setLength(0);
  441.       var3[3].setLength(0);
  442.    }
  443.  
  444.    private static final int findKeyword(String var0, String[] var1) {
  445.       var0 = var0.trim().toLowerCase();
  446.  
  447.       for(int var2 = 0; var2 < var1.length; ++var2) {
  448.          if (var0.equals(var1[var2])) {
  449.             return var2;
  450.          }
  451.       }
  452.  
  453.       return -1;
  454.    }
  455.  
  456.    NumberFormat getIntegerFormat(Locale var1) {
  457.       NumberFormat var2 = NumberFormat.getInstance(var1);
  458.       if (var2 instanceof DecimalFormat) {
  459.          DecimalFormat var3 = (DecimalFormat)var2;
  460.          ((NumberFormat)var3).setMaximumFractionDigits(0);
  461.          var3.setDecimalSeparatorAlwaysShown(false);
  462.          ((NumberFormat)var3).setParseIntegerOnly(true);
  463.       }
  464.  
  465.       return var2;
  466.    }
  467.  
  468.    private static final void copyAndFixQuotes(String var0, int var1, int var2, StringBuffer var3) {
  469.       for(int var4 = var1; var4 < var2; ++var4) {
  470.          char var5 = var0.charAt(var4);
  471.          if (var5 == '{') {
  472.             var3.append("'{'");
  473.          } else if (var5 == '\'') {
  474.             var3.append("''");
  475.          } else {
  476.             var3.append(var5);
  477.          }
  478.       }
  479.  
  480.    }
  481. }
  482.