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;
34 import org.jmol.popup.*;
35 import jalview.schemes.*;
38 public class AppletJmol extends Frame
39 implements StructureListener, JmolStatusListener,
40 KeyListener, ActionListener, ItemListener
43 Menu fileMenu = new Menu("File");
44 Menu viewMenu = new Menu("View");
45 Menu coloursMenu = new Menu("Colours");
46 Menu chainMenu = new Menu("Show Chain");
47 Menu helpMenu = new Menu("Help");
48 MenuItem mappingMenuItem = new MenuItem("View Mapping");
50 CheckboxMenuItem seqColour = new CheckboxMenuItem("By Sequence", true);
51 MenuItem chain = new MenuItem("By Chain");
52 MenuItem charge = new MenuItem("Charge & Cysteine");
53 MenuItem zappo = new MenuItem("Zappo");
54 MenuItem taylor = new MenuItem("Taylor");
55 MenuItem hydro = new MenuItem("Hydrophobicity");
56 MenuItem helix = new MenuItem("Helix Propensity");
57 MenuItem strand = new MenuItem("Strand Propensity");
58 MenuItem turn = new MenuItem("Turn Propensity");
59 MenuItem buried = new MenuItem("Buried Index");
60 MenuItem user = new MenuItem("User Defined Colours");
62 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,
87 this.pdbentry = pdbentry;
89 String alreadyMapped = StructureSelectionManager
90 .getStructureSelectionManager()
91 .alreadyMappedToFile(pdbentry.getId());
93 if (alreadyMapped != null)
95 StructureSelectionManager.getStructureSelectionManager()
96 .setMapping(seq, pdbentry.getFile(), protocol);
100 renderPanel = new RenderPanel();
102 this.add(renderPanel, BorderLayout.CENTER);
104 viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter());
106 viewer.setAppletContext("jalview",
107 ap.av.applet.getDocumentBase(),
108 ap.av.applet.getCodeBase(),
111 viewer.setJmolStatusListener(this);
113 jmolpopup = JmolPopup.newJmolPopup(viewer);
115 this.addWindowListener(new WindowAdapter()
117 public void windowClosing(WindowEvent evt)
123 MenuBar menuBar = new MenuBar();
124 menuBar.add(fileMenu);
125 fileMenu.add(mappingMenuItem);
126 menuBar.add(viewMenu);
127 mappingMenuItem.addActionListener(this);
128 viewMenu.add(chainMenu);
129 menuBar.add(coloursMenu);
130 menuBar.add(helpMenu);
132 charge.addActionListener(this);
133 hydro.addActionListener(this);
134 chain.addActionListener(this);
135 seqColour.addItemListener(this);
136 zappo.addActionListener(this);
137 taylor.addActionListener(this);
138 helix.addActionListener(this);
139 strand.addActionListener(this);
140 turn.addActionListener(this);
141 buried.addActionListener(this);
142 user.addActionListener(this);
144 jmolHelp.addActionListener(this);
146 coloursMenu.add(seqColour);
147 coloursMenu.add(chain);
148 coloursMenu.add(charge);
149 coloursMenu.add(zappo);
150 coloursMenu.add(taylor);
151 coloursMenu.add(hydro);
152 coloursMenu.add(helix);
153 coloursMenu.add(strand);
154 coloursMenu.add(turn);
155 coloursMenu.add(buried);
156 coloursMenu.add(user);
158 helpMenu.add(jmolHelp);
160 this.setMenuBar(menuBar);
162 if(pdbentry.getFile()!=null)
164 if (protocol.equals(AppletFormatAdapter.PASTE))
165 loadInline(pdbentry.getFile());
167 viewer.openFile(pdbentry.getFile());
170 this.setBounds(400, 400, 400, 400);
172 this.setVisible(true);
175 public void loadInline(String string)
178 viewer.openStringInline(string);
182 void setChainMenuItems(Vector chains)
184 chainMenu.removeAll();
186 MenuItem menuItem = new MenuItem("All");
187 menuItem.addActionListener(this);
189 chainMenu.add(menuItem);
191 CheckboxMenuItem menuItemCB;
192 for (int c = 0; c < chains.size(); c++)
194 menuItemCB = new CheckboxMenuItem(chains.elementAt(c).toString(), true);
195 menuItemCB.addItemListener(this);
196 chainMenu.add(menuItemCB);
200 boolean allChainsSelected = false;
203 StringBuffer cmd = new StringBuffer();
204 for (int i = 0; i < chainMenu.getItemCount(); i++)
206 if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
208 CheckboxMenuItem item = (CheckboxMenuItem) chainMenu.getItem(i);
210 cmd.append(":" + item.getLabel() + " or ");
214 if (cmd.length() > 0)
215 cmd.setLength(cmd.length() - 4);
217 viewer.evalString("select *;restrict "
218 + cmd + ";cartoon;center " + cmd);
224 viewer.setModeMouse(org.jmol.viewer.JmolConstants.MOUSE_NONE);
225 viewer.evalStringQuiet("zap");
226 viewer.setJmolStatusListener(null);
229 //We'll need to find out what other
230 // listeners need to be shut down in Jmol
231 StructureSelectionManager
232 .getStructureSelectionManager()
233 .removeStructureViewerListener(this, pdbentry.getId());
235 this.setVisible(false);
238 public void actionPerformed(ActionEvent evt)
240 if(evt.getSource()==mappingMenuItem)
242 jalview.appletgui.CutAndPasteTransfer cap
243 = new jalview.appletgui.CutAndPasteTransfer(false, null);
244 Frame frame = new Frame();
247 jalview.bin.JalviewLite.addFrame(frame, "PDB - Sequence Mapping", 550,
250 StructureSelectionManager.getStructureSelectionManager().printMapping(
254 else if (evt.getSource() == charge)
256 colourBySequence = false;
257 seqColour.setState(false);
258 viewer.evalStringQuiet("select *;color white;select ASP,GLU;color red;"
259 +"select LYS,ARG;color blue;select CYS;color yellow");
262 else if (evt.getSource() == chain)
264 colourBySequence = false;
265 seqColour.setState(false);
266 viewer.evalStringQuiet("select *;color chain");
268 else if (evt.getSource() == zappo)
270 setJalviewColourScheme(new ZappoColourScheme());
272 else if (evt.getSource() == taylor)
274 setJalviewColourScheme(new TaylorColourScheme());
276 else if (evt.getSource() == hydro)
278 setJalviewColourScheme(new HydrophobicColourScheme());
280 else if (evt.getSource() == helix)
282 setJalviewColourScheme(new HelixColourScheme());
284 else if (evt.getSource() == strand)
286 setJalviewColourScheme(new StrandColourScheme());
288 else if (evt.getSource() == turn)
290 setJalviewColourScheme(new TurnColourScheme());
292 else if (evt.getSource() == buried)
294 setJalviewColourScheme(new BuriedColourScheme());
296 else if (evt.getSource() == user)
298 new UserDefinedColours(this);
300 else if(evt.getSource() == jmolHelp)
303 ap.av.applet.getAppletContext().showDocument(
304 new java.net.URL("http://jmol.sourceforge.net/docs/JmolUserGuide/"),
306 }catch(java.net.MalformedURLException ex){}
310 allChainsSelected = true;
311 for (int i = 0; i < chainMenu.getItemCount(); i++)
313 if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
314 ( (CheckboxMenuItem) chainMenu.getItem(i)).setState(true);
317 allChainsSelected = false;
321 public void setJalviewColourScheme(ColourSchemeI cs)
323 colourBySequence = false;
324 seqColour.setState(false);
333 Enumeration en = ResidueProperties.aa3Hash.keys();
334 StringBuffer command = new StringBuffer("select *;color white;");
335 while(en.hasMoreElements())
337 res = en.nextElement().toString();
338 index = ((Integer) ResidueProperties.aa3Hash.get(res)).intValue();
342 col = cs.findColour(ResidueProperties.aa[index].charAt(0));
344 command.append("select "+res+";color["
346 + col.getGreen() + ","
347 + col.getBlue() + "];");
350 viewer.evalStringQuiet(command.toString());
353 public void itemStateChanged(ItemEvent evt)
355 if (evt.getSource() == seqColour)
357 colourBySequence = seqColour.getState();
358 colourBySequence(ap);
360 else if (!allChainsSelected)
364 public void keyPressed(KeyEvent evt)
366 if (evt.getKeyCode() == KeyEvent.VK_ENTER
367 && scriptWindow.isVisible())
369 viewer.evalString(inputLine.getText());
370 history.append("\n$ "+inputLine.getText());
371 inputLine.setText("");
376 public void keyTyped(KeyEvent evt)
379 public void keyReleased(KeyEvent evt){}
381 //////////////////////////////////
383 public String getPdbFile()
391 public void mouseOverStructure(int atomIndex, String strInfo)
395 int chainSeparator = strInfo.indexOf(":");
397 if(chainSeparator==-1)
398 chainSeparator = strInfo.indexOf(".");
400 pdbResNum = Integer.parseInt(
401 strInfo.substring(strInfo.indexOf("]")+ 1, chainSeparator));
405 if (strInfo.indexOf(":") > -1)
406 chainId = strInfo.substring
407 (strInfo.indexOf(":")+1, strInfo.indexOf("."));
413 if (lastMessage == null || !lastMessage.equals(strInfo))
414 ssm.mouseOverStructure(pdbResNum, chainId, pdbentry.getFile());
416 lastMessage = strInfo;
419 StringBuffer resetLastRes = new StringBuffer();
420 StringBuffer eval = new StringBuffer();
422 public void highlightAtom(int atomIndex, int pdbResNum, String chain, String pdbfile)
424 if (!pdbfile.equals(pdbentry.getFile()))
427 if (resetLastRes.length() > 0)
429 viewer.evalStringQuiet(resetLastRes.toString());
433 eval.append("select " + pdbResNum);
435 resetLastRes.setLength(0);
436 resetLastRes.append("select " + pdbResNum);
438 if (!chain.equals(" "))
440 eval.append(":" + chain);
441 resetLastRes.append(":" + chain);
444 eval.append(";color gold;wireframe 100");
446 Color col = new Color(viewer.getAtomArgb(atomIndex));
448 resetLastRes.append(";color["
450 + col.getGreen() + ","
451 + col.getBlue() + "];wireframe 0");
453 viewer.evalStringQuiet(eval.toString());
457 public void updateColours(Object source)
459 colourBySequence( (AlignmentPanel) source);
462 //End StructureListener
463 ////////////////////////////
466 public void colourBySequence(AlignmentPanel ap)
468 if(!colourBySequence)
472 StructureMapping[] mapping = ssm.getMapping(pdbentry.getFile());
474 if (mapping.length < 1)
477 SequenceRenderer sr = ap.seqPanel.seqCanvas.getSequenceRenderer();
479 boolean showFeatures = false;
480 if (ap.av.showSequenceFeatures)
485 fr = new jalview.appletgui.FeatureRenderer(ap.av);
488 fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
491 StringBuffer command = new StringBuffer();
494 for (int s = 0; s < sequence.length; s++)
496 for (int m = 0; m < mapping.length; m++)
498 if (mapping[m].getSequence() == sequence[s])
500 for (int r = 0; r < sequence[s].getLength(); r++)
502 int pos = mapping[m].getPDBResNum(
503 sequence[s].findPosition(r));
505 if (pos < 1 || pos==lastPos)
510 Color col = sr.getResidueBoxColour(sequence[s], r);
513 col = fr.findFeatureColour(col, sequence[s], r);
515 if (command.toString().endsWith(":" + mapping[m].getChain()+
518 + col.getGreen() + ","
519 + col.getBlue() + "]"))
521 command = condenseCommand(command.toString(), pos);
525 command.append(";select " + pos);
527 if (!mapping[m].getChain().equals(" "))
529 command.append(":" + mapping[m].getChain());
532 command.append(";color["
534 + col.getGreen() + ","
535 + col.getBlue() + "]");
543 viewer.evalStringQuiet(command.toString());
546 StringBuffer condenseCommand(String command, int pos)
549 StringBuffer sb = new StringBuffer(command.substring(0, command.lastIndexOf("select")+7));
551 command = command.substring(sb.length());
555 if (command.indexOf("-") > -1)
557 start = command.substring(0,command.indexOf("-"));
561 start = command.substring(0, command.indexOf(":"));
564 sb.append(start+"-"+pos+command.substring(command.indexOf(":")));
569 /////////////////////////////////
572 public String eval(String strEval)
574 // System.out.println(strEval);
575 //"# 'eval' is implemented only for the applet.";
579 public void createImage(String file, String type, int quality)
582 public void setCallbackFunction(String callbackType,
583 String callbackFunction)
586 public void notifyFileLoaded(String fullPathName, String fileName,
587 String modelName, Object clientFile,
592 fileLoadingError = errorMsg;
597 fileLoadingError = null;
599 if (fileName != null)
602 jmolpopup.updateComputedMenus();
603 viewer.evalStringQuiet(
604 "select backbone;restrict;cartoon;wireframe off;spacefill off");
606 ssm = StructureSelectionManager.getStructureSelectionManager();
611 pdb = ssm.setMapping(sequence,
613 AppletFormatAdapter.PASTE);
614 pdbentry.setFile("INLINE"+pdb.id);
618 pdb = ssm.setMapping(sequence,
620 AppletFormatAdapter.URL);
623 pdbentry.setId(pdb.id);
625 ssm.addStructureViewerListener(this);
627 Vector chains = new Vector();
628 for (int i = 0; i < pdb.chains.size(); i++)
630 chains.addElement( ( (MCview.PDBChain) pdb.chains.elementAt(i)).id);
632 setChainMenuItems(chains);
634 colourBySequence(ap);
636 StringBuffer title = new StringBuffer(sequence[0].getName() + ":" +
639 if (pdbentry.getProperty() != null)
641 if (pdbentry.getProperty().get("method") != null)
643 title.append(" Method: ");
644 title.append(pdbentry.getProperty().get("method"));
646 if (pdbentry.getProperty().get("chains") != null)
648 title.append(" Chain:");
649 title.append(pdbentry.getProperty().get("chains"));
653 this.setTitle(title.toString());
660 public void notifyFrameChanged(int frameNo)
662 boolean isAnimationRunning = (frameNo <= -2);
665 public void notifyScriptStart(String statusMessage, String additionalInfo)
668 public void sendConsoleEcho(String strEcho)
670 if (scriptWindow == null)
673 history.append("\n"+strEcho);
676 public void sendConsoleMessage(String strStatus)
678 if(history!=null && strStatus!=null
679 && !strStatus.equals("Script completed"))
681 history.append("\n"+strStatus);
685 public void notifyScriptTermination(String strStatus, int msWalltime)
688 public void handlePopupMenu(int x, int y)
690 jmolpopup.show(x, y);
693 public void notifyNewPickingModeMeasurement(int iatom, String strMeasure)
695 notifyAtomPicked(iatom, strMeasure);
698 public void notifyNewDefaultModeMeasurement(int count, String strInfo)
701 public void notifyAtomPicked(int atomIndex, String strInfo)
704 int chainSeparator = strInfo.indexOf(":");
706 if(chainSeparator==-1)
707 chainSeparator = strInfo.indexOf(".");
710 strInfo.substring(strInfo.indexOf("]")+ 1, chainSeparator);
713 if (strInfo.indexOf(":") > -1)
714 picked+=strInfo.substring(strInfo.indexOf(":")+1,
715 strInfo.indexOf("."));
719 if (!atomsPicked.contains(picked))
721 viewer.evalString("select "+picked+";label %n %r:%c");
722 atomsPicked.addElement(picked);
726 viewer.evalString("select "+picked+";label off");
727 atomsPicked.removeElement(picked);
731 public void notifyAtomHovered(int atomIndex, String strInfo)
733 mouseOverStructure(atomIndex, strInfo);
736 public void sendSyncScript(String script, String appletName)
739 public void showUrl(String url)
742 ap.av.applet.getAppletContext().showDocument(new java.net.URL(url),
744 }catch(java.net.MalformedURLException ex)
748 public void showConsole(boolean showConsole)
750 if (scriptWindow == null)
752 scriptWindow = new Panel(new BorderLayout());
753 inputLine = new TextField();
754 history = new TextArea(5, 40);
755 scriptWindow.add(history, BorderLayout.CENTER);
756 scriptWindow.add(inputLine, BorderLayout.SOUTH);
757 add(scriptWindow, BorderLayout.SOUTH);
758 scriptWindow.setVisible(false);
759 history.setEditable(false);
760 inputLine.addKeyListener(this);
763 scriptWindow.setVisible(!scriptWindow.isVisible());
767 public float functionXY(String functionName, int x, int y)
772 ///End JmolStatusListener
773 ///////////////////////////////
779 Dimension currentSize = new Dimension();
780 Rectangle rectClip = new Rectangle();
782 public void update(Graphics g) {
785 public void paint(Graphics g)
787 currentSize = this.getSize();
788 rectClip = g.getClipBounds();
792 g.setColor(Color.black);
793 g.fillRect(0, 0, currentSize.width, currentSize.height);
794 g.setColor(Color.white);
795 g.setFont(new Font("Verdana", Font.BOLD, 14));
796 g.drawString("Retrieving PDB data....", 20, currentSize.height / 2);
800 viewer.renderScreenImage(g, currentSize, rectClip);