- }\r
- });\r
- handler.itemStateChanged(null);\r
- jmolActionMenu.add(alpanels);\r
- jmolActionMenu.addMenuListener(new MenuListener()\r
- {\r
-\r
- @Override\r
- public void menuSelected(MenuEvent e)\r
- {\r
- handler.itemStateChanged(null);\r
- }\r
-\r
- @Override\r
- public void menuDeselected(MenuEvent e)\r
- {\r
- // TODO Auto-generated method stub\r
-\r
- }\r
-\r
- @Override\r
- public void menuCanceled(MenuEvent e)\r
- {\r
- // TODO Auto-generated method stub\r
-\r
- }\r
- });\r
- }\r
-\r
- IProgressIndicator progressBar = null;\r
-\r
- /**\r
- * add a single PDB structure to a new or existing Jmol view\r
- * \r
- * @param pdbentry\r
- * @param seq\r
- * @param chains\r
- * @param ap\r
- */\r
- public AppJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains,\r
- final AlignmentPanel ap)\r
- {\r
- progressBar = ap.alignFrame;\r
- // ////////////////////////////////\r
- // Is the pdb file already loaded?\r
- String alreadyMapped = ap.getStructureSelectionManager()\r
- .alreadyMappedToFile(pdbentry.getId());\r
-\r
- if (alreadyMapped != null)\r
- {\r
- int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
- MessageManager.formatMessage("label.pdb_entry_is_already_displayed", new String[]{pdbentry.getId()}),\r
- MessageManager.formatMessage("label.map_sequences_to_visible_window", new String[]{pdbentry.getId()}),\r
- JOptionPane.YES_NO_OPTION);\r
-\r
- if (option == JOptionPane.YES_OPTION)\r
- {\r
- // TODO : Fix multiple seq to one chain issue here.\r
- ap.getStructureSelectionManager().setMapping(seq, chains,\r
- alreadyMapped, AppletFormatAdapter.FILE);\r
- if (ap.seqPanel.seqCanvas.fr != null)\r
- {\r
- ap.seqPanel.seqCanvas.fr.featuresAdded();\r
- ap.paintAlignment(true);\r
- }\r
-\r
- // Now this AppJmol is mapped to new sequences. We must add them to\r
- // the exisiting array\r
- JInternalFrame[] frames = Desktop.instance.getAllFrames();\r
-\r
- for (int i = 0; i < frames.length; i++)\r
- {\r
- if (frames[i] instanceof AppJmol)\r
- {\r
- final AppJmol topJmol = ((AppJmol) frames[i]);\r
- // JBPNOTE: this looks like a binding routine, rather than a gui\r
- // routine\r
- for (int pe = 0; pe < topJmol.jmb.pdbentry.length; pe++)\r
- {\r
- if (topJmol.jmb.pdbentry[pe].getFile().equals(alreadyMapped))\r
- {\r
- topJmol.jmb.addSequence(pe, seq);\r
- topJmol.addAlignmentPanel(ap);\r
- // add it to the set used for colouring\r
- topJmol.useAlignmentPanelForColourbyseq(ap);\r
- topJmol.buildJmolActionMenu();\r
- ap.getStructureSelectionManager()\r
- .sequenceColoursChanged(ap);\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- return;\r
- }\r
- }\r
- // /////////////////////////////////\r
- // Check if there are other Jmol views involving this alignment\r
- // and prompt user about adding this molecule to one of them\r
- Vector existingViews = getJmolsFor(ap);\r
- if (existingViews.size() > 0)\r
- {\r
- Enumeration jm = existingViews.elements();\r
- while (jm.hasMoreElements())\r
- {\r
- AppJmol topJmol = (AppJmol) jm.nextElement();\r
- // TODO: highlight topJmol in view somehow\r
- int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
- MessageManager.formatMessage("label.add_pdbentry_to_view", new String[]{pdbentry.getId(),topJmol.getTitle()}),\r
- MessageManager.getString("label.align_to_existing_structure_view"),\r
- JOptionPane.YES_NO_OPTION);\r
- if (option == JOptionPane.YES_OPTION)\r
- {\r
- topJmol.useAlignmentPanelForSuperposition(ap);\r
- topJmol.addStructure(pdbentry, seq, chains, true, ap.alignFrame);\r
- return;\r
- }\r
- }\r
- }\r
- // /////////////////////////////////\r
- openNewJmol(ap, new PDBEntry[]\r
- { pdbentry }, new SequenceI[][]\r
- { seq });\r
- }\r
-\r
- private void openNewJmol(AlignmentPanel ap, PDBEntry[] pdbentrys,\r
- SequenceI[][] seqs)\r
- {\r
- progressBar = ap.alignFrame;\r
- jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(),\r
- pdbentrys, seqs, null, null);\r
- addAlignmentPanel(ap);\r
- useAlignmentPanelForColourbyseq(ap);\r
- if (pdbentrys.length > 1)\r
- {\r
- alignAddedStructures = true;\r
- useAlignmentPanelForSuperposition(ap);\r
- }\r
- jmb.setColourBySequence(true);\r
- setSize(400, 400); // probably should be a configurable/dynamic default here\r
- initMenus();\r
- worker = null;\r
- {\r
- addingStructures = false;\r
- worker = new Thread(this);\r
- worker.start();\r
- }\r
- this.addInternalFrameListener(new InternalFrameAdapter()\r
- {\r
- public void internalFrameClosing(InternalFrameEvent internalFrameEvent)\r
- {\r
- closeViewer();\r
- }\r
- });\r
-\r
- }\r
-\r
- /**\r
- * create a new Jmol containing several structures superimposed using the\r
- * given alignPanel.\r
- * \r
- * @param ap\r
- * @param pe\r
- * @param seqs\r
- */\r
- public AppJmol(AlignmentPanel ap, PDBEntry[] pe, SequenceI[][] seqs)\r
- {\r
- openNewJmol(ap, pe, seqs);\r
- }\r
-\r
- /**\r
- * list of sequenceSet ids associated with the view\r
- */\r
- ArrayList<String> _aps = new ArrayList();\r
-\r
- public AlignmentPanel[] getAllAlignmentPanels()\r
- {\r
- AlignmentPanel[] t, list = new AlignmentPanel[0];\r
- for (String setid : _aps)\r
- {\r
- AlignmentPanel[] panels = PaintRefresher.getAssociatedPanels(setid);\r
- if (panels != null)\r
- {\r
- t = new AlignmentPanel[list.length + panels.length];\r
- System.arraycopy(list, 0, t, 0, list.length);\r
- System.arraycopy(panels, 0, t, list.length, panels.length);\r
- list = t;\r
- }\r
- }\r
-\r
- return list;\r
- }\r
-\r
- /**\r
- * list of alignment panels to use for superposition\r
- */\r
- Vector<AlignmentPanel> _alignwith = new Vector<AlignmentPanel>();\r
-\r
- /**\r
- * list of alignment panels that are used for colouring structures by aligned\r
- * sequences\r
- */\r
- Vector<AlignmentPanel> _colourwith = new Vector<AlignmentPanel>();\r
-\r
- /**\r
- * set the primary alignmentPanel reference and add another alignPanel to the\r
- * list of ones to use for colouring and aligning\r
- * \r
- * @param nap\r
- */\r
- public void addAlignmentPanel(AlignmentPanel nap)\r
- {\r
- if (ap == null)\r
- {\r
- ap = nap;\r
- }\r
- if (!_aps.contains(nap.av.getSequenceSetId()))\r
- {\r
- _aps.add(nap.av.getSequenceSetId());\r
- }\r
- }\r
-\r
- /**\r
- * remove any references held to the given alignment panel\r
- * \r
- * @param nap\r
- */\r
- public void removeAlignmentPanel(AlignmentPanel nap)\r
- {\r
- try\r
- {\r
- _alignwith.remove(nap);\r
- _colourwith.remove(nap);\r
- if (ap == nap)\r
- {\r
- ap = null;\r
- for (AlignmentPanel aps : getAllAlignmentPanels())\r
- {\r
- if (aps != nap)\r
- {\r
- ap = aps;\r
- break;\r
- }\r
- }\r
- }\r
- } catch (Exception ex)\r
- {\r
- }\r
- if (ap != null)\r
- {\r
- buildJmolActionMenu();\r
- }\r
- }\r
-\r
- public void useAlignmentPanelForSuperposition(AlignmentPanel nap)\r
- {\r
- addAlignmentPanel(nap);\r
- if (!_alignwith.contains(nap))\r
- {\r
- _alignwith.add(nap);\r
- }\r
- }\r
-\r
- public void excludeAlignmentPanelForSuperposition(AlignmentPanel nap)\r
- {\r
- if (_alignwith.contains(nap))\r
- {\r
- _alignwith.remove(nap);\r
- }\r
- }\r
-\r
- public void useAlignmentPanelForColourbyseq(AlignmentPanel nap,\r
- boolean enableColourBySeq)\r
- {\r
- useAlignmentPanelForColourbyseq(nap);\r
- jmb.setColourBySequence(enableColourBySeq);\r
- seqColour.setSelected(enableColourBySeq);\r
- jmolColour.setSelected(!enableColourBySeq);\r
- }\r
-\r
- public void useAlignmentPanelForColourbyseq(AlignmentPanel nap)\r
- {\r
- addAlignmentPanel(nap);\r
- if (!_colourwith.contains(nap))\r
- {\r
- _colourwith.add(nap);\r
- }\r
- }\r
-\r
- public void excludeAlignmentPanelForColourbyseq(AlignmentPanel nap)\r
- {\r
- if (_colourwith.contains(nap))\r
- {\r
- _colourwith.remove(nap);\r
- }\r
- }\r
-\r
- /**\r
- * pdb retrieval thread.\r
- */\r
- private Thread worker = null;\r
-\r
- /**\r
- * add a new structure (with associated sequences and chains) to this viewer,\r
- * retrieving it if necessary first.\r
- * \r
- * @param pdbentry\r
- * @param seq\r
- * @param chains\r
- * @param alignFrame\r
- * @param align\r
- * if true, new structure(s) will be align using associated alignment\r
- */\r
- private void addStructure(final PDBEntry pdbentry, final SequenceI[] seq,\r
- final String[] chains, final boolean b,\r
- final IProgressIndicator alignFrame)\r
- {\r
- if (pdbentry.getFile() == null)\r
- {\r
- if (worker != null && worker.isAlive())\r
- {\r
- // a retrieval is in progress, wait around and add ourselves to the\r
- // queue.\r
- new Thread(new Runnable()\r
- {\r
- public void run()\r
- {\r
- while (worker != null && worker.isAlive() && _started)\r
- {\r
- try\r
- {\r
- Thread.sleep(100 + ((int) Math.random() * 100));\r
-\r
- } catch (Exception e)\r
- {\r
- }\r
-\r
- }\r
- // and call ourselves again.\r
- addStructure(pdbentry, seq, chains, b, alignFrame);\r
- }\r
- }).start();\r
- return;\r
- }\r
- }\r
- // otherwise, start adding the structure.\r
- jmb.addSequenceAndChain(new PDBEntry[]\r
- { pdbentry }, new SequenceI[][]\r
- { seq }, new String[][]\r
- { chains });\r
- addingStructures = true;\r
- _started = false;\r
- alignAddedStructures = b;\r
- progressBar = alignFrame; // visual indication happens on caller frame.\r
- (worker = new Thread(this)).start();\r
- return;\r
- }\r
-\r
- private Vector getJmolsFor(AlignmentPanel ap2)\r
- {\r
- Vector otherJmols = new Vector();\r
- // Now this AppJmol is mapped to new sequences. We must add them to\r
- // the exisiting array\r
- JInternalFrame[] frames = Desktop.instance.getAllFrames();\r
-\r
- for (int i = 0; i < frames.length; i++)\r
- {\r
- if (frames[i] instanceof AppJmol)\r
- {\r
- AppJmol topJmol = ((AppJmol) frames[i]);\r
- if (topJmol.isLinkedWith(ap2))\r
- {\r
- otherJmols.addElement(topJmol);\r
- }\r
- }\r
- }\r
- return otherJmols;\r
- }\r
-\r
- void initJmol(String command)\r
- {\r
- jmb.setFinishedInit(false);\r
- renderPanel = new RenderPanel();\r
- // TODO: consider waiting until the structure/view is fully loaded before\r
- // displaying\r
- this.getContentPane().add(renderPanel, java.awt.BorderLayout.CENTER);\r
- jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle(),\r
- getBounds().width, getBounds().height);\r
- if (scriptWindow == null)\r
- {\r
- BorderLayout bl = new BorderLayout();\r
- bl.setHgap(0);\r
- bl.setVgap(0);\r
- scriptWindow = new JPanel(bl);\r
- scriptWindow.setVisible(false);\r
- }\r
- ;\r
- jmb.allocateViewer(renderPanel, true, "", null, null, "", scriptWindow,\r
- null);\r
- jmb.newJmolPopup(true, "Jmol", true);\r
- if (command == null)\r
- {\r
- command = "";\r
- }\r
- jmb.evalStateCommand(command);\r
- jmb.setFinishedInit(true);\r
- }\r
-\r
- void setChainMenuItems(Vector chains)\r
- {\r
- chainMenu.removeAll();\r
- if (chains == null)\r
- {\r
- return;\r
- }\r
+ }
+ });
+ handler.itemStateChanged(null);
+ jmolActionMenu.add(alpanels);
+ jmolActionMenu.addMenuListener(new MenuListener()
+ {
+
+ @Override
+ public void menuSelected(MenuEvent e)
+ {
+ handler.itemStateChanged(null);
+ }
+
+ @Override
+ public void menuDeselected(MenuEvent e)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void menuCanceled(MenuEvent e)
+ {
+ // TODO Auto-generated method stub
+
+ }
+ });
+ }
+
+ IProgressIndicator progressBar = null;
+
+ /**
+ * add a single PDB structure to a new or existing Jmol view
+ *
+ * @param pdbentry
+ * @param seq
+ * @param chains
+ * @param ap
+ */
+ public AppJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains,
+ final AlignmentPanel ap)
+ {
+ progressBar = ap.alignFrame;
+ // ////////////////////////////////
+ // Is the pdb file already loaded?
+ String alreadyMapped = ap.getStructureSelectionManager()
+ .alreadyMappedToFile(pdbentry.getId());
+
+ if (alreadyMapped != null)
+ {
+ int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
+ MessageManager.formatMessage("label.pdb_entry_is_already_displayed", new String[]{pdbentry.getId()}),
+ MessageManager.formatMessage("label.map_sequences_to_visible_window", new String[]{pdbentry.getId()}),
+ JOptionPane.YES_NO_OPTION);
+
+ if (option == JOptionPane.YES_OPTION)
+ {
+ // TODO : Fix multiple seq to one chain issue here.
+ ap.getStructureSelectionManager().setMapping(seq, chains,
+ alreadyMapped, AppletFormatAdapter.FILE);
+ if (ap.seqPanel.seqCanvas.fr != null)
+ {
+ ap.seqPanel.seqCanvas.fr.featuresAdded();
+ ap.paintAlignment(true);
+ }
+
+ // Now this AppJmol is mapped to new sequences. We must add them to
+ // the exisiting array
+ JInternalFrame[] frames = Desktop.instance.getAllFrames();
+
+ for (int i = 0; i < frames.length; i++)
+ {
+ if (frames[i] instanceof AppJmol)
+ {
+ final AppJmol topJmol = ((AppJmol) frames[i]);
+ // JBPNOTE: this looks like a binding routine, rather than a gui
+ // routine
+ for (int pe = 0; pe < topJmol.jmb.pdbentry.length; pe++)
+ {
+ if (topJmol.jmb.pdbentry[pe].getFile().equals(alreadyMapped))
+ {
+ topJmol.jmb.addSequence(pe, seq);
+ topJmol.addAlignmentPanel(ap);
+ // add it to the set used for colouring
+ topJmol.useAlignmentPanelForColourbyseq(ap);
+ topJmol.buildJmolActionMenu();
+ ap.getStructureSelectionManager()
+ .sequenceColoursChanged(ap);
+ break;
+ }
+ }
+ }
+ }
+
+ return;
+ }
+ }
+ // /////////////////////////////////
+ // Check if there are other Jmol views involving this alignment
+ // and prompt user about adding this molecule to one of them
+ Vector existingViews = getJmolsFor(ap);
+ if (existingViews.size() > 0)
+ {
+ Enumeration jm = existingViews.elements();
+ while (jm.hasMoreElements())
+ {
+ AppJmol topJmol = (AppJmol) jm.nextElement();
+ // TODO: highlight topJmol in view somehow
+ int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
+ MessageManager.formatMessage("label.add_pdbentry_to_view", new String[]{pdbentry.getId(),topJmol.getTitle()}),
+ MessageManager.getString("label.align_to_existing_structure_view"),
+ JOptionPane.YES_NO_OPTION);
+ if (option == JOptionPane.YES_OPTION)
+ {
+ topJmol.useAlignmentPanelForSuperposition(ap);
+ topJmol.addStructure(pdbentry, seq, chains, true, ap.alignFrame);
+ return;
+ }
+ }
+ }
+ // /////////////////////////////////
+ openNewJmol(ap, new PDBEntry[]
+ { pdbentry }, new SequenceI[][]
+ { seq });
+ }
+
+ private void openNewJmol(AlignmentPanel ap, PDBEntry[] pdbentrys,
+ SequenceI[][] seqs)
+ {
+ progressBar = ap.alignFrame;
+ jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(),
+ pdbentrys, seqs, null, null);
+ addAlignmentPanel(ap);
+ useAlignmentPanelForColourbyseq(ap);
+ if (pdbentrys.length > 1)
+ {
+ alignAddedStructures = true;
+ useAlignmentPanelForSuperposition(ap);
+ }
+ jmb.setColourBySequence(true);
+ setSize(400, 400); // probably should be a configurable/dynamic default here
+ initMenus();
+ worker = null;
+ {
+ addingStructures = false;
+ worker = new Thread(this);
+ worker.start();
+ }
+ this.addInternalFrameListener(new InternalFrameAdapter()
+ {
+ public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
+ {
+ closeViewer();
+ }
+ });
+
+ }
+
+ /**
+ * create a new Jmol containing several structures superimposed using the
+ * given alignPanel.
+ *
+ * @param ap
+ * @param pe
+ * @param seqs
+ */
+ public AppJmol(AlignmentPanel ap, PDBEntry[] pe, SequenceI[][] seqs)
+ {
+ openNewJmol(ap, pe, seqs);
+ }
+
+ /**
+ * list of sequenceSet ids associated with the view
+ */
+ ArrayList<String> _aps = new ArrayList();
+
+ public AlignmentPanel[] getAllAlignmentPanels()
+ {
+ AlignmentPanel[] t, list = new AlignmentPanel[0];
+ for (String setid : _aps)
+ {
+ AlignmentPanel[] panels = PaintRefresher.getAssociatedPanels(setid);
+ if (panels != null)
+ {
+ t = new AlignmentPanel[list.length + panels.length];
+ System.arraycopy(list, 0, t, 0, list.length);
+ System.arraycopy(panels, 0, t, list.length, panels.length);
+ list = t;
+ }
+ }
+
+ return list;
+ }
+
+ /**
+ * list of alignment panels to use for superposition
+ */
+ Vector<AlignmentPanel> _alignwith = new Vector<AlignmentPanel>();
+
+ /**
+ * list of alignment panels that are used for colouring structures by aligned
+ * sequences
+ */
+ Vector<AlignmentPanel> _colourwith = new Vector<AlignmentPanel>();
+
+ /**
+ * set the primary alignmentPanel reference and add another alignPanel to the
+ * list of ones to use for colouring and aligning
+ *
+ * @param nap
+ */
+ public void addAlignmentPanel(AlignmentPanel nap)
+ {
+ if (ap == null)
+ {
+ ap = nap;
+ }
+ if (!_aps.contains(nap.av.getSequenceSetId()))
+ {
+ _aps.add(nap.av.getSequenceSetId());
+ }
+ }
+
+ /**
+ * remove any references held to the given alignment panel
+ *
+ * @param nap
+ */
+ public void removeAlignmentPanel(AlignmentPanel nap)
+ {
+ try
+ {
+ _alignwith.remove(nap);
+ _colourwith.remove(nap);
+ if (ap == nap)
+ {
+ ap = null;
+ for (AlignmentPanel aps : getAllAlignmentPanels())
+ {
+ if (aps != nap)
+ {
+ ap = aps;
+ break;
+ }
+ }
+ }
+ } catch (Exception ex)
+ {
+ }
+ if (ap != null)
+ {
+ buildJmolActionMenu();
+ }
+ }
+
+ public void useAlignmentPanelForSuperposition(AlignmentPanel nap)
+ {
+ addAlignmentPanel(nap);
+ if (!_alignwith.contains(nap))
+ {
+ _alignwith.add(nap);
+ }
+ }
+
+ public void excludeAlignmentPanelForSuperposition(AlignmentPanel nap)
+ {
+ if (_alignwith.contains(nap))
+ {
+ _alignwith.remove(nap);
+ }
+ }
+
+ public void useAlignmentPanelForColourbyseq(AlignmentPanel nap,
+ boolean enableColourBySeq)
+ {
+ useAlignmentPanelForColourbyseq(nap);
+ jmb.setColourBySequence(enableColourBySeq);
+ seqColour.setSelected(enableColourBySeq);
+ jmolColour.setSelected(!enableColourBySeq);
+ }
+
+ public void useAlignmentPanelForColourbyseq(AlignmentPanel nap)
+ {
+ addAlignmentPanel(nap);
+ if (!_colourwith.contains(nap))
+ {
+ _colourwith.add(nap);
+ }
+ }
+
+ public void excludeAlignmentPanelForColourbyseq(AlignmentPanel nap)
+ {
+ if (_colourwith.contains(nap))
+ {
+ _colourwith.remove(nap);
+ }
+ }
+
+ /**
+ * pdb retrieval thread.
+ */
+ private Thread worker = null;
+
+ /**
+ * add a new structure (with associated sequences and chains) to this viewer,
+ * retrieving it if necessary first.
+ *
+ * @param pdbentry
+ * @param seq
+ * @param chains
+ * @param alignFrame
+ * @param align
+ * if true, new structure(s) will be align using associated alignment
+ */
+ private void addStructure(final PDBEntry pdbentry, final SequenceI[] seq,
+ final String[] chains, final boolean b,
+ final IProgressIndicator alignFrame)
+ {
+ if (pdbentry.getFile() == null)
+ {
+ if (worker != null && worker.isAlive())
+ {
+ // a retrieval is in progress, wait around and add ourselves to the
+ // queue.
+ new Thread(new Runnable()
+ {
+ public void run()
+ {
+ while (worker != null && worker.isAlive() && _started)
+ {
+ try
+ {
+ Thread.sleep(100 + ((int) Math.random() * 100));
+
+ } catch (Exception e)
+ {
+ }
+
+ }
+ // and call ourselves again.
+ addStructure(pdbentry, seq, chains, b, alignFrame);
+ }
+ }).start();
+ return;
+ }
+ }
+ // otherwise, start adding the structure.
+ jmb.addSequenceAndChain(new PDBEntry[]
+ { pdbentry }, new SequenceI[][]
+ { seq }, new String[][]
+ { chains });
+ addingStructures = true;
+ _started = false;
+ alignAddedStructures = b;
+ progressBar = alignFrame; // visual indication happens on caller frame.
+ (worker = new Thread(this)).start();
+ return;
+ }
+
+ private Vector getJmolsFor(AlignmentPanel ap2)
+ {
+ Vector otherJmols = new Vector();
+ // Now this AppJmol is mapped to new sequences. We must add them to
+ // the exisiting array
+ JInternalFrame[] frames = Desktop.instance.getAllFrames();
+
+ for (int i = 0; i < frames.length; i++)
+ {
+ if (frames[i] instanceof AppJmol)
+ {
+ AppJmol topJmol = ((AppJmol) frames[i]);
+ if (topJmol.isLinkedWith(ap2))
+ {
+ otherJmols.addElement(topJmol);
+ }
+ }
+ }
+ return otherJmols;
+ }
+
+ void initJmol(String command)
+ {
+ jmb.setFinishedInit(false);
+ renderPanel = new RenderPanel();
+ // TODO: consider waiting until the structure/view is fully loaded before
+ // displaying
+ this.getContentPane().add(renderPanel, java.awt.BorderLayout.CENTER);
+ jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle(),
+ getBounds().width, getBounds().height);
+ if (scriptWindow == null)
+ {
+ BorderLayout bl = new BorderLayout();
+ bl.setHgap(0);
+ bl.setVgap(0);
+ scriptWindow = new JPanel(bl);
+ scriptWindow.setVisible(false);
+ }
+ ;
+ jmb.allocateViewer(renderPanel, true, "", null, null, "", scriptWindow,
+ null);
+ jmb.newJmolPopup(true, "Jmol", true);
+ if (command == null)
+ {
+ command = "";
+ }
+ jmb.evalStateCommand(command);
+ jmb.setFinishedInit(true);
+ }
+
+ void setChainMenuItems(Vector chains)
+ {
+ chainMenu.removeAll();
+ if (chains == null)
+ {
+ return;
+ }