package mypackage;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.Application;
import javax.faces.component.UIColumn;
import javax.faces.component.UIOutput;
import javax.faces.component.html.HtmlCommandLink;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
import javax.faces.event.ActionEvent;
public class MyBean {
    
    private List<List<String>> myList;
    
    private List<List<String>> myHeader;
    
    private List<List<Integer>> myNum;
    
    private HtmlDataTable dynamicDataTable;
    
    private HtmlDataTable headerDataTable;
    
    private HtmlDataTable numDataTable;
    
    private static int tempWidth = 30;
    // Load Data from DataBase to Every DataTable --------------------------------
    public void loadMyList() throws Exception {
        myList = new ArrayList<List<String>>();
        
        int row = 25;
        
        while(row > 0) {  
            
            int column = 25;
            
            String str = "o";
            
            List <String> tmpvector = new ArrayList <String> ();
            
            while(column > 0) {
                
                tmpvector.add(str);
                
                column--;
            }
            row--;
            
            myList.add(tmpvector);
        }
    }
    
    public void loadMyHeader() throws Exception {
        myHeader = new ArrayList<List<String>>();
        String str = "*****";
        
        int column = 25;
        
        List <String> tmpvector = new ArrayList <String> ();
        
        while(column > 0) {
            tmpvector.add(str);
            
            column--;
        }
        myHeader.add(tmpvector);
    }
    
    public void loadMyNum() throws Exception {
        myNum = new ArrayList<List<Integer>>();
        
        int row = 0;
        
        while(row < 25) {  
                
            List <Integer> tmpvector = new ArrayList <Integer> ();
            tmpvector.add(row);
            
            myNum.add(tmpvector);
            
            row++;
        }
    }
    
    //initialize Every DataTable to the Front-------------------------------------
    public void populateDynamicDataTable() {
        if (myList != null && myList.size() > 0) {
            
            dynamicDataTable = new HtmlDataTable();
            
            int columns = ((List) myList.get(0)).size();
            System.out.println("DisplayCloumn:   " + columns);//
            
            for (int i = 0; i < columns; i++) {             
                ValueBinding myItem = 
            FacesContext.getCurrentInstance().getApplication().createValueBinding("#{myItem[" + i + "]}");              
                
                UIColumn column = new UIColumn();
                
                HtmlOutputText outputText = new HtmlOutputText();
                
                outputText.setValueBinding("value", myItem);
                outputText.setStyle("width: " + tempWidth + "");
                
                column.getChildren().add(outputText);
                
              column.setId("col_" + i);  //You should set ID of every component which you create in the Backing-Bean .
                
                dynamicDataTable.getChildren().add(column);
            }
        }
    }
    
    public void populateHeaderDataTable() {
        
        if (myHeader != null && myHeader.size() > 0) {
            
            headerDataTable = new HtmlDataTable();
            
            int columns = ((List) myHeader.get(0)).size();    
            
            FacesContext facesContext = FacesContext.getCurrentInstance();
            
            Application application = facesContext.getApplication();
            
            for (int i = 0; i < columns; i++) {
            
                HtmlCommandLink commandLink =
                 (HtmlCommandLink) application.createComponent(HtmlCommandLink.COMPONENT_TYPE);
                
                String valueBindingExpression = "#{myHeader[" + i + "]}";                    
                ValueBinding valueBinding = application.createValueBinding(valueBindingExpression);                 
                commandLink.setValueBinding("value", valueBinding);        
                
   commandLink.setId("head_comankLink_" + i);//The most important!!! If you dont put it nothing is gonna happen.
 
                
                commandLink.setStyle("color: blue");
                
                commandLink.setStyle("width: " + tempWidth + "");        
                
                commandLink.getAttributes();
                Class[] params = { ActionEvent.class };                
                MethodBinding actionListener = 
                  application.createMethodBinding("#{myBean.setSelectedDocumentId}", params);                
                commandLink.setActionListener(actionListener);
                commandLink.setImmediate(true); 
                UIColumn column = new UIColumn();                
                column.getChildren().add(commandLink);
                column.setId("head_" + i);
                headerDataTable.getChildren().add(column);       
            }
        }
    }
    
    public void populateNumDataTable() {
        
        if (myNum != null && myNum.size() > 0) {
            
            numDataTable = new HtmlDataTable();
            UIOutput output = new UIOutput();
            
            ValueBinding myItem =
              FacesContext.getCurrentInstance().getApplication().createValueBinding("#{myNum[0]}");
            
            output.setValueBinding("value", myItem);
            
            // Set column.
            UIColumn column = new UIColumn();
            column.getChildren().add(output);
            column.setId("num");
            
            numDataTable.getChildren().add(column);
        }
    }
   
    //Test Actions and ActionListeners--------------------------------------------
    public void setSelectedDocumentId(ActionEvent event) throws Exception 
    {
    }
    // Getters -------------------------------------------------------------------
    public HtmlDataTable getDynamicDataTable() throws Exception {
        if (dynamicDataTable == null) {
            
            loadMyList(); // Reload to get most recent data.
            
            populateDynamicDataTable();
        }
        return dynamicDataTable;
    }
    
    public HtmlDataTable getHeaderDataTable() throws Exception {
        if (headerDataTable == null) {
            
            loadMyHeader(); // Reload to get most recent data.
            
            populateHeaderDataTable();
        }
        return headerDataTable;
    }
    public HtmlDataTable getNumDataTable() throws Exception {
        if (numDataTable == null) {
            
            loadMyNum(); // Reload to get most recent data.
            
            populateNumDataTable();
        }
        return numDataTable;
    }
    
    public List<List<Integer>> getMyNum() {
        return myNum;
    }
    
    public List<List<String>> getMyHeader() {
        return myHeader;
    }
    
    public List<List<String>> getMyList() {
        return myList;
    }
    // Setters -------------------------------------------------------------------
    public void setDynamicDataTable(HtmlDataTable dynamicDataTable) {
        this.dynamicDataTable = dynamicDataTable;
    }
    public void setHeaderDataTable(HtmlDataTable headerDataTable) {
        this.headerDataTable = headerDataTable;
    }
    public void setMyHeader(List<List<String>> myHeader) {
        this.myHeader = myHeader;
    }
    
    public void setNumDataTable(HtmlDataTable numDataTable) {
        this.numDataTable = numDataTable;
    }
    
    public void setMyNum(List<List<Integer>> myNum) {
        this.myNum = myNum;
    }
    public void setMyList(List<List<String>> myList) {
        this.myList = myList;
    }
}