/*
* Copyright (c) 2010-2017 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.data.column;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.web.component.data.MenuMultiButtonPanel;
import com.evolveum.midpoint.web.component.data.MultiButtonPanel;
import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel;
import com.evolveum.midpoint.web.component.dialog.Popupable;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenu;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import org.apache.wicket.Component;
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.grid.ICellPopulator;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.StringResourceModel;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* Created by honchar.
*/
public class InlineMenuButtonColumn<T extends Serializable> extends MultiButtonColumn<T>{
protected List<InlineMenuItem> menuItems;
private PageBase pageBase;
public InlineMenuButtonColumn(List<InlineMenuItem> menuItems, int buttonsNumber, PageBase pageBase){
super(null, menuItems.size() < 2 ? menuItems.size() : buttonsNumber);
this.menuItems = menuItems;
this.pageBase = pageBase;
}
@Override
public void populateItem(final Item<ICellPopulator<T>> cellItem, String componentId,
final IModel<T> rowModel) {
this.rowModel = rowModel;
cellItem.add(getPanel(componentId, rowModel, this.numberOfButtons, this.menuItems));
}
@Override
public Component getHeader(String componentId) {
return getPanel(componentId, null, getHeaderNumberOfButtons(), getHeaderMenuItems());
}
private Component getPanel(String componentId, IModel<T> rowModel,
int numberOfButtons, List<InlineMenuItem> menuItems){
panel = new MenuMultiButtonPanel<T>(componentId, numberOfButtons, rowModel, createMenuModel(rowModel, menuItems)) {
@Override
public String getCaption(int id) {
return "";
}
@Override
public String getButtonTitle(int id) {
return InlineMenuButtonColumn.this.getButtonTitle(id, menuItems);
}
@Override
protected String getButtonCssClass(int id) {
return InlineMenuButtonColumn.this.getButtonCssClass(id, menuItems);
}
@Override
protected int getButtonId(int id){
return id;
}
@Override
public boolean isButtonVisible(int id, IModel<T> model) {
return InlineMenuButtonColumn.this.isButtonVisible(id, model);
}
@Override
public String getButtonSizeCssClass(int id) {
return InlineMenuButtonColumn.this.getButtonSizeCssClass(id);
}
@Override
public String getButtonColorCssClass(int id) {
return InlineMenuButtonColumn.this.getButtonColorCssClass(id, menuItems);
}
@Override
public void clickPerformed(int id, AjaxRequestTarget target, IModel<T> model) {
setRowModelToAction(rowModel, menuItems);
InlineMenuButtonColumn.this.menuItemClickPerformed(id, target, model, menuItems);
}
};
return panel;
}
private void setRowModelToAction(IModel<T> rowModel, List<InlineMenuItem> menuItems){
for (InlineMenuItem menuItem : menuItems){
if (menuItem.getAction() != null) {
((ColumnMenuAction) menuItem.getAction()).setRowModel(rowModel);
}
}
}
private IModel<List<InlineMenuItem>> createMenuModel(final IModel<T> rowModel, List<InlineMenuItem> menuItems) {
return new LoadableModel<List<InlineMenuItem>>(false) {
@Override
public List<InlineMenuItem> load() {
if (rowModel == null){
return menuItems;
}
if (rowModel.getObject() == null ||
!(rowModel.getObject() instanceof InlineMenuable)) {
return new ArrayList<InlineMenuItem>();
}
for (InlineMenuItem item : ((InlineMenuable)rowModel.getObject()).getMenuItems()) {
if (!(item.getAction() instanceof ColumnMenuAction)) {
continue;
}
ColumnMenuAction action = (ColumnMenuAction) item.getAction();
action.setRowModel(rowModel);
}
return ((InlineMenuable)rowModel.getObject()).getMenuItems();
}
};
}
private void menuItemClickPerformed(int id, AjaxRequestTarget target, IModel<T> model, List<InlineMenuItem> menuItems) {
for (InlineMenuItem menuItem : menuItems) {
if (menuItem.getId() == id) {
if (menuItem.getAction() != null) {
if (menuItem.isShowConfirmationDialog() && menuItem.getConfirmationMessageModel() != null) {
showConfirmationPopup(menuItem, target);
} else {
menuItem.getAction().onClick(target);
}
}
}
}
}
private void showConfirmationPopup(InlineMenuItem menuItem, AjaxRequestTarget target) {
ConfirmationPanel dialog = new ConfirmationPanel(pageBase.getMainPopupBodyId(),
menuItem.getConfirmationMessageModel()) {
private static final long serialVersionUID = 1L;
@Override
public StringResourceModel getTitle() {
return pageBase.createStringResource("pageUsers.message.confirmActionPopupTitle");
}
@Override
public void yesPerformed(AjaxRequestTarget target) {
ModalWindow modalWindow = findParent(ModalWindow.class);
if (modalWindow != null) {
modalWindow.close(target);
menuItem.getAction().onClick(target);
}
}
};
pageBase.showMainPopup(dialog, target);
}
@Override
public boolean isButtonVisible(int id, IModel<T> model) {
if (model == null || model.getObject() == null){
return true;
}
if (id == InlineMenuItem.FOCUS_LIST_INLINE_MENU_ITEM_ID.ENABLE.getMenuItemId() &&
model.getObject() instanceof SelectableBean &&
((SelectableBean) model.getObject()).getValue() instanceof FocusType){
FocusType focus = (FocusType)((SelectableBean) model.getObject()).getValue();
if (focus.getActivation() == null){
return false;
}
return ActivationStatusType.DISABLED.equals(focus.getActivation().getEffectiveStatus());
} else if (id == InlineMenuItem.FOCUS_LIST_INLINE_MENU_ITEM_ID.DISABLE.getMenuItemId() &&
model.getObject() instanceof SelectableBean &&
((SelectableBean) model.getObject()).getValue() instanceof FocusType){
FocusType focus = (FocusType)((SelectableBean) model.getObject()).getValue();
if (focus.getActivation() == null){
return true;
}
return !ActivationStatusType.DISABLED.equals(focus.getActivation().getEffectiveStatus());
}
return true;
}
public String getButtonColorCssClass(int id, List<InlineMenuItem> menuItems) {
for (InlineMenuItem menuItem : menuItems){
if (menuItem.getId() == id){
return menuItem.getButtonColorCssClass();
}
}
return DoubleButtonColumn.BUTTON_COLOR_CLASS.DEFAULT.toString();
}
@Override
public String getButtonSizeCssClass(int id) {
return DoubleButtonColumn.BUTTON_SIZE_CLASS.EXTRA_SMALL.toString();
}
protected String getButtonCssClass(int id, List<InlineMenuItem> menuItems) {
StringBuilder sb = new StringBuilder();
sb.append(DoubleButtonColumn.BUTTON_BASE_CLASS).append(" ");
sb.append(getButtonColorCssClass(id, menuItems)).append(" ");
sb.append(getButtonSizeCssClass(id)).append(" ");
for (InlineMenuItem menuItem : menuItems){
if (menuItem.getId() == id){
sb.append(menuItem.getButtonIconCssClass()).append(" ");
}
}
return sb.toString();
}
public String getButtonTitle(int id, List<InlineMenuItem> menuItems) {
for (InlineMenuItem menuItem : menuItems){
if (menuItem.getId() == id){
return menuItem.getLabel() != null && menuItem.getLabel().getObject() != null ?
menuItem.getLabel().getObject() : "";
}
}
return "";
}
protected int getHeaderNumberOfButtons(){
return this.numberOfButtons;
}
protected List<InlineMenuItem> getHeaderMenuItems(){
return menuItems;
}
}