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

J2ME

开发平台:

Java

  1. package com.framework;
  2. import com.framework.GTantra;
  3. import java.util.Enumeration;
  4. import java.util.NoSuchElementException;
  5.  
  6. import javax.microedition.lcdui.*;
  7.  
  8. //www.astrientlabs.com
  9. public class LineEnumeration implements Enumeration {
  10.    
  11.     
  12.     GTantra m_font;
  13.     String m_txt;
  14.     int m_length,m_width,m_position,m_start;
  15.     String s;
  16.  
  17.     public LineEnumeration(GTantra font, String text, int width) {
  18.         m_font = font;
  19.         m_txt = text;
  20.         m_length = text.length();
  21.         m_width = width;
  22.         //reseting
  23.         m_position =0;
  24.         m_start = 0;
  25.     }
  26.  
  27.  
  28.     public boolean hasMoreElements() {
  29.        return (m_position<(m_length-1));
  30.     }
  31.  
  32.     public Object nextElement()  {
  33.          int maxLength = m_txt.length();
  34.          int next = next();
  35.          if(m_start>=maxLength || next>maxLength)
  36.               return null;
  37.          String s =m_txt.substring(m_start, next);
  38.          m_start = next;
  39.          if((m_txt.length()-1>m_start )&& ((m_txt.charAt(m_start)=='n') ||
  40.             (m_txt.charAt(m_start)==' '))){
  41.               m_position++;
  42.               m_start++;
  43.          }
  44.          return s;
  45.     }
  46.  
  47.  
  48.    private int next(){
  49.      int i=getNextWord(m_position);
  50.      int lastBreak = -1;
  51.      String line;
  52.      line= m_txt.substring(m_position, i);
  53.      int lineWidth = m_font.getStringWidth(line);
  54.      while (i<m_length && lineWidth<= m_width){
  55.          if(m_txt.charAt(i)==' ' )
  56.             lastBreak = i; 
  57.          else if(m_txt.charAt(i)== 'n'){
  58.             lastBreak =i;
  59.             break;
  60.          }
  61.          if(++i<m_length){
  62.            int val= getNextWord(i);
  63.            if( m_font.getStringWidth(m_txt.substring(m_position, val)) < m_width) 
  64.            {
  65.                i = val;
  66.            }
  67.            line = m_txt.substring(m_position, i);
  68.            lineWidth = m_font.getStringWidth(line);
  69.            if(val != i)
  70.            {
  71.                lastBreak =i;
  72.                break;
  73.            }
  74.          }
  75.      }
  76.      if(i==m_length && lineWidth<= m_width)
  77.         m_position = i;
  78.      else if(lastBreak == m_position)
  79.         m_position++;
  80.      else if(lastBreak < m_position)
  81.         m_position =i;
  82.      else
  83.         m_position = lastBreak;
  84.      return m_position;   
  85.   }
  86.     private int getNextWord(int startIndex){
  87.         int space = m_txt.indexOf(' ', startIndex);
  88.         int newLine = m_txt.indexOf('n', startIndex);
  89.         if(space ==-1)
  90.            space = m_length;
  91.         if(newLine ==-1)
  92.            newLine = m_length;
  93.         if(space<newLine)
  94.           return checkForBigLine(startIndex,space);
  95.         else 
  96.           return checkForBigLine(startIndex,newLine);
  97.     }
  98.     private int checkForBigLine(int startIndex,int endIndex)
  99.     {
  100.         int tmpWidth = m_font.getStringWidth(m_txt.substring(startIndex,endIndex));
  101.         while(tmpWidth >= m_width && startIndex < endIndex){
  102.                 tmpWidth = m_font.getStringWidth(m_txt.substring(startIndex,--endIndex));
  103.        }
  104.        return endIndex;
  105.     }
  106. }