1 19 package org.openharmonise.workfloweditor; 20 21 import java.awt.geom.*; 22 import java.awt.geom.Point2D.Float; 23 import java.io.*; 24 import java.util.*; 25 26 import javax.xml.parsers.*; 27 28 import org.jaxen.dom.*; 29 import org.openharmonise.commons.xml.*; 30 import org.openharmonise.vfs.context.*; 31 import org.w3c.dom.*; 32 33 34 41 public class WorkflowLayoutStore implements ContextListener { 42 43 46 private static WorkflowLayoutStore m_instance = null; 47 48 51 private HashMap m_workflows = new HashMap(); 52 53 56 private WorkflowLayoutStore() { 57 super(); 58 ContextHandler.getInstance().addListener(ContextType.CONTEXT_SHUTDOWN, this); 59 this.load(); 60 } 61 62 68 public static WorkflowLayoutStore getInstance() { 69 if(m_instance==null) { 70 m_instance = new WorkflowLayoutStore(); 71 } 72 return m_instance; 73 } 74 75 83 public void setStageLayout(String sWorkflowPath, String sStagePath, Point2D.Float point) { 84 HashMap stageMap = (HashMap) this.m_workflows.get(sWorkflowPath); 85 if(stageMap==null) { 86 stageMap = new HashMap(); 87 this.m_workflows.put(sWorkflowPath, stageMap); 88 } 89 stageMap.put(sStagePath, point); 90 } 91 92 private void moveGraphsToTopLeft() { 93 Iterator itor = this.m_workflows.values().iterator(); 94 while (itor.hasNext()) { 95 float minX = (float) 10000000000.0; 96 float minY = (float) 10000000000.0; 97 98 HashMap stageMap = (HashMap) itor.next(); 99 Iterator itor2 = stageMap.keySet().iterator(); 100 while (itor2.hasNext()) { 101 String sStagePath = (String ) itor2.next(); 102 Point2D.Float point = (Float ) stageMap.get(sStagePath); 103 if(point.x<minX) { 104 minX = point.x; 105 } 106 if(point.y<minY) { 107 minY = point.y; 108 } 109 } 110 111 float diffX = 0; 112 float diffY = 0; 113 114 if(minX>20) { 115 diffX = minX-20; 116 } 117 if(minY>20) { 118 diffY = minY-20; 119 } 120 121 if(diffX>0 || diffY>0) { 122 itor2 = stageMap.keySet().iterator(); 123 while (itor2.hasNext()) { 124 String sStagePath = (String ) itor2.next(); 125 Point2D.Float point = (Float ) stageMap.get(sStagePath); 126 point.x = point.x - diffX; 127 point.y = point.y - diffY; 128 } 129 } 130 } 131 } 132 133 141 public Point2D.Float getStageLayout(String sWorkflowPath, String sStagePath) { 142 Point2D.Float point = null; 143 144 HashMap stageMap = (HashMap) this.m_workflows.get(sWorkflowPath); 145 if(stageMap!=null) { 146 point = (Float ) stageMap.get(sStagePath); 147 } 148 149 return point; 150 } 151 152 156 private void load() { 157 File fXML = new File("C:\\ContentManager\\layouts.xml"); 158 if(fXML.exists()) { 159 try { 160 Document xml = 161 DocumentBuilderFactory 162 .newInstance() 163 .newDocumentBuilder() 164 .parse( 165 new org.xml.sax.InputSource (new FileReader( fXML ))); 166 167 DOMXPath xpWorkflows = new DOMXPath("child::workflow"); 168 List workflows = xpWorkflows.selectNodes(xml.getDocumentElement()); 169 Iterator itor = workflows.iterator(); 170 while (itor.hasNext()) { 171 Element elWorkflow = (Element) itor.next(); 172 DOMXPath xpStages = new DOMXPath("child::workflowstage"); 173 DOMXPath xpPath = new DOMXPath("child::path/."); 174 String sWorkflowPath = xpPath.stringValueOf(elWorkflow); 175 List stages = xpStages.selectNodes(elWorkflow); 176 Iterator itor2 = stages.iterator(); 177 while (itor2.hasNext()) { 178 Element elStage = (Element) itor2.next(); 179 float x = java.lang.Float.parseFloat( elStage.getAttribute("x") ); 180 float y = java.lang.Float.parseFloat( elStage.getAttribute("y") ); 181 String sStagePath = xpPath.stringValueOf(elStage); 182 Point2D.Float point = new Point2D.Float(x, y); 183 this.setStageLayout(sWorkflowPath, sStagePath, point); 184 } 185 } 186 187 this.moveGraphsToTopLeft(); 188 189 } catch(Exception e) { 190 e.printStackTrace(); 191 } 192 } 193 } 194 195 199 private void save() { 200 try { 201 Document xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 202 203 Element elRoot = xml.createElement("layouts"); 204 205 Iterator itor = this.m_workflows.keySet().iterator(); 206 while (itor.hasNext()) { 207 String sWorkflowPath = (String ) itor.next(); 208 209 Element elWorkflow = xml.createElement("workflow"); 210 elRoot.appendChild(elWorkflow); 211 212 Element elPath = xml.createElement("path"); 213 Text txt = xml.createTextNode(sWorkflowPath); 214 elPath.appendChild(txt); 215 elWorkflow.appendChild(elPath); 216 elRoot.appendChild(elWorkflow); 217 218 HashMap stageMap = (HashMap) this.m_workflows.get(sWorkflowPath); 219 Iterator itor2 = stageMap.keySet().iterator(); 220 while (itor2.hasNext()) { 221 String sStagePath = (String ) itor2.next(); 222 Point2D.Float point = (Float ) stageMap.get(sStagePath); 223 float x = point.x; 224 float y = point.y; 225 226 Element elStage = xml.createElement("workflowstage"); 227 elWorkflow.appendChild(elStage); 228 elStage.setAttribute("x", new java.lang.Float (x).toString()); 229 elStage.setAttribute("y", new java.lang.Float (y).toString()); 230 231 232 elPath = xml.createElement("path"); 233 txt = xml.createTextNode(sStagePath); 234 elPath.appendChild(txt); 235 elStage.appendChild(elPath); 236 237 } 238 } 239 240 File fXML = new File("C:\\ContentManager\\layouts.xml"); 241 XMLPrettyPrint printer = new XMLPrettyPrint(); 242 printer.printNodeToFile(elRoot, fXML); 243 244 } catch (ParserConfigurationException e) { 245 e.printStackTrace(); 246 } catch (FactoryConfigurationError e) { 247 e.printStackTrace(); 248 } 249 } 250 251 254 public void contextMessage(ContextEvent ce) { 255 if(ce.CONTEXT_TYPE==ContextType.CONTEXT_SHUTDOWN) { 256 this.save(); 257 } 258 } 259 260 } 261 | Popular Tags |