Adjust coordinates to account for borders; don't consume the event when just mouse overing (only consume it when clicking); this fixes cursors oddly enough

git-svn-id: svn://10.0.0.236/trunk@5351 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
kipp
1998-07-11 03:49:56 +00:00
parent 49715b7ad9
commit 1c19e35dbc

View File

@@ -419,13 +419,16 @@ ImageFrame::Paint(nsIPresContext& aPresContext,
inner.height = nscoord(p2t * image->GetHeight());
}
aRenderingContext.DrawImage(image, inner);
}
if (GetShowFrameBorders()) {
nsIImageMap* map = GetImageMap();
if (nsnull != map) {
aRenderingContext.SetColor(NS_RGB(0, 0, 0));
map->Draw(aPresContext, aRenderingContext);
if (GetShowFrameBorders()) {
nsIImageMap* map = GetImageMap();
if (nsnull != map) {
aRenderingContext.SetColor(NS_RGB(0, 0, 0));
aRenderingContext.PushState();
aRenderingContext.Translate(inner.x, inner.y);
map->Draw(aPresContext, aRenderingContext);
aRenderingContext.PopState();
}
}
}
@@ -506,24 +509,31 @@ ImageFrame::HandleEvent(nsIPresContext& aPresContext,
NS_RELEASE(doc);
}
// Translate coordinates to pixels
float t2p = aPresContext.GetTwipsToPixels();
nscoord x = nscoord(t2p * aEvent->point.x);
nscoord y = nscoord(t2p * aEvent->point.y);
// Ask map if the x,y coordinates are in a clickable area
float t2p = aPresContext.GetTwipsToPixels();
nsAutoString absURL, target, altText;
PRBool suppress;
if (nsnull != map) {
// Subtract out border and padding here so that we are looking
// at the right coordinates. Hit detection against area tags
// is done after the mouse wanders over the image, not over
// the image's borders.
nsRect inner;
GetInnerArea(&aPresContext, inner);
nscoord x = nscoord(t2p * (aEvent->point.x - inner.x));
nscoord y = nscoord(t2p * (aEvent->point.y - inner.y));
nsresult r = map->IsInside(x, y, docURL, absURL, target, altText,
&suppress);
NS_IF_RELEASE(docURL);
NS_RELEASE(map);
if (NS_OK == r) {
// We hit a clickable area. Time to go somewhere...
TriggerLink(aPresContext, absURL, target,
aEvent->message == NS_MOUSE_LEFT_BUTTON_UP);
aEventStatus = nsEventStatus_eConsumeNoDefault;
PRBool clicked = PR_FALSE;
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
aEventStatus = nsEventStatus_eConsumeNoDefault;
clicked = PR_TRUE;
}
TriggerLink(aPresContext, absURL, target, clicked);
}
}
else {
@@ -535,12 +545,20 @@ ImageFrame::HandleEvent(nsIPresContext& aPresContext,
src.Append(*srcp);
}
NS_MakeAbsoluteURL(docURL, baseURL, src, absURL);
// Note: We don't subtract out the border/padding here to remain
// compatible with navigator. [ick]
nscoord x = nscoord(t2p * aEvent->point.x);
nscoord y = nscoord(t2p * aEvent->point.y);
char cbuf[50];
PR_snprintf(cbuf, sizeof(cbuf), "?%d,%d", x, y);
absURL.Append(cbuf);
TriggerLink(aPresContext, absURL, target,
aEvent->message == NS_MOUSE_LEFT_BUTTON_UP);
aEventStatus = nsEventStatus_eConsumeNoDefault;
PRBool clicked = PR_FALSE;
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
aEventStatus = nsEventStatus_eConsumeNoDefault;
clicked = PR_TRUE;
}
TriggerLink(aPresContext, absURL, target, clicked);
}
break;
}
@@ -572,10 +590,12 @@ ImageFrame::GetCursorAt(nsIPresContext& aPresContext,
nsIImageMap* map = GetImageMap();
if (nsnull != map) {
nsRect inner;
GetInnerArea(&aPresContext, inner);
aCursor = NS_STYLE_CURSOR_DEFAULT;
float t2p = aPresContext.GetTwipsToPixels();
nscoord x = nscoord(t2p * aPoint.x);
nscoord y = nscoord(t2p * aPoint.y);
nscoord x = nscoord(t2p * (aPoint.x - inner.x));
nscoord y = nscoord(t2p * (aPoint.y - inner.y));
if (NS_OK == map->IsInside(x, y)) {
aCursor = NS_STYLE_CURSOR_HAND;
}