2016-07-18 3 views
1

두 개의 편집기 페이지로 편집기를 만들었습니다. 속성 테스터가있는 두 페이지에 대한 도구 모음 항목을 추가했습니다. 첫 번째 페이지에서 속성 테스터가 올바르게 작동합니다. 하지만 편집기를 열고 두 번째 페이지를 선택하고 트리 항목을 선택하면 속성 테스터가 작동하지 않습니다. 부동산 테스터의 평가를 요구하는 매뉴얼은 작동하지 않습니다. 첫 번째 페이지에서 다른보기 또는 트리 항목을 선택한 후에는 속성 테스터가 두 번째 페이지에서도 잘 작동합니다. 뭐가 문제 야? 여기 편집기 예 :속성 검사기가 두 번째 편집기 페이지에서 작동하지 않습니다.

public class MyEditor extends FormEditor { 

    @Override 
    protected void addPages() { 
     try { 
      addPage(new MyPage(this)); 
      addPage(new MyPage(this)); 
     } catch (PartInitException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public boolean isSaveAsAllowed() { 
     return false; 
    } 

    @Override 
    public void doSave(IProgressMonitor monitor) { 
     // nothing to do 
    } 

    @Override 
    public void doSaveAs() { 
     // nothing to do 
    } 

} 

class MyPage extends FormPage { 

    private static final String TOOLBAR_URI = "toolbar:my.page"; 

    public MyPage(final FormEditor editor) { 
     super(editor, MyPage.class.getName(), "Test"); 
    } 

    @Override 
    protected void createFormContent(final IManagedForm managedForm) { 

     final ScrolledForm form = managedForm.getForm(); 

     final ToolBarManager toolbarManager = (ToolBarManager) form.getToolBarManager(); 
     final IMenuService menuService = (IMenuService) getSite().getService(IMenuService.class); 
     menuService.populateContributionManager(toolbarManager, TOOLBAR_URI); 

     final Composite body = managedForm.getForm().getBody(); 
     body.setLayout(new GridLayout()); 

     final TreeViewer treeViewer = new TreeViewer(body); 
     treeViewer.setContentProvider(new MyContentProvider()); 
     treeViewer.setLabelProvider(new ColumnLabelProvider()); 
     treeViewer.setInput(Arrays.asList(new String[] { "A", "B", "C" })); 

     getSite().setSelectionProvider(treeViewer); 
    } 

} 

class MyContentProvider implements ITreeContentProvider { 

    @Override 
    public Object[] getElements(final Object inputElement) { 
     return ((List<String>) inputElement).toArray(); 
    } 

    @Override 
    public Object[] getChildren(final Object parentElement) { 
     return new Object[] {}; 
    } 

    @Override 
    public Object getParent(final Object element) { 
     return null; 
    } 

    @Override 
    public boolean hasChildren(final Object element) { 
     return false; 
    } 

    @Override 
    public void dispose() { 
     // nothing to do 
    } 

    @Override 
    public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { 
     // nothing to do 
    } 
} 

처리기 :

<handler 
    class="EditHandler" 
    commandId="myEdit"> 
    <activeWhen> 
     <with 
      variable="selection"> 
      <test 
       property="my.active"> 
      </test> 
     </with> 
    </activeWhen> 
</handler> 

재산권 테스터 등록 :

<propertyTester 
    class="MyPropertyTester" 
    id="MyPropertyTester" 
    namespace="my" 
    properties="active" 
    type="java.lang.Object"> 
</propertyTester> 

부동산 테스터 :

public class MyPropertyTester extends PropertyTester { 

    public static final String ID = MyPropertyTester.class.getName(); 

    public static final String ACTIVE = "active"; 

    @Override 
    public boolean test(final Object receiver, final String property, final Object[] args, final Object expectedValue) { 

     if (receiver instanceof IStructuredSelection) { 
      final IStructuredSelection selection = (IStructuredSelection) receiver; 
      if (selection.size() == 1) { 
       return isMatch(property); 
      } 
     } 
     return false; 
    } 

    private static boolean isMatch(final String property) { 
     if (ACTIVE.equals(property)) { 
      return true; 
     } 
     return false; 
    } 

} 
+0

부동산 테스터가 실제로 테스트하는 내용을 말씀하지 않았습니다. –

+0

오케이, 질문을 업데이트했습니다. –

+0

해당 속성 테스터 정의를 사용하면'my.active'가'active'가 아닌지 테스트해야합니다. 당신은 여전히 ​​부동산 테스터 코드가 실제로 테스트하고있는 것을 말하지 않았습니다. –

답변

0

내가 해킹을 통해 그것을 "고정" 에디터 페이지 변경 :

@Override 
protected void pageChange(int newPageIndex) { 
    List<IWorkbenchPart> views = ... // find all opened IWorkbenchPart 
    if (!views.isEmpty()) { 
     views.get(0).setFocus(); 
     this.setFocus(); 
    } 
    super.pageChange(newPageIndex); 
}