You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Per Newgro <pe...@gmx.ch> on 2007/10/12 13:00:51 UTC

Change attribute after model update

Hi *,

i would like to implement a testing issue for me. I add three panels with a link on every panel. If i click one panel-link all panels should become green. But i dont get that to work. The model in the AttributeModifier cant be refreshed. What am i missing here?

Thank you for helping me understanding this great framework.
Per

<code>
package de.yhd.buma.refreshtests;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

public abstract class BasePanel extends Panel {

  private List<IChangeListener> listeners = new ArrayList<IChangeListener>();
  
  /**
   * 
   * Constructor of BasePanel
   * @param pId
   */
  public BasePanel(String pId) {
    super(pId);
  }

  /**
   * 
   * Constructor of BasePanel
   * @param pId
   * @param pModel
   */
  public BasePanel(String pId, IModel pModel) {
    super(pId, pModel);
  }

  /**
   * adds a changeListener to a panel
   * @param pListener the listener of the panel
   */
  public void addChangeListener(IChangeListener pListener) {
    listeners.add(pListener);
  }
  
  /**
   * removes a changeListener from a panel
   * @param pListener the listener of the panel
   */
  public void removeChangeListener(IChangeListener pListener) {
    listeners.remove(pListener);
  }
  
  /**
   * initialize the panel.
   * @param pModel the model part of triad
   */
  public abstract void initialize(Object pModel);
  
  /**
   * Refresh the data model.
   * The model assigned to panel can be set thru this method.
   * It´s the partner to the model assigned in initialize.
   * The components displayed in panel will not initialized again.
   * This has been implemented because {@link #setModelObject(Object)}
   * is final.
   * @param pModel the model part of triad
   */
  public void refreshModelObject(Serializable pModel) {
    modelChanging();
    setModel(new Model(pModel));
    modelChanged();
  }
  
  /**
   * Informs listeners of model content change event
   */
  protected void fireContentChanged() {
    fireContentChanged(null);
  }
  
  /**
   * Informs listeners of model content change event
   * @param pParameter parameter that have changed
   */
  protected void fireContentChanged(Object pParameter) {
    for (IChangeListener element : listeners) {
      element.contentChanged(pParameter);
    }
  }
}

##########################################

package de.yhd.buma.refreshtests;

import java.io.Serializable;


public interface IChangeListener extends Serializable {
  
  
/**
 * Method informs a listener if the content changed 
 * @param pParam
 */
  void contentChanged(Object pParam);
  
}

##############################

package de.yhd.buma.refreshtests;

import java.io.Serializable;

public class RefreshLinkModel implements Serializable {
  
private static final long serialVersionUID = 1L;
private Boolean _highlite = false;
  
  public void  toggleHighlite() {
    _highlite = !_highlite;
  }

  public Boolean getHighlite() {
    return _highlite;
  }

  public void setHighlite(Boolean pHighlite) {
    _highlite = pHighlite;
  }

}

################################

package de.yhd.buma.refreshtests;

import java.io.Serializable;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.model.Model;


public class RefreshLinkPanel extends BasePanel {
  
  private static final long serialVersionUID = -4422790485992136492L;

  /**
   * Constructor of RefreshLinkPanel
   */
  public RefreshLinkPanel(String pId) {
    super(pId);
  }

  /**
   * 
   * @see refreshtests.BasePanel#initialize(java.lang.Object)
   */
  @Override
  public void initialize(Object pModel) {
    RefreshLinkModel model = (RefreshLinkModel) pModel;
    refreshModelObject(model);
    
    add(new AttributeModifier("style", true, new MyStyleModifierModel(model)));
    
    AjaxLink link = new AjaxLink("link") {
      private static final long serialVersionUID = 2337879573169864643L;

      public void onClick(AjaxRequestTarget target) {
        RefreshLinkModel m = (RefreshLinkModel) getParent().getModelObject();
        m.toggleHighlite();
        target.addComponent(this);
        fireContentChanged();
      }
    };
    add(link);
  }
  
  class MyStyleModifierModel extends Model {
    private static final long serialVersionUID = 1L;

    /**
     * Constructor of RefreshLinkPanel.MyStyleModifierModel
     */
    public MyStyleModifierModel(Serializable m) {
      super(m);
    }
    
    /**
     * @see org.apache.wicket.model.Model#getObject()
     */
    public Object getObject() {
      RefreshLinkModel m = (RefreshLinkModel) super.getObject();
      if (m.getHighlite()) {
        return "background:yellow;";
      }
      return "background:green;";
    }
  }
}

############################################

package de.yhd.buma.refreshtests;

public class RefreshPanel extends BasePanel {

  private static final long serialVersionUID = 1L;

  /**
   * Constructor of RefreshPanel
   */
  public RefreshPanel(String id) {
    super(id);
  }
  
  /**
   * @see refreshtests.BasePanel#initialize(java.lang.Object)
   */
  @Override
  public void initialize(Object pModel) {
    RefreshLinkPanel one = new RefreshLinkPanel("one");
    RefreshLinkPanel two = new RefreshLinkPanel("two");
    RefreshLinkPanel three = new RefreshLinkPanel("three");
    
    IChangeListener l = new MyChangeListener();
    
    one.addChangeListener(l);
    two.addChangeListener(l);
    three.addChangeListener(l);
    
    one.initialize(new RefreshLinkModel());
    two.initialize(createHighlited());
    three.initialize(new RefreshLinkModel());
  
    add(one);
    add(two);
    add(three);
  }
  
  private RefreshLinkModel createHighlited() {
    RefreshLinkModel modelOne = new RefreshLinkModel();
    modelOne.toggleHighlite();
    return modelOne;
  }

  class MyChangeListener implements IChangeListener {
    private static final long serialVersionUID = 1L;

    /**
     * 
     * @see refreshtests.IChangeListener#contentChanged(java.lang.Object)
     */
    public void contentChanged(Object pParam) {
      RefreshLinkPanel p1 = (RefreshLinkPanel) get("one");
      p1.refreshModelObject(createHighlited());
      RefreshLinkPanel p2 = (RefreshLinkPanel) get("two");
      p2.refreshModelObject(createHighlited());
      RefreshLinkPanel p3 = (RefreshLinkPanel) get("three");
      p3.refreshModelObject(createHighlited());
    }
  }
}

</code>
-- 
Psssst! Schon vom neuen GMX MultiMessenger gehört?
Der kanns mit allen: http://www.gmx.net/de/go/multimessenger

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


Re: Change attribute after model update

Posted by Andrew Klochkov <a....@webalta-team.com>.
Per Newgro wrote:
> Hi *,
>
> i would like to implement a testing issue for me. I add three panels with a link on every panel. If i click one panel-link all panels should become green. But i dont get that to work. The model in the AttributeModifier cant be refreshed. What am i missing here?
>
>   
IMHO your code is toooo complex for this simple task :-) And the main 
issue here is that you don't need to create a lot of models and then try 
to refresh them. Just have one shared Model instance for all of your 
panels and use it in your AttributeModifier also. Then in onClick() 
you'lll have to get the model object and call the setter - that's all, 
when the page will be rendered, all of your panels will use the same 
instance of model object.

> Thank you for helping me understanding this great framework.
> Per
>
> <code>
> package de.yhd.buma.refreshtests;
>
> ...
>
> </code>
>   


-- 
Andrew Klochkov


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


Re: Change attribute after model update

Posted by Igor Vaynberg <ig...@gmail.com>.
you need to make your models pull, no need for all this fancy event
listenting

class mypage extends webpage {
  private boolean green=false;

  public mypage() {
    add(new link("gogreen") { onclick() { green=true; }});

    add(new panel("p1").add(new attributemodifier("class",true,new
greenmodel()));
    add(new panel("p2").add(new attributemodifier("class",true,new
greenmodel()));
    ...
  }

  private class greenmodel extends abstractreadonlymodel {
        object getobject() { return (green)?"green":""; }
  }

-igor


On 10/12/07, Per Newgro <pe...@gmx.ch> wrote:
>
> Hi *,
>
> i would like to implement a testing issue for me. I add three panels with
> a link on every panel. If i click one panel-link all panels should become
> green. But i dont get that to work. The model in the AttributeModifier cant
> be refreshed. What am i missing here?
>
> Thank you for helping me understanding this great framework.
> Per
>
> <code>
> package de.yhd.buma.refreshtests;
>
> import java.io.Serializable;
> import java.util.ArrayList;
> import java.util.List;
>
> import org.apache.wicket.markup.html.panel.Panel;
> import org.apache.wicket.model.IModel;
> import org.apache.wicket.model.Model;
>
> public abstract class BasePanel extends Panel {
>
>   private List<IChangeListener> listeners = new
> ArrayList<IChangeListener>();
>
>   /**
>    *
>    * Constructor of BasePanel
>    * @param pId
>    */
>   public BasePanel(String pId) {
>     super(pId);
>   }
>
>   /**
>    *
>    * Constructor of BasePanel
>    * @param pId
>    * @param pModel
>    */
>   public BasePanel(String pId, IModel pModel) {
>     super(pId, pModel);
>   }
>
>   /**
>    * adds a changeListener to a panel
>    * @param pListener the listener of the panel
>    */
>   public void addChangeListener(IChangeListener pListener) {
>     listeners.add(pListener);
>   }
>
>   /**
>    * removes a changeListener from a panel
>    * @param pListener the listener of the panel
>    */
>   public void removeChangeListener(IChangeListener pListener) {
>     listeners.remove(pListener);
>   }
>
>   /**
>    * initialize the panel.
>    * @param pModel the model part of triad
>    */
>   public abstract void initialize(Object pModel);
>
>   /**
>    * Refresh the data model.
>    * The model assigned to panel can be set thru this method.
>    * It´s the partner to the model assigned in initialize.
>    * The components displayed in panel will not initialized again.
>    * This has been implemented because {@link #setModelObject(Object)}
>    * is final.
>    * @param pModel the model part of triad
>    */
>   public void refreshModelObject(Serializable pModel) {
>     modelChanging();
>     setModel(new Model(pModel));
>     modelChanged();
>   }
>
>   /**
>    * Informs listeners of model content change event
>    */
>   protected void fireContentChanged() {
>     fireContentChanged(null);
>   }
>
>   /**
>    * Informs listeners of model content change event
>    * @param pParameter parameter that have changed
>    */
>   protected void fireContentChanged(Object pParameter) {
>     for (IChangeListener element : listeners) {
>       element.contentChanged(pParameter);
>     }
>   }
> }
>
> ##########################################
>
> package de.yhd.buma.refreshtests;
>
> import java.io.Serializable;
>
>
> public interface IChangeListener extends Serializable {
>
>
> /**
> * Method informs a listener if the content changed
> * @param pParam
> */
>   void contentChanged(Object pParam);
>
> }
>
> ##############################
>
> package de.yhd.buma.refreshtests;
>
> import java.io.Serializable;
>
> public class RefreshLinkModel implements Serializable {
>
> private static final long serialVersionUID = 1L;
> private Boolean _highlite = false;
>
>   public void  toggleHighlite() {
>     _highlite = !_highlite;
>   }
>
>   public Boolean getHighlite() {
>     return _highlite;
>   }
>
>   public void setHighlite(Boolean pHighlite) {
>     _highlite = pHighlite;
>   }
>
> }
>
> ################################
>
> package de.yhd.buma.refreshtests;
>
> import java.io.Serializable;
>
> import org.apache.wicket.AttributeModifier;
> import org.apache.wicket.ajax.AjaxRequestTarget;
> import org.apache.wicket.ajax.markup.html.AjaxLink;
> import org.apache.wicket.model.Model;
>
>
> public class RefreshLinkPanel extends BasePanel {
>
>   private static final long serialVersionUID = -4422790485992136492L;
>
>   /**
>    * Constructor of RefreshLinkPanel
>    */
>   public RefreshLinkPanel(String pId) {
>     super(pId);
>   }
>
>   /**
>    *
>    * @see refreshtests.BasePanel#initialize(java.lang.Object)
>    */
>   @Override
>   public void initialize(Object pModel) {
>     RefreshLinkModel model = (RefreshLinkModel) pModel;
>     refreshModelObject(model);
>
>     add(new AttributeModifier("style", true, new
> MyStyleModifierModel(model)));
>
>     AjaxLink link = new AjaxLink("link") {
>       private static final long serialVersionUID = 2337879573169864643L;
>
>       public void onClick(AjaxRequestTarget target) {
>         RefreshLinkModel m = (RefreshLinkModel)
> getParent().getModelObject();
>         m.toggleHighlite();
>         target.addComponent(this);
>         fireContentChanged();
>       }
>     };
>     add(link);
>   }
>
>   class MyStyleModifierModel extends Model {
>     private static final long serialVersionUID = 1L;
>
>     /**
>      * Constructor of RefreshLinkPanel.MyStyleModifierModel
>      */
>     public MyStyleModifierModel(Serializable m) {
>       super(m);
>     }
>
>     /**
>      * @see org.apache.wicket.model.Model#getObject()
>      */
>     public Object getObject() {
>       RefreshLinkModel m = (RefreshLinkModel) super.getObject();
>       if (m.getHighlite()) {
>         return "background:yellow;";
>       }
>       return "background:green;";
>     }
>   }
> }
>
> ############################################
>
> package de.yhd.buma.refreshtests;
>
> public class RefreshPanel extends BasePanel {
>
>   private static final long serialVersionUID = 1L;
>
>   /**
>    * Constructor of RefreshPanel
>    */
>   public RefreshPanel(String id) {
>     super(id);
>   }
>
>   /**
>    * @see refreshtests.BasePanel#initialize(java.lang.Object)
>    */
>   @Override
>   public void initialize(Object pModel) {
>     RefreshLinkPanel one = new RefreshLinkPanel("one");
>     RefreshLinkPanel two = new RefreshLinkPanel("two");
>     RefreshLinkPanel three = new RefreshLinkPanel("three");
>
>     IChangeListener l = new MyChangeListener();
>
>     one.addChangeListener(l);
>     two.addChangeListener(l);
>     three.addChangeListener(l);
>
>     one.initialize(new RefreshLinkModel());
>     two.initialize(createHighlited());
>     three.initialize(new RefreshLinkModel());
>
>     add(one);
>     add(two);
>     add(three);
>   }
>
>   private RefreshLinkModel createHighlited() {
>     RefreshLinkModel modelOne = new RefreshLinkModel();
>     modelOne.toggleHighlite();
>     return modelOne;
>   }
>
>   class MyChangeListener implements IChangeListener {
>     private static final long serialVersionUID = 1L;
>
>     /**
>      *
>      * @see refreshtests.IChangeListener#contentChanged(java.lang.Object)
>      */
>     public void contentChanged(Object pParam) {
>       RefreshLinkPanel p1 = (RefreshLinkPanel) get("one");
>       p1.refreshModelObject(createHighlited());
>       RefreshLinkPanel p2 = (RefreshLinkPanel) get("two");
>       p2.refreshModelObject(createHighlited());
>       RefreshLinkPanel p3 = (RefreshLinkPanel) get("three");
>       p3.refreshModelObject(createHighlited());
>     }
>   }
> }
>
> </code>
> --
> Psssst! Schon vom neuen GMX MultiMessenger gehört?
> Der kanns mit allen: http://www.gmx.net/de/go/multimessenger
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>