That looks like a lot of work actually. Johan, others, you think we
should build in better support for this in Wicket?
Eelco
On 6/5/07, dukejansen <[EMAIL PROTECTED]> wrote:
> I've gone ahead and implemented this, but instead of using the
> Component.saveInnermostModel method, I coded up my own. The implementation
> in Component only traverses IWrapModel implementations, not IChainedModel
> implementations. My implementation handles both. Note that this will only
> find components backed by the exact same IModel instance. Two distinct model
> objects wrapping the exact same object will not match. /**
> * Searches the component tree and finds any components backed by the same
> model as the model passed in, then
> * adds those components to the given AjaxRequestTarget to be rendered
> (after first verifying that they have
> * outputMarkupId set to true).
> *
> * @param root the root MarkupContainer whose descendents will be examined
> for matching backing models
> * @param target the AjaxRequestTarget to add all the matching components to
> * @param model the model to match
> */
> public static void
> addComponentsBackedBySameModel(MarkupContainer root, final
> AjaxRequestTarget target, final IModel model) {
>
> // Visit all children, looking for components backed by the same model.
> root.visitChildren(new IVisitor() {
> public Object component(Component component) {
> if (WicketUtils.isSameInnermostModel(component.getModel(),
> model)) {
> if (component.getOutputMarkupId()) {
> // Refresh the component.
> target.addComponent(component);
> // No need to go deeper if we're already refreshing the entire component!
> return IVisitor.CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER;
> }
> }
> return IVisitor.CONTINUE_TRAVERSAL;
> }
> });
>
> // TODO: Return the list of components that were re-rendered?
> // See also:
> //
> http://www.nabble.com/Best-Practices-for-accessing-repainting-sibling-cousin-components--tf3841514.html
>
> }
>
> /**
> * Returns true if the given models ultimately share the same innermost
> model;
> * otherwise returns false.
> *
> * @param model1 the first model
> * @param model2 the second model
> * @return true if they share the same innermost model; otherwise
> * false
> */
> public static boolean isSameInnermostModel(IModel model1, IModel model2) {
> // There is a version of this on Component, but it is only aware of
> IWrapModel.
> // Our version knows how to traverse chained models as well as warpped
> models.
> if (model1 != null && model2 != null) {
> return getInnermostModel(model1) == getInnermostModel(model2);
> } else {
> return false;
> }
> }
>
> /**
> * Returns the innermost model within the given model; similar to
> Component.getInnermostModel,
> * except that it follows both IWrapModel and IChainingModel, not just the
> former.
> *
> * @param model the model
> * @return the innermost model within that model
> */
> public static IModel getInnermostModel(IModel model) {
>
> // Pass through nulls.
> if (model == null) {
> return null;
> }
>
> // Try to figure out an inner model.
> IModel innerModel = null;
> if (model instanceof IWrapModel) {
> innerModel =
> getInnermostModel(((IWrapModel)model).getWrappedModel());
> } else if (model instanceof IChainingModel) {
> innerModel =
> getInnermostModel(((IChainingModel)model).getChainedModel());
> }
>
> if (innerModel != null) {
> // If we got an inner model, return it.
> return innerModel;
> } else {
> // Otherwise the given model was the innermost, so return it.
> return model;
> }
>
> }
>
> /**
> * Returns the root ancestor of this component by walking up the parent tree
> until a component is found with no parent;
> * note that this could return the same component passed in.
> *
> * @param component the component whose root ancestor should be returned;
> must be non-null
> * @return the root ancestor
> */
> public static Component getRootAncestor(Component component) {
> ExceptionUtils.throwIfNull(component, "component");
> Component cur = component;
> while (cur.getParent() != null) {
> cur = cur.getParent();
> }
> return cur;
> }
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Wicket-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-user