package com.google.code.joto.ui.config; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.io.File; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTextField; import com.google.code.joto.JotoConfig; import com.google.code.joto.JotoConfigUtils; import com.google.code.joto.ui.JotoContext; import com.google.code.joto.util.io.XStreamUtils; import com.google.code.joto.util.ui.GridBagLayoutFormBuilder; import com.google.code.joto.util.ui.JButtonUtils; import com.google.code.joto.util.ui.ScrolledTextPane; import com.thoughtworks.xstream.XStream; /** * swing Panel for general information / Config about JotoContext * */ public class JotoConfigPanel { protected JotoContext context; protected JPanel panel; protected JPanel toolbar; protected JTextField configFileField; protected ScrolledTextPane xmlTextPane; // ------------------------------------------------------------------------ public JotoConfigPanel(JotoContext context) { this.context = context; initComponents(); } private void initComponents() { panel = new JPanel(new BorderLayout()); toolbar = new JPanel(new FlowLayout()); panel.add(toolbar, BorderLayout.NORTH); toolbar.add(JButtonUtils.snew("apply edit", this, "onButtonApplyEditConfigFile")); toolbar.add(JButtonUtils.snew("undo edit", this, "onButtonUndoEditConfigFile")); toolbar.add(JButtonUtils.snew("reload", this, "onButtonReloadConfigFile")); toolbar.add(JButtonUtils.snew("save", this, "onButtonSaveConfigFile")); JPanel formPanel = new JPanel(new GridBagLayout()); GridBagLayoutFormBuilder fb = new GridBagLayoutFormBuilder(formPanel); panel.add(formPanel, BorderLayout.CENTER); configFileField = new JTextField(); fb.addLabelComp("Config File", configFileField); // fb.addLabelComp("reload config", JButtonUtils.snew("reload", this, "onButtonReloadConfigFile")); // fb.addLabelComp("save config", JButtonUtils.snew("save", this, "onButtonSaveConfigFile")); xmlTextPane = new ScrolledTextPane(); fb.addLabelCompFill2Rows("xml config (XStream)", xmlTextPane.getJComponent()); } // ------------------------------------------------------------------------ public JComponent getJComponent() { return panel; } public void setContext(JotoContext p) { this.context = p; } /** called by introspection, from UI */ public void onButtonApplyEditConfigFile(ActionEvent event) { viewToModel(); } private void viewToModel() { String xml = xmlTextPane.getText(); XStream xstream = JotoConfigUtils.getXStream(); JotoConfig config = context.getConfig(); try { config = (JotoConfig) xstream.fromXML(xml); } catch(Exception ex) { // context.getConfig(); xml = "<!-- Failed to parse xstream JotoConfig :" + ex.getMessage() + "-->\n" + xml; xmlTextPane.setText(xml); } context.setConfig(config); } private void modelToView() { JotoConfig config = context.getConfig(); XStream xstream = JotoConfigUtils.getXStream(); String xml = xstream.toXML(config); xmlTextPane.setText(xml); } /** called by introspection, from UI */ public void onButtonUndoEditConfigFile(ActionEvent event) { modelToView(); } /** called by introspection, from UI */ public void onButtonReloadConfigFile(ActionEvent event) { File configFile = new File(configFileField.getText()); XStream xstream = JotoConfigUtils.getXStream(); JotoConfig config = (JotoConfig) XStreamUtils.fromFile(xstream, configFile); context.setConfig(config); modelToView(); } /** called by introspection, from UI */ public void onButtonSaveConfigFile(ActionEvent event) { viewToModel(); File configFile = new File(configFileField.getText()); JotoConfig config = context.getConfig(); XStream xstream = JotoConfigUtils.getXStream(); XStreamUtils.toFile(xstream, config, configFile); } }