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