public int compare(RowInfoLeaf o1, RowInfoLeaf o2) {
   int compareValue = 0;
   // if either object return null for getPosition(), results are
   // unexpected anyway, so this test will only pass (test only to
   // prevent from crashing)
   if (o1.getPosition() != null && o2.getPosition() != null) {
     compareValue =
         o1.getPosition().compareTo(o2.getPosition()) * -1; // multiply by -1 to invert order
   }
   return compareValue;
 }
  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse
   * .core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
   */
  @Override
  public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {

    /*
     * Remove all selected items
     *
     * Put all array items of some array together to remove in reverse order
     * due to indexing problems.
     */
    Map<RowInfo, TreeSet<RowInfoLeaf>> mapForRemovingArrayItems =
        new HashMap<RowInfo, TreeSet<RowInfoLeaf>>();

    for (RowInfo row : rows) {
      if (row instanceof RowInfoLeaf) {
        RowInfoLeaf leaf = (RowInfoLeaf) row;
        if (leaf.getParent() == null) {
          // string
          getEditor().removeRow(row.getKey());
        } else {
          // array item - accumulate and remove all at once to avoid
          // index problems
          TreeSet<RowInfoLeaf> childrenList = mapForRemovingArrayItems.get(leaf.getParent());
          if (childrenList == null) {
            childrenList = new TreeSet<RowInfoLeaf>(new LeavesInvertedPositionComparator());
            mapForRemovingArrayItems.put(leaf.getParent(), childrenList);
          }
          childrenList.add(leaf);
        }
      } else {
        // array
        getEditor().removeRow(row.getKey());
      }
    }

    if (!mapForRemovingArrayItems.isEmpty()) {
      // remove array items that were accumulated
      for (TreeSet<RowInfoLeaf> childrenList : mapForRemovingArrayItems.values()) {
        for (RowInfoLeaf leaf : childrenList) {
          getEditor().removeRow(leaf.getKey(), leaf.getPosition());
        }
      }
    }

    getEditor().refresh();
    return Status.OK_STATUS;
  }