/** @see InstanceViewer#setInput(TypeDefinition, Iterable) */
  @Override
  public void setInput(TypeDefinition type, Iterable<Instance> instances) {
    // remove old columns
    TreeColumn[] columns = treeViewer.getTree().getColumns();
    if (columns != null) {
      for (TreeColumn column : columns) {
        column.dispose();
      }
      labelProviders.clear();
    }

    // create row defs for metadata
    //			if (features != null) {
    //				boolean displayLineage = false;
    //				int lineageLength = 0;
    //				int featuresSize = 0;
    //				for (Feature f : features) {
    //					featuresSize++;
    //					Lineage l = (Lineage) f.getUserData().get("METADATA_LINEAGE"); //$NON-NLS-1$
    //					if (l != null && l.getProcessSteps().size() > 0) {
    //						displayLineage = true;
    //						if (lineageLength < l.getProcessSteps().size()) {
    //							lineageLength = l.getProcessSteps().size();
    //						}
    //					}
    //				}
    //
    //				if (displayLineage) {
    //					Object[][] processStepsText = new Object[lineageLength][featuresSize + 1];
    //					int featureIndex = 0;
    //					for (Feature f : features) {
    //						Lineage l = (Lineage) f.getUserData().get("METADATA_LINEAGE"); //$NON-NLS-1$
    //						if (l != null && l.getProcessSteps().size() > 0) {
    //							int psIndex = 0;
    //							for (ProcessStep ps : l.getProcessSteps()) {
    //								processStepsText[psIndex][featureIndex + 1] = ps.getDescription().toString();
    //								psIndex++;
    //							}
    //						}
    //						featureIndex++;
    //					}
    //
    //					DefaultTreeNode lineage = new DefaultTreeNode(Messages.DefinitionFeatureTreeViewer_5);
    // //$NON-NLS-1$
    //					metadata.addChild(lineage);
    //					for (int i = 0; i < lineageLength; i++) {
    //						processStepsText[i][0] = Messages.DefinitionFeatureTreeViewer_6 + (i + 1); //$NON-NLS-1$
    //						DefaultTreeNode processStep = new DefaultTreeNode(processStepsText[i]);
    //						lineage.addChild(processStep);
    //					}
    //				}
    // set input
    if (type != null) {
      // pass metadatas to the treeviewer, if instances contain metadatas
      Set<String> completeMetaNames = new HashSet<String>();
      for (Instance inst : instances) {
        for (String name : inst.getMetaDataNames()) {
          completeMetaNames.add(name);
        }
      }

      Pair<TypeDefinition, Set<String>> pair =
          new Pair<TypeDefinition, Set<String>>(type, completeMetaNames);

      treeViewer.setInput(pair);
    } else treeViewer.setInput(Collections.emptySet());

    Layout layout = treeViewer.getTree().getParent().getLayout();

    // add type column
    if (type != null) {
      TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
      column.getColumn().setText(type.getDisplayName());
      column.setLabelProvider(
          new TreeColumnViewerLabelProvider(new DefinitionMetaCompareLabelProvider(treeViewer)));
      if (layout instanceof TreeColumnLayout) {
        ((TreeColumnLayout) layout).setColumnData(column.getColumn(), new ColumnWeightData(1));
      }
    }

    // add columns for features
    int index = 1;
    if (instances != null) {
      //			// sort features
      //			List<Feature> sortedFeatures = new ArrayList<Feature>();
      //			for (Feature f : features) {
      //				sortedFeatures.add(f);
      //			}
      //			Collections.sort(sortedFeatures, new Comparator<Feature>() {
      //
      //				@Override
      //				public int compare(Feature o1, Feature o2) {
      //					FeatureId id1 = FeatureBuilder.getSourceID(o1);
      //					if (id1 == null) {
      //						id1 = o1.getIdentifier();
      //					}
      //
      //					FeatureId id2 = FeatureBuilder.getSourceID(o2);
      //					if (id2 == null) {
      //						id2 = o2.getIdentifier();
      //					}
      //
      //					return id1.getID().compareTo(id2.getID());
      //				}
      //
      //			});
      List<Instance> insts = new ArrayList<Instance>();
      for (Instance instance : instances) { // sortedFeatures) {
        final TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
        //				FeatureId id = FeatureBuilder.getSourceID(feature);
        //				if (id == null) {
        //					id = feature.getIdentifier();
        //				}
        //				column.getColumn().setText(id.toString());
        column.getColumn().setText(String.valueOf(index)); // XXX
        // identifier?
        DefinitionInstanceLabelProvider labelProvider =
            new DefinitionInstanceLabelProvider(instance);
        labelProviders.put(index, labelProvider);
        column.setLabelProvider(labelProvider);
        if (layout instanceof TreeColumnLayout) {
          ((TreeColumnLayout) layout).setColumnData(column.getColumn(), new ColumnWeightData(1));
        }

        // add tool tip
        //				new ColumnBrowserTip(treeViewer, 400, 300, true, index, null);
        insts.add(instance);
        index++;
      }
      ((MetadataCompareActionProvider) maep).setInput(insts, labelProviders);
    }

    treeViewer.refresh();
    treeViewer.getTree().getParent().layout(true, true);

    selectionProvider.updateSelection(instances);

    // auto-expand attributes/metadata
    treeViewer.expandToLevel(2);
  }