org.jabylon.rest.ui.wicket.components.ClientSideTabbedPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.jabylon.rest.ui.wicket.components.ClientSideTabbedPanel.java

Source

/**
 * (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */
package org.jabylon.rest.ui.wicket.components;

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.jabylon.rest.ui.util.GlobalResources;

public class ClientSideTabbedPanel<T extends ITab> extends Panel {

    private List<WebMarkupContainer> tabContents;
    private IModel<Integer> activeTab = Model.of(0);

    public ClientSideTabbedPanel(final String id, List<T> tabs, boolean vertical, String persistenceKey) {
        super(id);
        WebMarkupContainer tabbable = new WebMarkupContainer("tabbable");

        if (vertical) {
            tabbable.add(new AttributeAppender("class", " tabs-left"));
        }
        if (persistenceKey != null) {
            tabbable.add(new AttributeModifier("data-tabsheet", persistenceKey));
        }
        add(tabbable);

        ListView<T> listView = new ListView<T>("tab-handles", tabs) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<T> item) {
                int index = item.getIndex();
                if (index == activeTab.getObject())
                    item.add(new AttributeAppender("class", " active"));
                item.add(new ExternalLink("link", Model.of("#" + id + index), item.getModelObject().getTitle()));
            }
        };
        listView.setReuseItems(true);
        tabContents = new ArrayList<WebMarkupContainer>();
        ListView<T> tabContent = new ListView<T>("tab-content", tabs) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<T> item) {
                int index = item.getIndex();
                if (index == activeTab.getObject())
                    item.add(new AttributeAppender("class", " active"));
                item.setMarkupId(id + index);
                Object object = item.getDefaultModelObject();
                if (object instanceof ITab) {
                    ITab tab = (ITab) object;
                    WebMarkupContainer panel = tab.getPanel("content");
                    panel.setOutputMarkupId(true);
                    tabContents.add(panel);
                    item.add(panel);
                }
            }
        };
        tabContent.setReuseItems(true);
        tabbable.add(tabContent);
        tabbable.add(listView);
    }

    public ClientSideTabbedPanel(final String id, List<T> tabs) {
        this(id, tabs, false, null);
    }

    private static final long serialVersionUID = 1L;

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        response.render(JavaScriptHeaderItem.forReference(GlobalResources.JS_PERSISTENT_TABS));
    }

    public List<WebMarkupContainer> getTabContents() {
        return tabContents;
    }

    public void setActiveTab(IModel<Integer> activeIndex) {
        this.activeTab = activeIndex;
    }

    public void setActiveTab(int activeIndex) {
        this.activeTab = Model.of(activeIndex);
    }
}