1 package org.xpilot.jxpmap; 2 3 import java.awt.Dimension; 4 import java.io.IOException; 5 import java.io.PrintWriter; 6 import java.util.HashMap; 7 import java.util.Iterator; 8 import java.util.Map; 9 import java.util.ArrayList; 10 import java.util.Collections; 11 import java.util.Properties; 12 13 import javax.swing.JOptionPane; 14 15 public class MapOptions { 16 17 18 private Dimension size; 19 private Boolean edgeWrap; 20 private Map options = new HashMap(); 21 MapOptions()22 public MapOptions() { 23 try { 24 Properties props = new Properties(); 25 props.load(getClass().getResourceAsStream("defopts")); 26 for(Iterator i = props.entrySet().iterator(); i.hasNext();) { 27 Map.Entry entry = (Map.Entry)i.next(); 28 Option o = new Option((String)entry.getKey(), 29 (String)entry.getValue()); 30 options.put(o.name.toLowerCase(), o); 31 } 32 } catch (Exception e) { 33 JOptionPane.showMessageDialog 34 (null, "Failed to load default options: " + 35 e.getMessage(), "Error", 36 JOptionPane.ERROR_MESSAGE); 37 e.printStackTrace(); 38 } 39 getSize(); 40 isEdgeWrap(); 41 } 42 MapOptions(MapOptions mo)43 public MapOptions(MapOptions mo) { 44 this.size = mo.size; 45 this.edgeWrap = mo.edgeWrap; 46 for(Iterator i = mo.iterator(); i.hasNext();) { 47 MapOptions.Option o = (MapOptions.Option)i.next(); 48 options.put(o.name.toLowerCase(), new Option(o)); 49 } 50 getSize(); 51 isEdgeWrap(); 52 } 53 iterator()54 public Iterator iterator() { 55 return options.values().iterator(); 56 } 57 set(String name, String value)58 public void set(String name, String value) { 59 String key = name.toLowerCase(); 60 MapOptions.Option o = (MapOptions.Option)options.get(key); 61 if (o == null) { 62 o = new Option(name, null); 63 options.put(key, o); 64 } 65 o.value = value; 66 size = null; 67 edgeWrap = null; 68 } 69 reset()70 public void reset() { 71 for(Iterator i = options.values().iterator(); i.hasNext();) { 72 Option o = (Option)i.next(); 73 o.value = o.defaultValue; 74 } 75 } 76 printXml(PrintWriter out)77 public void printXml(PrintWriter out) throws IOException { 78 79 out.println("<GeneralOptions>"); 80 81 ArrayList list = new ArrayList(options.values()); 82 Collections.sort(list); 83 for (Iterator iter = list.iterator(); iter.hasNext();) { 84 Option opt = (Option)iter.next(); 85 if (!opt.isModified()) continue; 86 out.print("<Option name=\""); 87 out.print(opt.name); 88 out.print("\" value=\""); 89 out.print(xmlEncode(opt.value)); 90 out.println("\"/>"); 91 } 92 93 out.println("</GeneralOptions>"); 94 } 95 isEdgeWrap()96 public boolean isEdgeWrap() { 97 if (edgeWrap == null) { 98 Option o = (Option)options.get("edgewrap"); 99 if (o == null) { 100 edgeWrap = Boolean.FALSE; 101 set("edgeWrap", "false"); 102 } else edgeWrap = new Boolean(o.value); 103 } 104 return edgeWrap.booleanValue(); 105 } 106 get(String name)107 public String get(String name) { 108 Option o = (Option)options.get(name); 109 if (o == null) return null; 110 return o.value; 111 } 112 getSize()113 public Dimension getSize() { 114 if (size == null) { 115 int w = 3500; 116 int h = 3500; 117 Option wo = (Option)options.get("mapwidth"); 118 Option ho = (Option)options.get("mapheight"); 119 if (wo != null) w = Integer.parseInt(wo.value); 120 else set("mapWidth", "3500"); 121 if (ho != null) h = Integer.parseInt(ho.value); 122 else set("mapHeight", "3500"); 123 size = new Dimension(w * 64, h * 64); 124 } 125 return size; 126 } 127 128 xmlEncode(String str)129 private String xmlEncode(String str) { 130 StringBuffer sb = new StringBuffer(str.length()); 131 for (int i = 0; i < str.length(); i++) { 132 char ch = str.charAt(i); 133 switch (ch) { 134 case '&': sb.append("&"); break; 135 case '"': sb.append("""); break; 136 case '\'': sb.append("'"); break; 137 case '<': sb.append("<"); break; 138 case '>': sb.append(">"); break; 139 default: sb.append(ch); 140 } 141 } 142 return sb.toString(); 143 } 144 145 public class Option implements Comparable { 146 public String name; 147 public String value; 148 public String defaultValue; Option(Option o)149 public Option(Option o) { 150 this.name = o.name; 151 this.value = o.value; 152 this.defaultValue = o.defaultValue; 153 } Option(String name, String defaultValue)154 public Option(String name, String defaultValue) { 155 this.name = name; 156 this.value = this.defaultValue = defaultValue; 157 } isModified()158 public boolean isModified() { 159 if (value == defaultValue) return false; 160 if (value == null && defaultValue != null) return true; 161 if (value.equalsIgnoreCase(defaultValue)) return false; 162 if ("false".equals(defaultValue)) 163 return !("no".equalsIgnoreCase(value) 164 || "off".equalsIgnoreCase(value)); 165 if ("true".equals(defaultValue)) 166 return !("yes".equalsIgnoreCase(value) 167 || "on".equalsIgnoreCase(value)); 168 return true; 169 } compareTo(Object o)170 public int compareTo(Object o) { 171 return name.compareTo(((Option)o).name); 172 } 173 } 174 } 175