6、自定义tab

本章节提供的自定义tab 分为两类

  • tab上带删除按钮和添加按钮,可删除tab和添加tab
  • tab不可删除和添加

6.1 不可删除tab

  1. package com.view.control.tab;
  2.  
  3. import org.eclipse.swt.SWT;
  4. import org.eclipse.swt.custom.CLabel;
  5. import org.eclipse.swt.layout.GridData;
  6. import org.eclipse.swt.layout.GridLayout;
  7. import org.eclipse.swt.widgets.Composite;
  8. import org.eclipse.swt.widgets.Event;
  9. import org.eclipse.swt.widgets.Listener;
  10.  
  11. import com.util.StringUtil;
  12. import com.view.control.DetectorNode;
  13. import com.view.control.TreeNodeData;
  14. import com.view.core.valid.dto.Detector;
  15. import com.view.swt.SWTCommonUtil;
  16. import com.view.swt.SWTResourceManager;
  17. import com.view.swt.SWTUtil;
  18. import com.view.swt.SWTUtil.BorderLine;
  19.  
  20. /**
  21. * <p>tabNode结点</p>
  22. * @version V1.0
  23. */
  24. public class TabNode extends DetectorNode {
  25. /*** 序列化ID*/
  26. private static final long serialVersionUID = 1L;
  27. /*** 结点对应的数据 *****/
  28. protected TreeNodeData nodeData;
  29. /****所属tab控件***/
  30. protected Tab tab;
  31. protected Composite parent;
  32. protected Composite nodeComposite;
  33. /****需要更换的内容区域****/
  34. protected Composite contentComposite;
  35.  
  36. public TabNode(Composite parent, TreeNodeData nodeData,Tab tab,Composite contentComposite) {
  37. this.parent = parent;
  38. this.nodeData = nodeData;
  39. this.tab = tab;
  40. this.contentComposite = contentComposite;
  41. }
  42.  
  43. public void paint(){
  44. nodeComposite = new Composite(parent,SWT.NONE);
  45. nodeComposite.setBackground(SWTResourceManager.getWhiteColor());
  46. GridData gd_nodeComposite = new GridData(SWT.FILL,SWT.FILL,false,true,1,1);
  47. nodeComposite.setLayoutData(gd_nodeComposite);
  48. GridLayout gl_nodeComposite = new GridLayout(1,true);
  49. gl_nodeComposite.horizontalSpacing = 0;
  50. gl_nodeComposite.verticalSpacing = 0;
  51. gl_nodeComposite.marginWidth = 10;
  52. gl_nodeComposite.marginHeight = 1;
  53. nodeComposite.setLayout(gl_nodeComposite);
  54. SWTUtil.paintBorder(nodeComposite, SWTResourceManager.getLightGreyBorderColor(), BorderLine.TOP,BorderLine.LEFT,BorderLine.BOTTOM);
  55. nodeComposite.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
  56.  
  57. CLabel tab_content_label= generateNodeContentComposite();
  58. tab_content_label.setData("data", nodeData);
  59. this.menuCode = nodeData.getMenuCode();
  60.  
  61. nodeComposite.addListener(SWT.MouseDown, new Listener(){
  62. @Override
  63. public void handleEvent(Event event) {
  64. Event newEvent = new Event();
  65. newEvent.button = event.button;
  66. newEvent.widget = tab_content_label;
  67. tab_content_label.notifyListeners(SWT.MouseDown, newEvent);
  68. }
  69. });
  70. nodeComposite.setData("nodeLabel", tab_content_label);
  71. nodeComposite.layout(true);
  72. }
  73.  
  74. /**
  75. * 生成tab区域内的内容
  76. * @return
  77. */
  78. protected CLabel generateNodeContentComposite(){
  79. CLabel tab_content_label = new CLabel(nodeComposite,SWT.NONE);
  80. tab_content_label.setBackground(SWTResourceManager.getWhiteColor());
  81. GridData gd_tab_content_label = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);
  82. tab_content_label.setLayoutData(gd_tab_content_label);
  83. tab_content_label.setForeground(SWTResourceManager.getTextColor());
  84. tab_content_label.setText(nodeData.getLabel());
  85. tab_content_label.setAlignment(SWT.CENTER);
  86. tab_content_label.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
  87. tab_content_label.addListener(SWT.MouseDown, new Listener(){
  88. @Override
  89. public void handleEvent(Event event) {
  90. if(event.button == 1){
  91. changeTabContentPage();
  92. }
  93. }
  94. });
  95. return tab_content_label;
  96. }
  97.  
  98. /**
  99. * 更换内容区域
  100. * @param tabContentPage
  101. */
  102. private void changeTabContentPage(){
  103. if(StringUtil.isNotNullAndEmpty(this.nodeData.getActionPageName())){
  104. TabNodeParam tabNodeParam = new TabNodeParam(this.nodeData.getNodeData(),this);
  105. SWTCommonUtil.generatorPage(contentComposite, this.nodeData.getActionPageName(), tabNodeParam);
  106. }
  107. }
  108.  
  109. @Override
  110. public void updateErrorStatusImg(Detector detector) {
  111.  
  112. }
  113.  
  114. /**
  115. * 获取结点nodeComposite
  116. * @return
  117. */
  118. public Composite getNodeComposite() {
  119. return nodeComposite;
  120. }
  121.  
  122. public Tab getTab() {
  123. return tab;
  124. }
  125.  
  126. /**
  127. * 获取nodeLabel
  128. * @return
  129. */
  130. public CLabel getNodeLabel(){
  131. if(null != nodeComposite && !nodeComposite.isDisposed()){
  132. return (CLabel)nodeComposite.getData("nodeLabel");
  133. }
  134. return null;
  135. }
  136.  
  137. /***
  138. * 触发结点事件*/
  139. public void notifyNodeEvent(){
  140. Event event = new Event();
  141. event.button = 1;
  142. event.widget = nodeComposite;
  143. nodeComposite.notifyListeners(SWT.MouseDown, event);
  144. }
  145.  
  146. public TreeNodeData getNodeData() {
  147. return nodeData;
  148. }
  149.  
  150. public Composite getParent() {
  151. return parent;
  152. }
  153. }

TabNode.java 为tab结点。

  1. package com.view.control.tab;
  2.  
  3. import com.view.core.param.Param;
  4.  
  5. /**
  6. * <p>tab结点包含的特有参数</p>
  7. * @version V1.0
  8. */
  9. public class TabNodeParam extends Param {
  10.  
  11. /*** 序列化ID*/
  12. private static final long serialVersionUID = 1L;
  13. /***tab结点上本来绑定的参数***/
  14. private Param param;
  15. /***tabNode结点****/
  16. private TabNode tabNode;
  17.  
  18. public TabNodeParam(Param param,TabNode tabNode){
  19. this.param = param;
  20. this.tabNode = tabNode;
  21. }
  22.  
  23. public Param getParam() {
  24. return param;
  25. }
  26.  
  27. public void setParam(Param param) {
  28. this.param = param;
  29. }
  30.  
  31. public TabNode getTabNode() {
  32. return tabNode;
  33. }
  34.  
  35. public void setTabNode(TabNode tabNode) {
  36. this.tabNode = tabNode;
  37. }
  38. }

TabNodeParam.java 为TabNode中额外绑定的参数。

  1. package com.view.control.tab;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.LinkedList;
  7. import java.util.List;
  8.  
  9. import org.apache.commons.collections.map.MultiValueMap;
  10. import org.eclipse.swt.SWT;
  11. import org.eclipse.swt.custom.CLabel;
  12. import org.eclipse.swt.custom.ScrolledComposite;
  13. import org.eclipse.swt.events.PaintListener;
  14. import org.eclipse.swt.layout.GridData;
  15. import org.eclipse.swt.layout.GridLayout;
  16. import org.eclipse.swt.widgets.Composite;
  17. import org.eclipse.swt.widgets.Event;
  18. import org.eclipse.swt.widgets.Listener;
  19. import org.eclipse.swt.widgets.Shell;
  20.  
  21. import com.util.CollectionUtil;
  22. import com.view.control.TreeNodeData;
  23. import com.view.swt.SWTResourceManager;
  24. import com.view.swt.SWTUtil;
  25. import com.view.swt.SWTUtil.BorderLine;
  26.  
  27. /**
  28. * <p>tab控件(默认打开第一个tab页)</p>
  29. * @version V1.0
  30. */
  31. public class Tab {
  32. /***采用gridLayout布局**/
  33. protected Composite parent;
  34. /***所有的根孩子节点数据*******/
  35. protected List<TreeNodeData> allNodeDataList = new ArrayList<TreeNodeData>();
  36. protected List<TabNode> tabNodeList = new LinkedList<TabNode>();
  37. /***tab高度***/
  38. protected int tabHeight = 25;
  39. protected Composite tabComposite;
  40. /***选中的tab页***/
  41. protected TabNode chooseTab;
  42. /***适用于所有tab结点监听器*****/
  43. protected MultiValueMap nodeListener = MultiValueMap.decorate(new HashMap<Integer,Listener>());
  44. protected Composite content_composite;
  45. protected boolean hasEmpty = true;
  46. /***tab内容区域是否出现滚动条***/
  47. protected boolean hasScroll = true;
  48.  
  49. public Tab(Composite parent,List<TreeNodeData> allNodeDataList){
  50. this.parent = parent;
  51. this.allNodeDataList = allNodeDataList;
  52. }
  53.  
  54. public void paint(){
  55. tabComposite = new Composite(parent,SWT.NONE);
  56. GridData gd_top_tab_composite = new GridData(SWT.FILL,SWT.FILL,true,false,1,1);
  57. gd_top_tab_composite.heightHint = this.tabHeight;
  58. tabComposite.setLayoutData(gd_top_tab_composite);
  59. tabComposite.setBackground(SWTResourceManager.getWhiteColor());
  60. GridLayout gl_top_tab_composite = new GridLayout(hasEmpty?allNodeDataList.size()+1:allNodeDataList.size(),false);
  61. gl_top_tab_composite.horizontalSpacing = 0;
  62. gl_top_tab_composite.verticalSpacing = 0;
  63. gl_top_tab_composite.marginWidth = 0;
  64. gl_top_tab_composite.marginHeight = 0;
  65. tabComposite.setLayout(gl_top_tab_composite);
  66.  
  67. if(hasScroll){
  68. ScrolledComposite scroll_content_composite = new ScrolledComposite(parent, SWT.V_SCROLL|SWT.H_SCROLL);
  69. GridData gd_scroll_content_composite = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);
  70. scroll_content_composite.setLayoutData(gd_scroll_content_composite);
  71. scroll_content_composite.setExpandHorizontal(true);
  72. scroll_content_composite.setExpandVertical(true);
  73. scroll_content_composite.setData("shink", true);
  74.  
  75. content_composite = new Composite(scroll_content_composite, SWT.NONE);
  76. scroll_content_composite.setContent(content_composite);
  77. }else{
  78. content_composite = new Composite(parent, SWT.NONE);
  79. GridData gd_content_composite = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);
  80. content_composite.setLayoutData(gd_content_composite);
  81. }
  82.  
  83. content_composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
  84. generateToTabComposite();
  85.  
  86. content_composite.layout(true);
  87. parent.layout(true);
  88.  
  89. /***默认展开第一个***/
  90. if(CollectionUtil.isNotEmpty(tabNodeList)){
  91. tabNodeList.get(0).notifyNodeEvent();
  92. }
  93. }
  94.  
  95. /**
  96. * 绘制顶部tab选项页
  97. * @param contentComposite
  98. * @return 返回第一个tab页标签
  99. */
  100. protected void generateToTabComposite(){
  101. if(CollectionUtil.isNotEmpty(allNodeDataList)){
  102. for(TreeNodeData nodeData:allNodeDataList){
  103. tabNodeList.add(createTab(nodeData));
  104. }
  105. }
  106. if(hasEmpty){
  107. Composite empty_composite = new Composite(tabComposite,SWT.NONE);
  108. empty_composite.setBackground(SWTResourceManager.getWhiteColor());
  109. GridData gd_empty_composite = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);
  110. empty_composite.setLayoutData(gd_empty_composite);
  111. SWTUtil.paintBorder(empty_composite, SWTResourceManager.getColor(229,229,229),BorderLine.BOTTOM,BorderLine.LEFT);
  112. }
  113. tabComposite.layout(true);
  114. }
  115.  
  116. /**
  117. * 创建一个tab
  118. * @param top_tab_composite
  119. * @return
  120. */
  121. @SuppressWarnings("unchecked")
  122. protected TabNode createTab(TreeNodeData treeNodeData){
  123. TabNode tabNode = new TabNode(tabComposite,treeNodeData,this,content_composite);
  124. tabNode.paint();
  125. CLabel nodeLabel = tabNode.getNodeLabel();
  126. if(null != nodeLabel){
  127. //添加选中样式和非选中样式
  128. nodeLabel.addListener(SWT.MouseDown, new Listener(){
  129. @Override
  130. public void handleEvent(Event event) {
  131. if(event.button == 1){
  132. if(chooseTab == tabNode){
  133. return;
  134. }
  135. if(chooseTab != null){
  136. changeTabToUnChoose(chooseTab);
  137. }
  138. changeTabToChoose(tabNode);
  139. chooseTab = tabNode;
  140. }
  141. }
  142. });
  143. if(CollectionUtil.isNotMultiEmpty(nodeListener)){
  144. Iterator<Integer> it = nodeListener.keySet().iterator();
  145. Integer mouseType;
  146. Listener listener = null;
  147. while(it.hasNext()){
  148. mouseType = it.next();
  149. if(CollectionUtil.isNotEmpty(nodeListener.getCollection(mouseType))){
  150. for(Object object:nodeListener.getCollection(mouseType)){
  151. listener = (Listener)object;
  152. nodeLabel.addListener(mouseType, listener);
  153. }
  154. }
  155. }
  156. }
  157. }
  158. return tabNode;
  159. }
  160.  
  161. /**
  162. * 将tab更改成未选中状态
  163. * @param tab_content_label
  164. */
  165. protected void changeTabToUnChoose(TabNode chooseTab){
  166. CLabel nodeLabel = chooseTab.getNodeLabel();
  167. if(null != nodeLabel){
  168. nodeLabel.setForeground(SWTResourceManager.getTextColor());
  169. PaintListener paintListener = (PaintListener)nodeLabel.getParent().getData("paintListener");
  170. if(null != paintListener){
  171. nodeLabel.getParent().removePaintListener(paintListener);
  172. }
  173. SWTUtil.paintBorder(nodeLabel.getParent(), SWTResourceManager.getColor(229,229,229),BorderLine.LEFT,BorderLine.TOP);
  174. SWTUtil.paintBorder(nodeLabel.getParent(), SWTResourceManager.getColor(229,229,229),BorderLine.BOTTOM);
  175. nodeLabel.getParent().redraw();
  176. }
  177. }
  178.  
  179. /**
  180. * 将tab更改成选中状态
  181. * @param tab_content_label
  182. */
  183. protected void changeTabToChoose(TabNode chooseTab){
  184. CLabel nodeLabel = chooseTab.getNodeLabel();
  185. if(null != nodeLabel){
  186. nodeLabel.setForeground(SWTResourceManager.getColor(83,157,249));
  187. PaintListener paintListener = (PaintListener)nodeLabel.getParent().getData("paintListener");
  188. if(null != paintListener){
  189. nodeLabel.getParent().removePaintListener(paintListener);
  190. }
  191. SWTUtil.paintBorder(nodeLabel.getParent(), SWTResourceManager.getColor(229,229,229),BorderLine.LEFT,BorderLine.TOP);
  192. SWTUtil.paintBorder(nodeLabel.getParent(), SWTResourceManager.getWhiteColor(),BorderLine.BOTTOM);
  193. nodeLabel.getParent().redraw();
  194. }
  195. }
  196.  
  197. public int getTabHeight() {
  198. return tabHeight;
  199. }
  200.  
  201. public void setTabHeight(int tabHeight) {
  202. this.tabHeight = tabHeight;
  203. }
  204.  
  205. /**
  206. * 添加结点监听器
  207. * @param listener
  208. */
  209. public void addListener(int mouseEventType,Listener listener){
  210. nodeListener.put(mouseEventType, listener);
  211. }
  212.  
  213. public boolean isHasEmpty() {
  214. return hasEmpty;
  215. }
  216.  
  217. /**
  218. * 当tab标签的数量不能够完全撑住一行时,是否剩下的用一个空tab来做支撑
  219. * @param hasEmpty
  220. */
  221. public void setHasEmpty(boolean hasEmpty) {
  222. this.hasEmpty = hasEmpty;
  223. }
  224.  
  225. /**
  226. * 所有的重新绘制
  227. * @param composite
  228. */
  229. protected void reLayoutAllParent(Composite composite) {
  230. Composite contentComposite = composite;
  231. while(contentComposite != this.parent){
  232. contentComposite.layout(true);
  233. contentComposite = contentComposite.getParent();
  234. }
  235. contentComposite.layout(true);
  236. Composite parentComposite = contentComposite.getParent();
  237. while(!(parentComposite instanceof ScrolledComposite) && !(parentComposite instanceof Shell)){
  238. parentComposite.layout(true);
  239. contentComposite = parentComposite;
  240. parentComposite = parentComposite.getParent();
  241. }
  242. if(parentComposite instanceof ScrolledComposite){
  243. ((ScrolledComposite)parentComposite).setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
  244. }
  245. }
  246.  
  247. public boolean isHasScroll() {
  248. return hasScroll;
  249. }
  250.  
  251. /**
  252. * 设置内容区域是否需要滚动条
  253. * @param hasScroll
  254. */
  255. public void setHasScroll(boolean hasScroll) {
  256. this.hasScroll = hasScroll;
  257. }
  258. }

6.2 可删除和添加tab

  1. package com.view.control.tab;
  2.  
  3. import org.eclipse.swt.SWT;
  4. import org.eclipse.swt.custom.CLabel;
  5. import org.eclipse.swt.layout.GridData;
  6. import org.eclipse.swt.layout.GridLayout;
  7. import org.eclipse.swt.widgets.Composite;
  8. import org.eclipse.swt.widgets.Event;
  9. import org.eclipse.swt.widgets.Listener;
  10.  
  11. import com.view.control.TreeNodeData;
  12. import com.view.control.tab.OptTab.OptTabEvent;
  13. import com.view.swt.CustomMessageBox;
  14. import com.view.swt.SWTResourceManager;
  15. import com.view.swt.CustomMessageBox.Result;
  16.  
  17. public class OptTabNode extends TabNode {
  18. private OptTabEvent optTabEvent;
  19. private OptTabNode optTabNode;
  20.  
  21. /** * 序列化ID */
  22. private static final long serialVersionUID = 1L;
  23.  
  24. public OptTabNode(Composite parent, TreeNodeData nodeData, OptTab tab, Composite contentComposite) {
  25. super(parent, nodeData, tab, contentComposite);
  26. }
  27.  
  28. @Override
  29. protected CLabel generateNodeContentComposite(){
  30. CLabel tab_content_label;
  31. optTabNode = this;
  32. if(optTabEvent != null){
  33. GridLayout gl_nodeComposite = new GridLayout(2,false);
  34. gl_nodeComposite.horizontalSpacing = 0;
  35. gl_nodeComposite.verticalSpacing = 0;
  36. gl_nodeComposite.marginWidth = 10;
  37. gl_nodeComposite.marginHeight = 1;
  38. nodeComposite.setLayout(gl_nodeComposite);
  39.  
  40. tab_content_label = super.generateNodeContentComposite();
  41.  
  42. CLabel deleteLabel = new CLabel(nodeComposite, SWT.NONE);
  43. GridData gd_deleteLabel = new GridData(SWT.TOP,SWT.CENTER,true,true,1,1);
  44. deleteLabel.setLayoutData(gd_deleteLabel);
  45. deleteLabel.setText("X");
  46. deleteLabel.setAlignment(SWT.RIGHT);
  47. deleteLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
  48. deleteLabel.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
  49. deleteLabel.addListener(SWT.MouseDown, new Listener() {
  50. @Override
  51. public void handleEvent(Event event) {
  52. if (new CustomMessageBox(deleteLabel.getShell(),"确认要删除?").open() == Result.YES.getResult()) {
  53. //删除一个tab
  54. ((OptTab)tab).delTab(optTabNode);
  55. }
  56. }
  57. });
  58. }else{
  59. tab_content_label = super.generateNodeContentComposite();
  60. }
  61. return tab_content_label;
  62. }
  63.  
  64. public OptTabEvent getOptTabEvent() {
  65. return optTabEvent;
  66. }
  67.  
  68. public void setOptTabEvent(OptTabEvent optTabEvent) {
  69. this.optTabEvent = optTabEvent;
  70. }
  71. }
  1. package com.view.control.tab;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.Iterator;
  7. import java.util.LinkedList;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Set;
  11. import log.Message;
  12.  
  13. import org.eclipse.swt.SWT;
  14. import org.eclipse.swt.custom.CLabel;
  15. import org.eclipse.swt.custom.ScrolledComposite;
  16. import org.eclipse.swt.layout.GridData;
  17. import org.eclipse.swt.layout.GridLayout;
  18. import org.eclipse.swt.widgets.Composite;
  19. import org.eclipse.swt.widgets.Control;
  20. import org.eclipse.swt.widgets.Event;
  21. import org.eclipse.swt.widgets.Listener;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24.  
  25. import com.alibaba.fastjson.JSON;
  26. import com.util.CollectionUtil;
  27. import com.util.StringUtil;
  28. import com.view.control.DefindFormAddCombo;
  29. import com.view.control.TreeNodeData;
  30. import com.view.control.select.DropDownBox;
  31. import com.view.swt.SWTCommonUtil;
  32. import com.view.swt.SWTResourceManager;
  33. import com.view.swt.SWTUtil;
  34. import com.view.swt.SWTUtil.BorderLine;
  35.  
  36. /**
  37. * <p>可删除和新增tab控件</p>
  38. * @version V1.0
  39. */
  40. public class OptTab extends Tab {
  41. private static final Logger log = LoggerFactory.getLogger(OptTab.class);
  42. private DefindFormAddCombo addCombo;
  43. private List<DropDownBox.Data> comboDataList;
  44. private Map<DropDownBox.Data,TreeNodeData> allNodeDataMap;
  45. private List<DropDownBox.Data> defaultValueList;
  46. /****添加combo显示名称****/
  47. private String addComboLabelName;
  48. /****combo文本框的宽度****/
  49. private int comboLabelWidth = 24;
  50. /*****设置显示名称控件的宽度*****/
  51. private int nameWidth = 50;
  52. private OptTabEvent optTabEvent;
  53. /****占空间*****/
  54. private List<Composite> tabNodeAllComposite = new LinkedList<Composite>();
  55.  
  56. public OptTab(Composite parent, List<TreeNodeData> allNodeDataList,String addComboLabelName) {
  57. super(parent, allNodeDataList);
  58. if(CollectionUtil.isNotEmpty(allNodeDataList)){
  59. comboDataList = new ArrayList<DropDownBox.Data>(allNodeDataList.size());
  60. allNodeDataMap = new HashMap<>(allNodeDataList.size());
  61. DropDownBox.Data data = null;
  62. for(TreeNodeData treeNodeData:allNodeDataList){
  63. if(StringUtil.isNotNullAndEmpty(treeNodeData.getLabel()) && StringUtil.isNotNullAndEmpty(treeNodeData.getMenuCode())){
  64. data = new DropDownBox.Data(treeNodeData.getLabel(),treeNodeData.getMenuCode());
  65. allNodeDataMap.put(data, treeNodeData);
  66. comboDataList.add(data);
  67. }else{
  68. log.trace(HikLog.toLog(new Message("has no label or menuCode","label","menuCode")),treeNodeData.getLabel(),treeNodeData.getMenuCode());
  69. }
  70. }
  71. }
  72. this.addComboLabelName = addComboLabelName;
  73. }
  74.  
  75. /**
  76. * 创建结点占位符
  77. * @param parentComposite 相对布局
  78. * @return
  79. */
  80. private Composite createTabNodePlaceHolder(Composite parentComposite){
  81. Composite nodePlaceHolderComposite = new Composite(parentComposite,SWT.NONE);
  82. nodePlaceHolderComposite.setBackground(SWTResourceManager.getWhiteColor());
  83. GridData gd_nodePlaceHolderComposite = new GridData(SWT.FILL,SWT.FILL,false,true,1,1);
  84. gd_nodePlaceHolderComposite.exclude = true;
  85. nodePlaceHolderComposite.setLayoutData(gd_nodePlaceHolderComposite);
  86. GridLayout gl_nodePlaceHolderComposite = new GridLayout(1,true);
  87. gl_nodePlaceHolderComposite.horizontalSpacing = 0;
  88. gl_nodePlaceHolderComposite.verticalSpacing = 0;
  89. gl_nodePlaceHolderComposite.marginWidth = 0;
  90. gl_nodePlaceHolderComposite.marginHeight = 0;
  91. nodePlaceHolderComposite.setLayout(gl_nodePlaceHolderComposite);
  92. nodePlaceHolderComposite.setVisible(false);
  93. tabNodeAllComposite.add(nodePlaceHolderComposite);
  94. return nodePlaceHolderComposite;
  95. }
  96.  
  97. @Override
  98. protected void generateToTabComposite(){
  99. GridLayout gl_top_tab_composite = new GridLayout(hasEmpty?allNodeDataList.size()+2:allNodeDataList.size()+1,false);
  100. gl_top_tab_composite.horizontalSpacing = 0;
  101. gl_top_tab_composite.verticalSpacing = 0;
  102. gl_top_tab_composite.marginWidth = 0;
  103. gl_top_tab_composite.marginHeight = 0;
  104. tabComposite.setLayout(gl_top_tab_composite);
  105.  
  106. //若有默认值,则创建默认tab
  107. if(CollectionUtil.isNotEmpty(defaultValueList)){
  108. for(DropDownBox.Data defaultValue:defaultValueList){
  109. if(allNodeDataMap.containsKey(defaultValue)){
  110. tabNodeList.add(createTab(allNodeDataMap.get(defaultValue)));
  111. }else{
  112. log.error(HikLog.toLog("", "defaultValue is not in allNodeDataList", "defaultValue","allNodeDataList"),JSON.toJSONString(defaultValue),JSON.toJSONString(allNodeDataList));
  113. }
  114. }
  115. comboDataList.removeAll(defaultValueList);
  116. }
  117. //预占用tabCompoiste的tab
  118. if(CollectionUtil.isNotEmpty(comboDataList)){
  119. for(int i = 0;i<comboDataList.size();i++){
  120. createTabNodePlaceHolder(tabComposite);
  121. }
  122. }
  123. Composite addComboComposite = new Composite(tabComposite,SWT.NONE);
  124. addComboComposite.setBackground(SWTResourceManager.getWhiteColor());
  125. GridData gd_addComboComposite = new GridData(SWT.FILL,SWT.FILL,false,true,1,1);
  126. addComboComposite.setLayoutData(gd_addComboComposite);
  127. GridLayout gl_addComboComposite = new GridLayout(1,true);
  128. gl_addComboComposite.horizontalSpacing = 0;
  129. gl_addComboComposite.verticalSpacing = 0;
  130. gl_addComboComposite.marginWidth = 10;
  131. gl_addComboComposite.marginHeight = 1;
  132. addComboComposite.setLayout(gl_addComboComposite);
  133. SWTUtil.paintBorder(addComboComposite, SWTResourceManager.getColor(229,229,229));
  134.  
  135. addCombo = new DefindFormAddCombo(addComboComposite, addComboLabelName, comboDataList, comboLabelWidth, nameWidth, this.tabHeight-5);
  136. addCombo.setNameShowInComboLabel(true);
  137. addCombo.addSelectListener(new Listener() {
  138. @Override
  139. public void handleEvent(Event event) {
  140. CLabel itemLabel = (CLabel)event.widget;
  141. DropDownBox.Data data = (DropDownBox.Data)itemLabel.getData("value");
  142. addTab(allNodeDataMap.get(data));
  143. }
  144. });
  145. addCombo.setComboRowWidth(100);
  146. addCombo.paint();
  147.  
  148. if(hasEmpty){
  149. Composite empty_composite = new Composite(tabComposite,SWT.NONE);
  150. empty_composite.setBackground(SWTResourceManager.getWhiteColor());
  151. GridData gd_empty_composite = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);
  152. empty_composite.setLayoutData(gd_empty_composite);
  153. SWTUtil.paintBorder(empty_composite, SWTResourceManager.getColor(229,229,229),BorderLine.BOTTOM);
  154. }
  155. addComboComposite.layout(true);
  156. tabComposite.layout(true);
  157. SWTUtil.paintBorder(this.content_composite,SWTResourceManager.getLightGreyBorderColor(),BorderLine.LEFT,BorderLine.RIGHT,BorderLine.BOTTOM);
  158. }
  159.  
  160. /**
  161. * 查找可用的tab
  162. * @return
  163. */
  164. private Composite findAvailablePlaceHolderComposite(){
  165. if(CollectionUtil.isNotEmpty(tabNodeAllComposite)){
  166. GridData gd_placeHolderComposite = null;
  167. Composite availabelComposite = null;
  168. for(Composite placeHolderComposite:tabNodeAllComposite){
  169. gd_placeHolderComposite = (GridData)placeHolderComposite.getLayoutData();
  170. if(gd_placeHolderComposite.exclude){
  171. availabelComposite = placeHolderComposite;
  172. gd_placeHolderComposite.exclude = false;
  173. placeHolderComposite.setVisible(true);
  174. break;
  175. }
  176. }
  177. return availabelComposite;
  178. }
  179. return null;
  180. }
  181.  
  182. /**
  183. * 创建一个tab
  184. * @param top_tab_composite
  185. * @return
  186. */
  187. @SuppressWarnings("unchecked")
  188. protected TabNode createTab(TreeNodeData treeNodeData){
  189. Composite placeHolderComposite = findAvailablePlaceHolderComposite();
  190. if(null == placeHolderComposite){
  191. placeHolderComposite = createTabNodePlaceHolder(tabComposite);
  192. GridData gd_placeHolderComposite = (GridData)placeHolderComposite.getLayoutData();
  193. gd_placeHolderComposite.exclude = false;
  194. placeHolderComposite.setVisible(true);
  195. }
  196. OptTabNode tabNode = new OptTabNode(placeHolderComposite,treeNodeData,this,content_composite);
  197. tabNode.setOptTabEvent(optTabEvent);
  198. tabNode.paint();
  199. placeHolderComposite.layout(true);
  200. placeHolderComposite.getParent().layout(true);
  201. CLabel nodeLabel = tabNode.getNodeLabel();
  202. if(null != nodeLabel){
  203. //添加选中样式和非选中样式
  204. nodeLabel.addListener(SWT.MouseDown, new Listener(){
  205. @Override
  206. public void handleEvent(Event event) {
  207. if(event.button == 1){
  208. if(chooseTab == tabNode){
  209. return;
  210. }
  211. if(chooseTab != null){
  212. changeTabToUnChoose(chooseTab);
  213. }
  214. changeTabToChoose(tabNode);
  215. chooseTab = tabNode;
  216. }
  217. }
  218. });
  219. if(CollectionUtil.isNotMultiEmpty(nodeListener)){
  220. Iterator<Integer> it = nodeListener.keySet().iterator();
  221. Integer mouseType;
  222. Listener listener = null;
  223. while(it.hasNext()){
  224. mouseType = it.next();
  225. if(CollectionUtil.isNotEmpty(nodeListener.getCollection(mouseType))){
  226. for(Object object:nodeListener.getCollection(mouseType)){
  227. listener = (Listener)object;
  228. nodeLabel.addListener(mouseType, listener);
  229. }
  230. }
  231. }
  232. }
  233. }
  234. return tabNode;
  235. }
  236.  
  237. /**
  238. * 删除tab
  239. * @param tabNode
  240. * @return
  241. */
  242. public boolean delTab(OptTabNode tabNode){
  243. if(optTabEvent != null && !optTabEvent.delete(tabNode.getNodeData())){
  244. return false;
  245. }
  246. tabNode.getNodeComposite().dispose();
  247. TreeNodeData treeNode = tabNode.getNodeData();
  248. DropDownBox.Data data = new DropDownBox.Data(treeNode.getLabel(),treeNode.getMenuCode());
  249. addCombo.addData(data);
  250. //默认展开下一个
  251. int index = tabNodeList.indexOf(tabNode);
  252. if(index < tabNodeList.size()-1){
  253. tabNodeList.get(index+1).notifyNodeEvent();
  254. }else if(index == tabNodeList.size()-1 && tabNodeList.size()>1){
  255. tabNodeList.get(0).notifyNodeEvent();
  256. }else{
  257. for(Control child:content_composite.getChildren()){
  258. child.dispose();
  259. }
  260. reLayoutContentComposite();
  261. }
  262. tabNodeList.remove(tabNode);
  263. Composite placeHolderComposite = tabNode.getParent();
  264. GridData gd_placeHolderComposite = (GridData)placeHolderComposite.getLayoutData();
  265. gd_placeHolderComposite.exclude = true;
  266. placeHolderComposite.setVisible(false);
  267. placeHolderComposite.getParent().layout(true);
  268. return true;
  269. }
  270.  
  271. /**
  272. * 添加tab
  273. * @param nodeData
  274. * @return
  275. */
  276. public boolean addTab(TreeNodeData nodeData){
  277. if(nodeData == null){
  278. return false;
  279. }
  280. if(optTabEvent != null && !optTabEvent.add(nodeData)){
  281. return false;
  282. }
  283. //创建tab
  284. TabNode tabNode = createTab(nodeData);
  285. tabNodeList.add(tabNode);
  286. tabNode.notifyNodeEvent();
  287. DropDownBox.Data data = new DropDownBox.Data(nodeData.getLabel(),nodeData.getMenuCode());
  288. addCombo.removeData(data);
  289. return true;
  290. }
  291.  
  292. /**
  293. * 重新绘制content区域*/
  294. private void reLayoutContentComposite(){
  295. Set<ScrolledComposite> scrolledCompositeSet = new HashSet<>();
  296. SWTCommonUtil.validScrollComposite(content_composite, scrolledCompositeSet);
  297. if(content_composite.getParent() instanceof ScrolledComposite){
  298. ScrolledComposite scroll_content_composite = (ScrolledComposite)content_composite.getParent();
  299. if(CollectionUtil.isEmpty(scrolledCompositeSet)){
  300. scroll_content_composite.setMinSize(content_composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
  301. }else{
  302. scroll_content_composite.setMinSize(0,0);
  303. }
  304. }else{
  305. reLayoutAllParent(content_composite);
  306. }
  307. }
  308.  
  309. /**
  310. * 设置默认tab值,这个 defaultValueList 必须在 allNodeDataList中,否则创建不出来对应的tab
  311. * @param defaultValueList
  312. */
  313. public void setDefaultValueList(List<DropDownBox.Data> defaultValueList) {
  314. this.defaultValueList = defaultValueList;
  315. }
  316.  
  317. public void setComboLabelWidth(int comboLabelWidth) {
  318. this.comboLabelWidth = comboLabelWidth;
  319. }
  320.  
  321. public void setNameWidth(int nameWidth) {
  322. this.nameWidth = nameWidth;
  323. }
  324.  
  325. public void setOptTabEvent(OptTabEvent optTabEvent) {
  326. this.optTabEvent = optTabEvent;
  327. }
  328.  
  329. /**
  330. *
  331. * <p>删除一个tab发生的事件</p>
  332. * @version V1.0
  333. */
  334. public interface OptTabEvent{
  335. /**
  336. * 删除一个tab发生的事件
  337. * @param nodeData
  338. * @return
  339. */
  340. boolean delete(TreeNodeData nodeData);
  341. /***
  342. * 添加一个tab发生的事件
  343. * @param nodeData
  344. * @return
  345. */
  346. boolean add(TreeNodeData nodeData);
  347. }
  348. }

自定义SWT控件六之自定义Tab的更多相关文章

  1. 自定义SWT控件五之自定义穿梭框

    5.自定义穿梭框 package com.view.control.shuttlebox; import java.util.ArrayList; import java.util.HashMap; ...

  2. 自定义SWT控件二之自定义多选下拉框

    2.自定义下拉多选框 package com.view.control.select; import java.util.ArrayList; import java.util.HashMap; im ...

  3. 自定义SWT控件一之自定义单选下拉框

    一.自定义下拉控件 自定义的下拉框,是自定义样式的,其中的下拉框使用的是独立的window,非复选框的下拉框双击单机其它区域或选择完之后,独立window构成的下拉框会自动消失. package co ...

  4. 自定义SWT控件七之自定义Shell(可伸缩窗口)

    7.可伸缩窗口 该自定义窗口可以通过鼠标随意更改窗口大小 package com.hikvision.encapsulate.view.control.shell; import org.eclips ...

  5. 自定义SWT控件四之其它下拉框

    4.其它下拉框 4.1 添加联动二级多选择框(有添加按钮和删除按钮) package com.view.control.select; import java.util.ArrayList; impo ...

  6. IOS开发--自定义segment控件,方便自定义样式

    系统的segment控件太封闭,想换个颜色加个背景太难了,忍不住自己写一个,以备不时之需 这个控件给出了很多自定义属性的设置,用起来还是比较方便的,需要注意的 itemWidth如果不设置,则会按照控 ...

  7. 自定义SWT控件三之搜索功能下拉框

    3.搜索功能下拉弹出框 package com.view.control.select; import java.util.ArrayList; import java.util.LinkedList ...

  8. 6、手把手教你Extjs5(六)继承自定义一个控件

    Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...

  9. 【转】带checkbox的ListView实现(二)——自定义Checkable控件的实现方法

    原文网址:http://blog.csdn.net/harvic880925/article/details/40475367 前言:前一篇文章给大家展示了传统的Listview的写法,但有的时候我们 ...

随机推荐

  1. 【JAVA NIO】java NIO

    本文是博主深入学习Netty前的一些铺垫,之前只是使用Netty,用的很粗暴,导包,上网找个DEMO就直接用,对Netty中的组件了解并不深入. 于是再此总结下基础,并对一些核心组件作如下记录: 1. ...

  2. 【小记整理】mybatis配置多个扫描路径写法

    百度得到,但是很乱,稍微整理下: 最近拆项目,遇到个小问题,稍微记录下: <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id ...

  3. What?一个 Dubbo 服务启动要两个小时!

    前言 前几天在测试环境碰到一个非常奇怪的与 dubbo 相关的问题,事后我在网上搜索了一圈并没有发现类似的帖子或文章,于是便有了这篇. 希望对还未碰到或正在碰到的朋友有所帮助. 现象 现象是这样的,有 ...

  4. Ceph原理动画演示

    动图生动刻画Ceph的基本原理之集群搭建及数据写入流程:)

  5. MySQL数据库设计与开发规范

    目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ...

  6. SQL Server 触发器和事务

    一.触发器 1. 定义 --基本语法 create trigger Trigger_Name on TableName for type --type:insert,update,delete as ...

  7. NOSQL—MongoDB之外的新选择

    MongoDB之外的新选择 MongoDB拥有灵活的文档型数据结构和方便的操作语法,在新兴的互联网应用中得到了广泛的部署,但对于其底层的存储引擎一直未对外开放,虽说开源却有失完整.Mongo版本3中开 ...

  8. junit中test用法

    Test注解 有两个值, expected, timeout expect后面接异常类, timtout后面接时间, 符合则为ture 如 @Test (expected = NullPointExc ...

  9. Q&A-20180128

    Orleans与Akka对比,为什么选用Orleans? 答: Akka对参与开发的人员要求更高一些,普遍是专家级别,Orleans框架进一步抽象了一层,结合C#语言特性,能普遍降低开发难度. 下面是 ...

  10. linux server 发送邮件

    用linux服务器发送邮件centos1.安装mailx 和sendmail,系统一般会安装的yum -y isntall mailx sendmail 2.修改/etc/mail.rcset fro ...