@Override
 public void fillContextMenu(IMenuManager menu) {
   // MOD mzhao user readonly role on svn repository mode.
   if (!isShowMenu()) {
     return;
   }
   TreeSelection treeSelection = ((TreeSelection) this.getContext().getSelection());
   if (!treeSelection.isEmpty()) {
     Iterator iterator = treeSelection.iterator();
     while (iterator.hasNext()) {
       Object obj = iterator.next();
       if (obj instanceof ReportAnalysisRepNode) {
         ReportAnalysisRepNode repAnaNode = (ReportAnalysisRepNode) obj;
         TDQReportItem reportItem = repAnaNode.getReportItem();
         if (CorePlugin.getDefault().itemIsOpening(reportItem, false)) {
           // if the report's editor is opening, don't show the menu
           return;
         }
       } else {
         // if include other type node, don't show the menu
         return;
       }
     }
   }
   // show the menu
   menu.add(new RemoveAnalysisAction());
 }
  private String getOperationType(TreeSelection selection) {
    String operation = null;

    for (Iterator<?> i = selection.iterator(); i.hasNext(); ) {
      String tmpOperation = null;
      Object next = i.next();
      if (next instanceof GitModelWorkingFile) tmpOperation = STAGE_OP;
      else if (next instanceof GitModelCacheFile) tmpOperation = UNSTAGE_OP;
      else if (next instanceof GitModelCacheTree) {
        if (((GitModelCacheTree) next).isWorkingTree()) tmpOperation = STAGE_OP;
        else tmpOperation = UNSTAGE_OP;
      } else {
        operation = UNSUPPORTED_OP;
        break;
      }

      if (operation == null) operation = tmpOperation;
      else if (!operation.equals(tmpOperation)) {
        operation = UNSUPPORTED_OP;
        break;
      }
    }

    return operation;
  }
  /*
   * (non-Javadoc)
   *
   * @see org.talend.designer.fileoutputxml.ui.footer.AbstractTreeNodeButton#updateButtonStatus()
   */
  @Override
  protected void updateStatus(TreeSelection selection) {
    if (selection.isEmpty()) {
      getButton().setEnabled(false);
      return;
    }
    final TreePath[] paths = selection.getPaths();
    boolean sameSegment = true;
    for (int i = 0; i < paths.length - 1; i++) {
      if (paths[i].getSegmentCount() != paths[i + 1].getSegmentCount()) {
        sameSegment = false;
      }
    }
    if (sameSegment) {
      getButton().setEnabled(true);
    } else {
      getButton().setEnabled(false);
      return;
    }

    // if same segment ,they have the same parent and parent must be an element
    final Element parent = (Element) ((FOXTreeNode) selection.getFirstElement()).getParent();
    if (parent == null) {
      getButton().setEnabled(false);
      return;
    }
    final List<? extends FOXTreeNode> attrChildren = parent.getAttributeChildren();
    final List<? extends FOXTreeNode> nameSpaceChildren = parent.getNameSpaceChildren();
    final List<FOXTreeNode> elementChildren = parent.getElementChildren();
    final Iterator iterator = selection.iterator();
    while (iterator.hasNext()) {
      final Object next = iterator.next();
      if (next instanceof Attribute) {
        if (attrChildren.contains(next) && attrChildren.indexOf(next) == 0) {
          getButton().setEnabled(false);
          return;
        }
      } else if (next instanceof NameSpaceNode) {
        if (nameSpaceChildren.contains(next) && nameSpaceChildren.indexOf(next) == 0) {
          getButton().setEnabled(false);
          return;
        }
      } else if (next instanceof Element) {
        if (elementChildren.contains(next) && elementChildren.indexOf(next) == 0) {
          getButton().setEnabled(false);
          return;
        }
      }
    }
  }
  /*
   * (non-Javadoc)
   *
   * @see org.talend.designer.fileoutputxml.ui.footer.AbstractTreeNodeButton#handleSelectionEvent()
   */
  @Override
  protected void handleSelectionEvent(TreeSelection selection) {
    if (!selection.isEmpty()) {
      final Element parentNode = (Element) ((FOXTreeNode) selection.getFirstElement()).getParent();
      final List<? extends FOXTreeNode> attrChildren = parentNode.getAttributeChildren();
      final List<? extends FOXTreeNode> nameSpaceChildren = parentNode.getNameSpaceChildren();
      final List<FOXTreeNode> elementChildren = parentNode.getElementChildren();
      List<Integer> attrIndices = new ArrayList<Integer>();
      List<Integer> nameSpaceIndices = new ArrayList<Integer>();
      List<Integer> elementIndices = new ArrayList<Integer>();
      final Iterator iterator = selection.iterator();
      while (iterator.hasNext()) {
        final Object next = iterator.next();
        if (next instanceof Attribute) {
          if (attrChildren.contains(next)) {
            attrIndices.add(attrChildren.indexOf(next));
          }
        } else if (next instanceof NameSpaceNode) {
          if (nameSpaceChildren.contains(next)) {
            nameSpaceIndices.add(nameSpaceChildren.indexOf(next));
          }
        } else if (next instanceof Element) {
          if (elementChildren.contains(next)) {
            elementIndices.add(elementChildren.indexOf(next));
          }
        }
      }
      Collections.sort(attrIndices);
      Collections.sort(nameSpaceIndices);
      Collections.sort(elementIndices);

      swapElements(attrChildren, attrIndices);
      swapElements(nameSpaceChildren, nameSpaceIndices);
      swapElements(elementChildren, elementIndices);

      treeViewer.refresh(parentNode);
      treeViewer.expandAll();
      manager.getUiManager().getFoxUI().redrawLinkers();
      treeViewer.setSelection(selection);
    }
  }