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


    4、其它下拉框

    4.1 添加联动二级多选择框(有添加按钮和删除按钮)

    package com.view.control.select;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.custom.CLabel;
    import org.eclipse.swt.custom.ScrolledComposite;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Shell;
    
    import com.global.constant.Constants;
    import com.util.CollectionUtil;
    import com.util.FileUtil;
    import com.view.control.DefinedControl;
    import com.view.control.select.DefinedCommonMultiSelect.DefinedCommonMultiSelectEvent;
    import com.view.control.select.DropDownBox.Data;
    import com.view.swt.SWTResourceManager;
    import com.view.util.ImageUtil;
    
    /**
     * <p>添加联动二级多选择框(有添加按钮和删除按钮)</p>
     * <p>
     *   第一级为单选框(目前不带搜索功能)<br>
     *   第二级为不带搜索功能的多选项框
     * </p>
     * @version V1.0
     */
    public class DefinedFormAddLinkageMultiSelect extends DefinedControl {
        /****内容容器*****/
        private Composite addComposite;
        /****显示名称控件****/
        private CLabel name;
        /****选中内容显示的文本区域 + 下拉图标 总宽度****/
        private int chooseWidth = 323;
        private int chooseHeight = 32;
        /****内容框中的每项的高度*****/
        private int chooseItemHeight = 24;
        /*****显示名称**********/
        private String nameText;
        /*****设置显示名称控件的宽度*****/
        private int nameWidth = 100;
        private List<DropDownBox.Data> selectedList = new ArrayList<DropDownBox.Data>();
        /****每个下拉框的中每行的宽度****/
        private int comboRowWidth;
        private int comboRowHeight = 0;
        /*****主要是数据交互使用*******/
        private DefinedCommonMultiSelectEvent itemHandlerListener;
        private DefinedFormAddLinkageMultiSelectEvent linkageMultiSelectEvent;
        private Listener firsetSelectListener;
        private Label addImg ;
        private List<DropDownBox.Data> firstDefaultSelectValueList;
        private List<Composite> addRowCompositeList = new ArrayList<>();
        /*****点击第二级下拉中的小删除按钮发生的额外事件*****/
        private Listener deleteBtnListener;
    
        public DefinedFormAddLinkageMultiSelect(Composite parent,String nameText,List<DropDownBox.Data> firstSelectedList,int chooseWidth,DefinedFormAddLinkageMultiSelectEvent linkageMultiSelectEvent) {
            super(parent);
           this.nameText = nameText;
           this.selectedList = firstSelectedList;
           this.comboRowWidth = chooseWidth/2;
           this.chooseWidth = chooseWidth;
           this.linkageMultiSelectEvent = linkageMultiSelectEvent;
        }
        
        public DefinedFormAddLinkageMultiSelect(Composite parent,String nameText,List<DropDownBox.Data> firstSelectedList,int nameTextWidth,int chooseWidth,int chooseItemHeight,int chooseHeight,DefinedFormAddLinkageMultiSelectEvent linkageMultiSelectEvent) {
           this(parent,nameText,firstSelectedList,chooseWidth,linkageMultiSelectEvent);
           this.nameWidth = nameTextWidth;
           this.chooseItemHeight = chooseItemHeight;
           this.chooseHeight = chooseHeight;
        }
    
        @Override
        public void paint() {
            generateAddComposite(this.parent);
        }
        
        private void generateAddComposite(Composite contentComposite){
            /****显示添加一行(第一行24像素高,后面每一行 chooseHeight高)****/
            addComposite = new Composite(contentComposite,SWT.NONE);
            GridData gd_addComposite = new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1);
            addComposite.setLayoutData(gd_addComposite);
            GridLayout gl_addComposite = new GridLayout(2,false);
            gl_addComposite.horizontalSpacing = 5;
            gl_addComposite.verticalSpacing = 15;
            gl_addComposite.marginHeight = 0;
            gl_addComposite.marginWidth = 0;
            addComposite.setLayout(gl_addComposite);
            addComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            name = new CLabel(addComposite,SWT.NONE);
            GridData gd_addLabel = new GridData(SWT.RIGHT, SWT.FILL, false, false, 1, 1);
            gd_addLabel.widthHint = this.nameWidth;
            gd_addLabel.heightHint = 20;
            name.setLayoutData(gd_addLabel);
            name.setAlignment(SWT.RIGHT);
            name.setText(this.nameText);
            name.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            name.setForeground(SWTResourceManager.getColor(51,51,51));
            
            addImg = new Label(addComposite,SWT.NONE);
            GridData gd_addImg = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1);
            gd_addImg.widthHint = 24;
            gd_addImg.heightHint = 24;
            addImg.setLayoutData(gd_addImg);
            addImg.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.ADD_ICON)));
            addImg.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            addImg.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            addImg.addListener(SWT.MouseDown, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    generateAddRowComposite(addComposite,null);
                    reLayout();
                }
            });
            
            if(CollectionUtil.isNotEmpty(firstDefaultSelectValueList)){
                for(DropDownBox.Data firstDefaultSelectValue:firstDefaultSelectValueList){
                    generateAddRowComposite(addComposite,firstDefaultSelectValue);
                }
            }
            reLayout();
        }
        
        private void reLayout(){
            Composite contentComposite = addComposite;
            while(contentComposite != this.parent){
                contentComposite.layout(true);
                contentComposite = contentComposite.getParent();
            }
            contentComposite.layout(true);
            Composite parentComposite = contentComposite.getParent();
            while(!(parentComposite instanceof ScrolledComposite) && !(parentComposite instanceof Shell)){
                parentComposite.layout(true);
                contentComposite = parentComposite;
                parentComposite = parentComposite.getParent();
            }
            if(parentComposite instanceof ScrolledComposite){
                ((ScrolledComposite)parentComposite).setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
            }
        }
        
        
        /**
         * 
         * @param contentComposite   为addComposite(2列)
         */
        private void generateAddRowComposite(Composite contentComposite,DropDownBox.Data defaultValue){
            Composite addRowComposite = new Composite(contentComposite,SWT.NONE);
            GridData gd_addRowComposite = new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1);
            gd_addRowComposite.heightHint = this.chooseHeight;
            addRowComposite.setLayoutData(gd_addRowComposite);
            
            GridLayout gl_addRowComposite = new GridLayout(5,false);
            gl_addRowComposite.horizontalSpacing = 5;
            gl_addRowComposite.verticalSpacing = 0;
            gl_addRowComposite.marginHeight = 0;
            gl_addRowComposite.marginWidth = 0;
            addRowComposite.setLayout(gl_addRowComposite);
            addRowComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            CLabel emptyLabel = new CLabel(addRowComposite,SWT.NONE);
            GridData gd_addLabel = new GridData(SWT.RIGHT, SWT.FILL, false, true, 1, 1);
            gd_addLabel.widthHint = this.nameWidth;
            emptyLabel.setLayoutData(gd_addLabel);
            emptyLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            DefinedSingleSelect firstSelect = new DefinedSingleSelect(addRowComposite,this.selectedList,this.chooseWidth /2,this.chooseHeight);
            List<DropDownBox.Data> secondDataList = new ArrayList<>();
            List<DropDownBox.Data> secondDefaultList = new ArrayList<DropDownBox.Data>();
            if(null != defaultValue){
                secondDataList = linkageMultiSelectEvent.getSecondData(defaultValue);
                secondDefaultList = linkageMultiSelectEvent.getSecondDefaultValueList(defaultValue);
            }
            DefinedMultiSelect multiSelect = new DefinedMultiSelect(addRowComposite,secondDataList,this.chooseWidth /2,this.chooseItemHeight );
            if(null != defaultValue){
                firstSelect.setDefaultValue(defaultValue);
            }
            if(CollectionUtil.isNotEmpty(secondDefaultList)){
                multiSelect.setDefaultValueList(secondDefaultList);
            }
            if(this.comboRowWidth != 0){
                firstSelect.setComboRowWidth(this.comboRowWidth );
                multiSelect.setComboRowWidth(this.comboRowWidth);
            }
            if(this.comboRowHeight != 0){
                firstSelect.setComboRowHeight(this.comboRowHeight);
                multiSelect.setComboRowHeight(this.comboRowHeight);
            }
            
            firstSelect.addSelectListener(new Listener(){
                @Override
                public void handleEvent(Event event) {
                    CLabel itemLabel = (CLabel)event.widget;
                    DropDownBox.Data data = (Data)itemLabel.getData("data");
                    multiSelect.disposeAllChooseItem();
                    List<DropDownBox.Data> secondDataList = linkageMultiSelectEvent.getSecondData(data);
                    multiSelect.setComboDataList(secondDataList);
                    itemLabel.setData("firstSelect", firstSelect);
                }
            });
            
            //主要用于控制样式
            multiSelect.addItemHandlerListener(new DefinedCommonMultiSelectEvent() {
        
                @Override
                public void disposeItemEvent(Data data, Composite text_composite) {
                    ((GridData)addRowComposite.getLayoutData()).heightHint = multiSelect.getHeight();
                    reLayout();
                }
                
                @Override
                public void addItemEvent(Data data, Composite text_composite) {
                    ((GridData)addRowComposite.getLayoutData()).heightHint = multiSelect.getHeight();
                    reLayout();
                }
            });
            if(null != itemHandlerListener){
                multiSelect.addItemHandlerListener(itemHandlerListener);
            }
            if(null != firsetSelectListener){
                firstSelect.addSelectListener(firsetSelectListener);
            }
            
            firstSelect.paint();
            firstSelect.getContentText().setData("firstSelect", firstSelect);
    
            multiSelect.paint();
            multiSelect.getChooseComposite().setData(firstSelect);
            
            Label deleteImg = new Label(addRowComposite,SWT.NONE);
            GridData gd_deleteImg = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1);
            gd_deleteImg.widthHint = 24;
            gd_deleteImg.heightHint = 24;
            deleteImg.setLayoutData(gd_deleteImg);
            deleteImg.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.DELETE_ICON)));
            deleteImg.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            deleteImg.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            deleteImg.setData("multiSelect", multiSelect);   //将删除按钮绑定到第一个下拉框上
            deleteImg.setData("firstSelect", firstSelect);   //将删除按钮绑定到第一个下拉框上
            if(this.deleteBtnListener != null){
                deleteImg.addListener(SWT.MouseDown,this.deleteBtnListener);
            }
            deleteImg.addListener(SWT.MouseDown, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    multiSelect.disposeAllChooseItem();
                    addRowCompositeList.remove(addRowComposite);
                    addRowComposite.dispose();
                    reLayout();
                }
            });
            addRowComposite.setData("firstSelect", firstSelect);
            addRowComposite.setData("multiSelect", multiSelect);
            
            Label mentionLabel = new Label(addRowComposite,SWT.WRAP);
            GridData gd_mention = new GridData(SWT.LEFT, SWT.CENTER, false, true, 1, 1);
            Rectangle bounds = contentComposite.getBounds();
            if(bounds.width == 0){
                bounds = contentComposite.getParent().getParent().getBounds();
            }
            gd_mention.widthHint = bounds.width - this.nameWidth - this.chooseWidth -24-15;
            mentionLabel.setLayoutData(gd_mention);
            mentionLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            mentionLabel.setForeground(SWTResourceManager.getColor(51,51,51));
            addRowComposite.layout(true);
            addRowCompositeList.add(addRowComposite);
        }
        
        public interface DefinedFormAddLinkageMultiSelectEvent{
            /*****根据第一个下拉框选择的内容动态生成第二个框选择的内容******/
            List<DropDownBox.Data> getSecondData(DropDownBox.Data firstValue);
            /*****根据第一个获取其默认已经配置的内容*****/
            List<DropDownBox.Data> getSecondDefaultValueList(DropDownBox.Data firstValue);
        }
        
        public int getChooseWidth() {
            return chooseWidth;
        }
        
        public void setChooseWidth(int chooseWidth) {
            this.chooseWidth = chooseWidth;
        }
        
        public int getChooseHeight() {
            return chooseHeight;
        }
        
        public void setChooseHeight(int chooseHeight) {
            this.chooseHeight = chooseHeight;
        }
        
        public int getChooseItemHeight() {
            return chooseItemHeight;
        }
        
        public void setChooseItemHeight(int chooseItemHeight) {
            this.chooseItemHeight = chooseItemHeight;
        }
        
        public int getNameWidth() {
            return nameWidth;
        }
        
        public void setNameWidth(int nameWidth) {
            this.nameWidth = nameWidth;
        }
        
        public int getComboRowWidth() {
            return comboRowWidth;
        }
        
        public void setComboRowWidth(int comboRowWidth) {
            this.comboRowWidth = comboRowWidth;
        }
        
        public int getComboRowHeight() {
            return comboRowHeight;
        }
        
        public void setComboRowHeight(int comboRowHeight) {
            this.comboRowHeight = comboRowHeight;
        }
        
        public void setNameText(String nameText) {
            this.nameText = nameText;
        }
        
        /*****
         * 第二个多选择框在删除一个选择项和新增一个选择项发生的事件(主要是数据交互)
         * @param itemHandlerListener
         */
        public void setItemHandlerListener(DefinedCommonMultiSelectEvent itemHandlerListener) {
            this.itemHandlerListener = itemHandlerListener;
        }
    
        public void setLinkageMultiSelectEvent(DefinedFormAddLinkageMultiSelectEvent linkageMultiSelectEvent) {
            this.linkageMultiSelectEvent = linkageMultiSelectEvent;
        }
    
        public void setFirsetSelectListener(Listener firsetSelectListener) {
            this.firsetSelectListener = firsetSelectListener;
        }
    
        public void setFirstDefaultSelectValueList(List<DropDownBox.Data> firstDefaultSelectValueList) {
            this.firstDefaultSelectValueList = firstDefaultSelectValueList;
        }
    
        public List<DropDownBox.Data> getSelectedList() {
            return selectedList;
        }
    
        public void setDeleteBtnListener(Listener deleteBtnListener) {
            this.deleteBtnListener = deleteBtnListener;
        }
    
        public List<Composite> getAddRowCompositeList() {
            return addRowCompositeList;
        }
    }

     4.2 二级联动下拉框,第二级带搜索功能

    package com.view.control.select;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.custom.CLabel;
    import org.eclipse.swt.custom.ScrolledComposite;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Shell;
    
    import com.global.constant.Constants;
    import com.util.CollectionUtil;
    import com.util.FileUtil;
    import com.util.StringUtil;
    import com.view.control.DefinedControl;
    import com.view.control.DefinedSearchText;
    import com.view.control.select.DefinedCommonMultiSelect.DefinedCommonMultiSelectEvent;
    import com.view.swt.SWTResourceManager;
    import com.view.swt.StyleTextLink;
    import com.view.util.ImageUtil;
    
    /**
     * <p>联动二级搜索下拉框</p>
     *  * <p>
     *   第一级为单选框(目前不带搜索功能)<br>
     *   第二级为带搜索功能的多选项框
     * </p>
     * @version V1.0
     */
    public class DefinedFormSearchAddLinkageMultiSelect extends DefinedControl {
        /****内容容器*****/
        private Composite addComposite;
        /****显示名称控件****/
        private CLabel name;
        /****选中内容显示的文本区域 + 下拉图标 总宽度****/
        private int chooseWidth = 323;
        private int chooseHeight = 32;
        /****内容框中的每项的高度*****/
        private int chooseItemHeight = 24;
        /*****显示名称**********/
        private String nameText;
        /*****设置显示名称控件的宽度*****/
        private int nameWidth = 100;
        private List<DropDownBox.Data> selectedList = new ArrayList<DropDownBox.Data>();
        /****每个下拉框的中每行的宽度****/
        private int comboRowWidth;
        private int comboRowHeight = 0;
        /*****主要是数据交互使用*******/
        private DefinedCommonMultiSelectEvent itemHandlerListener;
        private Listener firsetSelectListener;
        private Label addImg ;
        private List<DropDownBox.Data> firstDefaultSelectValueList;
        private List<Composite> addRowCompositeList = new ArrayList<>();
        /*****点击第二级下拉中的小删除按钮发生的额外事件*****/
        private Listener deleteBtnListener;
        /*****添加一行时出现的额外事件**********/
        private Listener addRowListener;
        private DefinedFormSearchAddLinkageMultiSelectEvent linkageMultiSelectEvent;
        private boolean asynchronous = false;
        private int pagePerNum = 10;
        private String defaultMultiSearchMentionHint;
        private boolean multiInitEmpty;
        private StyleTextLink.StyleTextLinkEvent linkEvent;
        private int mentionWidth;
    
        public DefinedFormSearchAddLinkageMultiSelect(Composite parent,String nameText,List<DropDownBox.Data> firstSelectedList,int chooseWidth) {
            super(parent);
           this.nameText = nameText;
           this.selectedList = firstSelectedList;
           this.comboRowWidth = chooseWidth/2;
           this.chooseWidth = chooseWidth;
        }
        
        public DefinedFormSearchAddLinkageMultiSelect(Composite parent,String nameText,List<DropDownBox.Data> firstSelectedList,int nameTextWidth,int chooseWidth,int chooseItemHeight,int chooseHeight,DefinedFormSearchAddLinkageMultiSelectEvent linkageMultiSelectEvent) {
           this(parent,nameText,firstSelectedList,chooseWidth);
           this.nameWidth = nameTextWidth;
           this.chooseItemHeight = chooseItemHeight;
           this.chooseHeight = chooseHeight;
           this.linkageMultiSelectEvent = linkageMultiSelectEvent;
        }
    
        @Override
        public void paint() {
            generateAddComposite(this.parent);
        }
        
        private void generateAddComposite(Composite contentComposite){
            /****显示添加一行(第一行24像素高,后面每一行 chooseHeight高)****/
            addComposite = new Composite(contentComposite,SWT.NONE);
            GridData gd_addComposite = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
            addComposite.setLayoutData(gd_addComposite);
            GridLayout gl_addComposite = new GridLayout(2,false);
            gl_addComposite.horizontalSpacing = 5;
            gl_addComposite.verticalSpacing = 15;
            gl_addComposite.marginHeight = 0;
            gl_addComposite.marginWidth = 0;
            addComposite.setLayout(gl_addComposite);
            addComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            name = new CLabel(addComposite,SWT.NONE);
            GridData gd_addLabel = new GridData(SWT.RIGHT, SWT.FILL, false, false, 1, 1);
            gd_addLabel.widthHint = this.nameWidth;
            gd_addLabel.heightHint = 20;
            name.setLayoutData(gd_addLabel);
            name.setAlignment(SWT.RIGHT);
            name.setText(this.nameText);
            name.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            name.setForeground(SWTResourceManager.getColor(51,51,51));
            
            addImg = new Label(addComposite,SWT.NONE);
            GridData gd_addImg = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1);
            gd_addImg.widthHint = 24;
            gd_addImg.heightHint = 24;
            addImg.setLayoutData(gd_addImg);
            addImg.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.ADD_ICON)));
            addImg.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            addImg.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            addImg.addListener(SWT.MouseDown, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    generateAddRowComposite(addComposite,null);
                    reLayout();
                }
            });
            
            if(CollectionUtil.isNotEmpty(firstDefaultSelectValueList)){
                for(DropDownBox.Data firstDefaultSelectValue:firstDefaultSelectValueList){
                    generateAddRowComposite(addComposite,firstDefaultSelectValue);
                }
            }
            reLayout();
        }
        
        private void reLayout(){
            Composite contentComposite = addComposite;
            while(contentComposite != this.parent){
                contentComposite.layout(true);
                contentComposite = contentComposite.getParent();
            }
            contentComposite.layout(true);
            Composite parentComposite = contentComposite.getParent();
            while(!(parentComposite instanceof ScrolledComposite) && !(parentComposite instanceof Shell)){
                parentComposite.layout(true);
                contentComposite = parentComposite;
                parentComposite = parentComposite.getParent();
            }
            if(parentComposite instanceof ScrolledComposite){
                ((ScrolledComposite)parentComposite).setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
            }
        }
        
        /**
         * 
         * @param contentComposite   为addComposite(2列)
         */
        private void generateAddRowComposite(Composite contentComposite,DropDownBox.Data defaultValue){
            Composite addRowComposite = new Composite(contentComposite,SWT.NONE);
            GridData gd_addRowComposite = new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1);
            gd_addRowComposite.heightHint = this.chooseHeight;
            addRowComposite.setLayoutData(gd_addRowComposite);
            
            GridLayout gl_addRowComposite = new GridLayout(5,false);
            gl_addRowComposite.horizontalSpacing = 5;
            gl_addRowComposite.verticalSpacing = 0;
            gl_addRowComposite.marginHeight = 0;
            gl_addRowComposite.marginWidth = 0;
            addRowComposite.setLayout(gl_addRowComposite);
            addRowComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            CLabel emptyLabel = new CLabel(addRowComposite,SWT.NONE);
            GridData gd_addLabel = new GridData(SWT.RIGHT, SWT.FILL, false, true, 1, 1);
            gd_addLabel.widthHint = this.nameWidth;
            emptyLabel.setLayoutData(gd_addLabel);
            emptyLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            DefinedSingleSelect firstSelect = new DefinedSingleSelect(addRowComposite,this.selectedList,this.chooseWidth /2,this.chooseHeight);
            DefinedSearchMultiSelect multiSelect = new DefinedSearchMultiSelect(addRowComposite,new DefinedSearchMultiSelect.SearchMultiSelectEvent(){
    
                @Override
                public DefinedSearchText.SearchPageResult<DropDownBox.Data> search(Event event, String searchKeys, int pageNum, int pagePerNum, List<Object> filters) {
                    return linkageMultiSelectEvent.search(event, searchKeys, pageNum, pagePerNum, filters);
                }
    
                @Override
                public String verifySearchContent(String searchKey) {
                    return linkageMultiSelectEvent.verifySearchContent(searchKey);
                }
                
            },this.chooseWidth /2,this.chooseItemHeight );
            multiSelect.setAsynchronous(asynchronous);
            multiSelect.setInitEmpty(this.multiInitEmpty);
            multiSelect.setLinkEvent(linkEvent);
            if(pagePerNum>0){
                multiSelect.setPagePerNum(pagePerNum);
            }
    
            if(StringUtil.isNotNullAndEmpty(defaultMultiSearchMentionHint)){
                multiSelect.setDefaultMentionHint(defaultMultiSearchMentionHint);
            }
            List<DropDownBox.Data> secondDefaultList = new ArrayList<DropDownBox.Data>();
            if(null != defaultValue){
                firstSelect.setDefaultValue(defaultValue);
                multiSelect.addSearchExternalFilter(defaultValue.getValue());
                multiSelect.setInitEmpty(false);
                secondDefaultList = linkageMultiSelectEvent.getSecondDefaultValueList(defaultValue);
            }
            if(CollectionUtil.isNotEmpty(secondDefaultList)){
                multiSelect.setDefaultValueList(secondDefaultList);
            }
            if(this.comboRowWidth != 0){
                firstSelect.setComboRowWidth(this.comboRowWidth );
                multiSelect.setComboRowWidth(this.comboRowWidth);
            }
            if(this.comboRowHeight != 0){
                firstSelect.setComboRowHeight(this.comboRowHeight);
                multiSelect.setComboRowHeight(this.comboRowHeight);
            }
            firstSelect.addSelectListener(new Listener(){
                @Override
                public void handleEvent(Event event) {
                    CLabel itemLabel = (CLabel)event.widget;
                    DropDownBox.Data data = (DropDownBox.Data)itemLabel.getData("data");
                    multiSelect.disposeAllChooseItem();
                    multiSelect.replaceSearchExternalFilter(data.getValue(), 0);
                    multiSelect.setInitEmpty(false);
                    itemLabel.setData("firstSelect", firstSelect);
                }
            });
            
            //主要用于控制样式
            multiSelect.addItemHandlerListener(new DefinedCommonMultiSelectEvent() {
                @Override
                public void disposeItemEvent(DropDownBox.Data data, Composite text_composite) {
                    ((GridData)addRowComposite.getLayoutData()).heightHint = multiSelect.getHeight();
                    reLayout();
                }
                
                @Override
                public void addItemEvent(DropDownBox.Data data, Composite text_composite) {
                    ((GridData)addRowComposite.getLayoutData()).heightHint = multiSelect.getHeight();
                    reLayout();
                }
            });
            if(null != itemHandlerListener){
                multiSelect.addItemHandlerListener(itemHandlerListener);
            }
            if(null != firsetSelectListener){
                firstSelect.addSelectListener(firsetSelectListener);
            }
            
            firstSelect.paint();
            firstSelect.getContentText().setData("firstSelect", firstSelect);
    
            multiSelect.paint();
            multiSelect.getChooseComposite().setData(firstSelect);
            
            Label deleteImg = new Label(addRowComposite,SWT.NONE);
            GridData gd_deleteImg = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1);
            gd_deleteImg.widthHint = 24;
            gd_deleteImg.heightHint = 24;
            deleteImg.setLayoutData(gd_deleteImg);
            deleteImg.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.DELETE_ICON)));
            deleteImg.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            deleteImg.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            deleteImg.setData("multiSelect", multiSelect);   //将多选框绑定到删除图标上
            deleteImg.setData("firstSelect", firstSelect);   //将第一个下拉框绑定到删除图标上
            if(this.deleteBtnListener != null){
                deleteImg.addListener(SWT.MouseDown,this.deleteBtnListener);
            }
            deleteImg.addListener(SWT.MouseDown, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    multiSelect.disposeAllChooseItem();
                    addRowCompositeList.remove(addRowComposite);
                    addRowComposite.dispose();
                    reLayout();
                }
            });
            addRowComposite.setData("firstSelect", firstSelect);
            addRowComposite.setData("multiSelect", multiSelect);
            
            Label mentionLabel = new Label(addRowComposite,SWT.WRAP);
            GridData gd_mention = new GridData(SWT.LEFT, SWT.CENTER, false, true, 1, 1);
            if(this.mentionWidth != 0){
                gd_mention.widthHint = this.mentionWidth;
            }else{
                Rectangle bounds = contentComposite.getBounds();
                if(bounds.width == 0){
                    bounds = contentComposite.getParent().getParent().getBounds();
                }
                gd_mention.widthHint = bounds.width - this.nameWidth - this.chooseWidth -24-15;
            }
            mentionLabel.setLayoutData(gd_mention);
            mentionLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            mentionLabel.setForeground(SWTResourceManager.getColor(51,51,51));
            addRowComposite.layout(true);
            addRowCompositeList.add(addRowComposite);
            if(addRowListener != null){
                Event addRowEvent = new Event();
                addRowEvent.widget = addRowComposite;
                addRowEvent.button = 1;
                addRowListener.handleEvent(addRowEvent);
            }
        }
        
        public interface DefinedFormSearchAddLinkageMultiSelectEvent{
            /*****根据第一个获取其默认已经配置的内容*****/
            List<DropDownBox.Data> getSecondDefaultValueList(DropDownBox.Data firstValue);
            DefinedSearchText.SearchPageResult<DropDownBox.Data> search(Event event,String searchKeys,int pageNum,int pagePerNum,List<Object> filters);
            String verifySearchContent(String searchKey);
        }
        
        public int getChooseWidth() {
            return chooseWidth;
        }
        
        public void setChooseWidth(int chooseWidth) {
            this.chooseWidth = chooseWidth;
        }
        
        public int getChooseHeight() {
            return chooseHeight;
        }
        
        public void setChooseHeight(int chooseHeight) {
            this.chooseHeight = chooseHeight;
        }
        
        public int getChooseItemHeight() {
            return chooseItemHeight;
        }
        
        public void setChooseItemHeight(int chooseItemHeight) {
            this.chooseItemHeight = chooseItemHeight;
        }
        
        public int getNameWidth() {
            return nameWidth;
        }
        
        public void setNameWidth(int nameWidth) {
            this.nameWidth = nameWidth;
        }
        
        public int getComboRowWidth() {
            return comboRowWidth;
        }
        
        public void setComboRowWidth(int comboRowWidth) {
            this.comboRowWidth = comboRowWidth;
        }
        
        public int getComboRowHeight() {
            return comboRowHeight;
        }
        
        public void setComboRowHeight(int comboRowHeight) {
            this.comboRowHeight = comboRowHeight;
        }
        
        public void setNameText(String nameText) {
            this.nameText = nameText;
        }
        
        /*****
         * 第二个多选择框在删除一个选择项和新增一个选择项发生的事件(主要是数据交互)
         * @param itemHandlerListener
         */
        public void setItemHandlerListener(DefinedCommonMultiSelectEvent itemHandlerListener) {
            this.itemHandlerListener = itemHandlerListener;
        }
    
        public void setLinkageMultiSelectEvent(DefinedFormSearchAddLinkageMultiSelectEvent linkageMultiSelectEvent) {
            this.linkageMultiSelectEvent = linkageMultiSelectEvent;
        }
    
        public void setFirsetSelectListener(Listener firsetSelectListener) {
            this.firsetSelectListener = firsetSelectListener;
        }
    
        public void setFirstDefaultSelectValueList(List<DropDownBox.Data> firstDefaultSelectValueList) {
            this.firstDefaultSelectValueList = firstDefaultSelectValueList;
        }
    
        public List<DropDownBox.Data> getSelectedList() {
            return selectedList;
        }
    
        /**
         * 设置删除整行的逻辑 其中event widget获取的是删除图标,通过删除图标获取第一个下拉框和第二个多选下拉框
         * @param deleteBtnListener
         */
        public void setDeleteBtnListener(Listener deleteBtnListener) {
            this.deleteBtnListener = deleteBtnListener;
        }
    
        public List<Composite> getAddRowCompositeList() {
            return addRowCompositeList;
        }
        public int getPagePerNum() {
            return pagePerNum;
        }
    
        public void setPagePerNum(int pagePerNum) {
            this.pagePerNum = pagePerNum;
        }
    
        public boolean isAsynchronous() {
            return asynchronous;
        }
        
        public void setAsynchronous(boolean asynchronous) {
            this.asynchronous = asynchronous;
        }
    
        public String getDefaultMultiSearchMentionHint() {
            return defaultMultiSearchMentionHint;
        }
    
        public void setDefaultMultiSearchMentionHint(String defaultMultiSearchMentionHint) {
            this.defaultMultiSearchMentionHint = defaultMultiSearchMentionHint;
        }
        
        public boolean isMultiInitEmpty() {
            return multiInitEmpty;
        }
    
        public void setMultiInitEmpty(boolean multiInitEmpty) {
            this.multiInitEmpty = multiInitEmpty;
        }
    
        public void setLinkEvent(StyleTextLink.StyleTextLinkEvent linkEvent) {
            this.linkEvent = linkEvent;
        }
    
        /**
         * 添加一行触发的事件
         * @param addRowListener event 中widget是行控件 Composite
         */
        public void setAddRowListener(Listener addRowListener) {
            this.addRowListener = addRowListener;
        }
    
        public int getMentionWidth() {
            return mentionWidth;
        }
        
        public void setMentionWidth(int mentionWidth) {
            this.mentionWidth = mentionWidth;
        }
    }

    4.3 带搜索功能的二级联动框

    package com.view.control.select;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.custom.CLabel;
    import org.eclipse.swt.custom.ScrolledComposite;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Shell;
    
    import com.global.constant.Constants;
    import com.util.CollectionUtil;
    import com.util.FileUtil;
    import com.util.StringUtil;
    import com.view.control.DefinedControl;
    import com.view.control.select.DefinedCommonSingleSelect.DefinedCommonSingleSelectEvent;
    import com.view.control.select.DropDownBox.Data;
    import com.view.swt.SWTResourceManager;
    import com.view.swt.StyleTextLink;
    import com.view.util.ImageUtil;
    
    /**
     * <p>添加联动二级多选框(有添加删除按钮)</p>
      * <p>
     *   第一级为单选框(可带搜索功能)<br>
     *   第二级为单选框(可带搜索功能)
     * </p>
     * <p>
     *   区分第一级拉框是否是带搜索功能,取决于firstSearchEvent 变量是否为null,不为null表示带搜索功能<br>
     *   区分第二级拉框是否是带搜索功能,取决于secondSearchEvent 变量是否为null,不为null表示带搜索功能<br>
     * </p>
     * <p>
     *   第一级下拉框可以通过 listener 方法 event的widget 使用getData("firstSelect") 获取下拉框本身<br>
     *   第二级下拉框可以通过 listener 方法 event的widget 使用getData("firstSelect") 获取第一个下拉框对象,通过getData("secondSelect")获取第二个下拉框本身<br>
     *   deleteBtnListener 通用event的widget使用getData("firstSelect") 获取第一个下拉框对象,通过getData("secondSelect")获取第二个下拉框
     * <p>
     * @version V1.0
     */
    public class DefinedFromAddLinkageSingleSelect extends DefinedControl {
    
        /****内容容器*****/
        private Composite addComposite;
        /****显示名称控件****/
        private CLabel name;
        /****选中内容显示的文本区域 + 下拉图标 总宽度(两级)****/
        private int chooseWidth = 323;
        private int chooseHeight = 32;
        /*****显示名称**********/
        private String nameText;
        /*****设置显示名称控件的宽度*****/
        private int nameWidth = 100;
        /****每个下拉框的中每行的宽度****/
        private int comboRowWidth;
        private int comboRowHeight = 0;
        private Label addImg ;
        /*****点击第二级下拉中的小删除按钮发生的额外事件*****/
        private Listener deleteBtnListener;
        /****联动事件*****/
        private DefinedFromAddLinkageSingleSelectEvent linkageSelectEvent;
        /****是否将value也显示在下拉框中,呈现效果为(display(value))****/
        private boolean showValue;
        private List<Composite> addRowCompositeList = new ArrayList<>();
        
        
        //****以下为第一级下拉框不带搜索功能需要使用的变量***************//
        /****第一级下拉框选择范围内容(若第一级下拉框带搜索功能,不需要传递该值,应实现搜索方法,通过搜索方法填充第一级下拉框选择范围)***/
        private List<DropDownBox.Data> firstSelectedList = new ArrayList<DropDownBox.Data>();
        //****结束**************/
        
        
        //****以下为第一级下拉框带搜索功能的用法*****//
        /***是否异步分页加载**/
        private boolean firstAsynchronous;
        /***搜索框中的默认提示*****/
        private String firstDefaultMultiSearchMentionHint;
        /**链接事件******/
        private StyleTextLink.StyleTextLinkEvent firstLinkEvent;
        private DefinedSearchSingleSelect.SearchSingleSelectEvent firstSearchEvent;
        // ************结束*********************//
        
        
        
        //*******第一级下拉框公用变量***********//
        /****第一级搜索框默认内容********/
        private List<DropDownBox.Data> firstDefaultSelectValueList;
        /****选中第一级搜索框触发的事件*******/
        private Listener firsetSelectListener;
        private DefinedCommonSingleSelectEvent firstDropdownBeforeEvent;
        // ************结束*********************//
        
        
        
        // ****以下为第二级下拉框带搜索功能的用法*****//
        /*** 是否异步分页加载 **/
        private boolean secondAsynchronous;
        /*** 搜索框中的默认提示 *****/
        private String secondDefaultMultiSearchMentionHint;
        /** 链接事件 ******/
        private StyleTextLink.StyleTextLinkEvent secondLinkEvent;
        private DefinedSearchSingleSelect.SearchSingleSelectEvent secondSearchEvent;
        // ************结束*********************//
        
        
        
        // *******第二级下拉框公用变量***********//
        /**** 选中第二级搜索框触发的事件 *******/
        private Listener secondSelectListener;
        private DefinedCommonSingleSelectEvent secondDropdownBeforeEvent;
        // ************结束*********************//
    
        public DefinedFromAddLinkageSingleSelect(Composite parent, String nameText, int chooseWidth,
                DefinedFromAddLinkageSingleSelectEvent linkageSelectEvent) {
            super(parent);
            this.nameText = nameText;
            this.comboRowWidth = chooseWidth / 2;
            this.chooseWidth = chooseWidth;
            this.linkageSelectEvent = linkageSelectEvent;
        }
        
        public DefinedFromAddLinkageSingleSelect(Composite parent, String nameText, int nameTextWidth, int chooseWidth,
                int chooseHeight, DefinedFromAddLinkageSingleSelectEvent linkageSelectEvent) {
            this(parent, nameText, chooseWidth, linkageSelectEvent);
            this.nameWidth = nameTextWidth;
            this.chooseHeight = chooseHeight;
        }
        
        @Override
        public void paint() {
            generateAddComposite(this.parent);
        }
        
        private void generateAddComposite(Composite contentComposite){
            /****显示添加一行(第一行24像素高,后面每一行 chooseHeight高)****/
            addComposite = new Composite(contentComposite,SWT.NONE);
            GridData gd_addComposite = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
            addComposite.setLayoutData(gd_addComposite);
            GridLayout gl_addComposite = new GridLayout(2,false);
            gl_addComposite.horizontalSpacing = 5;
            gl_addComposite.verticalSpacing = 15;
            gl_addComposite.marginHeight = 0;
            gl_addComposite.marginWidth = 0;
            addComposite.setLayout(gl_addComposite);
            addComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            name = new CLabel(addComposite,SWT.NONE);
            GridData gd_addLabel = new GridData(SWT.RIGHT, SWT.FILL, false, false, 1, 1);
            gd_addLabel.widthHint = this.nameWidth;
            gd_addLabel.heightHint = 20;
            name.setLayoutData(gd_addLabel);
            name.setAlignment(SWT.RIGHT);
            name.setText(this.nameText);
            name.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            name.setForeground(SWTResourceManager.getColor(51,51,51));
            
            addImg = new Label(addComposite,SWT.NONE);
            GridData gd_addImg = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1);
            gd_addImg.widthHint = 24;
            gd_addImg.heightHint = 24;
            addImg.setLayoutData(gd_addImg);
            addImg.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.ADD_ICON)));
            addImg.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            addImg.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            addImg.addListener(SWT.MouseDown, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    generateAddRowComposite(addComposite,null);
                    reLayout();
                }
            });
            
            if(CollectionUtil.isNotEmpty(firstDefaultSelectValueList)){
                for(DropDownBox.Data firstDefaultSelectValue:firstDefaultSelectValueList){
                    generateAddRowComposite(addComposite,firstDefaultSelectValue);
                }
            }
            reLayout();
        }
        
        /**
         * 绘制每行联动下拉框
         * @param contentComposite
         * @param defaultValue
         */
        private void generateAddRowComposite(Composite contentComposite,DropDownBox.Data defaultValue){
            Composite addRowComposite = new Composite(contentComposite,SWT.NONE);
            GridData gd_addRowComposite = new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1);
            gd_addRowComposite.heightHint = this.chooseHeight;
            addRowComposite.setLayoutData(gd_addRowComposite);
            
            GridLayout gl_addRowComposite = new GridLayout(5,false);
            gl_addRowComposite.horizontalSpacing = 5;
            gl_addRowComposite.verticalSpacing = 0;
            gl_addRowComposite.marginHeight = 0;
            gl_addRowComposite.marginWidth = 0;
            addRowComposite.setLayout(gl_addRowComposite);
            addRowComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            CLabel emptyLabel = new CLabel(addRowComposite,SWT.NONE);
            GridData gd_addLabel = new GridData(SWT.RIGHT, SWT.FILL, false, true, 1, 1);
            gd_addLabel.widthHint = this.nameWidth;
            emptyLabel.setLayoutData(gd_addLabel);
            emptyLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            
            //开始生成第一级下拉框对象
            DropDownBox<DropDownBox.Data> firstSelector = null;
            if(this.firstSearchEvent != null){
                //第一级下拉框带搜索功能
                DefinedSearchSingleSelect searchFirstSelector =  new DefinedSearchSingleSelect(addRowComposite,this.firstSearchEvent,this.chooseWidth /2,this.chooseHeight,showValue);
                if(null != defaultValue){
                    searchFirstSelector.setDefaultValue(defaultValue);
                }
                if(StringUtil.isNotNullAndEmpty(this.firstDefaultMultiSearchMentionHint)){
                    searchFirstSelector.setDefaultMentionHint(firstDefaultMultiSearchMentionHint);
                }
                searchFirstSelector.setAsynchronous(this.firstAsynchronous);
                searchFirstSelector.setLinkEvent(this.firstLinkEvent);
                if(null != this.firstDropdownBeforeEvent){
                    searchFirstSelector.setDropdownBeforeEvent(this.firstDropdownBeforeEvent);
                }
                searchFirstSelector.addSelectListener(event->{
                    CLabel itemLabel = (CLabel)event.widget;
                    itemLabel.setData("firstSelect", searchFirstSelector);
                });
                firstSelector = searchFirstSelector;
            }else{
                //第一级下拉框不带搜索功能
                DefinedSingleSelect noSearchFirstSelector = new DefinedSingleSelect(addRowComposite,this.firstSelectedList,this.chooseWidth /2,this.chooseHeight,showValue);
                if(null != defaultValue){
                    noSearchFirstSelector.setDefaultValue(defaultValue);
                }
                if(null != this.firstDropdownBeforeEvent){
                    noSearchFirstSelector.setDropdownBeforeEvent(this.firstDropdownBeforeEvent);
                }
                noSearchFirstSelector.addSelectListener(event->{
                    CLabel itemLabel = (CLabel)event.widget;
                    itemLabel.setData("firstSelect", noSearchFirstSelector);
                });
                firstSelector = noSearchFirstSelector;
            }
            
            DropDownBox.Data secondDefaultValue = null;
            if(null != defaultValue){
                secondDefaultValue = linkageSelectEvent.getSecondDefaultValue(defaultValue);
            }
            DropDownBox<DropDownBox.Data> secondSelector = null;
            //定义第二个下拉框
            if(this.secondSearchEvent != null){
                //带搜索功能
                DefinedSearchSingleSelect searchSecondSelector =  new DefinedSearchSingleSelect(addRowComposite,this.secondSearchEvent,this.chooseWidth /2,this.chooseHeight,showValue);
                if(null != secondDefaultValue){
                    searchSecondSelector.setDefaultValue(secondDefaultValue);
                }
                searchSecondSelector.getContentText().setData("secondSelect", secondSelector);
                searchSecondSelector.getContentText().setData("firstSelect", firstSelector);
                if(StringUtil.isNotNullAndEmpty(this.secondDefaultMultiSearchMentionHint)){
                    searchSecondSelector.setDefaultMentionHint(secondDefaultMultiSearchMentionHint);
                }
                searchSecondSelector.setAsynchronous(this.secondAsynchronous);
                searchSecondSelector.setLinkEvent(this.secondLinkEvent);
                if(null != this.secondDropdownBeforeEvent){
                    searchSecondSelector.setDropdownBeforeEvent(this.secondDropdownBeforeEvent);
                }
                firstSelector.addSelectListener(event->{
                    CLabel itemLabel = (CLabel)event.widget;
                    DropDownBox.Data data = (Data)itemLabel.getData("data");
                    searchSecondSelector.replaceSearchExternalFilter(data.getValue(), 0);
                    searchSecondSelector.setInitEmpty(false);
                });
                searchSecondSelector.addSelectListener(event->{
                    CLabel itemLabel = (CLabel)event.widget;
                    itemLabel.setData("firstSelect", searchSecondSelector.getContentComposite().getData("firstSelect"));
                    itemLabel.setData("secondSelect", searchSecondSelector);
                });
                secondSelector = searchSecondSelector;
            }else{
                //不带搜索功能
                List<DropDownBox.Data> secondDataList = new ArrayList<>();
                if(null != defaultValue){
                    secondDataList = linkageSelectEvent.getSecondData(defaultValue);
                }
                DefinedSingleSelect noSearchSecondSelector = new DefinedSingleSelect(addRowComposite,secondDataList,this.chooseWidth /2,this.chooseHeight,showValue);
                if(null != secondDefaultValue){
                    noSearchSecondSelector.setDefaultValue(secondDefaultValue);
                }
                if(null != this.secondDropdownBeforeEvent){
                    noSearchSecondSelector.setDropdownBeforeEvent(this.secondDropdownBeforeEvent);
                }
                secondSelector = noSearchSecondSelector;
                firstSelector.addSelectListener(event->{
                    CLabel itemLabel = (CLabel)event.widget;
                    DropDownBox.Data data = (Data)itemLabel.getData("data");
                    List<DropDownBox.Data> secondList = this.linkageSelectEvent.getSecondData(data);
                    noSearchSecondSelector.setComboDataList(secondList);
                });
                noSearchSecondSelector.addSelectListener(event->{
                    CLabel itemLabel = (CLabel)event.widget;
                    itemLabel.setData("firstSelect", noSearchSecondSelector.getContentComposite().getData("firstSelect"));
                    itemLabel.setData("secondSelect", noSearchSecondSelector);
                });
            }
    
            if(this.comboRowWidth != 0){
                firstSelector.setComboRowWidth(this.comboRowWidth );
                secondSelector.setComboRowWidth(this.comboRowWidth );
            }
            if(this.comboRowHeight != 0){
                firstSelector.setComboRowHeight(this.comboRowHeight);
                secondSelector.setComboRowHeight(this.comboRowHeight);
            }
    
            if(null != firsetSelectListener){
                firstSelector.addSelectListener(firsetSelectListener);
            }
            if(null != secondSelectListener){
                secondSelector.addSelectListener(secondSelectListener);
            }
    
            firstSelector.paint();
            secondSelector.paint();
            firstSelector.getContentComposite().setData("firstSelect", firstSelector);
            secondSelector.getContentComposite().setData("firstSelect", firstSelector);
            secondSelector.getContentComposite().setData("secondSelect", secondSelector);
            
            Label deleteImg = new Label(addRowComposite,SWT.NONE);
            GridData gd_deleteImg = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1);
            gd_deleteImg.widthHint = 24;
            gd_deleteImg.heightHint = 24;
            deleteImg.setLayoutData(gd_deleteImg);
            deleteImg.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.DELETE_ICON)));
            deleteImg.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            deleteImg.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            deleteImg.setData("secondSelect", secondSelector);   //将第二下拉框绑定到删除图标上
            deleteImg.setData("firstSelect", firstSelector);   //将第一个下拉框绑定到删除图标上
            if(this.deleteBtnListener != null){
                deleteImg.addListener(SWT.MouseDown,this.deleteBtnListener);
            }
            deleteImg.addListener(SWT.MouseDown, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    addRowComposite.dispose();
                    addRowCompositeList.remove(addRowComposite);
                    reLayout();
                }
            });
            
            addRowComposite.setData("firstSelect", firstSelector);
            addRowComposite.setData("secondSelect", secondSelector);
            
            Label mentionLabel = new Label(addRowComposite,SWT.WRAP);
            GridData gd_mention = new GridData(SWT.LEFT, SWT.CENTER, false, true, 1, 1);
            Rectangle bounds = contentComposite.getBounds();
            if(bounds.width == 0){
                bounds = contentComposite.getParent().getParent().getBounds();
            }
            gd_mention.widthHint = bounds.width - this.nameWidth - this.chooseWidth -24-15;
            mentionLabel.setLayoutData(gd_mention);
            mentionLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            mentionLabel.setForeground(SWTResourceManager.getColor(51,51,51));
            addRowComposite.layout(true);
            addRowCompositeList.add(addRowComposite);
        }
        
        private void reLayout(){
            Composite contentComposite = addComposite;
            while(contentComposite != this.parent){
                contentComposite.layout(true);
                contentComposite = contentComposite.getParent();
            }
            contentComposite.layout(true);
            Composite parentComposite = contentComposite.getParent();
            while(!(parentComposite instanceof ScrolledComposite) && !(parentComposite instanceof Shell)){
                parentComposite.layout(true);
                contentComposite = parentComposite;
                parentComposite = parentComposite.getParent();
            }
            if(parentComposite instanceof ScrolledComposite){
                ((ScrolledComposite)parentComposite).setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
            }
        }
        
        /**
         * <p>联动事件</p>
         * @version V1.0
         */
        public interface DefinedFromAddLinkageSingleSelectEvent{
            /*****根据第一个下拉框选择的内容动态生成第二个框选择的内容(仅在第二个下拉框不带搜索功能时需要实现该方法)******/
            List<DropDownBox.Data> getSecondData(DropDownBox.Data firstValue);
            /*****根据第一个获取其默认已经配置的内容*****/
            DropDownBox.Data getSecondDefaultValue(DropDownBox.Data firstValue);
        }
    
        public int getChooseWidth() {
            return chooseWidth;
        }
    
        public void setChooseWidth(int chooseWidth) {
            this.chooseWidth = chooseWidth;
        }
    
        public int getChooseHeight() {
            return chooseHeight;
        }
    
        public void setChooseHeight(int chooseHeight) {
            this.chooseHeight = chooseHeight;
        }
    
        public int getNameWidth() {
            return nameWidth;
        }
    
        public void setNameWidth(int nameWidth) {
            this.nameWidth = nameWidth;
        }
    
        public int getComboRowWidth() {
            return comboRowWidth;
        }
    
        public void setComboRowWidth(int comboRowWidth) {
            this.comboRowWidth = comboRowWidth;
        }
    
        public int getComboRowHeight() {
            return comboRowHeight;
        }
    
        public void setComboRowHeight(int comboRowHeight) {
            this.comboRowHeight = comboRowHeight;
        }
    
        public boolean isShowValue() {
            return showValue;
        }
    
        public void setShowValue(boolean showValue) {
            this.showValue = showValue;
        }
    
        public List<DropDownBox.Data> getFirstSelectedList() {
            return firstSelectedList;
        }
    
        public void setFirstSelectedList(List<DropDownBox.Data> firstSelectedList) {
            this.firstSelectedList = firstSelectedList;
        }
    
        public boolean isFirstAsynchronous() {
            return firstAsynchronous;
        }
    
        public void setFirstAsynchronous(boolean firstAsynchronous) {
            this.firstAsynchronous = firstAsynchronous;
        }
    
        public String getFirstDefaultMultiSearchMentionHint() {
            return firstDefaultMultiSearchMentionHint;
        }
    
        public void setFirstDefaultMultiSearchMentionHint(String firstDefaultMultiSearchMentionHint) {
            this.firstDefaultMultiSearchMentionHint = firstDefaultMultiSearchMentionHint;
        }
    
        public List<DropDownBox.Data> getFirstDefaultSelectValueList() {
            return firstDefaultSelectValueList;
        }
    
        public void setFirstDefaultSelectValueList(List<DropDownBox.Data> firstDefaultSelectValueList) {
            this.firstDefaultSelectValueList = firstDefaultSelectValueList;
        }
    
        public boolean isSecondAsynchronous() {
            return secondAsynchronous;
        }
    
        public void setSecondAsynchronous(boolean secondAsynchronous) {
            this.secondAsynchronous = secondAsynchronous;
        }
    
        public String getSecondDefaultMultiSearchMentionHint() {
            return secondDefaultMultiSearchMentionHint;
        }
        
        public void setSecondDefaultMultiSearchMentionHint(String secondDefaultMultiSearchMentionHint) {
            this.secondDefaultMultiSearchMentionHint = secondDefaultMultiSearchMentionHint;
        }
    
        public Listener getSecondSelectListener() {
            return secondSelectListener;
        }
    
        public void setSecondSelectListener(Listener secondSelectListener) {
            this.secondSelectListener = secondSelectListener;
        }
    
        public void setNameText(String nameText) {
            this.nameText = nameText;
        }
    
        public void setDeleteBtnListener(Listener deleteBtnListener) {
            this.deleteBtnListener = deleteBtnListener;
        }
    
        public void setLinkageSelectEvent(DefinedFromAddLinkageSingleSelectEvent linkageSelectEvent) {
            this.linkageSelectEvent = linkageSelectEvent;
        }
    
        public void setFirstLinkEvent(StyleTextLink.StyleTextLinkEvent firstLinkEvent) {
            this.firstLinkEvent = firstLinkEvent;
        }
    
        public void setFirstSearchEvent(DefinedSearchSingleSelect.SearchSingleSelectEvent firstSearchEvent) {
            this.firstSearchEvent = firstSearchEvent;
        }
    
        public void setFirsetSelectListener(Listener firsetSelectListener) {
            this.firsetSelectListener = firsetSelectListener;
        }
    
        public void setFirstDropdownBeforeEvent(DefinedCommonSingleSelectEvent firstDropdownBeforeEvent) {
            this.firstDropdownBeforeEvent = firstDropdownBeforeEvent;
        }
    
        public void setSecondLinkEvent(StyleTextLink.StyleTextLinkEvent secondLinkEvent) {
            this.secondLinkEvent = secondLinkEvent;
        }
    
        public void setSecondSearchEvent(DefinedSearchSingleSelect.SearchSingleSelectEvent secondSearchEvent) {
            this.secondSearchEvent = secondSearchEvent;
        }
    
        public void setSecondDropdownBeforeEvent(DefinedCommonSingleSelectEvent secondDropdownBeforeEvent) {
            this.secondDropdownBeforeEvent = secondDropdownBeforeEvent;
        }
        public List<Composite> getAddRowCompositeList() {
            return addRowCompositeList;
        }
    }

    4.4

    package com.view.control.select;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Listener;
    
    import com.view.control.DefinedControl;
    
    /**
     * <p>二级联动下拉框</p>
     * @version V1.0
     */
    public class DefinedSelectedLingageSelector extends DefinedControl{
        /****内容容器*****/
        private Composite contentComposite;
        private DefinedSingleSelect selectFirst;
        private DefinedSingleSelect selectSecond;
        /****第一级下拉框选项所有内容******/
        private List<DropDownBox.Data> comboDataList; 
        private int firstComboWidth;
        private int comboRowWidth;
        private int contentWidth = 323;
        private int contentHeight = 32;
        private Listener firstSelectListener;
        private Listener secondSelectListener;
        private DropDownBox.Data defaultValue;
        private SecondSelectorGenerator secondSelectorGenerator;
        private DropDownBox.Data secondDefaultValue;
        
        
        public DefinedSelectedLingageSelector(Composite parent,List<DropDownBox.Data> comboDataList,int comboRowWidth,int firstComboWidth,SecondSelectorGenerator secondSelectorGenerator) {
            super(parent);
            this.comboDataList = comboDataList;
            this.comboRowWidth = comboRowWidth;
            this.firstComboWidth = firstComboWidth;
            this.secondSelectorGenerator = secondSelectorGenerator;
        }
        
        @Override
        public void paint() {
            contentComposite = new Composite(this.parent,SWT.NONE);
            contentComposite.setBounds(0, 0, contentWidth, contentHeight);
            GridLayout gl_contentComposite = new GridLayout(2,false);
            gl_contentComposite.horizontalSpacing = 5;
            gl_contentComposite.verticalSpacing = 0;
            gl_contentComposite.marginHeight = 0;
            contentComposite.setLayout(gl_contentComposite);
            
            selectFirst = new DefinedSingleSelect(contentComposite, comboDataList, comboRowWidth, this.contentHeight);
            List<DropDownBox.Data> secondDataList = new ArrayList<DropDownBox.Data>();
            if(null != defaultValue){
                selectFirst.setDefaultValue(defaultValue);
                secondDataList = secondSelectorGenerator.getSecondSelectorData(defaultValue.getValue());
            }
            selectFirst.addSelectListener(new Listener(){
                @Override
                public void handleEvent(Event event) {
                    changeSecondSelect(selectFirst.getValue());
                }
            });
            if(this.firstSelectListener != null){
                selectFirst.addSelectListener(this.firstSelectListener);
            }
            selectFirst.paint();
    
            Composite secondSelectComposite = new Composite(contentComposite,SWT.NONE);
            GridData gd_secondSelectComposite = new GridData(SWT.LEFT, SWT.FILL, false, true, 1, 1);
            gd_secondSelectComposite.widthHint = this.contentWidth - this.firstComboWidth - 5;
            secondSelectComposite.setLayoutData(gd_secondSelectComposite);
            selectSecond = new DefinedSingleSelect(secondSelectComposite, secondDataList, this.contentWidth - this.firstComboWidth - 5, this.contentHeight);
            if(null != secondDefaultValue){
                selectSecond.setDefaultValue(secondDefaultValue);
            }
            if(this.secondSelectListener != null){
                selectFirst.addSelectListener(this.secondSelectListener);
            }
            selectSecond.paint();
        }
        
        private void changeSecondSelect(String defaultValue){
            List<DropDownBox.Data> secondDataList = secondSelectorGenerator.getSecondSelectorData(defaultValue);
            selectSecond.setComboDataList(secondDataList);
        }
    
        public static interface SecondSelectorGenerator{
            List<DropDownBox.Data> getSecondSelectorData(String firstValue);
        }
        
        public int getFirstComboWidth() {
            return firstComboWidth;
        }
        
        public void setFirstComboWidth(int firstComboWidth) {
            this.firstComboWidth = firstComboWidth;
        }
        
        public int getComboRowWidth() {
            return comboRowWidth;
        }
        
        public void setComboRowWidth(int comboRowWidth) {
            this.comboRowWidth = comboRowWidth;
        }
        
        public int getContentWidth() {
            return contentWidth;
        }
        
        public void setContentWidth(int contentWidth) {
            this.contentWidth = contentWidth;
        }
    
        public int getContentHeight() {
            return contentHeight;
        }
        
        public void setContentHeight(int contentHeight) {
            this.contentHeight = contentHeight;
        }
        
        public Composite getContentComposite() {
            return contentComposite;
        }
        
        public DefinedSingleSelect getSelectFirst() {
            return selectFirst;
        }
        
        public DefinedSingleSelect getSelectSecond() {
            return selectSecond;
        }
        
        public void setFirstSelectListener(Listener firstSelectListener) {
            this.firstSelectListener = firstSelectListener;
        }
        
        public void setSecondSelectListener(Listener secondSelectListener) {
            this.secondSelectListener = secondSelectListener;
        }
        
        public void setDefaultValue(DropDownBox.Data defaultValue) {
            this.defaultValue = defaultValue;
        }
        
        public void setSecondSelectorGenerator(SecondSelectorGenerator secondSelectorGenerator) {
            this.secondSelectorGenerator = secondSelectorGenerator;
        }
    
        public void setSecondDefaultValue(DropDownBox.Data secondDefaultValue) {
            this.secondDefaultValue = secondDefaultValue;
        }
    }

    4.5

    package com.view.control.select;
    
    import java.util.List;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Listener;
    
    import com.view.control.DefinedControl;
    import com.view.control.DefinedText;
    import com.view.swt.SWTResourceManager;
    import com.view.swt.SWTUtil;
    
    /**
     * <p>选择联动编辑框(parent可以不是GridLayout布局)</p>
     * @version V1.0
     */
    public class DefinedSelectedLinkageEditor extends DefinedControl{
        /****内容容器*****/
        private Composite contentComposite;
        private DefinedSingleSelect selectFirst;
        /****编辑框*****/
        private DefinedText editor;
        private int contentWidth = 323;
        /****选择下拉框内容显示的Label的宽度,那么编辑框的宽度为 contentWidth - comboWidth*****/
        private int comboWidth = 100;
        /**********/
        private int contentHeight = 32;
        /*****编辑框中默认显示的内容*****/
        private String defaultTextMention;
        /*****下拉选择默认选择的值****/
        private DropDownBox.Data defaultComoValue;
        /*****编辑框中默认值*******/
        private String defaultTextValue;
        private List<DropDownBox.Data> comboDataList; 
        private int comboRowWidth;
        /***选中第一个下拉框第一个值发生的事件*****/
        private Listener firstSelectItemListener;
        
        
        public DefinedSelectedLinkageEditor(Composite parent, List<DropDownBox.Data> comboDataList, int comboRowWidth) {
            super(parent);
            this.comboDataList = comboDataList;
            this.comboRowWidth = comboRowWidth;
        }
        
        public DefinedSelectedLinkageEditor(Composite parent,List<DropDownBox.Data> comboDataList,int contentWidth,int comboWidth,int contentHeight) {
            this(parent,comboDataList,comboWidth);
            this.comboWidth = comboWidth;
            this.contentWidth = contentWidth;
            this.contentHeight = contentHeight;
        }
        
        @Override
        public void paint(){
            contentComposite = new Composite(this.parent,SWT.NONE);
            contentComposite.setBounds(0, 0, this.contentWidth, this.contentHeight);
            SWTUtil.paintBorder(contentComposite, SWTResourceManager.getControlBorderColor());
            contentComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            GridLayout gl_contentComposite = new GridLayout(2,false);
            gl_contentComposite.horizontalSpacing = 0;
            gl_contentComposite.verticalSpacing = 0;
            gl_contentComposite.marginHeight = 0;
            gl_contentComposite.marginWidth = 0;
            contentComposite.setLayout(gl_contentComposite);
            
            selectFirst = new DefinedSingleSelect(contentComposite,this.comboDataList,this.comboWidth,this.contentHeight);
            if(null != this.defaultComoValue){
                selectFirst.setDefaultValue(this.defaultComoValue);
            }
            selectFirst.setComboRowWidth(comboRowWidth);
            selectFirst.addSelectListener(new Listener(){
                @Override
                public void handleEvent(Event event) {
                    editor.getContentText().setText("");
                }
            });
            if(null != firstSelectItemListener){
                selectFirst.addSelectListener(firstSelectItemListener);
            }
            selectFirst.paint();
            
            Composite composite = new Composite(contentComposite,SWT.NONE);
            GridData gd_composite = new GridData(SWT.RIGHT, SWT.FILL, false, true, 1, 1);
            gd_composite.widthHint = this.contentWidth - this.comboWidth;
            composite.setLayoutData(gd_composite);
            editor = new DefinedText(composite,SWT.NONE);
            editor.setTextHeight(this.contentHeight);
            editor.setTextWidth(this.contentWidth - this.comboWidth);
            editor.setDefalutValue(this.defaultTextValue);
            editor.setDefaultTextMention(defaultTextMention);
            editor.paint();
            
            contentComposite.layout(true);
        }
    
        public int getComboWidth() {
            return comboWidth;
        }
    
        public void setComboWidth(int comboWidth) {
            this.comboWidth = comboWidth;
        }
    
        public int getComboRowWidth() {
            return comboRowWidth;
        }
    
        public void setComboRowWidth(int comboRowWidth) {
            this.comboRowWidth = comboRowWidth;
        }
    
        public DefinedSingleSelect getSelectFirst() {
            return selectFirst;
        }
    
        public DefinedText getEditor() {
            return editor;
        }
    
        public void setContentWidth(int contentWidth) {
            this.contentWidth = contentWidth;
        }
    
        public void setContentHeight(int contentHeight) {
            this.contentHeight = contentHeight;
        }
    
        public void setDefaultTextMention(String defaultTextMention) {
            this.defaultTextMention = defaultTextMention;
        }
    
        public void setDefaultComoValue(DropDownBox.Data defaultComoValue) {
            this.defaultComoValue = defaultComoValue;
        }
        public void setDefaultComoValue(String defaultComoValue) {
            this.defaultComoValue = new DropDownBox.Data(defaultComoValue,defaultComoValue);
        }
    
        public void setDefaultTextValue(String defaultTextValue) {
            this.defaultTextValue = defaultTextValue;
        }
    
        public void setComboDataList(List<DropDownBox.Data> comboDataList) {
            this.comboDataList = comboDataList;
        }
        
        public void dispose(){
            this.contentComposite.dispose();
        }
    
        public void setFirstSelectItemListener(Listener firstSelectItemListener) {
            this.firstSelectItemListener = firstSelectItemListener;
        }
    }
  • 相关阅读:
    sql行列互转
    用户角色权限设计思路
    树节点类型数据的Datatable转Json
    [C#]最简单的Base64加密解密
    WEB打印控件Lodop(V6.x)使用说明及样例
    js代码 设为首页 加入收藏
    Json字符转化成对象
    C++函数返回值为const
    7.双指针(two pointer)
    线程同步与锁
  • 原文地址:https://www.cnblogs.com/sandyflower/p/9750129.html
Copyright © 2020-2023  润新知