Revision: 20687
          http://sourceforge.net/p/jmol/code/20687
Author:   hansonr
Date:     2015-08-10 00:15:14 +0000 (Mon, 10 Aug 2015)
Log Message:
-----------
Jmol.___JmolVersion="14.3.15_2015.08.09"

bug fix: CML reader can fail (e.g. nsc244a.cml)

code: refactoring of JmolDataManager

Modified Paths:
--------------
    trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCmlReader.java
    trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlReader.java
    trunk/Jmol/src/org/jmol/api/JmolDataManager.java
    trunk/Jmol/src/org/jmol/modelset/LabelToken.java
    trunk/Jmol/src/org/jmol/modelset/ModelLoader.java
    trunk/Jmol/src/org/jmol/script/ScriptExpr.java
    trunk/Jmol/src/org/jmol/scriptext/CmdExt.java
    trunk/Jmol/src/org/jmol/scriptext/IsoExt.java
    trunk/Jmol/src/org/jmol/scriptext/MathExt.java
    trunk/Jmol/src/org/jmol/util/Escape.java
    trunk/Jmol/src/org/jmol/viewer/DataManager.java
    trunk/Jmol/src/org/jmol/viewer/Jmol.properties
    trunk/Jmol/src/org/jmol/viewer/PropertyManager.java
    trunk/Jmol/src/org/jmol/viewer/StateCreator.java
    trunk/Jmol/src/org/jmol/viewer/Viewer.java

Modified: trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCmlReader.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCmlReader.java       
2015-08-08 21:47:59 UTC (rev 20686)
+++ trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCmlReader.java       
2015-08-10 00:15:14 UTC (rev 20687)
@@ -292,12 +292,12 @@
         if (atts.containsKey("atomRef1")) {
           breakOutBondTokens(atts.get("atomRef1"));
           for (int i = tokenCount; --i >= 0;)
-            bondArray[i].atomIndex1 = asc.getAtomIndex(tokens[i]);
+            bondArray[i].atomIndex1 = getAtomIndex(tokens[i]);
         }
         if (atts.containsKey("atomRef2")) {
           breakOutBondTokens(atts.get("atomRef2"));
           for (int i = tokenCount; --i >= 0;)
-            bondArray[i].atomIndex2 = asc.getAtomIndex(tokens[i]);
+            bondArray[i].atomIndex2 = getAtomIndex(tokens[i]);
         }
       } else if (name.equals("atomarray")) {
         state = MOLECULE_ATOM_ARRAY;
@@ -442,6 +442,10 @@
     }
   }
 
+  private int getAtomIndex(String label) {
+    return asc.getAtomIndex(isSerial ? label.substring(1) : label);
+  }
+
   final private static String[] unitCellParamTags = { "a", "b", "c", "alpha",
     "beta", "gamma" };
 

Modified: trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlReader.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlReader.java  2015-08-08 
21:47:59 UTC (rev 20686)
+++ trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlReader.java  2015-08-10 
00:15:14 UTC (rev 20687)
@@ -153,7 +153,7 @@
     try {
       thisReader.processXml(this, saxReader);
     } catch (Exception e) {
-      return "Error reading XML: " + (parent.vwr.isJS ? e : e.getMessage());
+      return "Error reading XML: " + ((parent == null ? vwr : parent.vwr).isJS 
? e : e.getMessage());
     }
     return null;
   }

Modified: trunk/Jmol/src/org/jmol/api/JmolDataManager.java
===================================================================
--- trunk/Jmol/src/org/jmol/api/JmolDataManager.java    2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/api/JmolDataManager.java    2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -9,11 +9,18 @@
 
 public interface JmolDataManager {
 
+  public static final int DATA_TYPE_LAST = -2;
   public final static int DATA_TYPE_UNKNOWN = -1;
   public final static int DATA_TYPE_STRING = 0;
   public final static int DATA_TYPE_AF = 1;
   public final static int DATA_TYPE_AFF = 2;
   public final static int DATA_TYPE_AFFF = 3;
+  // indexes into Object[] data
+  public final static int DATA_LABEL = 0;
+  public final static int DATA_VALUE = 1;
+  public final static int DATA_SELECTION = 2;
+  public final static int DATA_TYPE = 3;
+  public final static int DATA_SAVE_IN_STATE = 4; // optional; defaults to TRUE
 
   JmolDataManager set(Viewer vwr);
 
@@ -21,22 +28,16 @@
 
   void clear();
 
-  Object[] getData(String type);
+  void deleteModelAtoms(int firstAtomIndex, int nAtoms, BS bsDeleted);
 
-  float[][] getDataFloat2D(String label);
+  Object getData(String label, BS bsSelected, int dataType);
 
-  float[][][] getDataFloat3D(String label);
+  float getDataFloatAt(String label, int atomIndex);
 
-  float getDataFloat(String label, int atomIndex);
-
-  float[] getDataFloatA(String label, BS bsSelected);
-
   String getDefaultVdwNameOrData(VDW type, BS bs);
 
-  void deleteModelAtoms(int firstAtomIndex, int nAtoms, BS bsDeleted);
+  void setData(String type, Object[] data, int dataType, int ac,
+               int matchField, int matchFieldColumnCount, int dataField,
+               int dataFieldColumnCount);
 
-  void setData(String type, Object[] data, int arrayCount, int ac,
-               int matchField, int matchFieldColumnCount, int field,
-               int fieldColumnCount);
-
 }

Modified: trunk/Jmol/src/org/jmol/modelset/LabelToken.java
===================================================================
--- trunk/Jmol/src/org/jmol/modelset/LabelToken.java    2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/modelset/LabelToken.java    2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -37,6 +37,7 @@
 import javajs.util.SB;
 import javajs.util.T3;
 
+import org.jmol.api.JmolDataManager;
 import org.jmol.script.SV;
 import org.jmol.script.T;
 import org.jmol.util.Edge;
@@ -405,10 +406,10 @@
         String propertyName = strFormat.substring(ich, ichClose).toLowerCase();
         if (propertyName.startsWith("property_")) {
           lt.tok = T.data;
-          lt.data = vwr.getDataFloat(propertyName, null);
+          lt.data = vwr.getDataObj(propertyName, null, 
JmolDataManager.DATA_TYPE_AF);
         } else if (propertyName.startsWith("validation.")) {
           lt.tok = T.validation;
-          lt.data = vwr.getDataFloat("property_" + propertyName.substring(11), 
null);
+          lt.data = vwr.getDataObj("property_" + propertyName.substring(11), 
null, JmolDataManager.DATA_TYPE_AF);
         } else {
           T token = T.getTokenFromName(propertyName);
           if (token != null && isLabelPropertyTok(token.tok))
@@ -427,11 +428,11 @@
           break;
         }
         String s = strFormat.substring(ich, ichCloseBracket);
-        lt.data = vwr.getDataFloat(s, null);
+        lt.data = vwr.getDataObj(s, null, JmolDataManager.DATA_TYPE_AF);
         // TODO untested j2s issue fix
         if (lt.data == null) {
-          lt.data = vwr.getData(s);
-          if (lt.data instanceof Object[]) {// either that or it is null
+          lt.data = vwr.getDataObj(s, null, JmolDataManager.DATA_TYPE_UNKNOWN);
+          if (lt.data != null) {
             lt.data = ((Object[]) lt.data)[1];
             if (lt.data instanceof String)
               lt.data = PT.split((String) lt.data, "\n");

Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java
===================================================================
--- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java   2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java   2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -458,8 +458,8 @@
         }
         key = "property_" + key.toLowerCase();
         Logger.info("creating " + key + " for model " + ms.getModelName(i));
-        vwr.setData(key, new Object[] { key, value, bs, 
Integer.valueOf(JmolDataManager.DATA_TYPE_UNKNOWN), Boolean.FALSE }, ms.ac, 0,
-            0, Integer.MAX_VALUE, 0);
+        vwr.setData(key, new Object[] { key, value, bs, 
Integer.valueOf(JmolDataManager.DATA_TYPE_UNKNOWN), Boolean.FALSE }, 
+            ms.ac, 0, 0, Integer.MAX_VALUE, 0);
       }
     }
   }
@@ -839,7 +839,8 @@
     Logger.info(nRead + " atoms created");    
   }
 
-  private void addJmolDataProperties(Model m, Map<String, float[]> 
jmolDataProperties) {
+  private void addJmolDataProperties(Model m,
+                                     Map<String, float[]> jmolDataProperties) {
     if (jmolDataProperties == null)
       return;
     BS bs = m.bsAtoms;
@@ -849,17 +850,28 @@
       float[] data = e.getValue();
       if (data.length != nAtoms)
         return;
-      if (PT.isOneOf(key, ";x;y;z;"))
+      int tok = (key.startsWith("property_") ? T.property : T
+          .getTokFromName(key));
+      switch (tok) {
+      default:
+        if (T.tokAttr(tok, T.settable)) {
+          vwr.setAtomProperty(bs, tok, 0, 0, null, data, null);
+          break;
+        }
+        // not settable -- must encode as property_
+        //$FALL-THROUGH$
+      case T.x:
+      case T.y:
+      case T.z:
         key = "property_" + key;
-      if (key.startsWith("property_")) {
+        tok = T.property;
+        //$FALL-THROUGH$
+      case T.property:
+        // must create data set
         vwr.setData(
             key,
             new Object[] { key, data, bs,
                 Integer.valueOf(JmolDataManager.DATA_TYPE_AF) }, 0, 0, 0, 0, 
0);
-      } else {
-        int tok = T.getTokFromName(key);
-        if (T.tokAttr(tok, T.settable))
-          vwr.setAtomProperty(bs, tok, 0, 0, null, data, null);
       }
     }
   }

Modified: trunk/Jmol/src/org/jmol/script/ScriptExpr.java
===================================================================
--- trunk/Jmol/src/org/jmol/script/ScriptExpr.java      2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/script/ScriptExpr.java      2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -966,7 +966,7 @@
           if (pc + 2 == code.length)
             invArg();
           if (!chk)
-            data = vwr.getDataFloat((String) code[++pc].value, null);
+            data = (float[]) vwr.getDataObj((String) code[++pc].value, null, 
JmolDataManager.DATA_TYPE_AF);
         }
         if (++pc == code.length)
           invArg(); // compiler would not let this happen, actually
@@ -1647,7 +1647,7 @@
       ptT = new P3();
       break;
     case T.property:
-      data = vwr.getDataFloat((String) opValue, null);
+      data = (float[]) vwr.getDataObj((String) opValue, null, 
JmolDataManager.DATA_TYPE_AF);
       break;
     }
 

Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java
===================================================================
--- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java       2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java       2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -1923,8 +1923,7 @@
     default:
       eval.bad();
     }
-    String dataType = dataLabel + " ";
-    dataType = dataType.substring(0, dataType.indexOf(" ")).toLowerCase();
+    String dataType = dataLabel.substring(0, (dataLabel + " ").indexOf(" 
")).toLowerCase();
     if (dataType.equals("model") || dataType.equals("append")) {
       eval.cmdLoad();
       return;
@@ -1952,30 +1951,30 @@
     // not saving this data in the state?
     if (dataType.equals("element_vdw")) {
       // vdw for now
-      d[0] = dataType;
-      d[1] = dataString.replace(';', '\n');
+      d[JmolDataManager.DATA_LABEL] = dataType;
+      d[JmolDataManager.DATA_VALUE] = dataString.replace(';', '\n');
       int n = Elements.elementNumberMax;
       int[] eArray = new int[n + 1];
       for (int ie = 1; ie <= n; ie++)
         eArray[ie] = ie;
-      d[2] = eArray;
-      d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING);
+      d[JmolDataManager.DATA_SELECTION] = eArray;
+      d[JmolDataManager.DATA_TYPE] = 
Integer.valueOf(JmolDataManager.DATA_TYPE_STRING);
       vwr.setData("element_vdw", d, n, 0, 0, 0, 0);
       return;
     }
     if (dataType.indexOf("data2d_") == 0) {
       // data2d_someName
-      d[0] = dataLabel;
-      d[1] = parseDataArray(dataString, false);
-      d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_AFF);
+      d[JmolDataManager.DATA_LABEL] = dataLabel;
+      d[JmolDataManager.DATA_VALUE] = parseDataArray(dataString, false);
+      d[JmolDataManager.DATA_TYPE] = 
Integer.valueOf(JmolDataManager.DATA_TYPE_AFF);
       vwr.setData(dataLabel, d, 0, 0, 0, 0, 0);
       return;
     }
     if (dataType.indexOf("data3d_") == 0) {
       // data3d_someName
-      d[0] = dataLabel;
-      d[1] = parseDataArray(dataString, true);
-      d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_AFFF);
+      d[JmolDataManager.DATA_LABEL] = dataLabel;
+      d[JmolDataManager.DATA_VALUE] = parseDataArray(dataString, true);
+      d[JmolDataManager.DATA_TYPE] = 
Integer.valueOf(JmolDataManager.DATA_TYPE_AFFF);
       vwr.setData(dataLabel, d, 0, 0, 0, 0, 0);
       return;
     }
@@ -1983,7 +1982,7 @@
     if (dataType.indexOf("property_") == 0
         && !(tokens.length == 2 && tokens[1].equals("set"))) {
       BS bs = vwr.bsA();
-      d[0] = dataType;
+      d[JmolDataManager.DATA_LABEL] = dataType;
       int atomNumberField = (isOneValue ? 0 : ((Integer) vwr
           .getP("propertyAtomNumberField")).intValue());
       int atomNumberFieldColumnCount = (isOneValue ? 0 : ((Integer) vwr
@@ -2027,12 +2026,12 @@
           bsTemp.set(atomNo);
           atomMap[atomNo] = j;
         }
-        d[2] = atomMap;
+        d[JmolDataManager.DATA_SELECTION] = atomMap;
       } else {
-        d[2] = BSUtil.copy(bs);
+        d[JmolDataManager.DATA_SELECTION] = BSUtil.copy(bs);
       }
-      d[1] = dataString;
-      d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING);
+      d[JmolDataManager.DATA_VALUE] = dataString;
+      d[JmolDataManager.DATA_TYPE] = 
Integer.valueOf(JmolDataManager.DATA_TYPE_STRING);
       vwr.setData(dataType, d, ac, atomNumberField,
           atomNumberFieldColumnCount, propertyField, propertyFieldColumnCount);
       return;
@@ -2040,15 +2039,15 @@
     if ("occupany".equals(dataType))
         dataType = "occupancy"; // legacy misspelling in states
     int userType = AtomCollection.getUserSettableType(dataType);
-    if (userType >= 0) {
+    if (userType > JmolDataManager.DATA_TYPE_UNKNOWN) {
       // this is a known settable type or "property_xxxx"
       vwr.setAtomData(userType, dataType, dataString, isDefault);
       return;
     }
     // this is just information to be stored.
-    d[0] = dataLabel;
-    d[1] = dataString;
-    d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING);
+    d[JmolDataManager.DATA_LABEL] = dataLabel;
+    d[JmolDataManager.DATA_VALUE] = dataString;
+    d[JmolDataManager.DATA_TYPE] = 
Integer.valueOf(JmolDataManager.DATA_TYPE_STRING);
     vwr.setData(dataType, d, 0, 0, 0, 0, 0);
   }
 
@@ -4310,9 +4309,9 @@
     case T.data:
       String dtype = ((len = slen) == 3 ? paramAsStr(2) : null);
       if (!chk) {
-        Object[] data = vwr.getData(dtype);
+        Object[] data = (Object[]) vwr.getDataObj(dtype, null, 
JmolDataManager.DATA_TYPE_LAST);
         msg = (data == null ? "no data" : Escape.encapsulateData(
-            (String) data[0], data[1], ((Integer) data[3]).intValue()));
+            (String) data[JmolDataManager.DATA_LABEL], 
data[JmolDataManager.DATA_VALUE], ((Integer) 
data[JmolDataManager.DATA_TYPE]).intValue()));
       }
       break;
     case T.spacegroup:
@@ -4993,10 +4992,10 @@
                                         float min, float max)
       throws ScriptException {
 
-    float[] data = (property == null ?
-      (float[]) e.getBitsetProperty(bs, tok, null, null, null, null,
+    float[] data = (float[]) (property == null ?
+      e.getBitsetProperty(bs, tok, null, null, null, null,
           false, Integer.MAX_VALUE, false) 
-          : vwr.getDataFloat(property, bs));
+          : vwr.getDataObj(property, bs, JmolDataManager.DATA_TYPE_AF));
     if (!Float.isNaN(min))
       for (int i = 0; i < data.length; i++)
         if (data[i] < min)

Modified: trunk/Jmol/src/org/jmol/scriptext/IsoExt.java
===================================================================
--- trunk/Jmol/src/org/jmol/scriptext/IsoExt.java       2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/scriptext/IsoExt.java       2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -28,6 +28,7 @@
 import java.util.Map;
 
 import org.jmol.api.Interface;
+import org.jmol.api.JmolDataManager;
 import org.jmol.api.MepCalculationInterface;
 import org.jmol.api.SymmetryInterface;
 import org.jmol.atomdata.RadiusData;
@@ -1440,7 +1441,7 @@
           data = new float[vwr.ms.ac];
           if (chk)
             continue;
-          data = vwr.getDataFloat(str, null);
+          data = (float[]) vwr.getDataObj(str, null, 
JmolDataManager.DATA_TYPE_AF);
           if (data == null)
             invArg();
           addShapeProperty(propertyList, propertyName, data);
@@ -2136,7 +2137,7 @@
               nZ = Math.abs(nZ);
               xyzdata = floatArraySetXYZ(++eval.iToken, nX, nY, nZ);
             } else if (isXYZV) {
-              xyzdata = vwr.getDataFloat3D(name);
+              xyzdata = (float[][][]) vwr.getDataObj(name, null, 
JmolDataManager.DATA_TYPE_AFFF);
             } else {
               xyzdata = vwr.functionXYZ(name, nX, nY, nZ);
             }
@@ -2163,7 +2164,7 @@
               nY = Math.abs(nY);
               fdata = floatArraySet(++eval.iToken, nX, nY);
             } else if (isXYZ) {
-              fdata = vwr.getDataFloat2D(name);
+              fdata = (float[][]) vwr.getDataObj(name, null, 
JmolDataManager.DATA_TYPE_AFF);
               nX = (fdata == null ? 0 : fdata.length);
               nY = 3;
             } else {

Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java
===================================================================
--- trunk/Jmol/src/org/jmol/scriptext/MathExt.java      2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java      2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -32,6 +32,7 @@
 import java.util.regex.Pattern;
 
 import org.jmol.api.Interface;
+import org.jmol.api.JmolDataManager;
 import org.jmol.api.JmolNMRInterface;
 import org.jmol.api.JmolPatternMatcher;
 import org.jmol.atomdata.RadiusData;
@@ -773,7 +774,7 @@
     }
     if (selected.indexOf("data2d_") == 0) {
       // tab, newline separated data
-      float[][] f1 = vwr.getDataFloat2D(selected);
+      float[][] f1 = (float[][]) vwr.getDataObj(selected, null, 
JmolDataManager.DATA_TYPE_AFF);
       if (f1 == null)
         return mp.addXStr("");
       if (args.length == 2 && args[1].tok == T.integer) {
@@ -790,10 +791,10 @@
     // parallel mp.addition of float property data sets
 
     if (selected.indexOf("property_") == 0) {
-      float[] f1 = vwr.getDataFloat(selected, null);
+      float[] f1 = (float[]) vwr.getDataObj(selected, null, 
JmolDataManager.DATA_TYPE_AF);
       if (f1 == null)
         return mp.addXStr("");
-      float[] f2 = (type.indexOf("property_") == 0 ? vwr.getDataFloat(type, 
null)
+      float[] f2 = (type.indexOf("property_") == 0 ? (float[]) 
vwr.getDataObj(selected, null, JmolDataManager.DATA_TYPE_AF)
           : null);
       if (f2 != null) {
         f1 = AU.arrayCopyF(f1, -1);
@@ -806,7 +807,7 @@
     // some other data type -- just return it
 
     //if (args.length == 1) {
-      Object[] data = vwr.getData(selected);
+      Object[] data = (Object[]) vwr.getDataObj(selected, null, 
JmolDataManager.DATA_TYPE_UNKNOWN);
       return mp.addXStr(data == null ? "" : "" + data[1]);
    // }
   }

Modified: trunk/Jmol/src/org/jmol/util/Escape.java
===================================================================
--- trunk/Jmol/src/org/jmol/util/Escape.java    2015-08-08 21:47:59 UTC (rev 
20686)
+++ trunk/Jmol/src/org/jmol/util/Escape.java    2015-08-10 00:15:14 UTC (rev 
20687)
@@ -42,6 +42,7 @@
 import javajs.util.T3;
 import javajs.util.V3;
 
+import org.jmol.api.JmolDataManager;
 import org.jmol.java.BS;
 import org.jmol.script.SV;
 import org.jmol.script.T;
@@ -535,12 +536,23 @@
   }
 
   public static String encapsulateData(String name, Object data, int depth) {
-    return "  DATA \"" + name + "\"\n" + 
-        (depth == 2 ?
-          escapeFloatAA((float[][]) data, true) + ";\n"
-          : depth == 3 ?
-              escapeFloatAAA((float[][][]) data, true) + ";\n"
-          : data) + "    END \"" + name + "\";\n";
+    String s;
+    switch (depth) {
+    case JmolDataManager.DATA_TYPE_AF:
+      s = escapeFloatA((float[]) data, false) + ";\n";
+      break;
+    case JmolDataManager.DATA_TYPE_AFF:
+      s = escapeFloatAA((float[][]) data, true) + ";\n";
+      break;
+    case JmolDataManager.DATA_TYPE_AFFF:
+      s = escapeFloatAAA((float[][][]) data, true) + ";\n";
+      break;
+    default:
+      s = data.toString();
+      break;
+    }
+    return "  DATA \"" + name + "\"\n" + s + "    END \"" + name + "\";\n";
+    
   }
 
 //  public static String escapeXml(Object value) {

Modified: trunk/Jmol/src/org/jmol/viewer/DataManager.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/DataManager.java     2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/viewer/DataManager.java     2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -41,7 +41,6 @@
 import javajs.util.PT;
 import javajs.util.SB;
 
-
 /*
  * a class for storing and retrieving user data,
  * including atom-related and color-related data
@@ -51,13 +50,13 @@
 public class DataManager implements JmolDataManager {
 
   private Map<String, Object[]> dataValues = new Hashtable<String, Object[]>();
-  
+
   private Viewer vwr;
-  
+
   public DataManager() {
     // for reflection
   }
-  
+
   @Override
   public JmolDataManager set(Viewer vwr) {
     this.vwr = vwr;
@@ -68,13 +67,7 @@
   public void clear() {
     dataValues.clear();
   }
-  
-  //private final static int DATA_LABEL = 0;
-  private final static int DATA_VALUE = 1;
-  private final static int DATA_SELECTION_MAP = 2;
-  private final static int DATA_TYPE = 3;
-  private final static int DATA_SAVE_IN_STATE = 4;
-    
+
   /**
    * This method needs to be redone using a class instead of Object[]
    */
@@ -102,7 +95,7 @@
     }
     type = type.toLowerCase();
     if (type.equals("element_vdw")) {
-      String stringData = ((String) data[DATA_VALUE]).trim();
+      String stringData = ((String) data[JmolDataManager.DATA_VALUE]).trim();
       if (stringData.length() == 0) {
         vwr.userVdwMars = null;
         vwr.userVdws = null;
@@ -112,27 +105,27 @@
       if (vwr.bsUserVdws == null)
         vwr.setUserVdw(vwr.defaultVdw);
       Parser.parseFloatArrayFromMatchAndField(stringData, vwr.bsUserVdws, 1, 0,
-          (int[]) data[DATA_SELECTION_MAP], 2, 0, vwr.userVdws, 1);
+          (int[]) data[JmolDataManager.DATA_SELECTION], 2, 0, vwr.userVdws, 1);
       for (int i = vwr.userVdws.length; --i >= 0;)
         vwr.userVdwMars[i] = (int) Math.floor(vwr.userVdws[i] * 1000);
       return;
     }
-    int depth = ((Integer) data[DATA_TYPE]).intValue();
-    Object val = data[DATA_VALUE];
+    int depth = getType(data);
+    Object val = data[JmolDataManager.DATA_VALUE];
     if (depth == JmolDataManager.DATA_TYPE_UNKNOWN)
-      data[DATA_TYPE] = Integer
+      data[JmolDataManager.DATA_TYPE] = Integer
           .valueOf(depth = (val instanceof String ? 
JmolDataManager.DATA_TYPE_STRING
               : AU.isAF(val) ? JmolDataManager.DATA_TYPE_AF
                   : AU.isAFF(val) ? JmolDataManager.DATA_TYPE_AFF : AU
                       .isAFFF(val) ? JmolDataManager.DATA_TYPE_AFFF
                       : JmolDataManager.DATA_TYPE_UNKNOWN));
-    if (data[DATA_SELECTION_MAP] != null && arrayCount > 0) {
+    if (data[JmolDataManager.DATA_SELECTION] != null && arrayCount > 0) {
       boolean createNew = (matchField != 0 || field != Integer.MIN_VALUE
           && field != Integer.MAX_VALUE);
       Object[] oldData = dataValues.get(type);
       BS bs;
       float[] f = (oldData == null || createNew ? new float[actualAtomCount]
-          : AU.ensureLengthA(((float[]) oldData[1]), actualAtomCount));
+          : AU.ensureLengthA(((float[]) oldData[JmolDataManager.DATA_VALUE]), 
actualAtomCount));
 
       // check to see if the data COULD be interpreted as a string of float 
values
       // and if so, do that. This pre-fetches the tokens in that case.
@@ -149,14 +142,13 @@
       if (field == Integer.MIN_VALUE
           && (strData = PT.getTokens(stringData)).length > 1)
         field = 0;
-
       if (field == Integer.MIN_VALUE) {
         // set the selected data elements to a single value
-        bs = (BS) data[DATA_SELECTION_MAP];
+        bs = (BS) data[JmolDataManager.DATA_SELECTION];
         setSelectedFloats(PT.parseFloat(stringData), bs, f);
       } else if (field == 0 || field == Integer.MAX_VALUE) {
         // just get the selected token values
-        bs = (BS) data[DATA_SELECTION_MAP];
+        bs = (BS) data[JmolDataManager.DATA_SELECTION];
         if (floatData != null) {
           int n = floatData.length;
           if (n == bs.cardinality()) {
@@ -164,7 +156,8 @@
                 .nextSetBit(i + 1), pt++)
               f[i] = floatData[pt];
           } else {
-            for (int i = bs.nextSetBit(0); i >= 0 && i < n; i = 
bs.nextSetBit(i + 1))
+            for (int i = bs.nextSetBit(0); i >= 0 && i < n; i = bs
+                .nextSetBit(i + 1))
               f[i] = floatData[i];
           }
         } else {
@@ -173,13 +166,13 @@
         }
       } else if (matchField <= 0) {
         // get the specified field >= 1 for the selected atoms
-        bs = (BS) data[DATA_SELECTION_MAP];
+        bs = (BS) data[JmolDataManager.DATA_SELECTION];
         Parser.parseFloatArrayFromMatchAndField(stringData, bs, 0, 0, null,
             field, fieldColumnCount, f, 1);
       } else {
         // get the selected field, with an integer match in a specified field
         // in this case, bs is created and indicates which data points were set
-        int[] iData = (int[]) data[DATA_SELECTION_MAP];
+        int[] iData = (int[]) data[JmolDataManager.DATA_SELECTION];
         Parser.parseFloatArrayFromMatchAndField(stringData, null, matchField,
             matchFieldColumnCount, iData, field, fieldColumnCount, f, 1);
         bs = new BS();
@@ -187,12 +180,14 @@
           if (iData[i] >= 0)
             bs.set(iData[i]);
       }
-      if (oldData != null && oldData[DATA_SELECTION_MAP] instanceof BS
+      if (oldData != null
+          && oldData[JmolDataManager.DATA_SELECTION] instanceof BS
           && !createNew)
-        bs.or((BS) (oldData[DATA_SELECTION_MAP]));
-      data[DATA_TYPE] = Integer.valueOf(JmolDataManager.DATA_TYPE_AF);
-      data[DATA_SELECTION_MAP] = bs;
-      data[DATA_VALUE] = f;
+        bs.or((BS) (oldData[JmolDataManager.DATA_SELECTION]));
+      data[JmolDataManager.DATA_TYPE] = Integer
+          .valueOf(JmolDataManager.DATA_TYPE_AF);
+      data[JmolDataManager.DATA_SELECTION] = bs;
+      data[JmolDataManager.DATA_VALUE] = f;
       if (type.indexOf("property_atom.") == 0) {
         int tok = T.getSettableTokFromString(type = type.substring(14));
         if (tok == T.nada) {
@@ -211,6 +206,10 @@
     dataValues.put(type, data);
   }
 
+  private int getType(Object[] data) {
+    return ((Integer) data[JmolDataManager.DATA_TYPE]).intValue();
+  }
+
   /**
    * 
    * @param f
@@ -220,52 +219,50 @@
   private static void setSelectedFloats(float f, BS bs, float[] data) {
     boolean isAll = (bs == null);
     int i0 = (isAll ? 0 : bs.nextSetBit(0));
-    for (int i = i0; i >= 0 && i < data.length; i = (isAll ? i + 1 : 
bs.nextSetBit(i + 1)))
+    for (int i = i0; i >= 0 && i < data.length; i = (isAll ? i + 1 : bs
+        .nextSetBit(i + 1)))
       data[i] = f;
   }
 
   @Override
-  public Object[] getData(String type) {
-    if (dataValues.size() == 0 || type == null)
+  public Object getData(String label, BS bsSelected, int dataType) {
+    if (dataValues.size() == 0 || label == null)
       return null;
-    if (!type.equalsIgnoreCase("types"))
-      return dataValues.get(type);
-    String[] info = new String[2];
-    info[0] = "types";
-    info[1] = "";
-    int n = 0;
-    for (String name : dataValues.keySet())
-      info[1] += (n++ > 0 ? "\n" : "") + name;
-    return info;
+    switch (dataType) {
+    case JmolDataManager.DATA_TYPE_UNKNOWN:
+    case JmolDataManager.DATA_TYPE_LAST:
+      if (!label.equalsIgnoreCase("types"))
+        return dataValues.get(label);
+      String[] info = new String[2];
+      info[JmolDataManager.DATA_LABEL] = "types";
+      info[JmolDataManager.DATA_VALUE] = "";
+      int nv = 0;
+      for (String name : dataValues.keySet())
+        info[JmolDataManager.DATA_VALUE] += (nv++ > 0 ? "\n" : "") + name;
+      return info;
+    default:
+      Object[] data = dataValues.get(label);
+      if (data == null || getType(data) != dataType)
+        return null;
+      if (bsSelected == null)
+        return data[JmolDataManager.DATA_VALUE];
+      // When bsSelected is not null, this returns a truncated array, which 
must be of type float[]
+      float[] f = (float[]) data[JmolDataManager.DATA_VALUE];
+      float[] fnew = new float[bsSelected.cardinality()];
+      // load array
+      for (int i = 0, n = f.length, p = bsSelected.nextSetBit(0); p >= 0
+          && i < n; p = bsSelected.nextSetBit(p + 1))
+        fnew[i++] = f[p];
+      return fnew;
+    }
   }
 
-  /**
-   * When bsSelected is not null, this returns a truncated array
-   * 
-   */
   @Override
-  public float[] getDataFloatA(String label, BS bsSelected) {
-    if (dataValues.size() == 0)
-      return null;
-    Object[] data = getData(label);
-    if (data == null || ((Integer)data[DATA_TYPE]).intValue() != 
JmolDataManager.DATA_TYPE_AF)
-      return null;
-    float[] f = (float[]) data[DATA_VALUE];
-    if (bsSelected == null)
-      return f;
-    float[] fnew = new float[bsSelected.cardinality()];
-    // load array
-    for (int i = 0, n = f.length, p = bsSelected.nextSetBit(0); p >= 0 && i < 
n; p = bsSelected.nextSetBit(p + 1))
-      fnew[i++] = f[p];
-    return fnew;
-  }
-
-  @Override
-  public float getDataFloat(String label, int atomIndex) {
+  public float getDataFloatAt(String label, int atomIndex) {
     if (dataValues.size() > 0) {
-      Object[] data = getData(label);
-      if (data != null && ((Integer)data[DATA_TYPE]).intValue() == 
JmolDataManager.DATA_TYPE_AF) {
-        float[] f = (float[]) data[DATA_VALUE];
+      Object[] data = (Object[]) getData(label, null, 0);
+      if (data != null && getType(data) == JmolDataManager.DATA_TYPE_AF) {
+        float[] f = (float[]) data[JmolDataManager.DATA_VALUE];
         if (atomIndex < f.length)
           return f[atomIndex];
       }
@@ -274,46 +271,17 @@
   }
 
   @Override
-  public float[][] getDataFloat2D(String label) {
-    if (dataValues.size() == 0)
-      return null;
-    Object[] data = getData(label);
-    if (data == null || ((Integer)data[DATA_TYPE]).intValue() != 
JmolDataManager.DATA_TYPE_AFF)
-      return null;
-    return (float[][]) data[DATA_VALUE];
-  }
-
-  @Override
-  public float[][][] getDataFloat3D(String label) {
-    if (dataValues.size() == 0)
-      return null;
-    Object[] data = getData(label);
-    if (data == null || ((Integer)data[DATA_TYPE]).intValue() != 
JmolDataManager.DATA_TYPE_AFFF)
-      return null;
-    return (float[][][]) data[DATA_VALUE];
-  }
-
-  @Override
   public void deleteModelAtoms(int firstAtomIndex, int nAtoms, BS bsDeleted) {
     if (dataValues.size() == 0)
       return;
-    for (String name: dataValues.keySet()) {
+    for (String name : dataValues.keySet()) {
       if (name.indexOf("property_") == 0) {
         Object[] obj = dataValues.get(name);
-        BSUtil.deleteBits((BS) obj[2], bsDeleted);
-        switch (((Integer)obj[3]).intValue()) {
-        case JmolDataManager.DATA_TYPE_AF:
-          obj[1] = AU.deleteElements(obj[1], firstAtomIndex, nAtoms);
-          break;
-        case JmolDataManager.DATA_TYPE_AFF:
-          obj[1] = AU.deleteElements(obj[1], firstAtomIndex, nAtoms);
-          break;
-        default:
-          // is there anything else??
-          break;
-        }
+        BSUtil.deleteBits((BS) obj[DATA_SELECTION], bsDeleted);
+        obj[DATA_VALUE] = AU.deleteElements(obj[DATA_VALUE], firstAtomIndex,
+            nAtoms);
       }
-    }    
+    }
   }
 
   @Override
@@ -325,10 +293,12 @@
     int i1 = (isAll ? Elements.elementNumberMax : bs.length());
     for (int i = i0; i < i1 && i >= 0; i = (isAll ? i + 1 : bs
         .nextSetBit(i + 1)))
-      sb.appendI(i).appendC('\t').appendF(
-          type == VDW.USER ? vwr.userVdws[i] : Elements
-              .getVanderwaalsMar(i, type) / 1000f).appendC('\t').append(
-          Elements.elementSymbolFromNumber(i)).appendC('\n');
+      sb.appendI(i)
+          .appendC('\t')
+          .appendF(
+              type == VDW.USER ? vwr.userVdws[i] : Elements.getVanderwaalsMar(
+                  i, type) / 1000f).appendC('\t')
+          .append(Elements.elementSymbolFromNumber(i)).appendC('\n');
     return (bs == null ? sb.toString() : "\n  DATA \"element_vdw\"\n"
         + sb.append("  end \"element_vdw\";\n\n").toString());
   }
@@ -341,35 +311,39 @@
     for (String name : dataValues.keySet()) {
       if (name.indexOf("property_") == 0) {
         Object[] obj = dataValues.get(name);
-        if (obj.length > DATA_SAVE_IN_STATE
-            && obj[DATA_SAVE_IN_STATE] == Boolean.FALSE)
+        // default for "save in state" is TRUE
+        if (obj.length > JmolDataManager.DATA_SAVE_IN_STATE
+            && !((Boolean) obj[JmolDataManager.DATA_SAVE_IN_STATE])
+                .booleanValue())
           continue;
         haveData = true;
-        Object data = obj[1];
-        if (data != null && ((Integer) obj[3]).intValue() == 1) {
+        Object data = obj[DATA_VALUE];
+        if (data != null
+            && getType(obj) == JmolDataManager.DATA_TYPE_AF) {
           sc.getAtomicPropertyStateBuffer(sb, AtomCollection.TAINT_MAX,
-              (BS) obj[2], name, (float[]) data);
+              (BS) obj[DATA_SELECTION], name, (float[]) data);
           sb.append("\n");
         } else {
-          sb.append("\n").append(Escape.encapsulateData(name, data, 0));//j2s 
issue?
+          // should not be here -- property_xxx is always float[]
+          sb.append("\n").append(
+              Escape.encapsulateData(name, data,
+                  JmolDataManager.DATA_TYPE_UNKNOWN));//j2s issue?
         }
-      } else if (name.indexOf("data2d") == 0) {
-        Object[] obj = dataValues.get(name);
-        Object data = obj[1];
-        if (data != null && ((Integer) obj[3]).intValue() == 2) {
-          haveData = true;
-          sb.append("\n").append(Escape.encapsulateData(name, data, 2));
-        }
-      } else if (name.indexOf("data3d") == 0) {
-        Object[] obj = dataValues.get(name);
-        Object data = obj[1];
-        if (data != null && ((Integer) obj[3]).intValue() == 3) {
-          haveData = true;
-          sb.append("\n").append(Escape.encapsulateData(name, data, 3));
-        }
+        continue;
       }
+      int type = (name.indexOf("data2d") == 0 ? JmolDataManager.DATA_TYPE_AFF
+          : name.indexOf("data3d") == 0 ? JmolDataManager.DATA_TYPE_AFFF
+              : JmolDataManager.DATA_TYPE_UNKNOWN);
+      if (type == JmolDataManager.DATA_TYPE_UNKNOWN)
+        continue;
+      Object[] obj = dataValues.get(name);
+      Object data = obj[DATA_VALUE];
+      if (data != null && getType(obj) == type) {
+        haveData = true;
+        sb.append("\n").append(Escape.encapsulateData(name, data, type));
+      }
     }
     return haveData;
   }
-  
+
 }

Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/Jmol.properties      2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties      2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -51,8 +51,14 @@
 TODO: curved arrows overextend and with width settings do not truncate shaft 
properly
 
 
-Jmol.___JmolVersion="14.3.15_2015.08.08"
+Jmol.___JmolVersion="14.3.15_2015.08.09"
 
+bug fix: CML reader can fail (e.g. nsc244a.cml)
+
+code: refactoring of JmolDataManager
+
+JmolVersion="14.3.15_2015.08.08"
+
 new feature: atom property "monomer" same as %g
 new feature: atom property "seqcode" same as %r
 new feature: load "test.pdb" from write property atomno temperature now 
restores values for atomno and temperature for points on plot 

Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -49,6 +49,7 @@
 import java.util.Properties;
 
 import org.jmol.api.Interface;
+import org.jmol.api.JmolDataManager;
 import org.jmol.api.JmolPropertyManager;
 import org.jmol.java.BS;
 import org.jmol.modelset.Atom;
@@ -621,7 +622,7 @@
     case PROP_CONSOLE_TEXT:
       return vwr.getProperty("DATA_API", "consoleText", null);
     case PROP_DATA_INFO:
-      return vwr.getData(myParam.toString());
+      return vwr.getDataObj(myParam.toString(), null, 
JmolDataManager.DATA_TYPE_UNKNOWN);
     case PROP_ERROR_MESSAGE:
       return vwr.getErrorMessageUn();
     case PROP_EVALUATE:

Modified: trunk/Jmol/src/org/jmol/viewer/StateCreator.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/StateCreator.java    2015-08-08 21:47:59 UTC 
(rev 20686)
+++ trunk/Jmol/src/org/jmol/viewer/StateCreator.java    2015-08-10 00:15:14 UTC 
(rev 20687)
@@ -23,22 +23,22 @@
 
 package org.jmol.viewer;
 
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.Map;
+
 import javajs.awt.Font;
 import javajs.util.Lst;
+import javajs.util.P3;
 import javajs.util.PT;
 import javajs.util.SB;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Hashtable;
-
-import java.util.Map;
-
+import org.jmol.api.JmolDataManager;
 import org.jmol.api.JmolModulationSet;
 import org.jmol.api.JmolScriptFunction;
 import org.jmol.api.SymmetryInterface;
 import org.jmol.c.PAL;
-import org.jmol.c.STER;
 import org.jmol.c.STR;
 import org.jmol.c.VDW;
 import org.jmol.java.BS;
@@ -66,14 +66,12 @@
 import org.jmol.util.BSUtil;
 import org.jmol.util.C;
 import org.jmol.util.ColorEncoder;
+import org.jmol.util.Edge;
 import org.jmol.util.Escape;
 import org.jmol.util.GData;
-import org.jmol.util.Edge;
 import org.jmol.util.Logger;
 import org.jmol.util.Vibration;
 
-import javajs.util.P3;
-
 /**
  * StateCreator handles all aspects of working with the "state" as
  * generally defined, including
@@ -479,11 +477,11 @@
         String data = (String) vwr.ligandModels.get(key + "_data");
         if (data != null)
           cmds.append("  ").append(
-              Escape.encapsulateData("ligand_" + key, data.trim() + "\n", 0));
+              Escape.encapsulateData("ligand_" + key, data.trim() + "\n", 
JmolDataManager.DATA_TYPE_STRING));
         data = (String) vwr.ligandModels.get(key + "_file");
         if (data != null)
           cmds.append("  ").append(
-              Escape.encapsulateData("file_" + key, data.trim() + "\n", 0));
+              Escape.encapsulateData("file_" + key, data.trim() + "\n", 
JmolDataManager.DATA_TYPE_STRING));
       }
     }
     SB commands = new SB();

Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/Viewer.java  2015-08-08 21:47:59 UTC (rev 
20686)
+++ trunk/Jmol/src/org/jmol/viewer/Viewer.java  2015-08-10 00:15:14 UTC (rev 
20687)
@@ -2859,8 +2859,8 @@
   }
 
   public void setCurrentColorRange(String label) {
-    float[] data = getDataFloat(label, null);
-    BS bs = (data == null ? null : (BS) (getDataManager().getData(label))[2]);
+    float[] data = (float[]) getDataObj(label, null, 
JmolDataManager.DATA_TYPE_AF);
+    BS bs = (data == null ? null : (BS) ((Object[])getDataObj(label, null, 
JmolDataManager.DATA_TYPE_UNKNOWN))[2]);
     if (bs != null && g.rangeSelected)
       bs.and(bsA());
     cm.setPropertyColorRangeData(data, bs);
@@ -2868,31 +2868,99 @@
 
   private Object[] lastData;
 
-  public void setData(String type, Object[] data, int arrayCount,
-                      int matchField, int matchFieldColumnCount, int field,
-                      int fieldColumnCount) {
-    getDataManager().setData(type, lastData = data, arrayCount, ms.ac,
-        matchField, matchFieldColumnCount, field, fieldColumnCount);
+  /**
+   * A general-purpose data storage method. Note that matchFieldCount and
+   * dataFieldCount should both be positive or both be negative.
+   * 
+   * @param key
+   * 
+   *        a simple key name for the data, starting with "property_" if 
user-defined
+   * 
+   * @param data
+   * 
+   *        data[0] -- label
+   * 
+   *        data[1] -- string or float[] or float[][] or float[][][]
+   * 
+   *        data[2] -- selection bitset or int[] atomMap when field > 0
+   * 
+   *        data[3] -- arrayDepth 
0(String),1(float[]),2(float[][]),3(float[][][]) or -1
+   *        to indidate that it is set by data type
+   * 
+   *        data[4] -- Boolean.TRUE == saveInState
+   * 
+   * @param dataType
+   * 
+   *        see JmolDataManager interface
+   * 
+   * @param matchField
+   * 
+   *        if positive, data must match atomNo in this column
+   * 
+   *        if 0, no match column
+   * 
+   * @param matchFieldColumnCount
+   *        if positive, this number of characters in match column if 0,
+   *        reference is to tokens, not characters
+   * 
+   * @param dataField
+   * 
+   *        if positive, column containing the data
+   * 
+   *        if 0, values are a simple list; clear the data
+   * 
+   *        if Integer.MAX_VALUE, values are a simple list; don't clear the 
data
+   * 
+   *        if Integer.MIN_VALUE, have one SINGLE data value for all selected
+   *        atoms
+   * 
+   * @param dataFieldColumnCount
+   * 
+   *        if positive, this number of characters in data column
+   * 
+   *        if 0, reference is to tokens, not characters
+   */
+  public void setData(String key, Object[] data, int dataType,
+                      int matchField, int matchFieldColumnCount, int dataField,
+                      int dataFieldColumnCount) {
+    getDataManager().setData(key, lastData = data, dataType, ms.ac,
+        matchField, matchFieldColumnCount, dataField, dataFieldColumnCount);
   }
 
-  public Object[] getData(String type) {
-    return (type == null ? lastData : getDataManager().getData(type));
+  /**
+   * Retrieve a data object
+   * 
+   * @param key
+   * 
+   * @param bsSelected
+   * 
+   *        selected atoms; for DATA_AF only
+   * 
+   * @param dataType
+   * 
+   *        see JmolDataManager interface
+   * 
+   * @return data object
+   * 
+   *         data[0] -- label (same as key)
+   * 
+   *         data[1] -- string or float[] or float[][] or float[][][]
+   * 
+   *         data[2] -- selection bitset or int[] atomMap when field > 0
+   * 
+   *         data[3] -- arrayDepth
+   *         0(String),1(float[]),2(float[][]),3(float[][][]) or -1 to indicate
+   *         that it is set by data type
+   * 
+   *         data[4] -- Boolean.TRUE == saveInState
+   */
+  public Object getDataObj(String key, BS bsSelected, int dataType) {
+    return (key == null && dataType == JmolDataManager.DATA_TYPE_LAST ? 
lastData
+        : getDataManager().getData(key, bsSelected, dataType));
   }
 
-  public float[] getDataFloat(String label, BS bsSelected) {
-    return getDataManager().getDataFloatA(label, bsSelected);
-  }
-
-  public float[][] getDataFloat2D(String label) {
-    return getDataManager().getDataFloat2D(label);
-  }
-
-  public float[][][] getDataFloat3D(String label) {
-    return getDataManager().getDataFloat3D(label);
-  }
-
   public float getDataFloatAt(String label, int atomIndex) {
-    return getDataManager().getDataFloat(label, atomIndex);
+    return getDataManager().getDataFloatAt(label, atomIndex);
   }
 
   // boolean autoLoadOrientation() {
@@ -7519,7 +7587,7 @@
     nY = Math.abs(nY);
     float[][] fdata;
     if (data == null) {
-      fdata = getDataFloat2D(functionName);
+      fdata = (float[][]) getDataObj(functionName, null, 
JmolDataManager.DATA_TYPE_AFF);
       if (fdata != null)
         return fdata;
       data = "";
@@ -7544,7 +7612,7 @@
     nZ = Math.abs(nZ);
     float[][][] xyzdata;
     if (data == null) {
-      xyzdata = getDataFloat3D(functionName);
+      xyzdata = (float[][][]) getDataObj(functionName, null, 
JmolDataManager.DATA_TYPE_AFF);
       if (xyzdata != null)
         return xyzdata;
       data = "";

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
_______________________________________________
Jmol-commits mailing list
Jmol-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-commits

Reply via email to