2 * Jalview - A Sequence Alignment Editor and Viewer
3 * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
20 package jalview.appletgui;
24 import java.awt.event.*;
26 import jalview.datamodel.*;
27 import jalview.structure.*;
30 import org.jmol.api.*;
31 import org.jmol.adapter.smarter.SmarterJmolAdapter;
33 import org.jmol.popup.*;
34 import jalview.schemes.*;
37 public class AppletJmol extends Frame
38 implements StructureListener, JmolStatusListener,
39 KeyListener, ActionListener, ItemListener
42 Menu fileMenu = new Menu("File");
43 Menu viewMenu = new Menu("View");
44 Menu coloursMenu = new Menu("Colours");
45 Menu chainMenu = new Menu("Show Chain");
46 Menu helpMenu = new Menu("Help");
47 MenuItem mappingMenuItem = new MenuItem("View Mapping");
49 CheckboxMenuItem seqColour = new CheckboxMenuItem("By Sequence", true);
50 MenuItem chain = new MenuItem("By Chain");
51 MenuItem charge = new MenuItem("Charge & Cysteine");
52 MenuItem zappo = new MenuItem("Zappo");
53 MenuItem taylor = new MenuItem("Taylor");
54 MenuItem hydro = new MenuItem("Hydrophobicity");
55 MenuItem helix = new MenuItem("Helix Propensity");
56 MenuItem strand = new MenuItem("Strand Propensity");
57 MenuItem turn = new MenuItem("Turn Propensity");
58 MenuItem buried = new MenuItem("Buried Index");
59 MenuItem user = new MenuItem("User Defined Colours");
61 MenuItem jmolHelp = new MenuItem("Jmol Help");
71 StructureSelectionManager ssm;
72 RenderPanel renderPanel;
74 String fileLoadingError;
77 boolean colourBySequence = true;
78 Vector atomsPicked = new Vector();
80 public AppletJmol(PDBEntry pdbentry,
89 this.pdbentry = pdbentry;
91 String alreadyMapped = StructureSelectionManager
92 .getStructureSelectionManager()
93 .alreadyMappedToFile(pdbentry.getId());
95 if (alreadyMapped != null)
97 StructureSelectionManager.getStructureSelectionManager()
98 .setMapping(seq, chains, pdbentry.getFile(), protocol);
99 //PROMPT USER HERE TO ADD TO NEW OR EXISTING VIEW?
100 //FOR NOW, LETS JUST OPEN A NEW WINDOW
103 renderPanel = new RenderPanel();
105 this.add(renderPanel, BorderLayout.CENTER);
106 viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter());
108 viewer.setAppletContext("jalview",
109 ap.av.applet.getDocumentBase(),
110 ap.av.applet.getCodeBase(),
113 viewer.setJmolStatusListener(this);
115 jmolpopup = JmolPopup.newJmolPopup(viewer);
117 this.addWindowListener(new WindowAdapter()
119 public void windowClosing(WindowEvent evt)
125 MenuBar menuBar = new MenuBar();
126 menuBar.add(fileMenu);
127 fileMenu.add(mappingMenuItem);
128 menuBar.add(viewMenu);
129 mappingMenuItem.addActionListener(this);
130 viewMenu.add(chainMenu);
131 menuBar.add(coloursMenu);
132 menuBar.add(helpMenu);
134 charge.addActionListener(this);
135 hydro.addActionListener(this);
136 chain.addActionListener(this);
137 seqColour.addItemListener(this);
138 zappo.addActionListener(this);
139 taylor.addActionListener(this);
140 helix.addActionListener(this);
141 strand.addActionListener(this);
142 turn.addActionListener(this);
143 buried.addActionListener(this);
144 user.addActionListener(this);
146 jmolHelp.addActionListener(this);
148 coloursMenu.add(seqColour);
149 coloursMenu.add(chain);
150 coloursMenu.add(charge);
151 coloursMenu.add(zappo);
152 coloursMenu.add(taylor);
153 coloursMenu.add(hydro);
154 coloursMenu.add(helix);
155 coloursMenu.add(strand);
156 coloursMenu.add(turn);
157 coloursMenu.add(buried);
158 coloursMenu.add(user);
160 helpMenu.add(jmolHelp);
162 this.setMenuBar(menuBar);
164 if(pdbentry.getFile()!=null)
166 if (protocol.equals(AppletFormatAdapter.PASTE))
167 loadInline(pdbentry.getFile());
169 viewer.openFile(pdbentry.getFile());
172 this.setBounds(400, 400, 400, 400);
174 this.setVisible(true);
177 public void loadInline(String string)
180 viewer.openStringInline(string);
184 void setChainMenuItems(Vector chains)
186 chainMenu.removeAll();
188 MenuItem menuItem = new MenuItem("All");
189 menuItem.addActionListener(this);
191 chainMenu.add(menuItem);
193 CheckboxMenuItem menuItemCB;
194 for (int c = 0; c < chains.size(); c++)
196 menuItemCB = new CheckboxMenuItem(chains.elementAt(c).toString(), true);
197 menuItemCB.addItemListener(this);
198 chainMenu.add(menuItemCB);
202 boolean allChainsSelected = false;
205 StringBuffer cmd = new StringBuffer();
206 for (int i = 0; i < chainMenu.getItemCount(); i++)
208 if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
210 CheckboxMenuItem item = (CheckboxMenuItem) chainMenu.getItem(i);
212 cmd.append(":" + item.getLabel() + " or ");
216 if (cmd.length() > 0)
217 cmd.setLength(cmd.length() - 4);
219 viewer.evalString("select *;restrict "
220 + cmd + ";cartoon;center " + cmd);
226 viewer.setModeMouse(org.jmol.viewer.JmolConstants.MOUSE_NONE);
227 viewer.evalStringQuiet("zap");
228 viewer.setJmolStatusListener(null);
231 //We'll need to find out what other
232 // listeners need to be shut down in Jmol
233 StructureSelectionManager
234 .getStructureSelectionManager()
235 .removeStructureViewerListener(this, pdbentry.getId());
237 this.setVisible(false);
240 public void actionPerformed(ActionEvent evt)
242 if(evt.getSource()==mappingMenuItem)
244 jalview.appletgui.CutAndPasteTransfer cap
245 = new jalview.appletgui.CutAndPasteTransfer(false, null);
246 Frame frame = new Frame();
249 jalview.bin.JalviewLite.addFrame(frame, "PDB - Sequence Mapping", 550,
252 StructureSelectionManager.getStructureSelectionManager().printMapping(
256 else if (evt.getSource() == charge)
258 colourBySequence = false;
259 seqColour.setState(false);
260 viewer.evalStringQuiet("select *;color white;select ASP,GLU;color red;"
261 +"select LYS,ARG;color blue;select CYS;color yellow");
264 else if (evt.getSource() == chain)
266 colourBySequence = false;
267 seqColour.setState(false);
268 viewer.evalStringQuiet("select *;color chain");
270 else if (evt.getSource() == zappo)
272 setJalviewColourScheme(new ZappoColourScheme());
274 else if (evt.getSource() == taylor)
276 setJalviewColourScheme(new TaylorColourScheme());
278 else if (evt.getSource() == hydro)
280 setJalviewColourScheme(new HydrophobicColourScheme());
282 else if (evt.getSource() == helix)
284 setJalviewColourScheme(new HelixColourScheme());
286 else if (evt.getSource() == strand)
288 setJalviewColourScheme(new StrandColourScheme());
290 else if (evt.getSource() == turn)
292 setJalviewColourScheme(new TurnColourScheme());
294 else if (evt.getSource() == buried)
296 setJalviewColourScheme(new BuriedColourScheme());
298 else if (evt.getSource() == user)
300 new UserDefinedColours(this);
302 else if(evt.getSource() == jmolHelp)
305 ap.av.applet.getAppletContext().showDocument(
306 new java.net.URL("http://jmol.sourceforge.net/docs/JmolUserGuide/"),
308 }catch(java.net.MalformedURLException ex){}
312 allChainsSelected = true;
313 for (int i = 0; i < chainMenu.getItemCount(); i++)
315 if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
316 ( (CheckboxMenuItem) chainMenu.getItem(i)).setState(true);
319 allChainsSelected = false;
323 public void setJalviewColourScheme(ColourSchemeI cs)
325 colourBySequence = false;
326 seqColour.setState(false);
335 Enumeration en = ResidueProperties.aa3Hash.keys();
336 StringBuffer command = new StringBuffer("select *;color white;");
337 while(en.hasMoreElements())
339 res = en.nextElement().toString();
340 index = ((Integer) ResidueProperties.aa3Hash.get(res)).intValue();
344 col = cs.findColour(ResidueProperties.aa[index].charAt(0));
346 command.append("select "+res+";color["
348 + col.getGreen() + ","
349 + col.getBlue() + "];");
352 viewer.evalStringQuiet(command.toString());
355 public void itemStateChanged(ItemEvent evt)
357 if (evt.getSource() == seqColour)
359 colourBySequence = seqColour.getState();
360 colourBySequence(ap);
362 else if (!allChainsSelected)
366 public void keyPressed(KeyEvent evt)
368 if (evt.getKeyCode() == KeyEvent.VK_ENTER
369 && scriptWindow.isVisible())
371 viewer.evalString(inputLine.getText());
372 history.append("\n$ "+inputLine.getText());
373 inputLine.setText("");
378 public void keyTyped(KeyEvent evt)
381 public void keyReleased(KeyEvent evt){}
383 //////////////////////////////////
385 public String getPdbFile()
393 public void mouseOverStructure(int atomIndex, String strInfo)
397 int chainSeparator = strInfo.indexOf(":");
399 if(chainSeparator==-1)
400 chainSeparator = strInfo.indexOf(".");
402 pdbResNum = Integer.parseInt(
403 strInfo.substring(strInfo.indexOf("]")+ 1, chainSeparator));
407 if (strInfo.indexOf(":") > -1)
408 chainId = strInfo.substring
409 (strInfo.indexOf(":")+1, strInfo.indexOf("."));
415 if (lastMessage == null || !lastMessage.equals(strInfo))
416 ssm.mouseOverStructure(pdbResNum, chainId, pdbentry.getFile());
418 lastMessage = strInfo;
421 StringBuffer resetLastRes = new StringBuffer();
422 StringBuffer eval = new StringBuffer();
424 public void highlightAtom(int atomIndex, int pdbResNum, String chain, String pdbfile)
426 if (!pdbfile.equals(pdbentry.getFile()))
429 if (resetLastRes.length() > 0)
431 viewer.evalStringQuiet(resetLastRes.toString());
435 eval.append("select " + pdbResNum);
437 resetLastRes.setLength(0);
438 resetLastRes.append("select " + pdbResNum);
440 if (!chain.equals(" "))
442 eval.append(":" + chain);
443 resetLastRes.append(":" + chain);
446 eval.append(";color gold;wireframe 100");
448 Color col = new Color(viewer.getAtomArgb(atomIndex));
450 resetLastRes.append(";color["
452 + col.getGreen() + ","
453 + col.getBlue() + "];wireframe 0");
455 viewer.evalStringQuiet(eval.toString());
459 public void updateColours(Object source)
461 colourBySequence( (AlignmentPanel) source);
464 //End StructureListener
465 ////////////////////////////
467 public Color getColour(int atomIndex, int pdbResNum, String chain, String pdbfile)
469 if (!pdbfile.equals(pdbentry.getFile()))
472 return new Color(viewer.getAtomArgb(atomIndex));
476 public void colourBySequence(AlignmentPanel ap)
478 if(!colourBySequence)
482 StructureMapping[] mapping = ssm.getMapping(pdbentry.getFile());
484 if (mapping.length < 1)
487 SequenceRenderer sr = ap.seqPanel.seqCanvas.getSequenceRenderer();
489 boolean showFeatures = false;
490 if (ap.av.showSequenceFeatures)
495 fr = new jalview.appletgui.FeatureRenderer(ap.av);
498 fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
501 StringBuffer command = new StringBuffer();
504 for (int s = 0; s < sequence.length; s++)
506 for (int m = 0; m < mapping.length; m++)
508 if (mapping[m].getSequence() == sequence[s]
509 && ap.av.alignment.findIndex(sequence[s])>-1)
511 for (int r = 0; r < sequence[s].getLength(); r++)
513 int pos = mapping[m].getPDBResNum(
514 sequence[s].findPosition(r));
516 if (pos < 1 || pos==lastPos)
521 Color col = sr.getResidueBoxColour(sequence[s], r);
524 col = fr.findFeatureColour(col, sequence[s], r);
526 if (command.toString().endsWith(":" + mapping[m].getChain()+
529 + col.getGreen() + ","
530 + col.getBlue() + "]"))
532 command = condenseCommand(command.toString(), pos);
536 command.append(";select " + pos);
538 if (!mapping[m].getChain().equals(" "))
540 command.append(":" + mapping[m].getChain());
543 command.append(";color["
545 + col.getGreen() + ","
546 + col.getBlue() + "]");
554 viewer.evalStringQuiet(command.toString());
557 StringBuffer condenseCommand(String command, int pos)
560 StringBuffer sb = new StringBuffer(command.substring(0, command.lastIndexOf("select")+7));
562 command = command.substring(sb.length());
566 if (command.indexOf("-") > -1)
568 start = command.substring(0,command.indexOf("-"));
572 start = command.substring(0, command.indexOf(":"));
575 sb.append(start+"-"+pos+command.substring(command.indexOf(":")));
580 /////////////////////////////////
583 public String eval(String strEval)
585 // System.out.println(strEval);
586 //"# 'eval' is implemented only for the applet.";
590 public void createImage(String file, String type, int quality)
593 public void setCallbackFunction(String callbackType,
594 String callbackFunction)
597 public void notifyFileLoaded(String fullPathName, String fileName,
598 String modelName, Object clientFile,
603 fileLoadingError = errorMsg;
608 fileLoadingError = null;
610 if (fileName != null)
613 jmolpopup.updateComputedMenus();
614 viewer.evalStringQuiet(
615 "select backbone;restrict;cartoon;wireframe off;spacefill off");
617 ssm = StructureSelectionManager.getStructureSelectionManager();
622 pdb = ssm.setMapping(sequence,chains,
624 AppletFormatAdapter.PASTE);
625 pdbentry.setFile("INLINE"+pdb.id);
629 pdb = ssm.setMapping(sequence,chains,
631 AppletFormatAdapter.URL);
634 pdbentry.setId(pdb.id);
636 ssm.addStructureViewerListener(this);
638 Vector chains = new Vector();
639 for (int i = 0; i < pdb.chains.size(); i++)
641 chains.addElement( ( (MCview.PDBChain) pdb.chains.elementAt(i)).id);
643 setChainMenuItems(chains);
645 colourBySequence(ap);
647 StringBuffer title = new StringBuffer(sequence[0].getName() + ":" +
650 if (pdbentry.getProperty() != null)
652 if (pdbentry.getProperty().get("method") != null)
654 title.append(" Method: ");
655 title.append(pdbentry.getProperty().get("method"));
657 if (pdbentry.getProperty().get("chains") != null)
659 title.append(" Chain:");
660 title.append(pdbentry.getProperty().get("chains"));
664 this.setTitle(title.toString());
671 public void notifyFrameChanged(int frameNo)
673 boolean isAnimationRunning = (frameNo <= -2);
676 public void notifyScriptStart(String statusMessage, String additionalInfo)
679 public void sendConsoleEcho(String strEcho)
681 if (scriptWindow == null)
684 history.append("\n"+strEcho);
687 public void sendConsoleMessage(String strStatus)
689 if(history!=null && strStatus!=null
690 && !strStatus.equals("Script completed"))
692 history.append("\n"+strStatus);
696 public void notifyScriptTermination(String strStatus, int msWalltime)
699 public void handlePopupMenu(int x, int y)
701 jmolpopup.show(x, y);
704 public void notifyNewPickingModeMeasurement(int iatom, String strMeasure)
706 notifyAtomPicked(iatom, strMeasure);
709 public void notifyNewDefaultModeMeasurement(int count, String strInfo)
712 public void notifyAtomPicked(int atomIndex, String strInfo)
715 int chainSeparator = strInfo.indexOf(":");
717 if(chainSeparator==-1)
718 chainSeparator = strInfo.indexOf(".");
721 strInfo.substring(strInfo.indexOf("]")+ 1, chainSeparator);
724 if (strInfo.indexOf(":") > -1)
725 picked+=strInfo.substring(strInfo.indexOf(":")+1,
726 strInfo.indexOf("."));
730 if (!atomsPicked.contains(picked))
732 viewer.evalString("select "+picked+";label %n %r:%c");
733 atomsPicked.addElement(picked);
737 viewer.evalString("select "+picked+";label off");
738 atomsPicked.removeElement(picked);
742 public void notifyAtomHovered(int atomIndex, String strInfo)
744 mouseOverStructure(atomIndex, strInfo);
747 public void sendSyncScript(String script, String appletName)
750 public void showUrl(String url)
753 ap.av.applet.getAppletContext().showDocument(new java.net.URL(url),
755 }catch(java.net.MalformedURLException ex)
759 public void showConsole(boolean showConsole)
761 if (scriptWindow == null)
763 scriptWindow = new Panel(new BorderLayout());
764 inputLine = new TextField();
765 history = new TextArea(5, 40);
766 scriptWindow.add(history, BorderLayout.CENTER);
767 scriptWindow.add(inputLine, BorderLayout.SOUTH);
768 add(scriptWindow, BorderLayout.SOUTH);
769 scriptWindow.setVisible(false);
770 history.setEditable(false);
771 inputLine.addKeyListener(this);
774 scriptWindow.setVisible(!scriptWindow.isVisible());
778 public float functionXY(String functionName, int x, int y)
783 ///End JmolStatusListener
784 ///////////////////////////////
790 Dimension currentSize = new Dimension();
791 Rectangle rectClip = new Rectangle();
793 public void update(Graphics g) {
796 public void paint(Graphics g)
798 currentSize = this.getSize();
799 rectClip = g.getClipBounds();
803 g.setColor(Color.black);
804 g.fillRect(0, 0, currentSize.width, currentSize.height);
805 g.setColor(Color.white);
806 g.setFont(new Font("Verdana", Font.BOLD, 14));
807 g.drawString("Retrieving PDB data....", 20, currentSize.height / 2);
811 viewer.renderScreenImage(g, currentSize, rectClip);