wangting
2024-12-26 fa261e8c1220b31af54e8167e4de9c3320b1af27
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
package com.vci.client.uif.engine.client;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
 
import com.vci.client.uif.engine.common.IDataNode;
 
public class UILayoutModel implements IUILayoutModel{
    
    private Map<Integer, List<IDataModel>> layoutAreaModel = new HashMap<Integer, List<IDataModel>>();
    
    private Map<IDataModel, Integer> modelAreaMap = new HashMap<IDataModel,Integer>();
 
    private List<IDataModel> layoutModes = new ArrayList<IDataModel>();
    
    /**
     * 变更区域影响的重载区域
     */
    private Map<Integer, List<Integer>> reloadEffectAreaMap = new HashMap<Integer, List<Integer>>();
    
    public UILayoutModel() {
        
    }
    
    public void addLayoutModes(int area, IDataModel cDataModel) {
        List<IDataModel> areaModels = null;
        if (layoutAreaModel.get(Integer.valueOf(area)) == null) {
            areaModels = new ArrayList<IDataModel>();
            layoutAreaModel.put(Integer.valueOf(area), areaModels);
        } else {
            areaModels = layoutAreaModel.get(Integer.valueOf(area));
        }
        areaModels.add(cDataModel);
        this.layoutModes.add(cDataModel);
        this.modelAreaMap.put(cDataModel, area);
    }
    
    /**
     * 设置当期区域影响的重载区域
     * @param fromArea, 当前区域
     * @param effectArea,需要重载的区域
     */
    public void setReloadEffectArea(int fromArea, int effectArea) {
        List<Integer> effectAreaList = null;
        if (reloadEffectAreaMap.get(fromArea) == null) {
            effectAreaList = new ArrayList<Integer>();
        } else {
            effectAreaList = reloadEffectAreaMap.get(fromArea);
        }
        effectAreaList.add(effectArea);
        this.reloadEffectAreaMap.put(fromArea, effectAreaList);
    }
    
    /**
     * 情况影响刷新区域的配置
     */
    public void cleanReloadEffectArea() {
        reloadEffectAreaMap.clear();
    }
    
    public List<IDataModel> getLayoutAreaModes(int area) {
        return layoutAreaModel.get(Integer.valueOf(area));
    }
    
    public void removeAreaModels(int area) {
        List<IDataModel> cAreaModel = layoutAreaModel.get(Integer.valueOf(area));
        if (cAreaModel != null) {
            for (IDataModel dataModel : cAreaModel) {
                layoutModes.remove(dataModel);
            }
        }
        layoutAreaModel.remove(Integer.valueOf(area));
    }
    
    public List<IDataModel> getLayoutModes() {
        return this.layoutModes;
    }
 
    /**
     * 记录各个区域 最后一次的sourceData
     */
    private Map<Integer, IDataNode> areaSourceDataMap = new HashMap<Integer, IDataNode>();
    
    /**
     * 各区域之间刷新事件触发入口
     * 建议平台能够灵活定义经典主界面中各区域之间的触发关联关系(即无需内置目前这种"左导航"触发"右上"与"右下";"右上"触发"右下"机制,而是可灵活定制各区域之间的事件影响触发关系,且一个复杂界面也需要目前这种上下文UI的嵌套) Add By ZhongGY 2015-02-12
     */
    @Override
    public void notify(IDataModel dataModel) {
        if(modelAreaMap.get(dataModel) == null) {
            return;
        }
        int cArea = modelAreaMap.get(dataModel).intValue();
        if (cArea == 1) {
            //导航树的变化通知到右上区域与右下区域(建议后面有个事件传播定义机制,不要这样约定死了)
            notifyArea(dataModel, 2);
            //notifyArea(dataModel, 3);
        } else if (cArea == 2) {
            //右上区域的变化通知到右下区域(建议后面有个事件传播定义机制,不要这样约定死了)
            notifyArea(dataModel, 3);
        } else {
            // 右下操作区不向其它区域发送通知,但需要向同一个页签里的其它UI组件发送刷新通知
            IDataNode sourceData = getDataModelClickObject(dataModel);
            notifyAreaInnerModel(dataModel, sourceData);
        }
    }
    
    /**
     * 返回IDataMode 点选的数据对象(作为其它区域组件的SourceData)
     * @param dataModel 
     * @return
     */
    protected IDataNode getDataModelClickObject(IDataModel dataModel){
        IDataNode sourceData = null;
        Object clickObject = dataModel.getClickObject();
        if(clickObject != null && clickObject instanceof IDataNode){
            sourceData = (IDataNode)clickObject;
        }
        return sourceData;
    }
    
    /**
     * @Title        :UI框架统一刷新处理
     * @Description    :
     * @param dataModel
     * @param area
     */
    private void notifyArea(IDataModel dataModel, int area) {
        IDataNode sourceData = getDataModelClickObject(dataModel);
        // 存储各个区域真实的sourceData
        areaSourceDataMap.put(area, sourceData);    //更新各区域的Source
        notifyAreaInnerModel(dataModel, sourceData);
        List<IDataModel> areaList = layoutAreaModel.get(area);
        if (areaList == null) {
            return;
        }
        Iterator<IDataModel> itor = areaList.iterator();
        while (itor.hasNext()) {
            // 设置级联控制区域regionPanel的sourceData对象
            IDataModel subDataModel = itor.next();
            if(subDataModel.getRegionPanel() != null){
                //subDataModel.getRegionPanel().setSourceData(sourceData);        //Modify By ZhongGY 2015-07-02;为了优化UI加载与刷新机制,将数据尽量放到Model中(model中的getRegionPanel()可能为空)
                subDataModel.setSourceData(sourceData);
            }
            //subDataModel.refresh(dataModel);    //优化刷新处理 by zhonggy 2015-07
            subDataModel.refreshUI(dataModel);    //优化刷新处理 by zhonggy 2015-07
        }
    }
 
    
    private void notifyAreaInnerModel(IDataModel dataModel, IDataNode sourceData){
        List<IDataModel> slaveDataModels = areaInnerNotifyModelMap.get(dataModel);
        if(slaveDataModels != null){
            for(IDataModel slaveDataModel : slaveDataModels){ 
                if(slaveDataModel.getRegionPanel() != null){
                    //slaveDataModel.getRegionPanel().setSourceData(sourceData);
                    slaveDataModel.setSourceData(sourceData);
                }
                //slaveDataModel.refresh(dataModel);        //优化刷新处理 by zhonggy 2015-07
                slaveDataModel.refreshUI(dataModel);        //优化刷新处理 by zhonggy 2015-07
            }
        }
    }
    
    
    public Map<Integer, IDataNode> getAreaSourceDataMap() {
        return areaSourceDataMap;
    }
 
    public void setAreaSourceDataMap(Map<Integer, IDataNode> areaSourceDataMap) {
        this.areaSourceDataMap = areaSourceDataMap;
    }
    
    private Map<IDataModel, List<IDataModel>> areaInnerNotifyModelMap = new HashMap<IDataModel,  List<IDataModel>>();
    public void addAreaInnerNotifyModel(IDataModel master, IDataModel slaveDataModel){
        List<IDataModel> models = areaInnerNotifyModelMap.get(master);
        if(models == null){
            models = new LinkedList<IDataModel>();
        }
        models.add(slaveDataModel);
        areaInnerNotifyModelMap.put(master, models);
    }
    
    /**
     * 通知影响区域进行刷新
     * @param dataModel
     */
    public void notifyRefresh(IDataModel dataModel) {
        if(modelAreaMap.get(dataModel) == null) {
            return;
        }
        int cArea = modelAreaMap.get(dataModel).intValue();
        List<Integer> creloadArea = reloadEffectAreaMap.get(cArea);
        if (creloadArea == null || creloadArea.size() == 0) {
            return;
        }
        for (int area : creloadArea) {
            List<IDataModel> areaList = layoutAreaModel.get(area);
            if (areaList == null) {
                continue;
            }
            Iterator<IDataModel> itor = areaList.iterator();
            while (itor.hasNext()) {
                IDataModel subDataModel = itor.next();
                subDataModel.setNeedRefreshUI(true);
                subDataModel.refreshUI();
            }
        }
    }
}