package org.chartsy.main.managers; import java.io.File; import java.util.HashMap; import java.util.List; import org.chartsy.main.ChartFrame; import org.chartsy.main.chart.Indicator; import org.chartsy.main.chart.Overlay; import org.chartsy.main.templates.Template; import org.chartsy.main.utils.FileUtils; import org.chartsy.main.utils.XMLUtil; import org.openide.filesystems.FileUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * * @author Viorel */ public class TemplateManager { private static TemplateManager instance; private HashMap<String, Template> templates; private String defTemp; private File defaultTemplate; private File templatesXML; public static TemplateManager getDefault() { if (instance == null) instance = new TemplateManager(); return instance; } private TemplateManager() { defaultTemplate = FileUtils.templatesFile("default.xml"); templatesXML = FileUtils.templatesFile("templates.xml"); templates = new HashMap<String, Template>(); if (!templatesXML.exists()) { try { FileUtil.copy( Template.class.getResourceAsStream("default.xml"), FileUtil.createData(defaultTemplate).getOutputStream()); FileUtil.copy( Template.class.getResourceAsStream("templates.xml"), FileUtil.createData(templatesXML).getOutputStream()); } catch (Exception ex) { XMLUtil.createXMLDocument(defaultTemplate); XMLUtil.createXMLDocument(templatesXML, XMLUtil.TEMPLATES_NODE); } initTemplates(); } else initTemplates(); } public String getDefaultTemplate() { return defTemp; } public void setDefaultTemplate(String name) { defTemp = name; Document document = XMLUtil.loadXMLDocument(defaultTemplate); Element root = XMLUtil.getRoot(document); root.setTextContent(name); XMLUtil.saveXMLDocument(document, defaultTemplate); } public Object[] getTemplateNames() { return templates.keySet().toArray(); } public Template getTemplate(Object key) { return templates.get(key); } public boolean templateExists(String name) { return templates.containsKey(name); } private void initTemplates() { Document document = XMLUtil.loadXMLDocument(defaultTemplate); Element temp = XMLUtil.getRoot(document); defTemp = temp.getTextContent(); document = XMLUtil.loadXMLDocument(templatesXML); Element root = XMLUtil.getRoot(document, XMLUtil.TEMPLATES_NODE); NodeList nodeList = root.getElementsByTagName(XMLUtil.TEMPLATE_NODE); for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); Template template = new Template(XMLUtil.getNameAttr(element)); Element chart = XMLUtil.getChartNode(element); String chartName = XMLUtil.getNameAttr(chart); template.setChart(ChartManager.getDefault().getChart(chartName)); Element chartProperties = XMLUtil.getPropertiesNode(chart); template.getChartProperties().loadFromTemplate(chartProperties); Element overlays = XMLUtil.getOverlaysNode(element); NodeList overlaysList = overlays.getElementsByTagName(XMLUtil.OVERLAY_NODE); for (int j = 0; j < overlaysList.getLength(); j++) { Element overlayNode = (Element) overlaysList.item(j); String overlayName = XMLUtil.getNameAttr(overlayNode); Overlay overlay = OverlayManager.getDefault().getOverlay(overlayName).newInstance(); if (overlay != null) { Element overlayProperties = XMLUtil.getPropertiesNode(overlayNode); overlay.loadFromTemplate(overlayProperties); template.addOverlay(overlay); } } Element indicators = XMLUtil.getIndicatorsNode(element); NodeList indicatorsList = indicators.getElementsByTagName(XMLUtil.INDICATOR_NODE); for (int j = 0; j < indicatorsList.getLength(); j++) { Element indicatorNode = (Element) indicatorsList.item(j); String indicatorName = XMLUtil.getNameAttr(indicatorNode); Indicator indicator = IndicatorManager.getDefault().getIndicator(indicatorName).newInstance(); if (indicator != null) { Element indicatorProperties = XMLUtil.getPropertiesNode(indicatorNode); indicator.loadFromTemplate(indicatorProperties); template.addIndicator(indicator); } } templates.put(template.getName(), template); } } public void saveToTemplate(String name, ChartFrame chartFrame) { Document document = XMLUtil.loadXMLDocument(templatesXML); Element root = XMLUtil.getRoot(document, XMLUtil.TEMPLATES_NODE); // create the template node Element template = XMLUtil.addTemplateNode(document, root, name); // save template details Element chart = XMLUtil.addChartNode(document, template, chartFrame.getChartData().getChart()); Element chartProperties = XMLUtil.addPropertiesNode(document, chart); chartFrame.getChartProperties().saveToTemplate(document, chartProperties); List<Overlay> overlays = chartFrame.getMainPanel().getSplitPanel().getChartPanel().getOverlays(); if (!overlays.isEmpty()) { Element overlaysNode = XMLUtil.addOverlaysNode(document, template); for (Overlay overlay : overlays) { Element overlayNode = XMLUtil.addOverlayNode(document, overlaysNode, overlay); Element overlayProperties = XMLUtil.addPropertiesNode(document, overlayNode); overlay.saveToTemplate(document, overlayProperties); } } List<Indicator> indicators = chartFrame.getMainPanel().getSplitPanel().getIndicatorsPanel().getIndicatorsList(); if (!indicators.isEmpty()) { Element indicatorsNode = XMLUtil.addIndicatorsNode(document, template); for (Indicator indicator : indicators) { Element indicatorNode = XMLUtil.addIndicatorNode(document, indicatorsNode, indicator); Element indicatorProperties = XMLUtil.addPropertiesNode(document, indicatorNode); indicator.saveToTemplate(document, indicatorProperties); } } // save changes XMLUtil.saveXMLDocument(document, templatesXML); templates.clear(); initTemplates(); } public void removeTemplate(String name) { Document document = XMLUtil.loadXMLDocument(templatesXML); Element root = XMLUtil.getRoot(document, XMLUtil.TEMPLATES_NODE); NodeList nodeList = root.getElementsByTagName(XMLUtil.TEMPLATE_NODE); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); node.getAttributes().getNamedItem(XMLUtil.NAME_ATTR).getNodeValue(); if (node.getAttributes().getNamedItem(XMLUtil.NAME_ATTR).getNodeValue().equals(name)) { root.removeChild(node); break; } } XMLUtil.saveXMLDocument(document, templatesXML); templates.clear(); initTemplates(); } public Overlay getOverlay(int index) { Overlay overlay = null; Document document = XMLUtil.loadXMLDocument(templatesXML); Element root = XMLUtil.getRoot(document, XMLUtil.TEMPLATES_NODE); NodeList nodeList = root.getElementsByTagName(XMLUtil.TEMPLATE_NODE); for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); if (element.getAttribute(XMLUtil.NAME_ATTR).equals(defTemp)) { Element overlays = XMLUtil.getOverlaysNode(element); NodeList overlaysList = overlays.getElementsByTagName(XMLUtil.OVERLAY_NODE); Element overlayNode = (Element) overlaysList.item(index); Element overlayProperties = XMLUtil.getPropertiesNode(overlayNode); overlay = OverlayManager.getDefault().getOverlay( XMLUtil.getNameAttr(overlayNode)).newInstance(); overlay.loadFromTemplate(overlayProperties); } } return overlay; } public Indicator getIndicator(int index) { Indicator indicator = null; Document document = XMLUtil.loadXMLDocument(templatesXML); Element root = XMLUtil.getRoot(document, XMLUtil.TEMPLATES_NODE); NodeList nodeList = root.getElementsByTagName(XMLUtil.TEMPLATE_NODE); for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); if (element.getAttribute(XMLUtil.NAME_ATTR).equals(defTemp)) { Element indicators = XMLUtil.getIndicatorsNode(element); NodeList indicatorsList = indicators.getElementsByTagName(XMLUtil.INDICATOR_NODE); Element indicatorNode = (Element) indicatorsList.item(index); Element indicatorProperties = XMLUtil.getPropertiesNode(indicatorNode); indicator = IndicatorManager.getDefault().getIndicator( XMLUtil.getNameAttr(indicatorNode)).newInstance(); indicator.loadFromTemplate(indicatorProperties); } } return indicator; } }