⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myactiongroup.java

📁 SWTJFace篇项目源程序该项目包含 包含了Eclipse下构建swt的基本工程
💻 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 + -