使用dom4j从XML配置文件中生成菜单(二)

XMLMenu.java

import  java.io.File;
import  java.util.Iterator;

import  org.dom4j. * ;
import  org.dom4j.io.SAXReader;
import  org.eclipse.swt.SWT;
import  org.eclipse.swt.events. * ;
import  org.eclipse.swt.graphics.Point;
import  org.eclipse.swt.layout.GridLayout;
import  org.eclipse.swt.widgets. * ;

//  Created : 2007-6-9 下午05:18:35

/**
 * 测试读取XML文件生成菜单
 * 
 * 
@author maoj
 
*/

public   class  XMLMenu  {
    
private Shell shell;

    
private Document doc;

    
private Menu menuBar;

    
public XMLMenu(Shell sShell, File file) throws DocumentException {
        doc 
= new SAXReader().read(file);
        shell 
= sShell;
        menuBar 
= crateBarMenu("/otak/UI/Menu/Main");
        shell.setMenuBar(menuBar);
        System.out.println(doc.valueOf(
"/otak/UI/Menu/Item/Item/Item/@name"));
    }


    
/**
     * 创建窗口主菜单
     * 
     * 
@param xpath
     * 
@return 主菜单
     
*/

    
public Menu crateBarMenu(String xpath) {
        Node node 
= DocumentHelper.createXPath(xpath).selectSingleNode(doc);
        Menu mainMenu 
= new Menu(shell, SWT.BAR);
        
if (node instanceof Element) {
            Element element 
= (Element) node;
            
for (Iterator iter = element.elementIterator(); iter.hasNext();) {
                Element child 
= (Element) iter.next();
                createMenu(mainMenu, child);
            }

        }

        
return mainMenu;
    }


    
/**
     * TODO 创建弹出菜单
     * 
     * 
@param xpath
     * 
@return 弹出菜单
     
*/

    
public Menu cratePopupMenu(XPath xpath) {
        
return null;
    }


    
/**
     * 创建菜单
     * 
     * 
@param menu
     *            父菜单
     * 
@param element
     *            XML树元素
     
*/

    
private void createMenu(Menu menu, Element element) {
        
boolean isBranch = (element.nodeCount() > 0? true : false;
        Menu subMenu;

        
// 是分支菜单需递归创建下级菜单
        if (isBranch) {
            subMenu 
= createMenuItem(menu, element, true);

            
for (Iterator iter = element.elementIterator(); iter.hasNext();) {
                Element child 
= (Element) iter.next();
                createMenu(subMenu, child);
            }

        }

        
else {
            createMenuItem(menu, element, 
false);
        }

    }


    
private Menu createMenuItem(Menu menu, final Element element,
            
boolean isBranch) {
        MenuItem mi;

        
// 判断MenuItem的样式
        if (isBranch) {
            mi 
= new MenuItem(menu, SWT.CASCADE);
        }

        
else {
            String type 
= element.attributeValue("type");
            
if (type != null && type.length() > 0{
                mi 
= new MenuItem(menu, getStyle(type));
            }

            
else {
                mi 
= new MenuItem(menu, SWT.PUSH);
            }

        }


        
// 菜单点击事件测试
        mi.addSelectionListener(new SelectionListener() {
            
public void widgetDefaultSelected(SelectionEvent e) {
            }


            
public void widgetSelected(SelectionEvent e) {
                System.out.println(e.widget);
            }

        }
);

        
// 将XML中的属性赋值给MenuItem
        for (Iterator iter = element.attributeIterator(); iter.hasNext();) {
            Attribute attr 
= (Attribute) iter.next();
            String temp 
= attr.getName();
            
if (temp.equalsIgnoreCase("text")) {
                mi.setText(attr.getValue());
            }

            
else if (temp.equalsIgnoreCase("accelerator")) {
                mi.setAccelerator(getAccelerator(attr.getValue()));
                mi.setText(mi.getText() 
+ ' ' + attr.getValue());
            }

        }


        
// 是分支还需创建下级Menu做为返回参数
        if (isBranch) {
            Menu subMenu 
= new Menu(mi);
            mi.setMenu(subMenu);
            
return subMenu;
        }

        
else {
            
return null;
        }

    }


    
/**
     * 将快捷键定义从字符串转为数字
     * 
     * 
@param acc
     *            快捷键
     * 
@return
     
*/

    
private int getAccelerator(String acc) {
        String[] part 
= acc.split("/+");
        
int rtn = 0;
        
for (String temp : part) {
            
if (temp.equalsIgnoreCase("CTRL")) {
                rtn 
= rtn | SWT.CTRL;
            }

            
else if (temp.equalsIgnoreCase("ALT")) {
                rtn 
= rtn | SWT.ALT;
            }

            
else if (temp.equalsIgnoreCase("SHIFT")) {
                rtn 
= rtn | SWT.SHIFT;
            }

            
else {
                
if (temp.length() == 1{
                    rtn 
= rtn | temp.getBytes()[0];
                }

            }

        }

        
return rtn;
    }


    
/**
     * 将定义MenuItem样式的字符串转为数据
     * 
     * 
@param style
     *            样式
     * 
@return
     
*/

    
private int getStyle(String style) {
        
if (style.equalsIgnoreCase("CASCADE")) {
            
return SWT.CASCADE;
        }

        
else if (style.equalsIgnoreCase("PUSH")) {
            
return SWT.PUSH;
        }

        
else if (style.equalsIgnoreCase("CHECK")) {
            
return SWT.CHECK;
        }

        
else if (style.equalsIgnoreCase("RADIO")) {
            
return SWT.RADIO;
        }

        
else if (style.equalsIgnoreCase("SEPARATOR")) {
            
return SWT.SEPARATOR;
        }

        
else {
            
return SWT.NONE;
        }

    }


    
/**
     * 
@param args
     * 
@throws DocumentException
     
*/

    
public static void main(String[] args) throws DocumentException {
        Display display 
= Display.getDefault();
        Shell sShell 
= new Shell(display);
        sShell.setText(
"Shell");
        sShell.setLayout(
new GridLayout());
        sShell.setSize(
new Point(300200));
        
new XMLMenu(sShell, new File(
                
"D:/MyProject/Java/otak/classes/res.xml"));
        sShell.open();
        
while (!sShell.isDisposed()) {
            
if (!display.readAndDispatch())
                display.sleep();
        }

        display.dispose();
    }


}

res.xml

<? xml version="1.0" encoding="UTF-8" ?>
<!-- Warning : DO NOT modify this file unless you indeed know what you done, that maybe make program maze and crash!  -->
< otak  author ="yagumo"  modified ="2007-6-9" >
    
< UI >
        
< Menu >
            
< Main >
                
< Item  name ="File"  text ="File" >
                    
< Item  name ="Open"  text ="Open..." >
                        
< Item  name ="ASC"  text ="ASC"  type ="RADIO" />
                        
< Item  name ="BIN"  text ="BIN"  type ="RADIO" />
                    
</ Item >
                    
< Item  type ="SEPARATOR" />
                    
< Item  name ="Exit"  text ="Exit"  accelerator ="CTRL+X" />
                
</ Item >
                
< Item  name ="Help"  text ="Help" >
                    
< Item  name ="About"  text ="About..." />
                
</ Item >
            
</ Main >
            
< Popup />
        
</ Menu >
    
</ UI >
</ otak >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值