Plug-in 视图

来源:互联网 发布:淘宝评价管理怎么删除 编辑:程序博客网 时间:2024/06/05 23:43

Plug-in 视图

首先申明下,本文为笔者学习《Eclipse插件开发学习笔记》的笔记,并加入笔者自己的理解和归纳总结。

1、创建视图

(1) 扩展点【org.eclipse.ui.views】。
在【Extensions】中添加【org.eclipse.ui.views】。
在【org.eclipse.ui.views】中添加【category】和【view】。
【category】代表类别,【view】中的"class",必须选择继承ViewPart的类。

<extensionpoint="org.eclipse.ui.views"><categoryid="com.plugin.blog.demo.category"name="DemoCategory"></category><viewcategory="com.plugin.blog.demo.category"class="com.plugin.blog.demo.view.DemoViewPart"icon="icons/icon_choice.png"id="com.plugin.blog.demo.view.DemoViewPart"name="DemoViewPart"restorable="true"></view></extension>
(2) 显示视图
在【Window】菜单中,选择【Show View】->【Other...】,选择DemoViewPart就可打开视图。


2、打开视图

在OpenViewAction中打开视图
public class OpenViewAction implements IWorkbenchWindowActionDelegate {private IWorkbenchWindow mWindow;@Overridepublic void run(IAction action) {if (mWindow == null) return;IWorkbenchPage page = mWindow.getActivePage();if (page != null) {try {page.showView("com.plugin.blog.demo.view.DemoViewPart");} catch (PartInitException e) {}}}@Overridepublic void selectionChanged(IAction action, ISelection selection) {}@Overridepublic void dispose() {}@Overridepublic void init(IWorkbenchWindow window) {this.mWindow = window;}}

3、视图界面

新建的View必须继承org.eclipse.ui.part.ViewPart,并完成方法createPartControl和setFocus。
DemoViewPart类包含一个列表,显示着所有用户的姓名和类别。

public class DemoViewPart extends ViewPart {private TableViewer mTableViewer;private Table mTable;private UserManager mManager = UserManager.getInstance();@Overridepublic void createPartControl(Composite parent) {mTableViewer = new TableViewer(parent,SWT.BORDER|SWT.FULL_SELECTION|SWT.MULTI);mTableViewer.setContentProvider(new ListContentProvider());mTableViewer.setLabelProvider(new TableLabelProvider());mTable = mTableViewer.getTable();TableColumn nameColumn = new TableColumn(mTable, SWT.NONE);nameColumn.setText("name");nameColumn.setWidth(120);TableColumn categoryColumn = new TableColumn(mTable, SWT.NONE);categoryColumn.setWidth(80);categoryColumn.setText("category");mTable.setHeaderVisible(true);mTable.setLinesVisible(true);mTableViewer.setInput(mManager);}@Overridepublic void setFocus() {mTable.setFocus();}}
TableLabelProvider类
public class TableLabelProvider implements ITableLabelProvider {@Overridepublic void addListener(ILabelProviderListener listener) {}@Overridepublic void dispose() {}@Overridepublic boolean isLabelProperty(Object element, String property) {return false;}@Overridepublic void removeListener(ILabelProviderListener listener) {}@Overridepublic Image getColumnImage(Object element, int columnIndex) {return null;}@Overridepublic String getColumnText(Object element, int columnIndex) {if (element instanceof User) {User user = (User) element;if (columnIndex == 0) {return user.getName();} else if (columnIndex == 1) {return user.getCategory();}}return null;}}
ListContentProvider类
public class ListContentProvider implements IStructuredContentProvider,PropertyChangeListener {private Viewer viewer;@Overridepublic Object[] getElements(Object inputElement) {if (inputElement instanceof UserManager) {return ((UserManager) inputElement).getElements();}return new Object[0];}@Overridepublic void inputChanged(Viewer viewer, Object oldInput, Object newInput) {this.viewer = viewer;if (oldInput instanceof UserManager) {((UserManager) oldInput).removePropertyChangeListener(this);}if (newInput instanceof UserManager) {((UserManager) newInput).addPropertyChangeListener(this);}}@Overridepublic void propertyChange(PropertyChangeEvent evt) {if (UserManager.PROPERTY_ADD.equals(evt.getPropertyName())) {viewer.refresh();} else if (UserManager.PROPERTY_REMOVE.equals(evt.getPropertyName())) {viewer.refresh();} else if (UserManager.PROPERTY_MODIFY.equals(evt.getPropertyName())) {viewer.refresh();}}}
User类,存储用户的姓名和类别。
public class User {public final static String[] CATEGORY_ARRAY = new String[]{"朋友", "同事", "同学", "亲属"};private String mName;private String mCategory;public User(String name, String category) {this.mName = name;this.mCategory = category;}public String getName() {return mName;}public void setName(String name) {this.mName = name;UserManager.getInstance().modifyObject(this);}public String getCategory() {return mCategory;}public void setCategory(String category) {this.mCategory = category;UserManager.getInstance().modifyObject(this);}}
UserManager类,存放User数据类,是个单例类。
public class UserManager {public final static String PROPERTY_ADD = "add";public final static String PROPERTY_REMOVE = "remove";public final static String PROPERTY_MODIFY= "modify";private List<User> mData = new ArrayList<User>();private PropertyChangeSupport mSupport = new PropertyChangeSupport(this);private UserManager() {// 显示数据,后面删除mData.add(new User("Mike", User.CATEGORY_ARRAY[1]));mData.add(new User("Tom", User.CATEGORY_ARRAY[2]));}public static UserManager getInstance() {return UserManagerHolder.INSTANCE;}public void addObject(User data) {if (mData.add(data)) {mSupport.firePropertyChange(PROPERTY_ADD, null, data);}}public void removeObject(User data) {if (mData.remove(data)) {mSupport.firePropertyChange(PROPERTY_REMOVE, data, null);}}public void modifyObject(Object data) {mSupport.firePropertyChange(PROPERTY_MODIFY, null, data);}public Object[] getElements() {return mData.toArray();}public int getLength() {return mData.size();}public void addPropertyChangeListener(PropertyChangeListener listener) {mSupport.addPropertyChangeListener(listener);}public void removePropertyChangeListener(PropertyChangeListener listener) {mSupport.removePropertyChangeListener(listener);}private static class UserManagerHolder {private static UserManager INSTANCE = new UserManager();}}
显示如下

4、属性视图

在属性视图显示被选中的内容,并且修改。
在DemoViewPart的createPartControl方法中添加

getViewSite().setSelectionProvider(mTableViewer);
由于属性视图只能识别IPropertySource接口数据,需要User数据类实现接口IAdaptable,返回IPropertySource类型数据。
在User类中实现getAdapter方法

public class User implements IAdaptable {@Overridepublic IPropertySource getAdapter(Class adapter) {if (adapter == IPropertySource.class) {return new UserPropertySource(this);}return null;}}
UserPropertySource类
public class UserPropertySource implements IPropertySource {public final static String PROPERTY_NAME= "com.plugin.blog.demo.PROPERTY_NAME";public final static String PROPERTY_CATEGORY= "com.plugin.blog.demo.PROPERTY_CATEGORY";private User mUser;public UserPropertySource(User user) {mUser = user;}@Overridepublic Object getEditableValue() {return mUser;}@Overridepublic IPropertyDescriptor[] getPropertyDescriptors() {TextPropertyDescriptor namePropertyDescriptor =new TextPropertyDescriptor(PROPERTY_NAME, "姓名");ComboBoxPropertyDescriptor agePropertyDescriptor =new ComboBoxPropertyDescriptor(PROPERTY_CATEGORY, "类别", User.CATEGORY_ARRAY);agePropertyDescriptor.setLabelProvider(new LabelProvider() {@Overridepublic String getText(Object element) {return User.CATEGORY_ARRAY[(Integer) element];}});return new IPropertyDescriptor[] { namePropertyDescriptor, agePropertyDescriptor };}@Overridepublic Object getPropertyValue(Object id) {if (PROPERTY_NAME.equals(id)) {return mUser.getName();} else if (PROPERTY_CATEGORY.equals(id)) {for (int index = 0; index < User.CATEGORY_ARRAY.length; index++) {String category = User.CATEGORY_ARRAY[index];if (category.equals(mUser.getCategory())) {return index;}}}return null;}@Overridepublic boolean isPropertySet(Object id) {if (PROPERTY_NAME.equals(id) || PROPERTY_CATEGORY.equals(id)) {return true;}return false;}@Overridepublic void resetPropertyValue(Object id) {}@Overridepublic void setPropertyValue(Object id, Object value) {if (PROPERTY_NAME.equals(id)) {mUser.setName(value.toString());} else if (PROPERTY_CATEGORY.equals(id)) {int index = (Integer) value;if (index >= 0 && index < User.CATEGORY_ARRAY.length) {mUser.setCategory(User.CATEGORY_ARRAY[index]);}}}}
显示如下

5、数据的保存

在DemoViewPart中,覆盖init和saveState方法,用于存储和读取数据。
@Overridepublic void init(IViewSite site, IMemento memento) throws PartInitException {super.init(site, memento);mManager.init(memento);}@Overridepublic void saveState(IMemento memento) {super.saveState(memento);mManager.saveState(memento);}
UserManager类,添加init和saveState方法。mInitialized方法避免重复读取。
public class UserManager {private boolean mInitialized;public void init(IMemento memento) {if (mInitialized) {return;}IMemento[] children = memento.getChildren("UserManager");if (children != null) {for (IMemento child : children) {addObject(new User(child.getString("name"), child.getString("category")));}}mInitialized = true;}public void saveState(IMemento memento) {for (User user : mData) {IMemento child = memento.createChild("UserManager");child.putString("name", user.getName());child.putString("category", user.getCategory());}}}

6、状态栏显示

把DemoViewPart列表中选择行数据显示在状态栏上。
mTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {@Overridepublic void selectionChanged(SelectionChangedEvent event) {IStructuredSelection selection = (IStructuredSelection) event.getSelection();if (!selection.isEmpty()) {User user = (User) selection.getFirstElement();getViewSite().getActionBars().getStatusLineManager().setMessage("name = " + user.getName() + " category = " + user.getCategory());}}});

原创粉丝点击