Saturday, April 14, 2012

Customizing the Rows of a BlackBerry TreeField

Here is an example of how we can customize a TreeField of BlackBerry:
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.TreeField;
import net.rim.device.api.ui.component.TreeFieldCallback;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;

public class TreeDemo extends MainScreen {
 int parent[] = {1,2,3,4,5,6,7,8,9};
 int child[][] = new int [10][10];
 int child_child[][][] = new int [10][10][10];
 
 int rowHeight = 27;
 
 CustomTreeFieldCallback treeCallback = new CustomTreeFieldCallback();
 VerticalFieldManager vm = new VerticalFieldManager(
         Field.FOCUSABLE 
        |  VERTICAL_SCROLL 
        |  VERTICAL_SCROLLBAR
       );
 TreeField myTree = new TreeField(treeCallback, Field.FOCUSABLE);

 public TreeDemo() {
  vm.add(new LabelField("Table:"));
  myTree.setRowHeight(rowHeight);
  myTree.setIndentWidth(15);
  myTree.setDefaultExpanded(false);
  for(int i = parent.length-1; i >= 0 ; i--) {
   parent[i] = myTree.addChildNode(0, "Parent_" + (i+1));
   child[i] = new int[4];
   for(int j = child[i].length-1; j >=0 ; j--) {
    child[i][j] = 
      myTree.addChildNode(
       parent[i], 
       "Child_"+ (i+1) + "_" + (j+1)
      );
    child_child[i][j] = new int[3];
    for(int k = child_child[i][j].length-1; k >= 0 ; k--) {
     child_child[i][j][k] 
                    = myTree.addChildNode(
                      child[i][j], 
                      "Child_of_Child_"+ 
                        (i+1) + "_" + 
                         (j+1)+ "_" + (k+1)
                      );
    }
   }
  }
  vm.add(myTree);
  add(vm);
 }
 
 private class CustomTreeFieldCallback implements TreeFieldCallback {

  public void drawTreeItem(TreeField treeField, Graphics graphics, int node,
    int y, int width, int indent) {
   // TODO Auto-generated method stub
   String string = (String) treeField.getCookie(node);
   int preservedColor = graphics.getColor();
   
   if(treeField.getCurrentNode() == node) {
    graphics.setColor(0x0CCCC0);
   } else {
    graphics.setColor(0x404040);
   }
   graphics.fillRect(0, y, Display.getWidth(), treeField.getRowHeight());
   
   Bitmap iconImage;
   int iconImageWidth = 0;
   indent -= 20; // decrease the extra indentation for all nodes.
   if(treeField.getFirstChild(node) != -1){ // if the node is not a leaf node
    if(treeField.getExpanded(node)) {
     iconImage = Bitmap.getBitmapResource("icon_arrow_down.png");
     iconImageWidth = iconImage.getWidth();
    } else {
     iconImage = Bitmap.getBitmapResource("icon_arrow_right.png");
     iconImageWidth = iconImage.getWidth();
    }
    graphics.drawBitmap(
       indent, 
       y, 
       indent+iconImageWidth, 
       treeField.getRowHeight(), 
       iconImage, 
       0, 
       0
      );
   }

   if( treeField.getCurrentNode() == node ) {
    graphics.setColor(0x404040);   
   } else {
    graphics.setColor(0x0CCCC0);
   }
   graphics.drawText(string, indent+iconImageWidth, y);
   
   graphics.setColor(preservedColor);
  }

 }
}
In order to associate some actions for clicking on the leaf nodes, the navigationClick or touchEvent methods of TreeField class should be customized.

No comments:

Post a Comment