2016-07-18 6 views
1

2つのエディタページでエディタを作成しました。私はプロパティテスターで2ページのツールバー項目を追加しました。最初のページで、プロパティテスターはうまく動作します。しかし、エディタを開いて2番目のページを選択してツリー項目を選択すると、プロパティテスタは機能しません。プロパティテスターの評価を要求するマニュアルは機能しません。最初のページで別のビューまたはツリー項目を選択した後、プロパティテスターは2ページ目で正常に動作します。どうしたの?編集者のためここでは例:プロパティテスターが2番目のエディタページで機能しない

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

OK、質問 –

+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); 
} 
関連する問題