drawio/war/electron.js
2017-12-19 15:24:05 +00:00

256 lines
No EOL
5.5 KiB
JavaScript

const fs = require('fs')
const path = require('path')
const url = require('url')
const electron = require('electron')
const {Menu: menu, shell} = require('electron')
const ipcMain = electron.ipcMain
const dialog = electron.dialog
const app = electron.app
const BrowserWindow = electron.BrowserWindow
const log = require('electron-log')
const __DEV__ = process.env.NODE_ENV === 'development'
let windowsRegistry = []
function createWindow (opt = {})
{
let options = Object.assign(
{
width: 1600,
height: 1200,
'web-security': false,
webPreferences: {
// preload: path.resolve('./preload.js'),
},
}, opt)
let mainWindow = new BrowserWindow(options)
windowsRegistry.push(mainWindow)
console.log('createWindow', opt)
let wurl = url.format(
{
pathname: `www.draw.io`,
protocol: 'https:',
query:
{
'dev': __DEV__ ? 1 : 0,
'test': __DEV__ ? 1 : 0,
'db': 0,
'gapi': 0,
'od': 0,
'gh': 0,
'tr': 0,
'analytics': 0,
'picker': 0,
'mode': 'device',
'browser': 0,
'p': 'electron',
'appcache': 1
},
slashes: true,
})
//`file://${__dirname}/index.html?dev=1&test=1&db=0&gapi=0&od=0&analytics=0&picker=0&mode=device&browser=0&p=electron`
// and load the index.html of the app.
mainWindow.loadURL(wurl)
// Open the DevTools.
if (__DEV__)
{
mainWindow.webContents.openDevTools()
}
mainWindow.on('close', (event/*:WindowEvent*/) =>
{
const win = event.sender
const index = windowsRegistry.indexOf(win)
console.log('Window on close idx:%d', index)
const contents = win.webContents
if (contents != null)
{
contents.executeJavaScript(`global.__emt_isModified()`, true,
isModified =>
{
console.log('__emt_isModified', isModified)
if (isModified)
{
var choice = dialog.showMessageBox(
win,
{
type: 'question',
buttons: ['Cancel', 'Discard Changes'],
title: 'Confirm',
message: 'The document has unsaved changes. Do you really want to quit without saving?' //mxResources.get('allChangesLost')
})
if (choice === 1)
{
win.destroy()
}
}
else
{
win.destroy()
}
})
event.preventDefault()
}
})
// Emitted when the window is closed.
mainWindow.on('closed', (event/*:WindowEvent*/) =>
{
const index = windowsRegistry.indexOf(event.sender)
console.log('Window closed idx:%d', index)
windowsRegistry.splice(index, 1)
})
mainWindow.webContents.on('did-fail-load', function()
{
let ourl = url.format(
{
pathname: `${__dirname}/index.html`,
protocol: 'file:',
query:
{
'dev': __DEV__ ? 1 : 0,
'test': __DEV__ ? 1 : 0,
'db': 0,
'gapi': 0,
'od': 0,
'gh': 0,
'tr': 0,
'analytics': 0,
'picker': 0,
'mode': 'device',
'browser': 0,
'p': 'electron'
},
slashes: true,
})
mainWindow.loadURL(ourl)
});
return mainWindow.id
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', e =>
{
//asynchronous
ipcMain.on('asynchronous-message', (event, arg) =>
{
console.log(arg) // prints "ping"
event.sender.send('asynchronous-reply', 'pong')
})
//synchronous
ipcMain.on('winman', (event, arg) =>
{
console.log('ipcMain.on winman', arg)
if (arg.action === 'newfile')
{
event.returnValue = createWindow(arg.opt)
return
}
event.returnValue = 'pong'
})
createWindow()
let template = [{
label: app.getName(),
submenu: [
{
label: 'Website',
click() { shell.openExternal('https://about.draw.io'); }
},
{
label: 'Support',
click() { shell.openExternal('https://about.draw.io/support'); }
},
{
type: 'separator'
},
{
label: 'Quit',
accelerator: 'CmdOrCtrl+Q',
click() { app.quit(); }
}]
}];
if (process.platform === 'darwin')
{
template = [{
label: app.getName(),
submenu: [
{
label: 'About ' + app.getName(),
click() { shell.openExternal('https://about.draw.io'); }
},
{
label: 'Support',
click() { shell.openExternal('https://about.draw.io/support'); }
},
{
type: 'separator'
},
{
label: 'Quit',
accelerator: 'Command+Q',
click() { app.quit(); }
}
]
}, {
label: 'Edit',
submenu: [{
label: 'Cut',
accelerator: 'CmdOrCtrl+X',
selector: 'cut:'
}, {
label: 'Copy',
accelerator: 'CmdOrCtrl+C',
selector: 'copy:'
}, {
label: 'Paste',
accelerator: 'CmdOrCtrl+V',
selector: 'paste:'
}]
}];
}
const menuBar = menu.buildFromTemplate(template);
menu.setApplicationMenu(menuBar);
})
// Quit when all windows are closed.
app.on('window-all-closed', function ()
{
console.log('window-all-closed', windowsRegistry.length)
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin')
{
app.quit()
}
})
app.on('activate', function ()
{
console.log('app on activate', windowsRegistry.length)
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (windowsRegistry.length === 0)
{
createWindow()
}
})