I am trying to create a link that will replace one panel with another on the page. This seems as though it should be an easy task but after many attempts and searching the net for examples I have yet to get it working so the replacement can happen more than one without the component becoming orphaned. On the second replace attempt i get the following exception. Anyone have the solution?

Thank you,

Anthony


java.lang.IllegalStateException: This method can only be called on a component that has already been added to its parent.
     at org.apache.wicket.Component.replaceWith(Component.java:2266)
at com.pinwise.pinbase.web.components.links.SecurePanelLink $4.onClick(SecurePanelLink.java:142) at org.apache.wicket.markup.html.link.Link.onLinkClicked (Link.java:222)
     at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.wicket.RequestListenerInterface.invoke (RequestListenerInterface.java:186)


=====================================

=====================================

        public UserPanel(String id) {
                super(id);

                
                UserFormPanel userFormPanel = new 
UserFormPanel("userFormPanel");
                add( userFormPanel );
                
                List<IColumn> columns = new ArrayList<IColumn>();
                final Model m = new Model(userFormPanel);
        columns.add(new PropertyColumn(new Model("Actions"), "id")
        {
public void populateItem(Item cellItem, String componentId, final IModel model)
            {
                                EditActionPanel panel = new 
EditActionPanel(componentId, model);
panel.add( SecurePanelLink.createSecurePanelLink( "edit", m, UserFormPanel.class, model ) );
              cellItem.add( panel );
            }
        });

columns.add(new PropertyColumn(new Model("Username"), "username", "username")); columns.add(new PropertyColumn(new Model("First Name"), "firstName", "firstName")); columns.add(new PropertyColumn(new Model("Last Name"), "lastName", "lastName"));

add(new DefaultDataTable("table", columns, new SortableUserDataProvider(), 10));
        }


====================================
SecurePanelLink
====================================
public class SecurePanelLink extends Link implements ISecureComponent {

        /**
         *
         */
        private static final long serialVersionUID = 1L;

        protected IPanelLink panelLink;
        
        /**
         * @param id
         * @param c
         */
        public SecurePanelLink(String id, final Class c)
        {
                super(id);
                // Ensure that c is a subclass of Panel
                if (!Panel.class.isAssignableFrom(c))
                {
throw new IllegalArgumentException("Class " + c + " is not a subclass of Panel");
                }

                this.panelLink = createIPanelLink( id, c );
                setSecurityCheck(new LinkSecurityCheck(this, c));
        }
        
        public SecurePanelLink(String id, final Class c, Model existingPanel)
        {
                super(id);
                // Ensure that c is a subclass of Panel
                if (!Panel.class.isAssignableFrom(c))
                {
throw new IllegalArgumentException("Class " + c + " is not a subclass of Panel");
                }

                this.panelLink = createIPanelLink( id, c );
                setSecurityCheck(new LinkSecurityCheck(this, c));
        }
        
        private IPanelLink createIPanelLink( String id, final Class c ) {
                return new IPanelLink()
                {
                        private static final long serialVersionUID = 1L;

                        public Panel getPanel( String id )
                        {
                                // Create panel using panel factory
                                return getPanelFactory().newPanel(id, c );
                        }
                        
                        public Panel getPanel( String id, IModel model)
                        {
                                // Create panel using panel factory
                                return getPanelFactory().newPanel(id, c, model);
                        }
                        
                        public Panel getPanel( Panel panel, IModel model)
                        {
                                // Create panel using panel factory
                                return 
getPanelFactory().newPanel(panel.getId(), c, model);
                        }

                        public Class getPanelIdentity()
                        {
                                return c;
                        }
                };
        }
        
        /**
         *
         */
public static SecurePanelLink createSecurePanelLink( String id, Class clazz ) {
                return new SecurePanelLink( id, clazz ) {
                        /**
                         *
                         */
                        private static final long serialVersionUID = 1L;

                        public void onClick() {
                                Panel panel = ((Panel)findParent(Panel.class));
                                panel.replaceWith( panelLink.getPanel( 
panel.getId() ) );
                        }
                };
        }
        
        /**
         *
         */
public static SecurePanelLink createSecurePanelLink( String id, Class newPanel, final IModel model ) {
                return new SecurePanelLink( id, newPanel ) {
                        /**
                         *
                         */
                        private static final long serialVersionUID = 1L;

                        public void onClick() {
                                Panel panel = ((Panel)findParent(Panel.class));
                                panel.replaceWith( panelLink.getPanel( 
panel.getId(), model ) );
                        }
                };
        }
        
        /**
         *
         */
public static SecurePanelLink createSecurePanelLink( String id, final Model existingPanel, Class newPanel, final IModel model ) {
                return new SecurePanelLink( id, newPanel, existingPanel ) {
                        /**
                         *
                         */
                        private static final long serialVersionUID = 1L;
                        

                        public void onClick() {
                                Panel p = (Panel)existingPanel.getObject();
Panel panel = panelLink.getPanel((Panel)existingPanel.getObject (), model );
                                panel.setOutputMarkupId(true);
                                p.getParent().replace( panel );
                                p=panel;
                        }
                };
        }

Reply via email to