- /*
- * else Jmol (if pre-2.9, stateData contains JMOL state string)
- */
- createJmolViewer(viewerData, af, jprovider);
- }
- }
-
- /**
- * Create a new Chimera viewer.
- *
- * @param data
- * @param af
- * @param jprovider
- */
- protected void createChimeraViewer(
- Entry<String, StructureViewerModel> viewerData, AlignFrame af,
- jarInputStreamProvider jprovider)
- {
- StructureViewerModel data = viewerData.getValue();
- String chimeraSessionFile = data.getStateData();
-
- /*
- * Copy Chimera session from jar entry "viewer_"+viewId to a temporary file
- *
- * NB this is the 'saved' viewId as in the project file XML, _not_ the
- * 'uniquified' sviewid used to reconstruct the viewer here
- */
- String viewerJarEntryName = getViewerJarEntryName(data.getViewId());
- chimeraSessionFile = copyJarEntry(jprovider, viewerJarEntryName,
- "chimera", null);
-
- Set<Entry<File, StructureData>> fileData = data.getFileData()
- .entrySet();
- List<PDBEntry> pdbs = new ArrayList<>();
- List<SequenceI[]> allseqs = new ArrayList<>();
- for (Entry<File, StructureData> pdb : fileData)
- {
- String filePath = pdb.getValue().getFilePath();
- String pdbId = pdb.getValue().getPdbId();
- // pdbs.add(new PDBEntry(filePath, pdbId));
- pdbs.add(new PDBEntry(pdbId, null, PDBEntry.Type.PDB, filePath));
- final List<SequenceI> seqList = pdb.getValue().getSeqList();
- SequenceI[] seqs = seqList.toArray(new SequenceI[seqList.size()]);
- allseqs.add(seqs);
- }
-
- boolean colourByChimera = data.isColourByViewer();
- boolean colourBySequence = data.isColourWithAlignPanel();
-
- // TODO use StructureViewer as a factory here, see JAL-1761
- final PDBEntry[] pdbArray = pdbs.toArray(new PDBEntry[pdbs.size()]);
- final SequenceI[][] seqsArray = allseqs
- .toArray(new SequenceI[allseqs.size()][]);
- String newViewId = viewerData.getKey();
-
- ChimeraViewFrame cvf = new ChimeraViewFrame(chimeraSessionFile,
- af.alignPanel, pdbArray, seqsArray, colourByChimera,
- colourBySequence, newViewId);
- cvf.setSize(data.getWidth(), data.getHeight());
- cvf.setLocation(data.getX(), data.getY());
- }
-
- /**
- * Create a new Jmol window. First parse the Jmol state to translate filenames
- * loaded into the view, and record the order in which files are shown in the
- * Jmol view, so we can add the sequence mappings in same order.
- *
- * @param viewerData
- * @param af
- * @param jprovider
- */
- protected void createJmolViewer(
- final Entry<String, StructureViewerModel> viewerData,
- AlignFrame af, jarInputStreamProvider jprovider)
- {
- final StructureViewerModel svattrib = viewerData.getValue();
- String state = svattrib.getStateData();
-
- /*
- * Pre-2.9: state element value is the Jmol state string
- *
- * 2.9+: @type is "JMOL", state data is in a Jar file member named "viewer_"
- * + viewId
- */
- if (ViewerType.JMOL.toString().equals(svattrib.getType()))
- {
- state = readJarEntry(jprovider,
- getViewerJarEntryName(svattrib.getViewId()));
- }
-
- List<String> pdbfilenames = new ArrayList<>();
- List<SequenceI[]> seqmaps = new ArrayList<>();
- List<String> pdbids = new ArrayList<>();
- StringBuilder newFileLoc = new StringBuilder(64);
- int cp = 0, ncp, ecp;
- Map<File, StructureData> oldFiles = svattrib.getFileData();
- while ((ncp = state.indexOf("load ", cp)) > -1)
- {
- do
- {
- // look for next filename in load statement
- newFileLoc.append(state.substring(cp,
- ncp = (state.indexOf("\"", ncp + 1) + 1)));
- String oldfilenam = state.substring(ncp,
- ecp = state.indexOf("\"", ncp));
- // recover the new mapping data for this old filename
- // have to normalize filename - since Jmol and jalview do
- // filename
- // translation differently.
- StructureData filedat = oldFiles.get(new File(oldfilenam));
- if (filedat == null)
- {
- String reformatedOldFilename = oldfilenam.replaceAll("/", "\\\\");
- filedat = oldFiles.get(new File(reformatedOldFilename));
- }
- newFileLoc.append(Platform.escapeString(filedat.getFilePath()));
- pdbfilenames.add(filedat.getFilePath());
- pdbids.add(filedat.getPdbId());
- seqmaps.add(filedat.getSeqList().toArray(new SequenceI[0]));
- newFileLoc.append("\"");
- cp = ecp + 1; // advance beyond last \" and set cursor so we can
- // look for next file statement.
- } while ((ncp = state.indexOf("/*file*/", cp)) > -1);
- }
- if (cp > 0)
- {
- // just append rest of state
- newFileLoc.append(state.substring(cp));
- }
- else
- {
- System.err.print("Ignoring incomplete Jmol state for PDB ids: ");
- newFileLoc = new StringBuilder(state);
- newFileLoc.append("; load append ");
- for (File id : oldFiles.keySet())
- {
- // add this and any other pdb files that should be present in
- // the viewer
- StructureData filedat = oldFiles.get(id);
- newFileLoc.append(filedat.getFilePath());
- pdbfilenames.add(filedat.getFilePath());
- pdbids.add(filedat.getPdbId());
- seqmaps.add(filedat.getSeqList().toArray(new SequenceI[0]));
- newFileLoc.append(" \"");
- newFileLoc.append(filedat.getFilePath());
- newFileLoc.append("\"");
-
- }
- newFileLoc.append(";");
- }
-
- if (newFileLoc.length() == 0)
- {
- return;
- }
- int histbug = newFileLoc.indexOf("history = ");
- if (histbug > -1)
- {
- /*
- * change "history = [true|false];" to "history = [1|0];"
- */
- histbug += 10;
- int diff = histbug == -1 ? -1 : newFileLoc.indexOf(";", histbug);
- String val = (diff == -1) ? null
- : newFileLoc.substring(histbug, diff);
- if (val != null && val.length() >= 4)
- {
- if (val.contains("e")) // eh? what can it be?
- {
- if (val.trim().equals("true"))
- {
- val = "1";
- }
- else
- {
- val = "0";
- }
- newFileLoc.replace(histbug, diff, val);
- }
- }