I can't get my mind around the fact that *value* function and *eval* are
always runtime substitutions for *ImageResource*, when it's clearly said in
http://www.gwtproject.org/doc/latest/DevGuideClientBundle.html for *@eval*
-
If the user-defined function can be statically evaluated by the
compiler, then the implementation of the specific CssResource should
collapse to just a string literal.
One of the major optimizations provided by ClientBundle is an image bundle
generation, and it's done at compile time. Also any ClientBundle is a
subject of GWT.create(...) call. My point is that there's no runtime
information required here. And yet for
@def MY_CONSTANT 5px;
@def TOP_PANEL_BUTTON_AREA_MARGIN_TOP eval(
"net.vit.gwt.dev.ui.popuplogger.client.PopupLoggerImpl.evalTopPanelButtonAreaMarginTop()"
);
I get only
Java expression : net.vit.gwt.dev.ui.popuplogger.client.PopupLoggerImpl.
evalTopPanelButtonAreaMarginTop()
I'm not sure at which point the call to *evalTopPanelButtonAreaMarginTop()* is
done and why so late. But it precludes from mixing *value* or *eval* in GSS
formulas. Therefore I have to either rely on CSS3 *calc()* funcion, or do
everything in static methods like *evalTopPanelButtonAreaMarginTop()*.
-
So the task is still the same: *derive an offset, based on the information
about image(s) size and other ready-to-use constants when
CssResource.ensureInjected() is called. *
Let's say I need to declare a class *.inner* in *my.gss*, for which
*margin-top:* property would be equal to *( - <**height **of
image B>)/2 + constant*. I declare a static method:
*lib.MyWidgetImpl.java:*
public static String evalMarginTop() {
int val = (*resource*.imageA().getHeight() - *resource*.imageB().getHeight
()) / 2 + *css*.myConstant();
return val + "px";
}
Now where do I get *resource* and *css *from? Well, I believe I'm forced to
statically inject them. I didn't manage to find a better solution for my
GIN controlled client lib. These are the miniumum requirements:
*lib.MyWidgetImpl.java:*
@Inject static MyWidgetResources resources;
@Inject static MyWidgetCss css;
*lib/myWidget.gss*:
@def MY_CONSTANT 5px;
@def MARGIN_TOP eval("lib.MyWidgetImpl.evalMarginTop()");
.inner {
margin-top: MARGIN_TOP;
}
*lib.MyWidgetCss.java:*
@ImportedWithPrefix("myWidget")
public interface MyWidgetCss extends CssResource, SharedCss {
String DEFAULT_PATH = "lib/my.gss";
...
int myConstant();
}
*lib.MyWidgetResource.java:*
public interface MyWidgetResources extends ClientBundle {
@Source("lib/imageA.png")
ImageResource imageA();
@Source("lib/imageB.png")
ImageResource imageB();
@Source({MyWidgetCss.DEFAULT_PATH, SharedCss.DEFAULT_PATH});
MyWidgetCss myWidgetCss();
}
*Application:*
*blah.AppResource.java:*
public interface AppResource extends ClientBundle, MyWidgetResource,...other
bundles {
...
}
*blah.AppModule.java:*
@Override
protected void configure() {
bind(MyWidgetResource.class).to(AppResource.class).in(Singleton.class);
requestStaticInjection(MyWidgetImpl.class);
}
@Provides
@Singleton
public MyWidgetCss getMyWidgetCss(MyWidgetResource resources) {
return resources.MyWidgetCss();
}
I don't want to statically inject resources and request static injection
for each and every ui class in my application, for which I have a GSS file
with runtime evaluation. I want to inject resources in constructor. Why
does it have to be so ugly in order to make my GIN controlled client lib
work?
--
You received this message because you are subscribed to the Google Groups "GWT
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to google-web-toolkit+unsubscr...@googlegroups.com.
To post to this group, send email to google-web-toolkit@googlegroups.com.
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.