📄 myactiongroup.java
字号:
package cn.com.chengang.jface.treeviewer;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.actions.ActionGroup;
public class MyActionGroup extends ActionGroup {
private TreeViewer tv;
public MyActionGroup(TreeViewer treeViewer) {
this.tv = treeViewer;
}
// 生成菜单Menu,并将两个Action传入
public void fillContextMenu(IMenuManager mgr) {
// 加入两个Action对象到菜单管理器
MenuManager menuManager = (MenuManager) mgr; // 类型转换
final OpenAction openAction = new OpenAction();
final RefreshAction refreshAction = new RefreshAction();
final ExpandAction expandAction = new ExpandAction();
final CollapseAction collapseAction = new CollapseAction();
final AddEntryAction addEntryAction = new AddEntryAction();
final RemoveEntryAction removeEntryAction = new RemoveEntryAction();
final ModifyEntryAction modifyEntryAction = new ModifyEntryAction();
// 设置“在每次显示之前先删除全部老菜单“的属性为true
menuManager.setRemoveAllWhenShown(true);
menuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
ITreeEntry entry = getSelTreeEntry();
manager.add(openAction);
manager.add(refreshAction);
if (!(entry instanceof PeopleEntity)) {
manager.add(expandAction);
manager.add(collapseAction);
manager.add(addEntryAction);
}
manager.add(removeEntryAction);
manager.add(modifyEntryAction);
}
});
// 生成Menu并挂在树Tree上
Tree tree = tv.getTree();
Menu menu = menuManager.createContextMenu(tree);
tree.setMenu(menu);
}
// “打开”的Action类
private class OpenAction extends Action {
public OpenAction() {
setText("打开");
}
public void run() {
ITreeEntry entry = getSelTreeEntry();
if (entry != null)
MessageDialog.openInformation(null, null, entry.getName());
}
}
// 刷新的Action类
private class RefreshAction extends Action {
public RefreshAction() {
setText("刷新");
}
public void run() {
// 如果在删除结点时,不同时从数据模型里删除结点。则执行本刷新后,该结点又会从模据模型中取出并显示在界面上
tv.refresh();
}
}
// 展开当前结点的Action类
private class ExpandAction extends Action {
public ExpandAction() {
setText("展开");
}
public void run() {
ITreeEntry entry = getSelTreeEntry();
if (entry != null)
tv.expandToLevel(entry, 1); // 参数2是展开的层数
}
}
// 收缩当前结点的Action类
private class CollapseAction extends Action {
public CollapseAction() {
setText("收缩");
}
public void run() {
ITreeEntry entry = getSelTreeEntry();
if (entry != null)
tv.collapseToLevel(entry, -1); // 参数2是收缩的层数,-1指收缩所有子结点
}
}
// 给当前结点增加一个子结点的Action类
private class AddEntryAction extends Action {
public AddEntryAction() {
setText("增加");
}
public void run() {
ITreeEntry entry = getSelTreeEntry();
if (entry == null || entry instanceof PeopleEntity)
return;// 不能给“人”结点增加子结点
InputDialog dialog = new InputDialog(null, "增加子结点", "输入名称:", "a", null);
if (dialog.open() == InputDialog.OK) {// 如果单击OK按钮
String entryName = dialog.getValue(); // 得到Dialog输入值
// 根据单击结点的不同类型生成相应的子结点
ITreeEntry newEntry = null;
if (entry instanceof CountryEntity)
newEntry = new CityEntity(entryName);
else if (entry instanceof CityEntity)
newEntry = new PeopleEntity(entryName);
entry.getChildren().add(newEntry); // 新结点增加到数据模型中
tv.add(entry, newEntry);// newEntry结点增加到entry之下,或用tv.refresh(entry,true)也行
if (!tv.getExpandedState(entry)) // 如果entry是未展开结点则展开它
tv.expandToLevel(entry, 1);
}
}
}
// 删除结点的Action类
private class RemoveEntryAction extends Action {
public RemoveEntryAction() {
setText("删除");
}
public void run() {
ITreeEntry entry = getSelTreeEntry();
if (entry == null)
return;
// 从数据模型里删除结点
List<ITreeEntry> list = (List<ITreeEntry>) tv.getInput();
remove(list, entry);
// 把从界面删除结点,放在从模型删除之后,否则在删除某个结点的最后一个子结点时会出问题
tv.remove(entry);
}
private void remove(List<ITreeEntry> list, ITreeEntry entry) {
if (list == null)
return;
for (Iterator it = list.iterator(); it.hasNext();) {
ITreeEntry o = (ITreeEntry) it.next();
if (o.getName().equals(entry.getName())) {
it.remove();
return;
} else {
remove(o.getChildren(), entry);
}
}
}
}
// 修改结点名称的Action类
private class ModifyEntryAction extends Action {
public ModifyEntryAction() {
setText("修改");
}
public void run() {
ITreeEntry entry = getSelTreeEntry();
if (entry == null)
return;
InputDialog dialog = new InputDialog(null, "修改结点", "输入新名称", entry.getName(), null);
if (dialog.open() == InputDialog.OK) {
String entryName = dialog.getValue();
entry.setName(entryName);// 修改数据模型
tv.refresh(entry); // 刷新结点,等效于tv.update(entry,null);
}
}
}
// 自定义方法:取得当前选择的结点
private ITreeEntry getSelTreeEntry() {
IStructuredSelection selection = (IStructuredSelection) tv.getSelection();
return (ITreeEntry) (selection.getFirstElement());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -