| /**
 * Buttons.js
 *
 * Released under LGPL License.
 * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
 *
 * License: http://www.tinymce.com/license
 * Contributing: http://www.tinymce.com/contributing
 */
define(
  'tinymce.plugins.spellchecker.ui.Buttons',
  [
    'tinymce.core.util.Tools',
    'tinymce.plugins.spellchecker.api.Settings',
    'tinymce.plugins.spellchecker.core.Actions'
  ],
  function (Tools, Settings, Actions) {
    var buildMenuItems = function (listName, languageValues) {
      var items = [];
      Tools.each(languageValues, function (languageValue) {
        items.push({
          selectable: true,
          text: languageValue.name,
          data: languageValue.value
        });
      });
      return items;
    };
    var updateSelection = function (editor) {
      return function (e) {
        var selectedLanguage = Settings.getLanguage(editor);
        e.control.items().each(function (ctrl) {
          ctrl.active(ctrl.settings.data === selectedLanguage);
        });
      };
    };
    var getItems = function (editor) {
      return Tools.map(Settings.getLanguages(editor).split(','), function (langPair) {
        langPair = langPair.split('=');
        return {
          name: langPair[0],
          value: langPair[1]
        };
      });
    };
    var register = function (editor, pluginUrl, startedState, textMatcherState, currentLanguageState, lastSuggestionsState) {
      var languageMenuItems = buildMenuItems('Language', getItems(editor));
      var startSpellchecking = function () {
        Actions.spellcheck(editor, pluginUrl, startedState, textMatcherState, lastSuggestionsState, currentLanguageState);
      };
      var buttonArgs = {
        tooltip: 'Spellcheck',
        onclick: startSpellchecking,
        onPostRender: function (e) {
          var ctrl = e.control;
          editor.on('SpellcheckStart SpellcheckEnd', function () {
            ctrl.active(startedState.get());
          });
        }
      };
      if (languageMenuItems.length > 1) {
        buttonArgs.type = 'splitbutton';
        buttonArgs.menu = languageMenuItems;
        buttonArgs.onshow = updateSelection(editor);
        buttonArgs.onselect = function (e) {
          currentLanguageState.set(e.control.settings.data);
        };
      }
      editor.addButton('spellchecker', buttonArgs);
      editor.addMenuItem('spellchecker', {
        text: 'Spellcheck',
        context: 'tools',
        onclick: startSpellchecking,
        selectable: true,
        onPostRender: function () {
          var self = this;
          self.active(startedState.get());
          editor.on('SpellcheckStart SpellcheckEnd', function () {
            self.active(startedState.get());
          });
        }
      });
    };
    return {
      register: register
    };
  }
);
 |