Hi!
Got a bit carried away with this new thang ;)
http://old.nabble.com/Wicket-without-markup-td27506286.html
It's finally fun adding components onto a page/panel!
I had a go at creating a Tabbed panel with it and it's pretty neat:
HomePage.html:
<html>
<head>
<title>Wicket Quickstart Archetype Homepage</title>
</head>
<body>
<strong>Wicket Quickstart Archetype Homepage</strong>
<form wicket:id="form">
<wicket:container wicket:id="root-content-id"></wicket:container>
</form>
</body>
</html>
public class HomePage extends WebPage implements ITabbedPanelTarget {
/** */
private static final long serialVersionUID = 1L;
private final MarkupNoLongerRequiredContainer rootContainer;
private final MarkupNoLongerRequiredContainer row0;
private final MarkupNoLongerRequiredContainer row1;
private final MarkupNoLongerRequiredContainer row2;
private final MarkupNoLongerRequiredContainer row3;
private final Form<Void> form;
private final TabbedPanelTab firstTab;
private final MarkupNoLongerRequiredContainer tabContainer;
private Panel selectedTab;
/**
*
*/
public HomePage() {
add(form = new Form<Void>("form"));
form.add(rootContainer = new
MarkupNoLongerRequiredContainer("root-content-id"));
{
rootContainer.add(row0 = new
MarkupNoLongerRequiredContainer());
row0.add(firstTab = new TabbedPanelTab(this,
Model.of("First"),
FirstPanel.class));
row0.add(new TabbedPanelTab(this, Model.of("Second"),
SecondPanel.class));
row0.add(new TabbedPanelTab(this, Model.of("Third"),
ThirdPanel.class));
}
{
rootContainer.add(row1 = new
MarkupNoLongerRequiredContainer());
row1.add(new Label(GID, "Hello world"));
row1.add(0, new Label(GID,
"<br/>").setEscapeModelStrings(false));
// Change row before
row1.add(0, new Label(GID,
"<br/>").setEscapeModelStrings(false));
// Change row twice before
row1.add(new Label(GID,
"<br/>").setEscapeModelStrings(false)); //
Change row once after
}
{
rootContainer.add(row2 = new
MarkupNoLongerRequiredContainer());
row2.add(new Label(GID, "Type your name here:"));
row2.add(new InputField(new TextField<String>(GID,
Model.of("..."))));
}
{
rootContainer.add(row3 = new
MarkupNoLongerRequiredContainer());
row3.add(new Label(GID,
"<br/>").setEscapeModelStrings(false)); //
Change row before
row3.add(new InputField(new Button(GID,
Model.of("Clickme")) {
@Override
protected void onComponentTag(ComponentTag tag)
{
tag.put("type", "button");
super.onComponentTag(tag);
}
}));
row3.add(new Label(GID,
"<br/>").setEscapeModelStrings(false)); //
Change row before
row3.add(tabContainer = new
MarkupNoLongerRequiredContainer());
}
firstTab.select();
}
public Component getSelectedTab() {
return selectedTab;
}
public void setSelectedTabAndPanel(Panel selectedTab, Panel
newInstance) {
this.selectedTab = selectedTab;
tabContainer.set(0, newInstance);
}
}
public class TabbedPanelTab extends Panel {
/** */
private static final long serialVersionUID = -6602527646776083146L;
private final Link<Void> link;
private final ITabbedPanelTarget tabbedPanelTarget;
private final Class<? extends Panel> panelClass;
/**
* @param tabbedPanelTarget
* @param title
*/
public TabbedPanelTab(final ITabbedPanelTarget tabbedPanelTarget,
Model<String> title, final Class<? extends Panel> panelClass) {
super(GID);
this.tabbedPanelTarget = tabbedPanelTarget;
this.panelClass = panelClass;
add(link = new Link<Void>("tab-link") {
@Override
public void onClick() {
select();
}
@Override
public boolean isEnabled() {
return !(tabbedPanelTarget.getSelectedTab() ==
TabbedPanelTab.this);
}
});
link.add(new Label("title", title));
}
/**
*/
public void select() {
try {
tabbedPanelTarget.setSelectedTabAndPanel(TabbedPanelTab.this,
panelClass.getConstructor(String.class).newInstance(GID));
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
}
TabbedPanelTab.html:
<wicket:panel>
<a wicket:id="tab-link"><wicket:container wicket:id="title"/></a>
</wicket:panel>
MarkupNoLongerRequiredContainer.java:
public class MarkupNoLongerRequiredContainer extends Panel {
/** */
public static final String GID = "generic-child-id";
/** */
private static final long serialVersionUID = 1L;
private final List<Component> children = new ArrayList<Component>();
private ListView<Component> listView;
private LinkedList<Component> previouslyRenderedChildren;
public MarkupNoLongerRequiredContainer() {
this(GID);
}
@Override
protected void onBeforeRender() {
if (isChanged()) {
listView.removeAll();
}
previouslyRenderedChildren = new
LinkedList<Component>(children);
super.onBeforeRender();
}
public boolean isChanged() {
if (previouslyRenderedChildren != null) {
return !((children.size() ==
previouslyRenderedChildren.size()) &&
previouslyRenderedChildren.containsAll(children));
}
return false;
}
/**
* @param id
*/
public MarkupNoLongerRequiredContainer(String id) {
super(id);
super.add(listView = new ListView<Component>("listview-id",
children) {
/** */
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<Component>
listItem) {
Component component = listItem.getModelObject();
if (!component.getId().equals(GID)) {
throw new
IllegalStateException("Currently handles only children
with id " + GID);
}
listItem.add(component);
}
}.setReuseItems(true));
}
public boolean add(Component component) {
return children.add(component);
}
public void add(int index, Component element) {
children.add(index, element);
}
public boolean addAll(Collection<? extends Component> collection) {
return children.addAll(collection);
}
public boolean addAll(int index, Collection<? extends Component>
collection) {
return children.addAll(index, collection);
}
public void clear() {
children.clear();
}
public boolean contains(Object o) {
return children.contains(o);
}
public boolean containsAll(Collection<?> collection) {
return children.containsAll(collection);
}
public int indexOf(Object o) {
return children.indexOf(o);
}
public boolean isEmpty() {
return children.isEmpty();
}
public int lastIndexOf(Object o) {
return children.lastIndexOf(o);
}
public ListIterator<Component> listIterator() {
return children.listIterator();
}
public ListIterator<Component> listIterator(int index) {
return children.listIterator(index);
}
public boolean remove(Object o) {
return children.remove(o);
}
public Component remove(int index) {
return children.remove(index);
}
public boolean removeAll(Collection<?> collection) {
return children.removeAll(collection);
}
public boolean retainAll(Collection<?> collection) {
return children.retainAll(collection);
}
public Component set(int index, Component element) {
if (children.size() <= index) {
add(index, element);
}
return children.set(index, element);
}
public List<Component> subList(int fromIndex, int toIndex) {
return children.subList(fromIndex, toIndex);
}
public Object[] toArray() {
return children.toArray();
}
public <T> T[] toArray(T[] a) {
return children.toArray(a);
}
}
FirstPanel.html (.java trivial too)
<wicket:panel>
<div style="background: green; width: 100%; margin: 20px;">First panel</div>
</wicket:panel>
SecondPanel.html (.java trivial too)
<wicket:panel>
<div style="background: yellow; width: 100%; margin: 20px;">Second panel</div>
</wicket:panel>
ThirdPanel.html (.java trivial too)
<wicket:panel>
<div style="background: red; width: 100%; margin: 20px;">Third panel</div>
</wicket:panel>
**
Martin
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]