EditControl.java
上传用户:luxiaowei
上传日期:2022-06-06
资源大小:58k
文件大小:20k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  * EditControl.java
  3.  *
  4.  * Created on April 23, 2010, 10:20 AM
  5.  *
  6.  * To change this template, choose Tools | Template Manager
  7.  * and open the template in the editor.
  8.  */
  9. package com.framework;
  10. import java.util.Vector;
  11. import javax.microedition.lcdui.Canvas;
  12. import javax.microedition.lcdui.Graphics;
  13. /**
  14.  *
  15.  * @author Tejaswi
  16.  */
  17. public class EditControl  extends UIControl implements TimerInterface {
  18.      long timeHolder;
  19.     final int DELAY = 350;
  20.     final int CHAR_INSERT_DELAY = 1300;
  21.     boolean showCursor = false;
  22.     GTantra font;
  23.     Vector textVector = new Vector();
  24.     int totalHeight = 0;;
  25.     int cursorXPosition = 0;
  26.     int cursorYPosition = 0;
  27.     int cursorLocation = 0;
  28.     int fontHeight;
  29.     int currentSelectedRow;
  30.     int leftPadding = 3;
  31.     private StringBuffer actulText = new StringBuffer("");
  32.     int scrollHeight = 0;
  33.     BaseTimer timeTask,insertCharTask;
  34.     int horScrolled = 0;
  35.     boolean isMultiline = true;
  36.     //--------color related variables---------------
  37.     
  38.      int cursorColor =0;
  39.      private int scrollBarBgColor = 0xffffff;
  40.      private int scrollBarArrowColol = 0;
  41.     
  42.      //-------- variables might need to re config. ----------
  43.     
  44.     private static final int ERROR_WARP = 4;
  45.     private static final int SCROLL_BAR_WIDTH = 13;
  46.     private boolean m_editable = true;
  47.     public static final int SMART_KEY_PAD = 0;
  48.     public static final int QWERTY_KEY_PAD = 1;
  49.     static int keyPadType =SMART_KEY_PAD;
  50.     public static final int NUMERIC = 0;
  51.     public static final int ALPHA_NUMERIC = 1;
  52.     int editType = ALPHA_NUMERIC;
  53.     int oldKeyCode = -1;
  54.     private static final char[][] charArry = {
  55.         {' ', '0'},
  56.         {'.', ',', ''', '?', '!', '"', '_', '-', '(', ')', '@', '/', ':', '1'},
  57.         {'a', 'b', 'c', '2'},
  58.         {'d', 'e', 'f', '3'},
  59.         {'g', 'h', 'i', '4'},
  60.         {'j', 'k', 'l', '5'},
  61.         {'m', 'n', 'o', '6'},
  62.         {'p', 'q', 'r', 's', '7'},
  63.         {'t', 'u', 'v', '8'},
  64.         {'w', 'x', 'y', 'z', '9'}
  65.     };
  66.     int count = 0;
  67.     char currentChar;
  68.     int max_limit = 0;
  69.     /** Creates a new instance of EditControl */
  70.     public EditControl(GTantra font,int width,int height,int max_limit,boolean isMultiline) {
  71.          this.max_limit = max_limit;
  72.         this.isMultiline = isMultiline;
  73.         this.font = font;
  74.        
  75.         //this.width = width;
  76.         //this.height = height;
  77.         fontHeight = font.getFontHeight();
  78.         textVector.addElement("");
  79.         setWidth(width);
  80.         if(height != -1)
  81.         {
  82.             setHeight(height);
  83.         }else
  84.             resize();
  85.         
  86.         setCursorPosition();
  87.     }
  88.      public void setSelected(boolean selected) {
  89.         super.setSelected(selected);
  90.         if(!selected)
  91.         {
  92.              if(timeTask != null)
  93.              {
  94.                  timeTask.cancel();
  95.                  timeTask = null;
  96.              }
  97.              showCursor = false;
  98.         }else
  99.         {
  100.             if(m_editable)
  101. {
  102.                 if(timeTask != null)
  103.                  {
  104.                      timeTask.cancel();
  105.                      timeTask = null;
  106.                  }
  107.         timeTask = BaseTimer.schedule(DELAY, DELAY, this,0);
  108. }
  109.         }
  110.     }
  111.      
  112.    
  113.     public void setEditable(boolean editable)
  114.     {
  115.             m_editable = editable;
  116.     }
  117.     
  118.     
  119.     public void setHeight(int height) {
  120.      super.setHeight(height);
  121.       reParseText();
  122.     }
  123.     public void setWidth(int width) {
  124.      super.setWidth(width);
  125.          reParseText();
  126.     }
  127.    
  128.    public String getText()
  129.    {
  130.        return actulText.toString();
  131.    }
  132.    public void setText(String str)
  133.    {
  134.    try
  135.    {
  136.    if(isMultiline)
  137.    {
  138.        textVector.removeAllElements();
  139.        actulText.delete(0, actulText.length());
  140.        actulText.append(str);
  141.        cursorLocation = str.length();
  142.        reParseText();
  143.    }else
  144.    {
  145.    actulText.delete(0, actulText.length());
  146.        actulText.append(str);
  147.        cursorLocation = str.length();
  148.        setScrollHeight();
  149.        setCursorPosition();
  150.    }
  151.    }
  152.    catch (Exception e) {
  153. e.printStackTrace();
  154. }
  155.    }
  156.    //-------------------------------------------------------
  157.     private void drawCursor(Graphics g) {
  158.         if (showCursor && m_editable && insertCharTask == null) {
  159.             g.setColor(cursorColor);
  160.             g.drawLine(cursorXPosition, cursorYPosition - (fontHeight >> 1), cursorXPosition, cursorYPosition + (fontHeight >> 1));
  161.         }
  162.     }
  163.     private void drawScrollBar(Graphics g)
  164.     {
  165.         if(totalHeight > height)
  166.         {
  167.             g.setColor(scrollBarBgColor);
  168. //            g.fillRect(width - SCROLL_BAR_WIDTH, 0, SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH);
  169. //            g.fillRect(width - SCROLL_BAR_WIDTH, height - SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH);
  170. //            g.drawRect(width - SCROLL_BAR_WIDTH, 0, SCROLL_BAR_WIDTH, height);
  171.             g.fillRect(width - SCROLL_BAR_WIDTH, 0, SCROLL_BAR_WIDTH, height);
  172.             int arrowPadding = 2;
  173.             g.setColor(scrollBarArrowColol);
  174.             int scrollBarArrowWidth =SCROLL_BAR_WIDTH -(arrowPadding << 1); 
  175.             if(scrollHeight > 0 )
  176.              drawFilledTriangle(g, width - scrollBarArrowWidth - arrowPadding , (scrollBarArrowWidth >> 1) + arrowPadding , true,scrollBarArrowWidth );
  177.             if(scrollHeight + height < totalHeight)
  178.              drawFilledTriangle(g, width - scrollBarArrowWidth - arrowPadding ,height- (scrollBarArrowWidth >> 1) - arrowPadding , false,scrollBarArrowWidth );
  179.             
  180.         }
  181.         
  182.     }
  183.     public static void drawFilledTriangle(Graphics g, int startPtX, int startPtY, boolean arrowDirection, int arrowWidth) {
  184.         int wdth = arrowWidth;
  185.         /**vertical arrow is to be drawn*/
  186.        int i = 0;
  187.        boolean var = true;
  188.             while (var == true) {
  189.                 /**up arrow is to be drawn*/
  190.                 if (arrowDirection == true) {
  191.                     g.drawLine(startPtX + i, startPtY - i, startPtX + wdth - i, startPtY - i);
  192.                 /**down arrow is to be drawn*/
  193.                 } else {
  194.                     g.drawLine(startPtX + i, startPtY + i, startPtX + wdth - i, startPtY + i);
  195.                 }
  196.                 if (wdth - i == arrowWidth >> 1) {
  197.                     var = false;
  198.                 }
  199.                 i++;
  200.             }
  201.         }
  202.     int clipX, clipY,clipWidth,clipHeight;
  203.     private void setClip(Graphics g,int _x, int _y,int _width,int _height)
  204.     {
  205.         clipX = g.getClipX();
  206.         clipY = g.getClipY();
  207.         clipWidth = g.getClipWidth();
  208.         clipHeight = g.getClipHeight(); 
  209.         g.setClip(_x, _y, _width, _height);
  210.     }
  211.     private void resumeSetClip(Graphics g)
  212.     {
  213.         g.setClip(clipX, clipY, clipWidth, clipHeight);
  214.     }
  215.      private void resize()
  216.     {
  217.         setHeight(fontHeight + 4);
  218.     }
  219.      public static void setKeyPadType(int keyType) {
  220.         keyPadType = keyType;
  221.     }
  222.     public void setCursorColor(int cursorColor) {
  223.         this.cursorColor = cursorColor;
  224.     }
  225.     public void paint(Graphics g) {
  226.         if(textVector.size() == 0 && textVector.elementAt(0).toString().length() == 0 && isMultiline)
  227.      {
  228.             reParseText();
  229.      }
  230.         if(insertCharTask != null)
  231.         {
  232.             g.setColor(0x00FF00);
  233.             int _y = (height - fontHeight) >> 1;
  234.             if(isMultiline)
  235.             {
  236.                 _y = currentSelectedRow * fontHeight;
  237.             }
  238.             g.fillRect(cursorXPosition, _y, font.getCharWidth(currentChar) + 1 , font.getCharHeight(currentChar) + 1);
  239.         }
  240.         if(isMultiline)
  241.         {
  242.             g.translate(0, -scrollHeight);
  243.             for (int i = 0; i < textVector.size(); i++) {
  244.                 String string = textVector.elementAt(i).toString();
  245.                 if(i == currentSelectedRow && insertCharTask != null && getCursorLocationInRow() <= string.length())
  246.                 {
  247.                     StringBuffer buffer = new StringBuffer(string );
  248.                     
  249.                     buffer.insert(getCursorLocationInRow(), currentChar);
  250.                     font.drawString(g, buffer.toString(), leftPadding,  i * fontHeight, GTantra.TEXT_LEFT);
  251.                 }else
  252.                     font.drawString(g, string, leftPadding,  i * fontHeight, GTantra.TEXT_LEFT);
  253.             }
  254.             drawCursor(g);
  255.             g.translate(0, scrollHeight); 
  256.         }else{
  257.              g.translate(-horScrolled,0);
  258.              StringBuffer buffer = new StringBuffer(actulText.toString());
  259.              if(insertCharTask != null)
  260.              {
  261.                  buffer.insert(cursorLocation, currentChar);
  262.              }
  263.              font.drawString(g, buffer.toString(), leftPadding, (height - fontHeight) >> 1, GTantra.TEXT_LEFT);
  264.              drawCursor(g);
  265.              g.translate(horScrolled,0);
  266.         }
  267. //        if(insertCharTask != null)
  268. //        {
  269. //            g.setColor(0x00FF00);
  270. //            int _y = (height - fontHeight) >> 1;
  271. //            if(isMultiline)
  272. //            {
  273. //                _y = currentSelectedRow * fontHeight;
  274. //            }
  275. //            g.fillRect(cursorXPosition, _y, font.getCharWidth(currentChar) +1, font.getCharHeight(currentChar)+1);
  276. //            font.drawString(g, currentChar+"", cursorXPosition, _y , GTantra.TEXT_LEFT);
  277. //        }
  278.       //  resumeSetClip(g);
  279.         drawScrollBar(g);
  280.     }
  281.   public String[] divideString(String text, GTantra font, int width)
  282.   {
  283.       if(width <= 0)
  284.       {
  285.               return new String[]{text};
  286.       }
  287.       String str[] = Util.divideString(text,font,width);
  288.       if(str.length <= 1)
  289.           return str;
  290.       String strRet[] = new String[str.length - 1];
  291.       System.arraycopy(str, 1, strRet, 0, strRet.length);
  292.       str = null;
  293.       return strRet;
  294.       
  295.   }
  296.    public boolean keyPressed(int keycode) {
  297.     
  298.        int gameKey = DisplayManager.getInst().getGameAction(keycode);
  299.      if(!m_editable)
  300.      return false;
  301.         showCursor = true;
  302.         if ((gameKey == Canvas.LEFT || gameKey == Canvas.RIGHT || gameKey == Canvas.UP || gameKey == Canvas.DOWN) && isMightGameKey(keycode)) {
  303.          int tmp = cursorLocation;
  304.             if(insertCharTask != null)
  305.             {
  306.                 task(1);
  307.             }
  308.             moveCursor(gameKey);
  309.             if(tmp == cursorLocation)
  310.             {
  311.              return false;
  312.             }
  313.             return true;
  314.         } else if (keycode == KeyEvent.BACK_KEY) {
  315.             if (cursorLocation > 0) {
  316.                 cursorLocation--;
  317.                 actulText.deleteCharAt(cursorLocation);
  318.                 reParseText();
  319.                 setCursorPosition();
  320.                 setScrollHeight();
  321.                  return true;
  322.             }
  323.         } else if(gameKey != Canvas.FIRE || !isMightGameKey(keycode) ){
  324.             if(max_limit > 0 && actulText.length() >= max_limit)
  325.             {
  326.                 return true;
  327.             }
  328.             if(editType == NUMERIC)
  329.             {
  330.                 if(keycode >= DisplayManager.KEY_NUM0 && keycode <= DisplayManager.KEY_NUM9)
  331.                 {
  332.                     char ch = (char) keycode;
  333.                     actulText.insert(cursorLocation, ch);
  334.                     cursorLocation++;
  335.                     reParseText();
  336.                     setCursorPosition();
  337.                     setScrollHeight();
  338.                 }
  339.             }
  340.             else if(keyPadType == QWERTY_KEY_PAD)
  341.             {
  342.                 char ch = (char) keycode;
  343.                 actulText.insert(cursorLocation, ch); 
  344.                 cursorLocation++;
  345.                 reParseText();
  346.                 setCursorPosition();
  347.                 setScrollHeight();
  348.             }else
  349.             {
  350.                 if(keycode != -1 && keycode != oldKeyCode && insertCharTask != null)
  351.                 {
  352.                     task(1);
  353.                     oldKeyCode = -1;
  354.                 }
  355.                 if(insertCharTask != null)
  356.                 {
  357.                     insertCharTask.cancel();
  358.                     insertCharTask = null;
  359.                 }else
  360.                     oldKeyCode = keycode;
  361.                 
  362.                 insertCharTask = BaseTimer.schedule(CHAR_INSERT_DELAY, this,1);
  363.                 if(keycode == Canvas.KEY_STAR)
  364.                 {
  365.                     currentChar = '*' ;
  366.                     task(1);
  367.                 }else if(keycode == Canvas.KEY_POUND)
  368.                 {
  369.                    currentChar = '#' ;
  370.                    task(1);
  371.                 }else
  372.                 {
  373.                      currentChar = charArry[keycode - DisplayManager.KEY_NUM0][count];
  374.                 }
  375.                
  376.                 count++;
  377.                 if(count >= charArry[keycode - DisplayManager.KEY_NUM0].length )
  378.                 {
  379.                     count = 0;
  380.                 }
  381.             }
  382.             
  383.             return true;
  384.         }
  385.         return false;
  386.     }
  387.     
  388.     private void reParseText() {
  389.         if(isMultiline){
  390.         int extraWidth = 0;
  391.         if(totalHeight > height)
  392.             extraWidth = SCROLL_BAR_WIDTH;
  393.         String arry[] = divideString(actulText.toString(), font, width - (leftPadding << 1) - ERROR_WARP - extraWidth);
  394.         textVector.removeAllElements();
  395.         
  396.         for (int i = 0; i < arry.length; i++) {
  397.             
  398.             textVector.addElement(arry[i]);
  399.         }
  400.         totalHeight = textVector.size() * fontHeight;
  401.         if(textVector.size() == 1)
  402.         {
  403.          totalHeight = height;
  404.         }
  405. //        String currentText = (textVector.elementAt(currentSelectedRow).toString());
  406. //         if(currentSelectedRow >= textVector.size())
  407. //         {
  408. //             currentSelectedRow--;
  409. //             setCursorPosition();
  410. //           
  411. //         }else if(getCursorLocationInRow() > currentText.length()){
  412. //            currentSelectedRow++;
  413. //         }
  414.         setAutoCurrentRow();
  415.         setCursorPosition();
  416.         }
  417.     }
  418.    private void setAutoCurrentRow()
  419.    {
  420.        if(isMultiline)
  421.        {
  422.            int count = 0;
  423.            for (int i = 0; i < textVector.size(); i++) {
  424.                String line = textVector.elementAt(i).toString();
  425.                count += line.length();
  426.                if(cursorLocation <= count)
  427.                {
  428.                    currentSelectedRow = i;
  429.                    setScrollHeight();
  430.                    break;
  431.                }
  432.            }
  433.        }
  434.        
  435.    }
  436.    private void setScrollHeight()
  437.    {
  438.        if(isMultiline){
  439.            int _y = currentSelectedRow * fontHeight;
  440.            if(totalHeight > height)
  441.            {
  442.                if(_y + fontHeight >= height + scrollHeight  )
  443.                {
  444.                     scrollHeight = _y + fontHeight - height;
  445.                }else if(_y < scrollHeight){
  446.                    scrollHeight = _y;
  447.                }
  448.            }else{
  449.                scrollHeight = 0;
  450.            }
  451.        }else{
  452.         
  453.            int allowedWidth = width - (leftPadding << 1 ) - leftPadding;
  454.            if(allowedWidth <= 0)
  455.            {
  456.             horScrolled = 0;
  457.             return;
  458.            }
  459.            int subStringWidth = font.getStringWidth(actulText.toString().substring(0, cursorLocation));
  460.            if(subStringWidth < horScrolled )
  461.            {
  462.                horScrolled = subStringWidth;
  463.            }else if(subStringWidth - horScrolled >= allowedWidth )
  464.            {
  465.                horScrolled = subStringWidth - allowedWidth;
  466.            }
  467.           
  468.            if(horScrolled < 0)
  469.                horScrolled = 0;
  470.        }
  471.        
  472.    }
  473.     private void moveCursor(int direction) {
  474.        
  475.         if (direction == Canvas.LEFT) {
  476.             if (cursorLocation > 0) {
  477.                 cursorLocation--;
  478.             }
  479.         } else if (direction == Canvas.RIGHT) {
  480.             if (cursorLocation < actulText.length()) {
  481.                 cursorLocation++;
  482.             }
  483.         } else if (direction == Canvas.DOWN && isMultiline) {
  484.             if (currentSelectedRow < textVector.size() - 1) {
  485.                String downString = textVector.elementAt(currentSelectedRow + 1).toString();
  486.                currentSelectedRow++;
  487.                
  488.                if(font.getStringWidth(downString) < cursorXPosition)
  489.                {
  490.                   setCursorLocationInRow(downString.length());
  491.                }else{
  492.                     setCursorLocationInRow(getCharLocationOnWidth(downString,cursorXPosition));
  493.                }
  494.                 if(cursorLocation > actulText.length())
  495.                 {
  496.                     cursorLocation = actulText.length();
  497.                 }
  498.                
  499.             }
  500.         } else if (direction == Canvas.UP && isMultiline) {
  501.             if (currentSelectedRow > 0) {
  502.                 String upString = textVector.elementAt(currentSelectedRow - 1).toString();
  503.                currentSelectedRow--;
  504.                if(font.getStringWidth(upString) < cursorXPosition)
  505.                {
  506.                   setCursorLocationInRow(upString.length());
  507.                }else{
  508.                     setCursorLocationInRow(getCharLocationOnWidth(upString,cursorXPosition));
  509.                }
  510.                 if(cursorLocation < 0)
  511.                 {
  512.                     cursorLocation = 0;
  513.                 }
  514.             }
  515.         }
  516.         setAutoCurrentRow();
  517.         setCursorPosition();
  518.         setScrollHeight();
  519.     }
  520.    
  521.     
  522.     private int getCharLocationOnWidth(String str,int width)
  523.     {
  524.         int tmp_width = 0;
  525.         int char_loc = 0;
  526.         if(width >= font.getStringWidth(str))
  527.             char_loc = str.length();
  528.         else{
  529.             while(true)
  530.             {
  531.                 tmp_width = font.getStringWidth(str.substring(0, char_loc));
  532.                 if(tmp_width > width || char_loc >=  str.length())
  533.                 {
  534.                     char_loc--;
  535.                     break;
  536.                 }
  537.                 char_loc++;
  538.             }
  539.         }
  540.         return char_loc ;
  541.     }
  542.  
  543.     private boolean isMightGameKey(int keycode) {
  544.         if (!(keycode >= 65 && keycode <= 65 + 26) && !(keycode >= 97 && keycode <= 97 + 26) && !(keycode >= Canvas.KEY_NUM0 && keycode <= Canvas.KEY_NUM9)) {
  545.             return true;
  546.         } else {
  547.             return false;
  548.         }
  549.     }
  550.    
  551.     private void setCursorPosition() {
  552.         if(isMultiline)
  553.         {
  554.             String currentRowText = textVector.elementAt(currentSelectedRow).toString();
  555.             if(getCursorLocationInRow() >= 0 && getCursorLocationInRow() <= currentRowText.length())
  556.             {
  557.                 cursorXPosition = leftPadding + font.getStringWidth(textVector.elementAt(currentSelectedRow).toString().substring(0, getCursorLocationInRow()));
  558.                 cursorYPosition = (fontHeight >> 1) + (currentSelectedRow * fontHeight);
  559.             }    
  560.             
  561.         }else{
  562.             cursorXPosition = leftPadding + font.getStringWidth(actulText.toString().substring(0, cursorLocation)); 
  563.             cursorYPosition = (height >> 1);
  564.             
  565.         }
  566.         
  567.     }
  568.     private void setCursorLocationInRow(int location)
  569.     {
  570.         int chars = 0;
  571.         for (int idx = 0; idx < currentSelectedRow; idx++) {
  572.             chars += textVector.elementAt(idx).toString().length();
  573.         }
  574.         cursorLocation = location  + chars;
  575.         
  576.     }
  577.     private int getCursorLocationInRow()
  578.     {
  579.         int chars = 0;
  580.         for (int idx = 0; idx < currentSelectedRow; idx++) {
  581.             chars += textVector.elementAt(idx).toString().length();
  582.         }
  583.         return (cursorLocation - chars);
  584.     }
  585.   
  586.     public void task(int data) {
  587.         if(data == 1)
  588.         {
  589.             actulText.insert(cursorLocation, currentChar);
  590.             cursorLocation++;
  591.             reParseText();
  592.             setCursorPosition();
  593.             setScrollHeight();
  594.             count = 0;
  595.             if(insertCharTask != null)
  596.             {
  597.                 insertCharTask.cancel();
  598.                 insertCharTask = null;
  599.             }
  600.             
  601.         }else
  602.         {
  603.             showCursor = !showCursor;
  604.             DisplayManager.getInst().invalidate();
  605.         }
  606.        
  607.     }
  608.     
  609. }