/* 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" let Cc = Components.classes; let Ci = Components.interfaces; Components.utils.import("resource://gre/modules/Services.jsm"); this.EXPORTED_SYMBOLS = ["Prompt"]; function log(msg) { //Services.console.logStringMessage(msg); } function Prompt(aOptions) { this.window = "window" in aOptions ? aOptions.window : null; this.msg = { async: true }; if (aOptions.priority === 1) this.msg.type = "Prompt:ShowTop" else this.msg.type = "Prompt:Show" if ("title" in aOptions && aOptions.title != null) this.msg.title = aOptions.title; if ("message" in aOptions && aOptions.message != null) this.msg.text = aOptions.message; if ("buttons" in aOptions && aOptions.buttons != null) this.msg.buttons = aOptions.buttons; if ("hint" in aOptions && aOptions.hint != null) this.msg.hint = aOptions.hint; let idService = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator); this.guid = idService.generateUUID().toString(); this.msg.guid = this.guid; } Prompt.prototype = { setHint: function(aHint) { if (!aHint) delete this.msg.hint; else this.msg.hint = aHint; return this; }, addButton: function(aOptions) { if (!this.msg.buttons) this.msg.buttons = []; this.msg.buttons.push(aOptions.label); return this; }, _addInput: function(aOptions) { let obj = aOptions; if (this[aOptions.type + "_count"] === undefined) this[aOptions.type + "_count"] = 0; obj.id = aOptions.id || (aOptions.type + this[aOptions.type + "_count"]); this[aOptions.type + "_count"]++; if (!this.msg.inputs) this.msg.inputs = []; this.msg.inputs.push(obj); return this; }, addCheckbox: function(aOptions) { return this._addInput({ type: "checkbox", label: aOptions.label, checked: aOptions.checked, id: aOptions.id }); }, addTextbox: function(aOptions) { return this._addInput({ type: "textbox", value: aOptions.value, hint: aOptions.hint, autofocus: aOptions.autofocus, id: aOptions.id }); }, addNumber: function(aOptions) { return this._addInput({ type: "number", value: aOptions.value, hint: aOptions.hint, autofocus: aOptions.autofocus, id: aOptions.id }); }, addPassword: function(aOptions) { return this._addInput({ type: "password", value: aOptions.value, hint: aOptions.hint, autofocus: aOptions.autofocus, id : aOptions.id }); }, addDatePicker: function(aOptions) { return this._addInput({ type: aOptions.type || "date", value: aOptions.value, id: aOptions.id }); }, addColorPicker: function(aOptions) { return this._addInput({ type: "color", value: aOptions.value, id: aOptions.id }); }, addLabel: function(aOptions) { return this._addInput({ type: "label", label: aOptions.label, id: aOptions.id }); }, addMenulist: function(aOptions) { return this._addInput({ type: "menulist", values: aOptions.values, id: aOptions.id }); }, addIconGrid: function(aOptions) { return this._addInput({ type: "icongrid", items: aOptions.items, id: aOptions.id }); }, show: function(callback) { this.callback = callback; log("Sending message"); Services.obs.addObserver(this, "Prompt:Reply", false); this._innerShow(); }, _innerShow: function() { Services.androidBridge.handleGeckoMessage(JSON.stringify(this.msg)); }, observe: function(aSubject, aTopic, aData) { log("observe " + aData); let data = JSON.parse(aData); if (data.guid != this.guid) return; Services.obs.removeObserver(this, "Prompt:Reply", false); if (this.callback) this.callback(data); }, _setListItems: function(aItems) { let hasSelected = false; this.msg.listitems = []; aItems.forEach(function(item) { let obj = { id: item.id }; obj.label = item.label; if (item.disabled) obj.disabled = true; if (item.selected || hasSelected || this.msg.multiple) { if (!this.msg.selected) { this.msg.selected = new Array(this.msg.listitems.length); hasSelected = true; } this.msg.selected[this.msg.listitems.length] = item.selected; } if (item.header) obj.isGroup = true; if (item.menu) obj.isParent = true; if (item.child) obj.inGroup = true; this.msg.listitems.push(obj); }, this); return this; }, setSingleChoiceItems: function(aItems) { return this._setListItems(aItems); }, setMultiChoiceItems: function(aItems) { this.msg.multiple = true; return this._setListItems(aItems); }, }