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

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

person Matt    schedule 04.11.2010    source источник


Ответы (1)


вам следует ознакомиться с учебным пособием по адресу 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 :)

person Gábor Lipták    schedule 04.11.2010
comment
Спасибо за вашу помощь, я некоторое время ходил по кругу в гугле - person Matt; 05.11.2010
comment
Привет, может быть полезным в этом контексте также является Plugin Spy (Ctrl+Alt+F1) или Plugin Menu Spy (Ctrl+Alt+F2). Используя плагин-шпион, вы можете найти участвующие классы и плагины в представлении или редакторе, который имеет фокус. Когда вы используете шпионское меню плагина, ваш курсор мыши превращается в увеличительное стекло, которое вы можете щелкнуть по меню и действиям, чтобы увидеть больше информации (включая идентификаторы или URI местоположения) о них. - person zardosht; 19.03.2012
comment
для меня плагин Selection Spy открывается с помощью Alt+Shift+F1 ? - person eactor; 23.01.2013