private JobTreeElement[] findJobsToRemove(JobTreeElement info) {

    if (info.isJobInfo()) {
      Job myJob = ((JobInfo) info).getJob();

      if (myJob != null) {

        Object prop = myJob.getProperty(ProgressManagerUtil.KEEPONE_PROPERTY);
        if (prop instanceof Boolean && ((Boolean) prop).booleanValue()) {
          ArrayList found = null;
          JobTreeElement[] all;
          synchronized (keptjobinfos) {
            all = (JobTreeElement[]) keptjobinfos.toArray(new JobTreeElement[keptjobinfos.size()]);
          }
          for (int i = 0; i < all.length; i++) {
            JobTreeElement jte = all[i];
            if (jte != info && jte.isJobInfo()) {
              Job job = ((JobInfo) jte).getJob();
              if (job != null && job != myJob && job.belongsTo(myJob)) {
                if (found == null) {
                  found = new ArrayList();
                }
                found.add(jte);
              }
            }
          }
          if (found != null) {
            return (JobTreeElement[]) found.toArray(new JobTreeElement[found.size()]);
          }
        }
      }
    }
    return null;
  }
 static void disposeAction(JobTreeElement jte) {
   if (jte.isJobInfo()) {
     JobInfo ji = (JobInfo) jte;
     Job job = ji.getJob();
     if (job != null) {
       Object prop = job.getProperty(IProgressConstants.ACTION_PROPERTY);
       if (prop instanceof ActionFactory.IWorkbenchAction) {
         ((ActionFactory.IWorkbenchAction) prop).dispose();
       }
     }
   }
 }
  boolean remove(JobTreeElement jte) {
    boolean fire = false;
    boolean removed = false;

    synchronized (keptjobinfos) {
      if (keptjobinfos.remove(jte)) {
        removed = true;
        finishedTime.remove(jte);
        disposeAction(jte);

        // delete all elements that have jte as their direct or indirect
        // parent
        JobTreeElement jtes[] =
            (JobTreeElement[]) keptjobinfos.toArray(new JobTreeElement[keptjobinfos.size()]);
        for (int i = 0; i < jtes.length; i++) {
          JobTreeElement parent = (JobTreeElement) jtes[i].getParent();
          if (parent != null) {
            if (parent == jte || parent.getParent() == jte) {
              if (keptjobinfos.remove(jtes[i])) {
                disposeAction(jtes[i]);
              }
              finishedTime.remove(jtes[i]);
            }
          }
        }
        fire = true;
      }
    }

    if (fire) {
      // notify listeners
      Object l[] = getListeners();
      for (int i = 0; i < l.length; i++) {
        KeptJobsListener jv = (KeptJobsListener) l[i];
        jv.removed(jte);
      }
    }
    return removed;
  }