由于在我的第一个答案中添加另一个解决方案会让人感到困惑,因此我将为第二个解决方案提供另一个解决方案。
我给出的选择是“A)使用“执行事件”的选定对象(检查一下,它包含很多信息)。B)您可以使用 AbstractSourceProvider,这样您就可以将对象传递到应用程序上下文。”
如果您的对象是选择结构化对象(如树),则可以在您的处理程序中使用 A):
MyObject p = (MyObject) ((IStructuredSelection) HandlerUtil.getCurrentSelection(event)).getFirstElement();
B) 源提供者的使用有点棘手。主要思想是将对象添加到应用程序上下文中。阅读后我设置的一个项目中 Eclipse 3.x 的重要片段这个博客 http://splitshade.wordpress.com/2008/11/11/sourceproviders/(注意:它是德语,它提供的示例不起作用):
在你的plugin.xml中添加:
<extension point="org.eclipse.ui.services">
<sourceProvider
provider="com.voo.example.sourceprovider.PersonSourceProvider">
<variable
name="com.voo.example.sourceprovider.currentPerson"
priorityLevel="activePartId">
</variable>
</sourceProvider>
设置您自己的 SourceProvider。调用“getCurrentState”您可以获取变量(您的Person在本例中)该 SourceProvider 的对象:
public class PersonSourceProvider extends AbstractSourceProvider{
/** This is the variable that is used as reference to the SourceProvider
*/
public static final String PERSON_ID = "com.voo.example.sourceprovider.currentPerson";
private Person currentPerson;
public PersonSourceProvider() {
}
@Override
public void dispose() {
currentPerson = null;
}
**/**
* Used to get the Status of the source from the framework
*/
@Override
public Map<String, Person> getCurrentState() {
Map<String, Person> personMap = new HashMap<String, Person>();
personMap.put(PERSON_ID, currentPerson);
return personMap;
}**
@Override
public String[] getProvidedSourceNames() {
return new String[]{PERSON_ID};
}
public void personChanged(Person p){
if (this.currentPerson != null && this.currentPerson.equals(p)){
return;
}
this.currentPerson = p;
fireSourceChanged(ISources.ACTIVE_PART_ID, PERSON_ID, this.currentPerson);
}
}
在您的视图中,您注册到 SourceProvider 并将对象设置为您想要传输到处理程序的对象。
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent);
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setContentProvider(new ViewContentProvider());
viewer.setInput(rootPerson);
getSite().setSelectionProvider(viewer);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
Person p = null;
if (event.getSelection() instanceof TreeSelection) {
TreeSelection selection = (TreeSelection) event.getSelection();
if (selection.getFirstElement() instanceof Person) {
p = (Person) selection.getFirstElement();
}
}
if (p==null) {
return;
}
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
ISourceProviderService service = (ISourceProviderService) window.getService(ISourceProviderService.class);
PersonSourceProvider sourceProvider = (PersonSourceProvider) service.getSourceProvider(PersonSourceProvider.PERSON_ID);
sourceProvider.personChanged(p);
}
});
}
在您的处理程序中,您只需调用 PersonSourceProvider#getCurrentState 即可取回您的对象。
这种方法的优点是,您可以在任何您想要的地方使用对象。例如。您甚至可以设置属性测试器来根据当前选定的对象启用/禁用 UI 元素。