diff options
Diffstat (limited to 'toolkit/content/finddialog.js')
-rw-r--r-- | toolkit/content/finddialog.js | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/toolkit/content/finddialog.js b/toolkit/content/finddialog.js new file mode 100644 index 000000000..fc5875321 --- /dev/null +++ b/toolkit/content/finddialog.js @@ -0,0 +1,151 @@ +// -*- indent-tabs-mode: nil; js-indent-level: 2 -*- + +/* 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/. */ + +Components.utils.import("resource://gre/modules/Services.jsm"); +Components.utils.import("resource://gre/modules/FormHistory.jsm"); + +var dialog; // Quick access to document/form elements. +var gFindInst; // nsIWebBrowserFind that we're going to use +var gFindInstData; // use this to update the find inst data + +function initDialogObject() +{ + // Create dialog object and initialize. + dialog = {}; + dialog.findKey = document.getElementById("dialog.findKey"); + dialog.caseSensitive = document.getElementById("dialog.caseSensitive"); + dialog.wrap = document.getElementById("dialog.wrap"); + dialog.find = document.getElementById("btnFind"); + dialog.up = document.getElementById("radioUp"); + dialog.down = document.getElementById("radioDown"); + dialog.rg = dialog.up.radioGroup; + dialog.bundle = null; + + // Move dialog to center, if it not been shown before + var windowElement = document.getElementById("findDialog"); + if (!windowElement.hasAttribute("screenX") || !windowElement.hasAttribute("screenY")) + { + sizeToContent(); + moveToAlertPosition(); + } +} + +function fillDialog() +{ + // get the find service, which stores global find state + var findService = Components.classes["@mozilla.org/find/find_service;1"] + .getService(Components.interfaces.nsIFindService); + + // Set initial dialog field contents. Use the gFindInst attributes first, + // this is necessary for window.find() + dialog.findKey.value = gFindInst.searchString ? gFindInst.searchString : findService.searchString; + dialog.caseSensitive.checked = gFindInst.matchCase ? gFindInst.matchCase : findService.matchCase; + dialog.wrap.checked = gFindInst.wrapFind ? gFindInst.wrapFind : findService.wrapFind; + var findBackwards = gFindInst.findBackwards ? gFindInst.findBackwards : findService.findBackwards; + if (findBackwards) + dialog.rg.selectedItem = dialog.up; + else + dialog.rg.selectedItem = dialog.down; +} + +function saveFindData() +{ + // get the find service, which stores global find state + var findService = Components.classes["@mozilla.org/find/find_service;1"] + .getService(Components.interfaces.nsIFindService); + + // Set data attributes per user input. + findService.searchString = dialog.findKey.value; + findService.matchCase = dialog.caseSensitive.checked; + findService.wrapFind = dialog.wrap.checked; + findService.findBackwards = dialog.up.selected; +} + +function onLoad() +{ + initDialogObject(); + + // get the find instance + var arg0 = window.arguments[0]; + // If the dialog was opened from window.find(), + // arg0 will be an instance of nsIWebBrowserFind + if (arg0 instanceof Components.interfaces.nsIWebBrowserFind) { + gFindInst = arg0; + } else { + gFindInstData = arg0; + gFindInst = gFindInstData.webBrowserFind; + } + + fillDialog(); + doEnabling(); + + if (dialog.findKey.value) + dialog.findKey.select(); + dialog.findKey.focus(); +} + +function onUnload() +{ + window.opener.findDialog = 0; +} + +function onAccept() +{ + if (gFindInstData && gFindInst != gFindInstData.webBrowserFind) { + gFindInstData.init(); + gFindInst = gFindInstData.webBrowserFind; + } + + // Transfer dialog contents to the find service. + saveFindData(); + updateFormHistory(); + + // set up the find instance + gFindInst.searchString = dialog.findKey.value; + gFindInst.matchCase = dialog.caseSensitive.checked; + gFindInst.wrapFind = dialog.wrap.checked; + gFindInst.findBackwards = dialog.up.selected; + + // Search. + var result = gFindInst.findNext(); + + if (!result) + { + if (!dialog.bundle) + dialog.bundle = document.getElementById("findBundle"); + Services.prompt.alert(window, dialog.bundle.getString("notFoundTitle"), + dialog.bundle.getString("notFoundWarning")); + dialog.findKey.select(); + dialog.findKey.focus(); + } + return false; +} + +function doEnabling() +{ + dialog.find.disabled = !dialog.findKey.value; +} + +function updateFormHistory() +{ + if (window.opener.PrivateBrowsingUtils && + window.opener.PrivateBrowsingUtils.isWindowPrivate(window.opener) || + !dialog.findKey.value) + return; + + if (FormHistory.enabled) { + FormHistory.update({ + op: "bump", + fieldname: "find-dialog", + value: dialog.findKey.value + }, { + handleError: function(aError) { + Components.utils.reportError("Saving find to form history failed: " + + aError.message); + } + }); + } +} |