/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

const Menu = require("resource://devtools/client/framework/menu.js");
const MenuItem = require("resource://devtools/client/framework/menu-item.js");

// This WeakMap will be used to know if strings have already been loaded in a given
// window, which will be used as key.
const stringsLoaded = new WeakMap();

/**
 * Lazily load strings for the edit menu.
 */
function loadEditMenuStrings(win) {
  if (stringsLoaded.has(win)) {
    return;
  }

  if (win.MozXULElement) {
    stringsLoaded.set(win, true);
    win.MozXULElement.insertFTLIfNeeded("toolkit/global/textActions.ftl");
  }
}

/**
 * Return an 'edit' menu for a input field. This integrates directly
 * with docshell commands to provide the right enabled state and editor
 * functionality.
 *
 * You'll need to call menu.popup() yourself, this just returns the Menu instance.
 *
 * @param {Window} win parent window reference
 * @param {string} id menu ID
 *
 * @returns {Menu}
 */
function createEditContextMenu(win, id) {
  // Localized strings for the menu are loaded lazily.
  loadEditMenuStrings(win);

  const docshell = win.docShell;
  const menu = new Menu({ id });
  menu.append(
    new MenuItem({
      id: "editmenu-undo",
      l10nID: "text-action-undo",
      disabled: !docshell.isCommandEnabled("cmd_undo"),
      click: () => {
        docshell.doCommand("cmd_undo");
      },
    })
  );
  menu.append(
    new MenuItem({
      type: "separator",
    })
  );
  menu.append(
    new MenuItem({
      id: "editmenu-cut",
      l10nID: "text-action-cut",
      disabled: !docshell.isCommandEnabled("cmd_cut"),
      click: () => {
        docshell.doCommand("cmd_cut");
      },
    })
  );
  menu.append(
    new MenuItem({
      id: "editmenu-copy",
      l10nID: "text-action-copy",
      disabled: !docshell.isCommandEnabled("cmd_copy"),
      click: () => {
        docshell.doCommand("cmd_copy");
      },
    })
  );
  menu.append(
    new MenuItem({
      id: "editmenu-paste",
      l10nID: "text-action-paste",
      disabled: !docshell.isCommandEnabled("cmd_paste"),
      click: () => {
        docshell.doCommand("cmd_paste");
      },
    })
  );
  menu.append(
    new MenuItem({
      id: "editmenu-delete",
      l10nID: "text-action-delete",
      disabled: !docshell.isCommandEnabled("cmd_delete"),
      click: () => {
        docshell.doCommand("cmd_delete");
      },
    })
  );
  menu.append(
    new MenuItem({
      type: "separator",
    })
  );
  menu.append(
    new MenuItem({
      id: "editmenu-selectAll",
      l10nID: "text-action-select-all",
      disabled: !docshell.isCommandEnabled("cmd_selectAll"),
      click: () => {
        docshell.doCommand("cmd_selectAll");
      },
    })
  );
  return menu;
}

module.exports.createEditContextMenu = createEditContextMenu;
