Scope
This page describes the use of the TabbedPanel with image tabs component.
It is enhanced AjaxTabbedPanel from wicket-extensions, which has a nested image on the left side of text.
The whole idea behind extending tabs with image is TO USE NEW LINK INSTANCE, THAT CONTAINS IMAGE, NOT ONLY TEXT.
Simple idea.
Faq
If you want to have non-ajax TabbedPanel, it's the same work, but instead of AjaxTabbedPanel you must
override TabbedPanel only and instead of AjaxFallbackLink return Link instance.
Examples (for Wicket 1.3beta3 or later version)
Example 1 - on/off image in tabs
1.MyAjaxFallbackLink.java (Link enhanced with Image)
public class MyAjaxFallbackLink extends AjaxFallbackLink { public MyAjaxFallbackLink(String id, boolean isSelectedTab) { super(id); Image image; if (isSelectedTab){ image = new Image("image", new ResourceReference(MyAjaxFallbackLink.class, "image_selected.gif")); }else{ image = new Image("image", new ResourceReference(MyAjaxFallbackLink.class, "image_unselected.gif")); } add(image); } public void onClick(AjaxRequestTarget target) { //really nothing here -> to override } }
2. MyAjaxTabbedPanel.java
override newLink() in AjaxTabbedPanel to return your link
public class MyAjaxTabbedPanel extends AjaxTabbedPanel { public MyAjaxTabbedPanel(String id, List tabs) { super(id, tabs); setSelectedTab(0); //make sure, the first selected tab has index=0. Important for image in first selected tab! } protected WebMarkupContainer newLink(String linkId, final int index) { int selectedTab = getSelectedTab(); boolean selected = (index == selectedTab); return new MyAjaxFallbackLink(linkId, selected) { private static final long serialVersionUID = 1L; public void onClick(AjaxRequestTarget target) { setSelectedTab(index); if (target != null) { target.addComponent(MyAjaxTabbedPanel.this); } onAjaxUpdate(target); } }; } }
3. MyAjaxTabbedPanel.html
copy html code from TabbedPanel.html and extend with image to pass hierarchy
<wicket:panel> <div wicket:id="tabs-container" class="tab-row"> <ul> <li wicket:id="tabs"> <a href="#" wicket:id="link"> <img wicket:id="image" class="left-image"/> <span wicket:id="title">[[tab title]]</span> </a> </li> </ul> </div> <div wicket:id="panel" class="tab-panel">[panel]</div> </wicket:panel>
Example 2 - custom images in tabs
In this example you can have in each tab different image. Do the steps 2 and 3 as in previous example. Alter the code to appropriate ajax / non ajax variant.
1. ImageTabLink
Link which has image inside to be used with ImageTabbedPanel
public abstract class ImageTabLink extends Link { public ImageTabLink(String id, ResourceReference image) { super(id); add(new Image("image", image)); } }
Steps 2 & 3 follow the same logic
4. AbstractImageTab
public abstract class AbstractImageTab extends AbstractTab { private ResourceReference image; public AbstractImageTab(IModel title, ResourceReference image) { super(title); this.image = image; } public ResourceReference getImage() { return image; } }
5. ImageTabbedPanel
public class ImageTabbedPanel extends TabbedPanel { public ImageTabbedPanel(String id, List tabs) { super(id, tabs); } protected WebMarkupContainer newLink(String linkId, final int index) { List tabs = getTabs(); //check for usage of our custom class, if it is not our class, add as image empty container - this way you can use image only in tabs you want ITab currentTab = (ITab)tabs.get(index); if (currentTab instanceof AbstractImageTab) { AbstractImageTab imageTab = (AbstractImageTab)currentTab; return new ImageTabLink(linkId, imageTab.getImage()) { @Override public void onClick() { setSelectedTab(index); } }; } else { WebMarkupContainer link = super.newLink(linkId, index); link.add(new WebMarkupContainer("image").setVisible(false)); return link; } } }