зеркало из https://github.com/mozilla/pjs.git
Bug 296714 Make <hint> to work more like a tooltip, r=allan+aaronr, a=mkaply
This commit is contained in:
Родитель
f1b8475818
Коммит
14092e2434
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче