package ro.nextreports.server.web.analysis.feature.group;
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.form.AjaxSubmitLink;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.image.ContextImage;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
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.common.behavior.SimpleTooltipBehavior;
import ro.nextreports.server.web.common.form.FormContentPanel;
import ro.nextreports.server.web.common.form.FormPanel;
import ro.nextreports.server.web.common.table.BaseTable;
import ro.nextreports.server.web.common.table.LinkPropertyColumn;
public class GroupPanel extends FormContentPanel<Analysis> {
private LinkedList<String> groups;
private Label label;
private String groupObject;
private DropDownChoice<String> columnChoice;
private DataTable<String, String> table;
private GroupObjectDataProvider provider;
private int editIndex = -1;
private IModel<String> addTextModel;
@SpringBean
private StorageService storageService;
public GroupPanel(IModel<Analysis> model) {
super(FormPanel.CONTENT_ID);
groups = new LinkedList<String>(model.getObject().getGroups());
groupObject = model.getObject().getColumns().get(0);
ContextImage urlImage = new ContextImage("infoImage","images/information.png");
urlImage.add(new SimpleTooltipBehavior(AnalysisUtil.getAnalysisInfo(model.getObject(), 5, storageService.getSettings())));
add(urlImage);
add(new Label("column", new StringResourceModel("GroupPanel.column", null, null)));
columnChoice = new DropDownChoice<String>("columnChoice",
new PropertyModel<String>(this, "groupObject"), model.getObject().getSimpleColumns());
columnChoice.setOutputMarkupPlaceholderTag(true);
columnChoice.setRequired(true);
add(columnChoice);
AjaxSubmitLink addLink = new AjaxSubmitLink("addLink") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
if (editIndex != -1) {
int index = groups.indexOf(groupObject);
if ( (index != -1) && (index != editIndex) ) {
error(getString("GroupPanel.duplicateGroup"));
target.add(getFeedbackPanel());
return;
}
groups.set(editIndex, groupObject);
resetEdit(target);
} else {
if (groups.contains(groupObject)) {
error(getString("GroupPanel.duplicateGroup"));
target.add(getFeedbackPanel());
return;
}
groups.add(groupObject);
}
target.add(table);
target.add(getFeedbackPanel());
}
};
addTextModel = Model.of("");
label = new Label("addMessage", addTextModel);
label.setOutputMarkupPlaceholderTag(true);
addLink.add(label);
add(addLink);
addTable();
}
protected void onConfigure() {
super.onConfigure();
addTextModel.setObject(getString("add"));
}
private void resetEdit(AjaxRequestTarget target) {
addTextModel.setObject(getString("add"));
editIndex = -1;
target.add(label);
}
private void addTable() {
List<IColumn<String, String>> columns = new ArrayList<IColumn<String, String>>();
columns.add(new AbstractColumn<String, String>(new Model<String>("")) {
@Override
public String getCssClass() {
return "index";
}
public void populateItem(Item<ICellPopulator<String>> item, String componentId, final IModel<String> rowModel) {
int col=item.getIndex();
Item<?> i = (Item<?>) item.getParent().getParent();
int row = i.getIndex()+1;
item.add(new Label(componentId, new Model<String>(String.valueOf(row))));
}
});
columns.add(new AbstractColumn<String, String>(new StringResourceModel("GroupPanel.column", null, null)) {
public void populateItem(Item<ICellPopulator<String>> item, String componentId, final IModel<String> rowModel) {
final String groupObject = rowModel.getObject();
item.add(new Label(componentId, new Model<String>(groupObject)));
}
});
columns.add(new LinkPropertyColumn<String>(new StringResourceModel("up", null, null), new StringResourceModel("up", null, null)) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(Item item, String componentId, IModel model, AjaxRequestTarget target) {
String groupObject = (String) model.getObject();
int upIndex = groups.indexOf(groupObject);
if (upIndex > 0) {
groups.remove(upIndex);
groups.add(upIndex-1, groupObject);
resetEdit(target);
target.add(table);
}
}
});
columns.add(new LinkPropertyColumn<String>(new StringResourceModel("down", null, null), new StringResourceModel("down", null, null)) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(Item item, String componentId, IModel model, AjaxRequestTarget target) {
String groupObject = (String) model.getObject();
int downIndex = groups.indexOf(groupObject);
if (downIndex < groups.size()-1) {
groups.remove(downIndex);
groups.add(downIndex+1, groupObject);
resetEdit(target);
target.add(table);
}
}
});
columns.add(new LinkPropertyColumn<String>(new StringResourceModel("edit", null, null), new StringResourceModel("edit", null, null)) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(Item item, String componentId, IModel model, AjaxRequestTarget target) {
String groupObject = (String) model.getObject();
editIndex = groups.indexOf(groupObject);
GroupPanel.this.groupObject = groupObject;
addTextModel.setObject(getString("edit"));
target.add(columnChoice);
target.add(label);
}
});
columns.add(new LinkPropertyColumn<String>(new StringResourceModel("delete", null, null), new StringResourceModel("delete", null, null), new StringResourceModel("GroupPanel.askDelete", null, null)) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(Item item, String componentId, IModel model, AjaxRequestTarget target) {
String groupObject = (String) model.getObject();
int index = groups.indexOf(groupObject);
groups.remove(index);
resetEdit(target);
target.add(table);
}
});
provider = new GroupObjectDataProvider(new Model<LinkedList<String>>(groups));
table = new BaseTable<String>("table", columns, provider, 10);
table.setOutputMarkupId(true);
add(table);
}
public LinkedList<String> getGroups() {
return groups;
}
public boolean isEdit() {
return editIndex != -1;
}
}