2014-10-15 2 views
0

Я пытаюсь преобразовать запись маркера в настраиваемый объект и намереваясь выполнить его, щелкнув правой кнопкой мыши на записи маркера в представлении таблицы маркеров и вызывая действие/обработчик из вариант в контекстном меню.Как выбрать запись маркера из вида Markers

Но в обработчике, когда я пытаюсь получить доступ к выбору, объект возвращается является MarkerEntry (org.eclipse.ui.internal.views.markers.MarkerEntry), а не IMarker. Поскольку MarkerEntry является внутренним классом, не уверен, как его использовать, а также если его безопасно использовать.

Пожалуйста, предложите любые варианты решения. Соответствующий код и plugin.xml фрагмент кода ниже

plugin.xml

<extension point="org.eclipse.ui.views"> 
    <view class="view.ReviewMarkerView" icon="icons/insta_window_16.png" id="id.instaReviewMarkerView" name="Insta Review Defects"> </view> 
</extension> 

<extension point="org.eclipse.ui.commands"> 
    <command defaultHandler="handlers.DefectToReviewIssueHandler" id="id.defectToReviewIssueHandler" name="Add defect to Review Tracker"></command> 
</extension> 

<extension point="org.eclipse.ui.menus">  
    <menuContribution locationURI="popup:id.instaReviewMarkerView"> 
     <command commandId="id.defectToReviewIssueHandler" style="push"></command> 
    </menuContribution> 
</extension> 

Java класс:

public class MarkerToReviewIssueHandler extends AbstractHandler { 

    public MarkerToReviewIssueHandler() { 
    } 

    public Object execute(ExecutionEvent event) throws ExecutionException { 

     IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); 

     IWorkbenchPage page = window.getActivePage(); 

     ReviewMarkerView view = (ReviewMarkerView) page.findView("id.instaReviewMarkerView"); 

     ISelection sel = view.getSite().getSelectionProvider().getSelection(); 

     if (sel != null && sel instanceof IStructuredSelection) { 

      Iterator iterator = (IStructuredSelection) sel).iterator(); 

      while (iterator.hasNext()) { 

       Object item = iterator.next(); 

       if (item instanceof IMarker) { 

        // convert the marker to a review issue. 
       } 
      } 

     } else { 
      //Show error to select a review defect 
     } 

     return null; 
    } 
} 

ответ

1

Как вы говорите MarkerEntry является внутренним, так что вы не должны ссылаться на класса.

Однако MarkerEntry это реализовать IAdaptable и это обеспечивает способ получить IMarker:

if (item instanceof IAdaptable) 
{ 
    IAdaptable adaptable = (IAdaptable)item; 

    IMarker marker = (IMarker)adaptable.getAdapter(IMarker.class); 
} 
+0

Fantastic !! Очень элегантное решение. –

Смежные вопросы