package org.orienteer.core.web;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.Strings;
import org.orienteer.core.component.TabbedPanel;
import org.orienteer.core.event.ActionPerformedEvent;
import org.orienteer.core.widget.DashboardPanel;
import org.orienteer.core.widget.IDashboardManager;
import org.orienteer.core.widget.IWidgetFilter;
import org.orienteer.core.widget.IWidgetType;
import ru.ydn.wicket.wicketorientdb.model.SimpleNamingModel;
import com.google.common.base.Predicate;
import com.google.inject.Inject;
/**
* Abstract class for all pages that use widgets approach
*
* @param <T> the type of a main object for this page
*/
public abstract class AbstractWidgetPage<T> extends OrienteerBasePage<T> {
private class DashboardTab implements ITab {
private String tab;
private IModel<String> titleModel;
private DashboardPanel dashboard;
public DashboardTab(String tab) {
this(tab, newTabNameModel(tab));
}
public DashboardTab(String tab, IModel<String> titleModel) {
this.tab = tab;
this.titleModel = titleModel;
}
@Override
public IModel<String> getTitle() {
return titleModel;
}
@Override
public WebMarkupContainer getPanel(String containerId) {
if(dashboard==null) {
dashboard = newDashboard(containerId, getDomain(), tab, getModel(), getWidgetsFilter());
}
return dashboard;
}
@Override
public boolean isVisible() {
return true;
}
}
@Inject
protected IDashboardManager dashboardManager;
protected TabbedPanel<DashboardTab> tabbedPanel;
private IWidgetFilter<T> widgetsFilter;
public AbstractWidgetPage() {
super();
}
public AbstractWidgetPage(IModel<T> model) {
super(model);
}
public AbstractWidgetPage(PageParameters parameters) {
super(parameters);
}
@Override
public void initialize() {
super.initialize();
add(tabbedPanel = new TabbedPanel<DashboardTab>("dashboardTabs", getDashboardTabs()));
}
@Override
protected void onInitialize() {
super.onInitialize();
switchToDefaultTab();
}
/**
* Set initial tab to default one.
* @return true of switch was actually performed and false otherwise
*/
protected boolean switchToDefaultTab() {
PageParameters parameters = getPageParameters();
String tab = parameters.get("tab").toOptionalString();
if(Strings.isEmpty(tab)) return false;
else return selectTab(tab);
}
public boolean isHideTabsIfSingle() {
return tabbedPanel.isHideIfSingle();
}
public AbstractWidgetPage<T> setHideTabsIfSingle(boolean hideTabsIfSingle) {
tabbedPanel.setHideIfSingle(hideTabsIfSingle);
return this;
}
protected IModel<String> newTabNameModel(String tabName)
{
return new SimpleNamingModel<String>("tab", tabName);
}
protected List<DashboardTab> getDashboardTabs() {
List<String> tabs = getTabs();
List<DashboardTab> ret = new ArrayList<DashboardTab>(tabs.size());
for (String tab : tabs) {
ret.add(new DashboardTab(tab));
}
return ret;
}
public List<String> getTabs() {
return dashboardManager.listTabs(getDomain(), getWidgetsFilter());
}
/**
* Select tab
* @param tab the name of tab to select
* @return true if tab was switched and false if there is no such tab;
*/
public boolean selectTab(String tab) {
if(tab==null) return false;
List<DashboardTab> tabs = tabbedPanel.getTabs();
for(int i=0; i<tabs.size();i++) {
if(tab.equals(tabs.get(i).tab)) {
tabbedPanel.setSelectedTab(i);
return true;
}
}
return false;
}
protected DashboardPanel<T> newDashboard(String id, String domain, String tab, IModel<T> model, IWidgetFilter<T> widgetsFilter) {
return new DashboardPanel<T>(id, domain, tab, model, widgetsFilter);
}
public IWidgetFilter<T> getWidgetsFilter() {
return widgetsFilter;
}
public void setWidgetsFilter(IWidgetFilter<T> widgetsFilter) {
this.widgetsFilter = widgetsFilter;
}
@Override
public void onEvent(IEvent<?> event) {
if(event.getPayload() instanceof ActionPerformedEvent && Broadcast.BUBBLE.equals(event.getType())) {
send(this, Broadcast.BREADTH, event.getPayload());
}
}
@Override
public IModel<String> getTitleModel() {
return new ResourceModel(getDomain());
}
public abstract String getDomain();
}