> Since others seem to need it, this might be worth refining over on 
> wicket-stuff.

I think it's worth to build a universal bookmarkable tabbed panel. Brill, 
please post your solution so we can look what is better in your or in my 
solution and built the ultimative BookmarkableTabbedPanel.

I refined my first version a bit and added the following features:
* Reliable handling of user input (tab number).
* Possibility to mix bookmarkable and stateful links.
* Parameter name to distinguish tabs is now the component id by default. This 
will avoid conflicts with multiple BookmarkableTabbedPanels.

But I'm not sure if mixing bookmarkable and stateful links is a good idea.

Current version:
-----------------------------------------------------------------------------------------------------------
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:
   * <ul>
   *    <li>tabParameterName = component id</li>
   *    <li>defaultTabIndex = 0</li>
   * </ul>
     * @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<ITab> tabs,
          PageParameters pageParameters)
  {
    super(id, tabs);
    this.pageParameters = pageParameters;
    this.tabParameterName = id;
    
    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.
     */
    public BookmarkableTabbedPanel(
        String id, 
        List<ITab> tabs,
        int defaultTabIndex,
        String tabParameterName,
    PageParameters pageParameters,
    int ...unbookmarkableTabIndex) 
    {
        this(id, tabs, pageParameters);
        this.defaultTabIndex = defaultTabIndex;
        setSelectedTab(defaultTabIndex);
        this.tabParameterName = tabParameterName;
    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);
      else
        pageParameters.put(tabParameterName, "" + index);
      link = new BookmarkablePageLink(
              linkId, getPage().getClass(), pageParameters);
    }
    
    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

Reply via email to