Как сделать расширение плагина Eclipse, которое отображает различные элементы контекстного меню, когда пользователь щелкает маркер? - PullRequest
5 голосов
/ 04 ноября 2010

Это вопрос конкретно о разработке плагинов для платформы 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, ""));
        }
    };
}
}

1 Ответ

4 голосов
/ 05 ноября 2010

вы должны взять учебник по адресу http://www.eclipse.org/articles/article.php?file=Article-action-contribution/index.html. Это хорошая статья об основных элементах пользовательского интерфейса.

Следующее позволит вам определить действие всплывающего меню, если вы нажмете на линейку:

   <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 далека от удобной для пользователя, поиск правильных точек расширения является наиболее сложным, насколько я знаю.Я всегда начинаю с существующих решений в самой платформе.Так что установите JADclipse и начните искать отображаемые тексты.Например, найдите текст «Быстрое исправление» в папке плагинов.Вы найдете файл свойств.Вы видите ключ свойства, затем ищите класс или plugin.xml, в котором оно находится. Затем вы увидите живой пример вашей проблемы.Это всегда работает, и даже лучше, чем Google:)

...