I'm using GWT 2.4 with gwt-platform 0.7 and gin 1.5.0.
I've built a library for dynamic (live) translation of my GWT application. So every widget will get notified when the LocaleChangeEvent
gets fired and then ask my TranslationDictionary
to get the new String to display.
The widgets actually look like this:
public class LocaleAwareLabel extends Label implements LocaleChangeEventHandler {
TranslationDictionary dictionary;
String translationToken;
public LocaleAwareLabel(TranslationDictionary dictionary, EventBus eventBus, String translationToken) {
this.dictionary = dictionary;
this.translationToken = translationToken;
eventBus.addHandler(LocaleChangeEvent.TYPE, this);
getCurrentTranslationFromDictionary();
}
public void getCurrentTranslationFromDictionary() {
this.setText(dictionary.getTranslation(translationToken));
}
@Override
public void onLocaleChange(LocaleChangeEvent event) {
getCurrentTranslationFromDictionary();
}
}
As you can see: I can't easily use this widget with UiBinder, at the moment I inject EventBus
and TranslationDictionary
in my View
and use @UiField(provided=true)
like this:
@UiField(provided=true)
LocaleAwareLabel myLabel;
@Inject
public MyView(TranslationDictionary dictionary, EventBus eventBus) {
widget = uiBinder.createAndBindUi(this);
myLabel = new LocaleAwareLabel(dictionary, eventBus, "someTranslationToken");
}
What I'd like to have: Using my widgets without @UiField(provided=true)
, so I can simply put them inside a ui.xml
like this:
<custom:LocaleAwareLabel ui:field="myLabel" translationToken="someTranslationToken" />
I know I can set the translationToken
via UiBinder using:
public void setTranslationToken(String translationToken) {
this.translationToken = translationToken;
}
But then I still have the problem that I can't use a zero-args constructor because of EventBus
and TranslationDictionary
. And additionaly I can't call the getCurrentTranslationFromDictionary()
inside the constructor, because the value of translationToken
of course gets set after the constructor.
Would be nice if someone can provide a solution, maybe with code examples.
And P.S. I'm a total injection-noob, but from my understanding gin may somehow solve my problem. But I don't know how.
Thank you!
@UiFactory
looks pretty much the same as@UiField(provided=true)
. The@UiConstructor
approach looks more like what I want, but still not perfect! In my head are two other possibilities (but I don't know how to implement them):1.
I read somewhere about GinUiBinder (from gwt-platform).2.
From what I've read I thought that gin could provide some kind of factory that automatically injectsEventBus
andTranslationDictionary
and then just provides theLocaleAwareLabel(String translationToken)
constructor. Or isn't that possible because of the@UiConstructor
annotation? – Handbag