/* * 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.gui.api.component; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.model.IModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.model.util.ListModel; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.dialog.Popupable; import com.evolveum.midpoint.web.component.input.QNameChoiceRenderer; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; public class ObjectBrowserPanel<O extends ObjectType> extends BasePanel<O> implements Popupable{ private static final long serialVersionUID = 1L; private static final String ID_TYPE = "type"; private static final String ID_TYPE_PANEL = "typePanel"; private static final String ID_TABLE = "table"; private static final String ID_BUTTON_ADD = "addButton"; private IModel<QName> typeModel; private PageBase parentPage; private ObjectFilter queryFilter; private List<O> selectedObjectsList = new ArrayList<O>(); /** * @param defaultType specifies type of the object that will be selected by default */ public ObjectBrowserPanel(String id, final Class<? extends O> defaultType, List<QName> supportedTypes, boolean multiselect, PageBase parentPage) { this(id, defaultType, supportedTypes, multiselect, parentPage, null); } /** * @param defaultType specifies type of the object that will be selected by default */ public ObjectBrowserPanel(String id, final Class<? extends O> defaultType, List<QName> supportedTypes, boolean multiselect, PageBase parentPage, ObjectFilter queryFilter) { this(id, defaultType, supportedTypes, multiselect, parentPage, null, new ArrayList<O>()); } public ObjectBrowserPanel(String id, final Class<? extends O> defaultType, List<QName> supportedTypes, boolean multiselect, PageBase parentPage, ObjectFilter queryFilter, List<O> selectedData) { super(id); this.parentPage = parentPage; this.queryFilter = queryFilter; this.selectedObjectsList = selectedData; typeModel = new LoadableModel<QName>(false) { private static final long serialVersionUID = 1L; @Override protected QName load() { return compileTimeClassToQName(defaultType); } }; initLayout(defaultType, supportedTypes, multiselect); } private void initLayout(Class<? extends O> type, final List<QName> supportedTypes, final boolean multiselect) { WebMarkupContainer typePanel = new WebMarkupContainer(ID_TYPE_PANEL); typePanel.setOutputMarkupId(true); typePanel.add(new VisibleEnableBehaviour() { private static final long serialVersionUID = 1L; @Override public boolean isVisible() { return supportedTypes.size() != 1; } }); add(typePanel); DropDownChoice<QName> typeSelect = new DropDownChoice<QName>(ID_TYPE, typeModel, new ListModel<QName>(supportedTypes), new QNameChoiceRenderer()); typeSelect.add(new OnChangeAjaxBehavior() { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { ObjectListPanel<O> listPanel = (ObjectListPanel<O>) get(ID_TABLE); listPanel = createObjectListPanel(qnameToCompileTimeClass(typeModel.getObject()), multiselect); addOrReplace(listPanel); target.add(listPanel); } }); typePanel.add(typeSelect); ObjectListPanel<O> listPanel = createObjectListPanel(type, multiselect); add(listPanel); AjaxButton addButton = new AjaxButton(ID_BUTTON_ADD, createStringResource("userBrowserDialog.button.addButton")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { List<O> selected = ((PopupObjectListPanel) getParent().get(ID_TABLE)).getSelectedObjects(); QName type = ObjectBrowserPanel.this.typeModel.getObject(); ObjectBrowserPanel.this.addPerformed(target, type, selected); } }; addButton.add(new VisibleEnableBehaviour() { private static final long serialVersionUID = 1L; @Override public boolean isVisible() { return multiselect; } }); add(addButton); } protected void onClick(AjaxRequestTarget target, O focus) { parentPage.hideMainPopup(target); } protected void onSelectPerformed(AjaxRequestTarget target, O focus) { parentPage.hideMainPopup(target); } private ObjectListPanel<O> createObjectListPanel(Class<? extends O> type, final boolean multiselect) { PopupObjectListPanel<O> listPanel = new PopupObjectListPanel<O>(ID_TABLE, type, multiselect, parentPage, selectedObjectsList) { private static final long serialVersionUID = 1L; @Override protected void onSelectPerformed(AjaxRequestTarget target, O object) { ObjectBrowserPanel.this.onSelectPerformed(target, object); } @Override protected ObjectQuery addFilterToContentQuery(ObjectQuery query) { if (queryFilter != null){ if (query == null){ query = new ObjectQuery(); } query.addFilter(queryFilter); } return query; } }; listPanel.setOutputMarkupId(true); return listPanel; } protected void addPerformed(AjaxRequestTarget target, QName type, List<O> selected) { parentPage.hideMainPopup(target); } private Class qnameToCompileTimeClass(QName typeName) { return parentPage.getPrismContext().getSchemaRegistry().getCompileTimeClassForObjectType(typeName); } private QName compileTimeClassToQName(Class<? extends O> type) { PrismObjectDefinition def = parentPage.getPrismContext().getSchemaRegistry() .findObjectDefinitionByCompileTimeClass(type); if (def == null) { return UserType.COMPLEX_TYPE; } return def.getTypeName(); } @Override public int getWidth() { return 900; } @Override public int getHeight() { return 700; } @Override public StringResourceModel getTitle() { return parentPage.createStringResource("ObjectBrowserPanel.chooseObject"); } @Override public Component getComponent() { return this; } }