/**
  * {@inheritdoc}
  */
 public function settingsForm(array $form, FormStateInterface $form_state, EditorEntity $editor)
 {
     $settings = $editor->getSettings();
     $ckeditor_settings_toolbar = array('#theme' => 'ckeditor_settings_toolbar', '#editor' => $editor, '#plugins' => $this->ckeditorPluginManager->getButtons());
     $form['toolbar'] = array('#type' => 'container', '#attached' => array('library' => array('ckeditor/drupal.ckeditor.admin'), 'js' => array(array('type' => 'setting', 'data' => array('ckeditor' => array('toolbarAdmin' => drupal_render($ckeditor_settings_toolbar)))))), '#attributes' => array('class' => array('ckeditor-toolbar-configuration')));
     $form['toolbar']['button_groups'] = array('#type' => 'textarea', '#title' => t('Toolbar buttons'), '#default_value' => json_encode($settings['toolbar']['rows']), '#attributes' => array('class' => array('ckeditor-toolbar-textarea')));
     // CKEditor plugin settings, if any.
     $form['plugin_settings'] = array('#type' => 'vertical_tabs', '#title' => t('CKEditor plugin settings'), '#attributes' => array('id' => 'ckeditor-plugin-settings'));
     $this->ckeditorPluginManager->injectPluginSettingsForm($form, $form_state, $editor);
     if (count(Element::children($form['plugins'])) === 0) {
         unset($form['plugins']);
         unset($form['plugin_settings']);
     }
     // Hidden CKEditor instance. We need a hidden CKEditor instance with all
     // plugins enabled, so we can retrieve CKEditor's per-feature metadata (on
     // which tags, attributes, styles and classes are enabled). This metadata is
     // necessary for certain filters' (e.g. the html_filter filter) settings to
     // be updated accordingly.
     // Get a list of all external plugins and their corresponding files.
     $plugins = array_keys($this->ckeditorPluginManager->getDefinitions());
     $all_external_plugins = array();
     foreach ($plugins as $plugin_id) {
         $plugin = $this->ckeditorPluginManager->createInstance($plugin_id);
         if (!$plugin->isInternal()) {
             $all_external_plugins[$plugin_id] = $plugin->getFile();
         }
     }
     // Get a list of all buttons that are provided by all plugins.
     $all_buttons = array_reduce($this->ckeditorPluginManager->getButtons(), function ($result, $item) {
         return array_merge($result, array_keys($item));
     }, array());
     // Build a fake Editor object, which we'll use to generate JavaScript
     // settings for this fake Editor instance.
     $fake_editor = entity_create('editor', array('format' => $editor->id(), 'editor' => 'ckeditor', 'settings' => array('toolbar' => array('rows' => array(0 => array(0 => array('name' => 'All existing buttons', 'items' => $all_buttons)))), 'plugins' => $settings['plugins'])));
     $config = $this->getJSSettings($fake_editor);
     // Remove the ACF configuration that is generated based on filter settings,
     // because otherwise we cannot retrieve per-feature metadata.
     unset($config['allowedContent']);
     $form['hidden_ckeditor'] = array('#markup' => '<div id="ckeditor-hidden" class="hidden"></div>', '#attached' => array('js' => array(array('type' => 'setting', 'data' => array('ckeditor' => array('hiddenCKEditorConfig' => $config))))));
     return $form;
 }