2016-07-18 31 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); 
} 
相關問題