home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / Visual Cafe Pro v1.0 / TUTORIAL.BIN / FormattedTextField.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-16  |  6.5 KB  |  423 lines

  1. package symantec.itools.awt;
  2.  
  3. import java.awt.Component;
  4. import java.awt.Dimension;
  5. import java.awt.Event;
  6. import java.awt.Font;
  7. import java.awt.FontMetrics;
  8. import java.awt.TextComponent;
  9. import java.awt.TextField;
  10.  
  11. public class FormattedTextField extends TextField {
  12.    public final char ESCAPE;
  13.    public final char DIGIT;
  14.    public final char SIGN;
  15.    public final char DIGIT_OR_SIGN;
  16.    public final char ALPHA_UPPER;
  17.    public final char ALPHA_LOWER;
  18.    public final char ALPHA_TO_UPPER;
  19.    public final char ALPHA_TO_LOWER;
  20.    public final char ALPHANUMERIC_UPPER;
  21.    public final char ALPHANUMERIC_LOWER;
  22.    public final char ALPHANUMERIC_TO_UPPER;
  23.    public final char ALPHANUMERIC_TO_LOWER;
  24.    public final char ANY;
  25.    protected final int BACKSPACE;
  26.    protected final int ENTER;
  27.    protected final int DEL;
  28.    protected boolean editable;
  29.    protected int caret;
  30.    protected String mask;
  31.    protected String maskStripEscapes;
  32.    protected int maskStripEscapesLen;
  33.  
  34.    public FormattedTextField() {
  35.       this(256);
  36.    }
  37.  
  38.    public FormattedTextField(int var1) {
  39.       this("", var1);
  40.    }
  41.  
  42.    public FormattedTextField(String var1) {
  43.       this(var1, 256);
  44.    }
  45.  
  46.    public FormattedTextField(String var1, int var2) {
  47.       super(var1, var2);
  48.       this.ESCAPE = '/';
  49.       this.DIGIT = '9';
  50.       this.SIGN = '+';
  51.       this.DIGIT_OR_SIGN = '-';
  52.       this.ALPHA_UPPER = 'A';
  53.       this.ALPHA_LOWER = 'a';
  54.       this.ALPHA_TO_UPPER = 'U';
  55.       this.ALPHA_TO_LOWER = 'L';
  56.       this.ALPHANUMERIC_UPPER = 'X';
  57.       this.ALPHANUMERIC_LOWER = 'x';
  58.       this.ALPHANUMERIC_TO_UPPER = 'N';
  59.       this.ALPHANUMERIC_TO_LOWER = 'n';
  60.       this.ANY = '*';
  61.       this.BACKSPACE = 8;
  62.       this.ENTER = 10;
  63.       this.DEL = 127;
  64.       this.caret = 0;
  65.    }
  66.  
  67.    public void setMask(String var1) {
  68.       this.mask = var1;
  69.       this.setFillMask();
  70.       this.maskStripEscapes = this.stripMaskEscapes();
  71.       this.maskStripEscapesLen = this.maskStripEscapes.length();
  72.    }
  73.  
  74.    public String getMask() {
  75.       return this.mask;
  76.    }
  77.  
  78.    public void setEditFont(Font var1) {
  79.       super.setFont(var1);
  80.       ((Component)this).invalidate();
  81.    }
  82.  
  83.    public Font getEditFont() {
  84.       return ((Component)this).getFont();
  85.    }
  86.  
  87.    public void setFont(Font var1) {
  88.    }
  89.  
  90.    public void setEditable(boolean var1) {
  91.       this.editable = var1;
  92.       super.setEditable(var1);
  93.       if (this.editable) {
  94.          ((Component)this).enable();
  95.       } else {
  96.          ((Component)this).disable();
  97.       }
  98.    }
  99.  
  100.    public boolean getEditable() {
  101.       return this.editable;
  102.    }
  103.  
  104.    protected int validChar(String var1, int var2, char var3) {
  105.       int var4 = var1.length();
  106.  
  107.       for(int var5 = var2; var5 < var4; ++var5) {
  108.          char var6 = var1.charAt(var5);
  109.          switch (var3) {
  110.             case '*':
  111.                return var5;
  112.             case '+':
  113.                if (var6 == '+' || var6 == '-') {
  114.                   return var5;
  115.                }
  116.                break;
  117.             case '-':
  118.                if (Character.isDigit(var6) || var6 == '+' || var6 == '-') {
  119.                   return var5;
  120.                }
  121.                break;
  122.             case '9':
  123.                if (Character.isDigit(var6)) {
  124.                   return var5;
  125.                }
  126.                break;
  127.             case 'A':
  128.                if (Character.isUpperCase(var6)) {
  129.                   return var5;
  130.                }
  131.                break;
  132.             case 'L':
  133.                if (Character.isUpperCase(var6) || Character.isLowerCase(var6)) {
  134.                   return var5;
  135.                }
  136.                break;
  137.             case 'N':
  138.                if (Character.isUpperCase(var6) || Character.isLowerCase(var6) || Character.isDigit(var6)) {
  139.                   return var5;
  140.                }
  141.                break;
  142.             case 'U':
  143.                if (Character.isUpperCase(var6) || Character.isLowerCase(var6)) {
  144.                   return var5;
  145.                }
  146.                break;
  147.             case 'X':
  148.                if (Character.isUpperCase(var6) || Character.isDigit(var6)) {
  149.                   return var5;
  150.                }
  151.                break;
  152.             case 'a':
  153.                if (Character.isLowerCase(var6)) {
  154.                   return var5;
  155.                }
  156.                break;
  157.             case 'n':
  158.                if (Character.isUpperCase(var6) || Character.isLowerCase(var6) || Character.isDigit(var6)) {
  159.                   return var5;
  160.                }
  161.                break;
  162.             case 'x':
  163.                if (Character.isLowerCase(var6) || Character.isDigit(var6)) {
  164.                   return var5;
  165.                }
  166.          }
  167.       }
  168.  
  169.       return -1;
  170.    }
  171.  
  172.    protected void setFillMask() {
  173.       int var1 = this.mask.length();
  174.       int var2 = 0;
  175.  
  176.       String var3;
  177.       char var4;
  178.       for(var3 = ""; var2 < var1; var3 = var3 + (var4 == '/' ? this.mask.charAt(var2++) : ' ')) {
  179.          var4 = this.mask.charAt(var2++);
  180.       }
  181.  
  182.       ((TextComponent)this).setText(var3);
  183.    }
  184.  
  185.    protected String applyMask(String var1) {
  186.       boolean var2 = false;
  187.       int var3 = this.mask.length();
  188.       int var4 = 0;
  189.       int var5 = 0;
  190.       String var6 = "";
  191.  
  192.       while(var4 < var3) {
  193.          char var7 = this.mask.charAt(var4++);
  194.          if (var7 != '/') {
  195.             if (!var2) {
  196.                var5 = this.validChar(var1, var5, var7);
  197.                if (var5 < 0) {
  198.                   var2 = true;
  199.                   var6 = var6 + ' ';
  200.                } else {
  201.                   char var8 = var1.charAt(var5++);
  202.                   switch (var7) {
  203.                      case 'L':
  204.                         if (Character.isUpperCase(var8)) {
  205.                            var8 = Character.toLowerCase(var8);
  206.                         }
  207.                         break;
  208.                      case 'N':
  209.                         if (Character.isLowerCase(var8)) {
  210.                            var8 = Character.toUpperCase(var8);
  211.                         }
  212.                         break;
  213.                      case 'U':
  214.                         if (Character.isLowerCase(var8)) {
  215.                            var8 = Character.toUpperCase(var8);
  216.                         }
  217.                         break;
  218.                      case 'n':
  219.                         if (Character.isUpperCase(var8)) {
  220.                            var8 = Character.toLowerCase(var8);
  221.                         }
  222.                   }
  223.  
  224.                   var6 = var6 + String.valueOf(var8);
  225.                }
  226.             } else {
  227.                var6 = var6 + ' ';
  228.             }
  229.          } else {
  230.             var6 = var6 + this.mask.charAt(var4++);
  231.          }
  232.       }
  233.  
  234.       return var6;
  235.    }
  236.  
  237.    private boolean isEscape(int var1) {
  238.       if (var1 >= 0 && var1 < this.maskStripEscapesLen) {
  239.          return this.maskStripEscapes.charAt(var1) == '/';
  240.       } else {
  241.          return false;
  242.       }
  243.    }
  244.  
  245.    private String stripMaskEscapes() {
  246.       int var1 = this.mask.length();
  247.       int var2 = 0;
  248.  
  249.       String var3;
  250.       char var4;
  251.       for(var3 = ""; var2 < var1; var3 = var3 + var4) {
  252.          var4 = this.mask.charAt(var2++);
  253.          if (var4 == '/') {
  254.             ++var2;
  255.          }
  256.       }
  257.  
  258.       return var3;
  259.    }
  260.  
  261.    protected String stripMask(String var1) {
  262.       int var2 = var1.length();
  263.       int var3 = 0;
  264.       String var4 = "";
  265.  
  266.       while(var3 < this.maskStripEscapesLen && var3 < var2) {
  267.          if (this.isEscape(var3)) {
  268.             ++var3;
  269.          } else {
  270.             var4 = var4 + var1.charAt(var3++);
  271.          }
  272.       }
  273.  
  274.       return var4;
  275.    }
  276.  
  277.    private boolean processChar(int var1) {
  278.       int var2 = ((TextComponent)this).getSelectionStart();
  279.       int var3 = ((TextComponent)this).getSelectionEnd();
  280.       boolean var4 = var1 == 8;
  281.       boolean var5 = var1 == 127;
  282.       boolean var6 = var2 != var3;
  283.       if (!var6) {
  284.          if (var4) {
  285.             var2 = var3 - 1;
  286.          } else if (var5) {
  287.             var3 = var2 + 1;
  288.          }
  289.       }
  290.  
  291.       int var7 = !var4 && !var5 && !var6 ? var3 : var2;
  292.       if (var7 < 0) {
  293.          var7 = 0;
  294.       }
  295.  
  296.       boolean var8 = this.isEscape(var7 > 0 ? var7 : 0);
  297.       boolean var9 = this.isEscape(!var4 && !var5 ? var7 + 1 : (var7 > 0 ? var7 - 1 : 0));
  298.       boolean var10;
  299.       if (var8) {
  300.          var10 = true;
  301.          int var11 = var7;
  302.  
  303.          while(var11 >= 0) {
  304.             if (!this.isEscape(var11--)) {
  305.                var10 = false;
  306.                break;
  307.             }
  308.          }
  309.  
  310.          if (var10) {
  311.             while(var7 < this.maskStripEscapesLen && this.isEscape(var7++)) {
  312.             }
  313.          }
  314.       } else {
  315.          var10 = false;
  316.       }
  317.  
  318.       int var23 = 0;
  319.  
  320.       while(var7 >= 0) {
  321.          if (this.isEscape(var7--)) {
  322.             ++var23;
  323.          }
  324.       }
  325.  
  326.       if (!var10 && var8 && !var4 && !var5) {
  327.          --var23;
  328.       }
  329.  
  330.       var2 -= var23;
  331.       var3 -= var23;
  332.       if (var2 < 0) {
  333.          var2 = 0;
  334.       }
  335.  
  336.       if (var3 < 0) {
  337.          var3 = 0;
  338.       }
  339.  
  340.       String var12 = this.stripMask(((TextComponent)this).getText());
  341.       int var13 = var12.length();
  342.       String var14 = !var4 && !var5 ? String.valueOf((char)var1) : "";
  343.       String var15 = var2 > 0 ? var12.substring(0, var2) : "";
  344.       String var16 = var3 < var13 ? var12.substring(var3) : "";
  345.       String var17 = !var4 && !var5 ? var15 + var14 + var16 : var15 + var16;
  346.       String var18 = this.applyMask(var17);
  347.       if (var4 || var5 || !var12.equals(this.stripMask(var18))) {
  348.          ((TextComponent)this).setText(var18);
  349.          if (!var4 && !var5) {
  350.             this.caret = (var6 ? var2 : var3) + var23;
  351.             if (this.caret < var13 && this.isEscape(this.caret + 1)) {
  352.                for(int var22 = this.caret + 1; var22 < var13 && this.isEscape(var22++); ++this.caret) {
  353.                }
  354.             }
  355.          } else {
  356.             --var23;
  357.             this.caret = var2 + var23;
  358.             if (var9 && this.caret > 0 && this.isEscape(this.caret)) {
  359.                for(int var21 = this.caret; var21 >= 0 && this.isEscape(var21--); --this.caret) {
  360.                }
  361.             }
  362.          }
  363.  
  364.          ((TextComponent)this).select(this.caret + 1, this.caret + 1);
  365.       }
  366.  
  367.       return true;
  368.    }
  369.  
  370.    private void processKeyAction(int var1) {
  371.       switch (var1) {
  372.          case 1000:
  373.             this.caret = 0;
  374.             return;
  375.          case 1001:
  376.             this.caret = this.maskStripEscapesLen;
  377.             return;
  378.          case 1006:
  379.             if (--this.caret < 0) {
  380.                this.caret = 0;
  381.                return;
  382.             }
  383.             break;
  384.          case 1007:
  385.             if (++this.caret >= this.maskStripEscapesLen) {
  386.                this.caret = this.maskStripEscapesLen;
  387.                return;
  388.             }
  389.       }
  390.  
  391.    }
  392.  
  393.    public boolean keyDown(Event var1, int var2) {
  394.       switch (var1.id) {
  395.          case 401:
  396.             if (var2 != 10) {
  397.                return this.processChar(var2);
  398.             }
  399.          case 402:
  400.          default:
  401.             break;
  402.          case 403:
  403.             this.processKeyAction(var1.key);
  404.       }
  405.  
  406.       return super.keyDown(var1, var2);
  407.    }
  408.  
  409.    public Dimension preferredSize() {
  410.       Font var1 = ((Component)this).getFont();
  411.       if (var1 != null) {
  412.          FontMetrics var2 = ((Component)this).getFontMetrics(var1);
  413.          return new Dimension(var2.stringWidth("ABCDE") + 4, var2.getHeight() + 4);
  414.       } else {
  415.          return new Dimension(30, 15);
  416.       }
  417.    }
  418.  
  419.    public Dimension minimumSize() {
  420.       return this.preferredSize();
  421.    }
  422. }
  423.