Implementing an Author Schema Aware Editing Handler

You can implement your own handler for actions like typing, delete or paste by providing an implementation of ro.sync.ecss.extensions.api.AuthorSchemaAwareEditingHandler. The Schema Aware Editing must be On or Custom in order for this handler to be called. The handler can either resolve a specific case, let the default implementation take place or reject the edit entirely by throwing an InvalidEditException.

package simple.documentation.framework.extensions;

/**
 * Specific editing support for SDF documents.
 * Handles typing and paste events inside section and tables.
 */
public class SDFSchemaAwareEditingHandler implements AuthorSchemaAwareEditingHandler {

Typing events can be handled using the handleTyping method. For example, the SDFSchemaAwareEditingHandler checks if the schema is not a learned one, was loaded successfully and Smart Paste is active. If these conditions are met, the event will be handled.

/**
 * @see ro.sync.ecss.extensions.api.AuthorSchemaAwareEditingHandler#handleTyping(int, char, ro.sync.ecss.extensions.api.AuthorAccess)
 */
public boolean handleTyping(int offset, char ch, AuthorAccess authorAccess)
throws InvalidEditException {
  boolean handleTyping = false;
  AuthorSchemaManager authorSchemaManager = authorAccess.getDocumentController().getAuthorSchemaManager();
  if (!authorSchemaManager.isLearnSchema() && 
      !authorSchemaManager.hasLoadingErrors() &&
      authorSchemaManager.getAuthorSchemaAwareOptions().isEnableSmartTyping()) {
    try {
      AuthorDocumentFragment characterFragment = 
        authorAccess.getDocumentController().createNewDocumentTextFragment(String.valueOf(ch));    
      handleTyping = handleInsertionEvent(offset, new AuthorDocumentFragment[] {characterFragment}, authorAccess);
    } catch (AuthorOperationException e) {
      throw new InvalidEditException(e.getMessage(), "Invalid typing event: " + e.getMessage(), e, false);
    }
  }
  return handleTyping;    
}

Implementing the AuthorSchemaAwareEditingHandler gives the possibility to handle other events like: the keyboard delete event at the given offset (using Delete or Backspace keys), delete element tags, delete selection, join elements or paste fragment.

The complete source code of the implementation is found in the Example Files Listings, the Java Files section.