@Override
  protected void execute(IModelChangedEvent event, boolean undo) {
    Object[] elements = event.getChangedObjects();
    int type = event.getChangeType();
    String propertyName = event.getChangedProperty();
    IModelChangeProvider model = event.getChangeProvider();

    switch (type) {
      case IModelChangedEvent.INSERT:
        if (undo) executeRemove(model, elements);
        else executeAdd(model, elements);
        break;
      case IModelChangedEvent.REMOVE:
        if (undo) executeAdd(model, elements);
        else executeRemove(model, elements);
        break;
      case IModelChangedEvent.CHANGE:
        if (event instanceof AttributeChangedEvent) {
          executeAttributeChange((AttributeChangedEvent) event, undo);
        } else {
          if (undo)
            executeChange(elements[0], propertyName, event.getNewValue(), event.getOldValue());
          else executeChange(elements[0], propertyName, event.getOldValue(), event.getNewValue());
        }
    }
  }
 @Override
 public void modelChanged(IModelChangedEvent event) {
   if (event.getChangeType() == IModelChangedEvent.CHANGE) {
     Object changedObject = event.getChangedObjects()[0];
     if (changedObject instanceof IPluginObject) {
       IPluginObject obj = (IPluginObject) event.getChangedObjects()[0];
       // Ignore events from objects that are not yet in the model.
       if (!(obj instanceof IPluginBase) && obj.isInTheModel() == false) return;
     }
     if (changedObject instanceof IBuildObject) {
       IBuildObject obj = (IBuildObject) event.getChangedObjects()[0];
       // Ignore events from objects that are not yet in the model.
       if (obj.isInTheModel() == false) return;
     }
   }
   super.modelChanged(event);
 }