我的要求是在其中一个第三方视图中添加一个新的菜单条目到“Compare with”。 因为这是使用“org.eclipse.ui.popupMenus”将菜单条目添加到上面的贡献中。即使我被弃用,我甚至被迫使用相同的扩展点。 我能够使用以下代码
为贡献添加菜单条目<extension point="org.eclipse.ui.popupMenus">
<objectContribution
adaptable="true"
id="test.id"
objectClass="local.change">
<action
class="compare.commparetool"
enablesFor="1"
id="id"
label="Compare "
menubarPath="compareWith/group1">
</action>
<visibility>
<objectState
name="local.change"
value=".txt">
</objectState>
</visibility>
</extension>
以上配置工作正常。
下一个要求是添加属性测试器以在选择的文件不是.txt文件时隐藏菜单项。
由于我们无法将属性测试器添加到对象贡献中,因此我使用了IAdapterfactory
。下面的代码不起作用。
观察: 我在“比较”中的不同视图中添加了许多菜单条目(“org.eclipse.ui.menus”),这与此无关。 但是,如果用户单击这些命令中的任何一个,然后尝试相关视图,它就会按预期正常工作。
以下是代码。我错过了什么。我是否还需要在其他地方注册适配器?
<extension point="org.eclipse.core.runtime.adapters">
<factory
adaptableType="local.change"
class="LocalChangeAdapterFactory">
<adapter
type="org.eclipse.ui.IActionFilter">
</adapter>
</factory>
</extension>
public class LocalChangeAdapterFactory implements IAdapterFactory
{
@SuppressWarnings("unchecked")
@Override
public Object getAdapter(final Object adaptableObject, final Class adapterType)
{
if (adapterType == IActionFilter.class)
{
return LocalChangeActionFilter.getInstance();
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public Class[] getAdapterList()
{
return new Class[] { LocalChangeActionFilter.class };
}
}
public class LocalChangeActionFilter implements IActionFilter
{
private static LocalChangeActionFilter INSTANCE = new LocalChangeActionFilter();
private LocalChangeActionFilter()
{
}
@Override
public boolean testAttribute(final Object target, final String name, final String value)
{
String fileName = "";
if(target.getId==1){
return true;
}else{
return false;
}
public static LocalChangeActionFilter getInstance()
{
return INSTANCE;
}
}
答案 0 :(得分:1)
适配器工厂的adaptableType
属性应指定要适应IActionFilter的现有对象的类型。所以这可能是文件资源:
adaptableType="org.eclipse.core.resources.IResource">
getAdapter
的{{1}}方法应返回与IActionFactory
属性匹配的类,而不是您的实现类:
adapter
如果操作过滤器必须测试public Class[] getAdapterList()
{
return new Class[] { IActionFilter.class };
}
参数与testAttribute
中的值匹配,那么您的name
方法:
objectState