这是一个专门针对 Eclipse 平台的插件开发的问题:
我想在右键单击一种 IMarker 时出现的默认菜单中添加一个菜单项(所有标记都是一个好的开始)。
我在实现 IMarkerResolution 并在我的 plugin.xml 中引用它方面取得了一些成功
<extension point="org.eclipse.ui.ide.markerResolution">
<markerResolutionGenerator
markerType="my.stuff.mymarker"
class="my.stuff.MyResolutionGenerator">
</markerResolutionGenerator>
</extension>
但我不想通过 eclipse 快速修复功能访问我的代码,而是想添加我自己的菜单文本而不是“快速修复”,并且不必在快速修复选项旁边显示操作。能够通过(双击)标记来运行操作也非常有用。
我当前的项目使用的是 eclipse 3.5.2。
提前致谢!
更新 我已经解决了这个问题:
<extension point="org.eclipse.ui.menus">
<menuContribution
class="my.stuff.MarkerContributionFactory"
locationURI="popup:#AbstractTextEditorRulerContext?after=additions">
<dynamic
class="my.stuff.MarkerMenuContribution"
id="my.stuff.MarkerMenuContribution">
</dynamic>
</menuContribution>
</extension>
public class MarkerContributionFactory extends ExtensionContributionFactory{
@Override
public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions){
ITextEditor editor = (ITextEditor)
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
additions.addContributionItem(new MarkerMenuContribution(editor), null);
}
}
public class MarkerMenuContribution extends ContributionItem{
private ITextEditor editor;
private IVerticalRulerInfo rulerInfo;
private List<IMarker> markers;
public MarkerMenuContribution(ITextEditor editor){
this.editor = editor;
this.rulerInfo = getRulerInfo();
this.markers = getMarkers();
}
private IVerticalRulerInfo getRulerInfo(){
return (IVerticalRulerInfo) editor.getAdapter(IVerticalRulerInfo.class);
}
private List<IMarker> getMarkers(){
List<IMarker> clickedOnMarkers = new ArrayList<IMarker>();
for (IMarker marker : getAllMarkers()){
if (markerHasBeenClicked(marker)){
clickedOnMarkers.add(marker);
}
}
return clickedOnMarkers;
}
//Determine whether the marker has been clicked using the ruler's mouse listener
private boolean markerHasBeenClicked(IMarker marker){
return (marker.getAttribute(IMarker.LINE_NUMBER, 0)) == (rulerInfo.getLineOfLastMouseButtonActivity() + 1);
}
//Get all My Markers for this source file
private IMarker[] getAllMarkers(){
return ((FileEditorInput) editor.getEditorInput()).getFile()
.findMarkers("defined.in.plugin.xml.mymarker", true, IResource.DEPTH_ZERO);
}
@Override
//Create a menu item for each marker on the line clicked on
public void fill(Menu menu, int index){
for (final IMarker marker : markers){
MenuItem menuItem = new MenuItem(menu, SWT.CHECK, index);
menuItem.setText(marker.getAttribute(IMarker.MESSAGE, ""));
menuItem.addSelectionListener(createDynamicSelectionListener(marker));
}
}
//Action to be performed when clicking on the menu item is defined here
private SelectionAdapter createDynamicSelectionListener(final IMarker marker){
return new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
System.out.println(marker.getAttribute(IMarker.MESSAGE, ""));
}
};
}
}
最佳答案
您应该在 http://www.eclipse.org/articles/article.php?file=Article-action-contribution/index.html 学习教程.这是一篇关于基本 UI 内容的好文章。
如果您点击标尺,下面的代码可以让您定义一个弹出菜单操作:
<extension
point="org.eclipse.ui.popupMenus">
<viewerContribution
targetID="#CompilationUnitRulerContext"
id="Q4098270.contribution1">
<menu
label="New Submenu"
path="additions"
id="Q4098270.menu1">
<separator
name="group1">
</separator>
</menu>
<action
label="New Action"
class="q4098270.popup.actions.NewAction"
menubarPath="Q4098270.menu1/group1"
id="Q4098270.newAction">
</action>
</viewerContribution>
</extension>
我目前没有时间处理的问题和待办事项是它不仅针对标记显示,还针对标尺上的所有内容显示。
解释: 在 Eclipse 菜单贡献本身就是扩展点。因此,如果您右键单击以查看弹出菜单,系统将检查扩展点的所有实现者,并检查是否适用于给定的对象或 View 。
对 future 的一些建议
由于 Eclipse 平台远非用户友好的文档化平台,因此根据我的经验,寻找合适的扩展点是最复杂的。我总是从平台本身的现有解决方案开始。所以安装 JADclipse , 并开始寻找显示的文本。例如,在插件文件夹中查找文本“Quick fix”。您会找到一个属性文件。您会看到属性的键,然后查找它所在的类或 plugin.xml。然后您将看到针对您的问题的一个活生生的例子。这总是有效的,甚至比谷歌更好:)
关于java - 如何制作 Eclipse 插件扩展,在用户单击标记时显示不同的上下文菜单项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098270/