In my code were two little bugs. If the constructor with parameter
"defaultTabIndex" was used, the active tab was always set to this value
regardless what tab the use clicked on. The other issue affected the specified
parameter name that stores the active tab. It did not work in the constructor
chain. This problem could be solved by rearrangement of constructors or by
simple remove this parameter. I've choosen the last possibility to keep thinks
simple.
I post my corrected code again here, becaus someone could find it with a
search engine and I don't want left him alone with broken code. The further
development will be better placed in a code repository.
package com.helmbold.wicket.components;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
public class BookmarkableTabbedPanel extends TabbedPanel
{
private PageParameters pageParameters;
private String tabParameterName;
private int defaultTabIndex = 0;
private List unbookmarkableTabIndex = new ArrayList();
/**
* Using this constructor the following defaults take effect:
*
*tabParameterName = component id
*defaultTabIndex = 0
*
* @param id component id
* @param tabs list of ITab objects used to represent tabs
* @param pageParameters Container for parameters to a requested page. A
* parameter for the selected tab will be inserted.
*/
public BookmarkableTabbedPanel(
String id,
List tabs,
PageParameters pageParameters)
{
super(id, tabs);
this.pageParameters = pageParameters;
this.tabParameterName = id;
System.err.println(pageParameters);
if (pageParameters.containsKey(tabParameterName))
{
String tab = pageParameters.getString(tabParameterName);
try
{
setSelectedTab(Integer.parseInt(tab));
}
catch (NumberFormatException e)
{
setSelectedTab(defaultTabIndex);
}
}
else
setSelectedTab(defaultTabIndex);
}
/**
* @param id component id
* @param tabs list of ITab objects used to represent tabs
* @param defaultTabIndex Set the tab to by displayed by default. The url
* for this tab will not contain any tab specific information. If you want
to
* display the first tab by default, you can use the constructor without
this
* parameter.
* @param pageParameters Container for parameters to a requested page. A
* parameter for the selected tab will be inserted.
* @param unbookmarkableTabIndex Indexes of tabs with standard (no
* bookmarkable) links. First tab has index 0.
*/
public BookmarkableTabbedPanel(
String id,
List tabs,
int defaultTabIndex,
PageParameters pageParameters,
int ...unbookmarkableTabIndex)
{
this(id, tabs, pageParameters);
this.defaultTabIndex = defaultTabIndex;
if (!pageParameters.containsKey(tabParameterName))
setSelectedTab(defaultTabIndex);
for(int element : unbookmarkableTabIndex)
this.unbookmarkableTabIndex.add(element);
}
@Override
protected WebMarkupContainer newLink(String linkId, int index)
{
WebMarkupContainer link;
// create default (not bookmarkable) links for the specified tabs.
if (unbookmarkableTabIndex.contains(index))
link = super.newLink(linkId, index);
// create bookmarkable links
else
{
if (index == defaultTabIndex)
pageParameters.remove(tabParameterName); // keep URLs short
else
pageParameters.put(tabParameterName, "" + index);
link = new BookmarkablePageLink(
linkId, getPage().getClass(), pageParameters);
/* Overwrite parameters only used for link cunstruction, but doesn't
* reflect the actual state.
*/
if (index != getSelectedTab())
pageParameters.put(tabParameterName, "" + getSelectedTab());
}
if (index == getSelectedTab())
link.setEnabled(false);
return link;
}
}
-
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org