Ok, dont mean to spam, but I think I'm getting near a solution and it
could be usefull to other people.
Based on;
http://groups.google.com/group/gwt-cal/browse_thread/thread/7e756151acbd9b14
I came up with this;
/** a class designed to catch events and forward them to a panel under
it
* uses the techique specified in;
*
http://www.vinylfox.com/forwarding-mouse-events-through-layers/
* In future, css3 might be used instead to make this whole thing more
simple **/
public class SpiffyOverlay extends FocusPanel {
static Logger Log = Logger.getLogger("SpiffyOverlay");
public SpiffyOverlay(Widget forwardEventsToThis){
//set temp background
this.getElement().getStyle().setBackgroundColor("blue");
this.getElement().getStyle().setOpacity(0.5);
this.add(new Label("test"));
this.setSize("100%", "100%");
sinkEvents(Event.ONMOUSEUP | Event.ONDBLCLICK | Event.ONCONTEXTMENU
| Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT);
}
//capture events
@Override
public void onBrowserEvent(Event event){
Log.info("______________________onBrowserEvent from overlay");
//event.cancelBubble(true);// This will stop the event from being
// propagated
DOM.eventCancelBubble(event, true);
event.preventDefault();
switch (DOM.eventGetType(event)) {
case Event.ONCLICK:
Log.info("________________________________________________________Event.ONCLICK
");
int x = DOM.eventGetClientX(event);
int y = DOM.eventGetClientY(event);
Element clickedElement =
DOM.eventGetCurrentTarget(event);
// temporarily hide the appointment canvas
//clickedElement.setAttribute("style",
"visibility:hidden");
clickedElement.getStyle().setVisibility(Visibility.HIDDEN);
// use a native JavaScript method to find the element at
the doubleclick event
Element elementBehind = getElementFromPoint(x, y);
Log.info("________________________________________________________restoring
visibility ");
// restore the appointment canvas
clickedElement.getStyle().setVisibility(Visibility.VISIBLE);
Log.info("________________________________________________________found
element : "+elementBehind.getParentElement().getOffsetWidth());
Log.info("________________________________________________________firing
event ");
//copy the event
NativeEvent eventcopy =
Document.get().createClickEvent(event.getTypeInt(),
event.getScreenX(),
event.getScreenY(),
event.getClientX(),
event.getClientY(),
event.getCtrlKey(),
event.getAltKey(),
event.getShiftKey(),
event.getMetaKey());
elementBehind.getParentElement().dispatchEvent(eventcopy);
elementBehind.getParentElement().setTitle("test title
from overlay");
}
}
private native Element getElementFromPoint(int x, int y) /*-{
return $wnd.document.elementFromPoint(x, y);
}-*/;
}
This works for basic click events, allthough I cant seem to adapt it
for other types.
The problem is I need to copy the event and I have no idea how to do
that for anything other then clicks. Document has "createClickEvent"
but nothing thats just "createEvent".
If I just parse the event on without copying I get a
"EventException.DISPATCH_REQUEST_ERR (1)" error.