Is it the best way to code a Link depending on a condition

classic Classic list List threaded Threaded
18 messages Options
Reply | Threaded
Open this post in threaded view
|

Is it the best way to code a Link depending on a condition

Charles Moulliard
Hi,

I would like to know if there is a better way to code this case : What
I would like to do is to enable/disable a link depending on a
condition. If the condition is true, than we create the link otherwise
we disable it. In both case, a label must be defined for the Link.

I mean, is it possible to avoid to double the creation of the link =
new Link() ....

Here is my code

1) HTML

           <a href="#" wicket:id="linkRequest"><span
wicket:id="linkRequestTxt"/></a>


2) JAVA

                // Set link for requestId
                Link link;

                if (audit.getRequest() != null) {

                    final RequestFormModel requestFormModel = new
RequestFormModel();
                    requestFormModel.setRequestId( (int)
audit.getRequest().getId() );

                    link = new Link("linkRequest") {

                        @Override
                        public void onClick() {
                            setResponsePage(new RequestPage(requestFormModel));
                        }

                    };

                    link.add(new
Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
                    item.add(link);

                } else {
                    link = new Link("linkRequest") {

                        @Override
                        public void onClick() {
                            this.setEnabled(false);
                        }

                    };
                    Label label = new Label("linkRequestTxt","");
                    link.add(label);
                    item.add(link);


Charles Moulliard
Senior Enterprise Architect
Apache Camel Committer

*****************************
blog : http://cmoulliard.blogspot.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Matthias Keller
Sure, just create it (including the onClick which might be invalid), but
afterwards set the  setEnabled()  as needed.
As long as the link is disabled, it can never be clicked thus the
onClick() will never be executed anyway, so it's irrelevant if the
requestFormModel is valid or not...
I dont think you want the setEnabled(false) inside the onClick - do you?
That would deactivate the link after the first click which doesn't make
that much sense?

Matt

Charles Moulliard wrote:

> Hi,
>
> I would like to know if there is a better way to code this case : What
> I would like to do is to enable/disable a link depending on a
> condition. If the condition is true, than we create the link otherwise
> we disable it. In both case, a label must be defined for the Link.
>
> I mean, is it possible to avoid to double the creation of the link =
> new Link() ....
>
> Here is my code
>
> 1) HTML
>
>            <a href="#" wicket:id="linkRequest"><span
> wicket:id="linkRequestTxt"/></a>
>
>
> 2) JAVA
>
>                 // Set link for requestId
>                 Link link;
>
>                 if (audit.getRequest() != null) {
>
>                     final RequestFormModel requestFormModel = new
> RequestFormModel();
>                     requestFormModel.setRequestId( (int)
> audit.getRequest().getId() );
>
>                     link = new Link("linkRequest") {
>
>                         @Override
>                         public void onClick() {
>                             setResponsePage(new RequestPage(requestFormModel));
>                         }
>
>                     };
>
>                     link.add(new
> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
>                     item.add(link);
>
>                 } else {
>                     link = new Link("linkRequest") {
>
>                         @Override
>                         public void onClick() {
>                             this.setEnabled(false);
>                         }
>
>                     };
>                     Label label = new Label("linkRequestTxt","");
>                     link.add(label);
>                     item.add(link);
>
>
> Charles Moulliard
> Senior Enterprise Architect
> Apache Camel Committer
>
> *****************************
> blog : http://cmoulliard.blogspot.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>  

--
[hidden email]  +41 44 268 83 98
Ergon Informatik AG, Kleinstrasse 15, CH-8008 Zürich
http://www.ergon.ch
______________________________________________________________
e r g o n    smart people - smart software



smime.p7s (4K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Charles Moulliard
You are right. I don't need the setEnabled(false) in the onClick method

I have changed my code :

                                        link = new Link("linkRequest") {

                                                @Override
                                                public void onClick() {
                                                        setResponsePage(new RequestPage(requestFormModel));
                                                }
                                               
                                        };
                                       
                                        link.add(new Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
                                        item.add(link);

                                } else {
                                        link = new Link("linkRequest") {

                                                @Override
                                                public void onClick() { }
                                               
                                        };
                                        Label label = new Label("linkRequestTxt","");
                                        link.add(label);
                                        link.setEnabled(false);
                                        item.add(link);
                                }

Remark :

It should be interesting to be able to create an instance of the Link class without having to override the onclick() method. Otherwise the code becomes very verbose and requires as here that we instantiate two times the class Link

Matthias Keller wrote
Sure, just create it (including the onClick which might be invalid), but
afterwards set the  setEnabled()  as needed.
As long as the link is disabled, it can never be clicked thus the
onClick() will never be executed anyway, so it's irrelevant if the
requestFormModel is valid or not...
I dont think you want the setEnabled(false) inside the onClick - do you?
That would deactivate the link after the first click which doesn't make
that much sense?

Matt

Charles Moulliard wrote:
> Hi,
>
> I would like to know if there is a better way to code this case : What
> I would like to do is to enable/disable a link depending on a
> condition. If the condition is true, than we create the link otherwise
> we disable it. In both case, a label must be defined for the Link.
>
> I mean, is it possible to avoid to double the creation of the link =
> new Link() ....
>
> Here is my code
>
> 1) HTML
>
>             wicket:id="linkRequestTxt"/>
>
>
> 2) JAVA
>
>                 // Set link for requestId
>                 Link link;
>
>                 if (audit.getRequest() != null) {
>
>                     final RequestFormModel requestFormModel = new
> RequestFormModel();
>                     requestFormModel.setRequestId( (int)
> audit.getRequest().getId() );
>
>                     link = new Link("linkRequest") {
>
>                         @Override
>                         public void onClick() {
>                             setResponsePage(new RequestPage(requestFormModel));
>                         }
>
>                     };
>
>                     link.add(new
> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
>                     item.add(link);
>
>                 } else {
>                     link = new Link("linkRequest") {
>
>                         @Override
>                         public void onClick() {
>                             this.setEnabled(false);
>                         }
>
>                     };
>                     Label label = new Label("linkRequestTxt","");
>                     link.add(label);
>                     item.add(link);
>
>
> Charles Moulliard
> Senior Enterprise Architect
> Apache Camel Committer
>
> *****************************
> blog : http://cmoulliard.blogspot.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>  


--
matthias.keller@ergon.ch  +41 44 268 83 98
Ergon Informatik AG, Kleinstrasse 15, CH-8008 Zürich
http://www.ergon.ch
______________________________________________________________
e r g o n    smart people - smart software



 
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Matthias Keller
Hi

As I said in my previous mail, just initialize the link once using the
upper variant.
Use an if before to create the requestFormModel, in case 2, the
requestFormModel can be null - as the onClick is never executed this
will not matter.
Have something like:

final Model requestFormModel;
if (case1)
    requestFormModel = new MyModel(...);
else
    requestFormModel = null;

// Creating the one and only Link instance.
link = new Link("linkRequest") {
    public void onClick() {
       setResponsePage(new RequestPage(requestFormModel));
    }
}
item.add(link);

if (case1) {
    link.add(whatever);
    ...
} else {
    link.add(whatever for case 2);
    link.setEnabled(false);
}


cmoulliard wrote:

> You are right. I don't need the setEnabled(false) in the onClick method
>
> I have changed my code :
>
> link = new Link("linkRequest") {
>
> @Override
> public void onClick() {
> setResponsePage(new RequestPage(requestFormModel));
> }
>
> };
>
> link.add(new
> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
> item.add(link);
>
> } else {
> link = new Link("linkRequest") {
>
> @Override
> public void onClick() { }
>
> };
> Label label = new Label("linkRequestTxt","");
> link.add(label);
> link.setEnabled(false);
> item.add(link);
> }
>
> Remark :
>
> It should be interesting to be able to create an instance of the Link class
> without having to override the onclick() method. Otherwise the code becomes
> very verbose and requires as here that we instantiate two times the class
> Link
>
>
> Matthias Keller wrote:
>  
>> Sure, just create it (including the onClick which might be invalid), but
>> afterwards set the  setEnabled()  as needed.
>> As long as the link is disabled, it can never be clicked thus the
>> onClick() will never be executed anyway, so it's irrelevant if the
>> requestFormModel is valid or not...
>> I dont think you want the setEnabled(false) inside the onClick - do you?
>> That would deactivate the link after the first click which doesn't make
>> that much sense?
>>
>> Matt
>>
>> Charles Moulliard wrote:
>>    
>>> Hi,
>>>
>>> I would like to know if there is a better way to code this case : What
>>> I would like to do is to enable/disable a link depending on a
>>> condition. If the condition is true, than we create the link otherwise
>>> we disable it. In both case, a label must be defined for the Link.
>>>
>>> I mean, is it possible to avoid to double the creation of the link =
>>> new Link() ....
>>>
>>> Here is my code
>>>
>>> 1) HTML
>>>
>>>             #  wicket:id="linkRequestTxt"/>
>>>
>>>
>>> 2) JAVA
>>>
>>>                 // Set link for requestId
>>>                 Link link;
>>>
>>>                 if (audit.getRequest() != null) {
>>>
>>>                     final RequestFormModel requestFormModel = new
>>> RequestFormModel();
>>>                     requestFormModel.setRequestId( (int)
>>> audit.getRequest().getId() );
>>>
>>>                     link = new Link("linkRequest") {
>>>
>>>                         @Override
>>>                         public void onClick() {
>>>                             setResponsePage(new
>>> RequestPage(requestFormModel));
>>>                         }
>>>
>>>                     };
>>>
>>>                     link.add(new
>>> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
>>>                     item.add(link);
>>>
>>>                 } else {
>>>                     link = new Link("linkRequest") {
>>>
>>>                         @Override
>>>                         public void onClick() {
>>>                             this.setEnabled(false);
>>>                         }
>>>
>>>                     };
>>>                     Label label = new Label("linkRequestTxt","");
>>>                     link.add(label);
>>>                     item.add(link);

>>>
>>>
>>> Charles Moulliard
>>> Senior Enterprise Architect
>>> Apache Camel Committer
>>>
>>> *****************************
>>> blog : http://cmoulliard.blogspot.com
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [hidden email]
>>> For additional commands, e-mail: [hidden email]
>>>
>>>  
>>>      
>> --
>> [hidden email]  +41 44 268 83 98
>> Ergon Informatik AG, Kleinstrasse 15, CH-8008 Zürich
>> http://www.ergon.ch
>> ______________________________________________________________
>> e r g o n    smart people - smart software
>>
>>
>>
>>  
>>
>>    
>
>
> -----
> Charles Moulliard
> SOA Architect
>
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/ 
>  


smime.p7s (4K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Charles Moulliard
Mattias,

OK about what you propose but we repeat the test a second time so the code still remains very verbose.
Thanks for the suggestion.

I think that this is a general remark that some users make about Wicket. It is very difficult to reuse part of the code.

Here is another example :

I have a label called id which is used in different page. The way proposes by Wicket to code it is

Page Request

item.add(new Label("id", String.valueOf(request.getId())));

Page Notification

item.add(new Label("id", String.valueOf(notification.getId())));

When we compare page request and page notification, we see that we repeat the same code two times.

It could be interesting to set the value of the label in the page and to declare it separately

e.g

public class Commons {

        public static Label labelId = new Label("id");
        ...
}


Page Request

item.add( labelId.setValue( String.valueOf(request.getId()) );

Page Notification

item.add( labelId.setValue( String.valueOf(notification.getId()) );

Regards,

Charles

Matthias Keller wrote
Hi

As I said in my previous mail, just initialize the link once using the
upper variant.
Use an if before to create the requestFormModel, in case 2, the
requestFormModel can be null - as the onClick is never executed this
will not matter.
Have something like:

final Model requestFormModel;
if (case1)
    requestFormModel = new MyModel(...);
else
    requestFormModel = null;

// Creating the one and only Link instance.
link = new Link("linkRequest") {
    public void onClick() {
       setResponsePage(new RequestPage(requestFormModel));
    }
}
item.add(link);

if (case1) {
    link.add(whatever);
    ...
} else {
    link.add(whatever for case 2);
    link.setEnabled(false);
}


cmoulliard wrote:
> You are right. I don't need the setEnabled(false) in the onClick method
>
> I have changed my code :
>
> link = new Link("linkRequest") {
>
> @Override
> public void onClick() {
> setResponsePage(new RequestPage(requestFormModel));
> }
>
> };
>
> link.add(new
> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
> item.add(link);
>
> } else {
> link = new Link("linkRequest") {
>
> @Override
> public void onClick() { }
>
> };
> Label label = new Label("linkRequestTxt","");
> link.add(label);
> link.setEnabled(false);
> item.add(link);
> }
>
> Remark :
>
> It should be interesting to be able to create an instance of the Link class
> without having to override the onclick() method. Otherwise the code becomes
> very verbose and requires as here that we instantiate two times the class
> Link
>
>
> Matthias Keller wrote:
>  
>> Sure, just create it (including the onClick which might be invalid), but
>> afterwards set the  setEnabled()  as needed.
>> As long as the link is disabled, it can never be clicked thus the
>> onClick() will never be executed anyway, so it's irrelevant if the
>> requestFormModel is valid or not...
>> I dont think you want the setEnabled(false) inside the onClick - do you?
>> That would deactivate the link after the first click which doesn't make
>> that much sense?
>>
>> Matt
>>
>> Charles Moulliard wrote:
>>    
>>> Hi,
>>>
>>> I would like to know if there is a better way to code this case : What
>>> I would like to do is to enable/disable a link depending on a
>>> condition. If the condition is true, than we create the link otherwise
>>> we disable it. In both case, a label must be defined for the Link.
>>>
>>> I mean, is it possible to avoid to double the creation of the link =
>>> new Link() ....
>>>
>>> Here is my code
>>>
>>> 1) HTML
>>>
>>>             #  wicket:id="linkRequestTxt"/>
>>>
>>>
>>> 2) JAVA
>>>
>>>                 // Set link for requestId
>>>                 Link link;
>>>
>>>                 if (audit.getRequest() != null) {
>>>
>>>                     final RequestFormModel requestFormModel = new
>>> RequestFormModel();
>>>                     requestFormModel.setRequestId( (int)
>>> audit.getRequest().getId() );
>>>
>>>                     link = new Link("linkRequest") {
>>>
>>>                         @Override
>>>                         public void onClick() {
>>>                             setResponsePage(new
>>> RequestPage(requestFormModel));
>>>                         }
>>>
>>>                     };
>>>
>>>                     link.add(new
>>> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
>>>                     item.add(link);
>>>
>>>                 } else {
>>>                     link = new Link("linkRequest") {
>>>
>>>                         @Override
>>>                         public void onClick() {
>>>                             this.setEnabled(false);
>>>                         }
>>>
>>>                     };
>>>                     Label label = new Label("linkRequestTxt","");
>>>                     link.add(label);
>>>                     item.add(link);

>>>
>>>
>>> Charles Moulliard
>>> Senior Enterprise Architect
>>> Apache Camel Committer
>>>
>>> *****************************
>>> blog : http://cmoulliard.blogspot.com
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>
>>>  
>>>      
>> --
>> matthias.keller@ergon.ch  +41 44 268 83 98
>> Ergon Informatik AG, Kleinstrasse 15, CH-8008 Zürich
>> http://www.ergon.ch
>> ______________________________________________________________
>> e r g o n    smart people - smart software
>>
>>
>>
>>  
>>
>>    
>
>
> -----
> Charles Moulliard
> SOA Architect
>
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/ 
>  



 
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Matthias Keller
Hi

Yes there'll always be some repetition. Depending on your logic you
might also stuff the first block in the onClick event to generate the
model if it's not used anywhere else. That could eliminate the first block.

The problem about reusable components in wicket is that probably you
might end up with some problems when using the same component instance
on two pages unless you re-instantiate your Commons class in every call
which might in turn produce a lot of overhead if you only need a few of
those labels and stuff.
What you could also du is writing a kind of factory method in a base
page class (I always have a BasePage class all my pages extend from with
some common functionality). There you could have a method like
protected Label getIdLabel(String value) { return new Label("id", value); }

Matt

cmoulliard wrote:

> Mattias,
>
> OK about what you propose but we repeat the test a second time so the code
> still remains very verbose.
> Thanks for the suggestion.
>
> I think that this is a general remark that some users make about Wicket. It
> is very difficult to reuse part of the code.
>
> Here is another example :
>
> I have a label called id which is used in different page. The way proposes
> by Wicket to code it is
>
> Page Request
>
> item.add(new Label("id", String.valueOf(request.getId())));
>
> Page Notification
>
> item.add(new Label("id", String.valueOf(notification.getId())));
>
> When we compare page request and page notification, we see that we repeat
> the same code two times.
>
> It could be interesting to set the value of the label in the page and to
> declare it separately
>
> e.g
>
> public class Commons {
>
> public static Label labelId = new Label("id");
>         ...
> }
>
>
> Page Request
>
> item.add( labelId.setValue( String.valueOf(request.getId()) );
>
> Page Notification
>
> item.add( labelId.setValue( String.valueOf(notification.getId()) );
>
> Regards,
>
> Charles
>  


smime.p7s (4K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Pedro Santos
In reply to this post by Charles Moulliard
I think that this is a general remark that some users make about Wicket. It
is very difficult to reuse part of the code.

I do not agree... refactore your code, apply some design pattern, do
somethin... In your first case, here is an draft. You can creante an class
of this anonimus sub classes and reuse the code anywere.

    link = new Link("linkRequest") {
        @Override
        public void onClick() {
        setResponsePage(new RequestPage(requestFormModel));
        }
            @Override
            public boolean isVisible() {
        return audit.getRequest() != null;
        }
    };
    link.add(new Label("linkLabel", new AbstractReadOnlyModel() {
        @Override
        public Object getObject() {
        return String.valueOf(audit.getRequest().getId());
        }
    }));

On Thu, Sep 17, 2009 at 8:23 AM, cmoulliard <[hidden email]> wrote:

>
> Mattias,
>
> OK about what you propose but we repeat the test a second time so the code
> still remains very verbose.
> Thanks for the suggestion.
>
> I think that this is a general remark that some users make about Wicket. It
> is very difficult to reuse part of the code.
>
> Here is another example :
>
> I have a label called id which is used in different page. The way proposes
> by Wicket to code it is
>
> Page Request
>
> item.add(new Label("id", String.valueOf(request.getId())));
>
> Page Notification
>
> item.add(new Label("id", String.valueOf(notification.getId())));
>
> When we compare page request and page notification, we see that we repeat
> the same code two times.
>
> It could be interesting to set the value of the label in the page and to
> declare it separately
>
> e.g
>
> public class Commons {
>
>        public static Label labelId = new Label("id");
>        ...
> }
>
>
> Page Request
>
> item.add( labelId.setValue( String.valueOf(request.getId()) );
>
> Page Notification
>
> item.add( labelId.setValue( String.valueOf(notification.getId()) );
>
> Regards,
>
> Charles
>
>
> Matthias Keller wrote:
> >
> > Hi
> >
> > As I said in my previous mail, just initialize the link once using the
> > upper variant.
> > Use an if before to create the requestFormModel, in case 2, the
> > requestFormModel can be null - as the onClick is never executed this
> > will not matter.
> > Have something like:
> >
> > final Model requestFormModel;
> > if (case1)
> >     requestFormModel = new MyModel(...);
> > else
> >     requestFormModel = null;
> >
> > // Creating the one and only Link instance.
> > link = new Link("linkRequest") {
> >     public void onClick() {
> >        setResponsePage(new RequestPage(requestFormModel));
> >     }
> > }
> > item.add(link);
> >
> > if (case1) {
> >     link.add(whatever);
> >     ...
> > } else {
> >     link.add(whatever for case 2);
> >     link.setEnabled(false);
> > }
> >
> >
> > cmoulliard wrote:
> >> You are right. I don't need the setEnabled(false) in the onClick method
> >>
> >> I have changed my code :
> >>
> >>                                      link = new Link("linkRequest") {
> >>
> >>                                              @Override
> >>                                              public void onClick() {
> >>                                                      setResponsePage(new
> RequestPage(requestFormModel));
> >>                                              }
> >>
> >>                                      };
> >>
> >>                                      link.add(new
> >> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
> >>                                      item.add(link);
> >>
> >>                              } else {
> >>                                      link = new Link("linkRequest") {
> >>
> >>                                              @Override
> >>                                              public void onClick() { }
> >>
> >>                                      };
> >>                                      Label label = new
> Label("linkRequestTxt","");
> >>                                      link.add(label);
> >>                                      link.setEnabled(false);
> >>                                      item.add(link);
> >>                              }
> >>
> >> Remark :
> >>
> >> It should be interesting to be able to create an instance of the Link
> >> class
> >> without having to override the onclick() method. Otherwise the code
> >> becomes
> >> very verbose and requires as here that we instantiate two times the
> class
> >> Link
> >>
> >>
> >> Matthias Keller wrote:
> >>
> >>> Sure, just create it (including the onClick which might be invalid),
> but
> >>> afterwards set the  setEnabled()  as needed.
> >>> As long as the link is disabled, it can never be clicked thus the
> >>> onClick() will never be executed anyway, so it's irrelevant if the
> >>> requestFormModel is valid or not...
> >>> I dont think you want the setEnabled(false) inside the onClick - do
> you?
> >>> That would deactivate the link after the first click which doesn't make
> >>> that much sense?
> >>>
> >>> Matt
> >>>
> >>> Charles Moulliard wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> I would like to know if there is a better way to code this case : What
> >>>> I would like to do is to enable/disable a link depending on a
> >>>> condition. If the condition is true, than we create the link otherwise
> >>>> we disable it. In both case, a label must be defined for the Link.
> >>>>
> >>>> I mean, is it possible to avoid to double the creation of the link =
> >>>> new Link() ....
> >>>>
> >>>> Here is my code
> >>>>
> >>>> 1) HTML
> >>>>
> >>>>             #  wicket:id="linkRequestTxt"/>
> >>>>
> >>>>
> >>>> 2) JAVA
> >>>>
> >>>>                 // Set link for requestId
> >>>>                 Link link;
> >>>>
> >>>>                 if (audit.getRequest() != null) {
> >>>>
> >>>>                     final RequestFormModel requestFormModel = new
> >>>> RequestFormModel();
> >>>>                     requestFormModel.setRequestId( (int)
> >>>> audit.getRequest().getId() );
> >>>>
> >>>>                     link = new Link("linkRequest") {
> >>>>
> >>>>                         @Override
> >>>>                         public void onClick() {
> >>>>                             setResponsePage(new
> >>>> RequestPage(requestFormModel));
> >>>>                         }
> >>>>
> >>>>                     };
> >>>>
> >>>>                     link.add(new
> >>>> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
> >>>>                     item.add(link);
> >>>>
> >>>>                 } else {
> >>>>                     link = new Link("linkRequest") {
> >>>>
> >>>>                         @Override
> >>>>                         public void onClick() {
> >>>>                             this.setEnabled(false);
> >>>>                         }
> >>>>
> >>>>                     };
> >>>>                     Label label = new Label("linkRequestTxt","");
> >>>>                     link.add(label);
> >>>>                     item.add(link);
> >
> >>>>
> >>>>
> >>>> Charles Moulliard
> >>>> Senior Enterprise Architect
> >>>> Apache Camel Committer
> >>>>
> >>>> *****************************
> >>>> blog : http://cmoulliard.blogspot.com
> >>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: [hidden email]
> >>>> For additional commands, e-mail: [hidden email]
> >>>>
> >>>>
> >>>>
> >>> --
> >>> [hidden email]  +41 44 268 83 98
> >>> Ergon Informatik AG, Kleinstrasse 15, CH-8008 Zürich
> >>> http://www.ergon.ch
> >>> ______________________________________________________________
> >>> e r g o n    smart people - smart software
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>
> >>
> >> -----
> >> Charles Moulliard
> >> SOA Architect
> >>
> >> My Blog :  http://cmoulliard.blogspot.com/
> >> http://cmoulliard.blogspot.com/
> >>
> >
> >
> >
> >
> >
>
>
> -----
> Charles Moulliard
> SOA Architect
>
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/
> --
> View this message in context:
> http://www.nabble.com/Is-it-the-best-way-to-code-a-Link-depending-on-a-condition-tp25488603p25489428.html
> Sent from the Wicket - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Charles Moulliard
You are right. Everything is java so I have created a LinkRequest class extending Link and configure it in order to reuse this code in my page ;-)

So now my code looks like this :

                                if (audit.getRequest() != null) {
                                       
                                        // Link is enable with parameters requyired to open RequestPage
                                        RequestFormModel requestFormModel = new RequestFormModel();
                                        requestFormModel.setRequestId( (int) audit.getRequest().getId() );
                                        link.setRequestFormModel(requestFormModel);
                                       
                                        link.add(getLabelLinkRequestTxt( String.valueOf(audit.getRequest().getId())));
                                        item.add(link);

                                } else {
                                        // Link is disable
      link.add(getLabelLinkRequestTxt(""));
                                        link.setEnabled(false);
                                        item.add(link);
                                }

Pedro Santos-6 wrote
I think that this is a general remark that some users make about Wicket. It
is very difficult to reuse part of the code.

I do not agree... refactore your code, apply some design pattern, do
somethin... In your first case, here is an draft. You can creante an class
of this anonimus sub classes and reuse the code anywere.

    link = new Link("linkRequest") {
        @Override
        public void onClick() {
        setResponsePage(new RequestPage(requestFormModel));
        }
            @Override
            public boolean isVisible() {
        return audit.getRequest() != null;
        }
    };
    link.add(new Label("linkLabel", new AbstractReadOnlyModel() {
        @Override
        public Object getObject() {
        return String.valueOf(audit.getRequest().getId());
        }
    }));

On Thu, Sep 17, 2009 at 8:23 AM, cmoulliard <cmoulliard@gmail.com> wrote:

>
> Mattias,
>
> OK about what you propose but we repeat the test a second time so the code
> still remains very verbose.
> Thanks for the suggestion.
>
> I think that this is a general remark that some users make about Wicket. It
> is very difficult to reuse part of the code.
>
> Here is another example :
>
> I have a label called id which is used in different page. The way proposes
> by Wicket to code it is
>
> Page Request
>
> item.add(new Label("id", String.valueOf(request.getId())));
>
> Page Notification
>
> item.add(new Label("id", String.valueOf(notification.getId())));
>
> When we compare page request and page notification, we see that we repeat
> the same code two times.
>
> It could be interesting to set the value of the label in the page and to
> declare it separately
>
> e.g
>
> public class Commons {
>
>        public static Label labelId = new Label("id");
>        ...
> }
>
>
> Page Request
>
> item.add( labelId.setValue( String.valueOf(request.getId()) );
>
> Page Notification
>
> item.add( labelId.setValue( String.valueOf(notification.getId()) );
>
> Regards,
>
> Charles
>
>
> Matthias Keller wrote:
> >
> > Hi
> >
> > As I said in my previous mail, just initialize the link once using the
> > upper variant.
> > Use an if before to create the requestFormModel, in case 2, the
> > requestFormModel can be null - as the onClick is never executed this
> > will not matter.
> > Have something like:
> >
> > final Model requestFormModel;
> > if (case1)
> >     requestFormModel = new MyModel(...);
> > else
> >     requestFormModel = null;
> >
> > // Creating the one and only Link instance.
> > link = new Link("linkRequest") {
> >     public void onClick() {
> >        setResponsePage(new RequestPage(requestFormModel));
> >     }
> > }
> > item.add(link);
> >
> > if (case1) {
> >     link.add(whatever);
> >     ...
> > } else {
> >     link.add(whatever for case 2);
> >     link.setEnabled(false);
> > }
> >
> >
> > cmoulliard wrote:
> >> You are right. I don't need the setEnabled(false) in the onClick method
> >>
> >> I have changed my code :
> >>
> >>                                      link = new Link("linkRequest") {
> >>
> >>                                              @Override
> >>                                              public void onClick() {
> >>                                                      setResponsePage(new
> RequestPage(requestFormModel));
> >>                                              }
> >>
> >>                                      };
> >>
> >>                                      link.add(new
> >> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
> >>                                      item.add(link);
> >>
> >>                              } else {
> >>                                      link = new Link("linkRequest") {
> >>
> >>                                              @Override
> >>                                              public void onClick() { }
> >>
> >>                                      };
> >>                                      Label label = new
> Label("linkRequestTxt","");
> >>                                      link.add(label);
> >>                                      link.setEnabled(false);
> >>                                      item.add(link);
> >>                              }
> >>
> >> Remark :
> >>
> >> It should be interesting to be able to create an instance of the Link
> >> class
> >> without having to override the onclick() method. Otherwise the code
> >> becomes
> >> very verbose and requires as here that we instantiate two times the
> class
> >> Link
> >>
> >>
> >> Matthias Keller wrote:
> >>
> >>> Sure, just create it (including the onClick which might be invalid),
> but
> >>> afterwards set the  setEnabled()  as needed.
> >>> As long as the link is disabled, it can never be clicked thus the
> >>> onClick() will never be executed anyway, so it's irrelevant if the
> >>> requestFormModel is valid or not...
> >>> I dont think you want the setEnabled(false) inside the onClick - do
> you?
> >>> That would deactivate the link after the first click which doesn't make
> >>> that much sense?
> >>>
> >>> Matt
> >>>
> >>> Charles Moulliard wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> I would like to know if there is a better way to code this case : What
> >>>> I would like to do is to enable/disable a link depending on a
> >>>> condition. If the condition is true, than we create the link otherwise
> >>>> we disable it. In both case, a label must be defined for the Link.
> >>>>
> >>>> I mean, is it possible to avoid to double the creation of the link =
> >>>> new Link() ....
> >>>>
> >>>> Here is my code
> >>>>
> >>>> 1) HTML
> >>>>
> >>>>             #  wicket:id="linkRequestTxt"/>
> >>>>
> >>>>
> >>>> 2) JAVA
> >>>>
> >>>>                 // Set link for requestId
> >>>>                 Link link;
> >>>>
> >>>>                 if (audit.getRequest() != null) {
> >>>>
> >>>>                     final RequestFormModel requestFormModel = new
> >>>> RequestFormModel();
> >>>>                     requestFormModel.setRequestId( (int)
> >>>> audit.getRequest().getId() );
> >>>>
> >>>>                     link = new Link("linkRequest") {
> >>>>
> >>>>                         @Override
> >>>>                         public void onClick() {
> >>>>                             setResponsePage(new
> >>>> RequestPage(requestFormModel));
> >>>>                         }
> >>>>
> >>>>                     };
> >>>>
> >>>>                     link.add(new
> >>>> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
> >>>>                     item.add(link);
> >>>>
> >>>>                 } else {
> >>>>                     link = new Link("linkRequest") {
> >>>>
> >>>>                         @Override
> >>>>                         public void onClick() {
> >>>>                             this.setEnabled(false);
> >>>>                         }
> >>>>
> >>>>                     };
> >>>>                     Label label = new Label("linkRequestTxt","");
> >>>>                     link.add(label);
> >>>>                     item.add(link);
> >
> >>>>
> >>>>
> >>>> Charles Moulliard
> >>>> Senior Enterprise Architect
> >>>> Apache Camel Committer
> >>>>
> >>>> *****************************
> >>>> blog : http://cmoulliard.blogspot.com
> >>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>
> >>>>
> >>>>
> >>> --
> >>> matthias.keller@ergon.ch  +41 44 268 83 98
> >>> Ergon Informatik AG, Kleinstrasse 15, CH-8008 Zürich
> >>> http://www.ergon.ch
> >>> ______________________________________________________________
> >>> e r g o n    smart people - smart software
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>
> >>
> >> -----
> >> Charles Moulliard
> >> SOA Architect
> >>
> >> My Blog :  http://cmoulliard.blogspot.com/
> >> http://cmoulliard.blogspot.com/
> >>
> >
> >
> >
> >
> >
>
>
> -----
> Charles Moulliard
> SOA Architect
>
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/
> --
> View this message in context:
> http://www.nabble.com/Is-it-the-best-way-to-code-a-Link-depending-on-a-condition-tp25488603p25489428.html
> Sent from the Wicket - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

joseph.pachod
In reply to this post by Charles Moulliard
cmoulliard wrote:

> (...)
> I think that this is a general remark that some users make about Wicket. It
> is very difficult to reuse part of the code.
>
> Here is another example :
>
> I have a label called id which is used in different page. The way proposes
> by Wicket to code it is
>
> Page Request
>
> item.add(new Label("id", String.valueOf(request.getId())));
>
> Page Notification
>
> item.add(new Label("id", String.valueOf(notification.getId())));
>
> When we compare page request and page notification, we see that we repeat
> the same code two times.
Hi

I think the "wicket way" here may be to create a panel containing this
label and then reuse the panel. The panel could also have a model in
order to get the label content.

Would this solve your repetition issue ?

++
joseph

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Charles Moulliard
What I have done to avoid to repeat the creation of the labels is to define and use static method

        private Label labelTitle;
        public static Label getLabelTitle(String title) {
                return new Label("title",new Model( title ));
        }

Joseph Pachod wrote
cmoulliard wrote:
> (...)
> I think that this is a general remark that some users make about Wicket. It
> is very difficult to reuse part of the code.
>
> Here is another example :
>
> I have a label called id which is used in different page. The way proposes
> by Wicket to code it is
>
> Page Request
>
> item.add(new Label("id", String.valueOf(request.getId())));
>
> Page Notification
>
> item.add(new Label("id", String.valueOf(notification.getId())));
>
> When we compare page request and page notification, we see that we repeat
> the same code two times.
Hi

I think the "wicket way" here may be to create a panel containing this
label and then reuse the panel. The panel could also have a model in
order to get the label content.

Would this solve your repetition issue ?

++
joseph

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

joseph.pachod
cmoulliard wrote:
> What I have done to avoid to repeat the creation of the labels is to define
> and use static method
>
> private Label labelTitle;
> public static Label getLabelTitle(String title) {
> return new Label("title",new Model( title ));
> }
>  
I personally would name this method createLabelTitle(String title) or
getNewLabelTitle(String title), for explicitness.

Furthermore, I would directly provide it with a "final IModel<String>
title" attribute, not to dictate how the data has to be provided
(dynamic or not for example).

In the end, this method is fine for just a label, but for anything more
complex a panel would be the way to go I would say. The main exception
here I see right now is the case of pages.

For example, if we're speaking of a page title, then I would define it
in my base page and make an abstract String getTitle() method in the
base page so I'm sure everyone set it up later on. I would do the same
if it's a specific kind of structured page, for example an abstract
class ContentHoldingPage extend TheBasePage.

++

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

jeremy@wickettraining.com
In reply to this post by Charles Moulliard
This is because you're not using models correctly.  And you apparently are
not using page inheritance either.  Both of those things will fix this
"problem" that you describe.  Also, Wicket makes it *very* easy to create
reusable code - in your link example, just make a subclass of link as a
concrete class (rather than an anonymous inner class) and reuse it anywhere
you want.

From your posts here, I would recommend these two things:
1 - learn about models - don't do new Label("id", someStaticText) - use new
Label("id", new PropertyModel(request, id)) or some other proper model

2 - don't call setEnabled() - override isEnabled

Both are common errors to those who are new to Wicket - and both will come
back to bite you later.

http://cwiki.apache.org/WICKET/working-with-wicket-models.html


--
Jeremy Thomerson
http://www.wickettraining.com



On Thu, Sep 17, 2009 at 6:23 AM, cmoulliard <[hidden email]> wrote:

>
> Mattias,
>
> OK about what you propose but we repeat the test a second time so the code
> still remains very verbose.
> Thanks for the suggestion.
>
> I think that this is a general remark that some users make about Wicket. It
> is very difficult to reuse part of the code.
>
> Here is another example :
>
> I have a label called id which is used in different page. The way proposes
> by Wicket to code it is
>
> Page Request
>
> item.add(new Label("id", String.valueOf(request.getId())));
>
> Page Notification
>
> item.add(new Label("id", String.valueOf(notification.getId())));
>
> When we compare page request and page notification, we see that we repeat
> the same code two times.
>
> It could be interesting to set the value of the label in the page and to
> declare it separately
>
> e.g
>
> public class Commons {
>
>        public static Label labelId = new Label("id");
>        ...
> }
>
>
> Page Request
>
> item.add( labelId.setValue( String.valueOf(request.getId()) );
>
> Page Notification
>
> item.add( labelId.setValue( String.valueOf(notification.getId()) );
>
> Regards,
>
> Charles
>
>
> Matthias Keller wrote:
> >
> > Hi
> >
> > As I said in my previous mail, just initialize the link once using the
> > upper variant.
> > Use an if before to create the requestFormModel, in case 2, the
> > requestFormModel can be null - as the onClick is never executed this
> > will not matter.
> > Have something like:
> >
> > final Model requestFormModel;
> > if (case1)
> >     requestFormModel = new MyModel(...);
> > else
> >     requestFormModel = null;
> >
> > // Creating the one and only Link instance.
> > link = new Link("linkRequest") {
> >     public void onClick() {
> >        setResponsePage(new RequestPage(requestFormModel));
> >     }
> > }
> > item.add(link);
> >
> > if (case1) {
> >     link.add(whatever);
> >     ...
> > } else {
> >     link.add(whatever for case 2);
> >     link.setEnabled(false);
> > }
> >
> >
> > cmoulliard wrote:
> >> You are right. I don't need the setEnabled(false) in the onClick method
> >>
> >> I have changed my code :
> >>
> >>                                      link = new Link("linkRequest") {
> >>
> >>                                              @Override
> >>                                              public void onClick() {
> >>                                                      setResponsePage(new
> RequestPage(requestFormModel));
> >>                                              }
> >>
> >>                                      };
> >>
> >>                                      link.add(new
> >> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
> >>                                      item.add(link);
> >>
> >>                              } else {
> >>                                      link = new Link("linkRequest") {
> >>
> >>                                              @Override
> >>                                              public void onClick() { }
> >>
> >>                                      };
> >>                                      Label label = new
> Label("linkRequestTxt","");
> >>                                      link.add(label);
> >>                                      link.setEnabled(false);
> >>                                      item.add(link);
> >>                              }
> >>
> >> Remark :
> >>
> >> It should be interesting to be able to create an instance of the Link
> >> class
> >> without having to override the onclick() method. Otherwise the code
> >> becomes
> >> very verbose and requires as here that we instantiate two times the
> class
> >> Link
> >>
> >>
> >> Matthias Keller wrote:
> >>
> >>> Sure, just create it (including the onClick which might be invalid),
> but
> >>> afterwards set the  setEnabled()  as needed.
> >>> As long as the link is disabled, it can never be clicked thus the
> >>> onClick() will never be executed anyway, so it's irrelevant if the
> >>> requestFormModel is valid or not...
> >>> I dont think you want the setEnabled(false) inside the onClick - do
> you?
> >>> That would deactivate the link after the first click which doesn't make
> >>> that much sense?
> >>>
> >>> Matt
> >>>
> >>> Charles Moulliard wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> I would like to know if there is a better way to code this case : What
> >>>> I would like to do is to enable/disable a link depending on a
> >>>> condition. If the condition is true, than we create the link otherwise
> >>>> we disable it. In both case, a label must be defined for the Link.
> >>>>
> >>>> I mean, is it possible to avoid to double the creation of the link =
> >>>> new Link() ....
> >>>>
> >>>> Here is my code
> >>>>
> >>>> 1) HTML
> >>>>
> >>>>             #  wicket:id="linkRequestTxt"/>
> >>>>
> >>>>
> >>>> 2) JAVA
> >>>>
> >>>>                 // Set link for requestId
> >>>>                 Link link;
> >>>>
> >>>>                 if (audit.getRequest() != null) {
> >>>>
> >>>>                     final RequestFormModel requestFormModel = new
> >>>> RequestFormModel();
> >>>>                     requestFormModel.setRequestId( (int)
> >>>> audit.getRequest().getId() );
> >>>>
> >>>>                     link = new Link("linkRequest") {
> >>>>
> >>>>                         @Override
> >>>>                         public void onClick() {
> >>>>                             setResponsePage(new
> >>>> RequestPage(requestFormModel));
> >>>>                         }
> >>>>
> >>>>                     };
> >>>>
> >>>>                     link.add(new
> >>>> Label("linkRequestTxt",String.valueOf(audit.getRequest().getId())));
> >>>>                     item.add(link);
> >>>>
> >>>>                 } else {
> >>>>                     link = new Link("linkRequest") {
> >>>>
> >>>>                         @Override
> >>>>                         public void onClick() {
> >>>>                             this.setEnabled(false);
> >>>>                         }
> >>>>
> >>>>                     };
> >>>>                     Label label = new Label("linkRequestTxt","");
> >>>>                     link.add(label);
> >>>>                     item.add(link);
> >
> >>>>
> >>>>
> >>>> Charles Moulliard
> >>>> Senior Enterprise Architect
> >>>> Apache Camel Committer
> >>>>
> >>>> *****************************
> >>>> blog : http://cmoulliard.blogspot.com
> >>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: [hidden email]
> >>>> For additional commands, e-mail: [hidden email]
> >>>>
> >>>>
> >>>>
> >>> --
> >>> [hidden email]  +41 44 268 83 98
> >>> Ergon Informatik AG, Kleinstrasse 15, CH-8008 Zürich
> >>> http://www.ergon.ch
> >>> ______________________________________________________________
> >>> e r g o n    smart people - smart software
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>
> >>
> >> -----
> >> Charles Moulliard
> >> SOA Architect
> >>
> >> My Blog :  http://cmoulliard.blogspot.com/
> >> http://cmoulliard.blogspot.com/
> >>
> >
> >
> >
> >
> >
>
>
> -----
> Charles Moulliard
> SOA Architect
>
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/
> --
> View this message in context:
> http://www.nabble.com/Is-it-the-best-way-to-code-a-Link-depending-on-a-condition-tp25488603p25489428.html
> Sent from the Wicket - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Charles Moulliard
In reply to this post by joseph.pachod
Joseph,

Can you explain a little bit what you mean by provide it with attribute (IModel<String>) ?

        private Label labelTitle;
  public static Label createLabelTitle(String title) {
  return new Label("title",new Model( title ));
  }

--> becomes

        private Label labelTitle;
  public static Label createLabelTitle(String title) {
  return new Label(title,new PropertyModel( ModelClass, title ));
  }

Is it right what I create ?

Joseph Pachod wrote
cmoulliard wrote:
> What I have done to avoid to repeat the creation of the labels is to define
> and use static method
>
> private Label labelTitle;
> public static Label getLabelTitle(String title) {
> return new Label("title",new Model( title ));
> }
>  
I personally would name this method createLabelTitle(String title) or
getNewLabelTitle(String title), for explicitness.

Furthermore, I would directly provide it with a "final IModel<String> 
title" attribute, not to dictate how the data has to be provided
(dynamic or not for example).

In the end, this method is fine for just a label, but for anything more
complex a panel would be the way to go I would say. The main exception
here I see right now is the case of pages.

For example, if we're speaking of a page title, then I would define it
in my base page and make an abstract String getTitle() method in the
base page so I'm sure everyone set it up later on. I would do the same
if it's a specific kind of structured page, for example an abstract
class ContentHoldingPage extend TheBasePage.

++

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

nmelendez@getsense.com.ar
Jeremy:you say "2 - don't call setEnabled() - override isEnabled"

why is better override isEnable then setEnable?

thanks NM

On Mon, Sep 21, 2009 at 9:44 AM, cmoulliard <[hidden email]> wrote:

>
> Joseph,
>
> Can you explain a little bit what you mean by provide it with attribute
> (IModel<String>) ?
>
>        private Label labelTitle;
>        public static Label createLabelTitle(String title) {
>                 return new Label("title",new Model( title ));
>        }
>
> --> becomes
>
>        private Label labelTitle;
>        public static Label createLabelTitle(String title) {
>                return new Label(title,new PropertyModel( ModelClass, title
> ));
>        }
>
> Is it right what I create ?
>
>
> Joseph Pachod wrote:
> >
> > cmoulliard wrote:
> >> What I have done to avoid to repeat the creation of the labels is to
> >> define
> >> and use static method
> >>
> >>      private Label labelTitle;
> >>      public static Label getLabelTitle(String title) {
> >>              return new Label("title",new Model( title ));
> >>      }
> >>
> > I personally would name this method createLabelTitle(String title) or
> > getNewLabelTitle(String title), for explicitness.
> >
> > Furthermore, I would directly provide it with a "final IModel<String>
> > title" attribute, not to dictate how the data has to be provided
> > (dynamic or not for example).
> >
> > In the end, this method is fine for just a label, but for anything more
> > complex a panel would be the way to go I would say. The main exception
> > here I see right now is the case of pages.
> >
> > For example, if we're speaking of a page title, then I would define it
> > in my base page and make an abstract String getTitle() method in the
> > base page so I'm sure everyone set it up later on. I would do the same
> > if it's a specific kind of structured page, for example an abstract
> > class ContentHoldingPage extend TheBasePage.
> >
> > ++
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
> >
> >
> >
>
>
> -----
> Charles Moulliard
> SOA Architect
>
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/
> --
> View this message in context:
> http://www.nabble.com/Is-it-the-best-way-to-code-a-Link-depending-on-a-condition-tp25488603p25530206.html
> Sent from the Wicket - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

jeremy@wickettraining.com
It's the same reason you shouldn't use new Label("id"
object.getSomeText());.  See this example:

public MyPage () {
  Person p = getPersonFromSomewhere();
  Label l = new Label("numberOfPhoneNumbers", p.getPhoneNumbers().size());
  l.setVisible(p.getPhoneNumbers().size() > 0);
  new Link("addPhoneNumber") {
    onClick() {
      p.addPhoneNumber("123-456-7890");
    }
  }
}

When you add the phone number, it would not show up.  Not only would your
label not be able to get the new value for the size of the phone numbers,
but it would also not change it's visibility.  Why?  Because you statically
set both of those in the constructor.  They can't change unless you go to a
completely new instance of the page.  But clicking that link (or performing
some ajax operation) won't create a new page - they'll use the one you're
already on.

Synopsis: You should use models and override isVisible because they always
retrieve the latest information for every render.

--
Jeremy Thomerson
http://www.wickettraining.com



On Tue, Sep 22, 2009 at 8:18 AM, Nicolas Melendez <[hidden email]
> wrote:

> Jeremy:you say "2 - don't call setEnabled() - override isEnabled"
>
> why is better override isEnable then setEnable?
>
> thanks NM
>
> On Mon, Sep 21, 2009 at 9:44 AM, cmoulliard <[hidden email]> wrote:
>
> >
> > Joseph,
> >
> > Can you explain a little bit what you mean by provide it with attribute
> > (IModel<String>) ?
> >
> >        private Label labelTitle;
> >        public static Label createLabelTitle(String title) {
> >                 return new Label("title",new Model( title ));
> >        }
> >
> > --> becomes
> >
> >        private Label labelTitle;
> >        public static Label createLabelTitle(String title) {
> >                return new Label(title,new PropertyModel( ModelClass,
> title
> > ));
> >        }
> >
> > Is it right what I create ?
> >
> >
> > Joseph Pachod wrote:
> > >
> > > cmoulliard wrote:
> > >> What I have done to avoid to repeat the creation of the labels is to
> > >> define
> > >> and use static method
> > >>
> > >>      private Label labelTitle;
> > >>      public static Label getLabelTitle(String title) {
> > >>              return new Label("title",new Model( title ));
> > >>      }
> > >>
> > > I personally would name this method createLabelTitle(String title) or
> > > getNewLabelTitle(String title), for explicitness.
> > >
> > > Furthermore, I would directly provide it with a "final IModel<String>
> > > title" attribute, not to dictate how the data has to be provided
> > > (dynamic or not for example).
> > >
> > > In the end, this method is fine for just a label, but for anything more
> > > complex a panel would be the way to go I would say. The main exception
> > > here I see right now is the case of pages.
> > >
> > > For example, if we're speaking of a page title, then I would define it
> > > in my base page and make an abstract String getTitle() method in the
> > > base page so I'm sure everyone set it up later on. I would do the same
> > > if it's a specific kind of structured page, for example an abstract
> > > class ContentHoldingPage extend TheBasePage.
> > >
> > > ++
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [hidden email]
> > > For additional commands, e-mail: [hidden email]
> > >
> > >
> > >
> >
> >
> > -----
> > Charles Moulliard
> > SOA Architect
> >
> > My Blog :  http://cmoulliard.blogspot.com/
> http://cmoulliard.blogspot.com/
> > --
> > View this message in context:
> >
> http://www.nabble.com/Is-it-the-best-way-to-code-a-Link-depending-on-a-condition-tp25488603p25530206.html
> > Sent from the Wicket - User mailing list archive at Nabble.com.
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
> >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

nmelendez@getsense.com.ar
ok, i understand, thanks,
NM

On Tue, Sep 22, 2009 at 9:45 PM, Jeremy Thomerson <[hidden email]
> wrote:

> It's the same reason you shouldn't use new Label("id"
> object.getSomeText());.  See this example:
>
> public MyPage () {
>  Person p = getPersonFromSomewhere();
>  Label l = new Label("numberOfPhoneNumbers", p.getPhoneNumbers().size());
>  l.setVisible(p.getPhoneNumbers().size() > 0);
>  new Link("addPhoneNumber") {
>    onClick() {
>      p.addPhoneNumber("123-456-7890");
>    }
>  }
> }
>
> When you add the phone number, it would not show up.  Not only would your
> label not be able to get the new value for the size of the phone numbers,
> but it would also not change it's visibility.  Why?  Because you statically
> set both of those in the constructor.  They can't change unless you go to a
> completely new instance of the page.  But clicking that link (or performing
> some ajax operation) won't create a new page - they'll use the one you're
> already on.
>
> Synopsis: You should use models and override isVisible because they always
> retrieve the latest information for every render.
>
> --
> Jeremy Thomerson
> http://www.wickettraining.com
>
>
>
> On Tue, Sep 22, 2009 at 8:18 AM, Nicolas Melendez <
> [hidden email]
> > wrote:
>
> > Jeremy:you say "2 - don't call setEnabled() - override isEnabled"
> >
> > why is better override isEnable then setEnable?
> >
> > thanks NM
> >
> > On Mon, Sep 21, 2009 at 9:44 AM, cmoulliard <[hidden email]>
> wrote:
> >
> > >
> > > Joseph,
> > >
> > > Can you explain a little bit what you mean by provide it with attribute
> > > (IModel<String>) ?
> > >
> > >        private Label labelTitle;
> > >        public static Label createLabelTitle(String title) {
> > >                 return new Label("title",new Model( title ));
> > >        }
> > >
> > > --> becomes
> > >
> > >        private Label labelTitle;
> > >        public static Label createLabelTitle(String title) {
> > >                return new Label(title,new PropertyModel( ModelClass,
> > title
> > > ));
> > >        }
> > >
> > > Is it right what I create ?
> > >
> > >
> > > Joseph Pachod wrote:
> > > >
> > > > cmoulliard wrote:
> > > >> What I have done to avoid to repeat the creation of the labels is to
> > > >> define
> > > >> and use static method
> > > >>
> > > >>      private Label labelTitle;
> > > >>      public static Label getLabelTitle(String title) {
> > > >>              return new Label("title",new Model( title ));
> > > >>      }
> > > >>
> > > > I personally would name this method createLabelTitle(String title) or
> > > > getNewLabelTitle(String title), for explicitness.
> > > >
> > > > Furthermore, I would directly provide it with a "final IModel<String>
> > > > title" attribute, not to dictate how the data has to be provided
> > > > (dynamic or not for example).
> > > >
> > > > In the end, this method is fine for just a label, but for anything
> more
> > > > complex a panel would be the way to go I would say. The main
> exception
> > > > here I see right now is the case of pages.
> > > >
> > > > For example, if we're speaking of a page title, then I would define
> it
> > > > in my base page and make an abstract String getTitle() method in the
> > > > base page so I'm sure everyone set it up later on. I would do the
> same
> > > > if it's a specific kind of structured page, for example an abstract
> > > > class ContentHoldingPage extend TheBasePage.
> > > >
> > > > ++
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [hidden email]
> > > > For additional commands, e-mail: [hidden email]
> > > >
> > > >
> > > >
> > >
> > >
> > > -----
> > > Charles Moulliard
> > > SOA Architect
> > >
> > > My Blog :  http://cmoulliard.blogspot.com/
> > http://cmoulliard.blogspot.com/
> > > --
> > > View this message in context:
> > >
> >
> http://www.nabble.com/Is-it-the-best-way-to-code-a-Link-depending-on-a-condition-tp25488603p25530206.html
> > > Sent from the Wicket - User mailing list archive at Nabble.com.
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [hidden email]
> > > For additional commands, e-mail: [hidden email]
> > >
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

josephpachod
In reply to this post by Charles Moulliard
hi Charles

The whole issue is that you don't know how the data (in this case a
String) is to be retrieved. Can it be read only once ? Should it be
refresh on each request cycle ? On each access to the data ? Does it come
from a database ?

Wicket's model allows you to go away from all these considerations : you
just want to be able to get the string. Just let the users of your wicket
component decide how they want to provide the data.

As such, your example is, I think, broken :
> private Label labelTitle;
>   public static Label createLabelTitle(String title) {
>   return new Label(title,new PropertyModel( ModelClass, title ));
>   }

What if someone wants to change this string ? title = "my new title" won't
work there !

Thus, it should be, IMO :
>   public static Label createLabelTitle(final IModel<String> titleModel) {
>   return new Label(title,titleModel.get());
>   }

++

NB : you might be interested by this article
http://blog.jteam.nl/2009/09/16/wicket-dos-and-donts/

>
> Joseph,
>
> Can you explain a little bit what you mean by provide it with attribute
> (IModel<String>) ?
>
> private Label labelTitle;
>   public static Label createLabelTitle(String title) {
>   return new Label("title",new Model( title ));
>   }
>
> --> becomes
>
> private Label labelTitle;
>   public static Label createLabelTitle(String title) {
>   return new Label(title,new PropertyModel( ModelClass, title ));
>   }
>
> Is it right what I create ?
>
>
> Joseph Pachod wrote:
>>
>> cmoulliard wrote:
>>> What I have done to avoid to repeat the creation of the labels is to
>>> define
>>> and use static method
>>>
>>> private Label labelTitle;
>>> public static Label getLabelTitle(String title) {
>>> return new Label("title",new Model( title ));
>>> }
>>>
>> I personally would name this method createLabelTitle(String title) or
>> getNewLabelTitle(String title), for explicitness.
>>
>> Furthermore, I would directly provide it with a "final IModel<String>
>> title" attribute, not to dictate how the data has to be provided
>> (dynamic or not for example).
>>
>> In the end, this method is fine for just a label, but for anything more
>> complex a panel would be the way to go I would say. The main exception
>> here I see right now is the case of pages.
>>
>> For example, if we're speaking of a page title, then I would define it
>> in my base page and make an abstract String getTitle() method in the
>> base page so I'm sure everyone set it up later on. I would do the same
>> if it's a specific kind of structured page, for example an abstract
>> class ContentHoldingPage extend TheBasePage.
>>
>> ++
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [hidden email]
>> For additional commands, e-mail: [hidden email]
>>
>>
>>
>
>
> -----
> Charles Moulliard
> SOA Architect
>
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/
> --
> View this message in context:
> http://www.nabble.com/Is-it-the-best-way-to-code-a-Link-depending-on-a-condition-tp25488603p25530206.html
> Sent from the Wicket - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Is it the best way to code a Link depending on a condition

Charles Moulliard
In fact, the example createLabel is not really the most interesting. Let's me explaining what I consider as a good candidate and what I have done

1) A HTML page contains a table which is populated dynamically using a service collecting data from a DB. the last column of the table is a link (wicket id="linkRequest") that we would like to show or not depending if we have receive from the DB, the id (= primary key of the table DB) corresponding to the record Request to be opened in the screen page "Request.html / RequestPage)

2) The populateItem method of the DataView allows me for each record to link the model (= item) returned by the IDataprovider to the columns of my table. To create the link to the HTML page, I use the Link class that I have modified like this :

public class LinkRequest<T> extends Link<T> {

        private static final long serialVersionUID = 3283912033862898645L;
        private RequestFormModel requestFormModel;

        public LinkRequest(String id) {
                super(id);
        }
       
        @Override
        public void onClick() {
                setResponsePage(new RequestPage(requestFormModel));
        }
       
        public RequestFormModel getRequestFormModel() {
                return requestFormModel;
        }

        public void setRequestFormModel(RequestFormModel requestFormModel) {
                this.requestFormModel = requestFormModel;
        }

}

As you see the onClick() method is defined so I don't need to modify it when I add the link to my item. To create the link, I call a createLinkRequest Method who play the role of a factory for me

        public static LinkRequest createLinkRequest(String id) {
               
                LinkRequest linkReq = new LinkRequest("linkRequest");
               
                if ( id != null ) {
                       
                        // Link is enable with parameters required to open RequestPage
                        RequestFormModel requestFormModel = new RequestFormModel();
                        requestFormModel.setId( Integer.parseInt( id ) );
                        linkReq.setRequestFormModel(requestFormModel);
                       
                        linkReq.add(getLinkRequestTxt( id ));

                } else {
                        // Link is disable
                        linkReq.add(getLinkRequestTxt(""));
                        linkReq.setEnabled(false);

                }
               
                return linkReq;
               
        }

and I call this method from my polulateItem like this

item.add( createLinkRequest( id which is equal to null or to a value ) );

Depending if the value is null or not, the link will be enable or disabled and the model required by my page request created accordingly.

Is it a correct implementation or a stupid one ? In a previous reply, someone argues that we must override the method isEnabled() instead of using setEnable() ?

Regards,

Charles

josephpachod wrote
hi Charles

The whole issue is that you don't know how the data (in this case a
String) is to be retrieved. Can it be read only once ? Should it be
refresh on each request cycle ? On each access to the data ? Does it come
from a database ?

Wicket's model allows you to go away from all these considerations : you
just want to be able to get the string. Just let the users of your wicket
component decide how they want to provide the data.

As such, your example is, I think, broken :
> private Label labelTitle;
>   public static Label createLabelTitle(String title) {
>   return new Label(title,new PropertyModel( ModelClass, title ));
>   }

What if someone wants to change this string ? title = "my new title" won't
work there !

Thus, it should be, IMO :
>   public static Label createLabelTitle(final IModel<String> titleModel) {
>   return new Label(title,titleModel.get());
>   }

++

NB : you might be interested by this article
http://blog.jteam.nl/2009/09/16/wicket-dos-and-donts/

>
> Joseph,
>
> Can you explain a little bit what you mean by provide it with attribute
> (IModel<String>) ?
>
> private Label labelTitle;
>   public static Label createLabelTitle(String title) {
>   return new Label("title",new Model( title ));
>   }
>
> --> becomes
>
> private Label labelTitle;
>   public static Label createLabelTitle(String title) {
>   return new Label(title,new PropertyModel( ModelClass, title ));
>   }
>
> Is it right what I create ?
>
>
> Joseph Pachod wrote:
>>
>> cmoulliard wrote:
>>> What I have done to avoid to repeat the creation of the labels is to
>>> define
>>> and use static method
>>>
>>> private Label labelTitle;
>>> public static Label getLabelTitle(String title) {
>>> return new Label("title",new Model( title ));
>>> }
>>>
>> I personally would name this method createLabelTitle(String title) or
>> getNewLabelTitle(String title), for explicitness.
>>
>> Furthermore, I would directly provide it with a "final IModel<String>
>> title" attribute, not to dictate how the data has to be provided
>> (dynamic or not for example).
>>
>> In the end, this method is fine for just a label, but for anything more
>> complex a panel would be the way to go I would say. The main exception
>> here I see right now is the case of pages.
>>
>> For example, if we're speaking of a page title, then I would define it
>> in my base page and make an abstract String getTitle() method in the
>> base page so I'm sure everyone set it up later on. I would do the same
>> if it's a specific kind of structured page, for example an abstract
>> class ContentHoldingPage extend TheBasePage.
>>
>> ++
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> For additional commands, e-mail: users-help@wicket.apache.org
>>
>>
>>
>
>
> -----
> Charles Moulliard
> SOA Architect
>
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/
> --
> View this message in context:
> http://www.nabble.com/Is-it-the-best-way-to-code-a-Link-depending-on-a-condition-tp25488603p25530206.html
> Sent from the Wicket - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>



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