views:

164

answers:

1

Here is the sample code:

class MailBoxSampleListField extends MainScreen implements FolderListener, StoreListener {
private static final int COLUMN_WIDTH_STATUS = 10;
private static final int COLUMN_WIDTH_DATE = 150;
private static final int COLUMN_WIDTH_NAME = 150;

public ListField myList; 
private ListCallback myCallback;
public Vector sampleList = new Vector();
public Vector sampleVector;

    private class ListCallback implements ListFieldCallback {
    public Vector myVector = new Vector();
    public Bitmap LIST_IMAGE = Bitmap.getBitmapResource("New.PNG");
    public void drawListRow (ListField list, Graphics g, int index, int y,int w) {
        displayList(g,0,y,w,(( Message )myVector.elementAt( index )), LIST_IMAGE); // for drawing the list row
        for( int ii = 0; ii < sampleVector.size(); ii++) {
            String text = ( String )sampleVector.elementAt(ii);
            int liney = y + ( ii * list.getFont().getHeight() );
            g.drawText( text, LIST_IMAGE.getWidth() + 5, liney, Graphics.ELLIPSIS, w );
        }
    }

    public Object get( ListField list, int index ) {
        return myVector.elementAt(index); 
    }

    public int indexOfList( ListField list,String p, int s ) {
        return myVector.indexOf(p,s);
    }

    public int getPreferredWidth ( ListField list ) {
        return Graphics.getScreenWidth();
    }

    public void insert(Message _message, int index) {
        myVector.addElement(_message);
    }

    public void erase () {
        myVector.removeAllElements();
    }
}

MailBoxSampleListField() {

    ListCallback myCallback = new ListCallback(); 

    try {
        Store store = null;
        store = Session.getDefaultInstance().getStore();
        store.addStoreListener( this );

        // retrieve Folder object fow which we want to receive message notification
        try {
            Folder[] folders = store.list();
            Folder[] f1 = store.findFolder( "inbox" );
            Folder vinbox = f1[0];
            for (int i =0; i < f1.length; i++) {
                f1[i].addFolderListener( this );
            }

            Message[] vmessages = vinbox.getMessages();
            for ( int j = 0; j < vmessages.length; ++j ) {
                if(vmessages[j] != null){
                    sampleList.addElement( vmessages[j] );
                }
            }
            myList = new ListField(); // initialize the ListField
            for ( int k = 0; k < sampleList.size(); k++ ) {
                myList.insert(k);
                myCallback.insert(vmessages[k], k);   
            }

            myList.setCallback( myCallback );
            add( myList );     
        }
        catch( Exception e ){
        }
    }
    catch ( Exception se ) {
    }
}

public void displayList( Graphics g, int x, int y, int width, Message _message, Bitmap LIST_IMAGE ) {
    g.drawBitmap(0, y, LIST_IMAGE.getWidth(), LIST_IMAGE.getHeight(), LIST_IMAGE, 0, 0);
    sampleVector = new Vector();
    Date d = _message.getReceivedDate();
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    StringBuffer sb = new StringBuffer();
    sb.append( c.get( Calendar.MONTH ) );
    sb.append('-');
    int digit = c.get( Calendar.DAY_OF_MONTH );
    if ( digit < 10 ) sb.append(0);
    sb.append( digit );
    sb.append(' ');
    sb.append( c.get( Calendar.HOUR_OF_DAY ) );
    sb.append(':');
    digit = c.get( Calendar.MINUTE );
    if ( digit < 10 ) sb.append( 0 );
    sb.append( digit );
    sb.append( ' ');

    x += LIST_IMAGE.getWidth()+5; 
    x += COLUMN_WIDTH_DATE;

    try {
        String name = "<noname>";
        if ( _message.isInbound() ) {
            Address a = _message.getFrom();
            if ( a != null )
            {
                name = a.getName();
                if ( name == null || name.length() == 0 ) name = a.getAddr();
            }
        }
        else
        {
            //get the first Recipient address
            Address[] set = _message.getRecipients(Message.RecipientType.TO);
            if ( set != null && set.length > 0 ) 
            {
                name = set[0].getName();
                if ( name == null || name.length() == 0 ) name = set[0].getAddr();
            }
        }           
       sampleVector.addElement(name +"   " + sb.toString());
        } catch (MessagingException e) {
        System.err.println(e);
    } 

    x += COLUMN_WIDTH_NAME;
    int remainingColumnWidth = Graphics.getScreenWidth() - x;

    //get the subject, or if that doesn't exist, the first line of the body
    String textToDisplay = _message.getSubject();
    if ( null == textToDisplay) //no subject! get the first line of the body if present
    {
        Object o = _message.getContent();
        if ( o instanceof String )
        {
            textToDisplay = (String)o;
        }
        else if ( o instanceof Multipart )
        { 
            Multipart mp = (Multipart)o;
            int count = mp.getCount();
            for (int i = 0; i < count; ++i)
            {
                BodyPart p = mp.getBodyPart(i);
                if ( p instanceof TextBodyPart )
                {
                    textToDisplay = (String)p.getContent();
                }
            }
        }
    }
            sampleVector.addElement(textToDisplay);
    } public void messagesAdded(FolderEvent e) {} public void messagesRemoved(FolderEvent e) { } public void batchOperation( StoreEvent se) { }

}

A: 

I'm not sure what you mean, could you please post a screenshot so that we can see the problem?

I'll try to help out the best I can. In my limited experience, I have noticed that in a listfield, if you have not set the row height (with setRowHeight()) to a big enough height, graphics (including text) that overflow over the size of the row will not be displayed. Have you tried setting the row height to 2 * list.getFont().getHeight() or more?

Laurent le Beau-Martin