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:
cst%andrew.cmu.edu 2006-07-29 05:44:29 +00:00
Родитель eab6b68ac1
Коммит 5e7afcb05f
2 изменённых файлов: 102 добавлений и 59 удалений

Просмотреть файл

@ -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);
}
}