-
Notifications
You must be signed in to change notification settings - Fork 188
/
MultiCompositedButtonPanel.java
140 lines (113 loc) · 6.25 KB
/
MultiCompositedButtonPanel.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.evolveum.midpoint.web.component;
import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.component.AjaxCompositedIconButton;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIcon;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.component.icon.IconCssStyle;
import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import com.evolveum.midpoint.xml.ns._public.common.common_3.DisplayType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.IconType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.Model;
import java.util.List;
public abstract class MultiCompositedButtonPanel extends BasePanel<List<MultiFunctinalButtonDto>> {
private static final String ID_BUTTON_PANEL = "additionalButton";
private static final String DEFAULT_BUTTON_STYLE = "btn btn-default btn-sm buttons-panel-marging";
private List<MultiFunctinalButtonDto> buttonDtos;
public MultiCompositedButtonPanel(String id, List<MultiFunctinalButtonDto> buttonDtos){
super(id);
this.buttonDtos = buttonDtos;
}
@Override
protected void onInitialize(){
super.onInitialize();
initLayout();
}
private void initLayout(){
DisplayType defaultObjectButtonDisplayType = fixDisplayTypeIfNeeded(getDefaultObjectButtonDisplayType());
DisplayType mainButtonDisplayType = fixDisplayTypeIfNeeded(getMainButtonDisplayType());
RepeatingView buttonsPanel = new RepeatingView(ID_BUTTON_PANEL);
add(buttonsPanel);
if (additionalButtonsExist()){
buttonDtos.forEach(additionalButtonObject -> {
DisplayType additionalButtonDisplayType = fixDisplayTypeIfNeeded(additionalButtonObject.getAdditionalButtonDisplayType()); //getAdditionalButtonDisplayType(additionalButtonObject)
additionalButtonObject.setAdditionalButtonDisplayType(additionalButtonDisplayType);
AjaxCompositedIconButton additionalButton = new AjaxCompositedIconButton(buttonsPanel.newChildId(), getCompositedIcon(additionalButtonObject),
Model.of(WebComponentUtil.getDisplayTypeTitle(additionalButtonDisplayType))) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
buttonClickPerformed(target, additionalButtonObject.getAssignmentObjectRelation(), additionalButtonObject.getCollectionView());
}
};
additionalButton.add(AttributeAppender.append("class", DEFAULT_BUTTON_STYLE));
buttonsPanel.add(additionalButton);
});
}
//we set main button icon class if no other is defined
if (StringUtils.isEmpty(defaultObjectButtonDisplayType.getIcon().getCssClass())) {
defaultObjectButtonDisplayType.getIcon().setCssClass(mainButtonDisplayType.getIcon().getCssClass());
}
AjaxCompositedIconButton defaultButton = new AjaxCompositedIconButton(buttonsPanel.newChildId(),
getAdditionalIconBuilder(defaultObjectButtonDisplayType).build(),
Model.of(WebComponentUtil.getDisplayTypeTitle(defaultObjectButtonDisplayType))) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
buttonClickPerformed(target, null, null);
}
};
defaultButton.add(AttributeAppender.append("class", DEFAULT_BUTTON_STYLE));
defaultButton.add(new VisibleBehaviour(this::isDefaultButtonVisible));
buttonsPanel.add(defaultButton);
}
private CompositedIcon getCompositedIcon(MultiFunctinalButtonDto additionalButtonObject) {
CompositedIcon icon = additionalButtonObject.getCompositedIcon();
if (icon != null) {
return icon;
}
return getAdditionalIconBuilder(additionalButtonObject.getAdditionalButtonDisplayType()).build();
}
protected abstract DisplayType getMainButtonDisplayType();
/**
* this method should return the display properties for the last button on the dropdown panel with additional buttons.
* The last button is supposed to produce a default action (an action with no additional objects to process)
* @return
*/
protected abstract DisplayType getDefaultObjectButtonDisplayType();
protected CompositedIconBuilder getAdditionalIconBuilder(DisplayType additionalButtonDisplayType){
CompositedIconBuilder builder = new CompositedIconBuilder();
builder.setBasicIcon(WebComponentUtil.getIconCssClass(additionalButtonDisplayType), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(WebComponentUtil.getIconColor(additionalButtonDisplayType))
.appendLayerIcon(WebComponentUtil.createIconType(GuiStyleConstants.CLASS_PLUS_CIRCLE, "green"), IconCssStyle.BOTTOM_RIGHT_STYLE);
return builder;
}
private DisplayType fixDisplayTypeIfNeeded(DisplayType displayType){
if (displayType == null){
displayType = new DisplayType();
}
if (displayType.getIcon() == null){
displayType.setIcon(new IconType());
}
if (displayType.getIcon().getCssClass() == null){
displayType.getIcon().setCssClass("");
}
return displayType;
}
protected void buttonClickPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSepc, CompiledObjectCollectionView collectionViews){
}
protected boolean additionalButtonsExist() {
return CollectionUtils.isNotEmpty(buttonDtos);
}
protected boolean isDefaultButtonVisible(){
return true;
}
}