/** 導航菜單視圖 */
public class NavView extends ViewPart {
/** 導航的樹對象 */
private TreeViewer viewer;
/** 可以爲樹添加返回導航操作對象 */
private DrillDownAdapter drillDownAdapter;
/** 摺疊樹操作 */
private Action collapseAction;
/** 展開樹操作 */
private Action expandAction;
/** 雙擊樹結點時操作 */
private Action doubleClickAction;
/** 該視圖的ID */
public static final String ID = "superCRM.views.NavView";
/** 樹結點類 */
class TreeObject implements IAdaptable { private String name; private String key; private TreeParent parent; public TreeObject(String name, String key) { this.name = name; this.key = key; } public String getName() { return name; } public void setParent(TreeParent parent) { this.parent = parent; } public TreeParent getParent() { return parent; } public String toString() { return getName(); } public Object getAdapter(Class key) { return null; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } } |
/** 樹的父結點類 */ class TreeParent extends TreeObject { private ArrayList children;
public TreeParent(String name) { super(name, "__Parent"); children = new ArrayList(); }
public void addChild(TreeObject child) { children.add(child); child.setParent(this); }
public void removeChild(TreeObject child) { children.remove(child); child.setParent(null); }
public TreeObject[] getChildren() { return (TreeObject[]) children.toArray(new TreeObject[children.size()]); }
public boolean hasChildren() { return children.size() > 0; } } |
/** 樹的內容器 */
class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
private TreeParent invisibleRoot;
public void inputChanged(Viewer v, Object oldInput, Object newInput) {}
public void dispose() {}
public Object[] getElements(Object parent) {
if (parent.equals(getViewSite())) {
if (invisibleRoot == null)
initialize();
return getChildren(invisibleRoot);
}
return getChildren(parent);
}
public Object getParent(Object child) {
if (child instanceof TreeObject) {
return ((TreeObject) child).getParent();
}
return null;
}
public Object[] getChildren(Object parent) {
if (parent instanceof TreeParent) {
return ((TreeParent) parent).getChildren();
}
return new Object[0];
}
public boolean hasChildren(Object parent) {
if (parent instanceof TreeParent)
return ((TreeParent) parent).hasChildren();
return false;
}
/** 初始化樹中的數據 */
private void initialize() {
TreeObject c1 = new TreeObject("客戶列表", "CUSTOMER_LIST");
TreeObject c2 = new TreeObject("添加客戶", "CUSTOMER_ADD");
TreeParent t1 = new TreeParent("客戶管理");
t1.addChild(c1);
t1.addChild(c2);
TreeObject l1 = new TreeObject("聯繫人列表", "CONTACT_LIST");
TreeObject l2 = new TreeObject("添加聯繫人", "CONTACT_ADD");
TreeParent t2 = new TreeParent("聯繫人管理");
t2.addChild(l1);
t2.addChild(l2);
TreeObject p2 = new TreeObject("首選項設置", "PREF");
TreeParent t3 = new TreeParent("管理設置");
t3.addChild(p2);
invisibleRoot = new TreeParent("");
invisibleRoot.addChild(t1);
invisibleRoot.addChild(t2);
invisibleRoot.addChild(t3);
}
}
/** 樹的內容器 顯示文件夾圖片*/
class ViewLabelProvider extends LabelProvider {
public String getText(Object obj) {
return obj.toString();
}
public Image getImage(Object obj) {
String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
if (obj instanceof TreeParent)
imageKey = ISharedImages.IMG_OBJ_FOLDER;
return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
}
}
/** 構造方法 */
public NavView() {}
public void createPartControl(Composite parent) {
/** 創建樹 */
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
/** 初始化樹 */
drillDownAdapter = new DrillDownAdapter(viewer);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setInput(getViewSite());
/** 創建樹中所使用操作對象 */
makeActions();
/** 添加上下文菜單 */
hookContextMenu();
/** 添加雙擊事件 */
hookDoubleClickAction();
/** 添加到操作條中 */
contributeToActionBars();
}
/** 添加上下文菜單 */
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
NavView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
/** 添加到操作條中 */
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
/** 添加下拉菜單項 */
private void fillLocalPullDown(IMenuManager manager) {
manager.add(collapseAction);
manager.add(new Separator());
manager.add(expandAction);
}
/** 添加上下文菜單項 */
private void fillContextMenu(IMenuManager manager) {
manager.add(collapseAction);
manager.add(expandAction);
manager.add(new Separator());
drillDownAdapter.addNavigationActions(manager);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/** 添加工具欄工具按鈕 */
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(collapseAction);
manager.add(expandAction);
manager.add(new Separator());
drillDownAdapter.addNavigationActions(manager);
}
/** 創建視圖所使用的操作對象 */
private void makeActions() {
/** 展開全部按鈕 */
collapseAction = new Action() {
public void run() {
viewer.collapseAll();
}
};
collapseAction.setText("摺疊全部");
collapseAction.setToolTipText("摺疊全部");
collapseAction.setImageDescriptor(SuperCRMPlugin.getImageDescriptor("icons/collapse.gif"));
/** 摺疊全部按鈕 */
expandAction = new Action() {
public void run() {
viewer.expandAll();
}
};
expandAction.setText("展開全部");
expandAction.setToolTipText("展開全部");
expandAction.setImageDescriptor(SuperCRMPlugin.getImageDescriptor("icons/expand.gif"));
/** 雙擊操作 */
doubleClickAction = new Action() {
public void run() {
/** 獲得當前選中的樹節點 */
ISelection selection = viewer.getSelection();
Object obj = ((IStructuredSelection) selection).getFirstElement();
/** 如果選中的爲TreeParent對象,則返回 */
if (obj instanceof TreeParent)
return;
/** 如果選中的爲子節點,則根據key值打開相應的操作 */
TreeObject object = (TreeObject) obj;
if (object.getKey().equals("CUSTOMER_LIST")) {
ActionManager.createShowViewAction(getSite().getWorkbenchWindow(), CustomerSummaryView.ID).run();
} else if (object.getKey().equals("CUSTOMER_ADD")) {
ActionManager.createNewCustomerAction(getSite().getWorkbenchWindow()).run();
} else if (object.getKey().equals("CONTACT_LIST")) {
ActionManager.createShowViewAction(getSite().getWorkbenchWindow(), ContactSummaryView.ID).run();
} else if (object.getKey().equals("CONTACT_ADD")) {
ActionManager.createNewContactAction(getSite().getWorkbenchWindow()).run();
} else if (object.getKey().equals("PREF")) {
ActionFactory.PREFERENCES.create(getSite().getWorkbenchWindow()).run();
}
}
};
}
/** 雙擊樹事件 */
private void hookDoubleClickAction() {
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
doubleClickAction.run();
}
});
}
public void setFocus() {
viewer.getControl().setFocus();
}
}