Page 1 of 1

XML Author - Custom 'Learn Word' feature

Posted: Mon Apr 15, 2019 2:43 pm
by gergokozma
Hello All,

I wish to expand the standard 'Learn Word' action in Oxygen Author 20.1 . I would like to include some additional steps, while still having the original behaviour as well. For example: when the user selects a word for learning, a custom dictionary/wordlist is updated (with this word). This dictionary/wordlist is probably not present on a local machine but on the server.

Is it possible to create a wrapper around this action? And if so, how?

Thanks,
Geri

Re: XML Author - Custom 'Learn Word' feature

Posted: Wed Apr 17, 2019 3:34 pm
by alex_jitianu
Hi Geri,

You can use an AuthorActionsProvider to intercept the "Learn word" action. It can be used from the framework level API as well as from the plugin level API.

1. From a framework
From within an ro.sync.ecss.extensions.api.AuthorExtensionStateListener you can do this:

Code: Select all

public abstract class AuthorExtensionStateAdapter implements AuthorExtensionStateListener {

  private ActionPerformedListener listener = new ActionPerformedListener() {
    @Override
    public boolean beforeActionPerformed(Object actionEvent) {
      return true;
    };
    @Override
    public void afterActionPerformed(Object actionEvent) {
      // TODO Perform the required action. The authorAccess instance can be used to detect the word at caret.
      int[] wordAtCaret = authorAccess.getEditorAccess().getWordAtCaret();
      try {
        String word = authorAccess.getDocumentController().getText(wordAtCaret[0], wordAtCaret[1]);
      } catch (BadLocationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    };
  };
  private AuthorAccess authorAccess;
  
  /**
   * @see ro.sync.ecss.extensions.api.AuthorExtensionStateListener#activated(ro.sync.ecss.extensions.api.AuthorAccess)
   */
  @Override
  public void activated(AuthorAccess authorAccess) {
    this.authorAccess = authorAccess;
    AuthorActionsProvider actionsProvider = authorAccess.getEditorAccess().getActionsProvider();
    Action object = (Action) actionsProvider.getAuthorCommonActions().get("Spell_Check/Learn_word");
    actionsProvider.addActionPerformedListener(object, listener);
  }

  /**
   * @see ro.sync.ecss.extensions.api.AuthorExtensionStateListener#deactivated(ro.sync.ecss.extensions.api.AuthorAccess)
   */
  @Override
  public void deactivated(AuthorAccess authorAccess) {
    AuthorActionsProvider actionsProvider = authorAccess.getEditorAccess().getActionsProvider();
    Action object = (Action) actionsProvider.getAuthorCommonActions().get("Spell_Check/Learn_word");
    actionsProvider.removeActionPerformedListener(object, listener);
  }

  /**
   * @see ro.sync.ecss.extensions.api.Extension#getDescription()
   */
  @Override
  public String getDescription() {
    return "Author extension state adapter implementation";
  }
}
2. From within a plugin, more precisely from a Workspace Access plugin

Code: Select all

/**
 * Plugin extension - workspace access extension.
 */
public class CustomWorkspaceAccessPluginExtension implements WorkspaceAccessPluginExtension {
  /**
   * @see ro.sync.exml.plugin.workspace.WorkspaceAccessPluginExtension#applicationStarted(ro.sync.exml.workspace.api.standalone.StandalonePluginWorkspace)
   */
  public void applicationStarted(final StandalonePluginWorkspace pluginWorkspaceAccess) {
	pluginWorkspaceAccess.addEditorChangeListener(new WSEditorChangeListener() {
		@Override
		public void editorOpened(URL editorLocation) {
			WSEditor editorAccess = pluginWorkspaceAccess.getEditorAccess(editorLocation, PluginWorkspace.MAIN_EDITING_AREA);
			
			WSEditorPage currentPage = editorAccess.getCurrentPage();
			if (currentPage instanceof WSAuthorEditorPage) {
				AuthorActionsProvider actionsProvider = ((WSAuthorEditorPage) currentPage).getActionsProvider();
				Action object = (Action) actionsProvider.getAuthorCommonActions().get("Spell_Check/Learn_word");
				actionsProvider.addActionPerformedListener(object, new ActionPerformedListener() {
					@Override
					public boolean beforeActionPerformed(Object actionEvent) {
						// TODO Custom code.
						return true;
					}
				});
			} else {
				// TODO You could add a listener to detect when the user switches to author page and run your code there. 
				editorAccess.addEditorListener(new WSEditorListener() {
					@Override
					public void editorPageChanged() {
						// Add the listener on the action, if it wasn't added already!
					}
				});
			}
		}
	}, PluginWorkspace.MAIN_EDITING_AREA);  
  }	
  
  /**
   * @see ro.sync.exml.plugin.workspace.WorkspaceAccessPluginExtension#applicationClosing()
   */
  public boolean applicationClosing() {
	  //You can reject the application closing here
    return true;
  }
}
Best regards,
Alex