Here are some thoughts after working with PackageResourceReference.

The IModel interface is really great. It makes no assumptions about where things are coming from. I can even install an IModel instance I create on the fly, just overriding IModel.getObject() (and a couple of other methods).

I am listing files in a DataView. I want each file to have an icon, loaded from resources. The actual icon depends on the file. Here are two example icons:

   final PackageResourceReference fooIconResourceReference = new
   PackageResourceReference(Foo.class, "foo-icon.png");
   final PackageResourceReference barIconResourceReference = new
   PackageResourceReference(Bar.class, "bar-icon.png");


In my DataVIew I'd like the actual icon to be determined at retrieval time, whether "foo-icon.png" or "bar-icon.png", based upon FileItem.isBar(), like this:

   item.add(new Image("icon", new IPackageResourceReference() {
      @Override
      public PackageResource getResource() {
        if(item.getModelObject().isBar()) {
          return barIconResourceReference.getResource();
        } else {
          return fooIconResourceReference.getResource();
        }
      }
   }));


See, if there was some general IPackageResourceReference interface (analogous to IModel), I could simply override its getResource() method and delegate to already-constructed package resource reference instance. Or even better, if there was a general resource reference interface, then I could just override getResourceReference() and return fooIconResourceReference or barIconResourceReference.

But this won't work as it currently stands, because the PackageResourceReference class makes all sorts of assumptions about how the information would be retrieved. I suppose I could pass dummy variables to its constructor, since I'm going to completely override its getResource() method, but that simply underscores the need for some general interface I could override directly.

You might ask why I just don't check my item's isBar() method up front, and install the correct package resource reference in the image to begin with. The answer is that I want the icon to be determined dynamically at render time, not once when the data view is created (and perhaps not altered for a while, even though file attributes may have changed).

I'm working around it. I just thought I'd pass this thought along as input on future changes to Wicket.

Garret

Reply via email to