如何避免删除 XSD 文件的根元素
How to avoid to remove the root element of a XSD file
我正在尝试使 xsd 文件的根元素或父元素的删除选项变灰。它在其派生节点中工作,但在根节点中不工作。
这是有效的:
<xs:attribute name="user-login" type="xs:string" use="required"/>
这在父元素中不起作用:
<xs:element name="MyProgram-Deploy" use="required">
在 XSD 中,use="required"
不适合 xs:element
。而是使用 minOccurs="1"
来指示该元素是必需的。但是请注意,根元素是全局声明的,minOccurs
和 maxOccurs
不适用于全局声明的元素。 XML 文档中必须有 恰好一个根元素 ;它是非可选的,不能重复。
最后,我所做的是创建一个从 XMLNodeActionManager 继承的 Java class,它是从 IMenuListener class 的继承 class 调用的。
每次显示上下文时都会调用此 IMenuListener,因此您必须覆盖 XMLTableTreeViewer 的 inherit class 的方法 createContextMenu() 才能使用以前的侦听器。
在 XMLNodeActionManager class 中,我检查了上下文菜单的所有选项并删除了我不想要的选项:
XMLTableTreeViewer.createContextMenu -> IMenuListener -> XmlNodeActionManager.contributeActions
MyTestIMenuListener:
class MyTestNodeActionMenuListener implements IMenuListener {
@Override
public void menuAboutToShow(org.eclipse.jface.action.IMenuManager manager) {
SilecsXmlNodeActionManager nodeActionManager = new MyTestXmlNodeActionManager(
((IDOMDocument) getInput()).getModel(), MyTestXMLTableTreeViewer.this);
nodeActionManager.fillContextMenu(manager, getSelection());
}
}
MyTestXMLTableTreeViewer 扩展 XMLTableTreeViewer:
@Override
protected void createContextMenu() {
MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
contextMenu.add(new Separator("additions")); //$NON-NLS-1$
contextMenu.setRemoveAllWhenShown(true);
contextMenu.addMenuListener(new MyTestNodeActionMenuListener());
Menu menu = contextMenu.createContextMenu(getControl());
getControl().setMenu(menu);
}
MyTestXmlNodeActionManager 扩展 XmlNodeActionManager:
@Override
public void contributeActions(IMenuManager menu, List selection) {
super.contributeActions(menu, selection);
Node node = (Node) selection.iterator().next();
IContributionItem removeMenuItem = null;
try {
IContributionItem[] menuItems = menu.getItems();
for (IContributionItem menuItem: menuItems) {
if (menuItem instanceof ActionContributionItem) {
if (((ActionContributionItem) menuItem).getAction() instanceof AbstractNodeActionManager.DeleteAction) {
removeMenuItem = menu.remove(menuItem);
break;
}
}
}
} catch (Exception e) {
}
}
我正在尝试使 xsd 文件的根元素或父元素的删除选项变灰。它在其派生节点中工作,但在根节点中不工作。
这是有效的:
<xs:attribute name="user-login" type="xs:string" use="required"/>
这在父元素中不起作用:
<xs:element name="MyProgram-Deploy" use="required">
在 XSD 中,use="required"
不适合 xs:element
。而是使用 minOccurs="1"
来指示该元素是必需的。但是请注意,根元素是全局声明的,minOccurs
和 maxOccurs
不适用于全局声明的元素。 XML 文档中必须有 恰好一个根元素 ;它是非可选的,不能重复。
最后,我所做的是创建一个从 XMLNodeActionManager 继承的 Java class,它是从 IMenuListener class 的继承 class 调用的。 每次显示上下文时都会调用此 IMenuListener,因此您必须覆盖 XMLTableTreeViewer 的 inherit class 的方法 createContextMenu() 才能使用以前的侦听器。 在 XMLNodeActionManager class 中,我检查了上下文菜单的所有选项并删除了我不想要的选项:
XMLTableTreeViewer.createContextMenu -> IMenuListener -> XmlNodeActionManager.contributeActions
MyTestIMenuListener:
class MyTestNodeActionMenuListener implements IMenuListener {
@Override
public void menuAboutToShow(org.eclipse.jface.action.IMenuManager manager) {
SilecsXmlNodeActionManager nodeActionManager = new MyTestXmlNodeActionManager(
((IDOMDocument) getInput()).getModel(), MyTestXMLTableTreeViewer.this);
nodeActionManager.fillContextMenu(manager, getSelection());
}
}
MyTestXMLTableTreeViewer 扩展 XMLTableTreeViewer:
@Override
protected void createContextMenu() {
MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
contextMenu.add(new Separator("additions")); //$NON-NLS-1$
contextMenu.setRemoveAllWhenShown(true);
contextMenu.addMenuListener(new MyTestNodeActionMenuListener());
Menu menu = contextMenu.createContextMenu(getControl());
getControl().setMenu(menu);
}
MyTestXmlNodeActionManager 扩展 XmlNodeActionManager:
@Override
public void contributeActions(IMenuManager menu, List selection) {
super.contributeActions(menu, selection);
Node node = (Node) selection.iterator().next();
IContributionItem removeMenuItem = null;
try {
IContributionItem[] menuItems = menu.getItems();
for (IContributionItem menuItem: menuItems) {
if (menuItem instanceof ActionContributionItem) {
if (((ActionContributionItem) menuItem).getAction() instanceof AbstractNodeActionManager.DeleteAction) {
removeMenuItem = menu.remove(menuItem);
break;
}
}
}
} catch (Exception e) {
}
}