In the last post, We have seen how to display filter the data when user types the first few characters. Now if we remember the UI , we have a text box in the Top of the List and also there is check box to filter the active/inactive records .
Before that, if you want familiar with Check box events, please refer this post
Here is the Modified ZUL File
<?page title="Practice List" contentType="text/html;charset=UTF-8"?>
<zk>
<window title="Practice List" border="normal" sclass="listingwindow"
        apply="myproject.UI.PracticeListController">
<div>
            <button label="Add Practice" />
</div>
<separator />
        <groupbox height="40px">
            <label value="Practice Name" />
<space />
<space />
<textbox id="practicefilter" cols="50" />
<button id="gobutton" label="Go" />
            <space spacing="20px" />
<checkbox id="activechk" label="Show only active" checked="true"/>
            <space spacing="20px" />
</groupbox>
<separator />
        <listbox id="PracticeList">
            <listhead sizable="true">
<listheader label="Practice Name" sort="auto" />
<listheader label="City" sort="auto" />
<listheader label="State" sort="auto" />
<listheader label="Zip Code" sort="auto" />
</listhead>
</listbox>
</window>
</zk>
Here is the Controller File
package myproject.UI;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.InputEvent;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Checkbox;
import org.zkoss.zk.ui.event.Event;
import mydomain.*;
@SuppressWarnings("rawtypes")
public class PracticeListController extends GenericForwardComposer {
    /**
     * 
     */
private static final long serialVersionUID = 1L;
    private Listbox PracticeList;
    private PracticeDAO practicedao;
    private Checkbox activechk;
    @SuppressWarnings({ "unchecked" })
public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        PracticeList.setItemRenderer(new ListitemRenderer() {
@Override
public void render(Listitem item, Object arg1, int arg2)
                    throws Exception {
practice value = (practice) arg1;
                item.appendChild(new Listcell(value.getPracticeName()));
                item.appendChild(new Listcell(value.getCity()));
                item.appendChild(new Listcell(value.getState()));
                item.appendChild(new Listcell(value.getZipCode()));
item.setValue(value);
}
});
        practicedao = new PracticeDAO();
        PracticeList.setModel(new ListModelList(practicedao.getAll()));
}
    @SuppressWarnings("unchecked")
public void onChanging$practicefilter(InputEvent event) {
practicedao.setFilter(event.getValue());
PracticeList.getItems().clear();
        PracticeList.setModel(new ListModelList(practicedao.getFilteredPractices()));
}
    @SuppressWarnings("unchecked")
public void onCheck$activechk(Event event) {
practicedao.setActiveFlag(activechk.isChecked());
PracticeList.getItems().clear();
        PracticeList.setModel(new ListModelList(practicedao.getFilteredPractices()));
}
}
Here is the Java POJO Class
package mydomain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "practice")
public class practice {
    private String PRACTICE_NAME;
    private String CITY;
    private String STATE_PROVINCE_GEO;
    private String POSTAL_CODE;
private int Practice_ID;
    private Integer IS_ACTIVE;
@Id
@GeneratedValue
public int getPractice_ID() {
        return Practice_ID;
}
public void setPractice_ID(int practice_ID) {
Practice_ID = practice_ID;
}
    @Column(name = "PRACTICE_NAME")
    public String getPracticeName() {
        return PRACTICE_NAME;
}
    @Column(name = "PRACTICE_NAME")
public void setPracticeName(String pRACTICE_NAME) {
PRACTICE_NAME = pRACTICE_NAME;
}
    @Column(name = "CITY")
    public String getCity() {
        return CITY;
}
public void setCity(String cITY) {
CITY = cITY;
}
    @Column(name = "STATE_PROVINCE_GEO")
    public String getState() {
        return STATE_PROVINCE_GEO;
}
    @Column(name = "STATE_PROVINCE_GEO")
public void setState(String sTATE_PROVINCE_GEO) {
STATE_PROVINCE_GEO = sTATE_PROVINCE_GEO;
}
    @Column(name = "POSTAL_CODE")
    public String getZipCode() {
        return POSTAL_CODE;
}
    @Column(name = "POSTAL_CODE")
public void setZipCode(String pOSTAL_CODE) {
POSTAL_CODE = pOSTAL_CODE;
}
    @Column(name = "IS_ACTIVE")
    public Integer getisActive() {
        if (IS_ACTIVE == null)
            return 1;
        else
            return IS_ACTIVE;
}
public void setisActive(Integer isActive) {
        this.IS_ACTIVE = isActive;
}
}
Here is the DAO Class
package mydomain;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.Query;
import java.util.ArrayList;
import HibernateUtilities.HibernateUtil;
public class PracticeDAO {
    private String filter;
private boolean activeFlag;
List<practice> allrecords = null;
public void setFilter(String filter) {
        this.filter = filter;
}
public void setActiveFlag(boolean flg) {
        this.activeFlag = flg;
}
    public List<practice> getFilteredPractices() {
        List<practice> filteredPractices = new ArrayList<practice>();
        /* if no filter characters and check box is un checked. Then get all */
        /* 0 and 0 */
if ((filter == null || "".equals(filter)) && (activeFlag == false))
        {
filteredPractices.addAll(allrecords);
}
        /* if there are filter characters and check box is un checked. Then get filtered by filter text */
        /* 1 and 0 */
if ((filter != null && !filter.equals("")) && (activeFlag == false))
        {
            for (practice item : allrecords) 
            {
                if (item.getPracticeName().toLowerCase().indexOf(filter.toLowerCase()) == 0)
filteredPractices.add(item);
}
}
        /* if no filter characters and check box is  checked. Then get only active practices */
        /* 0 and 1 */
if ((filter == null || "".equals(filter)) && (activeFlag == true))
        {
            for (practice item : allrecords) 
            {
                if (item.getisActive() == 1)
filteredPractices.add(item);
}
}
        /* Both Contains values i.e filter contains some text and check box is checked  */
        /* 1 and 1 */
if ((filter != null && !filter.equals("")) && (activeFlag == true))
        {
            for (practice item : allrecords) 
            {
                if (item.getPracticeName().toLowerCase().indexOf(filter.toLowerCase()) == 0) 
                    if (item.getisActive() == 1) 
filteredPractices.add(item);
}
}
        return filteredPractices;
}
    @SuppressWarnings("rawtypes")
    public List getAll() {
Transaction trns = null;
Session session = HibernateUtil.getSessionFactory().openSession();
        try {
trns = session.beginTransaction();
            Query q1 = session.createQuery("from practice");
allrecords = q1.list();
            /*
            for (int i = 0; i < allrecords.size(); i++) {
                practice pt = (practice) allrecords.get(i);
                System.out.println(pt.getisActive().toString());
            }
            */
session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
trns.rollback();
}
e.printStackTrace();
        } finally {
session.flush();
session.close();
}
        this.activeFlag = true;
        return getFilteredPractices();
}
}