2010-11-04 3 views
5

Это вопрос конкретно о разработке плагин для платформы 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 3.5.2 для моего текущего проекта.

Заранее благодарен!

Update я решил это:

<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, "")); 
     } 
    }; 
} 
} 

ответ

4

вы должны взять учебник по 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> 

задачи и TODO, которые я не имею времени, в настоящее время для является то, что он не будет отображаться только для маркеров, но все вещи на линейка.

Пояснение: В меню затмения сами взносы являются точками расширения. Поэтому, если вы щелкнете правой кнопкой мыши, чтобы открыть всплывающее меню, система проверит всех разработчиков точки расширения и проверит, что они применимы для данного объекта или представления.

Некоторые советы для будущих

Поскольку платформы Eclipse, далеко от удобной документированы один, охотясь соответствующие точки расширения является наиболее сложным, насколько я испытал. Я всегда начинаю с существующих решений в самой платформе. Поэтому установите JADclipse и начните искать отображаемые тексты. Например, найдите текст «Быстрое исправление» в папке плагинов. Вы найдете файл свойств. Вы видите ключ свойства, затем найдите класс или plugin.xml, в котором он находится. Затем вы увидите живой пример своей проблемы. Это всегда работает, и даже лучше, чем Google :)

+0

Спасибо за вашу помощь, я собирался в кругах на google некоторое время там – Matt

+3

Привет, может быть, полезно в этом контексте также Plugin Spy (Ctrl + Alt + F1) или Plugin Menu Spy (Ctrl + Alt + F2). Используя плагин-шпион, вы можете найти способствующие классы и плагины в представлении или редактор, который имеет фокус. Когда вы используете шпионский модуль плагина, курсор мыши поворачивается к увеличительному стеклу, которое вы можете щелкнуть по меню и действиям, чтобы просмотреть дополнительную информацию (включая идентификаторы или URI местоположения) о них. – zardosht

+2

для меня Штукатурка выбора Шпион открывается с помощью Alt + Shift + F1? – eactor