I´v overrided the methods setChartData and doOnChartClick of
ChartWidget to do it.
I did a special treatment for Stack and HStack. See following code:
@Override
public void setChartData(ChartData p_cd)
{
this.chartData = p_cd;
for (com.rednels.ofcgwt.client.model.elements.Element e :
chartData.getElements())
{
// add chart click events...
for (ChartClickHandler cch : e.getChartClickHandlers())
{
String onclick = "ofc_onclick('" + getSwfId() + "','"
+ cch.hashCode() + "')";
e.setOnClick(onclick);
}
// add key click events...
for (KeyClickHandler kch : e.getKeyClickHandlers())
{
String onclick = "ofc_onclick('" + getSwfId() + "','"
+ kch.hashCode() + "')";
e.setKeyOnClick(onclick);
}
for (Object o : e.getValues())
{
if (o instanceof DataValueEvents)
{
// add data value click events...
DataValueEvents dve = (DataValueEvents) o;
for (ChartClickHandler ch : dve.getHandlers())
{
String onclick = "ofc_onclick('" + getSwfId()
+ "','" + ch.hashCode() + "')";
dve.setOnClick(onclick);
}
}
else if (o instanceof Stack)
{
Stack s = (Stack) o;
for (Object sv : s.getValues())
{
if (sv instanceof StackValue)
{
DataValueEvents dve = (DataValueEvents)
sv;
for (ChartClickHandler ch :
dve.getHandlers())
{
String onclick = "ofc_onclick('" +
getSwfId() + "','" + ch.hashCode() + "')";
dve.setOnClick(onclick);
}
}
}
}
else if (o instanceof HStack)
{
HStack s = (HStack) o;
for (Object sv : s.getValues())
{
if (sv instanceof DataValueEvents)
{
DataValueEvents dve = (DataValueEvents)
sv;
for (ChartClickHandler ch :
dve.getHandlers())
{
String onclick = "ofc_onclick('" +
getSwfId() + "','" + ch.hashCode() + "')";
dve.setOnClick(onclick);
}
}
}
}
}
}
setJsonData(chartData.buildJSON().toString());
}
@Override
protected void doOnChartClick(String evt)
{
for (com.rednels.ofcgwt.client.model.elements.Element e :
chartData.getElements())
{
for (Object o : e.getValues())
{
if (o instanceof DataValueEvents)
{
DataValueEvents ee = (DataValueEvents) o;
for (ChartClickHandler ch : ee.getHandlers())
{
if (evt.equals("" + ch.hashCode()))
{
ch.onClick(new ChartClickEvent());
}
}
}
else if (o instanceof Stack)
{
Stack s = (Stack) o;
for (Object sv : s.getValues())
{
if (sv instanceof StackValue)
{
DataValueEvents ee = (DataValueEvents) sv;
for (ChartClickHandler ch :
ee.getHandlers())
{
if (evt.equals("" + ch.hashCode()))
{
ch.onClick(new ChartClickEvent());
}
}
}
}
}
else if (o instanceof HStack)
{
HStack s = (HStack) o;
for (Object sv : s.getValues())
{
if (sv instanceof DataValueEvents)
{
DataValueEvents ee = (DataValueEvents) sv;
for (ChartClickHandler ch :
ee.getHandlers())
{
if (evt.equals("" + ch.hashCode()))
{
ch.onClick(new ChartClickEvent());
}
}
}
}
}
}
}
}
I also created a new class that extends StackedBarChart.StackValue and
added a new JSON atribute "on-click".
@Override
public JSONValue buildJSON()
{
JSONObject json = (JSONObject) super.buildJSON();
if (onClick != null) json.put("on-click", new
JSONString(onClick));
return json;