Reputation: 868
I have custom control written in Java. For the sake of simplicity lets assume that it looks like this:
public class HelloworldControl extends UIComponentBase {
@Override
public void decode(FacesContext context) {
String cid = this.getClientId(context);
...
super.decode(context);
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.writeText("Hello world!", this);
// I want a view!!
}
@Override
public void encodeEnd(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
...
}
public void restoreState(FacesContext context, Object state) {
Object values[] = (Object[]) state;
...
super.restoreState(context, values[0]);
}
public Object saveState(FacesContext context) {
Object values[] = ...
}
}
I would like to add programatically child control to it. For example I would like a child view control to render a view just under the Hellow world text.
How can i do this? What is the standard procedure to build dynamically a control?
To put it simply - I want programmatically build a hierarchy of standard components and I want to attach it to my control.
Upvotes: 5
Views: 528
Reputation: 10485
You could do this by creating your UIComponent directly in your encodeBegin method:
public void encodeBegin(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.writeText("Hello world!", "");
try{
UIPassThroughText uiText= new UIPassThroughText();
uiText.setText("Hello daddy!");
uiText.encodeBegin(context);
uiText.encodeChildren(context);
uiText.encodeEnd(context);
}
But I don't think that it is a good idea to do this, because then your child components are not added to the component tree...
EDIT: The answer of Toby Samples is the better one. I have undeleted this answer because it still works, but I am not proud of. To add the uiText to the component tree, you would have to use the this.getChildren().add(uiText) method.
Better to use an own renderer class as described f.e. here: XPages Extensibility API > Creating a Java Control in an NSF
Upvotes: 1
Reputation: 2178
The answer I think your looking for is implement the FacesComponent Interface There is detailed instructions that Keith Strickland put out on his blog:
It uses the initBeforeContents, buildContents, and initAfterContents methods to allow you to add children.
Hope that helps.
Upvotes: 4