// Main file, used only for Electron var electron = require('electron'), fs = require('fs'), temp = require('tmp'), ini = require('ini'), path = require('path'), requirejs = require('requirejs'); var app = electron.app; var BrowserWindow = electron.BrowserWindow; var Menu = electron.Menu; var ipc = electron.ipcMain; var dialog = electron.dialog; var mainWindow = null; var debug = false; var frameless = true; var reinit = false; // Localization features l10n = { ini: null, language: '*', init: function() { this.language = app.getLocale() || "*"; this.ini = ini.parse(fs.readFileSync(app.getAppPath()+'/locale.ini', 'utf-8')); }, setLanguage: function(lang) { this.language = lang; }, getLanguage: function() { return this.language; }, get: function(text, params) { var locales = this.ini[this.language]; if (!locales) { locales = this.ini['*']; } if (!locales[text]) { return text; } var translate = locales[text]; for (var param in params) { translate = translate.replace('{{'+param+'}}', params[param]); } return translate; } } // Save a file function saveFile(file, arg, sender) { var buf; if (arg.text) { buf = arg.text; } else { var data = arg.binary.replace(/^data:.+;base64,/, ""); buf = new Buffer(data, 'base64'); } fs.writeFile(file, buf, function(err) { sender.send('save-file-reply', {err: err, filename: file}); }); } // Load a file function LoadFile(event, file) { var extension = path.extname(file).substr(1); var fileProperty = {}; fileProperty.name = path.basename(file); var extToMimetypes = {'json':'application/json','jpg':'image/jpeg','png':'image/png','wav':'audio/wav','webm':'video/webm','mp3':'audio/mp3','mp4':'video/mp4','txt':'text/plain','pdf':'application/pdf','doc':'application/msword','odt':'application/vnd.oasis.opendocument.text'}; for (var ext in extToMimetypes) { if (ext == extension) { fileProperty.type = extToMimetypes[ext]; break; } } var json = (extension == 'json' ? 'utf8' : null); fs.readFile(file, function(err, data) { var text = (json ? data : "data:"+fileProperty.type+";base64,"+data.toString('base64')); event.sender.send('choose-files-reply', fileProperty, err, text); }); } function createWindow () { // Process argument for (var i = 0 ; i < process.argv.length ; i++) { if (process.argv[i] == '--debug') { debug = true; } else if (process.argv[i] == '--window') { frameless = false; } else if (process.argv[i] == '--init') { reinit = true; } } // Create the browser window mainWindow = new BrowserWindow({ show: false, backgroundColor: '#FFF', minWidth: 640, minHeight: 480, fullscreen: frameless, frame: !frameless, webPreferences: { webSecurity: false, nodeIntegration: true }, icon: './res/icon/electron/icon-1024.png' }); if (process.platform === 'darwin') { app.dock.setIcon(app.getAppPath()+'/res/icon/electron/icon-1024.png'); } // Load the index.html of Sugarizer mainWindow.loadURL('file://'+app.getAppPath()+'/index.html'+(reinit?'?rst=1':'')); if (frameless) { mainWindow.maximize(); } // Wait for 'ready-to-show' to display our window mainWindow.webContents.once('did-finish-load', function() { // Initialize locales l10n.init(); // Handle save file dialog ipc.on('save-file-dialog', function(event, arg) { var saveFunction = function(file) { if (file) { saveFile(file, arg, event.sender); } } if (!arg.directory) { // Ask directory to use, then save var dialogSettings = { defaultPath: arg.filename, filters: [ { name: arg.mimetype, extensions: [arg.extension] } ] }; dialogSettings.title = l10n.get("SaveFile"); dialogSettings.buttonLabel = l10n.get("Save"); dialog.showSaveDialog(dialogSettings, saveFunction); } else { // Save in the directory provided saveFunction(path.join(arg.directory,arg.filename)); } }); ipc.on('choose-directory-dialog', function(event) { var dialogSettings = { properties: ['openDirectory', 'createDirectory'] }; dialogSettings.title = l10n.get("ChooseDirectory"); dialogSettings.buttonLabel = l10n.get("Choose"); dialog.showOpenDialog(dialogSettings, function(files) { if (files && files.length > 0) { event.sender.send('choose-directory-reply', files[0]); } }); }); ipc.on('choose-files-dialog', function(event) { var dialogSettings = { properties: ['openFile', 'multiSelections'], filters: [ {name: 'Activities', extensions: ['jpg','png','json','webm','wav','mp3','mp4','pdf','txt','doc','odt']} ] }; dialogSettings.title = l10n.get("ChooseFiles"); dialogSettings.buttonLabel = l10n.get("Choose"); dialogSettings.filters[0].name = l10n.get("FilesSupported"); dialog.showOpenDialog(dialogSettings, function(files) { if (files && files.length > 0) { for (var i = 0 ; i < files.length ; i++) { LoadFile(event, files[i]); } } }); }); ipc.on('create-tempfile', function(event, arg) { temp.file('sugarizer', function(err, path, fd) { if (!err) { var data = arg.text.replace(/^data:.+;base64,/, ""); var buf = new Buffer(data, 'base64'); fs.writeFile(fd, buf, function(err) { event.sender.send('create-tempfile-reply', path); }); } }); }); // Build menu var template = []; if (process.platform === 'darwin') { var appname = electron.app.getName(); var menu = { label: appname, submenu: [{ accelerator: 'Command+Q', click: function () { app.quit() } }] }; menu.submenu[0].label = l10n.get("Quit"); template.unshift(menu); } var menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); // Debug console if (debug) { mainWindow.webContents.openDevTools(); } // Show wmain window mainWindow.show(); }); // Emitted when the window is closed mainWindow.on('closed', function() { mainWindow = null; }); } // This method will be called when Electron has finished // initialization and is ready to create browser windows app.on('ready', createWindow); // Quit when all windows are closed. app.on('window-all-closed', function () { app.quit() }); app.on('activate', function () { // 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 (mainWindow === null) { createWindow(); } });