BlackBerry Forums Support Community

BlackBerry Forums Support Community (http://www.blackberryforums.com/)
-   Developer Forum (http://www.blackberryforums.com/developer-forum/)
-   -   scroll a big field? (http://www.blackberryforums.com/developer-forum/178515-scroll-big-field.html)

icess 02-26-2009 09:42 PM

scroll a big field?
 
I use a custome field. the field height is larger than the screen height.

I override the navigationMovement and getFocusRect method to implement the focus movement inside the field. now i have a problem, when the focus rect is outside the view, the screen do not scroll, so how to implement this behave. just like the RichTextField , when the focus rect is outside the view, the screen will scroll to display the next focus rect.

any help? thanks!

Code:


 public void getFocusRect(XYRect rect) {
                rect.set(0, verticalPadding+headerHeight+rowHeight*selectedRowIndex, getWidth(), rowHeight);
        }

protected boolean navigationMovement(int dx, int dy, int status, int time) {
               
                if ((status&KeypadListener.STATUS_FOUR_WAY) == KeypadListener.STATUS_FOUR_WAY) {
                        if (dx > 0) {
                               
                                xoffset -= 10;
                                invalidate();
                                return true;
                        } else if (dx < 0) {
                               
                                xoffset += 10;
                                invalidate();
                                if(xoffset > 0) {
                                        xoffset = 0;
                                        return true;
                                }
                        } else if (dy > 0) {
                               
                                if(selectedRowIndex < this.rowNum) {
                                        selectedRowIndex ++;
                                        if(selectedRowIndex == rowNum) {
                                                selectedRowIndex = rowNum-1;
                                                return false;
                                        }
                                        invalidate();
                                        return true;
                                }
                        } else if (dy < 0) {
                               
                                if(selectedRowIndex > 0) {
                                        selectedRowIndex --;
                                        if(selectedRowIndex < 0) {
                                                selectedRowIndex = 0;
                                                return false;
                                        }
                                        invalidate();
                                        return true;
                                }
                        }
                } 
                return super.navigationMovement(dx, dy, status, time);
        }


icess 02-27-2009 12:20 AM

the full code :
Code:

package hs.bb;

import net.rim.device.api.system.KeypadListener;
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.XYRect;
import net.rim.device.api.ui.container.MainScreen;
public class TestScreen extends MainScreen {
        public TestScreen() {
                this.setTitle("Test Table Field");
                String[] header = {"header one","header two","header three"};
                String[][] value = {{"value 1 1","value 1 2","value 1 3"},{"value 1 1","value 1 2","value 1 3"},{"value 1 1","value 1 2","value 1 3"},{"value 1 1","value 1 2","value 1 3"},{"value 1 1","value 1 2","value 1 3"},{"value 1 1","value 1 2","value 1 3"},{"value 1 1","value 1 2","value 1 3"},{"value 1 1","value 1 2","value 1 3"},{"value 2 1","value 2 2","value 2 3"},{"value 3 1","value 3 2","value 3 3"}};
                TableField st = new TableField(header,value,Field.FOCUSABLE);
                add(st);
        }

        public class TableField extends Field {
                private int fontColor = 0x0;
                private int focusLineColor = 0xFFFFFF;
                private int[] columnWidths;
                private Font valueFont;
                private Font headerFont;
                private int headerColor = 0xFFF000;
                private int headerBgColor = 0x444444;
                private int headerHeight;
               
                private int selectedRowIndex = -1;
                private int selectedColumnIndex = -1;
               
                private String[] headers;
                private String[][] values;
               
                private int rowPadding = 3;
                private int columnPadding = 3;
                private int horizontalPadding = 5; 
                private int verticalPadding = 5; 
               
                private int rowHeight;
                private int colNum;
                private int rowNum;
               
                public TableField(String[] headers,String[][] values,long style ) {
                        super(style);
                        if(headers != null && headers.length > 0) {
                                this.headers = headers;
                                headerFont = Font.getDefault();
                                headerHeight = headerFont.getHeight()+rowPadding;
                        }
                        this.values = values;
                        this.valueFont = Font.getDefault();
                        rowHeight = this.valueFont.getHeight()+rowPadding;
                        this.rowNum = values.length;
                        this.colNum = values[0].length;
                        int tw = 0;
                        columnWidths = new int[colNum];
                        for (int i = 0; i < colNum; i++) {
                                for (int j = 0; j < rowNum; j++) {
                                        tw = valueFont.getAdvance(values[j][i]);
                                        if(tw > columnWidths[i]) {
                                                columnWidths[i] = tw;
                                        }
                                }
                        }
                }

                protected void layout(int width, int height) {
                        int pw = getPreferredWidth();
                        if(pw < width) {
                                pw = (width - pw)/this.colNum;
                                for (int i = 0; i < colNum; i++) {
                                        columnWidths[i] += pw;
                                }
                        }
                        setExtent(width, getPreferredHeight());
                }

                private int xoffset = 0;
                protected void paint(Graphics g) {
                       
                        int x = horizontalPadding;
                        int y = verticalPadding;
                        if(headers != null && headers.length > 0) {
                                if(headerBgColor != -1) {
                                        g.setColor(headerBgColor);
                                        g.fillRect(0, 0, getWidth(), verticalPadding+headerHeight);
                                }
                                if(headerColor != -1) {
                                        g.setColor(headerColor);
                                }
                                for (int i = 0; i < colNum; i++) {
                                        g.drawText(headers[i], x+xoffset, y);
                                        x += columnWidths[i] + columnPadding;
                                }
                                y+= headerHeight;
                        }
                       
                        x = horizontalPadding;
                        if(values != null && values.length > 0) {
                                if(fontColor != -1) {
                                        g.setColor(fontColor);
                                }
                                for (int i = 0; i < colNum; i++) {
                                        int vy = y;
                                        for (int j = 0; j < rowNum; j++) {
                                                g.drawText(values[j][i], x+xoffset, vy);
                                                vy += rowHeight;
                                        }
                                        x+=columnWidths[i]+columnPadding;
                                }
                        }
                        //paint focus row line
                        if(focusLineColor != -1 && isFocus()) {
                                g.setColor(focusLineColor);
                                int fly = y + rowHeight * (selectedRowIndex+1)-rowPadding/2;
                                g.drawLine(0, fly, getWidth(), fly);
                        }
                        g.setColor(fontColor);
                        g.drawRect(0, 0, getWidth(), getHeight());
                }

                public void getFocusRect(XYRect rect) {
                        rect.set(0, verticalPadding+headerHeight+rowHeight*selectedRowIndex, getWidth(), rowHeight);
                }

                protected int moveFocus(int amount, int status, int time) {
                        //TODO  how to implement this method?
                        return super.moveFocus(amount, status, time);
                }
               

                protected boolean navigationMovement(int dx, int dy, int status, int time) {
                        if ((status&KeypadListener.STATUS_FOUR_WAY) == KeypadListener.STATUS_FOUR_WAY) {
                                if (dx > 0) {
                                        xoffset -= 10;
                                        invalidate();
                                        return true;
                                } else if (dx < 0) {
                                        xoffset += 10;
                                        invalidate();
                                        if(xoffset > 0) {
                                                xoffset = 0;
                                                return true;
                                        }
                                } else if (dy > 0) {
                                        if(selectedRowIndex < this.rowNum) {
                                                selectedRowIndex ++;
                                                if(selectedRowIndex == rowNum) {
                                                        selectedRowIndex = rowNum-1;
                                                        return false;
                                                }
                                                invalidate();
                                                return true;
                                        }
                                } else if (dy < 0) {
                                        if(selectedRowIndex > 0) {
                                                selectedRowIndex --;
                                                if(selectedRowIndex < 0) {
                                                        selectedRowIndex = 0;
                                                        return false;
                                                }
                                                invalidate();
                                                return true;
                                        }
                                }
                        } 
                        return super.navigationMovement(dx, dy, status, time);
                }

                protected void onFocus(int direction) {
                        if(selectedRowIndex == -1) {
                                selectedRowIndex = 0;
                        }
                        super.onFocus(direction);
                }

                protected void onUnfocus() {
                        super.onUnfocus();
                        invalidate();
                }

                public int getPreferredHeight() {
                        return  headerHeight+(rowHeight*rowNum)+(verticalPadding<<1);
                }

                public int getPreferredWidth() {
                        int w = 0;
                        for (int i = 0; i < colNum; i++) {
                                w += columnWidths[i]+columnPadding;
                        }
                        if(w > 0) w -= columnPadding;
                        w += (horizontalPadding<<1);
                        return w;
                }
        }

}

when the selected row is outside the screen , how to scroll the screen to dispaly the row?

icess 02-27-2009 02:46 AM

I change the navigationMovement mothed , set the manager scroll value to scroll the screen . now can display the selected row. But I donot think this's a good solution. Does anyone have a better solution for this?

the code:
Code:

protected boolean navigationMovement(int dx, int dy, int status, int time) {
                        Manager manager = getManager();
                        XYRect xyrect = this.getExtent();
                       
                        if ((status&KeypadListener.STATUS_FOUR_WAY) == KeypadListener.STATUS_FOUR_WAY) {
                                if (dx > 0) {
                                        xoffset -= 10;
                                        invalidate();
                                        return true;
                                } else if (dx < 0) {
                                        xoffset += 10;
                                        invalidate();
                                        if(xoffset > 0) {
                                                xoffset = 0;
                                                return true;
                                        }
                                } else if (dy > 0) {
                                        if(selectedRowIndex < this.rowNum) {
                                                selectedRowIndex ++;
                                                if(selectedRowIndex == rowNum) {
                                                        selectedRowIndex = rowNum-1;
                                                        return false;
                                                }
                                                int rowYPosition = xyrect.y + verticalPadding+headerHeight+rowHeight*selectedRowIndex+rowHeight;
                                                int visiableLastY = manager.getVerticalScroll()+manager.getVisibleHeight();
                                                if(rowYPosition > visiableLastY) {//
                                                        manager.setVerticalScroll(getManager().getVerticalScroll()+rowHeight);
                                                }
                                                invalidate();
                                                return true;
                                        }
                                } else if (dy < 0) {
                                        if(selectedRowIndex > 0) {
                                                selectedRowIndex --;
                                                if(selectedRowIndex < 0) {
                                                        selectedRowIndex = 0;
                                                        return false;
                                                }
                                                int rowYPosition = xyrect.y + verticalPadding+headerHeight+rowHeight*selectedRowIndex;
                                                int visiableLastY = manager.getVerticalScroll();
                                                if(rowYPosition < visiableLastY) {
                                                        manager.setVerticalScroll(getManager().getVerticalScroll()-rowHeight);
                                                }
                                                invalidate();
                                                return true;
                                        }
                                }
                        } 
                        return super.navigationMovement(dx, dy, status, time);
                }



All times are GMT -5. The time now is 05:05 AM.

Powered by vBulletin® Version 3.6.12
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.