Hi,

This is possible but I'd recommend to stay away from IComponentResolvers.

You need IMarkupFilter that will register <wicket:modBox> as an auto
component and flag it (either set specific id or userData for the
ComponentTag).
Then your IComponentResolver impl can use that information and resolve
the component at render-time.
See the code of org.apache.wicket.markup.parser.filter.WicketMessageTagHandler.

Additionally check
org.apache.wicket.markup.html.TransparentWebMarkupContainer. You may
need similar functionality to resolve the parent.


For BorderBehavior check
org.apache.wicket.examples.forminput.FormInput.InputForm#InputForm(String).
It uses BeforeAndAfterBorder.
BorderBehavior is a behavior with a markup.
It is quite easy to accomplish what you need by creating a class for
each style, e.g. ModBoxStyleOneBehavior which has
ModBoxStyleOneBehavior.html with such content:

<wicket:border>
 <div class="mod-style-1">
   <wicket:body/>
 </div>
</wicket:border>


On Tue, Jun 12, 2012 at 11:18 PM, Jonathan Tougas <jtou...@gmail.com> wrote:
> I'm trying to figure out how to implement a decorator tag. Here's what I
> mean:
>
> I want:
>
> <wicket:modBox style="1">
>  <span wicket:id="modBoxText"></span>
> </wicket:modBox>
>
> to render to:
>
> <div class="mod-style-1">
>  <span>FOO!</span>
> </div>
>
> with nothing more than the usual "add( new Label( "modBoxText", "FOO!" ) )"
> in the panel class. Note that this is different than a border since there
> is no add() for the decorator. The goal of this is to create reusable ui
> elements that can be inserted into markup without requiring any wiring in
> the java class. From what I understand, this _should_ be possible.
>
> I tried to do this with an IComponentResolver by creating an instance of a
> border, but I quickly ran into trouble with the component hierarchy when I
> did this and tried to add components to the content of the decorator (such
> as <span wicket:id="modBoxText"></span>). Here are the artifacts for this
> to get an idea:
>
> ModBoxBorderResolver.java
> public class ModBoxBorderResolver implements IComponentResolver {
> @Override
> public Component resolve( MarkupContainer container, MarkupStream
> markupStream, ComponentTag tag ) {
>
> if( tag instanceof WicketTag ) {
>  String tagName = tag.getName();
>  if( tag.getName().equalsIgnoreCase( "modBox" ) ) {
> return ModBoxBorder( "modBox" );
> }
> }
>  return null;
> }
> }
>
> ModBoxBorder.java
> public class ModBoxBorder extends Border {
> ...
> }
>
> ModBoxBorder.html
> <wicket:border xmlns:wicket="http://wicket.apache.org";>
> <div wicket:id="div" class="${mod-style}">
> <wicket:body />
> </div>
> </wicket:border>
>
> I also notice BorderBehavior whihc might be another avenue, but I'm not
> sure exactly how I could get this to work simply by adding tags to the
> markup and an IComponentResolver.
>
> Has anyone done anything like this already? Perhaps there is something
> already in Wicket that I'm overlooking.



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to