/**
   * Action is enabled when only items of the same type are selected.
   *
   * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
   *     org.eclipse.jface.viewers.ISelection)
   */
  public void selectionChanged(IWorkbenchPart part, ISelection input) {
    if (input instanceof IStructuredSelection) {
      IStructuredSelection selection = (IStructuredSelection) input;

      if (selection.size() < 2) {
        setEnabled(false);
        return;
      }

      String kapitel = null;
      for (Iterator iter = selection.iterator(); iter.hasNext(); ) {
        Object o = iter.next();
        if (o instanceof BausteinUmsetzung) {
          BausteinUmsetzung bst = (BausteinUmsetzung) o;
          if (kapitel == null) {
            kapitel = bst.getKapitel();
          } else {
            if (!bst.getKapitel().equals(kapitel)) {
              setEnabled(false);
              return;
            }
          }
        } else {
          setEnabled(false);
          return;
        }
      }
      if (checkRights()) {
        setEnabled(true);
      }
      return;
    }
    // no structured selection:
    setEnabled(false);
  }
  public List<IOOTableRow> getReport(PropertySelection shownColumns) {
    ArrayList<IOOTableRow> rows = new ArrayList<IOOTableRow>();

    AllCategories:
    for (CnATreeElement category : categories) {
      ArrayList<IOOTableRow> categoryRows = new ArrayList<IOOTableRow>();

      AllItems:
      for (CnATreeElement child : getItems(category)) {

        if (child instanceof BausteinUmsetzung) {
          List<String> columns = shownColumns.get(child.getEntity().getEntityType());
          BausteinUmsetzung bst = (BausteinUmsetzung) child;

          categoryRows.add(new PropertiesRow(child, columns, IOOTableRow.ROW_STYLE_SUBHEADER));
          categoryRows.add(
              new SimpleRow(
                  IOOTableRow.ROW_STYLE_SUBHEADER,
                  "Erreichte Siegelstufe: " + Character.toString(bst.getErreichteSiegelStufe())));
          addMassnahmen(shownColumns, categoryRows, bst);
        }
        // else: ignore item
      }

      // only add if header + items present:
      if (categoryRows.size() > 1) {
        rows.add(new SimpleRow(IOOTableRow.ROW_STYLE_HEADER, category.getTitle()));
        rows.addAll(categoryRows);
      }
    }
    return rows;
  }
  private void addMassnahmen(
      PropertySelection shownColumns, List<IOOTableRow> categoryRows, BausteinUmsetzung baustein) {
    if (!baustein.getChildren().iterator().hasNext()) {
      return;
    }
    MassnahmenUmsetzung massnahme = (MassnahmenUmsetzung) baustein.getChildren().iterator().next();
    List<String> columns = shownColumns.get(massnahme.getEntity().getEntityType());
    if (columns.size() == 0) {
      return;
    }
    categoryRows.add(new PropertyHeadersRow(massnahme, columns, IOOTableRow.ROW_STYLE_ELEMENT));

    for (CnATreeElement child : baustein.getChildren()) {
      massnahme = (MassnahmenUmsetzung) child;

      if (!(umgesetzt.indexOf(massnahme.getUmsetzung()) > -1)) {
        categoryRows.add(new PropertiesRow(massnahme, columns, IOOTableRow.ROW_STYLE_ELEMENT));
      }
    }
  }
 /** @param baustein */
 private void initParent(/* not final */ BausteinUmsetzung baustein) {
   CnATreeElement withParent = Retriever.checkRetrieveParent(baustein);
   CnATreeElement parent = Retriever.checkRetrieveElement(withParent.getParent());
   baustein.setParent(parent);
 }