- From: Cameron McCormack <cam-www-svg@aka.mcc.id.au>
- Date: Tue, 11 Oct 2005 14:29:43 +1000
- To: www-svg@w3.org
Cameron McCormack:
> Sorry, here's a more concrete example:
And another one that illustrates the same problem in a different
situation. Let's say I want skinnable components, where skins are
defined by an element that responds to custom events (the actual
example I'm trying to get working). Like this:
<!-- myskins.svg -->
<svg xmlns... version="1.2">
<ex:skin id="mySkin">
<handler ev:event="ex:skinning">
var elt = evt.details.element;
var st = elt.xblShadowTree;
// if we're skinning a button...
if (elt.localName == "button") {
var state = evt.details.state;
var r = st.getElementById("r");
if (state == "normal") {
// if the button is not highlighted, make it grey
r.setAttributeNS(null, "fill", "#ccc");
} else if (state == "highlight") {
// if the button is highlighted, make it light grey
r.setAttributeNS(null, "fill", "#eee");
}
}
</handler>
</ex:skin>
</svg>
Let's say I defined a button component like this, getting its skin from
a URI with getURL/parseXML:
<!-- buttons.svg -->
<svg xmlns... version="1.2">
<script>
function dispatchSkinningEvent(e, st) {
var evt = document.createEvent("CustomEvent");
evt.initCustomEventNS(EXNS, "skinning", true, false,
{ element: e,
state: st });
var skin = e.getUserData("skin");
skin.dispatchEvent(evt);
}
</script>
<xbl:xbl>
<xbl:definition element="ex:button">
<xbl:template>
<rect id="r"/>
<text/>
</xbl:template>
<xbl:handlerGroup>
<handler ev:event="xbl:prebind">
// get the URL and fragid
var href = evt.target.getAttributeNS(null, "skin");
var idx = href.indexOf("#");
var url = href.substring(0, idx);
var frag = href.substring(idx + 1);
// get the referenced document
var docFrag = getURLAndParseXML(href);
// find the skin element
var skinElt = findID(docFrag, frag);
// dispatch an event to set the "normal" button appearance
evt.target.setUserData("skin", skinElt, null);
dispatchSkinningEvent(evt.target, "normal");
</handler>
<handler ev:event="mouseover">
// highlight the button when mouseovering it
dispatchSkinningEvent(evt.target, "highlight");
</handler>
<handler ev:event="mouseout">
// unhighlight the button when mouseouting it
dispatchSkinningEvent(evt.target, "normal");
</handler>
</xbl:handlerGroup>
</xbl:definition>
</xbl:xbl>
<ex:button skin="skin.svg#mySkin" .../>
</svg>
If I use getURL/parseXML to get the document containing the ex:skin
element, then it's not a real resource document, and as such isn't
"running". This means my handler elements on it won't work. If I could
load this document as a real resource document, I could write my
skinning ability in this way.
Thanks,
Cameron
--
e-mail : cam (at) mcc.id.au icq : 26955922
web : http://mcc.id.au/ msn : cam-msn (at) aka.mcc.id.au
office : +61399055779 jabber : heycam (at) jabber.org
Received on Tuesday, 11 October 2005 04:30:39 UTC