📄 asciitreewindow.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 + -