package org.orienteer.core.component;
import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import ru.ydn.wicket.wicketorientdb.model.SimpleNamingModel;
/**
* Panel for bootstrap's tabs with "tabdrop" feature.
*
* @param <T> type of entities for tabs
*/
public class TabsPanel<T> extends GenericPanel<T>
{
public static final CssResourceReference TABDROP_CSS = new CssResourceReference(TabsPanel.class, "tabdrop/tabdrop.css");
public static final JavaScriptResourceReference TABDROP_JS = new JavaScriptResourceReference(TabsPanel.class, "tabdrop/bootstrap-tabdrop.js");
private ListView<T> tabs;
private IModel<T> defaultTabModel;
public TabsPanel(String id, IModel<T> model, List<T> tabs)
{
this(id, model, Model.ofList(tabs));
}
public TabsPanel(String id, IModel<T> model, IModel<? extends List<T>> tabsModel)
{
super(id, model);
setOutputMarkupPlaceholderTag(true);
tabs = new ListView<T>("tabs", tabsModel) {
@Override
protected void populateItem(final ListItem<T> item) {
item.add(new AttributeAppender("class", "active")
{
@Override
public boolean isEnabled(Component component) {
return super.isEnabled(component) && Objects.equals(item.getModelObject(), TabsPanel.this.getModelObject());
}
});
item.add(new AjaxLink<T>("link", item.getModel()) {
@Override
public void onClick(AjaxRequestTarget target) {
TabsPanel.this.setModelObject(item.getModelObject());
onTabClick(target);
target.add(TabsPanel.this);
}
}.setBody(newTabNameModel(item.getModel())));
}
@Override
protected void onConfigure() {
T tab = TabsPanel.this.getModelObject();
if(!getModelObject().contains(tab))
{
T defaultTab = getDefaultTab();
if(defaultTab != null && getModelObject().contains(defaultTab))
{
tab = defaultTab;
}
else
{
List<T> tabs = getModelObject();
tab = tabs!=null && tabs.size()>0?tabs.get(0):null;
}
TabsPanel.this.setModelObject(tab);
}
super.onConfigure();
}
};
add(tabs);
}
public T getDefaultTab() {
return defaultTabModel!=null?defaultTabModel.getObject():null;
}
public IModel<T> getDefaultTabModel() {
return defaultTabModel;
}
public void setDefaultTabModel(IModel<T> defaultTabModel) {
this.defaultTabModel = defaultTabModel;
}
protected IModel<String> newTabNameModel(IModel<T> tabModel)
{
return new SimpleNamingModel(tabModel);
}
public void onTabClick(AjaxRequestTarget target)
{
}
@Override
public void detachModels() {
super.detachModels();
if(defaultTabModel!=null) defaultTabModel.detach();
}
@Override
protected void onComponentTag(ComponentTag tag) {
checkComponentTag(tag, "ul");
super.onComponentTag(tag);
tag.append("class", "nav nav-tabs", " ");
tag.put("role", "tablist");
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(CssHeaderItem.forReference(TABDROP_CSS));
response.render(JavaScriptHeaderItem.forReference(TABDROP_JS));
response.render(OnDomReadyHeaderItem.forScript("$('#"+getMarkupId()+"').tabdrop({text: '<i class=\"glyphicon glyphicon-align-justify\"></i>'});"));
}
}