protected Map<Declaration, Boolean> handleStyle(Style style) {
    if (style instanceof NamedStyle) {
      return Collections.emptyMap();
    }

    Map<Declaration, Boolean> declarations = new LinkedHashMap<Declaration, Boolean>();

    for (EStructuralFeature feature : style.eClass().getEAllStructuralFeatures()) {
      if (NotationPackage.eINSTANCE.getStyle().isSuperTypeOf(feature.getEContainingClass())) {
        Object currentValue = style.eGet(feature);
        Object defaultValue = feature.getDefaultValue();
        boolean check =
            currentValue == null
                ? currentValue != defaultValue
                : !currentValue.equals(defaultValue);

        Declaration declaration = handleStyleFeature(style, feature);
        if (declaration.getExpression()
            != null) { // If expression is null, the type of this property is not supported
          declarations.put(declaration, check);
        }
      }
    }

    return declarations;
  }
  /**
   * Tests the behavior of attribute <code>kind</code>'s accessors.
   *
   * @generated
   */
  @Test
  public void testKind() {
    EStructuralFeature feature = org.eclipse.emf.compare.ComparePackage.eINSTANCE.getDiff_Kind();
    ReferenceChange referenceChange = CompareFactory.eINSTANCE.createReferenceChange();
    referenceChange.eAdapters().add(new MockEAdapter());
    org.eclipse.emf.compare.DifferenceKind kindValue =
        (org.eclipse.emf.compare.DifferenceKind) feature.getDefaultValue();
    for (org.eclipse.emf.compare.DifferenceKind aDifferenceKind :
        org.eclipse.emf.compare.DifferenceKind.VALUES) {
      if (kindValue.getValue() != aDifferenceKind.getValue()) {
        kindValue = aDifferenceKind;
        break;
      }
    }

    assertFalse(referenceChange.eIsSet(feature));
    assertEquals(feature.getDefaultValue(), referenceChange.getKind());

    referenceChange.setKind(kindValue);
    assertTrue(notified);
    notified = false;
    assertEquals(kindValue, referenceChange.getKind());
    assertEquals(referenceChange.getKind(), referenceChange.eGet(feature));
    assertTrue(referenceChange.eIsSet(feature));

    referenceChange.eUnset(feature);
    assertTrue(notified);
    notified = false;
    assertEquals(feature.getDefaultValue(), referenceChange.getKind());
    assertEquals(referenceChange.getKind(), referenceChange.eGet(feature));
    assertFalse(referenceChange.eIsSet(feature));

    referenceChange.eSet(feature, kindValue);
    assertTrue(notified);
    notified = false;
    assertEquals(kindValue, referenceChange.getKind());
    assertEquals(referenceChange.getKind(), referenceChange.eGet(feature));
    assertTrue(referenceChange.eIsSet(feature));

    referenceChange.setKind(null);
    assertTrue(notified);
    notified = false;
    assertEquals(feature.getDefaultValue(), referenceChange.getKind());
    assertEquals(referenceChange.getKind(), referenceChange.eGet(feature));
    assertFalse(referenceChange.eIsSet(feature));
  }
  /**
   * Tests the behavior of reference <code>conflict</code>'s accessors.
   *
   * @generated
   */
  @Test
  public void testConflict() {
    EStructuralFeature feature =
        org.eclipse.emf.compare.ComparePackage.eINSTANCE.getDiff_Conflict();
    ReferenceChange referenceChange = CompareFactory.eINSTANCE.createReferenceChange();
    referenceChange.eAdapters().add(new MockEAdapter());
    org.eclipse.emf.compare.Conflict conflictValue =
        org.eclipse.emf.compare.CompareFactory.eINSTANCE.createConflict();

    assertFalse(referenceChange.eIsSet(feature));
    assertNull(referenceChange.getConflict());

    referenceChange.setConflict(conflictValue);
    assertTrue(notified);
    notified = false;
    assertSame(conflictValue, referenceChange.getConflict());
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature));
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature, false));
    assertTrue(referenceChange.eIsSet(feature));
    assertTrue(conflictValue.getDifferences().contains(referenceChange));

    referenceChange.eUnset(feature);
    assertTrue(notified);
    notified = false;
    assertNull(referenceChange.getConflict());
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature));
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature, false));
    assertFalse(referenceChange.eIsSet(feature));
    assertFalse(conflictValue.getDifferences().contains(referenceChange));

    referenceChange.setConflict(conflictValue);
    assertTrue(notified);
    notified = false;
    assertSame(conflictValue, referenceChange.getConflict());
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature));
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature, false));
    assertTrue(referenceChange.eIsSet(feature));
    assertTrue(conflictValue.getDifferences().contains(referenceChange));

    referenceChange.eSet(feature, conflictValue);
    assertTrue(notified);
    notified = false;
    assertSame(conflictValue, referenceChange.getConflict());
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature));
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature, false));
    assertTrue(referenceChange.eIsSet(feature));
    assertTrue(conflictValue.getDifferences().contains(referenceChange));

    referenceChange.setConflict(null);
    assertTrue(notified);
    notified = false;
    assertNull(referenceChange.getConflict());
    assertSame(feature.getDefaultValue(), referenceChange.getConflict());
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature));
    assertSame(referenceChange.getConflict(), referenceChange.eGet(feature, false));
    assertFalse(referenceChange.eIsSet(feature));
    assertFalse(conflictValue.getDifferences().contains(referenceChange));
  }
  /**
   * Tests the behavior of reference <code>value</code>'s accessors.
   *
   * @generated
   */
  @Test
  public void testValue() {
    EStructuralFeature feature =
        org.eclipse.emf.compare.ComparePackage.eINSTANCE.getReferenceChange_Value();
    ReferenceChange referenceChange = CompareFactory.eINSTANCE.createReferenceChange();
    referenceChange.eAdapters().add(new MockEAdapter());
    org.eclipse.emf.ecore.EObject valueValue =
        org.eclipse.emf.ecore.EcoreFactory.eINSTANCE.createEObject();

    assertFalse(referenceChange.eIsSet(feature));
    assertNull(referenceChange.getValue());

    referenceChange.setValue(valueValue);
    assertTrue(notified);
    notified = false;
    assertSame(valueValue, referenceChange.getValue());
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature));
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature, false));
    assertTrue(referenceChange.eIsSet(feature));

    referenceChange.eUnset(feature);
    assertTrue(notified);
    notified = false;
    assertNull(referenceChange.getValue());
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature));
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature, false));
    assertFalse(referenceChange.eIsSet(feature));

    referenceChange.setValue(valueValue);
    assertTrue(notified);
    notified = false;
    assertSame(valueValue, referenceChange.getValue());
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature));
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature, false));
    assertTrue(referenceChange.eIsSet(feature));

    referenceChange.eSet(feature, valueValue);
    assertTrue(notified);
    notified = false;
    assertSame(valueValue, referenceChange.getValue());
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature));
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature, false));
    assertTrue(referenceChange.eIsSet(feature));

    referenceChange.setValue(null);
    assertTrue(notified);
    notified = false;
    assertNull(referenceChange.getValue());
    assertSame(feature.getDefaultValue(), referenceChange.getValue());
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature));
    assertSame(referenceChange.getValue(), referenceChange.eGet(feature, false));
    assertFalse(referenceChange.eIsSet(feature));
  }
  protected Map<Attribute, Boolean> handleSemantic(View view) {
    Map<Attribute, Boolean> result = new LinkedHashMap<Attribute, Boolean>();

    EObject semanticElement = view.getElement();

    for (EStructuralFeature feature : semanticElement.eClass().getEAllStructuralFeatures()) {
      if (isBoolean(feature) || isInteger(feature) || feature.getEType() instanceof EEnum) {
        Attribute attributeCondition = CssFactory.eINSTANCE.createAttribute();
        attributeCondition.setName(feature.getName());

        AttributeValue attributeValue = CssFactory.eINSTANCE.createAttributeValue();
        attributeValue.setOperator(ATTRIBUTE_OP.EQUALS);
        attributeValue.setValue(semanticElement.eGet(feature).toString());
        attributeCondition.setValue(attributeValue);

        boolean check = semanticElement.eGet(feature) != feature.getDefaultValue();

        result.put(attributeCondition, check);
      }
    }

    return result;
  }
  // TODO ! need new presentation of set-text-selection command or hide args
  protected void convertSimple(Command command, ICommandFormatter formatter, boolean hasInput) {
    String commandName = CoreUtils.getScriptletNameByClass(command.eClass());
    formatter.addCommandName(commandName);

    Map<EStructuralFeature, Command> bindingMap = new HashMap<EStructuralFeature, Command>();
    for (Binding b : command.getBindings()) {
      bindingMap.put(b.getFeature(), b.getCommand());
    }

    List<EStructuralFeature> attributes = CoreUtils.getFeatures(command.eClass());

    boolean forced = false;
    boolean bigTextCommand =
        commandName.equals("upload-file") || commandName.equals("match-binary");

    for (EStructuralFeature feature : attributes) {
      if (feature.getEAnnotation(CoreUtils.INTERNAL_ANN) != null) continue;
      if (feature.getEAnnotation(CoreUtils.INPUT_ANN) != null && hasInput) continue;
      String name = feature.getName();
      if (isForced(commandName, name)) forced = true;
      Object val = command.eGet(feature);
      boolean skippped = true;
      Object defaultValue = feature.getDefaultValue();
      boolean isDefault = val == null || val.equals(defaultValue);
      if (!isDefault) {
        if (feature instanceof EAttribute) {
          EAttribute attr = (EAttribute) feature;
          String type = attr.getEAttributeType().getInstanceTypeName();
          if (val instanceof List<?>) {
            List<?> list = (List<?>) val;
            for (Object o : list) {
              String value = convertValue(o, type);
              if (value != null) {
                formatter.addAttrName(name, forced);
                formatter.addAttrValue(value);
                skippped = false;
              }
            }
          } else {
            if (val.equals(true)) {
              forced = true;
              formatter.addAttrName(name, forced);
            } else {
              String value = convertValue(val, type);
              if (value != null) {
                formatter.addAttrName(name, forced);
                if (bigTextCommand) formatter.addAttrValueWithLineBreak(value);
                else formatter.addAttrValue(value);
                skippped = false;
              }
            }
          }
        } else {
          EReference ref = (EReference) feature;
          EClass eclass = ref.getEReferenceType();
          if (eclass.getEPackage() == CorePackage.eINSTANCE
              && eclass.getClassifierID() == CorePackage.COMMAND) {
            boolean singleLine = !(val instanceof Sequence);
            formatter.addAttrName(name, forced);
            formatter.openGroup(singleLine);
            doConvert((Command) val, formatter, true);
            formatter.closeGroup(singleLine);
            skippped = false;
          } else {
            IParamConverter<?> converter =
                ParamConverterManager.getInstance().getConverter(eclass.getInstanceClass());
            if (converter != null) {
              try {
                String strVal = String.format("\"%s\"", converter.convertToCode(val));
                formatter.addAttrValue(strVal);
              } catch (CoreException e) {
                CorePlugin.log(e.getStatus());
              }
            }
          }
        }
      } else {
        Command c = bindingMap.get(feature);
        if (c != null) {
          formatter.addAttrName(name, forced);
          formatter.openExec();
          doConvert(c, formatter, hasInput);
          formatter.closeExec();
          skippped = false;
        }
      }
      if (skippped) forced = true;
    }
  }