/webportal/src/main/java/org/ala/spatial/analysis/web/EnvironmentalList.java

http://alageospatialportal.googlecode.com/ · Java · 379 lines · 316 code · 52 blank · 11 comment · 109 complexity · a365d0ec2418e70499c69dd20421a5fe MD5 · raw file

  1. package org.ala.spatial.analysis.web;
  2. import au.org.emii.portal.composer.MapComposer;
  3. import au.org.emii.portal.menu.MapLayer;
  4. import au.org.emii.portal.util.LayerUtilities;
  5. import java.util.ArrayList;
  6. import java.util.Comparator;
  7. import java.util.Set;
  8. import net.sf.json.JSONArray;
  9. import net.sf.json.JSONObject;
  10. import org.ala.spatial.util.CommonData;
  11. import org.ala.spatial.util.ListEntry;
  12. import org.zkoss.zk.ui.event.Event;
  13. import org.zkoss.zk.ui.event.EventListener;
  14. import org.zkoss.zul.Image;
  15. import org.zkoss.zul.Listbox;
  16. import org.zkoss.zul.Listcell;
  17. import org.zkoss.zul.Listitem;
  18. import org.zkoss.zul.ListitemRenderer;
  19. import org.zkoss.zul.SimpleListModel;
  20. /**
  21. *
  22. * @author ajay
  23. */
  24. public class EnvironmentalList extends Listbox {
  25. ArrayList<ListEntry> listEntries;
  26. float[] threasholds = {0.1f, 0.3f, 1.0f};
  27. SimpleListModel listModel;
  28. MapComposer mapComposer;
  29. boolean includeAnalysisLayers;
  30. boolean disableContextualLayers;
  31. boolean singleDomain;
  32. public void init(MapComposer mc, boolean includeAnalysisLayers, boolean disableContextualLayers, boolean singleDomain) {
  33. mapComposer = mc;
  34. this.includeAnalysisLayers = includeAnalysisLayers;
  35. this.disableContextualLayers = disableContextualLayers;
  36. this.singleDomain = singleDomain;
  37. try {
  38. setupListEntries();
  39. setupList();
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. void setupListEntries() {
  45. listEntries = new ArrayList<ListEntry>();
  46. JSONArray ja = CommonData.getLayerListJSONArray();
  47. for (int i = 0; i < ja.size(); i++) {
  48. JSONObject jo = ja.getJSONObject(i);
  49. listEntries.add(
  50. new ListEntry(jo.getString("name"),
  51. (jo.containsKey("displayname") ? jo.getString("displayname") : jo.getString("name")),
  52. (jo.containsKey("classification1") ? jo.getString("classification1") : ""),
  53. (jo.containsKey("classification2") ? jo.getString("classification2") : ""),
  54. (jo.containsKey("type") ? jo.getString("type") : ""),
  55. (jo.containsKey("domain") ? jo.getString("domain") : ""),
  56. jo));
  57. }
  58. if (includeAnalysisLayers) { //add
  59. for (MapLayer ml : mapComposer.getAnalysisLayers()) {
  60. ListEntry le = null;
  61. if (ml.getSubType() == LayerUtilities.ALOC) {
  62. le = new ListEntry(ml.getName(), ml.getDisplayName(), "Analysis", "Classification", "Contextual", null, null);
  63. } else if (ml.getSubType() == LayerUtilities.MAXENT) {
  64. le = new ListEntry(ml.getName(), ml.getDisplayName(), "Analysis", "Prediction", "Environmental", null, null);
  65. } else if (ml.getSubType() == LayerUtilities.GDM) {
  66. le = new ListEntry(ml.getName(), ml.getDisplayName(), "Analysis", "GDM", "Environmental", null, null);
  67. } else if (ml.getSubType() == LayerUtilities.ODENSITY) {
  68. le = new ListEntry(ml.getName(), ml.getDisplayName(), "Analysis", "Occurrence Density", "Environmental", null, null);
  69. } else if (ml.getSubType() == LayerUtilities.SRICHNESS) {
  70. le = new ListEntry(ml.getName(), ml.getDisplayName(), "Analysis", "Species Richness", "Environmental", null, null);
  71. }
  72. if (le != null) {
  73. listEntries.add(le);
  74. }
  75. }
  76. }
  77. java.util.Collections.sort(listEntries, new Comparator<ListEntry>() {
  78. @Override
  79. public int compare(ListEntry e1, ListEntry e2) {
  80. return (e1.catagory1 + " " + e1.catagory2 + " " + e1.displayname).compareTo(e2.catagory1 + " " + e2.catagory2 + " " + e2.displayname);
  81. }
  82. });
  83. }
  84. public void setupList() {
  85. try {
  86. setItemRenderer(new ListitemRenderer() {
  87. @Override
  88. public void render(Listitem li, Object data) {
  89. Listcell n = new Listcell(((ListEntry) data).catagoryNames());
  90. //n.setHflex("1");
  91. n.setParent(li);
  92. n = new Listcell(((ListEntry) data).displayname);
  93. //n.setHflex("1");
  94. n.setParent(li);
  95. Listcell lc = new Listcell();
  96. lc.setParent(li);
  97. lc.setValue(((ListEntry) data));
  98. String type = ((ListEntry) data).type;
  99. if (disableContextualLayers && type.equalsIgnoreCase("contextual")) {
  100. li.setDisabled(true);
  101. }
  102. Image img = new Image();
  103. img.setSrc("/img/information.png");
  104. img.addEventListener("onClick", new EventListener() {
  105. @Override
  106. public void onEvent(Event event) throws Exception {
  107. //re-toggle the checked flag (issue 572)
  108. Listitem li = (Listitem) event.getTarget().getParent().getParent();
  109. li.getListbox().toggleItemSelection(li);
  110. EnvironmentalList el = (EnvironmentalList) li.getParent();
  111. el.updateDistances();
  112. String s = ((ListEntry) ((Listcell) event.getTarget().getParent()).getValue()).name;
  113. String metadata = CommonData.layersServer + "/layers/view/more/" + s;
  114. mapComposer.activateLink(metadata, "Metadata", false);
  115. }
  116. });
  117. img.setParent(lc);
  118. //String type = ((ListEntry) data).type;
  119. if (type.equalsIgnoreCase("environmental")) {
  120. float value = ((ListEntry) data).value;
  121. lc = new Listcell(" ");
  122. if (threasholds[0] > value) {
  123. lc.setSclass("lcRed");//setStyle("background: #bb2222;");
  124. } else if (threasholds[1] > value) {
  125. lc.setSclass("lcYellow");//lc.setStyle("background: #ffff22;");
  126. } else if (1 >= value) {
  127. lc.setSclass("lcGreen");//lc.setStyle("background: #22aa22;");
  128. } else {
  129. lc.setSclass("lcWhite");//setStyle("background: #ffffff;");
  130. }
  131. lc.setParent(li);
  132. }
  133. }
  134. ;
  135. });
  136. listModel = new SimpleListModel(listEntries);
  137. setModel(listModel);
  138. //renderAll();
  139. } catch (Exception e) {
  140. System.out.println("error setting up env list");
  141. e.printStackTrace(System.out);
  142. }
  143. }
  144. @Override
  145. public void toggleItemSelection(Listitem item) {
  146. super.toggleItemSelection(item);
  147. //update minimum distances here
  148. }
  149. public void updateDistances() {
  150. if (listEntries == null) {
  151. return;
  152. }
  153. String fieldId;
  154. for (ListEntry le : listEntries) {
  155. //set to 2 for contextual and 'no association distance'
  156. if (le.type.equalsIgnoreCase("contextual")
  157. || le.layerObject == null
  158. || !le.layerObject.containsKey("fields")
  159. || (fieldId = getFieldId(le.layerObject)) == null
  160. || CommonData.getDistancesMap().get(fieldId) == null) {
  161. le.value = 2;
  162. } else {
  163. le.value = 1;
  164. }
  165. }
  166. for (Object o : getSelectedItems()) {
  167. ListEntry l = listEntries.get(((Listitem) o).getIndex());
  168. l.value = 0;
  169. String[] domain;
  170. if (l.type.equalsIgnoreCase("environmental")
  171. && l.layerObject != null && l.layerObject.containsKey("fields")
  172. && (fieldId = getFieldId(l.layerObject)) != null
  173. && CommonData.getDistancesMap().get(fieldId) != null
  174. && (domain = getDomain(l.layerObject)) != null) {
  175. for (ListEntry le : listEntries) {
  176. if (le.layerObject != null && le.layerObject.containsKey("fields")
  177. && (!singleDomain || isSameDomain(getDomain(le.layerObject), domain))) {
  178. String fieldId2 = getFieldId(le.layerObject);
  179. Double d = CommonData.getDistancesMap().get(fieldId).get(fieldId2);
  180. if (d != null) {
  181. le.value = (float) Math.min(le.value, d.doubleValue());
  182. }
  183. }
  184. }
  185. }
  186. }
  187. for (int i = 0; i < listEntries.size(); i++) {
  188. float value = listEntries.get(i).value;
  189. String type = listEntries.get(i).type;
  190. Listcell lc = (Listcell) (getItemAtIndex(i).getLastChild());
  191. if (type.equalsIgnoreCase("environmental")) {
  192. if (threasholds[0] > value) {
  193. lc.setSclass("lcRed");//setStyle("background: #bb2222;");
  194. } else if (threasholds[1] > value) {
  195. lc.setSclass("lcYellow");//lc.setStyle("background: #ffff22;");
  196. } else if (1 >= value) {
  197. lc.setSclass("lcGreen");//lc.setStyle("background: #22aa22;");
  198. } else {
  199. lc.setSclass("lcWhite");//lc.setStyle("background: #ffffff;");
  200. }
  201. }
  202. }
  203. forceDomain();
  204. }
  205. void forceDomain() {
  206. String[] firstDomain = getFirstDomain();
  207. String[] thisDomain;
  208. if (!singleDomain || firstDomain == null) {
  209. for (int i = 0; i < listEntries.size(); i++) {
  210. boolean defaultDisable = disableContextualLayers && listEntries.get(i).type.equalsIgnoreCase("contextual");
  211. getItemAtIndex(i).setDisabled(defaultDisable);
  212. }
  213. return;
  214. }
  215. for (int i = 0; i < listEntries.size(); i++) {
  216. ListEntry l = listEntries.get(i);
  217. if (l.layerObject != null
  218. && (thisDomain = getDomain(l.layerObject)) != null) {
  219. boolean defaultDisable = disableContextualLayers && listEntries.get(i).type.equalsIgnoreCase("contextual");
  220. boolean match = false;
  221. for (String d1 : firstDomain) {
  222. for (String d2 : thisDomain) {
  223. if (d1.equalsIgnoreCase(d2)) {
  224. match = true;
  225. }
  226. }
  227. }
  228. getItemAtIndex(i).setDisabled(defaultDisable || !match);
  229. if (!match && getItemAtIndex(i).isSelected()) {
  230. toggleItemSelection(getItemAtIndex(i));
  231. }
  232. }
  233. }
  234. }
  235. String[] getFirstDomain() {
  236. String[] domain = null;
  237. for (Object o : getSelectedItems()) {
  238. ListEntry l = listEntries.get(((Listitem) o).getIndex());
  239. if (l.type.equalsIgnoreCase("environmental")
  240. && l.layerObject != null) {
  241. domain = getDomain(l.layerObject);
  242. if (domain != null) {
  243. break;
  244. }
  245. }
  246. }
  247. return domain;
  248. }
  249. String[] getDomain(JSONObject layerObject) {
  250. if (!layerObject.containsKey("domain")) {
  251. return null;
  252. }
  253. String[] d = layerObject.getString("domain").split(",");
  254. for (int i = 0; i < d.length; i++) {
  255. d[i] = d[i].trim();
  256. }
  257. return d;
  258. }
  259. String getFieldId(JSONObject layerObject) {
  260. String fieldId = null;
  261. try {
  262. JSONArray ja = (JSONArray) layerObject.get("fields");
  263. for (int i = 0; i < ja.size(); i++) {
  264. JSONObject jo = (JSONObject) ja.get(i);
  265. if (true) { //jo.getString("analysis").equalsIgnoreCase("true")) {
  266. fieldId = jo.getString("id");
  267. break;
  268. }
  269. }
  270. } catch (Exception e) {
  271. e.printStackTrace();
  272. }
  273. return fieldId;
  274. }
  275. public void onSelect(Event event) {
  276. updateDistances();
  277. }
  278. public String[] getSelectedLayers() {
  279. Set selectedItems = getSelectedItems();
  280. String[] selected = new String[selectedItems.size()];
  281. int i = 0;
  282. System.out.print("getSelectedLayers: ");
  283. for (Object o : selectedItems) {
  284. selected[i] = listEntries.get(((Listitem) o).getIndex()).name;
  285. i++;
  286. System.out.print(listEntries.get(((Listitem) o).getIndex()).displayname + ", " + listEntries.get(((Listitem) o).getIndex()).name);
  287. }
  288. System.out.println("");
  289. return selected;
  290. }
  291. public void selectLayers(String[] layers) {
  292. String[] firstDomain = getFirstDomain();
  293. for (int i = 0; i < listEntries.size(); i++) {
  294. for (int j = 0; j < layers.length; j++) {
  295. if (listEntries.get(i).displayname.equalsIgnoreCase(layers[j])
  296. || listEntries.get(i).name.equalsIgnoreCase(layers[j])) {
  297. if (!getItemAtIndex(i).isSelected() && (!singleDomain || isSameDomain(firstDomain, getDomain(listEntries.get(i).layerObject)))) {
  298. toggleItemSelection(getItemAtIndex(i));
  299. }
  300. break;
  301. }
  302. }
  303. }
  304. updateDistances();
  305. }
  306. @Override
  307. public void clearSelection() {
  308. updateDistances();
  309. super.clearSelection();
  310. }
  311. public boolean getIncludeAnalysisLayers() {
  312. return includeAnalysisLayers;
  313. }
  314. private boolean isSameDomain(String[] domain1, String[] domain2) {
  315. if (domain1 == null || domain2 == null) {
  316. return true;
  317. }
  318. for (String s1 : domain1) {
  319. for (String s2 : domain2) {
  320. if (s1.equalsIgnoreCase(s2)) {
  321. return true;
  322. }
  323. }
  324. }
  325. return false;
  326. }
  327. }