Question

I want to create a RichTextField at the bottom half of the screen, while I paint my own custom graphics at the top half of the screen. Is that possible in BlackBerry? It tried defining a LayoutManager and trying to position the RichTextField at the bottom of the screen but the RichTextField, scroll through the entire screen. This is the code for the LayoutManager(). Is it the right way or is there any other way to do what I have mentioned above.

class LayoutManager extends Manager 
{

  public LayoutManager() 
  { 
    //construct a manager with vertical scrolling    
    super(VERTICAL_SCROLL);
  }

  //overwrite the nextFocus method for custom navigation  
  protected int nextFocus(int direction, boolean alt)  
  {
        return super.nextFocus(direction, alt);
  }

  protected void sublayout(int width, int height) 
  {
    Field field;
    //get total number of fields within this manager
    int numberOfFields = getFieldCount();     
    int x = 0;
    int y = 0;
    System.out.println("******** Fields: " + numberOfFields + " W/H: " + width + " / " + height );
    for(int i = 0;i < numberOfFields;i++) {
      field = getField(i);      //get the field
      x = 20;
      y = 80;
      System.out.println("******** X/Y: " + x + " / " + y);
      setPositionChild(field, x, y);  //set the position for the field
      layoutChild(field, width, y);  //lay out the field
    }
    setPosition(0, 80);
    setExtent(width, 80);

  }

  public int getPreferredWidth() 
  {
   return 160;
  }

  public int getPreferredHeight() 
  {
    int height= 0;
    int numberOfFields= getFieldCount();

    for(int i= 0; i < numberOfFields; i++) 
    {
        height += getField(i).getPreferredHeight();
    }
    return 160;
  }
}
Was it helpful?

Solution

UPDATE - custom scrollbar

custom scrollbar http://img146.imageshack.us/img146/7775/scroll.png

VerticalFieldManager with custom size limitation and scrolling:

class SizedVFM extends VerticalFieldManager {
    int mWidth;
    int mHeight;

    public SizedVFM(int width, int height) {
        super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR);
        mWidth = width;
        mHeight = height;
    }

    public int getPreferredHeight() {
        return mHeight;
    }

    public int getPreferredWidth() {
        return mWidth;
    }

    protected void sublayout(int maxWidth, int maxHeight) {
        super.sublayout(maxWidth, maxHeight);
        setExtent(getPreferredWidth(), getPreferredHeight());
    }

    protected void paint(Graphics graphics) {
        super.paint(graphics);
        if (getVisibleHeight() < getVirtualHeight()) {
            int y1 = 0, y2 = 0, x1 = 0, x2 = 0;
            int scrollOff = getVerticalScroll();
            if (scrollOff > 0) {
                y1 = scrollOff + 12;
                y2 = scrollOff + 2;
                x1 = getVisibleWidth() - 20;
                x2 = getVisibleWidth() - 2;

                graphics.setColor(Color.DARKRED);
                int[] xPts = new int[] { x1, x2, x1 + 9 };
                int[] yPts = new int[] { y1, y1, y2 };
                graphics.drawFilledPath(xPts, yPts, null, null);
            }
            if (scrollOff < (getVirtualHeight() - getVisibleHeight())) {
                y1 = scrollOff + getVisibleHeight() - 12;
                y2 = scrollOff + getVisibleHeight() - 2;
                x1 = getVisibleWidth() - 20;
                x2 = getVisibleWidth() - 2;
                graphics.setColor(Color.DARKRED);
                int[] xPts = new int[] { x1, x2, x1 + 9 };
                int[] yPts = new int[] { y1, y1, y2 };
                graphics.drawFilledPath(xPts, yPts, null, null);
            }
        }
    }
}

Fields for painting and text:

class HeaderPainting extends SizedVFM {
    BitmapField mBitmapField;
    public HeaderPainting(Bitmap bitmap, int width, int height) {
        super(width, height);
        add(mBitmapField = new BitmapField(bitmap, FOCUSABLE));
    }
}
class FooterText extends SizedVFM {
    ExRichTextField mTextField;
    public FooterText(String text, int width, int height) {
        super(width, height);
        int bgColor = Color.SANDYBROWN;
        int textColor = Color.DARKRED;
        add(mTextField = new ExRichTextField(text, bgColor, textColor));
    }
    class ExRichTextField extends RichTextField {
        int mTextColor;
        int mBgColor;
        public ExRichTextField(String text, int bgColor, int textColor) {
            super(text);
            mTextColor = textColor;
            mBgColor = bgColor;
        }
        protected void paint(Graphics graphics) {
            graphics.clear();
            graphics.setColor(mBgColor);
            graphics.fillRect(0, 0, getWidth(), getHeight());
            graphics.setColor(mTextColor);
            super.paint(graphics);
        }
    }
}

Example of using:

class Scr extends MainScreen {
    HeaderPainting mBitmapField;
    FooterText mTextField;
    public Scr() {
        int width = Display.getWidth();
        int height = Display.getHeight() / 2;
        Bitmap bitmap = customPaint(width, height);
        String text = "Lorem ipsum dolor sit amet, consectetuer "
                + "adipiscing elit, sed diam nonummy nibh euismod "
                + "tincidunt ut laoreet dolore magna aliquam erat "
                + "volutpat. Ut wisi enim ad minim veniam, quis "
                + "nostrud exerci tation ullamcorper suscipit "
                + "lobortis nisl ut aliquip ex ea commodo consequat. "
                + "Duis autem vel eum iriure dolor in hendrerit in "
                + "vulputate velit esse molestie consequat, vel "
                + "illum dolore eu feugiat nulla facilisis at vero "
                + "eros et accumsan et iusto odio dignissim qui "
                + "blandit praesent luptatum zzril delenit augue "
                + "duis dolore te feugait nulla facilisi.";
        add(mBitmapField = new HeaderPainting(bitmap, width, height));
        add(mTextField = new FooterText(text, width, height));
    }
    protected Bitmap customPaint(int width, int height) {
        Bitmap bmp = new Bitmap(width, height);
        Graphics graphics = new Graphics(bmp);
        graphics.setColor(Color.BLUE);
        graphics.fillRect(10, 10, width - 20, height - 20);
        graphics.setColor(Color.RED);
        graphics.fillRect(10, 10, 50, height - 20);
        return bmp;
    }
}

If you don't like focus inside RichTextField see
Blackberry Java: TextField without the caret?

OTHER TIPS

you can unset focus from your RichTextField. And also keep in mind that you can control focus using null fields. I've recentlyy had battles for scrolling with my custom list field. You can check my post, it might be helpful.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top