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

时间:2023-03-08 18:58:14

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;
}
}