@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());
        }
    }
  }