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:
   * <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;
    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<ITab> 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

Reply via email to