|
@@ -40,7 +40,12 @@ const convertToMenuTemplate = function (items) {
|
|
|
const createMenu = function (x, y, items) {
|
|
|
const {remote} = require('electron')
|
|
|
const {Menu} = remote
|
|
|
- const menu = Menu.buildFromTemplate(convertToMenuTemplate(items))
|
|
|
+
|
|
|
+ let template = convertToMenuTemplate(items)
|
|
|
+ if (useEditMenuItems(x, y, template)) {
|
|
|
+ template = getEditMenuItems()
|
|
|
+ }
|
|
|
+ const menu = Menu.buildFromTemplate(template)
|
|
|
|
|
|
// The menu is expected to show asynchronously.
|
|
|
setTimeout(function () {
|
|
@@ -48,6 +53,44 @@ const createMenu = function (x, y, items) {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+const useEditMenuItems = function (x, y, items) {
|
|
|
+ return items.length === 0 && document.elementsFromPoint(x, y).some(function (element) {
|
|
|
+ return element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA' || element.isContentEditable
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+const getEditMenuItems = function () {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ role: 'undo'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ role: 'redo'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'separator'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ role: 'cut'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ role: 'copy'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ role: 'paste'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ role: 'pasteandmatchstyle'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ role: 'delete'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ role: 'selectall'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+}
|
|
|
+
|
|
|
const showFileChooserDialog = function (callback) {
|
|
|
const {dialog} = require('electron').remote
|
|
|
const files = dialog.showOpenDialog({})
|