import java.util.Vector;  
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.DrawStyle;  
import net.rim.device.api.ui.Field;  
import net.rim.device.api.ui.Font;  
import net.rim.device.api.ui.Graphics;  
import net.rim.device.api.ui.Manager;  
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.ListField;  
import net.rim.device.api.ui.component.ListFieldCallback;  
public class CustomTableField extends ListField implements ListFieldCallback {  
     TableHeaderRowManager row;  
     Vector rows; 
     private int dataType;
     private int bgColor;
     private boolean usingLineHorizontal;
     private boolean usingLineVertical;
     int nColumn;
     
     public CustomTableField(int dataType, int bgColor){
               this.dataType = dataType;
               this.bgColor = bgColor; 
         
          setEmptyString("This ListField has No Data",DrawStyle.HCENTER);  
          setCallback(this);  
          setRowHeight(30);  
          Font.getDefault();  
          
          rows = new Vector();  
          row = new TableHeaderRowManager();  
                    
          nColumn = 5;
          row.add(new ColorLabelField("00123", USE_ALL_WIDTH|DrawStyle.VCENTER|DrawStyle.HCENTER|DrawStyle.ELLIPSIS|NON_FOCUSABLE, Themes.COLOR_TEXT_HEADER_TABLE, Font.PLAIN, Themes.fontSize-1, false));
          row.add(new ColorLabelField("15 Januari 2012", USE_ALL_WIDTH|DrawStyle.VCENTER|DrawStyle.HCENTER|DrawStyle.ELLIPSIS|NON_FOCUSABLE, Themes.COLOR_TEXT_HEADER_TABLE, Font.PLAIN, Themes.fontSize-1, false));
          row.add(new ColorLabelField("Pembayaran Biaya Kuliah", USE_ALL_WIDTH|DrawStyle.VCENTER|DrawStyle.HCENTER|DrawStyle.ELLIPSIS|NON_FOCUSABLE, Themes.COLOR_TEXT_HEADER_TABLE, Font.PLAIN, Themes.fontSize-1, false));
          row.add(new ColorLabelField("2.000.0000", USE_ALL_WIDTH|DrawStyle.VCENTER|DrawStyle.HCENTER|DrawStyle.ELLIPSIS|NON_FOCUSABLE, Themes.COLOR_TEXT_HEADER_TABLE, Font.PLAIN, Themes.fontSize-1, false));
          row.add(new ColorLabelField("21312323211111232323", USE_ALL_WIDTH|DrawStyle.VCENTER|DrawStyle.HCENTER|DrawStyle.ELLIPSIS|NON_FOCUSABLE, Themes.COLOR_TEXT_HEADER_TABLE, Font.PLAIN, Themes.fontSize-1, false));
          rows.addElement(row);  
          setSize(rows.size());  
     }  
     public void drawListRow(ListField listField, Graphics graphics, int index,  
               int y, int width) {  
          // TODO Auto-generated method stub  
          CustomHeaderTableField list = (CustomHeaderTableField) listField;  
          graphics.setColor(bgColor);
           graphics.fillRect(0, y, width, list.getRowHeight()); 
           TableHeaderRowManager rowManager = (TableHeaderRowManager)list.rows.elementAt(index);  
          rowManager.drawRow(graphics,0,y,width,list.getRowHeight());  
     }  
     public Object get(ListField listField, int index) {  
          // TODO Auto-generated method stub  
          return rows.elementAt(index).toString();  
     }  
     public int getPreferredWidth(ListField listField) {  
          // TODO Auto-generated method stub  
          return Graphics.getScreenWidth();  
     }  
     public int indexOfList(ListField listField, String prefix, int start) {  
          // TODO Auto-generated method stub  
          return -1;  
     }  
     
    public void setUsingLineHorizontal(boolean usingLineHorizontal) {
        this.usingLineHorizontal = usingLineHorizontal;
    }
    public boolean isUsingLineHorizontal() {
        return usingLineHorizontal;
    }
    public void setUsingLineVertical(boolean usingLineVertical) {
        this.usingLineVertical = usingLineVertical;
    }
    public boolean isUsingLineVertical() {
        return usingLineVertical;
    }
    private class TableHeaderRowManager extends Manager  
     {  
         public TableHeaderRowManager()  
         {  
             super(0);  
         }  
         
        // Causes the fields within this row manager to be layed out then  
        // painted.  
        public void drawRow(Graphics g, int x, int y, int width, int height)  
        {  
          // Arrange the cell fields within this row manager.  
          layout(width, height);  
          // Place this row manager within its enclosing list.  
          setPosition(x, y);  
          // Apply a translating/clipping transformation to the graphics  
          // context so that this row paints in the right area.  
          g.pushRegion(getExtent());  
          // Paint this manager's controlled fields.  
          subpaint(g);  
          g.setColor(Themes.COLOR_SEPARATOR);  
          //g.drawLine(0, height-1, getPreferredWidth(), height-1);  
          //g.drawLine(40, 0, 40, getPreferredHeight());  
          // Restore the graphics context.  
          g.popContext();  
        }  
        
        // Arrages this manager's controlled fields from left to right within  
        // the enclosing table's columns.  
        protected void sublayout(int width, int height)  
        {  
          int fontHeight = Font.getDefault().getHeight();  
          int preferredWidth = getPreferredWidth();  
          int widthColumn = preferredWidth/nColumn;
          Field field = getField(0);  
              
          int padding = 3;
          
          layoutChild(field, widthColumn, 1);  
          setPositionChild(field, 2, 5);  
          
          field = getField(1);
          layoutChild(field, widthColumn, 1);  
          setPositionChild(field, widthColumn+padding, 5);  
          
          field = getField(2);
          layoutChild(field, widthColumn, 1);  
          setPositionChild(field, widthColumn*2+padding, 5);  
          
          field = getField(3);
          layoutChild(field, widthColumn-10, 1);  
          setPositionChild(field, widthColumn*3+padding, 5);  
          
          field = getField(4);
          layoutChild(field, widthColumn, 1);  
          setPositionChild(field, widthColumn*4-padding, 5);  
          
          setExtent(preferredWidth, getPreferredHeight());  
        }  
        
        // The preferred width of a row is defined by the list renderer.  
        public int getPreferredWidth()  
        {  
          return Graphics.getScreenWidth();  
        }  
        
        // The preferred height of a row is the "row height" as defined in the  
        // enclosing list.  
        public int getPreferredHeight()  
        {  
          return getRowHeight();  
        }  
     }  
}