mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-08-30 01:20:43 +02:00
177 lines
5.1 KiB
JavaScript
177 lines
5.1 KiB
JavaScript
|
var gParams = window.arguments[0].QueryInterface(Components.interfaces.nsIDialogParamBlock);
|
||
|
var gSessionList = null;
|
||
|
var gTextBox = null;
|
||
|
var gAcceptButton = null;
|
||
|
var gSessionNames = {};
|
||
|
var gExistingName = 0;
|
||
|
var gNeedSelection = false;
|
||
|
|
||
|
gSessionManager._onLoad = gSessionManager.onLoad;
|
||
|
gSessionManager.onLoad = function() {
|
||
|
this._onLoad(true);
|
||
|
|
||
|
_("mac_title").hidden = !/mac/i.test(navigator.platform);
|
||
|
setDescription(_("session_label"), gParams.GetString(1));
|
||
|
|
||
|
gAcceptButton = document.documentElement.getButton("accept");
|
||
|
gAcceptButton.label = gParams.GetString(2) || gAcceptButton.label;
|
||
|
|
||
|
var sessions = this.getSessions();
|
||
|
if (gParams.GetInt(1) & 1) // add a "virtual" current session
|
||
|
{
|
||
|
sessions.unshift({ name: this._string("current_session"), fileName: "*" });
|
||
|
}
|
||
|
|
||
|
gSessionList = _("session_list");
|
||
|
gSessionList.selType = (gParams.GetInt(1) & 2)?"multiple":"single";
|
||
|
|
||
|
if (gParams.GetString(4)) // enable text box
|
||
|
{
|
||
|
_("text_container").hidden = false;
|
||
|
setDescription(_("text_label"), gParams.GetString(4));
|
||
|
gTextBox = _("text_box");
|
||
|
|
||
|
sessions.forEach(function(aSession, aIx) {
|
||
|
gSessionNames[aSession.name.trim().toLowerCase()] = aIx + 1;
|
||
|
});
|
||
|
|
||
|
onTextboxInput(gParams.GetString(6));
|
||
|
if (gExistingName && !(gParams.GetInt(1) & 256))
|
||
|
{
|
||
|
gParams.SetString(3, sessions[gExistingName - 1].fileName);
|
||
|
gTextBox.value = "";
|
||
|
onTextboxInput();
|
||
|
}
|
||
|
}
|
||
|
if (gParams.GetInt(1) & 4) // show the "Don't show [...] again" checkbox
|
||
|
{
|
||
|
_("checkbox_container").hidden = false;
|
||
|
}
|
||
|
|
||
|
sessions.forEach(function(aSession) {
|
||
|
var item = gSessionList.appendItem(aSession.name, aSession.fileName);
|
||
|
if (aSession.fileName == gParams.GetString(3))
|
||
|
{
|
||
|
setTimeout(function(aItem) { gSessionList.selectItem(aItem); }, 0, item);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if ((gNeedSelection = !gTextBox || !gParams.GetString(5)) || (gParams.GetInt(1) & 256)) // when no textbox or renaming
|
||
|
{
|
||
|
gSessionList.addEventListener("select", onListboxSelect, false);
|
||
|
onListboxSelect();
|
||
|
}
|
||
|
|
||
|
// add accessibility shortcuts (single-click / double-click / return)
|
||
|
for (var i = 0; i < gSessionList.childNodes.length; i++)
|
||
|
{
|
||
|
gSessionList.childNodes[i].setAttribute("ondblclick", "if (event.button == 0 && !event.ctrlKey && !event.shiftKey && !event.altKey) gAcceptButton.doCommand();");
|
||
|
if (gTextBox && !(gParams.GetInt(1) & 256))
|
||
|
{
|
||
|
gSessionList.childNodes[i].setAttribute("onclick", "if (event.button == 0 && !event.ctrlKey && !event.shiftKey && !event.altKey) onTextboxInput(gSessionList.childNodes[gSessionList.selectedIndex].label);");
|
||
|
}
|
||
|
}
|
||
|
if (gTextBox)
|
||
|
{
|
||
|
gSessionList.setAttribute("onkeypress", "if (event.keyCode == event.DOM_VK_RETURN && this.selectedIndex > -1) { event.button = 0; eval(this.selectedItem.getAttribute('onclick')); event.preventDefault(); }");
|
||
|
}
|
||
|
|
||
|
if (gSessionList.hasAttribute("height"))
|
||
|
{
|
||
|
gSessionList.height = gSessionList.getAttribute("height");
|
||
|
}
|
||
|
if (!window.opener)
|
||
|
{
|
||
|
document.documentElement.removeAttribute("screenX");
|
||
|
document.documentElement.removeAttribute("screenY");
|
||
|
}
|
||
|
window.sizeToContent();
|
||
|
|
||
|
gParams.SetInt(0, 1);
|
||
|
};
|
||
|
|
||
|
gSessionManager.onUnload = function() {
|
||
|
function persist(aObj, aAttr, aValue)
|
||
|
{
|
||
|
aObj.setAttribute(aAttr, aValue);
|
||
|
document.persist(aObj.id, aAttr);
|
||
|
}
|
||
|
|
||
|
if (window.opener)
|
||
|
{
|
||
|
persist(document.documentElement, "screenX", window.screenX - window.opener.screenX);
|
||
|
persist(document.documentElement, "screenY", window.screenY - window.opener.screenY);
|
||
|
}
|
||
|
persist(gSessionList, "height", gSessionList.boxObject.height);
|
||
|
|
||
|
gParams.SetInt(1, (_("checkbox").checked)?1:0);
|
||
|
};
|
||
|
|
||
|
function onListboxSelect()
|
||
|
{
|
||
|
if (!gTextBox)
|
||
|
{
|
||
|
gAcceptButton.disabled = gSessionList.selectedCount == 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
onTextboxInput();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function onTextboxInput(aNewValue)
|
||
|
{
|
||
|
if (aNewValue)
|
||
|
{
|
||
|
gTextBox.value = aNewValue;
|
||
|
setTimeout(function() { gTextBox.select(); gTextBox.focus(); }, 0);
|
||
|
}
|
||
|
|
||
|
var input = gTextBox.value.trim().toLowerCase();
|
||
|
var oldWeight = !!gAcceptButton.style.fontWeight;
|
||
|
|
||
|
gExistingName = gSessionNames[input] || 0;
|
||
|
var newWeight = gExistingName || ((gParams.GetInt(1) & 256) && gSessionList.selectedCount > 0);
|
||
|
|
||
|
if (!gNeedSelection && oldWeight != newWeight)
|
||
|
{
|
||
|
gAcceptButton.label = (newWeight)?gParams.GetString(5):gParams.GetString(2);
|
||
|
gAcceptButton.style.fontWeight = (newWeight)?"bold":"";
|
||
|
}
|
||
|
gAcceptButton.disabled = !input || gNeedSelection && (gSessionList.selectedCount == 0 || gExistingName);
|
||
|
}
|
||
|
|
||
|
function onAcceptDialog()
|
||
|
{
|
||
|
gParams.SetInt(0, 0);
|
||
|
if (gNeedSelection || ((gParams.GetInt(1) & 256) && gSessionList.selectedCount > 0))
|
||
|
{
|
||
|
gParams.SetString(3, gSessionList.selectedItems.map(function(aItem) { return aItem.value || ""; }).join("\n"));
|
||
|
}
|
||
|
else if (gExistingName)
|
||
|
{
|
||
|
gParams.SetString(3, gSessionList.childNodes[gExistingName - 1].value);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
gParams.SetString(3, "");
|
||
|
}
|
||
|
gParams.SetString(6, _("text_box").value.trim());
|
||
|
}
|
||
|
|
||
|
String.prototype.trim = function() {
|
||
|
return this.replace(/^\s+|\s+$/g, "").replace(/\s+/g, " ");
|
||
|
};
|
||
|
|
||
|
function setDescription(aObj, aValue)
|
||
|
{
|
||
|
aValue.split("\n").forEach(function(aLine) {
|
||
|
aObj.appendChild(document.createElement("description")).setAttribute("value", aLine);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function _(aId)
|
||
|
{
|
||
|
return document.getElementById(aId);
|
||
|
}
|