Links

   Quran Explorer - Interactive Audio Recitations & Translations

Wednesday, September 10, 2014

Programaticaly creating/initializing Primefaces Gridform

Another one for you Mike,

This should guide you on how to dynamicaly create p:gridform

public static HtmlPanelGrid buildGridForm(XMLElement pg, LazyModel _model, DataSource d, HashMap _props, int _userId, int _orgId){

        setDs(d);

        FacesContext fc = FacesContext.getCurrentInstance();
        Application application = fc.getApplication();
        ExpressionFactory ef = application.getExpressionFactory();
        ELContext elc = fc.getELContext();

        HtmlPanelGrid pGrid = new HtmlPanelGrid();

        boolean embedded = false;

         String user = pg.getAttribute("user");
         if(user != null){
          log.info("Building GRIDFORM.. user=" + user + ",_userId = " + _userId);
           _props.put(user,"" + _userId + "");
           }

        if(_model != null)
            embedded = true;

        if(embedded)    //if xpandable
            pGrid.setId("xgf" + pg.getAttribute("key","x") + pg.getAttribute("keyfield","kf").replace("_",""));
        else
            pGrid.setId("gf" + pg.getAttribute("key","x") + pg.getAttribute("keyfield","kf").replace("_",""));

        pGrid.setColumns(Integer.parseInt(pg.getAttribute("columns","4")));
        pGrid.setTitle(pg.getAttribute("title","NO TITLE"));
        pGrid.setStyle(pg.getAttribute("style","font-size:11px; text-align:left; padding-right:0px"));
        pGrid.setStyleClass(pg.getAttribute("styleclass",""));
        pGrid.setCellpadding(pg.getAttribute("cellpadding","0 px"));
        pGrid.setCellspacing(pg.getAttribute("cellspacing","5 px"));
        pGrid.setRendered(Boolean.parseBoolean(pg.getAttribute("visible","true")));

        LazyModel parentModel = null;
        boolean isChild = false;    //linked to another datatable
        //boolean isInput = false;    //gets input from another datatable
        //boolean isNested = false;  //has nested children table within a table
        //boolean isNew = Boolean.parseBoolean(pg.getAttribute("new","false"));
        String link = pg.getAttribute("link","");
        String input = pg.getAttribute("input","");

        if(!link.equals("")){    //if a child
              //log.info("PARENT for FORM link = " + link);
              DataTable parent = (DataTable)FacesAccessor.getUIComponent("mainForm:dt" + link.split(":")[0] + (link.split(":")[1]).replace("_",""));
              //log.info("FOUND parent id = " + parent.getId());    //
              isChild = true;
              parentModel = (LazyModel)parent.getValue();
              }
        else if(!input.equals("")){    //if a child
              //log.info("PARENT for FORM link = " + link);
              DataTable parent = (DataTable)FacesAccessor.getUIComponent("mainForm:dt" + input.split(":")[0] + (input.split(":")[1]).replace("_",""));
              //log.info("FOUND parent id = " + parent.getId());    //
              //isChild = true;
              parentModel = (LazyModel)parent.getValue();
              }

        //activiti task variables
        Map tVars = new HashMap();
        for(XMLElement el : pg.getElements()) {

              //label first
              OutputLabel label = new OutputLabel();
              label.setId("lbl" + pGrid.getId() + "_" + el.getValue());
              label.setValue(el.getAttribute("title"));

              pGrid.getChildren().add(label);

              boolean isInput = false;
              if(el.getAttribute("input","false").equals("true"))
              isInput = true;

              //activiti task variables
              if(!el.getAttribute("var","").equals("")){
              //get XML ELEMENTS marked with var="true" and use as Activiti Task Variables
              tVars.put(el.getAttribute("var"),"");
              }


//               if(el.getName().equals("USERFIELD")){
//               InputText txtUser = new InputText();
//               txtUser.setId("txt" + pGrid.getId() + "_" + el.getValue());
//               txtUser.setValue("loggedInUser");
//               }
//               else if(el.getName().equals("DEFAULT")){
//                 InputText txtDefault = new InputText();
//                 txtDefault.setId("txt" + pGrid.getId() + "_" + el.getValue());
//                 txtUser.setValue("loggedInUser");
//                }

              String defaultVal = el.getAttribute("defaultvalue");

              if(el.getName().equals("TEXTFIELD")){

              if(embedded){
                InputText txt = new InputText();
                txt.setId("txt" + pGrid.getId() + "_" + el.getValue());
                txt.setSize(Integer.parseInt(el.getAttribute("w","25")));

                //ValueExpression embVE = FacesAccessor.createValueExpression(elc, "#{item[" + _model.getDataIndex(el.getValue()) + "]}", String.class);
                ValueExpression embVE = FacesAccessor.createValueExpression(elc, "#{item[" + _model.getDataIndex(el.getValue()) + "]}", String.class);

                txt.setValueExpression("value",embVE);
                txt.addClientBehavior("save", EventsManager.createAjaxBehaviour("inplaceUpdate","@parent"));
                //txt.addClientBehavior("cancel", EventsManager.createAjaxBehaviour("inPlaceSave","@none"));

                if(!el.getAttribute("tooltip","").equals(""))
                    txt.setTitle(el.getAttribute("tooltip"));

                //txt.setValidator();
                if(!el.getAttribute("requiredmessage","").equals("")){    //if there is a requiredmessage
                    txt.setRequired(true);
                    txt.setRequiredMessage(el.getAttribute("requiredmessage"));
                    }

                label.setFor("txt" + pGrid.getId() + "_" + el.getValue());

                Inplace inp = new Inplace();
                //inp.setLabel(el.getAttribute("title","No Title"));
                //inp.setValueExpression("label",FacesAccessor.createValueExpression(elc, "#{item[" + _model.getDataIndex(el.getValue()) + "]}", String.class));
                inp.setValueExpression("label",FacesAccessor.createValueExpression(elc, "#{item[" + _model.getDataIndex(el.getValue()) + "]}", String.class));
                inp.setEmptyLabel("EMPTY");
                inp.setEditor(true);
                inp.setSaveLabel("Save");
                inp.setCancelLabel("Cancel");
                inp.setEvent(el.getAttribute("event","click"));
                inp.setToggleable(true);

                inp.getChildren().add(txt);

                pGrid.getChildren().add(inp);

                }
              else if(el.getAttribute("inline","false").equals("false")){
                //log.info("FOUND TEXTFIELD value = " + el.getValue());
                InputText txt = new InputText();
                txt.setId("txt" + pGrid.getId() + "_" + el.getValue());
                txt.setSize(Integer.parseInt(el.getAttribute("w","20")));

                if (isChild || isInput){        //CORRECTION NEEDED HERE... if isInput i need to use onNewValue event
                    txt.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", String.class));
                    txt.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onValueChange","@none"));

                    //if isInput look for mechanism to inject the value directly to newDataMap in DashboardBacker
                    }
                 else{    //means new
                     txt.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onNewValue","@none"));

                    if (defaultVal != null){
                    txt.setValue(defaultVal);
                    }
                     }

                if(!el.getAttribute("tooltip","").equals(""))
                    txt.setTitle(el.getAttribute("tooltip"));

                //txt.setValidator();

                if(!el.getAttribute("requiredmessage","").equals("")){    //if there is a requiredmessage
                    txt.setRequired(true);
                    txt.setRequiredMessage(el.getAttribute("requiredmessage"));
                    }

                label.setFor("txt" + pGrid.getId() + "_" + el.getValue());

                // attach message component
                // Message msg = new Message();
                // msg.setId("msg_" + pGrid.getId() + "_" + el.getValue());
                // msg.setFor("txt" + pGrid.getId() + "_" + el.getValue());
                // pGrid.getChildren().add(msg);

                pGrid.getChildren().add(txt);
                }
              else{    //if inline .. this is only usable when EDITING
                InputText txt = new InputText();
                txt.setId("txt" + pGrid.getId() + "_" + el.getValue());
                txt.setSize(Integer.parseInt(el.getAttribute("w","20")));

                if (isChild || isInput){
                    txt.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", String.class));
                    txt.addClientBehavior("save", EventsManager.createAjaxBehaviour("inplaceUpdate","@parent"));
                    }

                //txt.setValidator();
                if(!el.getAttribute("requiredmessage","").equals("")){    //if there is a requiredmessage
                    txt.setRequired(true);
                    txt.setRequiredMessage(el.getAttribute("requiredmessage"));
                    }

                label.setFor("txt" + pGrid.getId() + "_" + el.getValue());

                Inplace inp = new Inplace();
                //inp.setLabel(el.getAttribute("title","No Title"));
                inp.setValueExpression("label",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", String.class));
                inp.setEmptyLabel("EMPTY");
                inp.setEditor(Boolean.parseBoolean(el.getAttribute("editorbuttons","false")));
                inp.setSaveLabel("Save");
                inp.setCancelLabel("Cancel");
                inp.setEvent(el.getAttribute("event","click"));
                inp.setToggleable(true);

                inp.getChildren().add(txt);

                pGrid.getChildren().add(inp);

                }

                }

              else if(el.getName().equals("AUTOCOMPLETE")){
                log.info("FOUND AUTOCOMPLETE");
                //AutoComplete autoComp = new AutoComplete();
                //MyAutoComplete autoComp = new MyAutoComplete();    //my implementation
                AutoComplete autoComp = new AutoComplete();
                autoComp.setId("ac" + pGrid.getId() + "_" + el.getValue());
                autoComp.setForceSelection(true);
                autoComp.setRequired(true);
                autoComp.setRequiredMessage(el.getAttribute("requiredmessage","Required"));
                autoComp.setMinQueryLength(Integer.parseInt(el.getAttribute("querylength","3")));
                autoComp.setMaxlength(Integer.parseInt(el.getAttribute("maxlength","10")));
                autoComp.setMultiple(Boolean.parseBoolean(el.getAttribute("multiple","false")));
                autoComp.setQueryDelay(Integer.parseInt(el.getAttribute("delay","500")));
                //autoComp.setDropdown(true);
                //autoComp.setConverter(el.getAttribute("converter","org.elegance.primetime.util.DefaultConverter"));
                //autoComp.setValueChangeListener()
                //autoComp.setVar("obj");
                //autoComp.setItemLabel("#{obj.toString()}");
                //autoComp.setItemValue("#{obj}");
                //autoComp.setProcess();
                //autoComp.setValue("testvalue");

                //autoComp.setLptable(el.getAttribute("lptable"));
                //autoComp.setLpfield(el.getAttribute("lpfield"));
                //autoComp.setLpkey(el.getAttribute("lpkey"));

                //MethodExpression cME = FacesAccessor.createMethodExpression("#{eventManager.onComplete(\"" + autoComp.getValue() + "\",\"" + el.getAttribute("lptable") + "\",\"" + el.getAttribute("lpfield") + "\")}",List.class, String.class);
                MethodExpression cME = FacesAccessor.createMethodExpression("#{eventManager.onComplete}",List.class, String.class);
                autoComp.setCompleteMethod(cME);

//                  MethodExpression cVE = FacesAccessor.createMethodActionListener("#{eventManager.onValueChange}",Void.class, String.class);
//                  autoComp.setValueChangeListener(cVE);

                //ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{imageBean.getImageBytes(\"select " + el.getValue() + " from " + pg.getAttribute("table","table") + " where " + pg.getAttribute("keyfield","kf") + " = ?\")}", DefaultStreamedContent.class);

                //START TESTING params
//                 UIParameter paramTable = new UIParameter();
//                 UIParameter paramField = new UIParameter();
//                 UIParameter paramKey = new UIParameter();
//
//                 paramTable.setName("lptable");
//                 //paramTable.setValue(el.getAttribute("lptable"));
//                 paramTable.setValue("p_entity");
//
//                 paramField.setName("lpfield");
//                 paramField.setValue(el.getAttribute("lpfield"));
//
//                 paramKey.setName("lpkey");
//                 paramKey.setValue(el.getAttribute("lpkey"));
//
//                 autoComp.getChildren().add(paramTable);
//                 autoComp.getChildren().add(paramField);
//                 autoComp.getChildren().add(paramKey);
                //END TESTING params


                label.setFor("ac" + pGrid.getId() + "_" + el.getValue());

//                 if (isChild || isInput){        //CORRECTION NEEDED HERE... if isInput i need to use onNewValue event
//                 autoComp.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", String.class));
//                 autoComp.addClientBehavior("itemSelect", EventsManager.createAjaxBehaviour("onValueChange","@none"));
//                 }
//                 else{
//                 autoComp.addClientBehavior("itemSelect", EventsManager.createAjaxBehaviour("onNewValue","@none"));
//                 }

                pGrid.getChildren().add(autoComp);
                }
              else if(el.getName().equals("TEXTAREA")){
                InputTextarea txtA = new InputTextarea();

                txtA.setId("txtA" + pGrid.getId() + "_" + el.getValue());
                txtA.setLabel("INLINE LABEL");
                if (isChild || isInput){
                  txtA.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", String.class));
                  txtA.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onValueChange","@parent"));
                  }
                 else{    //means new
                   txtA.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onNewValue","@form"));

                  //TESTING ROBOT.. WORKS PERFECTLY
                  //txtA.addClientBehavior("focus", EventsManager.createAjaxBehaviour("runRobot","@this"));

                  if (defaultVal != null){
                      txtA.setValue(defaultVal);
                      }
                   }

                txtA.setRows(Integer.parseInt(el.getAttribute("rows","5")));
                txtA.setCols(Integer.parseInt(el.getAttribute("cols","25")));
                //txtA.setRendered(Boolean.parseBoolean(el.getAttribute("visible","true")));

                label.setFor("txtA" + pGrid.getId() + "_" + el.getValue());
                pGrid.getChildren().add(txtA);

                }
              else if(el.getName().equals("CHECKBOX")){
                SelectBooleanCheckbox chk = new SelectBooleanCheckbox();

                chk.setId("chk" + pGrid.getId() + "_" + el.getValue());
                chk.setLabel("INLINE LABEL");
                if (isChild || isInput){
                  chk.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", String.class));
                  chk.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onValueChange","@parent"));
                  }
                 else{    //means new
                   chk.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onNewValue","@form"));

                  //TESTING ROBOT.. WORKS PERFECTLY
                  //txtA.addClientBehavior("focus", EventsManager.createAjaxBehaviour("runRobot","@this"));

                  if (defaultVal != null){
                      chk.setValue(defaultVal);
                      }
                   }

                label.setFor("chk" + pGrid.getId() + "_" + el.getValue());
                pGrid.getChildren().add(chk);
                }

              else if(el.getName().equals("TEXTDECIMAL")){
                InputText txtD = new InputText();

                txtD.setId("txtD" + pGrid.getId() + "_" + el.getValue());
                txtD.setType("number");
                txtD.setSize(Integer.parseInt(el.getAttribute("w","20")));
                txtD.setStyle(el.getAttribute("style","text-align: right"));


                if(!el.getAttribute("tooltip","").equals(""))
                txtD.setTitle(el.getAttribute("tooltip"));

                 if (isChild || isInput){
                txtD.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", Double.class));
                txtD.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onValueChange","@form"));
                }
                 else{    //means new
                 txtD.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onNewValue","@none"));

                if (defaultVal != null){
                    txtD.setValue(defaultVal);
                    }

                 }

                if(!el.getAttribute("requiredmessage","").equals("")){    //if there is a requiredmessage
                txtD.setRequired(true);
                txtD.setRequiredMessage(el.getAttribute("requiredmessage"));
                }

                txtD.setRendered(Boolean.parseBoolean(el.getAttribute("visible","true")));

                label.setFor("txtD" + pGrid.getId() + "_" + el.getValue());
                pGrid.getChildren().add(txtD);
                }
              else if(el.getName().equals("INPUTMASK")){
                InputMask txtMask = new InputMask();

                txtMask.setId("mask" + pGrid.getId() + "_" + el.getValue());
                txtMask.setSize(Integer.parseInt(el.getAttribute("w","20")));

                if(!el.getAttribute("style","").equals("")){
                txtMask.setStyle(el.getAttribute("style"));
                }

                if (isChild || isInput){
                    txtMask.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", String.class));
                    txtMask.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onValueChange","@form"));
                    }
                 else{    //means new
                     txtMask.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onNewValue","@none"));
                     }

                txtMask.setMask(el.getAttribute("mask",""));
                label.setFor("mask" + pGrid.getId() + "_" + el.getValue());

                pGrid.getChildren().add(txtMask);
              }
//  else if(el.getName().equals("GMAP")){
//       log.info("CREATING map");
//
//     GMap map = new GMap();
//     MapModel model = new DefaultMapModel();
//
//      map.setId("map" + pGrid.getId() + "_" + el.getValue());
//      map.setWidgetVar(map.getId());
//     map.setCenter(el.getAttribute("center","41.381542, 2.122893"));
//     map.setZoom(Integer.parseInt(el.getAttribute("zoom","15")));
//     map.setType(el.getAttribute("type","hybrid"));
//         map.setStyle(el.getAttribute("style","width:400px;height:300px"));
//
//     model.addOverlay(new Marker(new LatLng(36.879466, 30.667648), "M1"));
//     map.setModel(model);
//
//     pGrid.getChildren().add(map);
// }

              else if(el.getName().equals("EDITOR")){        //'component does not implement Behaviour Interface'
                Editor edt = new Editor();

                //MethodExpression ee = FacesAccessor.createMethodExpression("#{eventManager.onNewValue}",Void.class, new Class[0]);
                //edt.setValueChangeListener(ee);

                edt.setId("edt" + pGrid.getId() + "_" + el.getValue());
                if (isChild || isInput){
                    edt.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", String.class));
                    //edt.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onValueChange","@form"));
                    }
                 //else{    //means new
                //edt.addClientBehavior("blur", EventsManager.createAjaxBehaviour("onNewValue","@form"));
                //}

                edt.setWidth(Integer.parseInt(el.getAttribute("width","200")));
                edt.setHeight(Integer.parseInt(el.getAttribute("heigth","100")));
                    edt.setControls(el.getAttribute("controls","bold italic underline strikethrough"));
                edt.setRendered(Boolean.parseBoolean(el.getAttribute("visible","true")));

                label.setFor("edt" + pGrid.getId() + "_" + el.getValue());
                pGrid.getChildren().add(edt);
                }
              else if(el.getName().equals("TEXTDATE")){
                //log.info("FOUND TEXTDATE value = " + el.getValue());

                Calendar cal = new Calendar();
                cal.setId("cal" + pGrid.getId() + "_" + el.getValue());
                cal.setPattern("yyyy MMM dd");
                cal.setNavigator(true);
                //cal.setPages(3);
                cal.setMode(el.getAttribute("mode","popup"));        //button,inline,popup
                //cal.setShowOn(String here);
                cal.setYearRange(el.getAttribute("yearrange","1990:2020"));
                //cal.setTimeOnly(true);
                //cal.setShowWeek(true);        //show week number
                //cal.setShowButtonPanel(true);    //Show TODAY and DONE

                //cal.setImmediate(false);        //process validations logic isexecuted at apply request values phase for this component

                //cal.setSelectOtherMonths(true);
                //cal.setShowOtherMonths(true);



                //pattern="EEE, dd MMM, yyyy" showButtonPanel="true" navigator="true"
                cal.setSize(Integer.parseInt(el.getAttribute("w","20")));

                if (isChild || isInput){
                    //Date date = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(string);
                    //log.info("Trying Java Date Formatter ... " + new SimpleDateFormat("yyyyy MMMMM dd", Locale.ENGLISH).parse(new Date()));
                    cal.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", Date.class));
                    cal.addClientBehavior("dateSelect", EventsManager.createAjaxBehaviour("onValueChange","@form"));    //or change or select
                    }
                 else{    //means new
                     cal.addClientBehavior("dateSelect", EventsManager.createAjaxBehaviour("onNewValue","@none"));

                    if (defaultVal != null){
                      cal.setValue(defaultVal);
                      }
                     }

                cal.setRendered(Boolean.parseBoolean(el.getAttribute("visible","true")));
                label.setFor("cal" + pGrid.getId() + "_" + el.getValue());
                pGrid.getChildren().add(cal);

                }//end if TEXTDATE
              else if(el.getName().equals("COMBOLIST")){
                SelectOneMenu cmblist = new SelectOneMenu();
                cmblist.setId("cmblist" + pGrid.getId() + "_" + el.getValue());
                label.setFor("cmblist" + pGrid.getId() + "_" + el.getValue());

                List data = el.getElements();
                List items = new ArrayList();

                for(XMLElement dt : data) {
                        if(dt.getName().equals("DATA")){    //HAS TO BE A DATA
                        items.add(new SelectItem(dt.getAttribute("key","-1"), dt.getValue()));
                            }//end if DATA
                        }

                UISelectItems selectItems = new UISelectItems();
                selectItems.setValue(items);
                selectItems.setId("si" + pGrid.getId() + "_" + el.getValue());
                cmblist.getChildren().add(selectItems);

                if (isChild || isInput){
                    //log.info("COMBOLIST parentModel = " + (parentModel==null?"NO PARENT":"OK"));
                    cmblist.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", Object.class));
                    cmblist.addClientBehavior("change", EventsManager.createAjaxBehaviour("onValueChange","@form"));
                    }
                 else{    //means new
                     cmblist.addClientBehavior("change", EventsManager.createAjaxBehaviour("onNewValue","@none"));
                     }
                pGrid.getChildren().add(cmblist);

                }
              else if (el.getName().equals("COMBOBOX")){
                SelectOneMenu cmbbox = new SelectOneMenu();
                cmbbox.setId("cmbbox" + pGrid.getId() + "_" + el.getValue());
                //if heigtht is defined
                if(!el.getAttribute("h","").equals("")){
                    cmbbox.setHeight(Integer.parseInt(el.getAttribute("h")));
                    }
                label.setFor("cmbbox" + pGrid.getId() + "_" + el.getValue());

                String wheresql = el.getAttribute("wheresql");
                //the last argument is a 'suggestion/advice' as to the width of the array
                List cdata = IOService.getListFromResultSet(getDs(), "SELECT " + (el.getAttribute("lpkey",el.getValue())) + "," + el.getAttribute("lpfield") + " FROM " + el.getAttribute("lptable")  + (wheresql==null?"":" WHERE " + wheresql));

                List items = new ArrayList();
                items.add(new SelectItem("-1", "Select"));
                for(Object[] dt : cdata) {
                    items.add(new SelectItem((Integer)dt[0], (String)dt[1]));
                        }
                UISelectItems selectItems = new UISelectItems();
                selectItems.setValue(items);
                selectItems.setId("si" + pGrid.getId() + "_" + el.getValue());
                cmbbox.getChildren().add(selectItems);

                  if (isChild || isInput){
                  if(el.getAttribute("input","false").equals("true")){
                      cmbbox.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", Integer.class));
                      cmbbox.setDisabled(true);
                      }
                  else{
                      cmbbox.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(el.getValue()) + "]}", Integer.class));
                      cmbbox.addClientBehavior("change", EventsManager.createAjaxBehaviour("onValueChange","@form")); //this may
                      }
                  }
                   else{    //means new
                     cmbbox.addClientBehavior("change", EventsManager.createAjaxBehaviour("onNewValue","@none"));
                     }


                pGrid.getChildren().add(cmbbox);

                }
              else if(el.getName().equals("FIELDSET")){
                log.info("FOUND FIELDSET id=" + el.getAttribute("id","no id"));
                Fieldset fs = new Fieldset();
                fs.setId("fs" + pGrid.getId() + "_" + el.getAttribute("id","k"));
                fs.setLegend(el.getAttribute("legend","No Legend"));

                HtmlPanelGrid fGrid = new HtmlPanelGrid();
                fGrid.setColumns(2);
                fGrid.setId("fgrid" + fs.getId());

                for(XMLElement ell : el.getElements()) {

                  if(ell.getName().equals("TEXTFIELD")){
                      log.info("FIELDSET CHILD = " + ell.getName());
                      InputText fTxt = new InputText();
                      fTxt.setLabel("TESTING");
                      fTxt.setValue("TESTING");
                      fGrid.getChildren().add(fTxt);
                      }
                  else if(ell.getName().equals("TEXTAREA")){
                      fGrid.getChildren().add(new InputTextarea());
                      }
                  else if(ell.getName().equals("EDITOR")){
                      fGrid.getChildren().add(new Editor());
                      }
                  }
                fs.getChildren().add(fGrid);
                pGrid.getChildren().add(fs);

                }//end if FIELDSET
//         else if(el.getName().equals("FEEDREADER")){
//                 log.info("FOUND FEEDREADER title = " + el.getAttribute("title"));
//
//                 FeedReader fd = new FeedReader();
//                 fd.setId("fd" + pGrid.getId() + "_" + el.getAttribute("key","k"));
//                 fd.setValue(el.getAttribute("source","http://rss.news.yahoo.com/rss/sports"));
//                 fd.setVar("feed");
//                 fd.setRendered(true);
//                 fd.setSize(Integer.parseInt(el.getAttribute("size","10")));
//
//
//                 ValueExpression titleVE = FacesAccessor.createValueExpression(elc, "#{feed.title}", Object.class);
//                 ValueExpression contentVE = FacesAccessor.createValueExpression(elc, "#{feed.description.value}", Object.class);
//
//                 HtmlOutputText fdTitle = new HtmlOutputText();//(HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
//                 fdTitle.setValueExpression("value",titleVE);
//                 //fdTitle.setValue("#{feed.title}");
//
//                 HtmlOutputText fdContent = new HtmlOutputText();
//                 fdContent.setValueExpression("value",contentVE);
//                 //fdContent.setValue("#{feed.description.value}");
//
//                 UIOutput errorMessage = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
//                 errorMessage.setValue("Something Went Wrong");
//
//                 fd.getChildren().add(fdTitle);
//                 fd.getChildren().add(fdContent);
//
//                 fd.getFacets().put("error", errorMessage);
//
//
//
//                 RequestContext reqContext = RequestContext.getCurrentInstance();
//                 reqContext.update("feed");
//
//                 pGrid.getChildren().add(fd);
//
//                 }//end if FEEDREADER

else if(el.getName().equals("IMAGE")){
                GraphicImage img = new GraphicImage();
                img.setId("img" + pGrid.getId() + "_" + el.getValue());

                FileUpload fup = new FileUpload();        //used when noimage present

                //img.setTitle(el.getAttribute("title","No Title"));
                img.setHeight(el.getAttribute("h","50"));
                img.setWidth(el.getAttribute("w","50"));
                img.setAlt("Photo Here");

                if (isChild || isInput){
                log.info("Trying to load image from database");

                ValueExpression imgValueExp = FacesAccessor.createValueExpression(elc, "#{imageBean.getImageBytes(\"select " + el.getValue() + " from " + pg.getAttribute("table","table") + " where " + pg.getAttribute("keyfield","kf") + " = ?\")}", DefaultStreamedContent.class);

                UIParameter param = new UIParameter();
                param.setName("pk");
                param.setName("148");
                //param.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{item[0]}", String.class));
                img.getChildren().add(param);

                FacesContext context = FacesContext.getCurrentInstance();
                if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
                    img.setValue(new DefaultStreamedContent());
                    }
                else{
                    img.setValueExpression("value", imgValueExp);
                    }

                img.addClientBehavior("change", EventsManager.createAjaxBehaviour("onValueChange","@form"));
                }
                else{    //means new

                fup.setId("fup" + pGrid.getId() + "_" + el.getValue());
                fup.setAuto(Boolean.parseBoolean(el.getAttribute("autoupload","false")));
                fup.setLabel("Choose");
                //fup.setAllowTypes(el.getAttribute("uploadfilter","/(\.|\/)(gif|jpe?g|png)$/"));

//
                MethodExpression fl = FacesAccessor.createMethodExpression("#{eventManager.handleFileUpload}",Void.class, FileUploadEvent.class);
                fup.setFileUploadListener(fl);

                label.setFor("fup" + pGrid.getId() + "_" + el.getValue());

//                 log.info("Trying to load image from file");
//                 try{
//                     //if is child get from db
//                     //File imgFile = new File(el.getAttribute("file","no_file"));
//
//                     String missing = "file:///opt/tomcat7/webapps.labs/primetime/resources/images/missing_person.jpg";
//                     File imgFile = new File(new URI(el.getAttribute("file",missing)));
//                     log.info("Can Read ? = " + imgFile.canRead() + " Can Write ? = " + imgFile.canWrite());
//                     log.info("File = " + imgFile.getPath());
//                     StreamedContent strmImg;
//                     FacesContext context = FacesContext.getCurrentInstance();
//
//                     log.info("IMAGE phase = " + context.getCurrentPhaseId());
//
//                      if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
//                          log.info("at Render Response");
//                         // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
//                          // strmImg =  new DefaultStreamedContent();
//                         strmImg = new DefaultStreamedContent(new FileInputStream(missing), el.getAttribute("mimetype","image/jpg") ,"photo");
//                      }
//                      else{
//                     //strmImg = new DefaultStreamedContent(new FileInputStream(imgFile), el.getAttribute("mimetype","image/jpg") ,"photo");
//                     strmImg = new DefaultStreamedContent(new FileInputStream(missing), el.getAttribute("mimetype","image/jpg") ,"photo");
//                     //InputStream stream = this.getClass().getResourceAsStream("barcalogo.jpg");
//                     //image = new DefaultStreamedContent(stream, "image/jpeg");
//                     }
//                     //img.addClientBehavior("change", EventsManager.createAjaxBehaviour("onNewValue","@none"));
//                     log.info("StreamedContent name = " + strmImg.getName() + ", contentType = " + strmImg.getContentType() + ", stream = " + strmImg.getStream());
//
//                     //img.setValue(imgFile.getPath());
//                     img.setValue(strmImg.getStream());
// //                     if(strmImg != null)
// //                     img.setValue(strmImg);
// //                     else
// //                     log.severe("strmImg IS NULL");
/*
                    }
                catch(FileNotFoundException e){
                    log.severe("File Not Found : Message = " + e.getMessage());
                    }
                  catch(URISyntaxException ex){
                    log.severe("Invalid URI = " + ex.getMessage());
                    }*/

                }

                //pGrid.getChildren().add(img);
                pGrid.getChildren().add(fup);
                }//end if IMAGE

              }


        //new can be true (default for everyone), rolename(only members with a specified role)
        if(pg.getAttribute("new","false").equals("true")){
            //if(isChild == false){     //if its not a child
            CommandButton btnNew = new CommandButton();
            btnNew.setId("new_"+pg.getAttribute("table","no_table"));
            btnNew.setValue("Save");
            btnNew.setAjax(true);
            btnNew.setAsync(true);
            btnNew.setUpdate("@form");


//             CommandButton btnReset = new CommandButton();
//             btnReset.setId("reset_"+pg.getAttribute("table","no_table"));
//             btnReset.setValue("Clear");
//             btnReset.setTitle("Click to add entry");
//             btnReset.setType("reset");
//

            //log.info("audit = " + pg.getAttribute("audit","false"));

            //ButtonActionListener listener = new ButtonActionListener(pg.getAttribute("table","no_table"),_userId, _orgId);
            ButtonActionListener listener = new ButtonActionListener(pg.getAttribute("table","no_table"),_props);
            btnNew.addActionListener(listener);

            if(!pg.getAttribute("input","").equals(""))        //if input is needed from a datatable.....
            listener.setInputField(pg.getAttribute("input").split(":")[1]);
//              if(!pg.getAttribute("user","").equals(""))
//              listener.setUserField(pg.getAttribute("user"));
            //if either audit is true or if we want to relate loggedInUser with the new entry
            if(pg.getAttribute("audit","false").equals("true") || !pg.getAttribute("user","").equals(""))
            listener.setAudit(true);
            if(pg.getAttribute("tenant","false").equals("true"))
            listener.setTenant(true);
            if(!pg.getAttribute("activiti","").equals(""))
            listener.setTaskVars(tVars);

            /*
            if(!pg.getAttribute("input","").equals(""))        //if input is needed from a datatable.....
            //btnNew.addActionListener(new ButtonActionListener(pg.getAttribute("input").split(":")[1]));
            inputField
            else if(pg.getAttribute("audit","false").equals("true"))
            btnNew.addActionListener(new ButtonActionListener(_userId));
            else
            btnNew.addActionListener(new ButtonActionListener());
            */

            //btnNew.addActionListener(EventsManager.getBlistener());
            //btnNew.setActionExpression(FacesAccessor.createMethodExpression("#{dashboardBacker.onRowSelect}",Void.class, new Class[0]));
            //item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", Void.class, new Class[]{Object.class,String.class}));

            pGrid.getChildren().add(btnNew);
            //pGrid.getChildren().add(btnReset);
            }
//         else{        //UPDATE button needed
//             @TODO
//             CommandButton btnUpdate = new CommandButton();
//             btnNew.setId("update_"+pg.getAttribute("table","no_table"));
//             btnNew.setValue("Update");
//             btnNew.setAjax(true);
//             btnNew.setAsync(true);
//             //btnNew.setUpdate("@form");
//             btnNew.setUpdate("@form");
//             pGrid.getChildren().add(btnUpdate);
//             }

        return pGrid;
        }

Programatically creating/initializing Primefaces Datatable with components

Ahoy,

This is for you Mike, and any other interested

This is very raw... (it works by the way).. i will clean it up for public use in a while...

Only look at the relevant part of the entire code...

This method should be part of a utility class (for creating datatables, schedules, gridforms, etc)...

public static DataTable createDataTable(XMLElement pg, DataSource d, int _userId, int _orgId, boolean _superUser) {

        setDs(d);

        FacesContext fc = FacesContext.getCurrentInstance();
        Application application = fc.getApplication();
        ExpressionFactory ef = application.getExpressionFactory();
        ELContext elc = fc.getELContext();

        //Model
        //if its not nested continue
        //LazyModel model = new LazyModel(pg, _userId, _orgId, _superUser);        //original.. works but needs refactoring
        LazyModel model = new LazyModel(getDs(), pg, _userId, _orgId, _superUser);

        //model.setSuperUser(_superUser);
        //if nested
        //LazyModel model = new LazyModel(pg, _userId,);    //update the where in the xml dynamicaly


        //Table
        DataTable table = (DataTable) application.createComponent(DataTable.COMPONENT_TYPE);
        table.setId("dt" + pg.getAttribute("key","x") + pg.getAttribute("keyfield","kf").replace("_",""));
        //log.info("TABLE id = " + table.getId());
        //table.setPrependId(false);
        table.setValue(model);
        table.setVar("item");

        //if nopages is true or if rows is not defined.....
        if(pg.getAttribute("nopages","false").equals("true") || pg.getAttribute("rows","").equals("")){
            table.setPaginator(false);
            }
        else{
            table.setPaginator(true);
            table.setPaginatorPosition("bottom");
            table.setRowsPerPageTemplate("5,10,15");
            table.setPaginatorTemplate("{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}");
            }

        table.setRows(Integer.parseInt(pg.getAttribute("rows","10")));

        table.setLazy(true);
        table.setResizableColumns(true);
        table.setDraggableColumns(true);
        table.setScrollable(false);
        table.setLiveScroll(false);

        //if no editor and toggler.. (USED TO disable rowselection)
        if(pg.getAttribute("updatetable","").equals("") && pg.getAttribute("toggler","false").equals("false") && pg.getAttribute("noselection","false").equals("false")){
            table.setSelectionMode(pg.getAttribute("selectionmode","single"));
            table.setEditable(false);
            }
        //else if (pg.getAttribute("roweditor","false").equals("true")){
        else if(!pg.getAttribute("updatetable","").equals("")){
            table.setSelectionMode(pg.getAttribute("selectionmode","single"));    //testing edit + delete co-existance
            table.setEditable(true);
            }
//         else if(!pg.getAttribute("contextmenu","").equals("")){
//           table.setSelectionMode(pg.getAttribute("selectionmode","single"));    //testing edit + delete co-existance
//           table.setEditable(true);
//           }

        table.setSelection(model.getSelectedRow());
        table.setTableStyle(pg.getAttribute("tablestyle","font-size:11px;text-align:left;padding-top:0px;padding-bottom:0px;padding-left:0px"));
        table.setRowStyleClass(pg.getAttribute("rowstyleclass","padding:0px 0px 0px 0px;"));
        table.setEmptyMessage(pg.getAttribute("emptymessage","NO DATA TO DISPLAY"));


        LazyModel parentModel = null;

        String link = pg.getAttribute("link","");
        boolean isChild = false;

        if(!link.equals("")){    //if this is a child
              DataTable parent = (DataTable)FacesAccessor.getUIComponent("mainForm:dt" + link.split(":")[0] + (link.split(":")[1]).replace("_",""));
              parentModel = (LazyModel)parent.getValue();
              boolean added = parentModel.addChild(model,parent,table.getId());        //no need to pass the parent
              //boolean added = parentModel.addChild(model, parent.getId());
              isChild = true;
              }

        //if(pg.getAttribute("roweditor","false").equals("false")){
        if(pg.getAttribute("updatetable","").equals("")){    //if no updatetable

            //log.info("NORMAL (un-editable) DATATABLE");

            AjaxBehavior ajaxSelect = new AjaxBehavior();
            MethodExpression se = FacesAccessor.createMethodExpression("#{eventManager.onRowSelect}",Void.class, new Class[0]);
            ajaxSelect.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(se));
            ajaxSelect.setUpdate("@form");
            table.addClientBehavior("rowSelect", ajaxSelect);

          //table.addClientBehavior("rowSelect", EventsManager.createAjaxBehaviour("onRowSelect","@this")); use this
            }
         //else if(pg.getAttribute("roweditor","false").equals("true")){
        else if(!pg.getAttribute("updatetable","").equals("")  && pg.getAttribute("contextmenu","").equals("") ){    //if there is updatetable and no contextmenu

            //log.info("updatetable WITHOUT contextmenu");

             AjaxBehavior ajaxEdit = new AjaxBehavior();
             MethodExpression ee = FacesAccessor.createMethodExpression("#{eventManager.onRowEdit}",Void.class, new Class[0]);
             ajaxEdit.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(ee));
             ajaxEdit.setUpdate("@this");        //
             table.addClientBehavior("rowEdit", ajaxEdit);

            //table.addClientBehavior("rowEdit", EventsManager.createAjaxBehaviour("onRowEdit","@this")); use this
             }
          //if both updatetable and contextmenu
        else if(!pg.getAttribute("updatetable","").equals("") && !pg.getAttribute("contextmenu","").equals("")){    //if there is both contextmenu and updatetable

            //log.info("BOTH updatetable and contextmenu PRESENT.....");

             AjaxBehavior ajaxEdit = new AjaxBehavior();
             MethodExpression ee = FacesAccessor.createMethodExpression("#{eventManager.onRowEdit}",Void.class, new Class[0]);
             ajaxEdit.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(ee));
            ajaxEdit.setUpdate("@none");
             table.addClientBehavior("rowEdit", ajaxEdit);//rowEditInit

            AjaxBehavior ajaxSelect = new AjaxBehavior();
            MethodExpression se = FacesAccessor.createMethodExpression("#{eventManager.onRowSelect}",Void.class, new Class[0]);
            ajaxSelect.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(se));
            //ajaxSelect.setUpdate("@form");        //should be children only
            ajaxSelect.setUpdate("@none");
            //ajaxSelect.setUpdate(model.getChildrenId().toString());        //.. problem is.. by this time the children are not yet created
            //log.info("ajaxSelect update = " + model.getChildrenId().toString());
            //table.handleAttribute("dblClickSelect", new Boolean(true));
            //table.setDblClickSelect(true);        //just to get around this race condition
            table.addClientBehavior("rowSelect", ajaxSelect);

             }


        //this is actualy a summary row implementation
        boolean group = false;
        if(!pg.getAttribute("group","").equals("")){
            group = true;
            //table.setSortBy(parentModel.getDataIndex(pg.getAttribute("groupby")));
            //if(isChild)
            //table.setValueExpression("sortBy",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + model.getDataIndex(pg.getAttribute("group").split(":")[0]) + "]}", Object.class));
            //table.setSortBy(model.getSelectedRow()[0]);

            table.setValueExpression("sortBy", FacesAccessor.createValueExpression(elc, "#{item[" + model.getDataIndex(model.getGroupCol()) +"]}", Object.class));
            table.setSortOrder("ascending");

            table.addClientBehavior("sort", EventsManager.createAjaxBehaviour("onSort","@none"));
            }

        //Global Search (still in alpha testing)
        if(pg.getAttribute("search","").equals("all")){
            //table.setStyleClass(".ui-datatable .ui-datatable-header-search");
            OutputPanel outPanel = new OutputPanel();
            outPanel.setId("searchpanel_" + pg.getAttribute("table","no_table"));

            //HtmlOutputText oText = new HtmlOutputText();
            //oText.setValue("Search All Fields: ");

            InputText sText = new InputText();
            sText.setId("filterText");
            sText.setStyle("width:150px");

            //we may need p:defaultcommand instead of using the blur event..
            //...or a search button that receives the table model search text and table id

            sText.addClientBehavior("blur", EventsManager.createAjaxBehaviour("updateFTSSearchQuery",table.getId()));
            //sText.addClientBehavior("keyup", EventsManager.createAjaxBehaviour("updateFTSSearchQuery",table.getId()));

            CommandButton btnDTSearch = new CommandButton();
            btnDTSearch.setId("search_" + pg.getAttribute("table","no_table"));
            btnDTSearch.setValue("Search");
            btnDTSearch.setAjax(true);
            //btnDTSearch.setAsync(true);
            btnDTSearch.setUpdate(table.getId());
            btnDTSearch.addActionListener(new ButtonActionListener(model));        //search text, model

            DefaultCommand dfCommand = new DefaultCommand();
            dfCommand.setId("dfCommand_" + pg.getAttribute("table","no_table"));
            dfCommand.setTarget(btnDTSearch.getId());
            //dfCommand.setContext(outPanel.getId());        //id of parent

            //outPanel.getChildren().add(oText);
            outPanel.getChildren().add(sText);
            outPanel.getChildren().add(btnDTSearch);
            table.getFacets().put("header", outPanel);
            }

        if(!pg.getAttribute("header","").equals("")){
            UIOutput tableTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            //tableTitle.setValue("Table Title");
            tableTitle.setValue(pg.getAttribute("header"));
            table.getFacets().put("header", tableTitle);
            }
        else if(isChild){    //it means we want a header here
            try{
            UIOutput tableTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            tableTitle.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(link.split(":")[2]) + "]}", String.class));
            //tableTitle.setStyle("font-color:blue");
            table.getFacets().put("header", tableTitle);
            }
            catch(ArrayIndexOutOfBoundsException e){
            log.severe("Unable to set Child Header " + e.getMessage());
            }
            }

        //TABLE FOOTER
        if(!pg.getAttribute("footer","").equals("")){
              UIOutput tableFooter = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
              tableFooter.setValue(pg.getAttribute("footer"));
              table.getFacets().put("footer", tableFooter);
              }

        if(pg.getAttribute("toggler","false").equals("true")){
            Column tcol = (Column) application.createComponent(Column.COMPONENT_TYPE);
            tcol.setId("t_col_" + pg.getAttribute("key"));
            RowToggler rt = new RowToggler();
            rt.setId("rt_id_" + pg.getAttribute("key"));
            rt.setRendered(true);
            tcol.getChildren().add(rt);
            table.getChildren().add(tcol);
              }


        int colIndex = 0;
        for(XMLElement el : pg.getElements()) {

            Column col = (Column) application.createComponent(Column.COMPONENT_TYPE);

            //need to set id based on type of element.. especialy to facilitate report facility
            if(el.getName().equals("JASPER"))
            col.setId("col_report" + colIndex + "_" + pg.getAttribute("key"));
            else
            col.setId("col_" + el.getValue() + "_" + pg.getAttribute("key"));

            if(!el.getAttribute("style","").equals("")){
              col.setStyle(el.getAttribute("style"));
              }

             //buttons need to be added to the parent panel not to the datatable itself
               if(el.getName().equals("ACTIONS")){
               //log.info("FOUND ACTIONS");
               col.setSelectionMode(pg.getAttribute("selectionmode","single"));
              table.setSelectionMode(null);
               table.getChildren().add(col);

            AjaxBehavior ajaxSelect = new AjaxBehavior();
            MethodExpression se = FacesAccessor.createMethodExpression("#{eventManager.onRowSelect}",Void.class, new Class[0]);
            ajaxSelect.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(se));
            ajaxSelect.setUpdate("@none");
            table.addClientBehavior("rowSelectRadio", ajaxSelect);

               continue;        //TO NEXT ITERATION
               }

              if(el.getAttribute("selectionmode","").equals("multiple")){
               //log.info("FOUND ACTIONS");
               col.setSelectionMode("multiple");
              table.setSelectionMode(null);
            table.setSelection(model.getSelectedRows());
               table.getChildren().add(col);

             AjaxBehavior ajaxSelect = new AjaxBehavior();
             MethodExpression se = FacesAccessor.createMethodExpression("#{eventManager.onMultipleSelect}",Void.class, new Class[0]);
             ajaxSelect.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(se));
             ajaxSelect.setUpdate("@none");
             table.addClientBehavior("rowSelectCheckbox", ajaxSelect);

//             AjaxBehavior ajaxUnSelect = new AjaxBehavior();
//              MethodExpression ume = FacesAccessor.createMethodExpression("#{eventManager.onRowUnSelect}",Void.class, new Class[0]);
//              ajaxUnSelect.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(ume));
//              ajaxUnSelect.setUpdate("@none");
//              table.addClientBehavior("rowUnSelectCheckbox", ajaxUnSelect);

            //rowUnselectcheckbox


               //continue;        //TO NEXT ITERATION
               }

            col.setValueExpression("sortBy", FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class));

            UIOutput colTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            colTitle.setValue(el.getAttribute("title","No Title"));

            col.getFacets().put("header", colTitle);

            //if footer present
            if(!el.getAttribute("footer","").equals("")){
            UIOutput colFooter = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            colFooter.setValue(el.getAttribute("footer"));
            col.getFacets().put("footer", colFooter);
            }

            //search
            if(!el.getAttribute("filtermode","").equals("")){
              col.setValueExpression("filterBy", FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class));
              col.setFilterMatchMode(el.getAttribute("filtermode","contains"));
            }

            //col.getFacets().put("footer", colTitle);

            if(pg.getAttribute("subtables","").equals("")){
            table.getChildren().add(col);
            }
/*
            else{
            log.info("SUBTABLE FOUND");
            SubTable stable = new SubTable();

            UIOutput subTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            //subTitle.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(pg.getAttribute("subtables")) + "]}", String.class));
            subTitle.setValue("Sub Header");
            stable.getFacets().put("header", subTitle);

            stable.setVar(table.getVar());
            stable.setValue(table.getValue());

            stable.getChildren().add(col);
            table.getChildren().add(stable);
            }*/

            // Create for the body of the column.
            if(el.getName().equals("TEXTFIELD")){

            if(el.getAttribute("edit","false").equals("true")){
                //log.info("Found EDITABLE field: " + el.getAttribute("title"));
                CellEditor ce = new CellEditor();

                ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);

                HtmlOutputText colOutput = new HtmlOutputText();//(HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
                InputText colInput = new InputText();//(InputText)application.createComponent(InputText.COMPONENT_TYPE);

                //colInput.setSize(Integer.parseInt(el.getAttribute("w","20")));

                if(!el.getAttribute("style","").equals("")){
                    colInput.setStyle(el.getAttribute("style"));
                    colOutput.setStyle(el.getAttribute("style"));
                    }

                colInput.setValueExpression("value", colValueExp);
                colOutput.setValueExpression("value", colValueExp);

                ce.getFacets().put("output", colOutput);
                ce.getFacets().put("input", colInput);

                col.getChildren().add(ce);

                }
            else{        //normal processing
                  ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);
                  HtmlOutputText colOutput = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
                  colOutput.setValueExpression("value", colValueExp);

                  //colOutput.setSize(Integer.parseInt(el.getAttribute("w","20")));

                  if(!el.getAttribute("style","").equals(""))
                    colOutput.setStyle(el.getAttribute("style"));

                  col.getChildren().add(colOutput);

                  }
            }

            else if(el.getName().equals("TEXTDECIMAL")){

            col.setStyle(el.getAttribute("style","text-align:right"));

            if(el.getAttribute("edit","false").equals("true")){

                CellEditor ce = new CellEditor();

                ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);

                HtmlOutputText colOutput = new HtmlOutputText();//(HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
                InputText colInput = new InputText();//(InputText)application.createComponent(InputText.COMPONENT_TYPE);

                if(!el.getAttribute("style","").equals(""))
                    colInput.setStyle(el.getAttribute("style"));

                colInput.setValueExpression("value", colValueExp);
                colOutput.setValueExpression("value", colValueExp);

                ce.getFacets().put("output", colOutput);
                ce.getFacets().put("input", colInput);

                col.getChildren().add(ce);

                }
                else{
                ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);
                HtmlOutputText colOutput = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
                colOutput.setValueExpression("value", colValueExp);

                //thousands separator using regex (make sure there are no more than two(2) decimal places
                //x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");

                col.getChildren().add(colOutput);
                }
               }
            else if(el.getName().equals("TEXTDATE")){

                  if(el.getAttribute("edit","false").equals("true")){

                      CellEditor ce = new CellEditor();

                      ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);

                      HtmlOutputText colOutput = new HtmlOutputText();//(HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );

                      Calendar colInput = new Calendar();
                      colInput.setPattern("yyyy MMM dd");
                      colInput.setShowButtonPanel(true);
                      colInput.setNavigator(true);

                      if(!el.getAttribute("style","").equals("")){
                      colInput.setStyle(el.getAttribute("style"));
                      colOutput.setStyle(el.getAttribute("style"));
                      }

                      colInput.setValueExpression("value", colValueExp);
                      colOutput.setValueExpression("value", colValueExp);

                      ce.getFacets().put("output", colOutput);
                      ce.getFacets().put("input", colInput);

                      col.getChildren().add(ce);

                      }
                else{
                      ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);
                      HtmlOutputText colOutput = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
                      colOutput.setValueExpression("value", colValueExp);

                      if(!el.getAttribute("style","").equals("")){
                      colOutput.setStyle(el.getAttribute("style"));
                      }

                      col.getChildren().add(colOutput);
                      }
                }

             else if(el.getName().equals("COMBOBOX")){
                //A COMBOBOX in a DataTable is always editable (otherwise just use TEXTFIELD)

                //log.info("Found EDITABLE field: " + el.getAttribute("title"));

                CellEditor ce = new CellEditor();

                SelectOneMenu cmbbox = new SelectOneMenu();
                cmbbox.setId("cmbbox" + "_" + el.getValue());

                String wheresql = el.getAttribute("wheresql");

                List cdata = IOService.getListFromResultSet(getDs(), "SELECT " + (el.getAttribute("lpkey",el.getValue())) + "," + el.getAttribute("lpfield") + " FROM " + el.getAttribute("lptable") + (wheresql==null?"":" WHERE " + wheresql));

                List items = new ArrayList();
                for(Object[] dt : cdata) {
                    items.add(new SelectItem(dt[0], (String)dt[1]));
                        }

                UISelectItems selectItems = new UISelectItems();
                selectItems.setValue(items);
                selectItems.setId("si" + "_" + el.getValue());
                cmbbox.getChildren().add(selectItems);

                ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);

                HtmlOutputText colOutput = new HtmlOutputText();//(HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
                SelectOneMenu colInput = cmbbox;

                if(!el.getAttribute("style","").equals("")){
                    colInput.setStyle(el.getAttribute("style"));
                    colOutput.setStyle(el.getAttribute("style"));
                    }

                colInput.setValueExpression("value", colValueExp);
                colOutput.setValueExpression("value", colValueExp);

                ce.getFacets().put("output", colOutput);
                ce.getFacets().put("input", colInput);

                col.getChildren().add(ce);

                }

             else if(el.getName().equals("COMBOLIST")){
                if(el.getAttribute("edit","false").equals("true")){
                //log.info("Found EDITABLE field: " + el.getAttribute("title"));

                CellEditor ce = new CellEditor();

                //combolist test
                SelectOneMenu cmblist = new SelectOneMenu();
                cmblist.setId("cmblist" + "_" + el.getValue());

                List data = el.getElements();
                List items = new ArrayList();

                for(XMLElement dt : data) {
                        if(dt.getName().equals("DATA")){    //HAS TO BE A DATA
                        items.add(new SelectItem(dt.getAttribute("key","-1"), dt.getValue()));
                            }//end if DATA
                        }

                UISelectItems selectItems = new UISelectItems();
                selectItems.setValue(items);
                selectItems.setId("si" + "_" + el.getValue());
                cmblist.getChildren().add(selectItems);
                //end test

                ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);

                HtmlOutputText colOutput = new HtmlOutputText();//(HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
                //InputText colInput = new InputText();//(InputText)application.createComponent(InputText.COMPONENT_TYPE);
                SelectOneMenu colInput = cmblist;

                colInput.setValueExpression("value", colValueExp);
                colOutput.setValueExpression("value", colValueExp);

                //log.info("colInput value=" + colInput.getValue());
                //log.info("colOutput value=" + colOutput.getValue());

                ce.getFacets().put("output", colOutput);
                ce.getFacets().put("input", colInput);

                col.getChildren().add(ce);
                }
            else{        //normal processing
                  ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);
                  HtmlOutputText colOutput = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
                  colOutput.setValueExpression("value", colValueExp);
                  col.getChildren().add(colOutput);
                  }
                }
             else if(el.getName().equals("GRIDFORM")){
                childgrid = el;
                }
             else if(el.getName().equals("JASPER")){
                Button jreport = new Button();

                jreport.setValue("Download");
                 ValueExpression hrefValueExp = FacesAccessor.createValueExpression(elc, "report?jasper=" + el.getAttribute("jasper","jasper") + "&pdfname=" + el.getAttribute("pdfname","Report") + "&filterid=#{item[0]}", String.class);
                jreport.setValueExpression("href", hrefValueExp);
                jreport.setTitle(el.getAttribute("tooltip","Click to view"));

                col.getChildren().add(jreport);

                }
             else if(el.getName().equals("CHECKBOX")){

            if(el.getAttribute("edit","false").equals("true")){

                CellEditor ce = new CellEditor();

                ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);

                HtmlOutputText colOutput = new HtmlOutputText();//(HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
                SelectBooleanCheckbox colInput = new SelectBooleanCheckbox();//(InputText)application.createComponent(InputText.COMPONENT_TYPE);

                colInput.setValueExpression("value", colValueExp);
                colOutput.setValueExpression("value", colValueExp);

                ce.getFacets().put("output", colOutput);
                ce.getFacets().put("input", colInput);

                col.getChildren().add(ce);

                }
                else{
                ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{item[" + colIndex + "]}", Object.class);
                HtmlOutputText colOutput = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
                colOutput.setValueExpression("value", colValueExp);
                col.getChildren().add(colOutput);
                }
                }
            else if(el.getName().equals("IMAGE")){

                GraphicImage colOutput = (GraphicImage)application.createComponent(GraphicImage.COMPONENT_TYPE);

                colOutput.setHeight(el.getAttribute("h","50"));
                colOutput.setWidth(el.getAttribute("w","50"));
                colOutput.setAlt("No Photo");

                ValueExpression colValueExp = FacesAccessor.createValueExpression(elc, "#{imageBean.getImageBytes(\"select " + el.getValue() + " from " + pg.getAttribute("table","table") + " where " + pg.getAttribute("keyfield","kf") + " = ?\")}", DefaultStreamedContent.class);

                UIParameter param = new UIParameter();
                param.setName("pk");
                param.setValueExpression("value",FacesAccessor.createValueExpression(elc, "#{item[0]}", String.class));    //this is OK coz pk is always at index 0

                //default image in case of missing photo ?
                UIParameter missing = new UIParameter();
                missing.setName("missing");
                missing.setValue("missing1.jpg");

                colOutput.getChildren().add(param);
                colOutput.getChildren().add(missing);

                FacesContext context = FacesContext.getCurrentInstance();

                if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
                log.info("at RENDER RESPONSE");
                //colOutput.setValue(new DefaultStreamedContent());
                }
                else{
                colOutput.setValueExpression("value", colValueExp);
                }
                col.getChildren().add(colOutput);
              }
            else if(el.getName().equals("DATATABLE")){

                 ValueExpression nestValueExp = FacesAccessor.createValueExpression(elc, el.getAttribute("wheresql") + "= #{item[0]}", String.class);

                //ValueExpression wVE = FacesAccessor.createValueExpression(elc, "#{item[0]}", String.class);

                //el.removeAttribute("wheresql")
                //el.setAttribute("wheresql", (pg.getAttribute("keyfield") + "=5"));
                //el.setAttribute("wheresql", (innerTable.getAlt() + " " + wVE));
                //log.info("nesting link: " + el.getAttribute("wheresql"));


                //NESTED DATATABLEs SEEM technicaly INFEASIBLE !!!!!!!
                DataTable innerTable = createDataTable(el, getDs(), -1, _orgId, _superUser);
                innerTable.setValueExpression("emptyMessage",nestValueExp);

                //log.info("INNER TABLE emptyMessage = " + innerTable.getEmptyMessage());

                col.getChildren().add(innerTable);
                }

            colIndex++;

            if(el.getAttribute("visible","true").equals("false"))
              col.setRendered(false);

            }

        //if(pg.getAttribute("toggler","false").equals("true")){
        if(childgrid != null){
            //log.info("CREATING ROWEXPANSION...");
            RowExpansion expCol = (RowExpansion) application.createComponent(RowExpansion.COMPONENT_TYPE);
            expCol.setId("xpcol" + pg.getAttribute("key"));


            HtmlPanelGrid xGrid = buildGridForm(childgrid,model,getDs(), new HashMap(), _userId, _orgId);
            //HtmlPanelGrid xGrid = buildGridForm(childgrid,true);

            expCol.getChildren().add(xGrid);
            table.getChildren().add(expCol);
            }

          //if(pg.getAttribute("roweditor","false").equals("true")){
          if(!pg.getAttribute("updatetable","").equals("")){
            //Testing row editor
            Column rowCol = (Column) application.createComponent(Column.COMPONENT_TYPE);
            RowEditor re = new RowEditor();
            rowCol.getChildren().add(re);
            table.getChildren().add(rowCol);
            }

          if(group){
          SummaryRow sRow = new SummaryRow();
          sRow.setId("sr" + table.getId());

          MethodExpression MESummary = FacesAccessor.createMethodExpression("#{eventManager.summaryRowSum}",String.class, String.class);
          sRow.setListener(MESummary);

          Column col1 = (Column)application.createComponent(Column.COMPONENT_TYPE);
          //col1.setColspan(2);
          col1.setColspan(Integer.parseInt(pg.getAttribute("colspan","2")));
          col1.setStyle("text-align:right");

          HtmlOutputText sumLabel = new HtmlOutputText();    //summary label
          //sumLabel.setValue("Summary");
          sumLabel.setValue(pg.getAttribute("group").split(":")[2]);

          col1.getChildren().add(sumLabel);

          Column col2 = (Column)application.createComponent(Column.COMPONENT_TYPE);
          //ValueExpression valExp = FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + parentModel.getDataIndex(pg.getAttribute("group").split(":")[1]) + "]}", Object.class);
          //ValueExpression valExp = FacesAccessor.createValueExpression(elc, "#{eventManager.currentRow[" + model.getDataIndex(pg.getAttribute("group").split(":")[1]) + "]}", Object.class);

          ValueExpression valExp = FacesAccessor.createValueExpression(elc, "#{eventManager.summary}", Object.class);

          HtmlOutputText sumValue = new HtmlOutputText();
          sumValue.setValueExpression("value", valExp);
          col2.getChildren().add(sumValue);

          //now add the columns to the summary row
          sRow.getChildren().add(col1);
          sRow.getChildren().add(col2);

          table.getChildren().add(sRow);
          }

    return table;
    }