/**
  * Handles the selection of objects via the selection wizard.
  *
  * @param type The type of objects to handle.
  * @param objects The objects to handle.
  * @param fire Pass <code>true</code> to notify, <code>false</code> otherwise.
  */
 void handleObjectsSelection(Class type, Collection objects, boolean fire) {
   if (objects == null) return;
   if (TagAnnotationData.class.equals(type)) {
     layoutTags(objects);
     List<Long> ids = new ArrayList<Long>();
     Iterator i = objects.iterator();
     TagAnnotationData tag;
     tagFlag = false;
     Collection tags = model.getTags();
     if (tags == null || tags.size() != objects.size()) {
       tagFlag = true;
     } else {
       while (i.hasNext()) {
         tag = (TagAnnotationData) i.next();
         if (tag != null && !model.isAnnotationUsedByUser(tag)) {
           ids.add(tag.getId());
         }
       }
       i = tags.iterator();
       while (i.hasNext()) {
         tag = (TagAnnotationData) i.next();
         if (tag != null && !ids.contains(tag.getId())) {
           tagFlag = true;
           break;
         }
       }
     }
   } else if (FileAnnotationData.class.equals(type)) {
     layoutAttachments(objects);
     List<Long> ids = new ArrayList<Long>();
     Iterator i = objects.iterator();
     FileAnnotationData data;
     docFlag = false;
     Collection attachments = model.getAttachments();
     if (attachments == null || attachments.size() != objects.size()) {
       docFlag = true;
     } else {
       while (i.hasNext()) {
         data = (FileAnnotationData) i.next();
         if (data != null) ids.add(data.getId());
       }
       i = attachments.iterator();
       while (i.hasNext()) {
         data = (FileAnnotationData) i.next();
         if (data != null && !ids.contains(data.getId())) {
           docFlag = true;
           break;
         }
       }
     }
   }
   buildGUI();
   if (fire)
     firePropertyChange(
         EditorControl.SAVE_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true));
 }
 /**
  * Removes a tag from the view.
  *
  * @param tag The tag to remove.
  */
 void removeTag(TagAnnotationData tag) {
   if (tag == null) return;
   List<TagAnnotationData> tags = getCurrentTagsSelection();
   Iterator<TagAnnotationData> i = tags.iterator();
   TagAnnotationData data;
   List<TagAnnotationData> toKeep = new ArrayList<TagAnnotationData>();
   while (i.hasNext()) {
     data = i.next();
     if (data.getId() != tag.getId()) toKeep.add(data);
   }
   handleObjectsSelection(TagAnnotationData.class, toKeep, true);
 }
 /**
  * Returns the collection of tags.
  *
  * @return See above.
  */
 List<TagAnnotationData> removeTags() {
   List<TagAnnotationData> list = new ArrayList<TagAnnotationData>();
   if (tagsDocList.size() == 0) {
     tagFlag = false;
     return list;
   }
   List<TagAnnotationData> toKeep = new ArrayList<TagAnnotationData>();
   TagAnnotationData data;
   DocComponent doc;
   Object object;
   Iterator<DocComponent> i = tagsDocList.iterator();
   while (i.hasNext()) {
     doc = i.next();
     object = doc.getData();
     if (doc.canUnlink()) {
       if (object instanceof TagAnnotationData) {
         data = (TagAnnotationData) object;
         if (data.getId() > 0) list.add(data);
       }
     } else {
       toKeep.add((TagAnnotationData) object);
     }
   }
   handleObjectsSelection(TagAnnotationData.class, toKeep, false);
   if (list.size() == 0) tagFlag = false;
   return list;
 }
 /**
  * Returns the tags currently selected.
  *
  * @return See above.
  */
 List<TagAnnotationData> getCurrentTagsSelection() {
   List<TagAnnotationData> selection = new ArrayList<TagAnnotationData>();
   if (tagsDocList.size() == 0) return selection;
   DocComponent doc;
   Object object;
   TagAnnotationData tag;
   Iterator<DocComponent> i = tagsDocList.iterator();
   while (i.hasNext()) {
     doc = i.next();
     object = doc.getData();
     if (object instanceof TagAnnotationData) {
       tag = (TagAnnotationData) object;
       if (tag.getId() > 0) selection.add(tag);
     }
   }
   return selection;
 }
  /**
   * Returns the collection of annotation to remove.
   *
   * @see AnnotationUI#getAnnotationToRemove()
   */
  protected List<Object> getAnnotationToRemove() {
    List<Object> l = new ArrayList<Object>();
    if (selectedValue != initialValue && selectedValue == 0) {
      RatingAnnotationData rating = model.getUserRatingAnnotation();
      if (rating != null) l.add(rating);
    }
    List<Long> idsToKeep;
    DocComponent doc;
    long id;

    Object object;
    Iterator<DocComponent> i;
    Collection original;
    Iterator j;
    if (tagFlag && !model.isMultiSelection()) {
      idsToKeep = new ArrayList<Long>();

      TagAnnotationData tag;
      i = tagsDocList.iterator();
      while (i.hasNext()) {
        doc = i.next();
        object = doc.getData();
        if (object instanceof TagAnnotationData) {
          tag = (TagAnnotationData) object;
          id = tag.getId();
          if (id > 0) idsToKeep.add(id);
        }
      }

      original = model.getTags();
      j = original.iterator();
      while (j.hasNext()) {
        tag = (TagAnnotationData) j.next();
        id = tag.getId();
        if (!idsToKeep.contains(id)) // && model.isAnnotationToDelete(tag))
        l.add(tag);
      }
    }
    if (docFlag) {
      idsToKeep = new ArrayList<Long>();
      i = filesDocList.iterator();
      FileAnnotationData fa;
      while (i.hasNext()) {
        doc = i.next();
        object = doc.getData();
        if (object instanceof FileAnnotationData) {
          fa = (FileAnnotationData) object;
          id = fa.getId();
          if (id > 0) idsToKeep.add(id);
        }
      }
      original = model.getAttachments();
      j = original.iterator();
      while (j.hasNext()) {
        fa = (FileAnnotationData) j.next();
        id = fa.getId();
        if (!idsToKeep.contains(id)) //  && model.isAnnotationToDelete(fa))
        l.add(fa);
      }
    }
    if (model.hasBeenPublished()) {
      if (!publishedBox.isSelected()) {
        BooleanAnnotationData b = model.getPublishedAnnotation();
        if (b.getValue().booleanValue()) l.add(b);
      }
    }
    return l;
  }