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

📄 asciitreewindow.java

📁 可以在一个窗口中编辑树状结构
💻 JAVA
字号:
package shining365.ex.asciitree;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.CoolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.jface.viewers.TreeNodeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerEditor;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

import com.swtdesigner.ResourceManager;

public class AsciiTreeWindow extends ApplicationWindow {
		
	private Action editAction;
	private Action rmAction;
	private Action addAction;
	private TreeViewer tv;
	private Tree tree;
	private Text text;
	private TreeNode root = new TreeNode(new TreeNodeData("双击编辑文本"));
	List<TreeNode> curSel = new ArrayList<TreeNode>();
	
	/**
	 * Create the application window
	 */
	public AsciiTreeWindow() {
		super(null);
		createActions();
		addCoolBar(SWT.FLAT);
		addMenuBar();
	}
	
	/**
	 * Create contents of the application window
	 * @param parent
	 */
	@Override
	protected Control createContents(Composite parent) {		
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(new FillLayout());

		final TabFolder tabFolder = new TabFolder(container, SWT.NONE);
		tabFolder.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(final SelectionEvent e) {
				if (tabFolder.getSelectionIndex() == 1) {
					text.setText(drawTree(root));
				}
			}
		});

		final TabItem tabItem = new TabItem(tabFolder, SWT.NONE);
		tabItem.setText("编辑");

		tv = new TreeViewer(tabFolder, SWT.MULTI | SWT.BORDER);
		tv.addSelectionChangedListener(new ISelectionChangedListener() {
			public void selectionChanged(final SelectionChangedEvent event) {
				curSel = new ArrayList<TreeNode>();
				TreeItem[] sel = tv.getTree().getSelection();
				if (sel.length != 0) {
					for (TreeItem ti : sel) {
						curSel.add((TreeNode)ti.getData());
					}
				}

				addAction.setEnabled(curSel.size() == 1);
				editAction.setEnabled(curSel.size() == 1);
				rmAction.setEnabled(curSel.size() != 0 && !curSel.contains(root));
			}
		});
		/*显示*/
		tv.setContentProvider(new TreeNodeContentProvider());
		tv.setLabelProvider(new TreeNodeLabelProvider());
		tv.setInput(new TreeNode[]{root});
		/*编辑*/
		tv.setColumnProperties(new String[]{"col1"});
		tv.setCellEditors(new CellEditor[]{
				new TextCellEditor(tv.getTree())
		});
		tv.setCellModifier(new ICellModifier() {
			@Override
			public boolean canModify(Object element, String property) {
				return true;
			}
			@Override
			public Object getValue(Object element, String property) {
				return 
				((TreeNodeData) ((TreeNode) element).getValue()).getLabel();
			}
			@Override
			public void modify(Object element, String property, Object value) {
				if (element instanceof Item) {
					element = ((Item) element).getData();
				}
				((TreeNodeData)
						((TreeNode) element).getValue()).setLabel((String)value);
				tv.refresh();
			}
		});
		TreeViewerEditor.create(tv, 
			new ColumnViewerEditorActivationStrategy(tv) {
			protected boolean
			isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
				switch (event.eventType) {
				case ColumnViewerEditorActivationEvent.TRAVERSAL:
				case ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION:
				case ColumnViewerEditorActivationEvent.PROGRAMMATIC:
					return true;
				case ColumnViewerEditorActivationEvent.KEY_PRESSED:
					return event.keyCode == SWT.CR;
				default:
					return false;
				}
			}
		}, ColumnViewerEditor.DEFAULT);
		/*快捷菜单*/
		final MenuManager editMenu = new MenuManager("编辑(&E)");
		editMenu.add(addAction);
		editMenu.add(rmAction);
		editMenu.add(editAction);
		Control c = tv.getControl();
		c.setMenu(editMenu.createContextMenu(c));
		
		tree = tv.getTree();
		tabItem.setControl(tree);

		final TabItem asciiTabItem = new TabItem(tabFolder, SWT.NONE);
		asciiTabItem.setText("ASCII");

		text = new Text(tabFolder, SWT.V_SCROLL | SWT.MULTI | SWT.H_SCROLL | SWT.BORDER);
		text.setEditable(false);
		asciiTabItem.setControl(text);
		//
		return container;
	}

	/**
	 * Create the actions
	 */
	private void createActions() {

		addAction = new Action("增加子节点(&A)") {
			public void run() {
				addNode();
			}
		};
		addAction.setAccelerator(SWT.CTRL | 'N');
		addAction.setImageDescriptor(ResourceManager.getImageDescriptor(AsciiTreeWindow.class, "/images/add.gif"));
		addAction.setDisabledImageDescriptor(ResourceManager.getImageDescriptor(AsciiTreeWindow.class, "/images/add_.gif"));
		addAction.setEnabled(false);

		rmAction = new Action("删除本节点(&R)") {
			public void run() {
				rmNodes();
			}
		};
		rmAction.setEnabled(false);
		rmAction.setImageDescriptor(ResourceManager.getImageDescriptor(AsciiTreeWindow.class, "/images/delete.gif"));
		rmAction.setDisabledImageDescriptor(ResourceManager.getImageDescriptor(AsciiTreeWindow.class, "/images/delete_.gif"));
		rmAction.setAccelerator(SWT.DEL);
		
		editAction = new Action("编辑文本(&E)") {
			public void run() {
				editNode();
			}
		};
		editAction.setEnabled(false);
		editAction.setImageDescriptor(ResourceManager.getImageDescriptor(AsciiTreeWindow.class, "/images/edit.gif"));
		editAction.setDisabledImageDescriptor(ResourceManager.getImageDescriptor(AsciiTreeWindow.class, "/images/edit_.gif"));
		editAction.setAccelerator(SWT.F2);
		// Create the actions
	}

	/**
	 * Create the menu manager
	 * @return the menu manager
	 */
	@Override
	protected MenuManager createMenuManager() {
		MenuManager menuManager = new MenuManager("menu");

		final MenuManager editMenu = new MenuManager("编辑(&E)");
		menuManager.add(editMenu);

		editMenu.add(addAction);

		editMenu.add(rmAction);

		editMenu.add(editAction);
		
		return menuManager;
	}

	/**
	 * Create the coolbar manager
	 * @return the coolbar manager
	 */
	@Override
	protected CoolBarManager createCoolBarManager(int style) {
		CoolBarManager coolBarManager = new CoolBarManager(style);

		final ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
		coolBarManager.add(toolBarManager);

		toolBarManager.add(addAction);

		toolBarManager.add(rmAction);

		toolBarManager.add(editAction);
		return coolBarManager;
	}

	/**
	 * Launch the application
	 * @param args
	 */
	public static void main(String args[]) {
		try {
			AsciiTreeWindow window = new AsciiTreeWindow();
			window.setBlockOnOpen(true);
			window.open();
			Display.getCurrent().dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Configure the shell
	 * @param newShell
	 */
	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		newShell.setText("ASCII码绘树");
		newShell.setSize(350, 350);
	}

	private void addNode() {
		TreeNode tn = curSel.get(0);
		TreeNode[] children = tn.getChildren();
		if (children == null) {
			children = new TreeNode[0];
		}
		List<TreeNode> l = 
			new ArrayList<TreeNode>(Arrays.asList(children));
		TreeNode newNode = new TreeNode(new TreeNodeData("new"));
		newNode.setParent(tn);
		l.add(newNode);
		tn.setChildren(l.toArray(new TreeNode[0]));
		//加入节点
		tv.refresh();
		//展开
		tv.getTree().getSelection()[0].setExpanded(true);
		//如果没有这一行, 展开的节点无标签
		tv.refresh();
	}
	
	private void rmNodes() {
		for (TreeNode tn : curSel) {
			TreeNode p = tn.getParent();
			List<TreeNode> l = 
				new ArrayList<TreeNode>(Arrays.asList(p.getChildren()));
			l.remove(tn);
			p.setChildren(l.toArray(new TreeNode[0]));
			tv.refresh();
		}
	}
	
	private void editNode() {
		tv.editElement(curSel.get(0), 0);
	}
	
	private static String drawTree(TreeNode r) {
		StringBuilder sb = new StringBuilder();
		dfs(r, new LinkedList<Boolean>(), sb);
		return sb.toString();
	}
	
	private static void dfs(final TreeNode tn, 
			LinkedList<Boolean> endList, StringBuilder sb) {
		if (endList.size() != 0) {
		//非根
			int i;
			for (i = 0; i < endList.size() - 1; i++) {
				sb.append(endList.get(i)?' ':'│');
			}
			sb.append(endList.get(i)?'└':'├');
		}
		sb.append(((TreeNodeData)tn.getValue()).getLabel() + "\n");
		if (tn.getChildren() == null) {
			return;
		} 
		int i;
		endList.addLast(false);
		for (i = 0; i < tn.getChildren().length - 1; i++) {
			dfs(tn.getChildren()[i], endList, sb);
		}
		endList.removeLast();
		endList.addLast(true);
		dfs(tn.getChildren()[i], endList, sb);
		endList.removeLast();
	}
}

class TreeNodeData {
	private String label;

	public TreeNodeData(String label) {
		this.label = label;
	}
	
	public String getLabel() {
		return label;
	}

	public void setLabel(String label) {
		this.label = label;
	}
}

class TreeNodeLabelProvider implements ILabelProvider {
	@Override
	public Image getImage(Object element) {
		return null;
	}

	@Override
	public String getText(Object element) {
		return ((TreeNodeData)((TreeNode)element).getValue()).getLabel();
	}

	@Override
	public void addListener(ILabelProviderListener listener) {
	}

	@Override
	public void dispose() {
	}

	@Override
	public boolean isLabelProperty(Object element, String property) {
		return false;
	}

	@Override
	public void removeListener(ILabelProviderListener listener) {
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -