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("&amp;");  break;
135             case '"':  sb.append("&quot;"); break;
136             case '\'': sb.append("&apos;"); break;
137             case '<':  sb.append("&lt;");   break;
138             case '>':  sb.append("&gt;");   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