TBH I don't see this as a very common usecase. And it's not difficult
to implement on your own (although the code isn't entirely trivial).
-Matej
On 6/5/07, Eelco Hillenius <[EMAIL PROTECTED]> wrote:
> 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
>
-------------------------------------------------------------------------
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