зеркало из https://github.com/mozilla/gecko-dev.git
Bug 304563 Add autoscroll support to more parts of SeaMonkey. Fix regression from initial patch (bug 308503). Move autoscroll code to more common location & make some other improvements.
r=db48x sr=neil
This commit is contained in:
Родитель
eab6b68ac1
Коммит
5e7afcb05f
|
@ -43,20 +43,13 @@
|
|||
* - [ Dependencies ] ---------------------------------------------------------
|
||||
* utilityOverlay.js:
|
||||
* - gatherTextUnder
|
||||
* - startScrolling
|
||||
*/
|
||||
|
||||
var pref = null;
|
||||
pref = Components.classes["@mozilla.org/preferences-service;1"]
|
||||
.getService(Components.interfaces.nsIPrefBranch);
|
||||
|
||||
var startX;
|
||||
var startY;
|
||||
var currX;
|
||||
var currY;
|
||||
var scrollingView;
|
||||
var autoScrollTimer;
|
||||
var ignoreMouseEvents;
|
||||
|
||||
// Prefill a single text field
|
||||
function prefillTextBox(target) {
|
||||
// obtain values to be used for prefilling
|
||||
|
@ -213,65 +206,36 @@
|
|||
{
|
||||
if (event.button == 1 && (event.target != event.currentTarget)
|
||||
&& !hrefAndLinkNodeForClickEvent(event)
|
||||
&& (!pref || !pref.getBoolPref("middlemouse.contentLoadURL"))) {
|
||||
&& !isAutoscrollBlocker(event.originalTarget)) {
|
||||
startScrolling(event);
|
||||
ignoreMouseEvents = true;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function startScrolling(event)
|
||||
function isAutoscrollBlocker(node)
|
||||
{
|
||||
var scroller = document.getElementById("autoscroller");
|
||||
if (scrollingView || !scroller)
|
||||
return;
|
||||
document.popupNode = null;
|
||||
scroller.showPopup(scroller.parentNode, event.screenX, event.screenY,
|
||||
"popup", null, null);
|
||||
startX = event.screenX;
|
||||
startY = event.screenY;
|
||||
currX = event.screenX;
|
||||
currY = event.screenY;
|
||||
addEventListener('mousemove', handleMouseMove, true);
|
||||
addEventListener('mouseup', handleMouseUpDown, true);
|
||||
addEventListener('mousedown', handleMouseUpDown, true);
|
||||
autoScrollTimer = setInterval(autoScrollLoop, 10);
|
||||
scrollingView = event.originalTarget.ownerDocument.defaultView;
|
||||
}
|
||||
|
||||
function handleMouseMove(event)
|
||||
{
|
||||
currX = event.screenX;
|
||||
currY = event.screenY;
|
||||
}
|
||||
|
||||
function autoScrollLoop()
|
||||
{
|
||||
var x = currX - startX;
|
||||
var y = currY - startY;
|
||||
const speed = 4;
|
||||
if (Math.abs(x) >= speed || Math.abs(y) >= speed)
|
||||
ignoreMouseEvents = false;
|
||||
scrollingView.scrollBy(x / speed, y / speed);
|
||||
}
|
||||
|
||||
function handleMouseUpDown(event)
|
||||
{
|
||||
if (!ignoreMouseEvents)
|
||||
document.getElementById("autoscroller").hidePopup();
|
||||
ignoreMouseEvents = false;
|
||||
}
|
||||
|
||||
function stopScrolling()
|
||||
{
|
||||
if (scrollingView) {
|
||||
scrollingView = null;
|
||||
removeEventListener('mousemove', handleMouseMove, true);
|
||||
removeEventListener('mousedown', handleMouseUpDown, true);
|
||||
removeEventListener('mouseup', handleMouseUpDown, true);
|
||||
clearInterval(autoScrollTimer);
|
||||
if (!pref)
|
||||
return false;
|
||||
|
||||
if (pref.getBoolPref("middlemouse.contentLoadURL"))
|
||||
return true;
|
||||
|
||||
if (!pref.getBoolPref("middlemouse.paste"))
|
||||
return false;
|
||||
|
||||
if (node.ownerDocument.designMode == "on")
|
||||
return true;
|
||||
|
||||
while (node) {
|
||||
if (node instanceof HTMLTextAreaElement ||
|
||||
(node instanceof HTMLInputElement &&
|
||||
(node.type == "text" || node.type == "password")))
|
||||
return true;
|
||||
|
||||
node = node.parentNode;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function openNewTabOrWindow(event, href, sendReferrer)
|
||||
|
|
|
@ -568,3 +568,82 @@ function validateFileName(aFileName)
|
|||
|
||||
return aFileName.replace(re, "_");
|
||||
}
|
||||
|
||||
// autoscroll
|
||||
var gStartX;
|
||||
var gStartY;
|
||||
var gCurrX;
|
||||
var gCurrY;
|
||||
var gScrollingView;
|
||||
var gAutoScrollTimer;
|
||||
var gIgnoreMouseEvents;
|
||||
var gAutoScrollPopup = null;
|
||||
|
||||
function startScrolling(event)
|
||||
{
|
||||
if (gScrollingView || event.button != 1)
|
||||
return;
|
||||
|
||||
if (event.originalTarget instanceof XULElement &&
|
||||
((event.originalTarget.localName == "thumb")
|
||||
|| (event.originalTarget.localName == "slider")
|
||||
|| (event.originalTarget.localName == "scrollbarbutton")))
|
||||
return;
|
||||
|
||||
if (!gAutoScrollPopup) {
|
||||
const XUL_NS
|
||||
= "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
gAutoScrollPopup = document.createElementNS(XUL_NS, "popup");
|
||||
gAutoScrollPopup.id = "autoscroller";
|
||||
gAutoScrollPopup.addEventListener("popuphidden", stopScrolling, true);
|
||||
document.documentElement.appendChild(gAutoScrollPopup);
|
||||
}
|
||||
|
||||
document.popupNode = null;
|
||||
gAutoScrollPopup.showPopup(document.documentElement, event.screenX, event.screenY,
|
||||
"popup", null, null);
|
||||
gIgnoreMouseEvents = true;
|
||||
gStartX = event.screenX;
|
||||
gStartY = event.screenY;
|
||||
gCurrX = event.screenX;
|
||||
gCurrY = event.screenY;
|
||||
addEventListener('mousemove', handleMouseMove, true);
|
||||
addEventListener('mouseup', handleMouseUpDown, true);
|
||||
addEventListener('mousedown', handleMouseUpDown, true);
|
||||
gAutoScrollTimer = setInterval(autoScrollLoop, 10);
|
||||
gScrollingView = event.originalTarget.ownerDocument.defaultView;
|
||||
}
|
||||
|
||||
function handleMouseMove(event)
|
||||
{
|
||||
gCurrX = event.screenX;
|
||||
gCurrY = event.screenY;
|
||||
}
|
||||
|
||||
function autoScrollLoop()
|
||||
{
|
||||
var x = gCurrX - gStartX;
|
||||
var y = gCurrY - gStartY;
|
||||
const speed = 4;
|
||||
if (Math.abs(x) >= speed || Math.abs(y) >= speed)
|
||||
gIgnoreMouseEvents = false;
|
||||
gScrollingView.scrollBy(x / speed, y / speed);
|
||||
}
|
||||
|
||||
function handleMouseUpDown(event)
|
||||
{
|
||||
if (!gIgnoreMouseEvents)
|
||||
gAutoScrollPopup.hidePopup();
|
||||
gIgnoreMouseEvents = false;
|
||||
}
|
||||
|
||||
function stopScrolling()
|
||||
{
|
||||
if (gScrollingView) {
|
||||
gScrollingView = null;
|
||||
removeEventListener('mousemove', handleMouseMove, true);
|
||||
removeEventListener('mousedown', handleMouseUpDown, true);
|
||||
removeEventListener('mouseup', handleMouseUpDown, true);
|
||||
clearInterval(gAutoScrollTimer);
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче