@Inject
  @Optional
  private void whenKeywordCallIsRemoved(
      @UIEventTopic(RobotModelEvents.ROBOT_KEYWORD_CALL_REMOVED) final RobotCase testCase) {
    if (testCase.getSuiteFile() == fileModel) {
      selectionLayerAccessor.preserveSelectionWhen(
          tableInputIsReplaced(),
          new Function<PositionCoordinate, PositionCoordinate>() {

            @Override
            public PositionCoordinate apply(final PositionCoordinate coordinate) {
              if (testCase.getChildren().isEmpty()) {
                return new PositionCoordinate(
                    coordinate.getLayer(),
                    coordinate.getColumnPosition(),
                    dataProvider.indexOfRowObject(testCase));
              } else if (dataProvider.getRowObject(coordinate.getRowPosition())
                  instanceof AddingToken) {
                return new PositionCoordinate(
                    coordinate.getLayer(),
                    coordinate.getColumnPosition(),
                    coordinate.getRowPosition() - 1);
              }
              return coordinate;
            }
          });
    }
  }
  @Inject
  @Optional
  private void whenCaseIsRemoved(
      @UIEventTopic(RobotModelEvents.ROBOT_CASE_REMOVED) final RobotSuiteFileSection section) {
    if (section.getSuiteFile() == fileModel) {
      selectionLayerAccessor.preserveSelectionWhen(
          tableInputIsReplaced(),
          new Function<PositionCoordinate, PositionCoordinate>() {

            @Override
            public PositionCoordinate apply(final PositionCoordinate coordinate) {
              if (section.getChildren().isEmpty()) {
                return null;
              } else if (dataProvider.getRowObject(coordinate.getRowPosition())
                  instanceof AddingToken) {
                final RobotFileInternalElement lastCase =
                    section.getChildren().get(section.getChildren().size() - 1);
                return new PositionCoordinate(
                    coordinate.getLayer(),
                    coordinate.getColumnPosition(),
                    dataProvider.indexOfRowObject(lastCase));
              }
              return coordinate;
            }
          });
    }
  }
 @Inject
 @Optional
 private void whenKeywordCallIsMoved(
     @UIEventTopic(RobotModelEvents.ROBOT_KEYWORD_CALL_MOVED) final RobotCase testCase) {
   if (testCase.getSuiteFile() == fileModel) {
     sortModel.clear();
     selectionLayerAccessor.preserveElementSelectionWhen(tableInputIsReplaced());
   }
 }
 @Inject
 @Optional
 private void whenCaseIsMoved(
     @UIEventTopic(RobotModelEvents.ROBOT_CASE_MOVED) final RobotSuiteFileSection section) {
   if (section.getSuiteFile() == fileModel) {
     sortModel.clear();
     selectionLayerAccessor.preserveElementSelectionWhen(tableInputIsReplaced());
   }
 }
 @Inject
 @Optional
 private void whenKeywordCallIsAdded(
     @UIEventTopic(RobotModelEvents.ROBOT_KEYWORD_CALL_ADDED) final Event event) {
   final RobotCase testCase = Events.get(event, IEventBroker.DATA, RobotCase.class);
   final RobotKeywordCall keywordCall =
       Events.get(event, RobotModelEvents.ADDITIONAL_DATA, RobotKeywordCall.class);
   if (testCase != null && testCase.getSuiteFile() == fileModel) {
     sortModel.clear();
     if (keywordCall != null) {
       selectionLayerAccessor.selectElementInFirstCellAfterOperation(
           keywordCall, tableInputIsReplaced());
     } else {
       final List<?> calls = Events.get(event, RobotModelEvents.ADDITIONAL_DATA, List.class);
       final RobotKeywordCall lastCall = (RobotKeywordCall) calls.get(calls.size() - 1);
       selectionLayerAccessor.selectElementInFirstCellAfterOperation(
           lastCall, tableInputIsReplaced());
     }
   }
 }
  @Inject
  @Optional
  private void whenKeywordCallIsConverted(
      @UIEventTopic(RobotModelEvents.ROBOT_KEYWORD_CALL_CONVERTED) final Event event) {

    final RobotCase testCase = Events.get(event, IEventBroker.DATA, RobotCase.class);
    final RobotKeywordCall call =
        Events.get(event, RobotModelEvents.ADDITIONAL_DATA, RobotKeywordCall.class);

    if (testCase != null && testCase.getSuiteFile() == fileModel) {
      sortModel.clear();
      selectionLayerAccessor.selectElementPreservingSelectedColumnsAfterOperation(
          call, tableInputIsReplaced());
    }
  }
  @Inject
  @Optional
  private void whenSectionIsRemoved(
      @UIEventTopic(RobotModelEvents.ROBOT_SUITE_SECTION_REMOVED) final RobotSuiteFile file) {
    if (file == fileModel && dataProvider.getInput() != null) {
      final ICellEditor activeCellEditor = table.getActiveCellEditor();
      if (activeCellEditor != null && !activeCellEditor.isClosed()) {
        activeCellEditor.close();
      }
      dataProvider.setInput(getSection());
      selectionLayerAccessor.clear();
      table.refresh();

      setDirty();
    }
  }
  @Inject
  @Optional
  private void whenCaseIsAdded(@UIEventTopic(RobotModelEvents.ROBOT_CASE_ADDED) final Event event) {
    final RobotCasesSection section = Events.get(event, IEventBroker.DATA, RobotCasesSection.class);

    if (section != null && section.getSuiteFile() == fileModel) {
      sortModel.clear();

      RobotCase testCase = Events.get(event, RobotModelEvents.ADDITIONAL_DATA, RobotCase.class);
      if (testCase == null) {
        final List<?> keywords = Events.get(event, RobotModelEvents.ADDITIONAL_DATA, List.class);
        testCase = (RobotCase) keywords.get(keywords.size() - 1);
      }

      selectionLayerAccessor.selectElementInFirstCellAfterOperation(
          testCase, tableInputIsReplaced());
    }
  }