/**
* $URL:$
* $Id:$
*
* 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.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.behavior.SimpleAttributeModifier;
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.link.ExternalLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.link.StatelessLink;
import org.apache.wicket.markup.html.list.Loop;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.sakaiproject.sitestats.api.report.ReportDef;
import org.sakaiproject.sitestats.tool.wicket.components.AjaxLazyLoadFragment;
import org.sakaiproject.sitestats.tool.wicket.components.ExternalImage;
import org.sakaiproject.sitestats.tool.wicket.models.ReportDefModel;
import org.sakaiproject.sitestats.tool.wicket.pages.ReportDataPage;
/**
* @author Nuno Fernandes
*/
public class Widget extends Panel {
private static final long serialVersionUID = 1L;
private static final int MAX_TEXT_LENGTH = 16;
private String iconUrl = "";
private String title = "";
private List<WidgetMiniStat> widgetMiniStats = null;
private List<AbstractTab> tabs = null;
public Widget(String id, String iconUrl, String title, List<WidgetMiniStat> widgetMiniStats, List<AbstractTab> widgetTabs) {
super(id);
this.iconUrl = iconUrl;
this.title = title;
this.widgetMiniStats = widgetMiniStats;
this.tabs = widgetTabs;
}
@Override
protected void onBeforeRender() {
renderWidget();
super.onBeforeRender();
}
private void renderWidget() {
setRenderBodyOnly(true);
removeAll();
// Icon
add(new ExternalImage("icon", iconUrl));
// Title
add(new Label("title", title));
// Show more/less links
ExternalLink showMore = new ExternalLink("showMore", "#");
showMore.setOutputMarkupId(true);
add(showMore);
ExternalLink showLess = new ExternalLink("showLess", "#");
showLess.setOutputMarkupId(true);
add(showLess);
// Content details (middle)
WebMarkupContainer middle = new WebMarkupContainer("middle");
middle.setOutputMarkupId(true);
add(middle);
// MiniStats ajax load behavior
AjaxLazyLoadFragment ministatContainer = new AjaxLazyLoadFragment("ministatContainer") {
private static final long serialVersionUID = 12L;
@Override
public Fragment getLazyLoadFragment(String markupId) {
return Widget.this.getLazyLoadedMiniStats(markupId);
}
@Override
public Component getLoadingComponent(String markupId) {
StringBuilder loadingComp = new StringBuilder();
loadingComp.append("<div class=\"ministat load\">");
loadingComp.append(" <img src=\"");
loadingComp.append(RequestCycle.get().urlFor(AbstractDefaultAjaxBehavior.INDICATOR));
loadingComp.append("\"/>");
loadingComp.append("</div>");
return new Label(markupId, loadingComp.toString()).setEscapeModelStrings(false);
}
};
add(ministatContainer);
// Tabs
WidgetTabs widgetTabs = new WidgetTabs("widgetTabs", tabs, 0);
middle.add(widgetTabs);
// Links behaviors
String showMoreOnclick = "showMoreLess('#"+middle.getMarkupId()+"', '#"+showMore.getMarkupId()+"','#"+showLess.getMarkupId()+"');return false;";
showMore.add(new SimpleAttributeModifier("onclick", showMoreOnclick));
String showLessOnclick = "showMoreLess('#"+middle.getMarkupId()+"', '#"+showMore.getMarkupId()+"','#"+showLess.getMarkupId()+"');return false;";
showLess.add(new SimpleAttributeModifier("onclick", showLessOnclick));
}
private Fragment getLazyLoadedMiniStats(String markupId) {
Fragment ministatFragment = new Fragment(markupId, "ministatFragment", this);
int miniStatsCount = widgetMiniStats != null ? widgetMiniStats.size() : 0;
Loop miniStatsLoop = new Loop("ministat", miniStatsCount) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(LoopItem item) {
int index = item.getIteration();
WidgetMiniStat ms = widgetMiniStats.get(index);
// Value
WebMarkupContainer value = new WebMarkupContainer("value");
Label valueLabel = new Label("valueLabel", ms.getValue());
valueLabel.setRenderBodyOnly(true);
String tooltip = ms.getTooltip();
StringBuilder classes = new StringBuilder();
if(tooltip == null) {
classes.append("value");
}else{
classes.append("valueText");
value.add(new AttributeModifier("title", true, new Model(ms.getTooltip())));
}
if(ms.isWiderText()) {
if(ms.getValue().length() > MAX_TEXT_LENGTH) {
valueLabel.setDefaultModelObject(ms.getValue().substring(0, MAX_TEXT_LENGTH) + "...");
}
item.add(new AttributeModifier("class", true, new Model("ministat wider")));
}
value.add(new AttributeModifier("class", true, new Model(classes.toString())));
value.add(valueLabel);
item.add(value);
// Second value
Label secvalue = new Label("secvalue", ms.getSecondValue());
secvalue.setVisible(ms.getSecondValue() != null);
value.add(secvalue);
// Link
final ReportDef reportDefinition = ms.getReportDefinition();
Link link = new StatelessLink("report") {
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
String siteId = reportDefinition.getSiteId();
ReportDefModel reportDefModel = new ReportDefModel(reportDefinition);
setResponsePage(new ReportDataPage(reportDefModel, new PageParameters("siteId="+siteId), getWebPage()));
}
};
if(reportDefinition != null) {
link.add(new AttributeModifier("title", true, new ResourceModel("overview_show_report")));
}else if(ms instanceof WidgetMiniStatLink){
WidgetMiniStatLink msl = (WidgetMiniStatLink) ms;
final Page page = msl.getPageLink();
link = new StatelessLink("report") {
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
setResponsePage(page);
}
};
if(msl.getPageLinkTooltip() != null) {
link.add(new AttributeModifier("title", true, new Model(msl.getPageLinkTooltip())));
}
link.add(new AttributeModifier("class", true, new Model("extlink")));
}else{
link.setEnabled(false);
link.setRenderBodyOnly(true);
}
item.add(link);
// Label
Label label = new Label("label", ms.getLabel());
label.setRenderBodyOnly(true);
link.add(label);
}
};
ministatFragment.add(miniStatsLoop);
return ministatFragment;
}
}