Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何制作一个Eclipse插件扩展,当用户单击一个标记时,它会显示不同的上下文菜单项?_Java_Eclipse_Eclipse Plugin_Popup_Marker - Fatal编程技术网

Java 我如何制作一个Eclipse插件扩展,当用户单击一个标记时,它会显示不同的上下文菜单项?

Java 我如何制作一个Eclipse插件扩展,当用户单击一个标记时,它会显示不同的上下文菜单项?,java,eclipse,eclipse-plugin,popup,marker,Java,Eclipse,Eclipse Plugin,Popup,Marker,这是一个专门针对Eclipse平台的插件开发的问题: 我想在默认菜单中添加一个菜单项,该菜单在右键单击一种IMarker时显示(所有标记都是一个好的开始) 我在实现IMarkerResolution并在plugin.xml中引用它方面取得了一些成功 <extension point="org.eclipse.ui.ide.markerResolution"> <markerResolutionGenerator markerType="my.stuff.mymarker"

这是一个专门针对Eclipse平台的插件开发的问题:

我想在默认菜单中添加一个菜单项,该菜单在右键单击一种IMarker时显示(所有标记都是一个好的开始)

我在实现IMarkerResolution并在plugin.xml中引用它方面取得了一些成功

<extension point="org.eclipse.ui.ide.markerResolution">
<markerResolutionGenerator
  markerType="my.stuff.mymarker" 
  class="my.stuff.MyResolutionGenerator">
</markerResolutionGenerator>
</extension>

但是,我不想通过eclipse快速修复功能访问我的代码,而是想添加我自己的菜单文本,而不是“快速修复”,并且不必在快速修复选项旁边显示操作。能够通过(双击)标记来运行操作也非常有用

我在当前项目中使用Eclipse3.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, ""));
        }
    };
}
}

公共类MarkerContributionFactory扩展了ExtensionContributionFactory{
@凌驾
public void createContributionItems(IServiceLocator服务定位器、IContributionRoot添加){
ITextEditor编辑器=(ITextEditor)
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
additions.addContributionItem(新的MarkerNuContribution(编辑器),null);
}
}
公共阶级市场贡献扩大了贡献主义{
私人ITextEditor编辑器;
私人IverticalruleInfo RuleInfo;
私有列表标记;
public MarkerMenuContribution(ITextEditor编辑器){
this.editor=editor;
this.rulerInfo=getRulerInfo();
this.markers=getMarkers();
}
私有IVerticalRulerInfo getRulerInfo(){
return(IVerticalRulerInfo)editor.getAdapter(IVerticalRulerInfo.class);
}
私有列表getMarkers(){
列表clickedOnMarkers=new ArrayList();
对于(IMarker标记:getAllMarkers()){
如果(标记已勾选(标记)){
单击取消标记。添加(标记);
}
}
返回单击的非标记;
}
//确定是否已使用标尺的鼠标侦听器单击标记
私有布尔标记已被选中(IMarker标记){
return(marker.getAttribute(IMarker.LINE_NUMBER,0))==(rulerInfo.getLineOfLastMouseButtonActivity()+1);
}
//获取此源文件的所有标记
专用IMarker[]getAllMarkers(){
return((FileEditorInput)editor.getEditorInput()).getFile()
.findMarkers(“defined.in.plugin.xml.mymarker”,true,IResource.DEPTH_ZERO);
}
@凌驾
//为单击的行上的每个标记创建一个菜单项
公共空白填充(菜单,整数索引){
用于(最终图像标记器:标记器){
MenuItem MenuItem=新MenuItem(菜单、SWT.CHECK、索引);
menuItem.setText(marker.getAttribute(IMarker.MESSAGE,”);
menuItem.addSelectionListener(createDynamicSelectionListener(marker));
}
}
//此处定义了单击菜单项时要执行的操作
私有选择适配器createDynamicSelectionListener(最终IMarker标记){
返回新的SelectionAdapter(){
公共无效WidgeSelected(SelectionEvent e){
System.out.println(marker.getAttribute(IMarker.MESSAGE,“”);
}
};
}
}

您应该在以下位置学习本教程。这是一篇关于基本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>


,并开始查找显示的文本。例如,在plugins文件夹中查找文本“quickfix”。您将找到一个属性文件。您可以看到属性的键,然后查找它所在的类或plugin.xml。然后你会看到一个活生生的例子来解决你的问题。这总是有效的,甚至比谷歌更好:)

谢谢你的帮助,我在谷歌上转了一圈,有一段时间了,也许在这个上下文中,插件间谍(Ctrl+Alt+F1)或插件菜单间谍(Ctrl+Alt+F2)也很有用。使用PluginSpy,您可以在视图或编辑器中找到具有焦点的贡献类和插件。当您使用plugin menu spy时,您的鼠标光标会变成一个放大镜,您可以单击菜单和动作贡献来查看有关它们的更多信息(包括ID或位置URI)。对于我来说,插件选择spy会使用Alt+Shift+F1打开吗?