自定义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;
}
}
自定义SWT控件四之其它下拉框的更多相关文章
- Android简易实战教程--第二十二话《自定义组合控件模拟qq登录下拉框和其中的一些”小技巧”》
转载此文章请注明出处:点击打开链接 http://blog.csdn.net/qq_32059827/article/details/52313516 首先,很荣幸此专栏能被CSDN推荐到主页.荣 ...
- GridControl控件绑定RepositoryItemImageComboBox 作为下拉框使用
如果,时间长时了,已前做过的东西,都记不得了,所以记录一下. 废话不多说. 1.拖出gridview控件,然后将字段绑定上去 2.将要做下拉框的控件加入RepositoryItemImageCombo ...
- devpress GridControl控件绑定RepositoryItemImageComboBox 作为下拉框使用 zt
1.拖出gridview控件,然后将字段绑定上去 2.将要做下拉框的控件加入RepositoryItemImageComboBox控件 3.绑定数据 ; i < ; i++) { //如果取值时 ...
- 安卓学习之--UI控件用法 单选 按钮 下拉框
1.单选 .RadioGroup 可将各自不同的RadioButton ,设限于同一个Radio 按钮组,同一个RadioGroup 组里的按钮,只能做出单一选择(单选题). <RadioGro ...
- 自定义SWT控件二之自定义多选下拉框
2.自定义下拉多选框 package com.view.control.select; import java.util.ArrayList; import java.util.HashMap; im ...
- 自定义SWT控件一之自定义单选下拉框
一.自定义下拉控件 自定义的下拉框,是自定义样式的,其中的下拉框使用的是独立的window,非复选框的下拉框双击单机其它区域或选择完之后,独立window构成的下拉框会自动消失. package co ...
- 自定义SWT控件三之搜索功能下拉框
3.搜索功能下拉弹出框 package com.view.control.select; import java.util.ArrayList; import java.util.LinkedList ...
- 吾八哥学Selenium(四):操作下拉框select标签的方法
我们在做web页面自动化测试的时候会经常遇到<select></select>标签的下拉框,那么在Python里如何实现去操作这种控件呢?今天就给大家分享一下这个玩法.为了让大 ...
- 自定义SWT控件六之自定义Tab
6.自定义tab 本章节提供的自定义tab 分为两类 tab上带删除按钮和添加按钮,可删除tab和添加tab tab不可删除和添加 6.1 不可删除tab package com.view.contr ...
随机推荐
- 微服务网关 Spring Cloud Gateway
1. 为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...
- CSS3 - vue中纯css实现柱状图表效果
背景 以前我们制作柱状图都用echarts或者其他同类型的图表插件 这次是个移动端的需求,而且这个图表需要动画 使用echarts就会显得过重,而且动画达不到我想要的效果(主要是我自己愚蠢想不到好的动 ...
- code forces 1176 D. Recover it!
原题链接:https://codeforces.com/contest/1176/problem/D 题目大意是 两个个数列 a , b 相同 ,如果 ai 是素数,那么b数列里添加上第ai个素数(2 ...
- .NET分布式框架 | Orleans 知多少
引言 公司物联网项目集成Orleans以支持高并发的分布式业务,对于Orleans也是第一次接触,本文就分享下个人对Orleans的理解. 这里先抛出自己的观点:Orleans 是一个支持有状态云生应 ...
- PLC_SIM 出现I/O访问错误-技术论坛-工业支持中心-西门子中国
PLC_SIM 作为SIEMENS S7-300/400 系列PLC 的仿真软件,在使用时需要有些注意事项,毕竟任何的仿真软件和真正的设备还是有一定差异的,由此而产生的误会经常会令很多客户摸不着头脑, ...
- Shiro中@RequiresAuthentication等等注解介绍
使用前请先开启Shiro的controller层注解,如果已经设置请下滑绕过 要在spring-mvc.xml中写. <!--下面的用于开启shiro的权限注解--> <bean c ...
- C++学习书籍推荐《C++ Primer 第四版》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++ Primer中文版(第4版)>对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使<C++ Primer中文版 ...
- 影音播放器 Daum Potplayer v1.7.14804 美化便携版
PotPlayer 是一款由世界老牌的著名多媒体影音播放器软件 KMPlayer 的原创作者姜龙喜先生进入韩国多音软件公司后开发的新一代多媒体播放器作品.前者的优势在于内置了功能强大的视频及音频解码器 ...
- JavaScript控制语句结构、函数部分
HTML页面代码: <html> <head> <meta charset="UTF-8"> <title>HelloWorld&l ...
- I/O:Reader
FileReader: /* 用来读取字符文件的便捷类.此类的构造方法假定默认字符编码和默认字节缓冲区大 小都是适当的.要自己指定这些值,可以先在 FileInputStream 上构造一个 Inpu ...