();
+ try
+ {
+ String[] curfiles = jmb.getPdbFile(); // files currently in viewer
+ // TODO: replace with reference fetching/transfer code (validate PDBentry
+ // as a DBRef?)
+ jalview.ws.dbsources.Pdb pdbclient = new jalview.ws.dbsources.Pdb();
+ for (int pi = 0; pi < jmb.pdbentry.length; pi++)
+ {
+ String file = null;
+ if (jmb.pdbentry[pi].getFile()==null)
+ {
+ // retrieve the pdb and store it locally
+ AlignmentI pdbseq = null;
+ pdbid = jmb.pdbentry[pi].getId();
+ long hdl = pdbid.hashCode() - System.currentTimeMillis();
+ if (progressBar != null)
+ {
+ progressBar.setProgressBar("Fetching PDB " + pdbid, hdl);
+ }
+ try
+ {
+ pdbseq = pdbclient.getSequenceRecords(pdbid = jmb.pdbentry[pi]
+ .getId());
+ } catch (OutOfMemoryError oomerror)
+ {
+ new OOMWarning("Retrieving PDB id " + pdbid, oomerror);
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ errormsgs.append("'" + pdbid + "'");
+ }
+ if (progressBar != null)
+ {
+ progressBar.setProgressBar("Finished.", hdl);
+ }
+ if (pdbseq != null)
+ {
+ // just transfer the file name from the first sequence's first
+ // PDBEntry
+ file = new File(((PDBEntry) pdbseq.getSequenceAt(0).getPDBId()
+ .elementAt(0)).getFile()).getAbsolutePath();
+ jmb.pdbentry[pi].setFile(file);
+
+ files.append(" \"" + Platform.escapeString(file) + "\"");
+ }
+ else
+ {
+ errormsgs.append("'" + pdbid + "' ");
+ }
+ }
+ else
+ {
+ file = new File(jmb.pdbentry[pi].getFile())
+ .getAbsoluteFile().getPath();
+ if (curfiles != null && curfiles.length > 0)
+ {
+ addingStructures = true; // already files loaded.
+ for (int c = 0; c < curfiles.length; c++)
+ {
+ if (curfiles[c].equals(file))
+ {
+ file = null;
+ break;
+ }
+ }
+ }
+
+ if (file != null)
+ {
+ fileToLoad.add(file);
+ filePDB.add(jmb.pdbentry[pi]);
+ filePDBpos.add(Integer.valueOf(pi));
+ files.append(" \"" + Platform.escapeString(file) + "\"");
+ }
+ }
+ }
+ } catch (OutOfMemoryError oomerror)
+ {
+ new OOMWarning("Retrieving PDB files: " + pdbid, oomerror);
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ errormsgs.append("When retrieving pdbfiles : current was: '" + pdbid
+ + "'");
+ }
+ if (errormsgs.length() > 0)
+ {
+
+ JOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
+ .formatMessage("label.pdb_entries_couldnt_be_retrieved",
+ new String[]
+ { errormsgs.toString() }), MessageManager
+ .getString("label.couldnt_load_file"),
+ JOptionPane.ERROR_MESSAGE);
+
+ }
+ long lastnotify = jmb.getLoadNotifiesHandled();
+ if (files.length() > 0)
+ {
+ if (!addingStructures)
+ {
+ try
+ {
+ initChimera("");
+ } catch (Exception ex)
+ {
+ Cache.log.error("Couldn't open Chimera viewer!", ex);
+ }
+ }
+ int num=-1;
+ for (PDBEntry pe : filePDB)
+ {
+ num++;
+ if (pe.getFile() != null)
+ {
+ try
+ {
+ int pos=filePDBpos.get(num).intValue();
+ jmb.openFile(pe);
+ jmb.addSequence(pos, jmb.sequence[pos]);
+ File fl=new File(pe.getFile());
+ String protocol = AppletFormatAdapter.URL;
+ try
+ {
+ if (fl.exists())
+ {
+ protocol = AppletFormatAdapter.FILE;
+ }
+ } catch (Exception e)
+ {
+ } catch (Error e)
+ {
+ }
+ // Explicitly map to the filename used by Jmol ;
+ jmb.ssm.setMapping(jmb.sequence[pos], null, pe.getFile(),
+ protocol);
+ // pdbentry[pe].getFile(), protocol);
+ } catch (OutOfMemoryError oomerror)
+ {
+ new OOMWarning(
+ "When trying to open and map structures from Chimera!",
+ oomerror);
+ } catch (Exception ex)
+ {
+ Cache.log.error("Couldn't open " + pe.getFile()
+ + " in Chimera viewer!", ex);
+ } finally
+ {
+ Cache.log.debug("File locations are " + files);
+ }
+ }
+ }
+ // jmb.getPdbFile();
+ jmb.setFinishedInit(true);
+ jmb.setLoadingFromArchive(false);
+
+ // refresh the sequence colours for the new structure(s)
+ for (AlignmentPanel ap : _colourwith)
+ {
+ jmb.updateColours(ap);
+ }
+ // do superposition if asked to
+ if (alignAddedStructures)
+ {
+ new Thread(new Runnable()
+ {
+ public void run()
+ {
+ alignStructs_withAllAlignPanels();
+ }
+ }).start();
+ alignAddedStructures = false;
+ }
+ addingStructures = false;
+ }
+ _started = false;
+ worker = null;
+ }
+
+ public void pdbFile_actionPerformed(ActionEvent actionEvent)
+ {
+ JalviewFileChooser chooser = new JalviewFileChooser(
+ jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
+
+ chooser.setFileView(new JalviewFileView());
+ chooser.setDialogTitle("Save PDB File");
+ chooser.setToolTipText(MessageManager.getString("action.save"));
+
+ int value = chooser.showSaveDialog(this);
+
+ if (value == JalviewFileChooser.APPROVE_OPTION)
+ {
+ try
+ {
+ // TODO: cope with multiple PDB files in view
+ BufferedReader in = new BufferedReader(new FileReader(
+ jmb.getPdbFile()[0]));
+ File outFile = chooser.getSelectedFile();
+
+ PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
+ String data;
+ while ((data = in.readLine()) != null)
+ {
+ if (!(data.indexOf("") > -1 || data.indexOf("
") > -1))
+ {
+ out.println(data);
+ }
+ }
+ out.close();
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ public void viewMapping_actionPerformed(ActionEvent actionEvent)
+ {
+ jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();
+ try
+ {
+ for (int pdbe = 0; pdbe < jmb.pdbentry.length; pdbe++)
+ {
+ cap.appendText(jmb.printMapping(jmb.pdbentry[pdbe].getFile()));
+ cap.appendText("\n");
+ }
+ } catch (OutOfMemoryError e)
+ {
+ new OOMWarning(
+ "composing sequence-structure alignments for display in text box.",
+ e);
+ cap.dispose();
+ return;
+ }
+ jalview.gui.Desktop.addInternalFrame(cap,
+ MessageManager.getString("label.pdb_sequence_mapping"), 550,
+ 600);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ public void eps_actionPerformed(ActionEvent e)
+ {
+ throw new Error("EPS Generation not yet implemented.");
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ public void png_actionPerformed(ActionEvent e)
+ {
+ throw new Error("PNG Generation not yet implemented.");
+ }
+
+ public void jmolColour_actionPerformed(ActionEvent actionEvent)
+ {
+ if (jmolColour.isSelected())
+ {
+ // disable automatic sequence colouring.
+ jmb.setColourBySequence(false);
+ }
+ }
+
+ public void seqColour_actionPerformed(ActionEvent actionEvent)
+ {
+ jmb.setColourBySequence(seqColour.isSelected());
+ if (_colourwith == null)
+ {
+ _colourwith = new Vector();
+ }
+ if (jmb.isColourBySequence())
+ {
+ if (!jmb.isLoadingFromArchive())
+ {
+ if (_colourwith.size() == 0 && ap != null)
+ {
+ // Make the currently displayed alignment panel the associated view
+ _colourwith.add(ap.alignFrame.alignPanel);
+ }
+ }
+ // Set the colour using the current view for the associated alignframe
+ for (AlignmentPanel ap : _colourwith)
+ {
+ jmb.colourBySequence(ap.av.showSequenceFeatures, ap);
+ }
+ }
+ }
+
+ public void chainColour_actionPerformed(ActionEvent actionEvent)
+ {
+ chainColour.setSelected(true);
+ jmb.colourByChain();
+ }
+
+ public void chargeColour_actionPerformed(ActionEvent actionEvent)
+ {
+ chargeColour.setSelected(true);
+ jmb.colourByCharge();
+ }
+
+ public void zappoColour_actionPerformed(ActionEvent actionEvent)
+ {
+ zappoColour.setSelected(true);
+ jmb.setJalviewColourScheme(new ZappoColourScheme());
+ }
+
+ public void taylorColour_actionPerformed(ActionEvent actionEvent)
+ {
+ taylorColour.setSelected(true);
+ jmb.setJalviewColourScheme(new TaylorColourScheme());
+ }
+
+ public void hydroColour_actionPerformed(ActionEvent actionEvent)
+ {
+ hydroColour.setSelected(true);
+ jmb.setJalviewColourScheme(new HydrophobicColourScheme());
+ }
+
+ public void helixColour_actionPerformed(ActionEvent actionEvent)
+ {
+ helixColour.setSelected(true);
+ jmb.setJalviewColourScheme(new HelixColourScheme());
+ }
+
+ public void strandColour_actionPerformed(ActionEvent actionEvent)
+ {
+ strandColour.setSelected(true);
+ jmb.setJalviewColourScheme(new StrandColourScheme());
+ }
+
+ public void turnColour_actionPerformed(ActionEvent actionEvent)
+ {
+ turnColour.setSelected(true);
+ jmb.setJalviewColourScheme(new TurnColourScheme());
+ }
+
+ public void buriedColour_actionPerformed(ActionEvent actionEvent)
+ {
+ buriedColour.setSelected(true);
+ jmb.setJalviewColourScheme(new BuriedColourScheme());
+ }
+
+ public void purinePyrimidineColour_actionPerformed(ActionEvent actionEvent)
+ {
+ setJalviewColourScheme(new PurinePyrimidineColourScheme());
+ }
+
+ public void userColour_actionPerformed(ActionEvent actionEvent)
+ {
+ userColour.setSelected(true);
+ new UserDefinedColours(this, null);
+ }
+
+ public void backGround_actionPerformed(ActionEvent actionEvent)
+ {
+ java.awt.Color col = JColorChooser.showDialog(this,
+ "Select Background Colour", null);
+ if (col != null)
+ {
+ jmb.setBackgroundColour(col);
+ }
+ }
+
+ public void jmolHelp_actionPerformed(ActionEvent actionEvent)
+ {
+ try
+ {
+ jalview.util.BrowserLauncher
+ .openURL("https://www.cgl.ucsf.edu/chimera/docs/UsersGuide");
+ } catch (Exception ex)
+ {
+ }
+ }
+
+ String viewId = null;
+
+ public String getViewId()
+ {
+ if (viewId == null)
+ {
+ viewId = System.currentTimeMillis() + "." + this.hashCode();
+ }
+ return viewId;
+ }
+
+ public void updateTitleAndMenus()
+ {
+ if (jmb.fileLoadingError != null && jmb.fileLoadingError.length() > 0)
+ {
+ repaint();
+ return;
+ }
+ setChainMenuItems(jmb.chainNames);
+
+ this.setTitle(jmb.getViewerTitle());
+ if (jmb.getPdbFile().length > 1 && jmb.sequence.length > 1)
+ {
+ jmolActionMenu.setVisible(true);
+ }
+ if (!jmb.isLoadingFromArchive())
+ {
+ seqColour_actionPerformed(null);
+ }
+ }
+
+ protected void buildChimeraActionMenu()
+ {
+ if (_alignwith == null)
+ {
+ _alignwith = new Vector();
+ }
+ if (_alignwith.size() == 0 && ap != null)
+ {
+ _alignwith.add(ap);
+ }
+ ;
+ for (Component c : jmolActionMenu.getMenuComponents())
+ {
+ if (c != alignStructs)
+ {
+ jmolActionMenu.remove((JMenuItem) c);
+ }
+ }
+ final ItemListener handler;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * jalview.jbgui.GStructureViewer#alignStructs_actionPerformed(java.awt.event
+ * .ActionEvent)
+ */
+ @Override
+ protected void alignStructs_actionPerformed(ActionEvent actionEvent)
+ {
+ alignStructs_withAllAlignPanels();
+ }
+
+ private void alignStructs_withAllAlignPanels()
+ {
+ if (ap == null)
+ {
+ return;
+ }
+ ;
+ if (_alignwith.size() == 0)
+ {
+ _alignwith.add(ap);
+ }
+ ;
+ try
+ {
+ AlignmentI[] als = new Alignment[_alignwith.size()];
+ ColumnSelection[] alc = new ColumnSelection[_alignwith.size()];
+ int[] alm = new int[_alignwith.size()];
+ int a = 0;
+
+ for (AlignmentPanel ap : _alignwith)
+ {
+ als[a] = ap.av.getAlignment();
+ alm[a] = -1;
+ alc[a++] = ap.av.getColumnSelection();
+ }
+ jmb.superposeStructures(als, alm, alc);
+ } catch (Exception e)
+ {
+ StringBuffer sp = new StringBuffer();
+ for (AlignmentPanel ap : _alignwith)
+ {
+ sp.append("'" + ap.alignFrame.getTitle() + "' ");
+ }
+ Cache.log.info("Couldn't align structures with the " + sp.toString()
+ + "associated alignment panels.", e);
+
+ }
+
+ }
+
+ public void setJalviewColourScheme(ColourSchemeI ucs)
+ {
+ jmb.setJalviewColourScheme(ucs);
+
+ }
+
+ /**
+ *
+ * @param alignment
+ * @return first alignment panel displaying given alignment, or the default
+ * alignment panel
+ */
+ public AlignmentPanel getAlignmentPanelFor(AlignmentI alignment)
+ {
+ for (AlignmentPanel ap : getAllAlignmentPanels())
+ {
+ if (ap.av.getAlignment() == alignment)
+ {
+ return ap;
+ }
+ }
+ return ap;
+ }
+
+ /**
+ *
+ * @param ap2
+ * @return true if this Jmol instance is linked with the given alignPanel
+ */
+ public boolean isLinkedWith(AlignmentPanel ap2)
+ {
+ return _aps.contains(ap2.av.getSequenceSetId());
+ }
+
+ public boolean isUsedforaligment(AlignmentPanel ap2)
+ {
+
+ return (_alignwith != null) && _alignwith.contains(ap2);
+ }
+
+ public boolean isUsedforcolourby(AlignmentPanel ap2)
+ {
+ return (_colourwith != null) && _colourwith.contains(ap2);
+ }
+
+ /**
+ *
+ * @return TRUE if the view is NOT being coloured by sequence associations.
+ */
+ public boolean isColouredByJmol()
+ {
+ return !jmb.isColourBySequence();
+ }
+
+ public SequenceStructureBinding getBinding()
+ {
+ return jmb;
+ }
+
+}