/*
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache 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.apache.org/licenses/LICENSE-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 com.evolveum.midpoint.web.component.wizard.resource.component.capability;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider;
import com.evolveum.midpoint.web.component.data.TablePanel;
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.wizard.resource.CapabilityStep;
import com.evolveum.midpoint.web.component.wizard.resource.dto.Capability;
import com.evolveum.midpoint.web.component.wizard.resource.dto.CapabilityDto;
import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.StringResourceModel;
import java.util.ArrayList;
import java.util.List;
/**
* @author shood
* */
public class AddCapabilityDialog extends ModalWindow {
private static final String ID_TABLE = "table";
private static final String ID_CANCEL = "cancelButton";
private static final String ID_ADD = "addButton";
private static final String DEFAULT_SORTABLE_PROPERTY = null;
private boolean initialized;
private IModel<List<CapabilityDto<CapabilityType>>> model;
protected AddCapabilityDialog(String id, final IModel<CapabilityStepDto> capabilityModel) {
super(id);
model = new LoadableModel<List<CapabilityDto<CapabilityType>>>() {
@Override
protected List<CapabilityDto<CapabilityType>> load() {
return loadModel(capabilityModel);
}
};
setTitle(createStringResource("addCapabilityDialog.title"));
showUnloadConfirmation(false);
setCssClassName(ModalWindow.CSS_CLASS_GRAY);
setCookieName(AddCapabilityDialog.class.getSimpleName() + ((int) (Math.random() * 100)));
setResizable(false);
setInitialWidth(500);
setInitialHeight(500);
setWidthUnit("px");
WebMarkupContainer content = new WebMarkupContainer(getContentId());
content.setOutputMarkupId(true);
setContent(content);
}
private List<CapabilityDto<CapabilityType>> loadModel(IModel<CapabilityStepDto> capabilityModel) {
List<Class<? extends CapabilityType>> existingCapabilityClasses = new ArrayList<>();
for (CapabilityDto cap: capabilityModel.getObject().getCapabilities()) {
existingCapabilityClasses.add(cap.getCapability().getClass());
}
List<CapabilityDto<CapabilityType>> rv = new ArrayList<>();
for (Capability supportedCapability : Capability.values()) {
if (!existingCapabilityClasses.contains(supportedCapability.getClazz())) {
rv.add(new CapabilityDto<>(CapabilityStep.fillDefaults(supportedCapability.newInstance()), false)); // 'among natives' doesn't matter here
}
}
return rv;
}
private ListDataProvider<CapabilityDto<CapabilityType>> createProvider() {
return new ListDataProvider<>(this, model);
}
@Override
protected void onBeforeRender(){
super.onBeforeRender();
if (initialized) {
return;
}
initLayout((WebMarkupContainer) get(getContentId()));
initialized = true;
}
public StringResourceModel createStringResource(String resourceKey, Object... objects) {
return PageBase.createStringResourceStatic(this, resourceKey, objects);
}
private void initLayout(WebMarkupContainer container){
List<IColumn<CapabilityDto<CapabilityType>, String>> columns = initColumns();
TablePanel<CapabilityDto<CapabilityType>> table = new TablePanel<>(ID_TABLE, createProvider(), columns);
table.setOutputMarkupId(true);
table.setShowPaging(false);
container.add(table);
AjaxButton cancelButton = new AjaxButton(ID_CANCEL,
createStringResource("addCapabilityDialog.button.cancel")) {
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
cancelPerformed(ajaxRequestTarget);
}
};
container.add(cancelButton);
AjaxButton addButton = new AjaxButton(ID_ADD,
createStringResource("addCapabilityDialog.button.Add")) {
@Override
public void onClick(AjaxRequestTarget target) {
addPerformed(target);
}
};
container.add(addButton);
}
private List<IColumn<CapabilityDto<CapabilityType>, String>> initColumns(){
List<IColumn<CapabilityDto<CapabilityType>, String>> columns = new ArrayList<>();
IColumn<CapabilityDto<CapabilityType>, String> column = new CheckBoxHeaderColumn<>();
columns.add(column);
column = new PropertyColumn<>(createStringResource("addCapabilityDialog.column.name"), CapabilityDto.F_DISPLAY_NAME);
columns.add(column);
return columns;
}
public void updateTable(AjaxRequestTarget target, IModel<CapabilityStepDto> selected){
model.setObject(loadModel(selected));
}
@SuppressWarnings("unchecked")
public TablePanel<CapabilityDto<CapabilityType>> getTable() {
return (TablePanel<CapabilityDto<CapabilityType>>) get(getContentId()+":"+ID_TABLE);
}
public String getSortableProperty(){
return DEFAULT_SORTABLE_PROPERTY;
}
private void cancelPerformed(AjaxRequestTarget target) {
close(target);
}
protected List<CapabilityDto<CapabilityType>> getSelectedData() {
List<CapabilityDto<CapabilityType>> selected = new ArrayList<>();
for (CapabilityDto<CapabilityType> cap: model.getObject()) {
if (cap.isSelected()) {
selected.add(cap);
}
}
return selected;
}
public BaseSortableDataProvider getDataProviderSearchProperty(){
return null;
}
protected void chooseOperationPerformed(AjaxRequestTarget target, CapabilityDto object) {}
protected void addPerformed(AjaxRequestTarget target){}
}