public int compare(Object o1, Object o2) {
          if (sorting_column == -1) return 0;
          if ((o1 instanceof ITask) == false) return 0;
          if ((o2 instanceof ITask) == false) return 0;

          ITask task1 = (ITask) o1;
          ITask task2 = (ITask) o2;

          // based on TaskTableModel.columnNames
          switch (sorting_column) {
            case 1:
              return task1.getText().compareTo(task2.getText());
            case 2:
              return task1.getStartDate().getDate().compareTo(task2.getStartDate().getDate());
            case 3:
              return task1.getEndDate().getDate().compareTo(task2.getEndDate().getDate());
            case 0: // task priority, same as 4
            case 4:
              return task1.getPriority() - task2.getPriority();
            case 5:
              return task1.getStatus(CurrentDate.get()) - task2.getStatus(CurrentDate.get());
            case 6:
              return task1.getProgress() - task2.getProgress();
          }

          return 0;
        }
  public Object getChild(Object parent, int index) {
    Collection c = null;

    if (parent instanceof IProject) {
      if (activeOnly()) c = CurrentProject.getTaskList().getActiveSubTasks(null, CurrentDate.get());
      else c = CurrentProject.getTaskList().getTopLevelTasks();
    } else {
      ITask t = (ITask) parent;
      if (activeOnly())
        c = CurrentProject.getTaskList().getActiveSubTasks(t.getID(), CurrentDate.get());
      else c = t.getSubTasks();
    }

    Object array[] = c.toArray();
    Arrays.sort(array, comparator);
    if (opposite) {
      return array[array.length - index - 1];
    }
    return array[index];
  }