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
package com.vci.client.logon.base;
 
import java.awt.Component;
import java.util.Iterator;
import java.util.Map;
 
import com.vci.client.ui.swing.components.CloseEvent;
import com.vci.client.ui.swing.components.CloseListenerAdapter;
import com.vci.client.ui.swing.components.JClosableTabbedPane;
import com.vci.client.ui.swing.components.TabTitleComponent;
import com.vci.client.uif.engine.client.IRegionPanel;
import com.vci.client.uif.engine.client.UILayoutPanel;
import com.vci.client.uif.engine.client.TreeTable.TreeTablePanel;
import com.vci.client.uif.engine.client.mainDataArea.MainDataFormPanel;
import com.vci.client.uif.engine.client.tableArea.TablePanel;
import com.vci.client.uif.engine.client.tree.TreePanel;
import com.vci.mw.ClientContextVariable;
 
public class TabPanelManage {
 
    private static TabPanelManage instance = null;
    private JClosableTabbedPane mainTabPanel = null;
    
    
    public static synchronized TabPanelManage getInstance() {
        if (instance == null) {
            instance = new TabPanelManage();
        }
        return instance;
    }
    
    public void setTabPanel(JClosableTabbedPane tabPanel)
    {
        mainTabPanel = tabPanel;
    }
    
    /**
     * 增加新的tabPanel
     * @param component
     * @param title
     */
    public void addTabPanel(Component component, String title) {
        this.addTabPanel(component, title, false);
    }
 
    /**
     * 增加新的tabPanel
     * @param component 组件对象
     * @param title 标题
     * @param override 是否覆盖(标题名称相同才覆盖)
     */
    public void addTabPanel(Component component, String title, boolean override) {
        boolean titleIsExist = isTabPanelExist(title);
        if(titleIsExist && override){
            int index = getComponentIndex(title);
            mainTabPanel.setComponentAt(index, component);
        } else {
            mainTabPanel.addTab(title, component, true);
            mainTabPanel.setSelectedComponent(component);
            mainTabPanel.updateUI();
            // 注册关闭前、后事件处理
            mainTabPanel.addCloseListener(new CloseListenerAdapter() {
                @Override
                public void afterClosed(CloseEvent e) {
                    releaseUILayoutPanel(e);
                }
            });
        }
    }
    /**
     * 在关闭UILayoutPanel时,释放TablePanel产生的线程(池)
     */
    private void releaseUILayoutPanel(CloseEvent e){
        if(e.getSource() instanceof JClosableTabbedPane){
            Component compt = e.getTabComponent();
            if(compt == null) return;
            if(!(compt instanceof TabTitleComponent)) return;
            
            TabTitleComponent tabTitleCompt = (TabTitleComponent) compt;
            Component tabCompt = tabTitleCompt.getTabComponent();
            if(tabCompt == null) return;
            if(!(tabCompt instanceof UILayoutPanel)) return;
            
            UILayoutPanel uipl = (UILayoutPanel)tabCompt;
            releaseUILayoutPanel(uipl);
        }
    }
    
    private void releaseUILayoutPanel(UILayoutPanel uipl){
        Map<String, IRegionPanel> regionPanelMap = uipl.getRegionPanelMap();
        Iterator<String> its = regionPanelMap.keySet().iterator();
        while(its.hasNext()){
            String key = its.next();
            IRegionPanel regionPanel = regionPanelMap.get(key);
            if(regionPanel == null) continue;  
            if(regionPanel instanceof TreePanel){
                repleaseTreePanel((TreePanel)regionPanel);
            } else if(regionPanel instanceof MainDataFormPanel){
                repleaseMainDataFormPanel((MainDataFormPanel)regionPanel);
            } else if(regionPanel instanceof TablePanel){
                repleaseTablePanel((TablePanel)regionPanel);
            } else if(regionPanel instanceof TreeTablePanel){
                repleaseTreeTablePanel((TreeTablePanel)regionPanel);
            }
        }
    }
 
    private void repleaseTreePanel(TreePanel treePanel){
        //TODO release in here
    }
    private void repleaseMainDataFormPanel(MainDataFormPanel treePanel){
        //TODO release in here
    }   
    private void repleaseTablePanel(TablePanel tablePanel){
        if(tablePanel != null && tablePanel.getDataTablePanel() != null){
            tablePanel.getDataTablePanel().shutdownThreadPool();
        }
    }
    private void repleaseTreeTablePanel(TreeTablePanel treeTablePanel){
        //TODO release in here
    }
    
    /**
     * 根据名称判断title是否存储,如果存在则选中并返回true
     * @param title
     * @return
     */
    public boolean isTabPanelExist(String title) {
        int count = mainTabPanel.getTabCount();
        for (int i = 0; i < count; i++) {
            if (mainTabPanel.getTitleAt(i).equals(title)) {
                mainTabPanel.setSelectedIndex(i);
                return true;
            }
        }
        return false;
    }
    
    /**
     * 获取指定标题组件的索引
     * @param title
     * @return
     */
    public int getComponentIndex(String title){
        int index = -1;
        int count = mainTabPanel.getTabCount();
        for (int i = 0; i < count; i++) {
            if (mainTabPanel.getTitleAt(i).equals(title)) {
                index = i;
                break;
            }
        }
        return index;
    }
    /**
     * 返回主体框架顶层的TabbedPane
     * @return
     */
    public JClosableTabbedPane getTabPanel(){
        return mainTabPanel;
    }
}