创建编辑器的上下文操作,targetID="#TextEditorContext",为eclipse默认文件编辑器的上下文菜单标识符。实现类必须实现IEditorActionDelegate接口。
Java编辑器对应的ID为:#TextEditorContext和 #CompilationUnitEditorContext,定义好targetID,就把我们的插件id指向视图菜单的id了。这样Java编辑器就会添加我们的菜单项了。
targetID用来与特定的编辑器,查看器,菜单绑定。
命令与键绑定,和操作相关联。命令只是操作的声明,操作的具体实现细节由操作本身来完成。将命令从操作实现中分离出来。
Org.eclipse.ui.commands扩展点 定义命令
Org.eclipse.ui.bindings扩展点 与命令和键绑定
视图的实现类都必须实现org.eclipse.ui.IViewPart接口,一般都会集成org.eclipse.ui.ViewPart类。
视图的行为由一个实现了org.eclipse.ui.IViewPart接口的类定义
IStructuredContentProvider结构化内容提供者负责从输入对象中提取对象,把它传递给表格查看器进行显示。AddressViewContentProvider实现IStructuredContentProvider(内容与查看器的绑定)和 AddressManagerListener接口(监听模型变化)。
AddressViewContentProvider通过AddressManager获取模型来提供显示
AddressViewContentProvider实现AddressManagerListener的addressesChanged方法。
LableProvider标签提供者将获取内容提供者返回的一个表格行对象,并提取要显示到的列上的值。
ITableLabelProvider接口要求实现getColumnText和getColumnImage两个主要的方法,getColumnText返回指定单元格的显示文本,getColumnImage返回指定单元格的显示图标。
根据对表格列的判断来显示相应区域的文本和图像。
public String getColumnText(Object element, int columnIndex),其中element表示单元格所在行的对象,columnIndex表示单元格所在的列,返回显示的文本。
public Image getColumnImage(Object element, int columnIndex),其中element表示单元格所在行的对象,columnIndex表示单元格所在的列,返回此单元格的显示图标。
ViewerSorter查看器排序器用于对内容提供者提供的元素进行排序,继承ViewerSorter类。
一个视图仅可以有一个内容提供者,一个标签提供者和一个排序器,但过滤器可以有很多个。
ViewerFilter类用于确定显示内容提供者返回的哪些行对象,不显示哪些行对象。
获取当前选中项,先查找视图,找到该视图后,调用getSelection()得到当前选择项,然后马上转换为IStructuredSelection,以后的操作就是统一的了,因为有IStructuredSelection接口。如果是在action中遇到这种需求,就将event调用getSelection(),然后转换为IStructuredSelection,后续操作相同。
Eclipse的每个视图(View)都有自己的菜单和工具条,View通过与自己相关的IViewSite对象与这些东西打交道,确切的说,是通过这个IViewSite对象的IActionBars对象来管理,ActionBars对象负责菜单、工具条和状态栏。
makeActions是创建操作,必要的IAction对象,这些对象可用在菜单、工具条里。
hookContextMenu是把刚刚创建的IAction对象放进与View相关的MenuManager里。
当触发了menu事件时,重新填充(fillContextMenu)
setRemoveAllWhenShown(true)的作用是清空以前显示的菜单项。不把removeAllWhenShow置为true的话,每点一下右键你就会看到菜单项多出一倍来。
用MenuManager可以创建出一个Menu对象,然后我们用表格的setMenu方法将表格控件与Menu控件联系在一起就好了。
getSite().registerContextMenu(menuMgr, viewer)这是context menu能不能显示的关键。一个视图中可以有多个context menu,而每一个context menu都必须注册给workbench。这需要通过调用org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider)或者(当有多个注册的context menu时)org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) 增加的参数menuId用于区分不同的context menu。
上下文菜单比工具栏多一步创建上下文菜单。
属性视图支持所有实现IResource接口的资源。
一个视图(View)希望得到另外一个视图显示的内容,或者选择的内容。在Eclipse中,比较标准的做法是通过ISelectionProvider和ISelectionListener来完成的。
Eclipse为了解决这个问题,提供了所谓的Site,以及ISelectionService机制,来处理视图之间的简单的交互。简单的说,ViewSite提供了一个交互的中心点,其它View向ViewSite提供选择事件,或者向其注册监听器,而事件的触发与转发则由ViewSite()来完成。只需在View中实现ISelectionListener接口,就可以监听其他Workbench部分发生的选择事件。
向Workbench注册监听器
getSite().getPage().addSelectionListener(this);
向特定WorkbenchID注册监听器
getSite().getPage().addSelectionListener(String WorkbenchID, ISelectionListener);
并实现selectionChanged方法来处理监听器捕获到的事件。
一个ISelectionProvider如果希望被别的View进行监听的话,则应该向其Site()进行注册。
getViewSite().setSelectionProvider(viewer);
IPropertySource的实现类必须为每个显示在属性视图中的项创建一个属性描述符。
ComboBoxPropertyDescriptor可以在属性视图的单元格中显示复选框,但必须为其定义标签提供者和一组String数组为显示内容。getText的参数是getPropertyValue的返回值,这个返回值必须是整数。在ComboBoxPropertyDescriptor中,每个项是按照它们的索引号来区分的。在initProperties中,将类别名用整数表示。
Integer item = (Integer)element;
表格查看器添加状态栏支持,则表格查看器添加监听器ISelectionChangedListener。