1
votes

In my application I want to use a dynamic tabView where each tab has a ui:include with a different page. I have a List of TabObject that extends Tab. A TabObject has a xhtml page as String property:

public class TabObject extends Tab  {
   private String page;
   ...
}

In my first attempt I wanted to add tabs dynamically:

<p:tabView dynamic="true" value="#{tabViewManagedBean.tabs}" var="tab_ext" activeIndex="#{tabViewManagedBean.activeIndex}" >
  <p:ajax event="tabClose" listener="#{tabViewManagedBean.onTabClose}" />
  <p:ajax event="tabChange" listener="#{tabViewManagedBean.onTabChange}"/>
   <p:tab title="#{tab_ext.title}" closable="#{tab_ext.closable}" >
    <ui:include src="#{tab_ext.page}" />
   </p:tab>
</p:tabView>

But ui:include doesn't work with variable tab_ext using this technique. My solution so far is:

<p:tabView dynamic="true" activeIndex="#{tabViewManagedBean.activeIndex}" >
  <p:ajax event="tabClose" listener="#{tabViewManagedBean.onTabClose}" />
  <p:ajax event="tabChange" listener="#{tabViewManagedBean.onTabChange}"/>

  <c:forEach items="#{tabViewManagedBean.tabs}" var="tab_ext" varStatus="loop_ext" >
   <p:tab title="#{tab_ext.title}" closable="#{tab_ext.closable}" >
    <f:subview id="tab_ext_#{loop_ext.index}" >
      <ui:include src="#{tab_ext.page}" />
    </f:subview>
   </p:tab>
  </c:forEach>

</p:tabView>

This is my method onTabClose:

public void onTabClose(TabCloseEvent event) {
    TabObject t=(TabObject)event.getData();
}

On event callback I can't get my TabObject, but a generic Tab. How can I fix this?

1

1 Answers

0
votes

You can determine the tab index of the closed tab. Afterwards you get the element of the determined index from your tabs list:

public void onTabClose(TabCloseEvent event) {
    Tab tab = event.getTab();
    UIComponent tabView = tab.getParent();
    int index = tv.getChildren().indexOf(tab);
    TabObject t = tabs.get(index);
    // ...
}