📄 treeviewer1.java
字号:
/*
* @author 陈勇 创建日期 2006-4-10
*
* 努力!
*/
package cn.com.javachen.myxml.xmltree;
import java.io.IOException;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import cn.com.javachen.myxml.wz.DataFactory;
import cn.com.javachen.myxml.wz.ITreeEntry;
import cn.com.javachen.myxml.wz.RootWjj;
import cn.com.javachen.myxml.wz.WjjEntity;
import cn.com.javachen.myxml.wz.WzEntity;
import cn.com.javachen.myxml.wz.WzXml;
/**
* @author Administrator
*
* TODO 要更改此生成的类型注释的模板,请转至 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class TreeViewer1 {
private String path = "./lib/WWWroot.xml";
private TextTransfer textTransfer;
private FileTransfer fileTransfer;
public static void main(String[] args) {
try {
TreeViewer1 window = new TreeViewer1();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
public void open() {
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setLayout(new FillLayout());
shell.setSize(171, 375);
shell.setText("网址记录器--(作者:陈勇)");
shell.open();
final Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(new FillLayout());
final TreeViewer tv = new TreeViewer(composite, SWT.BORDER);
tv.setContentProvider(new TreeViewerContentProvider());
tv.setLabelProvider(new TreeViewerLabelProvider());
Object inputObj = DataFactory.createTreeData();
MyActionGroup actionGroup = new MyActionGroup(tv,display);
actionGroup.fillContexMenu(new MenuManager());
tv.setInput(inputObj);
// 写双击代码:
tv.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) { // TODO
// 自动生成方法存根
ISelection selection = tv.getSelection();
final Object obj = ((IStructuredSelection) selection)
.getFirstElement();
if (obj instanceof RootWjj) {
if (!tv.getExpandedState(obj)) {
tv.expandToLevel(obj, 1);
} else {
tv.collapseToLevel(obj, 1);
}
} else if (obj instanceof WjjEntity) {
if (!tv.getExpandedState(obj)) {
tv.expandToLevel(obj, 1);
} else {
tv.collapseToLevel(obj, 1);
}
} else if (obj instanceof WzEntity) {
// 这里写打开browser的代码
String path = ((WzEntity) obj).getPath();
try {
Runtime.getRuntime().exec(
"cmd /c start IEXPLORE.EXE \"" + path + "\"");
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
textTransfer = TextTransfer.getInstance();
fileTransfer = FileTransfer.getInstance();
final DragSource source = new DragSource(tv.getTree(), DND.DROP_MOVE);
final TreeItem[] dragSourceItem = new TreeItem[1];
final ITreeEntry[] sourceObj = new ITreeEntry[1];// 暂存拖动源对象
source.setTransfer(new Transfer[] { textTransfer });// 指定允许的传输类型
source.addDragListener(new DragSourceListener() {
public void dragFinished(DragSourceEvent event) {
// TODO 自动生成方法存根
if (event.detail == DND.DROP_MOVE) {
// if(((DragSource)event.widget).getControl() instanceof
// Tree){
// IStructuredSelection selection = (IStructuredSelection)
// tv.getSelection();
// ITreeEntry obj = (ITreeEntry)
// selection.getFirstElement();
// tv.remove(obj);
// }
dragSourceItem[0].dispose();
dragSourceItem[0] = null;
}
}
public void dragSetData(DragSourceEvent event) {
// TODO 自动生成方法存根
// if(TextTransfer.getInstance().isSupportedType(event.dataType)){
// if(((DragSource)event.widget).getControl() instanceof Tree){
// IStructuredSelection selection = (IStructuredSelection)
// tv.getSelection();
// ITreeEntry obj = (ITreeEntry) selection.getFirstElement();
// event.data=obj;
// }
// }
event.data = dragSourceItem[0].getText();
}
public void dragStart(DragSourceEvent event) {
// TODO 自动生成方法存根
if (((DragSource) event.widget).getControl() instanceof Tree) {
TreeItem[] selectionTree = tv.getTree().getSelection();
IStructuredSelection selection = (IStructuredSelection) tv
.getSelection();
ITreeEntry obj = (ITreeEntry) selection.getFirstElement();
if (obj instanceof WjjEntity) {
event.doit = false;
} else if (obj instanceof RootWjj) {
event.doit = false;
} else if (obj instanceof WzEntity) {
dragSourceItem[0] = selectionTree[0];
sourceObj[0] = obj;
event.doit = true;
}
}
}
});
// 将dropTable指定为Drop Target,
DropTarget target = new DropTarget(tv.getControl(), DND.DROP_MOVE
| DND.DROP_DEFAULT);
target.setTransfer(new Transfer[] { textTransfer });
target.addDropListener(new DropTargetListener() {
public void dragEnter(DropTargetEvent event) {
// TODO 自动生成方法存根
if (event.detail == DND.DROP_DEFAULT) {
// 给event.detail赋的值必须是event.operations中的一个,event.operations中
// 的操作都是DragSource所支持的.
if ((event.operations & DND.DROP_MOVE) != 0) {
event.detail = DND.DROP_MOVE;
} else {
event.detail = DND.DROP_NONE;
}
}
// drop target可以选择性的按照传输类型来处理.dragEnter event有两个属性
// event.currentType 是应用设置的默认类型,以TransferData对象形式表现,
// event.dataTypes 是drag source支持的所有类型的列表,以TransferData数组形式表现,
// 我们可以将event.currentType设置成event.dataTypes中的任意一个。
// 这些属性也可以在dragOver, dragOperationChanged以及dropAccept事件中设置。
for (int i = 0; i < event.dataTypes.length; i++) {
if (textTransfer.isSupportedType(event.dataTypes[i])) {
event.currentDataType = event.dataTypes[i];
// 只允许Move
if (event.detail != DND.DROP_MOVE) {
event.detail = DND.DROP_NONE;
}
break;
}
}
}
public void dragLeave(DropTargetEvent event) {
// TODO 自动生成方法存根
event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
if (textTransfer.isSupportedType(event.currentDataType)) {
String t = (String) (textTransfer
.nativeToJava(event.currentDataType));
if (t != null) {
System.out.println(t);
}
}
}
public void dragOperationChanged(DropTargetEvent event) {
// TODO 自动生成方法存根
if (event.detail == DND.DROP_DEFAULT) {
event.detail = DND.DROP_MOVE;
} else {
event.detail = DND.DROP_NONE;
}
// allow text to be moved but files should only be copied
if (fileTransfer.isSupportedType(event.currentDataType)) {
if (event.detail != DND.DROP_MOVE) {
event.detail = DND.DROP_NONE;
}
}
}
public void dragOver(DropTargetEvent event) {
// TODO 自动生成方法存根
event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
if (event.item != null) {
TreeItem item = (TreeItem) event.item;
Point pt = display
.map(null, tv.getTree(), 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) {
// TODO 自动生成方法存根
if (event.data == null) {
event.detail = DND.DROP_NONE;
return;
}
String text = (String) event.data;
if (event.item == null) {
event.detail = DND.DROP_NONE;
// TreeItem item = new TreeItem(tv.getTree(), SWT.NONE);
// item.setText(text);
// item.setData(sourceObj[0]);
// item.setImage(TreeImages.getImage("URLIMAGE"));
} else {
TreeItem item = (TreeItem) event.item;
Point pt = display
.map(null, tv.getTree(), event.x, event.y);
Rectangle bounds = item.getBounds();
TreeItem parent = item.getParentItem();
if (parent != null) {
// if (pt.y < bounds.y + bounds.height / 3) {//写完后发现几种情况下代码一致,取消一大半
// event.detail = DND.DROP_NONE;
int i = WzXml.FindWjjXml(path, item.getText());
if (i != -1) {
TreeItem newItem = new TreeItem(item, SWT.NONE);
newItem.setText(text);
newItem.setData(sourceObj[0]);
newItem.setImage(TreeImages
.getImage("URLIMAGE"));
// 写删除增加代码,实现xml存储
System.out.println("选项中加1" + item.getText());
try {
WzXml.delWzXML(path, text);
WzXml.AddWzXML(path, item.getText(),
(WzEntity) sourceObj[0]);
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} else {
TreeItem newItem = new TreeItem(parent,
SWT.NONE);
newItem.setText(text);
newItem.setData(sourceObj[0]);
newItem.setImage(TreeImages
.getImage("URLIMAGE"));
// 写删除增加代码,实现xml存储
System.out.println("选项中加2" + item.getText());
try {
WzXml.delWzXML(path, text);
WzXml.AddWzXML(path, parent.getText(),
(WzEntity) sourceObj[0]);
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
// } else if (pt.y > bounds.y + 2 * bounds.height / 3) {
// int i = WzXml.FindWjjXml(path, item.getText());
// if (i != -1) {
// TreeItem newItem = new TreeItem(item, SWT.NONE);
// newItem.setText(text);
// newItem.setData(sourceObj[0]);
// newItem.setImage(TreeImages
// .getImage("URLIMAGE"));
// // 写删除增加代码,实现xml存储
// System.out.println("选项中加5" + item.getText());
// try {
// WzXml.delWzXML(path, text);
// WzXml.AddWzXML(path, item.getText(),
// (WzEntity) sourceObj[0]);
// } catch (Exception e) {
// // TODO 自动生成 catch 块
// e.printStackTrace();
// }
// } else {
// TreeItem newItem = new TreeItem(parent,
// SWT.NONE);
// newItem.setText(text);
// newItem.setData(sourceObj[0]);
// newItem.setImage(TreeImages
// .getImage("URLIMAGE"));
// // 写删除增加代码,实现xml存储
// System.out.println("选项中加6" + item.getText());
// try {
// WzXml.delWzXML(path, text);
// WzXml.AddWzXML(path, parent.getText(),
// (WzEntity) sourceObj[0]);
// } catch (Exception e) {
// // TODO 自动生成 catch 块
// e.printStackTrace();
// }
// }
// } else {
// // event.detail = DND.DROP_NONE;
//
// int i = WzXml.FindWjjXml(path, item.getText());
// if (i != -1) {
// TreeItem newItem = new TreeItem(item, SWT.NONE);
// newItem.setText(text);
// newItem.setData(sourceObj[0]);
// newItem.setImage(TreeImages
// .getImage("URLIMAGE"));
// // 写删除增加代码,实现xml存储
// System.out.println("选项中加3" + item.getText());
// try {
// WzXml.delWzXML(path, text);
// WzXml.AddWzXML(path, item.getText(),
// (WzEntity) sourceObj[0]);
// } catch (Exception e) {
// // TODO 自动生成 catch 块
// e.printStackTrace();
// }
//
// } else {
// TreeItem newItem = new TreeItem(parent,
// SWT.NONE);
// newItem.setText(text);
// newItem.setData(sourceObj[0]);
// newItem.setImage(TreeImages
// .getImage("URLIMAGE"));
// // 写删除增加代码,实现xml存储
// System.out.println("选项中加4" + item.getText());
// try {
// WzXml.delWzXML(path, text);
// WzXml.AddWzXML(path, parent.getText(),
// (WzEntity) sourceObj[0]);
// } catch (Exception e) {
// // TODO 自动生成 catch 块
// e.printStackTrace();
// }
// }
// }
} else {
// TreeItem[] items = tv.getTree().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) {
event.detail = DND.DROP_NONE;
// TreeItem newItem = new TreeItem(tv.getTree(),
// SWT.NONE, index);
// newItem.setText(text);
// newItem.setData(sourceObj[0]);
// newItem.setImage(TreeImages.getImage("URLIMAGE"));
} else if (pt.y > bounds.y + 2 * bounds.height / 3) {
event.detail = DND.DROP_NONE;
// TreeItem newItem = new TreeItem(tv.getTree(),
// SWT.NONE, index+1);
// newItem.setText(text);
// newItem.setData(sourceObj[0]);
// newItem.setImage(TreeImages.getImage("URLIMAGE"));
} else {
event.detail = DND.DROP_NONE;
// TreeItem newItem = new TreeItem(tv.getTree(),
// SWT.NONE);
// newItem.setText(text);
// newItem.setData(sourceObj[0]);
// newItem.setImage(TreeImages.getImage("URLIMAGE"));
}
}
}
}
public void dropAccept(DropTargetEvent event) {
// TODO 自动生成方法存根
}
});
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -