package org.sakaiproject.delegatedaccess.tool.pages;
import java.util.ArrayList;
import java.util.List;
import javax.swing.tree.TreeNode;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.sakaiproject.delegatedaccess.model.ListOptionSerialized;
import org.sakaiproject.delegatedaccess.model.NodeModel;
import org.sakaiproject.delegatedaccess.util.DelegatedAccessConstants;
public class EditablePanelListInherited extends Panel{
private boolean loadedFlag = false;
public EditablePanelListInherited(String id, IModel inputModel, final NodeModel nodeModel, final TreeNode node, final int userType, final int fieldType){
super(id);
final WebMarkupContainer inheritedSpan = new WebMarkupContainer("inheritedSpan");
inheritedSpan.setOutputMarkupId(true);
final String inheritedSpanId = inheritedSpan.getMarkupId();
add(inheritedSpan);
//Auth
final IModel<List<? extends ListOptionSerialized>> inheritedRestrictedAuthToolsModel = new AbstractReadOnlyModel<List<? extends ListOptionSerialized>>(){
private static final long serialVersionUID = 1L;
@Override
public List<? extends ListOptionSerialized> getObject() {
if(loadedFlag){
List<ListOptionSerialized> selectedOptions = null;
List<ListOptionSerialized> inheritedOptions = null;
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
selectedOptions = nodeModel.getSelectedRestrictedAuthTools();
inheritedOptions = nodeModel.getInheritedRestrictedAuthTools();
}
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType && !nodeModel.getNodeShoppingPeriodAdmin()){
List<ListOptionSerialized> returnList =selectedOptions;
if(returnList.isEmpty()){
returnList = inheritedOptions;
}
return returnList;
}else{
return inheritedOptions;
}
}else{
return new ArrayList<ListOptionSerialized>();
}
}
};
//Public
final IModel<List<? extends ListOptionSerialized>> inheritedRestrictedPublicToolsModel = new AbstractReadOnlyModel<List<? extends ListOptionSerialized>>(){
private static final long serialVersionUID = 1L;
@Override
public List<? extends ListOptionSerialized> getObject() {
if(loadedFlag){
List<ListOptionSerialized> selectedOptions = null;
List<ListOptionSerialized> inheritedOptions = null;
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
selectedOptions = nodeModel.getSelectedRestrictedPublicTools();
inheritedOptions = nodeModel.getInheritedRestrictedPublicTools();
}
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType && !nodeModel.getNodeShoppingPeriodAdmin()){
List<ListOptionSerialized> returnList =selectedOptions;
if(returnList.isEmpty()){
returnList = inheritedOptions;
}
return returnList;
}else{
return inheritedOptions;
}
}else{
return new ArrayList<ListOptionSerialized>();
}
}
};
//Auth
final ListView<ListOptionSerialized> inheritedAuthListView = new ListView<ListOptionSerialized>("inheritedRestrictedAuthTools",inheritedRestrictedAuthToolsModel){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<ListOptionSerialized> item) {
ListOptionSerialized tool = (ListOptionSerialized) item.getModelObject();
Label name = new Label("name", tool.getName());
item.add(name);
}
@Override
public boolean isVisible() {
if(loadedFlag){
List<ListOptionSerialized> inheritedOptions = null;
String[] nodeOptions = null;
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
inheritedOptions = nodeModel.getInheritedRestrictedAuthTools();
nodeOptions = nodeModel.getNodeRestrictedAuthTools();
}
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType){
return (inheritedOptions != null && !inheritedOptions.isEmpty())
|| (!nodeModel.getNodeShoppingPeriodAdmin() && nodeOptions.length > 0);
}else{
return inheritedOptions != null && !inheritedOptions.isEmpty();
}
}else{
return false;
}
}
};
inheritedAuthListView.setOutputMarkupId(true);
inheritedSpan.add(inheritedAuthListView);
//public:
final ListView<ListOptionSerialized> inheritedPublicListView = new ListView<ListOptionSerialized>("inheritedRestrictedPublicTools",inheritedRestrictedPublicToolsModel){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<ListOptionSerialized> item) {
ListOptionSerialized tool = (ListOptionSerialized) item.getModelObject();
Label name = new Label("name", tool.getName());
item.add(name);
}
@Override
public boolean isVisible() {
if(loadedFlag && DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType){
List<ListOptionSerialized> inheritedOptions = null;
String[] nodeOptions = null;
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
inheritedOptions = nodeModel.getInheritedRestrictedPublicTools();
nodeOptions = nodeModel.getNodeRestrictedPublicTools();
}
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType){
return (inheritedOptions != null && !inheritedOptions.isEmpty())
|| (!nodeModel.getNodeShoppingPeriodAdmin() && nodeOptions.length > 0);
}else{
return inheritedOptions != null && !inheritedOptions.isEmpty();
}
}else{
return false;
}
}
};
inheritedPublicListView.setOutputMarkupId(true);
inheritedSpan.add(inheritedPublicListView);
AjaxLink<Void> inheritedToolsLink = new AjaxLink<Void>("inheritedToolsLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
if(!loadedFlag){
loadedFlag = true;
inheritedAuthListView.setDefaultModel(inheritedRestrictedAuthToolsModel);
inheritedPublicListView.setDefaultModel(inheritedRestrictedPublicToolsModel);
target.addComponent(inheritedSpan);
}
target.appendJavascript("document.getElementById('" + inheritedSpanId + "').style.display='';");
}
};
add(inheritedToolsLink);
AjaxLink<Void> closeInheritedSpanLink = new AjaxLink<Void>("closeInheritedSpanLink") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
target.appendJavascript("document.getElementById('" + inheritedSpanId + "').style.display='none';");
}
};
inheritedSpan.add(closeInheritedSpanLink);
Label inheritedNodeTitle = new Label("inheritedNodeTitle", nodeModel.getNode().title);
inheritedSpan.add(inheritedNodeTitle);
Label noInheritedToolsLabel = new Label("noToolsInherited", new StringResourceModel("inheritedNothing", null)){
public boolean isVisible() {
if(loadedFlag){
List<ListOptionSerialized> inheritedOptions = null;
String[] nodeOptions = null;
if(DelegatedAccessConstants.TYPE_LISTFIELD_TOOLS == fieldType){
inheritedOptions = nodeModel.getInheritedRestrictedAuthTools();
nodeOptions = nodeModel.getNodeRestrictedAuthTools();
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType){
inheritedOptions.addAll(nodeModel.getInheritedRestrictedPublicTools());
String[] nodeOptions2 = nodeModel.getNodeRestrictedPublicTools();
//we only care about the length, so its fine to keep it empty:
nodeOptions = new String[nodeOptions2.length + nodeOptions.length];
}
}
if(DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType){
return (nodeModel.getNodeShoppingPeriodAdmin() && (inheritedOptions == null || inheritedOptions.isEmpty()))
|| (!nodeModel.getNodeShoppingPeriodAdmin() && (nodeOptions == null || nodeOptions.length == 0));
}else{
return inheritedOptions == null || inheritedOptions.isEmpty();
}
}else{
return false;
}
};
};
inheritedSpan.add(noInheritedToolsLabel);
Label authHeader = new Label("authHeader", new ResourceModel(".auth")){
@Override
public boolean isVisible() {
return DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType && !nodeModel.getInheritedRestrictedAuthTools().isEmpty();
}
};
inheritedSpan.add(authHeader);
Label publicHeader = new Label("publicHeader", new ResourceModel(".anon")){
@Override
public boolean isVisible() {
return DelegatedAccessConstants.TYPE_ACCESS_SHOPPING_PERIOD_USER == userType && !nodeModel.getInheritedRestrictedPublicTools().isEmpty();
}
};
inheritedSpan.add(publicHeader);
}
public boolean isLoadedFlag() {
return loadedFlag;
}
}