private void displayTasks() {
    if (this.criteria == null) {
      final TaskSearchCriteria criteria = new TaskSearchCriteria();
      criteria.setProjectid(new NumberSearchField(CurrentProjectVariables.getProjectId()));
      criteria.setTaskListId(new NumberSearchField(this.taskList.getId()));
      criteria.setStatuses(
          new SetSearchField<String>(SearchField.AND, new String[] {"Open", "Pending"}));
      this.criteria = criteria;
    }

    this.taskDisplay.setSearchCriteria(this.criteria);

    // Update tasklist progress and number of open task/all task
    if (this.taskNumberLbl != null) {
      this.taskNumberLbl.setValue(
          "("
              + (this.taskList.getNumOpenTasks() + 1)
              + "/"
              + (this.taskList.getNumAllTasks() + 1)
              + ")");
    }

    final int newAllTasks = this.taskList.getNumAllTasks() + 1;
    final double newProgressTask =
        (this.taskList.getPercentageComplete() * this.taskList.getNumAllTasks()) / newAllTasks;
    if (this.taskListProgress != null) {
      this.taskListProgress.setValue(newProgressTask + "");
    }
  }
  private void queryAndDisplayTasks() {
    wrapBody.removeAllComponents();

    if (GROUP_DUE_DATE.equals(groupByState)) {
      baseCriteria.setOrderFields(
          Arrays.asList(new SearchCriteria.OrderField("deadline", sortDirection)));
      taskGroupOrderComponent = new DueDateOrderComponent();
    } else if (GROUP_START_DATE.equals(groupByState)) {
      baseCriteria.setOrderFields(
          Arrays.asList(new SearchCriteria.OrderField("startdate", sortDirection)));
      taskGroupOrderComponent = new StartDateOrderComponent();
    } else if (PLAIN_LIST.equals(groupByState)) {
      baseCriteria.setOrderFields(
          Arrays.asList(new SearchCriteria.OrderField("lastupdatedtime", sortDirection)));
      taskGroupOrderComponent = new SimpleListOrderComponent();
    } else {
      throw new MyCollabException("Do not support group view by " + groupByState);
    }
    wrapBody.addComponent(taskGroupOrderComponent);
    final ProjectTaskService projectTaskService =
        ApplicationContextUtil.getSpringBean(ProjectTaskService.class);
    int totalTasks = projectTaskService.getTotalCount(baseCriteria);
    taskSearchPanel.setTotalCountNumber(totalTasks);
    currentPage = 0;
    int pages = totalTasks / 20;
    if (currentPage < pages) {
      Button moreBtn =
          new Button(
              "More",
              new Button.ClickListener() {
                @Override
                public void buttonClick(ClickEvent clickEvent) {
                  int totalTasks = projectTaskService.getTotalCount(baseCriteria);
                  int pages = totalTasks / 20;
                  currentPage++;
                  List<SimpleTask> otherTasks =
                      projectTaskService.findPagableListByCriteria(
                          new SearchRequest<>(baseCriteria, currentPage + 1, 20));
                  taskGroupOrderComponent.insertTasks(otherTasks);
                  if (currentPage == pages) {
                    wrapBody.removeComponent(wrapBody.getComponent(1));
                  }
                }
              });
      moreBtn.addStyleName(UIConstants.THEME_GREEN_LINK);
      wrapBody.addComponent(moreBtn);
    }
    List<SimpleTask> tasks =
        projectTaskService.findPagableListByCriteria(
            new SearchRequest<>(baseCriteria, currentPage + 1, 20));
    taskGroupOrderComponent.insertTasks(tasks);
  }
  @Override
  protected void displayView() {
    constructUI();
    baseCriteria = new TaskSearchCriteria();
    baseCriteria.setProjectid(new NumberSearchField(CurrentProjectVariables.getProjectId()));
    OptionValService optionValService =
        ApplicationContextUtil.getSpringBean(OptionValService.class);
    List<OptionVal> options =
        optionValService.findOptionValsExcludeClosed(
            ProjectTypeConstants.TASK,
            CurrentProjectVariables.getProjectId(),
            AppContext.getAccountId());

    SetSearchField<String> statuses = new SetSearchField<>();
    for (OptionVal option : options) {
      statuses.addValue(option.getTypeval());
    }
    baseCriteria.setStatuses(statuses);
    statisticSearchCriteria = BeanUtility.deepClone(baseCriteria);
    queryAndDisplayTasks();
    displayTaskStatistic();
  }