zm
2020-05-18 a18bfacbf56b401f6e0fdae8710fbca4df8cff77
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package cn.autoform.web.formula.info.impl.cpn;
 
import cn.autoform.db.entity.form.FormCpnInfo;
import cn.autoform.web.formula.info.Form;
import cn.autoform.web.formula.info.FormCpn;
import cn.autoform.web.formula.info.FormCpnListener;
import cn.autoform.web.formula.info.FormulaInfo;
import cn.autoform.web.formula.prop.Attribute;
import cn.autoform.web.formula.prop.CpnMsg;
import cn.autoform.web.formula.prop.MsgType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
 
import java.util.*;
 
/**
 * 普通控件抽象类
 * @author WangYX
 *
 */
@EqualsAndHashCode(callSuper=false, of={"fieldId", "index"})
public abstract class AbstractBaseFormCpn extends HashMap<Object, Object> implements FormCpn{
 
    /**
     * 
     */
    private static final long serialVersionUID = -1159764957350079218L;
 
    /**
     * 映射key
     */
    protected static Map<Object, Object> MAPPING_KEY = new HashMap<>();
    
    static{
        MAPPING_KEY.put("值", Attribute.value);
    }
    
    /* 表单控件监听 */
    protected FormCpnListener formCpnListener;
    
    /* 触发事件 */
    @Getter
    @Setter
    protected List<FormulaInfo> formulas;
    
    /* 控件别名 */
    @Getter
    @Setter
    protected String fieldId;
    
    /* 父控件 */
    @Setter
    protected FormCpn parentFormCpn;
    
    /* 在子表单中的下标 */
    @Getter
    @Setter
    protected Integer index;
    
    public AbstractBaseFormCpn(/*String fieldId*/) {
        /*this.fieldId = fieldId;*/
        this.formCpnListener = new BaseFormCpnListener();
    }
    
    public void init(FormCpnInfo formCpnInfo){
        this.fieldId = formCpnInfo.getTagAttribute().getAlias();
    }
    
    @Override
    public Object get(Object key) {
        Object mappIngKey = MAPPING_KEY.get(key);
        Object val = super.get(mappIngKey == null ? key : mappIngKey);
        return val == null ? "" : val;
    }
    
    
    @Override
    public Object put(Object key, Object value) {
        if(StringUtils.isBlank(Objects.toString(key)))
            return null;
        if(Objects.equals(FORMULA_KEY, key))
            return setFormula((FormulaInfo) value);
        boolean isFormat = false;
        // 控件属性 可见,可编辑,值
        if(!isFormat){
            for(Attribute attr : Attribute.values()){
                if(Objects.equals(attr.toString(), key.toString())){
                    key = Attribute.valueOf(Objects.toString(key));
                    isFormat = true;
                    break;
                }
            }
        }
        // 表单提示消息
        if(!isFormat){
            for(MsgType msg : MsgType.values()){
                if(Objects.equals(msg.toString(), key.toString())){
                    ((Form)get(FORM_KEY)).setMsg(MsgType.valueOf(Objects.toString(key)), Objects.toString(value, ""), this);
                    return value;
                }
            }
        }
        // 控件错误消息
        if(!isFormat){
            for(CpnMsg msg : CpnMsg.values()){
                if(Objects.equals(msg.toString(), key.toString())){
                    key = CpnMsg.valueOf(Objects.toString(key));
                    Object values = get(key);
                    if(values == null)
                        value = new ArrayList<>(Arrays.asList(value.toString()));
                    else
                        value = ((List)values).add(value);
                    isFormat = true;
                    break;
                }
            }
        }
        
        try{
            return super.put(key, value);
        }finally {
            if((key instanceof Attribute) && ((Attribute)key) == Attribute.value)
                formCpnListener.change(this);
        }
    }
 
    /*
     * 添加事件
     */
    public Object setFormula(FormulaInfo value) {
        if(this.formulas == null)
            this.formulas = new ArrayList<>();
        this.formulas.add(value);
        return value;
    }
 
    @Override
    public void setFormCpnListener(FormCpnListener formCpnListener) {
        this.formCpnListener = formCpnListener;
    }
 
    @Override
    public FormCpnListener getFormCpnListener() {
        return this.formCpnListener;
    }
 
    @Override
    public FormCpn getParentCpn() {
        return this.parentFormCpn;
    }
 
    @Override
    public FormCpn clone(){
//        return FormCpnFactory.clone(this);
        return (FormCpn) super.clone();
    }
 
    @Override
    public Object getValue() {
        return get(Attribute.value);
    }
    
}