SWT 中的拖放功能
来源:互联网 发布:淘宝子账号如何认证 编辑:程序博客网 时间:2024/04/29 02:26
最近在项目开发中需要对树(Tree)的层次结构进行调整,由于SWT是基于操作系统的事件模型的一种开发控件,所以想到利用鼠标的拖放功能对树的节点进行移动,即直观也提高了客户体验。
SWT的拖放功能的实现主要使用了DragSource、DropTarget这两个类,开发人员只需要实现其事件的接口,既可以对控件上的文本、HTML、RTF及附件进行拖放操作,即把一个控件上的文本、HTML、RTF及附件拖放到另一个控件。
Tree是由TreeItem控件组成,所以移动树节点就相当于移动TreeItem,这里并非真的移动控件,而是把源控件的信息(文本、HTML、RTF及附件)通过事件传递到目标控件,目标控件也是新创建的,如果不是复制而只是移动,则要把源控件销毁掉。
例子实现思路及源代码:本例子为左边是目标树,右边是用TabFolder实现了几棵源树,同时目标树本身也是源树,即实现多个源对单个目标进行操作。实现过程把几个源树放到了一个Tree[ ]集合里,用于分清源树到底是哪一棵,才能得到在源树上的选择的节点。本例的主要功能是:实现把其他源树的节点移动到某一个目标树上,同时实现目标树上的节点自由替换位置。
代码:
public class SetSubSWT extends Dialog ...{
protected Tree subtree;
protected Tree preTree;// 单位
protected Tree roomTree;// 科室
protected Table unitTable;// 科室
protected Display display;
protected Shell shell;
protected Tree tree;
protected List newList = new ArrayList();
protected List modifyList = new ArrayList();
protected List deleteList = new ArrayList();
protected Map map = new HashMap();
protected Map mapSave = new HashMap();
protected Object result;
protected SashForm mainSashForm;
protected TextTransfer textTransfer;
protected FileTransfer fileTransfer;
protected Tree[] eachTrees;
// protected TreeItem[] dragSourceItem;
protected int index;
protected Map dataMap;// 缓存
protected List typeList;// 缓存
protected Map relMap;// 缓存
/** *//**
* Create the dialog
*
* @param parent
* @param style
*/
public SetSubSWT(Shell parent, Tree subtree, Map dataMap, List typeList,
Map relMap, int style) ...{
super(parent, style);
this.subtree = subtree;
this.dataMap = dataMap;
this.typeList = typeList;
this.relMap = relMap;
}
// /**
// * Create the dialog
// * @param parent
// */
// public SetSubSWT(Shell parent) {
// this(parent, SWT.NONE);
// }
// /**
// * Launch the application
// *
// * @param args
// */
// public static void main(String[] args) {
// try {
// System.out.println("args[0]==" + args[0]);
// SWTDataViewUtil.httpUrl = args[0] + "/subactionswt.do?action=";
// SetSubSWT window = new SetSubSWT();
// window.open();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
/** *//**
* Open the window
*/
public Object open() ...{
display = getParent().getDisplay();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) ...{
if (!display.readAndDispatch())
display.sleep();
}
return result;
}
/** *//**
* Create contents of the window
*/
protected void createContents() ...{
shell = new Shell();
shell.setLayout(new FillLayout());
shell.setText("会计科目设置");
/**//*
* Transfer是一个可以提供数据在Java representation与platform specific
* representation 之间交互的抽象类.下面是几个format: TextTransfer String "hello
* world" RTFTransfer String "{/rtf1/b/i hello world}" FileTransfer
* String[] new String[] {file1.getAbsolutePath(),
* file2.getAbsolutePath()}
*
* TransferData包含了很多特定于平台的公用的属性,应用不应该直接去访问这些属性。
* 如果真的有必要去访问这些属性,那么我们可以通过扩展Transfer类来完成对特定平台的额外操作。
*/
textTransfer = TextTransfer.getInstance();
fileTransfer = FileTransfer.getInstance();
// final Color red = display.getSystemColor(SWT.COLOR_GREEN);
// final Color yellow = display.getSystemColor(SWT.COLOR_GRAY);
// tree.addListener(SWT.EraseItem, new Listener() {
// public void handleEvent(Event event) {
// if ((event.detail & SWT.SELECTED) == 0)
// return; /* item not selected */
// int clientWidth = tree.getClientArea().width;
// GC gc = event.gc;
// Color oldForeground = gc.getForeground();
// Color oldBackground = gc.getBackground();
// gc.setForeground(red);
// gc.setBackground(yellow);
// gc.fillGradientRectangle(0, event.y, clientWidth, event.height,
// false);
// gc.setForeground(oldForeground);
// gc.setBackground(oldBackground);
// event.detail &= ~SWT.SELECTED;
// }
// });
shell.setMaximized(true);
// Canvas canvas = new Canvas(shell, SWT.BORDER);
// canvas.setLayout(new FillLayout());
mainSashForm = new SashForm(shell, SWT.HORIZONTAL);
mainSashForm.setBackground(shell.getDisplay().getSystemColor(
SWT.COLOR_TITLE_BACKGROUND));
final Group leftGroup = new Group(mainSashForm, SWT.NONE | SWT.CENTER);
leftGroup.setText("会计科目");
leftGroup.setLayout(new FillLayout());
final TabFolder subtabFolder = new TabFolder(leftGroup, SWT.NONE);
final TabItem subtabItem = new TabItem(subtabFolder, SWT.NONE);
subtabItem.setText("会计科目");
tree = new Tree(subtabFolder, SWT.FULL_SELECTION);
tree.setLinesVisible(true);
addExistItems();
tree.addListener(SWT.Selection, new Listener() ...{
public void handleEvent(Event event) ...{
System.out
.println(tree.getSelection()[0].getData("SetSubData"));
}
});
subtabItem.setControl(tree);
Transfer[] types = new Transfer[] ...{ TextTransfer.getInstance() };
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
final DragSource treeSource = new DragSource(tree, operations);
treeSource.setTransfer(types);
treeSource.addDragListener(new DragSourceListener() ...{
public void dragStart(DragSourceEvent event) ...{
TreeItem[] selection = ((Tree) ((DragSource) event.widget)
.getControl()).getSelection();
// 只能移动选中并且为最子结点。
// if (selection.length > 0
// && selection[0].getItemCount() == 0) {// 选中并且为最子结点。
if (selection.length > 0) ...{
event.doit = true;
// int selectedCount = ((Tree) ((DragSource)
// event.widget)
// .getControl()).getSelection().length;
// dragSourceItem = new TreeItem[selectedCount];
// for (int i = 0; i < selectedCount; i++) {
// dragSourceItem[i] = selection[i];
// }
} else ...{
event.doit = false;
}
};
public void dragSetData(DragSourceEvent event) ...{
event.data = String.valueOf(typeList.size()); // 最后一个是保存左边树,用于移动节点位置用。;//
// *********
}
public void dragFinished(DragSourceEvent event) ...{
if (event.detail == DND.DROP_MOVE)
tree.getSelection()[0].dispose();
}
});
DropTarget leftTarget = new DropTarget(tree, operations);
leftTarget.setTransfer(types);
leftTarget.addDropListener(new DropTargetAdapter() ...{
public void dragOver(DropTargetEvent event) ...{
event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
if (event.item != null) ...{
TreeItem item = (TreeItem) event.item;
Point pt = display.map(null, tree, event.x, event.y);
Rectangle bounds = item.getBounds();
if (pt.y < bounds.y + bounds.height / 3) ...{
event.feedback |= DND.FEEDBACK_INSERT_BEFORE;
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
event.feedback |= DND.FEEDBACK_INSERT_AFTER;
} else ...{
event.feedback |= DND.FEEDBACK_SELECT;
}
}
}
public void drop(DropTargetEvent event) ...{
if (event.data == null) ...{
event.detail = DND.DROP_NONE;
return;
}
String treeIndex = (String) event.data;
TreeItem[] drogItems = eachTrees[Integer.parseInt(treeIndex)]
.getSelection();
System.out.println(drogItems.length);
// if (event.item == null) {
// TreeItem item = new TreeItem(tree, SWT.NONE);
// item.setText(text);
// } else
if (event.item != null) ...{// 把鼠标移到目标节点才能进行挂节点操作。
if (Integer.parseInt(treeIndex) != typeList.size()) ...{// 如果不是最后一颗树。
TreeItem item = (TreeItem) event.item;
Point pt = display.map(null, tree, event.x, event.y);
Rectangle bounds = item.getBounds();
TreeItem parent = item.getParentItem();
if (parent != null) ...{// 目标Tree有父结点时。
TreeItem[] items = parent.getItems();
int index = 0;
for (int i = 0; i < items.length; i++) ...{
if (items[i] == item) ...{
index = i;
break;
}
}
if (pt.y < bounds.y + bounds.height / 3) ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(parent,
SWT.NONE, index);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(parent,
SWT.NONE, index + 1);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
} else ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(item,
SWT.NONE);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
}
} else ...{// 目标Tree没有父结点时。
TreeItem[] items = tree.getItems();
int index = 0;
for (int i = 0; i < items.length; i++) ...{
if (items[i] == item) ...{
index = i;
break;
}
}
if (pt.y < bounds.y + bounds.height / 3) ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(tree,
SWT.NONE, index);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(tree,
SWT.NONE, index + 1);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
} else ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(item,
SWT.NONE);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
}
}
} else ...{// 如果是最后一颗树。
TreeItem drogItem = eachTrees[Integer
.parseInt(treeIndex)].getSelection()[0];
String text = drogItem.getText();
TreeItem item = (TreeItem) event.item;
Point pt = display.map(null, tree, event.x, event.y);
Rectangle bounds = item.getBounds();
TreeItem parent = item.getParentItem();
if (parent != null) ...{
TreeItem[] items = parent.getItems();
int index = 0;
for (int i = 0; i < items.length; i++) ...{
if (items[i] == item) ...{
index = i;
break;
}
}
if (pt.y < bounds.y + bounds.height / 3) ...{
TreeItem newItem = new TreeItem(parent,
SWT.NONE, index);
newItem.setText(text);
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
TreeItem newItem = new TreeItem(parent,
SWT.NONE, index + 1);
newItem.setText(text);
} else ...{
TreeItem newItem = new TreeItem(item, SWT.NONE);
newItem.setText(text);
}
} else ...{
TreeItem[] items = tree.getItems();
int index = 0;
for (int i = 0; i < items.length; i++) ...{
if (items[i] == item) ...{
index = i;
break;
}
}
if (pt.y < bounds.y + bounds.height / 3) ...{
TreeItem newItem = new TreeItem(tree, SWT.NONE,
index);
newItem.setText(text);
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
TreeItem newItem = new TreeItem(tree, SWT.NONE,
index + 1);
newItem.setText(text);
} else ...{
TreeItem newItem = new TreeItem(item, SWT.NONE);
newItem.setText(text);
}
}
}
}
}
private RelSubVO convertData(TreeItem drogItem, BaseDataVO baseVo) ...{
RelSubVO relVo = new RelSubVO();
String id = KeyGenerator.generateStringID();
relVo.setId(id);
relVo.setName(baseVo.getTitle());
relVo.setRelid(baseVo.getId());
relVo.setRelType(baseVo.getType());
RelSubVO data = (RelSubVO) drogItem.getData("SetSubData");
SubVO subVo = (SubVO) subtree.getSelection()[0].getData();
if (data == null) ...{
relVo.setPath("0,1");
relVo.setPid("1");
relVo.setType("0");
relVo.setSubid(subVo.getId());
relVo.setAsid("1001");
} else ...{
relVo.setAsid("1001");
relVo.setPath(data.getPath() + "," + data.getId());
relVo.setPid(data.getId());
data.setType("1");// 父的目录类型设为1,表示目录
// 如果是在newList 里面,而没有保存到数据库的,则仍在newList里。
if (!newList.contains(data)) ...{
if (modifyList.contains(data)) ...{
modifyList.remove(data);
}
modifyList.add(data);
}
relVo.setType("0");// 子的目录类型设为0,表示最子节点
relVo.setSubid(subVo.getId());
}
newList.add(relVo);// 每挂一次就在newList添加
return relVo;
}
});
final Group rightGroup = new Group(mainSashForm, SWT.NONE | SWT.CENTER);
rightGroup.setText("基础数据");
rightGroup.setLayout(new FillLayout());
final TabFolder tabFolder = new TabFolder(rightGroup, SWT.NONE);
addTabItems(tabFolder);
eachTrees[typeList.size()] = tree; // 最后一个是保存左边树,用于移动节点位置用。
tree.addTreeListener(new TreeListener() ...{
public void treeCollapsed(TreeEvent e) ...{
TreeItem item = (TreeItem) e.item;
// item.setImage(closeImg);
}
public void treeExpanded(TreeEvent e) ...{
TreeItem item = (TreeItem) e.item;
// item.setImage(openImg);
}
});
// tree.addListener(SWT.MeasureItem, new Listener() {
// public void handleEvent(Event event) {
// int clientWidth = tree.getClientArea().width;
// event.height = event.gc.getFontMetrics().getHeight() + 5;
// event.width = clientWidth;
// }
// });
//
Menu menu = new Menu(shell, SWT.POP_UP);
initMenuItems(menu);
tree.setMenu(menu);
// 将dropTable指定为Drop Target,
// DropTarget target=new
// DropTarget(tree,DND.DROP_MOVE|DND.DROP_COPY|DND.DROP_DEFAULT);
// target.setTransfer(new Transfer[] {textTransfer });
// target.addDropListener(new MyDropTargetListener());
final Menu toolBarMenu = new Menu(shell, SWT.BAR);
initMenuItems(toolBarMenu);
shell.setMenuBar(toolBarMenu);
mainSashForm.setWeights(new int[] ...{ 5, 5 });
}
private void addExistItems() ...{
TreeItem ti0 = new TreeItem(tree, SWT.NONE);
ti0.setText(subtree.getSelection()[0].getText());
SubVO pvo = (SubVO) subtree.getSelection()[0].getData();
pvo.setSublevel("0");
pvo.setSubpath("0");
pvo.setSubtype("1");// 默认是叶子,如果有子节点则变为1,1表示目录
ti0.setData(pvo);
map.put("1", ti0);
if (relMap == null) ...{
relMap = (Map) SWTDataViewUtil.parseObject(null, "loadRelSub");
}
if (relMap == null) ...{
return;
}
List relList = (List) relMap.get(pvo.getId());
if (relList == null) ...{
return;
}
for (int i = 0; i < relList.size(); i++) ...{
RelSubVO vo = (RelSubVO) relList.get(i);
TreeItem ti = new TreeItem((TreeItem) map.get(vo.getPid()),
SWT.NONE);
ti.setText(vo.getName());
ti.setData("SetSubData", vo);
ti.setExpanded(true);
if (vo.getType().equals("1")) ...{// 如果为目录
map.put(vo.getId(), ti);// 只保存有目录的节点,不保存无叶子节点的节点。
}
}
ti0.setExpanded(true);
}
private void addTabItems(TabFolder tabFolder) ...{
if (dataMap == null || typeList == null) ...{
dataMap = (Map) SWTDataViewUtil.parseObject(null, "getBaseDataMap");
typeList = (List) SWTDataViewUtil.parseObject(null, "getTypeList");
}
if (typeList == null)
return;
eachTrees = new Tree[typeList.size() + 1]; // 最后一个是保存左边树,用于移动节点位置用。
for (index = 0; index < typeList.size(); index++) ...{
LabelValue lv = (LabelValue) typeList.get(index);
List dataList = (List) dataMap.get(lv.getValue());
final TabItem tabPreItem = new TabItem(tabFolder, SWT.NONE);
tabPreItem.setText(lv.getLabel());
eachTrees[index] = new Tree(tabFolder, SWT.FULL_SELECTION
| SWT.MULTI);
eachTrees[index].setLinesVisible(true);
tabPreItem.setControl(eachTrees[index]);
// 将dragLabel指定为DragSource(一个widget只能帮定在一个DragSource),
// 并允许数据可以从DragSource被MOVE或COPY
// DragSource source=new
// DragSource(eachTree,DND.DROP_MOVE|DND.DROP_COPY);
// source.setTransfer(new Transfer[] { textTransfer });// 指定允许的传输类型
// source.addDragListener(new MyDragSourceListener());
Transfer[] types = new Transfer[] ...{ TextTransfer.getInstance() };
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
final DragSource rightSource = new DragSource(eachTrees[index],
operations);
rightSource.setTransfer(types);
rightSource.addDragListener(new DragSourceListener() ...{
public void dragStart(DragSourceEvent event) ...{
TreeItem[] selection = ((Tree) ((DragSource) event.widget)
.getControl()).getSelection();
// 只能移动选中并且为最子结点。
// if (selection.length > 0
// && selection[0].getItemCount() == 0) {// 选中并且为最子结点。
if (selection.length > 0) ...{
event.doit = true;
// int selectedCount = ((Tree) ((DragSource)
// event.widget)
// .getControl()).getSelection().length;
// dragSourceItem = new TreeItem[selectedCount];
// for (int i = 0; i < selectedCount; i++) {
// dragSourceItem[i] = selection[i];
// }
} else ...{
event.doit = false;
}
};
public void dragSetData(DragSourceEvent event) ...{
for (int i = 0; i < typeList.size(); i++) ...{// 获得哪颗树。
if (((Tree) ((DragSource) event.widget).getControl()) == eachTrees[i]) ...{
event.data = String.valueOf(i);// *********
return;
}
}
}
public void dragFinished(DragSourceEvent event) ...{
// if (event.detail == DND.DROP_MOVE)
// dragSourceItem[0].dispose();
// dragSourceItem = null;
}
});
addItems(eachTrees[index], dataList);
System.out.println(lv.getLabel() + "数据开始>>>>>>");
eachTrees[index].addListener(SWT.Selection, new Listener() ...{
public void handleEvent(Event event) ...{
if (event.detail == SWT.CHECK) ...{
TreeItem checkItem = (TreeItem) event.item;
System.out.println(checkItem.getData("baseData"));
if (checkItem != null) ...{
boolean ischeck = checkItem.getChecked();
if (checkItem.getItemCount() != 0) ...{
SWTCheckUtil.doChildCheck(checkItem, ischeck);
}
}
}
}
});
}
}
private void addItems(Tree eachTree, List dataList) ...{
Map itemMap = new HashMap();
if (dataList == null)
return;
for (int i = 0; i < dataList.size(); i++) ...{
BaseDataVO baseData = (BaseDataVO) dataList.get(i);
TreeItem ti = null;
if (itemMap.get(baseData.getPid()) == null) ...{
ti = new TreeItem(eachTree, SWT.NONE);
} else ...{
ti = new TreeItem((TreeItem) itemMap.get(baseData.getPid()),
SWT.NONE);
}
ti.setText(baseData.getTitle());
ti.setData("baseData", baseData);
ti.setExpanded(true);
if (baseData.getNodeType().equals("1")) ...{// 如果为目录
itemMap.put(baseData.getId(), ti);// 只保存有目录的节点,不保存无叶子节点的节点。
}
}
}
void initMenuItems(Menu menu) ...{
// 实现右键添加节点删除节点
// final MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
//
// menuItem.setText("(&N)挂在同级节点");
// menuItem.addListener(SWT.Selection, new Listener() {
// public void handleEvent(Event e) {
//
// SubVO svo = (SubVO) tree.getSelection()[0].getData();
// if (svo.getId() != "0") {
//
// // 如果多选,则在最前一个节点添加
// if (tree.getSelection().length == 0)
// return;
// TreeItem newItem;
// if (tree.getSelection()[0].getParentItem() == null) {
// newItem = new TreeItem(tree.getSelection()[0]
// .getParent(), SWT.NONE);
// } else {
// newItem = new TreeItem(tree.getSelection()[0]
// .getParentItem(), SWT.NONE);
// }
// newItem.setText(new String[] { "新增会计科目" });
// SubVO vo = new SubVO();
// vo.setAsid("1001");
// String id=KeyGenerator.generateStringID();
// vo.setId(id);
// SubVO pvo = (SubVO) newItem.getParentItem().getData();
//
// pvo.setSubtype("1");//把父节点记录为目录
// // 只要修改了VO属性,就要在modifyList里面替换新的VO.
//
// if(pvo.getId()!="0" && !modifyList.contains(pvo)&&
// !newList.contains(pvo)){
// modifyList.add(pvo);
// }
//
// vo.setSubpid(pvo.getId());
// vo.setSubtype("0");
// vo.setSubpath(pvo.getSubpath()+","+id);
// vo.setSubName("新增会计科目");
// System.out.println(vo.getSubName()+vo.getSubpath());
// newItem.setData(vo);
// tree.showItem(newItem);
// newList.add(vo);
// }
// }
// });
// final MenuItem newSubItem = new MenuItem(menu, SWT.PUSH);
// newSubItem.setText("(&M)挂在同级子节点");
// newSubItem.addListener(SWT.Selection, new Listener() {
// public void handleEvent(Event e) {
// // 如果多选,则在最前一个节点添加
// if (tree.getSelection().length == 0)
// return;
// TreeItem newItem = new TreeItem(tree.getSelection()[0],
// SWT.NONE);
// newItem.setText(new String[] { "新增子会计科目" });
// SubVO vo = new SubVO();
// vo.setAsid("1001");
// String id=KeyGenerator.generateStringID();
// vo.setId(id);
// SubVO pvo = (SubVO) newItem.getParentItem().getData();
// pvo.setSubtype("1");//把父节点记录为目录
//
// //只要修改了VO属性,就要在modifyList里面替换新的VO.
// if(pvo.getId()!="0" &&!modifyList.contains(pvo) &&
// !newList.contains(pvo)){
// modifyList.add(pvo);
// }
//
// vo.setSubpid(pvo.getId());
//
// vo.setSubtype("0");
// vo.setSubpath(pvo.getSubpath()+","+id);
// vo.setSubName("新增子会计科目");
// System.out.println(vo.getSubName()+vo.getSubpath());
// newItem.setData(vo);
// tree.showItem(newItem);
// newList.add(vo);
// }
// });
final MenuItem deleteItem = new MenuItem(menu, SWT.PUSH);
deleteItem.setText("(&D)删除节点");
deleteItem.addListener(SWT.Selection, new Listener() ...{
public void handleEvent(Event e) ...{
// 不是会计科目的,即挂上去的可以删除
delete();
}
});
// 添加分隔条
new MenuItem(menu, SWT.SEPARATOR);
final MenuItem saveAllItems = new MenuItem(menu, SWT.PUSH);
saveAllItems.setText("(&S)保存");
saveAllItems.addListener(SWT.Selection, new Listener() ...{
public void handleEvent(Event e) ...{
if (newList.size() > 0 || modifyList.size() > 0
|| deleteList.size() > 0) ...{
save();
}
}
});
// 弹出菜单时,控制按钮是否可用。
menu.addListener(SWT.Show, new Listener() ...{
public void handleEvent(Event arg0) ...{
if (newList.size() > 0 || modifyList.size() > 0
|| deleteList.size() > 0) ...{
saveAllItems.setEnabled(true);
} else ...{
saveAllItems.setEnabled(false);
}
}
});
}
/** *//**
* 删除
*
* 2006-9-21 下午03:16:56
*/
void delete() ...{
MessageBox mb = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK
| SWT.CANCEL);
mb.setText("是否删除?");
mb.setMessage("确认要删除该节点及所有叶子节点吗?");
int rc = mb.open();
if (rc == SWT.OK) ...{
TreeItem[] treeItems = tree.getSelection();
for (int i = 0; i < treeItems.length; i++) ...{
RelSubVO o = (RelSubVO) treeItems[i].getData("SetSubData");// 保存删除的ID到deleteList
if (!newList.contains(o)) ...{// 如果不是刚新增的条目,而是数据库中存在的。
deleteList.add(o);
delete(treeItems[i]);// 删除刚新增但没有保存到数据库中的。
} else ...{ // 如果是刚新增的条目,而没有保存到数据库中的,在newList中删除。
newList.remove(o);
delete(treeItems[i]);// 删除刚新增但没有保存到数据库中的。
}
treeItems[i].dispose();
// sum(null, 3);
}
}
}
// 递归删除方法。
void delete(TreeItem item) ...{
TreeItem[] treeItems = item.getItems();
if (treeItems.length == 0) ...{
return;
}
for (int i = 0; i < treeItems.length; i++) ...{
delete(treeItems[i]);
if (newList.contains(treeItems[i].getData("SetSubData"))) ...{
newList.remove(treeItems[i].getData("SetSubData"));
} else ...{
deleteList.add(treeItems[i].getData("SetSubData"));
}
treeItems[i].dispose();
}
}
/** *//**
* 保存数据。newList, modifyList , deleteList
*/
private void save() ...{
System.out.println("newList::" + newList.size());
for (int i = 0; i < newList.size(); i++) ...{
RelSubVO vo = (RelSubVO) newList.get(i);
System.out.println("new vo::" + vo.getId() + " " + vo.getName()
+ " " + vo.getPath());
}
System.out.println("modifyList::" + modifyList.size());
for (int i = 0; i < modifyList.size(); i++) ...{
RelSubVO vo = (RelSubVO) modifyList.get(i);
System.out.println("new vo::" + vo.getId() + " " + vo.getName()
+ " " + vo.getPath());
}
System.out.println("deleteList::" + deleteList.size());
for (int i = 0; i < deleteList.size(); i++) ...{
RelSubVO vo = (RelSubVO) deleteList.get(i);
System.out.println("new vo::" + vo.getId() + " " + vo.getName()
+ " " + vo.getPath());
}
mapSave.put("newList", newList);
mapSave.put("modifyList", modifyList);
mapSave.put("deleteList", deleteList);
Object obj = SWTDataViewUtil.parseObject(mapSave, "saveRelSub");
MessageBox mb = new MessageBox(shell, SWT.OK);
mb.setText("提示");
if (obj != null)
mb.setMessage((String) obj);
mb.open();
newList.clear();
modifyList.clear();
deleteList.clear();
}
}
protected Tree subtree;
protected Tree preTree;// 单位
protected Tree roomTree;// 科室
protected Table unitTable;// 科室
protected Display display;
protected Shell shell;
protected Tree tree;
protected List newList = new ArrayList();
protected List modifyList = new ArrayList();
protected List deleteList = new ArrayList();
protected Map map = new HashMap();
protected Map mapSave = new HashMap();
protected Object result;
protected SashForm mainSashForm;
protected TextTransfer textTransfer;
protected FileTransfer fileTransfer;
protected Tree[] eachTrees;
// protected TreeItem[] dragSourceItem;
protected int index;
protected Map dataMap;// 缓存
protected List typeList;// 缓存
protected Map relMap;// 缓存
/** *//**
* Create the dialog
*
* @param parent
* @param style
*/
public SetSubSWT(Shell parent, Tree subtree, Map dataMap, List typeList,
Map relMap, int style) ...{
super(parent, style);
this.subtree = subtree;
this.dataMap = dataMap;
this.typeList = typeList;
this.relMap = relMap;
}
// /**
// * Create the dialog
// * @param parent
// */
// public SetSubSWT(Shell parent) {
// this(parent, SWT.NONE);
// }
// /**
// * Launch the application
// *
// * @param args
// */
// public static void main(String[] args) {
// try {
// System.out.println("args[0]==" + args[0]);
// SWTDataViewUtil.httpUrl = args[0] + "/subactionswt.do?action=";
// SetSubSWT window = new SetSubSWT();
// window.open();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
/** *//**
* Open the window
*/
public Object open() ...{
display = getParent().getDisplay();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) ...{
if (!display.readAndDispatch())
display.sleep();
}
return result;
}
/** *//**
* Create contents of the window
*/
protected void createContents() ...{
shell = new Shell();
shell.setLayout(new FillLayout());
shell.setText("会计科目设置");
/**//*
* Transfer是一个可以提供数据在Java representation与platform specific
* representation 之间交互的抽象类.下面是几个format: TextTransfer String "hello
* world" RTFTransfer String "{/rtf1/b/i hello world}" FileTransfer
* String[] new String[] {file1.getAbsolutePath(),
* file2.getAbsolutePath()}
*
* TransferData包含了很多特定于平台的公用的属性,应用不应该直接去访问这些属性。
* 如果真的有必要去访问这些属性,那么我们可以通过扩展Transfer类来完成对特定平台的额外操作。
*/
textTransfer = TextTransfer.getInstance();
fileTransfer = FileTransfer.getInstance();
// final Color red = display.getSystemColor(SWT.COLOR_GREEN);
// final Color yellow = display.getSystemColor(SWT.COLOR_GRAY);
// tree.addListener(SWT.EraseItem, new Listener() {
// public void handleEvent(Event event) {
// if ((event.detail & SWT.SELECTED) == 0)
// return; /* item not selected */
// int clientWidth = tree.getClientArea().width;
// GC gc = event.gc;
// Color oldForeground = gc.getForeground();
// Color oldBackground = gc.getBackground();
// gc.setForeground(red);
// gc.setBackground(yellow);
// gc.fillGradientRectangle(0, event.y, clientWidth, event.height,
// false);
// gc.setForeground(oldForeground);
// gc.setBackground(oldBackground);
// event.detail &= ~SWT.SELECTED;
// }
// });
shell.setMaximized(true);
// Canvas canvas = new Canvas(shell, SWT.BORDER);
// canvas.setLayout(new FillLayout());
mainSashForm = new SashForm(shell, SWT.HORIZONTAL);
mainSashForm.setBackground(shell.getDisplay().getSystemColor(
SWT.COLOR_TITLE_BACKGROUND));
final Group leftGroup = new Group(mainSashForm, SWT.NONE | SWT.CENTER);
leftGroup.setText("会计科目");
leftGroup.setLayout(new FillLayout());
final TabFolder subtabFolder = new TabFolder(leftGroup, SWT.NONE);
final TabItem subtabItem = new TabItem(subtabFolder, SWT.NONE);
subtabItem.setText("会计科目");
tree = new Tree(subtabFolder, SWT.FULL_SELECTION);
tree.setLinesVisible(true);
addExistItems();
tree.addListener(SWT.Selection, new Listener() ...{
public void handleEvent(Event event) ...{
System.out
.println(tree.getSelection()[0].getData("SetSubData"));
}
});
subtabItem.setControl(tree);
Transfer[] types = new Transfer[] ...{ TextTransfer.getInstance() };
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
final DragSource treeSource = new DragSource(tree, operations);
treeSource.setTransfer(types);
treeSource.addDragListener(new DragSourceListener() ...{
public void dragStart(DragSourceEvent event) ...{
TreeItem[] selection = ((Tree) ((DragSource) event.widget)
.getControl()).getSelection();
// 只能移动选中并且为最子结点。
// if (selection.length > 0
// && selection[0].getItemCount() == 0) {// 选中并且为最子结点。
if (selection.length > 0) ...{
event.doit = true;
// int selectedCount = ((Tree) ((DragSource)
// event.widget)
// .getControl()).getSelection().length;
// dragSourceItem = new TreeItem[selectedCount];
// for (int i = 0; i < selectedCount; i++) {
// dragSourceItem[i] = selection[i];
// }
} else ...{
event.doit = false;
}
};
public void dragSetData(DragSourceEvent event) ...{
event.data = String.valueOf(typeList.size()); // 最后一个是保存左边树,用于移动节点位置用。;//
// *********
}
public void dragFinished(DragSourceEvent event) ...{
if (event.detail == DND.DROP_MOVE)
tree.getSelection()[0].dispose();
}
});
DropTarget leftTarget = new DropTarget(tree, operations);
leftTarget.setTransfer(types);
leftTarget.addDropListener(new DropTargetAdapter() ...{
public void dragOver(DropTargetEvent event) ...{
event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
if (event.item != null) ...{
TreeItem item = (TreeItem) event.item;
Point pt = display.map(null, tree, event.x, event.y);
Rectangle bounds = item.getBounds();
if (pt.y < bounds.y + bounds.height / 3) ...{
event.feedback |= DND.FEEDBACK_INSERT_BEFORE;
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
event.feedback |= DND.FEEDBACK_INSERT_AFTER;
} else ...{
event.feedback |= DND.FEEDBACK_SELECT;
}
}
}
public void drop(DropTargetEvent event) ...{
if (event.data == null) ...{
event.detail = DND.DROP_NONE;
return;
}
String treeIndex = (String) event.data;
TreeItem[] drogItems = eachTrees[Integer.parseInt(treeIndex)]
.getSelection();
System.out.println(drogItems.length);
// if (event.item == null) {
// TreeItem item = new TreeItem(tree, SWT.NONE);
// item.setText(text);
// } else
if (event.item != null) ...{// 把鼠标移到目标节点才能进行挂节点操作。
if (Integer.parseInt(treeIndex) != typeList.size()) ...{// 如果不是最后一颗树。
TreeItem item = (TreeItem) event.item;
Point pt = display.map(null, tree, event.x, event.y);
Rectangle bounds = item.getBounds();
TreeItem parent = item.getParentItem();
if (parent != null) ...{// 目标Tree有父结点时。
TreeItem[] items = parent.getItems();
int index = 0;
for (int i = 0; i < items.length; i++) ...{
if (items[i] == item) ...{
index = i;
break;
}
}
if (pt.y < bounds.y + bounds.height / 3) ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(parent,
SWT.NONE, index);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(parent,
SWT.NONE, index + 1);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
} else ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(item,
SWT.NONE);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
}
} else ...{// 目标Tree没有父结点时。
TreeItem[] items = tree.getItems();
int index = 0;
for (int i = 0; i < items.length; i++) ...{
if (items[i] == item) ...{
index = i;
break;
}
}
if (pt.y < bounds.y + bounds.height / 3) ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(tree,
SWT.NONE, index);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(tree,
SWT.NONE, index + 1);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
} else ...{
for (int i = 0; i < drogItems.length; i++) ...{
TreeItem newItem = new TreeItem(item,
SWT.NONE);
newItem.setText(drogItems[i].getText());
newItem.setData("SetSubData", convertData(
item, (BaseDataVO) (drogItems[i]
.getData("baseData"))));
}
}
}
} else ...{// 如果是最后一颗树。
TreeItem drogItem = eachTrees[Integer
.parseInt(treeIndex)].getSelection()[0];
String text = drogItem.getText();
TreeItem item = (TreeItem) event.item;
Point pt = display.map(null, tree, event.x, event.y);
Rectangle bounds = item.getBounds();
TreeItem parent = item.getParentItem();
if (parent != null) ...{
TreeItem[] items = parent.getItems();
int index = 0;
for (int i = 0; i < items.length; i++) ...{
if (items[i] == item) ...{
index = i;
break;
}
}
if (pt.y < bounds.y + bounds.height / 3) ...{
TreeItem newItem = new TreeItem(parent,
SWT.NONE, index);
newItem.setText(text);
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
TreeItem newItem = new TreeItem(parent,
SWT.NONE, index + 1);
newItem.setText(text);
} else ...{
TreeItem newItem = new TreeItem(item, SWT.NONE);
newItem.setText(text);
}
} else ...{
TreeItem[] items = tree.getItems();
int index = 0;
for (int i = 0; i < items.length; i++) ...{
if (items[i] == item) ...{
index = i;
break;
}
}
if (pt.y < bounds.y + bounds.height / 3) ...{
TreeItem newItem = new TreeItem(tree, SWT.NONE,
index);
newItem.setText(text);
} else if (pt.y > bounds.y + 2 * bounds.height / 3) ...{
TreeItem newItem = new TreeItem(tree, SWT.NONE,
index + 1);
newItem.setText(text);
} else ...{
TreeItem newItem = new TreeItem(item, SWT.NONE);
newItem.setText(text);
}
}
}
}
}
private RelSubVO convertData(TreeItem drogItem, BaseDataVO baseVo) ...{
RelSubVO relVo = new RelSubVO();
String id = KeyGenerator.generateStringID();
relVo.setId(id);
relVo.setName(baseVo.getTitle());
relVo.setRelid(baseVo.getId());
relVo.setRelType(baseVo.getType());
RelSubVO data = (RelSubVO) drogItem.getData("SetSubData");
SubVO subVo = (SubVO) subtree.getSelection()[0].getData();
if (data == null) ...{
relVo.setPath("0,1");
relVo.setPid("1");
relVo.setType("0");
relVo.setSubid(subVo.getId());
relVo.setAsid("1001");
} else ...{
relVo.setAsid("1001");
relVo.setPath(data.getPath() + "," + data.getId());
relVo.setPid(data.getId());
data.setType("1");// 父的目录类型设为1,表示目录
// 如果是在newList 里面,而没有保存到数据库的,则仍在newList里。
if (!newList.contains(data)) ...{
if (modifyList.contains(data)) ...{
modifyList.remove(data);
}
modifyList.add(data);
}
relVo.setType("0");// 子的目录类型设为0,表示最子节点
relVo.setSubid(subVo.getId());
}
newList.add(relVo);// 每挂一次就在newList添加
return relVo;
}
});
final Group rightGroup = new Group(mainSashForm, SWT.NONE | SWT.CENTER);
rightGroup.setText("基础数据");
rightGroup.setLayout(new FillLayout());
final TabFolder tabFolder = new TabFolder(rightGroup, SWT.NONE);
addTabItems(tabFolder);
eachTrees[typeList.size()] = tree; // 最后一个是保存左边树,用于移动节点位置用。
tree.addTreeListener(new TreeListener() ...{
public void treeCollapsed(TreeEvent e) ...{
TreeItem item = (TreeItem) e.item;
// item.setImage(closeImg);
}
public void treeExpanded(TreeEvent e) ...{
TreeItem item = (TreeItem) e.item;
// item.setImage(openImg);
}
});
// tree.addListener(SWT.MeasureItem, new Listener() {
// public void handleEvent(Event event) {
// int clientWidth = tree.getClientArea().width;
// event.height = event.gc.getFontMetrics().getHeight() + 5;
// event.width = clientWidth;
// }
// });
//
Menu menu = new Menu(shell, SWT.POP_UP);
initMenuItems(menu);
tree.setMenu(menu);
// 将dropTable指定为Drop Target,
// DropTarget target=new
// DropTarget(tree,DND.DROP_MOVE|DND.DROP_COPY|DND.DROP_DEFAULT);
// target.setTransfer(new Transfer[] {textTransfer });
// target.addDropListener(new MyDropTargetListener());
final Menu toolBarMenu = new Menu(shell, SWT.BAR);
initMenuItems(toolBarMenu);
shell.setMenuBar(toolBarMenu);
mainSashForm.setWeights(new int[] ...{ 5, 5 });
}
private void addExistItems() ...{
TreeItem ti0 = new TreeItem(tree, SWT.NONE);
ti0.setText(subtree.getSelection()[0].getText());
SubVO pvo = (SubVO) subtree.getSelection()[0].getData();
pvo.setSublevel("0");
pvo.setSubpath("0");
pvo.setSubtype("1");// 默认是叶子,如果有子节点则变为1,1表示目录
ti0.setData(pvo);
map.put("1", ti0);
if (relMap == null) ...{
relMap = (Map) SWTDataViewUtil.parseObject(null, "loadRelSub");
}
if (relMap == null) ...{
return;
}
List relList = (List) relMap.get(pvo.getId());
if (relList == null) ...{
return;
}
for (int i = 0; i < relList.size(); i++) ...{
RelSubVO vo = (RelSubVO) relList.get(i);
TreeItem ti = new TreeItem((TreeItem) map.get(vo.getPid()),
SWT.NONE);
ti.setText(vo.getName());
ti.setData("SetSubData", vo);
ti.setExpanded(true);
if (vo.getType().equals("1")) ...{// 如果为目录
map.put(vo.getId(), ti);// 只保存有目录的节点,不保存无叶子节点的节点。
}
}
ti0.setExpanded(true);
}
private void addTabItems(TabFolder tabFolder) ...{
if (dataMap == null || typeList == null) ...{
dataMap = (Map) SWTDataViewUtil.parseObject(null, "getBaseDataMap");
typeList = (List) SWTDataViewUtil.parseObject(null, "getTypeList");
}
if (typeList == null)
return;
eachTrees = new Tree[typeList.size() + 1]; // 最后一个是保存左边树,用于移动节点位置用。
for (index = 0; index < typeList.size(); index++) ...{
LabelValue lv = (LabelValue) typeList.get(index);
List dataList = (List) dataMap.get(lv.getValue());
final TabItem tabPreItem = new TabItem(tabFolder, SWT.NONE);
tabPreItem.setText(lv.getLabel());
eachTrees[index] = new Tree(tabFolder, SWT.FULL_SELECTION
| SWT.MULTI);
eachTrees[index].setLinesVisible(true);
tabPreItem.setControl(eachTrees[index]);
// 将dragLabel指定为DragSource(一个widget只能帮定在一个DragSource),
// 并允许数据可以从DragSource被MOVE或COPY
// DragSource source=new
// DragSource(eachTree,DND.DROP_MOVE|DND.DROP_COPY);
// source.setTransfer(new Transfer[] { textTransfer });// 指定允许的传输类型
// source.addDragListener(new MyDragSourceListener());
Transfer[] types = new Transfer[] ...{ TextTransfer.getInstance() };
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
final DragSource rightSource = new DragSource(eachTrees[index],
operations);
rightSource.setTransfer(types);
rightSource.addDragListener(new DragSourceListener() ...{
public void dragStart(DragSourceEvent event) ...{
TreeItem[] selection = ((Tree) ((DragSource) event.widget)
.getControl()).getSelection();
// 只能移动选中并且为最子结点。
// if (selection.length > 0
// && selection[0].getItemCount() == 0) {// 选中并且为最子结点。
if (selection.length > 0) ...{
event.doit = true;
// int selectedCount = ((Tree) ((DragSource)
// event.widget)
// .getControl()).getSelection().length;
// dragSourceItem = new TreeItem[selectedCount];
// for (int i = 0; i < selectedCount; i++) {
// dragSourceItem[i] = selection[i];
// }
} else ...{
event.doit = false;
}
};
public void dragSetData(DragSourceEvent event) ...{
for (int i = 0; i < typeList.size(); i++) ...{// 获得哪颗树。
if (((Tree) ((DragSource) event.widget).getControl()) == eachTrees[i]) ...{
event.data = String.valueOf(i);// *********
return;
}
}
}
public void dragFinished(DragSourceEvent event) ...{
// if (event.detail == DND.DROP_MOVE)
// dragSourceItem[0].dispose();
// dragSourceItem = null;
}
});
addItems(eachTrees[index], dataList);
System.out.println(lv.getLabel() + "数据开始>>>>>>");
eachTrees[index].addListener(SWT.Selection, new Listener() ...{
public void handleEvent(Event event) ...{
if (event.detail == SWT.CHECK) ...{
TreeItem checkItem = (TreeItem) event.item;
System.out.println(checkItem.getData("baseData"));
if (checkItem != null) ...{
boolean ischeck = checkItem.getChecked();
if (checkItem.getItemCount() != 0) ...{
SWTCheckUtil.doChildCheck(checkItem, ischeck);
}
}
}
}
});
}
}
private void addItems(Tree eachTree, List dataList) ...{
Map itemMap = new HashMap();
if (dataList == null)
return;
for (int i = 0; i < dataList.size(); i++) ...{
BaseDataVO baseData = (BaseDataVO) dataList.get(i);
TreeItem ti = null;
if (itemMap.get(baseData.getPid()) == null) ...{
ti = new TreeItem(eachTree, SWT.NONE);
} else ...{
ti = new TreeItem((TreeItem) itemMap.get(baseData.getPid()),
SWT.NONE);
}
ti.setText(baseData.getTitle());
ti.setData("baseData", baseData);
ti.setExpanded(true);
if (baseData.getNodeType().equals("1")) ...{// 如果为目录
itemMap.put(baseData.getId(), ti);// 只保存有目录的节点,不保存无叶子节点的节点。
}
}
}
void initMenuItems(Menu menu) ...{
// 实现右键添加节点删除节点
// final MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
//
// menuItem.setText("(&N)挂在同级节点");
// menuItem.addListener(SWT.Selection, new Listener() {
// public void handleEvent(Event e) {
//
// SubVO svo = (SubVO) tree.getSelection()[0].getData();
// if (svo.getId() != "0") {
//
// // 如果多选,则在最前一个节点添加
// if (tree.getSelection().length == 0)
// return;
// TreeItem newItem;
// if (tree.getSelection()[0].getParentItem() == null) {
// newItem = new TreeItem(tree.getSelection()[0]
// .getParent(), SWT.NONE);
// } else {
// newItem = new TreeItem(tree.getSelection()[0]
// .getParentItem(), SWT.NONE);
// }
// newItem.setText(new String[] { "新增会计科目" });
// SubVO vo = new SubVO();
// vo.setAsid("1001");
// String id=KeyGenerator.generateStringID();
// vo.setId(id);
// SubVO pvo = (SubVO) newItem.getParentItem().getData();
//
// pvo.setSubtype("1");//把父节点记录为目录
// // 只要修改了VO属性,就要在modifyList里面替换新的VO.
//
// if(pvo.getId()!="0" && !modifyList.contains(pvo)&&
// !newList.contains(pvo)){
// modifyList.add(pvo);
// }
//
// vo.setSubpid(pvo.getId());
// vo.setSubtype("0");
// vo.setSubpath(pvo.getSubpath()+","+id);
// vo.setSubName("新增会计科目");
// System.out.println(vo.getSubName()+vo.getSubpath());
// newItem.setData(vo);
// tree.showItem(newItem);
// newList.add(vo);
// }
// }
// });
// final MenuItem newSubItem = new MenuItem(menu, SWT.PUSH);
// newSubItem.setText("(&M)挂在同级子节点");
// newSubItem.addListener(SWT.Selection, new Listener() {
// public void handleEvent(Event e) {
// // 如果多选,则在最前一个节点添加
// if (tree.getSelection().length == 0)
// return;
// TreeItem newItem = new TreeItem(tree.getSelection()[0],
// SWT.NONE);
// newItem.setText(new String[] { "新增子会计科目" });
// SubVO vo = new SubVO();
// vo.setAsid("1001");
// String id=KeyGenerator.generateStringID();
// vo.setId(id);
// SubVO pvo = (SubVO) newItem.getParentItem().getData();
// pvo.setSubtype("1");//把父节点记录为目录
//
// //只要修改了VO属性,就要在modifyList里面替换新的VO.
// if(pvo.getId()!="0" &&!modifyList.contains(pvo) &&
// !newList.contains(pvo)){
// modifyList.add(pvo);
// }
//
// vo.setSubpid(pvo.getId());
//
// vo.setSubtype("0");
// vo.setSubpath(pvo.getSubpath()+","+id);
// vo.setSubName("新增子会计科目");
// System.out.println(vo.getSubName()+vo.getSubpath());
// newItem.setData(vo);
// tree.showItem(newItem);
// newList.add(vo);
// }
// });
final MenuItem deleteItem = new MenuItem(menu, SWT.PUSH);
deleteItem.setText("(&D)删除节点");
deleteItem.addListener(SWT.Selection, new Listener() ...{
public void handleEvent(Event e) ...{
// 不是会计科目的,即挂上去的可以删除
delete();
}
});
// 添加分隔条
new MenuItem(menu, SWT.SEPARATOR);
final MenuItem saveAllItems = new MenuItem(menu, SWT.PUSH);
saveAllItems.setText("(&S)保存");
saveAllItems.addListener(SWT.Selection, new Listener() ...{
public void handleEvent(Event e) ...{
if (newList.size() > 0 || modifyList.size() > 0
|| deleteList.size() > 0) ...{
save();
}
}
});
// 弹出菜单时,控制按钮是否可用。
menu.addListener(SWT.Show, new Listener() ...{
public void handleEvent(Event arg0) ...{
if (newList.size() > 0 || modifyList.size() > 0
|| deleteList.size() > 0) ...{
saveAllItems.setEnabled(true);
} else ...{
saveAllItems.setEnabled(false);
}
}
});
}
/** *//**
* 删除
*
* 2006-9-21 下午03:16:56
*/
void delete() ...{
MessageBox mb = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK
| SWT.CANCEL);
mb.setText("是否删除?");
mb.setMessage("确认要删除该节点及所有叶子节点吗?");
int rc = mb.open();
if (rc == SWT.OK) ...{
TreeItem[] treeItems = tree.getSelection();
for (int i = 0; i < treeItems.length; i++) ...{
RelSubVO o = (RelSubVO) treeItems[i].getData("SetSubData");// 保存删除的ID到deleteList
if (!newList.contains(o)) ...{// 如果不是刚新增的条目,而是数据库中存在的。
deleteList.add(o);
delete(treeItems[i]);// 删除刚新增但没有保存到数据库中的。
} else ...{ // 如果是刚新增的条目,而没有保存到数据库中的,在newList中删除。
newList.remove(o);
delete(treeItems[i]);// 删除刚新增但没有保存到数据库中的。
}
treeItems[i].dispose();
// sum(null, 3);
}
}
}
// 递归删除方法。
void delete(TreeItem item) ...{
TreeItem[] treeItems = item.getItems();
if (treeItems.length == 0) ...{
return;
}
for (int i = 0; i < treeItems.length; i++) ...{
delete(treeItems[i]);
if (newList.contains(treeItems[i].getData("SetSubData"))) ...{
newList.remove(treeItems[i].getData("SetSubData"));
} else ...{
deleteList.add(treeItems[i].getData("SetSubData"));
}
treeItems[i].dispose();
}
}
/** *//**
* 保存数据。newList, modifyList , deleteList
*/
private void save() ...{
System.out.println("newList::" + newList.size());
for (int i = 0; i < newList.size(); i++) ...{
RelSubVO vo = (RelSubVO) newList.get(i);
System.out.println("new vo::" + vo.getId() + " " + vo.getName()
+ " " + vo.getPath());
}
System.out.println("modifyList::" + modifyList.size());
for (int i = 0; i < modifyList.size(); i++) ...{
RelSubVO vo = (RelSubVO) modifyList.get(i);
System.out.println("new vo::" + vo.getId() + " " + vo.getName()
+ " " + vo.getPath());
}
System.out.println("deleteList::" + deleteList.size());
for (int i = 0; i < deleteList.size(); i++) ...{
RelSubVO vo = (RelSubVO) deleteList.get(i);
System.out.println("new vo::" + vo.getId() + " " + vo.getName()
+ " " + vo.getPath());
}
mapSave.put("newList", newList);
mapSave.put("modifyList", modifyList);
mapSave.put("deleteList", deleteList);
Object obj = SWTDataViewUtil.parseObject(mapSave, "saveRelSub");
MessageBox mb = new MessageBox(shell, SWT.OK);
mb.setText("提示");
if (obj != null)
mb.setMessage((String) obj);
mb.open();
newList.clear();
modifyList.clear();
deleteList.clear();
}
}
- SWT 中的拖放功能
- SWT中的拖放支持
- swt.中的复制粘贴功能
- SWT/JFace菜单和工具栏,对话框,拖放
- 对SWT控件的拖放深入了解
- 拖放功能的实现
- 拖放功能的实现
- QT的拖放功能
- flex 拖放功能
- flex实现拖放功能
- Flex拖放功能实现
- android 拖放功能
- WPF拖放功能实现
- WPF拖放功能实现
- HTML5之拖放功能
- WPF拖放功能实现
- WPF拖放功能实现
- 拖放功能 - WM_DROPFILES
- 女子良言
- 发现panda(熊猫)对W32.Looked.I处理得不错
- 急!急!求嵌入式前辈指教,选方向,嵌入式软件开发方向?网络工程师方向?还是。。。?
- 11111111111111111
- 我们从互联网中学习什么?
- SWT 中的拖放功能
- VB判断多光驱
- 鸭子--《编程之道》
- 北京之旅随选-时间岁月匆匆过我是否依然
- 关于不同sql语句执行效率的问题
- 2006.10.20
- 人间消失
- ExtremeTable的简单配置
- 如何查出一个表已更改的行