/**
* $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-tool/src/java/org/sakaiproject/sitestats/tool/wicket/widget/WidgetTabs.java $
* $Id: WidgetTabs.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $
*
* Copyright (c) 2006-2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.sitestats.tool.wicket.widget;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxFallbackLink;
import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.Loop;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
public class WidgetTabs extends Panel implements IAjaxIndicatorAware {
private static final long serialVersionUID = 1L;
private LoadSelectedTabBehavior loadSelectedTabBehavior = null;
private List<AbstractTab> tabs;
public WidgetTabs(String id, List<AbstractTab> tabs) {
this(id, tabs, -1);
}
public WidgetTabs(String id, List<AbstractTab> tabs, int selectedTab) {
super(id, new Model(Integer.valueOf(-1)));
setOutputMarkupId(true);
setVersioned(false);
this.setTabs(tabs);
if(this.tabs == null) {
this.tabs = new ArrayList<AbstractTab>();
}
// tabs
Loop tabLoop = new Loop("tabs", tabs.size()) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(LoopItem item) {
int index = item.getIteration();
AbstractTab tab = ((AbstractTab) WidgetTabs.this.tabs.get(index));
int selected = getSelectedTab();
if(index == selected) {
item.add(new AttributeModifier("class", true, new Model("tabsel")));
}
final WebMarkupContainer titleLink = newLink("link", index);
titleLink.add(new Label("title", tab.getTitle()));
item.add(titleLink);
}
};
add(tabLoop);
// add ajax behavior
loadSelectedTabBehavior = new LoadSelectedTabBehavior();
add(loadSelectedTabBehavior);
// select initial tab
setSelectedTab(selectedTab, false);
}
protected void onBeforeRender() {
super.onBeforeRender();
if(!hasBeenRendered() && getSelectedTab() == -1){
setSelectedTab(0, false);
}
}
public void setTabs(List<AbstractTab> tabs) {
this.tabs = tabs;
}
public List<AbstractTab> getTabs() {
return tabs;
}
public void setSelectedTab(int selectedTab) {
setSelectedTab(selectedTab, true);
}
public void setSelectedTab(int selectedTab, boolean showTabContents) {
if(selectedTab < 0 || selectedTab >= tabs.size()){
throw new IndexOutOfBoundsException();
}
setDefaultModelObject(Integer.valueOf(selectedTab));
AbstractTab tab = getTabs().get(selectedTab);
WebMarkupContainer tabContents = null;
if(showTabContents) {
tabContents = tab.getPanel("tabContents");
}else{
tabContents = new WebMarkupContainer("tabContents");
}
if(get("tabContents") == null){
add(tabContents);
}else{
replace(tabContents);
}
}
public int getSelectedTab() {
return ((Integer) getDefaultModelObject()).intValue();
}
public String getLoadSelectedTabScript() {
return loadSelectedTabBehavior.getScript();
}
protected WebMarkupContainer newLink(String linkId, final int index) {
return new IndicatingAjaxFallbackLink(linkId) {
private static final long serialVersionUID = 1L;
public void onClick(AjaxRequestTarget target) {
setSelectedTab(index);
if(target != null){
target.addComponent(WidgetTabs.this);
target.appendJavascript("setMainFrameHeightNoScroll(window.name, 0, 100);");
}
onAjaxUpdate(target);
}
};
}
protected void onAjaxUpdate(AjaxRequestTarget target) {}
public String getAjaxIndicatorMarkupId() {
return null;
}
private class LoadSelectedTabBehavior extends AbstractDefaultAjaxBehavior {
private static final long serialVersionUID = 1L;
@Override
protected void respond(AjaxRequestTarget target) {
setSelectedTab(getSelectedTab());
target.addComponent(WidgetTabs.this);
target.appendJavascript("setMainFrameHeightNoScroll(window.name);");
}
public String getScript() {
StringBuilder buff = new StringBuilder();
buff.append("wicketAjaxGet('");
buff.append(getCallbackUrl(false));
buff.append(",function() {}, function() {}");
buff.append(",null, '" + getChannelName() + "'");
buff.append(")");
return buff.toString();
}
@Override
protected String getChannelName() {
return getId();
}
}
}