Bug 296714 Make <hint> to work more like a tooltip, r=allan+aaronr, a=mkaply

This commit is contained in:
Olli.Pettay%helsinki.fi 2005-06-08 15:33:18 +00:00
Родитель f1b8475818
Коммит 14092e2434
4 изменённых файлов: 57 добавлений и 9 удалений

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

@ -21,6 +21,7 @@
*
* Contributor(s):
* Allan Beaufour <abeaufour@novell.com>
* Olli Pettay <Olli.Pettay@helsinki.fi>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@ -75,7 +76,12 @@ nsXFormsHintHelpListener::HandleEvent(nsIDOMEvent* aEvent)
if (code == nsIDOMKeyEvent::DOM_VK_F1)
nsXFormsUtils::DispatchEvent(targetNode, eEvent_Help);
} else {
nsXFormsUtils::DispatchEvent(targetNode, eEvent_Hint);
nsAutoString type;
aEvent->GetType(type);
nsXFormsUtils::DispatchEvent(targetNode,
(type.EqualsLiteral("mouseover") ||
type.EqualsLiteral("focus"))
? eEvent_Hint : eEvent_MozHintOff);
}
}
@ -256,12 +262,16 @@ nsXFormsControlStubBase::ResetHelpAndHint(PRBool aInitialize)
return;
NS_NAMED_LITERAL_STRING(mouseover, "mouseover");
NS_NAMED_LITERAL_STRING(mouseout, "mouseout");
NS_NAMED_LITERAL_STRING(focus, "focus");
NS_NAMED_LITERAL_STRING(blur, "blur");
NS_NAMED_LITERAL_STRING(keypress, "keypress");
if (mEventListener) {
targ->RemoveEventListener(mouseover, mEventListener, PR_TRUE);
targ->RemoveEventListener(mouseout, mEventListener, PR_TRUE);
targ->RemoveEventListener(focus, mEventListener, PR_TRUE);
targ->RemoveEventListener(blur, mEventListener, PR_TRUE);
targ->RemoveEventListener(keypress, mEventListener, PR_TRUE);
mEventListener = nsnull;
}
@ -272,7 +282,9 @@ nsXFormsControlStubBase::ResetHelpAndHint(PRBool aInitialize)
return;
targ->AddEventListener(mouseover, mEventListener, PR_TRUE);
targ->AddEventListener(mouseout, mEventListener, PR_TRUE);
targ->AddEventListener(focus, mEventListener, PR_TRUE);
targ->AddEventListener(blur, mEventListener, PR_TRUE);
targ->AddEventListener(keypress, mEventListener, PR_TRUE);
}
}

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

@ -343,12 +343,14 @@ nsXFormsMessageElement::WillChangeParent(nsIDOMElement *aNewParent)
if (mType == eType_Hint) {
targ->RemoveEventListener(NS_LITERAL_STRING("xforms-hint"), this, PR_FALSE);
targ->RemoveEventListener(NS_LITERAL_STRING("xforms-moz-hint-off"),
this, PR_FALSE);
} else if (mType == eType_Help) {
targ->RemoveEventListener(NS_LITERAL_STRING("xforms-help"), this, PR_FALSE);
} else if (mType == eType_Alert) {
targ->RemoveEventListener(NS_LITERAL_STRING("xforms-invalid"), this, PR_TRUE);
targ->RemoveEventListener(NS_LITERAL_STRING("xforms-out-of-range"), this, PR_TRUE);
targ->RemoveEventListener(NS_LITERAL_STRING("xforms-binding-exception"), this, PR_TRUE);
targ->RemoveEventListener(NS_LITERAL_STRING("xforms-binding-exception"),this, PR_TRUE);
}
return NS_OK;
@ -365,6 +367,8 @@ nsXFormsMessageElement::ParentChanged(nsIDOMElement *aNewParent)
if (mType == eType_Hint) {
targ->AddEventListener(NS_LITERAL_STRING("xforms-hint"), this, PR_FALSE);
targ->AddEventListener(NS_LITERAL_STRING("xforms-moz-hint-off"),
this, PR_FALSE);
} else if (mType == eType_Help) {
targ->AddEventListener(NS_LITERAL_STRING("xforms-help"), this, PR_FALSE);
} else if (mType == eType_Alert) {
@ -498,6 +502,39 @@ nsXFormsMessageElement::HandleEphemeralMessage(nsIDOMDocument* aDoc,
if (!aEvent)
return NS_OK;
nsAutoString eventType;
aEvent->GetType(eventType);
if (mType == eType_Hint) {
// If this is a <hint> element, try to make it work more like a tooltip:
// - if we get an xforms-moz-hint-off event, hide the element.
// - if the <hint> is active and we get a new xforms-hint, then do nothing.
nsCOMPtr<nsIDocument> doc(do_QueryInterface(aDoc));
if (!doc)
return NS_OK;
nsXFormsMessageElement *msg =
NS_STATIC_CAST(nsXFormsMessageElement*,
doc->GetProperty(nsXFormsAtoms::messageProperty));
if (msg == this) {
if (eventType.EqualsLiteral("xforms-moz-hint-off")) {
if (mEphemeralTimer) {
mEphemeralTimer->Cancel();
mEphemeralTimer = nsnull;
}
doc->UnsetProperty(nsXFormsAtoms::messageProperty);
if (mVisualElement) {
mVisualElement->SetAttribute(NS_LITERAL_STRING("style"),
NS_LITERAL_STRING(EPHEMERAL_STYLE_HIDDEN));
}
ResetEphemeralPosition();
}
return NS_OK;
}
}
/// @bug How to handle the following:
/// <message level="ephemeral" src="http://mozilla.org"/>
nsCOMPtr<nsIDOMEventTarget> target;
@ -526,9 +563,6 @@ nsXFormsMessageElement::HandleEphemeralMessage(nsIDOMDocument* aDoc,
if (height > 20)
mPosY -= height > 30 ? 10 : 10 - (30 - height);
}
nsAutoString eventType;
aEvent->GetType(eventType);
// A special case for hints to make them work more like
// normal tooltips.

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

@ -89,7 +89,7 @@
#define CANCELABLE 0x01
#define BUBBLES 0x02
const EventData sXFormsEventsEntries[41] = {
const EventData sXFormsEventsEntries[42] = {
{ "xforms-model-construct", PR_FALSE, PR_TRUE },
{ "xforms-model-construct-done", PR_FALSE, PR_TRUE },
{ "xforms-ready", PR_FALSE, PR_TRUE },
@ -130,7 +130,8 @@ const EventData sXFormsEventsEntries[41] = {
{ "xforms-binding-exception", PR_FALSE, PR_TRUE },
{ "xforms-link-exception", PR_FALSE, PR_TRUE },
{ "xforms-link-error", PR_FALSE, PR_TRUE },
{ "xforms-compute-exception", PR_FALSE, PR_TRUE }
{ "xforms-compute-exception", PR_FALSE, PR_TRUE },
{ "xforms-moz-hint-off", PR_FALSE, PR_TRUE }
};
static const EventData sEventDefaultsEntries[] = {

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

@ -111,7 +111,8 @@ enum nsXFormsEvent {
eEvent_BindingException,
eEvent_LinkException,
eEvent_LinkError,
eEvent_ComputeException
eEvent_ComputeException,
eEvent_MozHintOff
};
struct EventData
@ -121,7 +122,7 @@ struct EventData
PRBool canBubble;
};
extern const EventData sXFormsEventsEntries[41];
extern const EventData sXFormsEventsEntries[42];
/**
* @todo The attribute names used on the elements to reflect the pseudo class