我正在尝试做一些看起来应该很常见的事情,所以我很惊讶我很难找到解决方案。
我有一个简单的Eclipse RCP应用程序。它由一个视图组成,其中包含一个treeViewer,它以层次结构的方式显示xml文件的元素。另一面是编辑器,它包含各种字段,如文本框等,用于显示和修改xml值。 treeviewer在元素名称旁边显示图标,我想要做的是在编辑器中进行更改时将图标更改为图标的“修改”版本 - 表示该元素的值已更改。这与Eclipse与subversion集成时的方式非常相似,表明已经从Package Explorer中的基本修订版修改了文件。
我会尝试只显示与此特定问题相关的代码部分,并希望我不要遗漏任何内容。这是编辑器类:
public class XmlEditor extends EditorPart
{
protected boolean dirty = false;
public void setDirty(boolean value)
{
dirty = value;
firePropertyChange(PROP_DIRTY);
}
}
这是树的视图:
public class TreeView extends ViewPart implements IPropertyChangeListener {
public void createPartControl(Composite parent) {
treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
getSite().setSelectionProvider(treeViewer);
treeViewer.setLabelProvider(new TreeObjLabelProvider());
treeViewer.setContentProvider(new TreeObjContentProvider());
PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(this);
}
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(IWorkbenchPartConstants.PROP_DIRTY)) {
treeViewer.refresh();
}
}
}
在这种情况下,即使TreeView::propertyChange()
被解雇,也不会调用firePropertyChange()
。有什么想法吗?我也对任何其他不涉及PropertyChangeListener的想法持开放态度,看起来这似乎是当时最简单的方法。谢谢。
答案 0 :(得分:4)
以下是我最终解决问题的方法:
IPropertyListener
而不是IPropertyChangeListener
propertyChanged()
方法以执行treeViewer.refresh()
XmlEditor::createPartControl()
方法中,我获得了对Treeview
部分的引用,然后将其添加到属性侦听器中,如下所示:
TreeView treeView = (TreeView) getSite().getPage().findView(TreeView.ID);
addPropertyListener(treeView);
现在,TreeView::propertyChanged()
在firePropertyChanged()
之后被调用,就像我需要的那样。我需要花费大量的实验来了解IPropertyListener
和IPropertyChangeListener
,addPropertyListener()
和addPartPropertyListener()
之间的区别。
感谢nitind为我提供了一个新视角,并向我展示了装饰器,这绝对是正确的方法,而不是将树图标更改为修改版本。
答案 1 :(得分:0)
您在编辑器部分中触发了属性更改,该更改与工作集管理器无关。您没有做任何事情将视图连接到编辑器。如果你想让这两个人互相交谈,写下他们互相交谈,或者至少创造并做出反应来做你所描述的修改。
我也非常确定SVN不会显示文件已被修改。 SVN可能会提供一个装饰器:http://eclipse.org/articles/Article-Decorators/decorators.html
答案 2 :(得分:0)
在您的创建部件控件中添加这一串代码,这可能会对您有所帮助
ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {
@Override
public void resourceChanged(IResourceChangeEvent event) {
treeViewer.refresh();
}
});