5

これは、特に 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, ""));
        }
    };
}
}
4

1 に答える 1

4

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>

現在時間がない問題とtodoは、マーカーだけではなく、ルーラーにすべて表示されることです。

説明: Eclipse メニューのコントリビューションでは、それ自体が拡張ポイントです。したがって、右クリックしてポップアップ メニューを表示すると、システムは拡張ポイントのすべての実装者をチェックし、指定されたオブジェクトまたはビューに適用できるかどうかをチェックします。

今後のためのアドバイス

Eclipse プラットフォームはユーザー フレンドリーな文書化されたものとはかけ離れているため、適切な拡張ポイントを探すことは、私が経験した限りでは最も複雑です。私は常に、プラットフォーム自体の既存のソリューションから始めます。JADclipseをインストールし、表示されるテキストを探し始めます。たとえば、プラグイン フォルダで「Quick fix」というテキストを探します。プロパティファイルが見つかります。プロパティのキーが表示されたら、それが含まれているクラスまたは plugin.xml を探します。次に、問題の実際の例が表示されます。これは常に機能し、Googleよりも優れています:)

于 2010-11-04T22:02:39.727 に答える