/**
   * Handles the button pressed event on the filter criteria. Move the items between the lists based
   * on the selection and but button pressed.
   */
  private void buttonPressed(int buttonId) {
    String[] items = {};
    switch (buttonId) {
      case ADD_TO_ID:
        items = filterList.getSelection();
        for (int i = 0; i < items.length; i++) {
          filters.add(items[i]);
          filterList.remove(items[i]);
        }
        addTo.setEnabled(false);
        break;
      case REMOVE_FROM_ID:
        items = filters.getSelection();
        for (int i = 0; i < items.length; i++) {
          filterList.add(items[i]);
          filters.remove(items[i]);
        }
        removeFrom.setEnabled(false);
        break;
      case ADD_ALL_TO_ID:
        items = filterList.getItems();
        for (int i = 0; i < items.length; i++) {
          filters.add(items[i]);
          filterList.remove(items[i]);
        }
        break;
      case REMOVE_ALL_FROM_ID:
        items = filters.getItems();
        for (int i = 0; i < items.length; i++) {
          filters.remove(items[i]);
          filterList.add(items[i]);
        }
        break;
    }
    updateFilteringKeysFromControls();
    if (pageType == CHILD_PAGE) {
      refreshList();
    } else if (pageType == ROOT_PAGE) {
      PreferenceManager preferenceManager =
          ((SortFilterDialog) getContainer()).getPreferenceManager();
      Iterator nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER).iterator();
      while (nodes.hasNext()) {
        PreferenceNode node = (PreferenceNode) nodes.next();
        SortFilterPage page = (SortFilterPage) node.getPage();
        if (page == this) {
          continue;
        }

        if (Arrays.equals(filterStrings, page.getFilterList())) {
          page._filteringKeys = new ArrayList(_filteringKeys.size());
          page._filteringKeys.addAll(_filteringKeys);
          page._filtering = _filtering;
          page.populateFilterLists();
          page.refreshList();
          page.updateApplyButton();
        }
      }
    }
    updateApplyButton();
  }
  @Override
  public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
    if ("nature".equalsIgnoreCase(property)) {
      IProject obj = (IProject) receiver;
      try {
        return obj.getNature(WAProjectNature.NATURE_ID) != null;
      } catch (CoreException e) {
        return false;
      }
    } else if ("isSubscriptionPerfNode".equalsIgnoreCase(property)
        && receiver instanceof PreferenceNode) {
      PreferenceNode node = (PreferenceNode) receiver;

      if (node.getId().equalsIgnoreCase(Messages.credentialsPageId)) return true;
    }

    return false;
  }
  /**
   * Method creates tree structure of windows azure property pages. and opens property dialog with
   * desired property page selected & active.
   *
   * @param windowsAzureRole : worker role
   * @param pageToDisplay : property page Id which should be active after opening dialog
   * @return integer
   */
  public static int openRolePropertyDialog(
      WindowsAzureRole windowsAzureRole, String pageToDisplay) {
    int retVal = Window.CANCEL; // value corresponding to cancel
    try {
      // Node creation
      PreferenceNode nodeGeneral =
          new PreferenceNode(
              Messages.cmhIdGeneral, Messages.cmhLblGeneral, null, WARGeneral.class.toString());
      nodeGeneral.setPage(new WARGeneral());
      nodeGeneral.getPage().setTitle(Messages.cmhLblGeneral);

      PreferenceNode nodeCache =
          new PreferenceNode(
              Messages.cmhIdCach, Messages.cmhLblCach, null, WARCaching.class.toString());
      nodeCache.setPage(new WARCaching());
      nodeCache.getPage().setTitle(Messages.cmhLblCach);

      PreferenceNode nodeCmpnts =
          new PreferenceNode(
              Messages.cmhIdCmpnts, Messages.cmhLblCmpnts, null, WARComponents.class.toString());
      nodeCmpnts.setPage(new WARComponents());
      nodeCmpnts.getPage().setTitle(Messages.cmhLblCmpnts);

      PreferenceNode nodeDebugging =
          new PreferenceNode(
              Messages.cmhIdDbg, Messages.cmhLblDbg, null, WARDebugging.class.toString());
      nodeDebugging.setPage(new WARDebugging());
      nodeDebugging.getPage().setTitle(Messages.cmhLblDbg);

      PreferenceNode nodeEndPts =
          new PreferenceNode(
              Messages.cmhIdEndPts, Messages.cmhLblEndPts, null, WAREndpoints.class.toString());
      nodeEndPts.setPage(new WAREndpoints());
      nodeEndPts.getPage().setTitle(Messages.cmhLblEndPts);

      PreferenceNode nodeEnvVars =
          new PreferenceNode(
              Messages.cmhIdEnvVars, Messages.cmhLblEnvVars, null, WAREnvVars.class.toString());
      nodeEnvVars.setPage(new WAREnvVars());
      nodeEnvVars.getPage().setTitle(Messages.cmhLblEnvVars);

      PreferenceNode nodeLdBlnc =
          new PreferenceNode(
              Messages.cmhIdLdBlnc, Messages.cmhLblLdBlnc, null, WARLoadBalance.class.toString());
      nodeLdBlnc.setPage(new WARLoadBalance());
      nodeLdBlnc.getPage().setTitle(Messages.cmhLblLdBlnc);

      PreferenceNode nodeLclStg =
          new PreferenceNode(
              Messages.cmhIdLclStg, Messages.cmhLblLclStg, null, WARLocalStorage.class.toString());
      nodeLclStg.setPage(new WARLocalStorage());
      nodeLclStg.getPage().setTitle(Messages.cmhLblLclStg);

      PreferenceNode nodeSrvCnfg =
          new PreferenceNode(
              Messages.cmhIdSrvCnfg,
              Messages.cmhLblSrvCnfg,
              null,
              WAServerConfiguration.class.toString());
      nodeSrvCnfg.setPage(new WAServerConfiguration());
      nodeSrvCnfg.getPage().setTitle(Messages.cmhLblSrvCnfg);

      /*
       * Tree structure creation.
       * Don't change order while adding nodes.
       * Its the default alphabetical order given by eclipse.
       */
      nodeGeneral.add(nodeCache);
      nodeGeneral.add(nodeCmpnts);
      nodeGeneral.add(nodeDebugging);
      nodeGeneral.add(nodeEndPts);
      nodeGeneral.add(nodeEnvVars);
      nodeGeneral.add(nodeLdBlnc);
      nodeGeneral.add(nodeLclStg);
      nodeGeneral.add(nodeSrvCnfg);

      PreferenceManager mgr = new PreferenceManager();
      mgr.addToRoot(nodeGeneral);
      // Dialog creation
      PreferenceDialog dialog =
          new PreferenceDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), mgr);
      // make desired property page active.
      dialog.setSelectedNode(pageToDisplay);
      dialog.create();
      String dlgTitle = String.format(Messages.cmhPropFor, windowsAzureRole.getName());
      dialog.getShell().setText(dlgTitle);
      dialog.open();
      // return whether user has pressed OK or Cancel button
      retVal = dialog.getReturnCode();
    } catch (Exception ex) {
      PluginUtil.displayErrorDialogAndLog(
          new Shell(), Messages.rolsDlgErr, Messages.rolsDlgErrMsg, ex);
    }
    return retVal;
  }