diff --git a/layout/html/base/src/nsBodyFrame.cpp b/layout/html/base/src/nsBodyFrame.cpp index 4c591a39e721..e1afa808bb89 100644 --- a/layout/html/base/src/nsBodyFrame.cpp +++ b/layout/html/base/src/nsBodyFrame.cpp @@ -35,6 +35,10 @@ #include "nsHTMLValue.h" #include "nsHTMLParts.h" +// XXX TEMP. See HandleEvent()... +#include "nsIEventStateManager.h" +#include "nsDOMEVent.h" + static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID); nsresult @@ -622,6 +626,102 @@ nsBodyFrame::HandleEvent(nsIPresContext& aPresContext, kid->GetNextSibling(kid); } + // XXX Hack mouse enter/exit and cursor code. THIS DOESN'T BELONG HERE! +#if 1 + if (aEventStatus != nsEventStatus_eConsumeNoDefault) { + switch (aEvent->message) { + case NS_MOUSE_MOVE: + case NS_MOUSE_ENTER: + { + nsIFrame* target = this; + nsIContent* mTargetContent = mContent; + PRInt32 cursor; + + GetCursorAndContentAt(aPresContext, aEvent->point, &target, &mTargetContent, cursor); + if (cursor == NS_STYLE_CURSOR_INHERIT) { + cursor = NS_STYLE_CURSOR_DEFAULT; + } + nsCursor c; + switch (cursor) { + default: + case NS_STYLE_CURSOR_DEFAULT: + c = eCursor_standard; + break; + case NS_STYLE_CURSOR_POINTER: + c = eCursor_hyperlink; + break; + case NS_STYLE_CURSOR_TEXT: + c = eCursor_select; + break; + } + nsIWidget* window; + target->GetWindow(window); + window->SetCursor(c); + NS_RELEASE(window); + + //If the content object under the cursor has changed, fire a mouseover/out + nsIEventStateManager *mStateManager; + nsIContent *mLastContent; + if (NS_OK == aPresContext.GetEventStateManager(&mStateManager)) { + mStateManager->GetLastMouseOverContent(&mLastContent); + if (mLastContent != mTargetContent) { + if (nsnull != mLastContent) { + //fire mouseout + nsEventStatus mStatus = nsEventStatus_eIgnore; + nsMouseEvent mEvent; + mEvent.eventStructType = NS_MOUSE_EVENT; + mEvent.message = NS_MOUSE_EXIT; + mLastContent->HandleDOMEvent(aPresContext, &mEvent, nsnull, DOM_EVENT_INIT, mStatus); + } + //fire mouseover + nsEventStatus mStatus = nsEventStatus_eIgnore; + nsMouseEvent mEvent; + mEvent.eventStructType = NS_MOUSE_EVENT; + mEvent.message = NS_MOUSE_ENTER; + mTargetContent->HandleDOMEvent(aPresContext, &mEvent, nsnull, DOM_EVENT_INIT, mStatus); + mStateManager->SetLastMouseOverContent(mTargetContent); + } + NS_RELEASE(mStateManager); + NS_IF_RELEASE(mLastContent); + } + } + break; + case NS_MOUSE_EXIT: + //Don't know if this is actually hooked up. + { + //Fire of mouseout to the last content object. + nsIEventStateManager *mStateManager; + nsIContent *mLastContent; + if (NS_OK == aPresContext.GetEventStateManager(&mStateManager)) { + mStateManager->GetLastMouseOverContent(&mLastContent); + if (nsnull != mLastContent) { + //fire mouseout + nsEventStatus mStatus = nsEventStatus_eIgnore; + nsMouseEvent mEvent; + mEvent.eventStructType = NS_MOUSE_EVENT; + mEvent.message = NS_MOUSE_EXIT; + mLastContent->HandleDOMEvent(aPresContext, &mEvent, nsnull, DOM_EVENT_INIT, mStatus); + mStateManager->SetLastMouseOverContent(nsnull); + + NS_RELEASE(mLastContent); + } + NS_RELEASE(mStateManager); + } + } + break; + case NS_MOUSE_LEFT_BUTTON_UP: + { + nsIEventStateManager *mStateManager; + if (NS_OK == aPresContext.GetEventStateManager(&mStateManager)) { + mStateManager->SetActiveLink(nsnull); + NS_RELEASE(mStateManager); + } + } + break; + } + } +#endif + return NS_OK; }