NS_IMETHODIMP nsXULTooltipListener::MouseMove(nsIDOMEvent* aMouseEvent) { if (!sShowTooltips) return NS_OK; // stash the coordinates of the event so that we can still get back to it from within the // timer callback. On win32, we'll get a MouseMove event even when a popup goes away -- // even when the mouse doesn't change position! To get around this, we make sure the // mouse has really moved before proceeding. nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(aMouseEvent)); PRInt32 newMouseX, newMouseY; mouseEvent->GetScreenX(&newMouseX); mouseEvent->GetScreenY(&newMouseY); if (mMouseScreenX == newMouseX && mMouseScreenY == newMouseY) return NS_OK; mMouseScreenX = newMouseX; mMouseScreenY = newMouseY; mCachedMouseEvent = aMouseEvent; nsCOMPtr<nsIDOMEventTarget> eventTarget; aMouseEvent->GetCurrentTarget(getter_AddRefs(eventTarget)); nsCOMPtr<nsIContent> sourceContent = do_QueryInterface(eventTarget); mSourceNode = do_GetWeakReference(sourceContent); #ifdef MOZ_XUL mIsSourceTree = sourceContent->Tag() == nsGkAtoms::treechildren; if (mIsSourceTree) CheckTreeBodyMove(mouseEvent); #endif // as the mouse moves, we want to make sure we reset the timer to show it, // so that the delay is from when the mouse stops moving, not when it enters // the node. KillTooltipTimer(); // If the mouse moves while the tooltip is up, don't do anything. We make it // go away only if it times out or leaves the target node. If nothing is // showing, though, we have to do the work. nsCOMPtr<nsIContent> currentTooltip = do_QueryReferent(mCurrentTooltip); if (!currentTooltip) { mTooltipTimer = do_CreateInstance("@mozilla.org/timer;1"); if (mTooltipTimer) { aMouseEvent->GetTarget(getter_AddRefs(eventTarget)); nsCOMPtr<nsIDOMNode> targetNode = do_QueryInterface(eventTarget); mTargetNode = do_GetWeakReference(targetNode); if (targetNode) { nsresult rv = mTooltipTimer->InitWithFuncCallback(sTooltipCallback, this, kTooltipShowTime, nsITimer::TYPE_ONE_SHOT); if (NS_FAILED(rv)) { mTargetNode = nsnull; mSourceNode = nsnull; } } } } return NS_OK; }
nsresult nsXULTooltipListener::DestroyTooltip() { nsCOMPtr<nsIDOMMouseListener> kungFuDeathGrip(this); nsCOMPtr<nsIContent> currentTooltip = do_QueryReferent(mCurrentTooltip); if (currentTooltip) { // clear out the tooltip node on the document nsCOMPtr<nsIDocument> doc = currentTooltip->GetDocument(); if (doc) { nsCOMPtr<nsIDOMXULDocument> xulDoc(do_QueryInterface(doc)); if (xulDoc) xulDoc->SetTooltipNode(nsnull); // remove the mousedown and keydown listener from document nsCOMPtr<nsIDOMEventTarget> evtTarget(do_QueryInterface(doc)); evtTarget->RemoveEventListener(NS_LITERAL_STRING("DOMMouseScroll"), (nsIDOMMouseListener*)this, PR_TRUE); evtTarget->RemoveEventListener(NS_LITERAL_STRING("mousedown"), (nsIDOMMouseListener*)this, PR_TRUE); evtTarget->RemoveEventListener(NS_LITERAL_STRING("mouseup"), (nsIDOMMouseListener*)this, PR_TRUE); evtTarget->RemoveEventListener(NS_LITERAL_STRING("keydown"), (nsIDOMMouseListener*)this, PR_TRUE); } // remove the popuphidden listener from tooltip nsCOMPtr<nsIDOMEventTarget> evtTarget(do_QueryInterface(currentTooltip)); // release tooltip before removing listener to prevent our destructor from // being called recursively (bug 120863) mCurrentTooltip = nsnull; evtTarget->RemoveEventListener(NS_LITERAL_STRING("popuphiding"), (nsIDOMMouseListener*)this, PR_FALSE); } // kill any ongoing timers KillTooltipTimer(); mSourceNode = nsnull; #ifdef MOZ_XUL mLastTreeCol = nsnull; #endif if (mAutoHideTimer) { mAutoHideTimer->Cancel(); mAutoHideTimer = nsnull; } return NS_OK; }
void xxxResetTooltip(PTOOLTIPWND pttwnd) { KillTooltipTimer(pttwnd); CheckLock(pttwnd); if (TestWF(pttwnd, WFVISIBLE)) { PWND spwndMessage; TL tlpwnd; xxxSetWindowPos((PWND)pttwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOZORDER); spwndMessage = PWNDMESSAGE(pttwnd); ThreadLockAlways(spwndMessage, &tlpwnd); xxxSetParent((PWND)pttwnd, spwndMessage); ThreadUnlock(&tlpwnd); } ZeroTooltip(pttwnd); pttwnd->head.rpdesk->dwDTFlags &= ~DF_TOOLTIP; }
/***************************************************************************\ * SetTooltipTimer * \***************************************************************************/ void SetTooltipTimer (PTOOLTIPWND pttwnd, UINT uTID, UINT uDelay) { KillTooltipTimer(pttwnd); pttwnd->uTID = uTID; InternalSetTimer((PWND)pttwnd, uTID, uDelay, NULL, 0); }