private void gridChange(Object itemId) {
    Collection<Object> ids = (Collection<Object>) gridFilter.getGrid().getValue();

    Button btnCheck = (Button) commandbar.getButton(COMMAND.CHECK.getValue());
    Button btnFavorite = (Button) commandbar.getButton(COMMAND.POP_MY_FAVORITE.getValue());
    Button btnCompare = (Button) commandbar.getButton(COMMAND.COMPARE.getValue());

    if (ids.size() != 0) {
      btnCompare.setEnabled(true);

      List<Item> selection = gridFilter.getGrid().getSelection();
      // 選擇多筆時, 只有btnCompare有可能Enabeld
      if (selection.size() > 1) {
        menu.setMenuBarEnabled(false);
        btnCheck.setEnabled(false);
        btnFavorite.setEnabled(false);
      } else {
        menu.setMenuBarEnabled(true);
        btnCheck.setEnabled(true);
        btnFavorite.setEnabled(true);
      }
      // 沒選到任何資料時
    } else {
      menu.setMenuBarEnabled(false);
      btnCheck.setEnabled(false);
      btnFavorite.setEnabled(false);
      btnCompare.setEnabled(false);
    }
  }
  private Component buildGrid() {
    VerticalLayout layout = new VerticalLayout();
    layout.setSpacing(true);

    grid.setSizeFull();
    grid.setMultiSelect(true);
    grid.addContainerProperty(
        "candidateUuid", String.class, null, termResource.getTerm("UUID"), null, null);
    grid.setColumnCollapsed("candidateUuid", true);
    grid.addContainerProperty("candStageInterviewerUuid", String.class, null);
    grid.setColumnCollapsed("candStageInterviewerUuid", true);
    grid.addContainerProperty(
        "decision", CodeData.class, null, termResource.getTerm("Decision"), null, null);
    grid.addContainerProperty(
        "name", String.class, null, termResource.getTerm("IA-CANDIDATE"), null, null);
    grid.addContainerProperty(
        "requisition", String.class, null, termResource.getTerm("IA-REQUISITION"), null, null);
    grid.addContainerProperty(
        "location", String.class, null, termResource.getTerm("Location"), null, null);
    grid.addContainerProperty(
        "dueOn", Date.class, null, termResource.getTerm("Due On"), null, null);
    grid.addContainerProperty(
        "degree", CodeData.class, null, termResource.getTerm("Degree"), null, null);
    grid.addContainerProperty(
        "school", String.class, null, termResource.getTerm("School"), null, null);
    grid.addContainerProperty(
        "major", String.class, null, termResource.getTerm("Major"), null, null);
    grid.addContainerProperty(
        "totalWorkExp",
        BigDecimal.class,
        null,
        termResource.getTerm("Years Experience"),
        null,
        Table.ALIGN_RIGHT);
    grid.addContainerProperty(
        "lastJobTitle", String.class, null, termResource.getTerm("Last Job Title"), null, null);
    grid.addContainerProperty(
        "lastEmplyer", String.class, null, termResource.getTerm("Last Employer"), null, null);
    grid.addContainerProperty(
        "source", String.class, null, termResource.getTerm("Source"), null, null);
    grid.addContainerProperty(
        "completeOn", Date.class, null, termResource.getTerm("Complete On"), null, null);
    grid.addContainerProperty(
        "read", Label.class, null, termResource.getTerm("Read"), null, Table.ALIGN_CENTER);
    grid.setColumnWidth("read", 100);
    grid.addContainerProperty("candStageInterviewer", CandStageInterviewer.class, null);
    grid.setColumnCollapsed("candStageInterviewer", true);
    gridFilter.buildCondition();
    grid.addValueChangeListener(
        new Property.ValueChangeListener() {
          public void valueChange(ValueChangeEvent event) {
            gridChange(event.getProperty().getValue());
          }
        });
    gridFilter.setWindowHeight("485px");

    layout.addComponent(gridFilter);

    return layout;
  }
  private void execute() {
    search();
    // from home - find more candidates
    String findDue = (String) data.get("findDue");
    if (FieldUtil.isNotEmpty(findDue)) {

      LOGGER.debug(findDue);
      // 設條件
      DateField dfFrom = (DateField) gridFilter.getField("dueOn" + "_From");
      DateField dfTo = (DateField) gridFilter.getField("dueOn" + "_To");

      if (findDue.equals(CardDonut.MODE_DUE.DUE_TODAY.getValue())) {
        dfFrom.setValue(DateUtil.getOnlyDate(new Date(), timeZone));
        dfTo.setValue(DateUtil.getOnlyDate(new Date(), timeZone));
      } else if (findDue.equals(CardDonut.MODE_DUE.OVERDUE.getValue())) {
        DateTime dt = new DateTime();
        dfTo.setValue(DateUtil.getOnlyDate(dt.minusDays(1).toDate(), timeZone));
      } else if (findDue.equals(CardDonut.MODE_DUE.TOTAL.getValue())) {

      }
      // 清除
      data.put("findDue", null);
      UI.getCurrent().setData(data);

      gridFilter.search();
    }
  }
  private void saveMyFavorite() {
    Item item = vfMyFavorite.getForm().getValues();
    String createId = (String) item.getItemProperty("createIn").getValue();
    String newForder = (String) item.getItemProperty("newFolder").getValue();

    if (FieldUtil.isNotEmpty(createId) && FieldUtil.isNotEmpty(newForder)) {
      Dialog dialog =
          new Dialog(
              Dialog.MODE.VALIDATE,
              messageResource.getMessage(
                  "501014",
                  locale,
                  termResource.getTerm("Create In"),
                  termResource.getTerm("New Folder")));
      return;
    }
    String category;
    if (createId != null) {
      category = createId;
    } else {
      category = newForder;
    }

    List<Item> selection = gridFilter.getGrid().getSelection();
    Item i = selection.get(0);
    String candidateUuid = (String) i.getItemProperty("candidateUuid").getValue();
    Candidate candidate = candidateService.get(candidateUuid);
    CandFavorite candFavorite = new CandFavorite();
    candFavorite.setCandidate(candidate);
    candFavorite.setCategory(category);
    candFavorite.setManager(currentUser);

    try {
      candFavoriteService.save(candFavorite);
    } catch (DuplicateConflictException d) {
      LOGGER.debug("DuplicateConflictException: ", d);
      Dialog dialog = new Dialog(Dialog.MODE.VALIDATE, d.getLocalizedMessage(locale));
      return;
    } catch (ConstraintConflictException c) {
      LOGGER.debug("ConstraintConflictException: ", c);
      Dialog dialog =
          new Dialog(Dialog.MODE.VALIDATE, ViolationUtils.getViolation(c.getViolations(), locale));
      return;
    } catch (OperationFailureException o) {
      LOGGER.error("Exception: ", o);
      Messagebox.hint(messageResource.getMessage("200001"));
      return;
    }
    // success
    Messagebox.info(messageResource.getMessage("100025"));
    closeMyFavorite();
    refresh();
  }
  private void build() {
    layout = new VerticalLayout();
    layout.setSpacing(true);
    layout.addStyleName("padding-20");

    layout.setSizeFull();

    setCompositionRoot(layout);

    // 因為Menu Decision要放grid當作參數 , 所以必須先new
    gridFilter = new GridFilter(GridFilter.MODE.FILTER_IN_WINDOW);
    this.grid = gridFilter.getGrid();

    layout.addComponent(buildButtons());
    layout.addComponent(buildGrid());

    buildWindows();
  }
 public void refresh() {
   search();
   gridFilter.reSearch();
 }
  private void search() {
    gridFilter.reset();

    String localeStr = locale.toString();
    List<Object[]> datasList =
        candStageInterviewerService.findResumeReviewUnprocessByManager(
            currentUser.getUuid(), localeStr);
    // for isRead
    List<String> isReads = candProfileReadService.findCandidateByManager(currentUser.getUuid());

    //		System.out.println(ANSI_PURPLE + "start setGridContent" + ANSI_RESET);
    LOGGER.debug("start ResumeReviewToDoListFinder search");
    long lStartTime = System.nanoTime();

    for (Object[] datas : datasList) {
      long lStartOneTime = System.nanoTime();
      Item newItem = grid.getItem(grid.addItem());

      long lStartUuidTime = System.nanoTime();
      // uuid
      String candidateUuid = (String) datas[0];
      newItem.getItemProperty("candidateUuid").setValue(candidateUuid);
      // candStageInterviewerUuid
      String candStageInterviewerUuid = (String) datas[17];
      newItem.getItemProperty("candStageInterviewerUuid").setValue(candStageInterviewerUuid);
      LOGGER.debug(
          "Start One - candidateUuid: "
              + candidateUuid
              + " candStageInterviewerUuid: "
              + candStageInterviewerUuid);
      // decision
      CodeData codeDataDecision =
          codeDataService.findOneByCodeTypeAndCode("reviewDecision", (String) datas[14], localeStr);
      newItem.getItemProperty("decision").setValue(codeDataDecision);

      newItem.getItemProperty("name").setValue((String) datas[1]);
      newItem.getItemProperty("totalWorkExp").setValue(datas[9]);

      long lEndUuidTime = System.nanoTime();
      long differenceUuid = lEndUuidTime - lStartUuidTime;
      //			System.out.println(ANSI_PURPLE+ "Put uuid name totalWorkExp time: "+candidateUuid+" spend
      // "+differenceUuid/1000000+" ms" + ANSI_RESET);
      LOGGER.debug(
          "Put uuid name totalWorkExp time: "
              + candidateUuid
              + " spend "
              + differenceUuid / 1000000
              + " ms");

      long lStartDegreeTime = System.nanoTime();

      String degreeCode = (String) datas[2];
      CodeData codeDataDegree =
          codeDataService.findOneByCodeTypeAndCode("degree", degreeCode, localeStr);
      if (codeDataDegree != null) {
        newItem.getItemProperty("degree").setValue(codeDataDegree);
      }
      String schoolCode = (String) datas[3];
      if (schoolCode != null) {
        if (!schoolCode.equals(School.TYPE.OTHER.getValue())) {
          School school =
              schoolService.findOneByDegreeAndCodeAndLocale(degreeCode, schoolCode, localeStr);
          if (school != null) {
            newItem.getItemProperty("school").setValue(school.getName());
          }
          // other school
        } else {
          newItem.getItemProperty("school").setValue((String) datas[5]);
        }
      }
      String majorCode = (String) datas[4];
      if (majorCode != null) {
        if (!majorCode.equals(Major.TYPE.OTHER.getValue())) {
          Major major =
              majorService.findOneByDegreeAndCodeAndLocale(degreeCode, majorCode, localeStr);
          if (major != null) {
            newItem.getItemProperty("major").setValue(major.getName());
          }
          // other major
        } else {
          newItem.getItemProperty("major").setValue((String) datas[6]);
        }
      }

      long lEndDegreeTime = System.nanoTime();
      long differenceDegree = lEndDegreeTime - lStartDegreeTime;
      //			System.out.println(ANSI_PURPLE+ "Put degree school major: "+candidateUuid+" spend
      // "+differenceDegree/1000000+" ms" + ANSI_RESET);
      LOGGER.debug(
          "Put degree school major: "
              + candidateUuid
              + " spend "
              + differenceDegree / 1000000
              + " ms");

      long lStartSourceTime = System.nanoTime();

      // years, last job title , source
      newItem.getItemProperty("lastJobTitle").setValue((String) datas[8]);
      newItem.getItemProperty("lastEmplyer").setValue((String) datas[7]);
      newItem.getItemProperty("source").setValue((String) datas[10]);

      long lEndSourceTime = System.nanoTime();
      long differenceSource = lEndSourceTime - lStartSourceTime;
      //			System.out.println(ANSI_PURPLE+ "Put lastJobTitle lastEmplyer source: "+candidateUuid+"
      // spend "+differenceSource/1000000+" ms" + ANSI_RESET);
      LOGGER.debug(
          "Put lastJobTitle lastEmplyer source: "
              + candidateUuid
              + " spend "
              + differenceSource / 1000000
              + " ms");

      long lStartReadTime = System.nanoTime();

      // read
      if (isReads.contains(candidateUuid)) {
        Label lRead = new Label();
        lRead.setSizeUndefined();
        lRead.setContentMode(ContentMode.HTML);
        lRead.setValue(FontAwesome.TAG.getHtml());
        newItem.getItemProperty("read").setValue(lRead);
      }

      long lEndReadTime = System.nanoTime();
      long differenceRead = lEndReadTime - lStartReadTime;
      //			System.out.println(ANSI_PURPLE+ "Put read: "+candidateUuid+" spend
      // "+differenceRead/1000000+" ms" + ANSI_RESET);
      LOGGER.debug("Put read: " + candidateUuid + " spend " + differenceRead / 1000000 + " ms");

      long lStartRequisitionTime = System.nanoTime();

      newItem.getItemProperty("requisition").setValue((String) datas[11]);

      newItem.getItemProperty("location").setValue((String) datas[13]);

      // due on
      newItem.getItemProperty("dueOn").setValue((Date) datas[15]);
      // complete on
      newItem.getItemProperty("completeOn").setValue((Date) datas[16]);

      long lEndRequisitionTime = System.nanoTime();
      long differenceRequisition = lEndRequisitionTime - lStartRequisitionTime;
      //			System.out.println(ANSI_PURPLE+ "Put requisition location dueOn completeOn:
      // "+candidateUuid+" spend "+differenceRequisition/1000000+" ms"+ ANSI_RESET);
      LOGGER.debug(
          "Put requisition location dueOn completeOn: "
              + candidateUuid
              + " spend "
              + differenceRequisition / 1000000
              + " ms");

      long lEndOneTime = System.nanoTime();
      long differenceOne = lEndOneTime - lStartOneTime;
      //			System.out.println(ANSI_PURPLE+"One Item set done: "+candidateUuid+" spend
      // "+differenceOne/1000000+" ms"+ ANSI_RESET);
      LOGGER.debug(
          "One Item set done: " + candidateUuid + " spend " + differenceOne / 1000000 + " ms");

      //
      //	System.out.println(ANSI_PURPLE+"==========================================================="+ ANSI_RESET);
      LOGGER.debug("===========================================================");
    }

    long lEndTime = System.nanoTime();
    long difference = lEndTime - lStartTime;
    //		System.out.println(ANSI_PURPLE+"Complete setGridContent spend "+difference/1000000+" ms"+
    // ANSI_RESET);
    LOGGER.debug("Complete setGridContent spend " + difference / 1000000 + " ms");

    long lStartAdjustTime = System.nanoTime();

    gridFilter.adjust();
    count();

    long lEndAdjustTime = System.nanoTime();
    long differenceAdjust = lEndAdjustTime - lStartAdjustTime;
    //		System.out.println(ANSI_PURPLE+"Adjust Time "+differenceAdjust/1000000+" ms"+ ANSI_RESET);
    LOGGER.debug("Adjust Time " + differenceAdjust / 1000000 + " ms");
  }