package ro.nextreports.server.web.analysis.feature.select;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.image.ContextImage;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import ro.nextreports.server.domain.Analysis;
import ro.nextreports.server.service.StorageService;
import ro.nextreports.server.util.AnalysisUtil;
import ro.nextreports.server.web.analysis.util.DatabaseUtil;
import ro.nextreports.server.web.common.behavior.SimpleTooltipBehavior;
import ro.nextreports.server.web.common.form.FormContentPanel;
import ro.nextreports.server.web.common.form.FormPanel;
public class ColumnsPanel extends FormContentPanel<Analysis> {
private List<String> choices;
public ArrayList<String> columns = new ArrayList<String>();
private ColumnsOrderBehavior orderBehavior;
@SpringBean
private StorageService storageService;
public ColumnsPanel(IModel<Analysis> model) {
super(FormPanel.CONTENT_ID);
//System.out.println("@@@@@ " + model.getObject());
setRenderBodyOnly(false);
setOutputMarkupId(true);
ContextImage urlImage = new ContextImage("infoImage","images/information.png");
urlImage.add(new SimpleTooltipBehavior(AnalysisUtil.getAnalysisInfo(model.getObject(), 5, storageService.getSettings())));
add(urlImage);
columns = model.getObject().getSelectedColumns();
choices = new LinkedList<String>();
choices.addAll(model.getObject().getColumns());
add(new Label("info", new StringResourceModel("ColumnsPanel.info", null, null)));
final CheckBoxMultipleChoice<String> listChoice = new CheckBoxMultipleChoice<String>("columns", new PropertyModel(this, "columns"), choices,
new ChoiceRenderer<String>() {
@Override
public Object getDisplayValue(String fullColumnName) {
return DatabaseUtil.getColumnAlias(fullColumnName);
}
});
listChoice.setOutputMarkupId(true);
// add class to allow for changing layout from vertical to horizontal
listChoice.setPrefix("<li class=\"analysisChoice\">");
listChoice.setSuffix("</li>");
add(listChoice);
add(new AjaxLink<Analysis>("selectAll") {
@Override
public void onClick(AjaxRequestTarget target) {
columns = new ArrayList<String>(choices);
target.add(ColumnsPanel.this);
}
});
add(new AjaxLink<Analysis>("selectNone") {
@Override
public void onClick(AjaxRequestTarget target) {
columns = new ArrayList<String>();
target.add(ColumnsPanel.this);
}
});
add(orderBehavior = new ColumnsOrderBehavior() {
@Override
public void onResponse(int oldIndex, int newIndex, AjaxRequestTarget target) {
moveElement(choices, oldIndex, newIndex);
target.add(ColumnsPanel.this);
}
});
}
public List<String> getColumns() {
return columns;
}
public void setColumns(ArrayList<String> columns) {
this.columns = columns;
}
public List<String> getChoices() {
return choices;
}
@Override
public void renderHead(IHeaderResponse response) {
response.render(OnDomReadyHeaderItem.forScript(
"var oldIndex, newIndex; " +
"$(function() { $(\"#sortable\").sortable({ " +
"start : function(event, ui){ " +
" oldIndex = ui.item.index();" +
"}, " +
"update : function(event, ui){ " +
" newIndex = ui.item.index(); " +
orderBehavior.getJavascript() +
"}" +
"} ); $(\"#sortable\").disableSelection(); });"));
}
private void moveElement(List<String> list, int oldPos, int newPos) {
if (oldPos == newPos) {
return;
}
String oldElement = new String(list.get(oldPos));
list.remove(oldPos);
list.add(newPos, oldElement);
}
}