Word wrapping does not work in BB with custom GridField Manager

I use Custom GridField Manager to display information in 2 columns with a specified width. When the value of the right side is too large, the value is not carried over to the next line.

Here is my Custom GridField Manager class.

public class CustomGridFieldManager extends Manager {
private int[] columnWidths;
private int columns;
private int allRowHeight = -1;


public CustomGridFieldManager(int columns, long style) {
    super(style);
    this.columns = columns;
}


public CustomGridFieldManager(int[] columnWidths, long style) {
    super(style);
    this.columnWidths = columnWidths;
    this.columns = columnWidths.length;

}

public CustomGridFieldManager(int[] columnWidths, int rowHeight, long style) {
    this(columnWidths, style);
    this.allRowHeight  = rowHeight;
}

protected boolean navigationMovement(int dx, int dy, int status, int time) {

    int focusIndex = getFieldWithFocusIndex();
    while(dy > 0) {
        focusIndex += columns;
        if (focusIndex >= getFieldCount()) {
            return false; // Focus moves out of this manager
        }
        else {
            Field f = getField(focusIndex);
            if (f.isFocusable()) { // Only move the focus onto focusable fields
                f.setFocus();
                dy--;
            }
        }
    }
    while(dy < 0) {
        focusIndex -= columns;
        if (focusIndex < 0) {
            return false;
        }
        else {
            Field f = getField(focusIndex);
            if (f.isFocusable()) {
                f.setFocus();
                dy++;
            }
        }
    }

    while(dx > 0) {
        focusIndex ++;
        if (focusIndex >= getFieldCount()) {
            return false;
        }
        else {
            Field f = getField(focusIndex);
            if (f.isFocusable()) {
                f.setFocus();
                dx--;
            }
        }
    }
    while(dx < 0) {
        focusIndex --;
        if (focusIndex < 0) {
            return false;
        }
        else {
            Field f = getField(focusIndex);
            if (f.isFocusable()) {
                f.setFocus();
                dx++;
            }
        }
    }
    return true;
}

protected void sublayout(int width, int height) {
    int y = 0;
    if (columnWidths == null) {
        columnWidths = new int[columns];
        for(int i = 0; i < columns; i++) {
            columnWidths[i] = width/columns;
        }
    }
    Field[] fields = new Field[columnWidths.length];
    int currentColumn = 0;
    int rowHeight = 0;
    for(int i = 0; i < getFieldCount(); i++) {
        fields[currentColumn] = getField(i);
        layoutChild(fields[currentColumn], columnWidths[currentColumn], height-y);
        if (fields[currentColumn].getHeight() > rowHeight) {
            rowHeight = fields[currentColumn].getHeight();
        }
        currentColumn++;
        if (currentColumn == columnWidths.length || i == getFieldCount()-1) {
            int x = 0;
            if (this.allRowHeight >= 0) {
                rowHeight = this.allRowHeight;
            }
            for(int c = 0; c < currentColumn; c++) {
                long fieldStyle = fields[c].getStyle();
                int fieldXOffset = 0;
                long fieldHalign = fieldStyle & Field.FIELD_HALIGN_MASK;
                if (fieldHalign == Field.FIELD_RIGHT) {
                    fieldXOffset = columnWidths[c] - fields[c].getWidth();
                }
                else if (fieldHalign == Field.FIELD_HCENTER) {
                    fieldXOffset = (columnWidths[c]-fields[c].getWidth())/2;
                }

                int fieldYOffset = 0;
                long fieldValign = fieldStyle & Field.FIELD_VALIGN_MASK;
                if (fieldValign == Field.FIELD_BOTTOM) {
                    fieldYOffset = rowHeight - fields[c].getHeight();
                }
                else if (fieldValign == Field.FIELD_VCENTER) {
                    fieldYOffset = (rowHeight-fields[c].getHeight())/2;
                }

                setPositionChild(fields[c], x+fieldXOffset, y + fieldYOffset);
                x += columnWidths[c];
            }
            currentColumn = 0;
            y += rowHeight;
        }
        if (y >= height) {
            break;
        }
    }
    int totalWidth = 0;
    for(int i = 0; i < columnWidths.length; i++) {
        totalWidth += columnWidths[i];
    }
    setExtent(totalWidth, Math.min(y, height));
}

}

In another class, I use this custom GridField manager class.

int[] width = { (int) (Display.getWidth() / 2.9),
                    (int) (Display.getWidth() / 1.1) };

          final CustomGridFieldManager gfm_transactioninfo = new CustomGridFieldManager(
                    width, 35, Manager.VERTICAL_SCROLL | Manager.FIELD_HCENTER
                            | FOCUSABLE) {
                protected void paint(Graphics graphics) {
                    // TODO Auto-generated method stub
                    graphics.setColor(AppData.color_black);
                    super.paint(graphics);
                }

            };
            gfm_transactioninfo.setMargin(10, 0, 0, 10);// set top and left margin

I add Labelfiled like this,

lbl_CustEmail = new LabelField("Customer Email", LabelField.FOCUSABLE);
            lbl_CustEmail.setFont(label_font);

            value_CustEmail = new LabelField(": " +trandtail[0].getFromEmail());
            value_CustEmail.setFont(label_font);

gfm_transactioninfo.add(lbl_CustEmail);
                        gfm_transactioninfo.add(value_CustEmail);

If anyone has an idea, then pls help.

+4
source share
1 answer

You divide the width into two parts. But my suggestion is that you should divide the width into three parts. as

int[] width = { (int) (Display.getWidth() / 3.2),
                    (int) (Display.getWidth() / 32),(int) (Display.getWidth() / 1.6) };

And highlight ":" with a new label field.

.. , .

int[] width = { (int) (Display.getWidth() / 3.2),
                    (int) (Display.getWidth() / 32),(int) (Display.getWidth() / 1.6) };

            final CustomGridFieldManager gfm_transactioninfo = new CustomGridFieldManager(
                    width,45, Manager.VERTICAL_SCROLL | Manager.FIELD_HCENTER
                            | FOCUSABLE) {
                protected void paint(Graphics graphics) {
                    // TODO Auto-generated method stub
                    graphics.setColor(AppData.color_black);
                    super.paint(graphics);
                }

            };
            gfm_transactioninfo.setMargin(10, 10, 0, 10);// set top and left margin

lbl_CustEmail = new LabelField("Customer Email", LabelField.FOCUSABLE);
                lbl_CustEmail.setFont(label_font);

            value_CustEmail = new LabelField(proTransaction_details.getFromEmail() );
            value_CustEmail.setFont(label_font);

gfm_transactioninfo.add(lbl_CustEmail);
                        gfm_transactioninfo.add(new LabelField(" : "));
                        gfm_transactioninfo.add(value_CustEmail);

CustomGridFieldManager .

..:)

+3

Source: https://habr.com/ru/post/1533923/


All Articles