/*
* Copyright (c) 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.assignment;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.data.*;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.self.dto.AssignmentViewType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.navigation.paging.IPageableItems;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import java.util.ArrayList;
import java.util.List;
/**
* Created by honchar
*/
public class CatalogItemsPanel extends BasePanel implements IPageableItems {
private static final long serialVersionUID = 1L;
private static final String ID_MULTI_BUTTON_TABLE = "multiButtonTable";
private static final String ID_PAGING_FOOTER = "pagingFooter";
private static final String ID_PAGING = "paging";
private static final String ID_COUNT = "count";
private static final String ID_FOOTER_CONTAINER = "footerContainer";
private static final String ID_SUBMIT_BUTTON = "submitButton";
private static final String ID_FOOTER = "footer";
private ObjectDataProvider<AssignmentEditorDto, AbstractRoleType> objectDataProvider;
private ListDataProvider listProvider;
private IModel<List<AssignmentEditorDto>> itemsListModel;
private int itemsPerRow = 4;
private static final long DEFAULT_ROWS_COUNT = 5;
private PageBase pageBase;
private IModel<String> catalogOidModel;
private long currentPage = 0;
private boolean isListProvider = false;
public CatalogItemsPanel(String id) {
super(id);
}
public CatalogItemsPanel(String id, final PageBase pageBase, int itemsPerRow,
ListDataProvider provider) {
super(id);
this.pageBase = pageBase;
this.listProvider = provider;
this.catalogOidModel = null;
if (itemsPerRow > 0){
this.itemsPerRow = itemsPerRow;
}
isListProvider = true;
initItemListModel();
setCurrentPage(0);
initLayout();
}
public CatalogItemsPanel(String id, IModel<String> catalogOidModel, final PageBase pageBase, int itemsPerRow,
ObjectDataProvider<AssignmentEditorDto, AbstractRoleType> provider) {
super(id);
this.pageBase = pageBase;
this.objectDataProvider = provider;
this.catalogOidModel = catalogOidModel;
if (itemsPerRow > 0){
this.itemsPerRow = itemsPerRow;
}
initItemListModel();
setCurrentPage(0);
initLayout();
}
private void initLayout() {
setOutputMarkupId(true);
Component assignmentsTable;
if (isCatalogOidEmpty()) {
assignmentsTable = new Label(ID_MULTI_BUTTON_TABLE, createStringResource("PageAssignmentShoppingKart.roleCatalogIsNotConfigured"));
} else {
assignmentsTable = new MultiButtonTable(ID_MULTI_BUTTON_TABLE, itemsPerRow, itemsListModel, pageBase);
}
assignmentsTable.setOutputMarkupId(true);
add(assignmentsTable);
add(createFooter(ID_FOOTER));
}
protected void refreshCatalogItemsPanel() {
}
private void initItemListModel() {
List<AssignmentEditorDto> itemList = new ArrayList<>();
if (isListProvider){
itemList = listProvider != null ? listProvider.getAvailableData() : new ArrayList<>();
} else {
itemList = objectDataProvider != null ? objectDataProvider.getAvailableData() : new ArrayList<>();
}
itemsListModel = Model.ofList(itemList);
}
private void refreshItemsPanel() {
if (isListProvider){
if (listProvider != null) {
if (listProvider.getAvailableData() != null) {
listProvider.getAvailableData().clear();
}
long from = currentPage * itemsPerRow * DEFAULT_ROWS_COUNT;
try {
listProvider.internalIterator(from, itemsPerRow * DEFAULT_ROWS_COUNT);
} catch (ArrayIndexOutOfBoundsException ex){
// nothing to do here
}
}
} else {
if (objectDataProvider != null) {
if (objectDataProvider.getAvailableData() != null) {
objectDataProvider.getAvailableData().clear();
}
long from = currentPage * itemsPerRow * DEFAULT_ROWS_COUNT;
objectDataProvider.internalIterator(from, itemsPerRow * DEFAULT_ROWS_COUNT);
}
}
MultiButtonTable assignmentsTable = new MultiButtonTable(ID_MULTI_BUTTON_TABLE, itemsPerRow, itemsListModel, pageBase);
assignmentsTable.setOutputMarkupId(true);
replace(assignmentsTable);
}
private MultiButtonTable getMultiButtonTable() {
return (MultiButtonTable) get(ID_MULTI_BUTTON_TABLE);
}
protected WebMarkupContainer createFooter(String footerId) {
PagingFooter footer = new PagingFooter(footerId, ID_PAGING_FOOTER, CatalogItemsPanel.this);
footer.add(new VisibleEnableBehaviour(){
@Override
public boolean isVisible(){
return !isCatalogOidEmpty() && getPageCount() > 1;
}
});
return footer;
}
private static class PagingFooter extends Fragment {
public PagingFooter(String id, String markupId, CatalogItemsPanel markupProvider) {
super(id, markupId, markupProvider);
setOutputMarkupId(true);
initLayout(markupProvider);
}
private void initLayout(final CatalogItemsPanel catalogItemsPanel) {
WebMarkupContainer footerContainer = new WebMarkupContainer(ID_FOOTER_CONTAINER);
footerContainer.setOutputMarkupId(true);
final Label count = new Label(ID_COUNT, new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
return "";
}
});
count.setOutputMarkupId(true);
footerContainer.add(count);
BoxedPagingPanel nb2 = new BoxedPagingPanel(ID_PAGING, catalogItemsPanel, true) {
@Override
protected void onPageChanged(AjaxRequestTarget target, long page) {
CatalogItemsPanel catalogPanel = PagingFooter.this.findParent(CatalogItemsPanel.class);
catalogPanel.refreshItemsPanel();
target.add(catalogPanel);
target.add(count);
}
};
footerContainer.add(nb2);
add(footerContainer);
}
}
@Override
public void setCurrentPage(long page) {
currentPage = page;
long from = page * itemsPerRow * DEFAULT_ROWS_COUNT;
if (isListProvider){
if (listProvider.getAvailableData() != null) {
listProvider.getAvailableData().clear();
}
try {
listProvider.internalIterator(from, itemsPerRow * DEFAULT_ROWS_COUNT);
} catch (ArrayIndexOutOfBoundsException ex){
// nothing to do here
}
} else {
if (objectDataProvider.getAvailableData() != null) {
objectDataProvider.getAvailableData().clear();
}
objectDataProvider.internalIterator(from, itemsPerRow * DEFAULT_ROWS_COUNT);
}
}
@Override
public void setItemsPerPage(long page) {
}
@Override
public long getCurrentPage() {
return currentPage;
}
@Override
public long getPageCount() {
if (isListProvider){
if (listProvider != null) {
long itemsPerPage = getItemsPerPage();
return itemsPerPage != 0 ? (listProvider.size() % itemsPerPage == 0 ? (listProvider.size() / itemsPerPage) :
(listProvider.size() / itemsPerPage + 1)) : 0;
}
} else {
if (objectDataProvider != null) {
long itemsPerPage = getItemsPerPage();
return itemsPerPage != 0 ? (objectDataProvider.size() % itemsPerPage == 0 ? (objectDataProvider.size() / itemsPerPage) :
(objectDataProvider.size() / itemsPerPage + 1)) : 0;
}
}
return 0;
}
@Override
public long getItemsPerPage() {
return DEFAULT_ROWS_COUNT * itemsPerRow;
}
@Override
public long getItemCount() {
return 0l;
}
private boolean isCatalogOidEmpty(){
return AssignmentViewType.ROLE_CATALOG_VIEW.equals(AssignmentViewType.getViewTypeFromSession(pageBase)) &&
(catalogOidModel == null || StringUtils.isEmpty(catalogOidModel.getObject()));
}
}