/* * JavaXYQ Source Code * by kylixs * at 2010-3-21 * please visit http://javaxyq.googlecode.com * or mail to kylixs@qq.com */ package com.javaxyq.data; import java.io.IOException; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.KeyStroke; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.javaxyq.core.DialogFactory; import com.javaxyq.core.GameWindow; import com.javaxyq.io.CacheManager; import com.javaxyq.util.StringUtils; /** * @author Administrator * @date 2010-3-21 create */ public class XmlDataLoader { public class ActionHandler extends DefaultHandler { public ActionHandler() { } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if("Action".equalsIgnoreCase(name)) { procActionElement(attributes); }else if("Listener".equalsIgnoreCase(name)) { procListenerElement(attributes); } } private void procListenerElement(Attributes attributes) { String type = attributes.getValue("type"); String className = attributes.getValue("class"); System.out.println("listener: "+type+" => "+className); window.addListener(type, className); } private void procActionElement(Attributes attributes) { String actionId = attributes.getValue("id"); String className = attributes.getValue("class"); String shortcut = attributes.getValue("shortcut"); System.out.println("Action: "+actionId+" => "+className); regAction(actionId,className); if(StringUtils.isNotBlank(shortcut)) { regShortcut(shortcut,actionId); } } } public class DialogHandler extends DefaultHandler { private String filename; public DialogHandler(String filename) { this.filename = filename; } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if("Dialog".equalsIgnoreCase(name)) { String id = attributes.getValue("id"); if(StringUtils.isNotBlank(id)) { DialogFactory.addDialog(id, filename); } //System.out.println("Dialog: "+id+" => "+filename); } } } private SAXParser parser; private GameWindow window; private InputMap inputMap; private ActionMap actionMap; public XmlDataLoader(GameWindow window) { this.inputMap = window.getInputMap(); this.actionMap = window.getActionMap(); this.window = window; SAXParserFactory factory = SAXParserFactory.newInstance(); // factory.setValidating(validating); try { parser = factory.newSAXParser(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } public void regShortcut(String key,String actionId){ inputMap.put(KeyStroke.getKeyStroke(key), actionId); } public void regAction(String actionId, String className) { try { Action action = (Action) Class.forName(className).newInstance(); action.putValue(Action.ACTION_COMMAND_KEY, actionId); actionMap.put(actionId, action); } catch (ClassNotFoundException e) { System.out.println("���棺�Ҳ���[ "+actionId+"] �Ĵ����� "+className); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } public void parseActions() { try { parser.parse(CacheManager.getInstance().getFile("xml/actions.xml"), new ActionHandler()); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void loadUI(String file) { try { parser.parse(CacheManager.getInstance().getFile(file),new DialogHandler(file)); System.out.println("loadUI: "+file+", at "+new java.util.Date()); } catch (Exception e) { System.err.println("load UI failure: "+file); e.printStackTrace(); } } }