OK, just to remind you, the problem here is making a LinkTree work within a
frameset, where the links may have CGI parameters.  

Having tried Randy's suggestion, which I think brings me most of the way, I
get a runtime exception, so there's still a little bit to hammer out.  I'm
wondering if the problem is that my page isn't in the PageMap, and if I have
to add it, and if I have to instantiate the page using reflection to add it
to the PageMap.

Here's the exception:

java.lang.IllegalStateException: No Page found for component
[MarkupContainer [Component id = nodeComponent, page = <No Page>, path =
nodeComponent.FrameLabelIconPanel]]
     at org.apache.wicket.Component.getPage(Component.java:1706)
     at org.apache.wicket.Component.urlFor(Component.java:3211)
     ...
     
This occurs in the course of my addComponents() call:

public class FrameLabelIconPanel extends Panel 
{
        private static final long serialVersionUID = 1L;

        public FrameLabelIconPanel( String id, IModel model, FrameLinkTree tree,
final HorizontalFrameset responsePage )
        {
                super(id, model);
                addComponents(model, tree, responsePage );              
        }
        
        /*
         * This fires for the icon
         */
        protected void addComponents(IModel model, FrameLinkTree tree)
        {
                add(newImageComponent("icon", tree, model));
                add(newContentComponent("content", tree, model));
        }
        
        /*
         * Here's the meat of the problem
         */
        protected void addComponents( final IModel model, final FrameLinkTree 
tree,
final HorizontalFrameset responsePage )
        {
                BaseTree.ILinkCallback callback = new BaseTree.ILinkCallback()
        {
            private static final long serialVersionUID = 1L;

            public void onClick(AjaxRequestTarget target)
            {
                onNodeLinkClicked(model.getObject(), tree, target);
            }
        };

        MarkupContainer iconContainer = tree.newLink("iconLink", callback);
        iconContainer.add(newImageComponent("icon", tree, model));
        add( iconContainer );

                SystemTreeNodeBean innerModel = ( SystemTreeNodeBean )( (
DefaultMutableTreeNode )model.getObject() ).getUserObject();
                SystemTreeNodeBean.SystemNodeType nodeType = 
innerModel.getNodeType();
                Class<? extends org.apache.wicket.Page> pageClass = 
getPageClass( nodeType
);
                
                MarkupContainer link = null;
                PageParameters params = null;
        if ( innerModel.hasServiceId() )
        {
                params = new PageParameters();
                params.put( "serviceid", innerModel.getServiceId() );
                
//--------> Here's where we crash
                String strTargetURL = RequestUtils.toAbsolutePath( urlFor(
pageClass, params ).toString() );
                link = tree.newLink( "contentLink", strTargetURL );
        }
        else
        {
            // No parameters, works fine
            link = tree.newLink("contentLink", responsePage, pageClass );       
        
        }

        link.add(newContentComponent("content", tree, model));
        
        add(link);
        }
                
Trace into the Wicket source code and you crash here:

public abstract class Component implements IClusterable, IConverterLocator
{
    ...
        public final <C extends Page> CharSequence urlFor(final Class<C> 
pageClass,
                final PageParameters parameters)
        {
                return getRequestCycle().urlFor(getPage().getPageMap(), 
pageClass,
parameters);
        }
}       
     

Seven Corners wrote:
> 
> Well I was really grateful for that.  I've tried both alternatives and
> neither works but I think maybe I just have to fiddle with them a bit. 
> Just getting back to you before the end of the day.
> 
> Thanks for the response.
> 
> 
> 
> Randy Hammelman wrote:
>> 
>> This will probably work for you:
>> 
>> Isn't there a version of setResponsePage that takes a PageParameters
>> object?
>> 
>> setResponsePage(Page.class, pageParameters);
>> 
>> Otherwise, you can construct a url for a page with parameters using the
>> following code:
>> 
>> PageParameters params = new PageParameters();
>> params .put(PARAM_NAME, PARAM_VALUE);
>> String targetURL =
>> RequestUtils.toAbsolutePath(urlFor(YOUR_CLASS.class,params ).toString());
>> 
>> Use a link, such as ExternalLink, that takes a url.
>> 
>> 
>> Hope this helps.
>> 
>> 
>> On Fri, Oct 10, 2008 at 1:39 PM, Seven Corners <[EMAIL PROTECTED]>
>> wrote:
>> 
>>>
>>> I have figured out the considerable gyrations to subclass a LinkTree so
>>> its
>>> leaves contain links that will change the page in another frame within a
>>> frameset, and I'm doing this with regular Links (i.e., href and target
>>> attributes, and setting the response page and the frame target's page
>>> class
>>> from Link.onClick(), as Eelco does in his Frames example):
>>>
>>> public class FrameLinkTree extends LinkTree
>>> {
>>>    ...
>>>    public MarkupContainer newLink( String strId, final
>>> HorizontalFrameset
>>> frameset, final Class pageClass )
>>>    {
>>>        Link link = new Link( strId )
>>>        {
>>>            private static final long serialVersionUID = 1L;
>>>
>>>            @Override
>>>            public void onClick()
>>>            {
>>>                frameset.getFrameTarget().setFrameClass( pageClass );
>>>
>>>                // trigger re-rendering of the page
>>>                setResponsePage( frameset );
>>>            }
>>>        };
>>>        link.add( new SimpleAttributeModifier( "target", "_parent" ) );
>>>        return link;
>>>    }
>>> }
>>>
>>> However, my pages need a parameter in their constructors, so I'll need
>>> to
>>> pass that parameter from the link.  It looks like the only link type
>>> that
>>> takes parameters is the BookmarkablePageLink.  I would use this class so
>>> I
>>> could pass the parameters, only the BookmarkablePageLink doesn't use the
>>> onClick().  There's a comment in the BookmarkablePageLink code that
>>> BookmarkablePageLinks "are dispatched by the request handling servlet",
>>> so
>>> there's no way I can override that.
>>>
>>> So is there any way I can get a parameter on a Link, or is there any way
>>> I
>>> can set the frame target and response page on a BookmarkablePageLink?
>>>
>>> --
>>> View this message in context:
>>> http://www.nabble.com/Links-with-CGI-parameters--tp19923784p19923784.html
>>> Sent from the Wicket - User mailing list archive at Nabble.com.
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Links-with-CGI-parameters--tp19923784p19975650.html
Sent from the Wicket - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to