2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Software
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
20 package jalview.appletgui;
\r
24 import java.awt.event.*;
\r
26 import jalview.datamodel.*;
\r
27 import jalview.structure.*;
\r
28 import jalview.io.*;
\r
30 import org.jmol.api.*;
\r
31 import org.jmol.adapter.smarter.SmarterJmolAdapter;
\r
32 import org.jmol.popup.*;
\r
35 public class AppletJmol extends Frame
\r
36 implements StructureListener, JmolStatusListener,
\r
37 KeyListener, ActionListener, ItemListener
\r
40 Menu fileMenu = new Menu("File");
\r
41 Menu viewMenu = new Menu("View");
\r
42 Menu chainMenu = new Menu("Show Chain");
\r
43 MenuItem mappingMenuItem = new MenuItem("View Mapping");
\r
46 JmolPopup jmolpopup;
\r
49 TextField inputLine;
\r
51 SequenceI[] sequence;
\r
52 StructureSelectionManager ssm;
\r
53 RenderPanel renderPanel;
\r
55 String fileLoadingError;
\r
56 boolean loadedInline;
\r
59 public AppletJmol(PDBEntry pdbentry,
\r
65 this.sequence = seq;
\r
66 this.pdbentry = pdbentry;
\r
68 String alreadyMapped = StructureSelectionManager
\r
69 .getStructureSelectionManager()
\r
70 .alreadyMappedToFile(pdbentry.getId());
\r
72 if (alreadyMapped != null)
\r
74 StructureSelectionManager.getStructureSelectionManager()
\r
75 .setMapping(seq, pdbentry.getFile(), protocol);
\r
79 renderPanel = new RenderPanel();
\r
81 this.add(renderPanel, BorderLayout.CENTER);
\r
83 viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter());
\r
85 viewer.setAppletContext("jalview",
\r
86 ap.av.applet.getDocumentBase(),
\r
87 ap.av.applet.getCodeBase(),
\r
90 viewer.setJmolStatusListener(this);
\r
92 jmolpopup = JmolPopup.newJmolPopup(viewer);
\r
94 this.addWindowListener(new WindowAdapter()
\r
96 public void windowClosing(WindowEvent evt)
\r
102 MenuBar menuBar = new MenuBar();
\r
103 menuBar.add(fileMenu);
\r
104 fileMenu.add(mappingMenuItem);
\r
105 menuBar.add(viewMenu);
\r
106 mappingMenuItem.addActionListener(this);
\r
107 viewMenu.add(chainMenu);
\r
108 this.setMenuBar(menuBar);
\r
110 if(pdbentry.getFile()!=null)
\r
112 if (protocol.equals(AppletFormatAdapter.PASTE))
\r
113 loadInline(pdbentry.getFile());
\r
115 viewer.openFile(pdbentry.getFile());
\r
118 this.setBounds(400, 400, 400, 400);
\r
120 this.setVisible(true);
\r
123 public void loadInline(String string)
\r
125 loadedInline = true;
\r
126 viewer.openStringInline(string);
\r
130 void setChainMenuItems(Vector chains)
\r
132 chainMenu.removeAll();
\r
134 MenuItem menuItem = new MenuItem("All");
\r
135 menuItem.addActionListener(this);
\r
137 chainMenu.add(menuItem);
\r
139 CheckboxMenuItem menuItemCB;
\r
140 for (int c = 0; c < chains.size(); c++)
\r
142 menuItemCB = new CheckboxMenuItem(chains.elementAt(c).toString(), true);
\r
143 menuItemCB.addItemListener(this);
\r
144 chainMenu.add(menuItemCB);
\r
148 boolean allChainsSelected = false;
\r
149 void centerViewer()
\r
151 StringBuffer cmd = new StringBuffer();
\r
152 for (int i = 0; i < chainMenu.getItemCount(); i++)
\r
154 if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
\r
156 CheckboxMenuItem item = (CheckboxMenuItem) chainMenu.getItem(i);
\r
157 if (item.getState())
\r
158 cmd.append(":" + item.getLabel() + " or ");
\r
162 if (cmd.length() > 0)
\r
163 cmd.setLength(cmd.length() - 4);
\r
165 viewer.evalString("select *;restrict "
\r
166 + cmd + ";cartoon;center " + cmd);
\r
172 viewer.setModeMouse(org.jmol.viewer.JmolConstants.MOUSE_NONE);
\r
173 viewer.evalStringQuiet("zap");
\r
174 viewer.setJmolStatusListener(null);
\r
177 //We'll need to find out what other
\r
178 // listeners need to be shut down in Jmol
\r
179 StructureSelectionManager
\r
180 .getStructureSelectionManager()
\r
181 .removeStructureViewerListener(this, pdbentry.getId());
\r
183 this.setVisible(false);
\r
186 public void actionPerformed(ActionEvent evt)
\r
188 if(evt.getSource()==mappingMenuItem)
\r
190 jalview.appletgui.CutAndPasteTransfer cap
\r
191 = new jalview.appletgui.CutAndPasteTransfer(false, null);
\r
192 Frame frame = new Frame();
\r
195 jalview.bin.JalviewLite.addFrame(frame, "PDB - Sequence Mapping", 550,
\r
198 StructureSelectionManager.getStructureSelectionManager().printMapping(
\r
199 pdbentry.getFile())
\r
204 allChainsSelected = true;
\r
205 for (int i = 0; i < chainMenu.getItemCount(); i++)
\r
207 if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
\r
208 ( (CheckboxMenuItem) chainMenu.getItem(i)).setState(true);
\r
211 allChainsSelected = false;
\r
215 public void itemStateChanged(ItemEvent evt)
\r
217 if (!allChainsSelected)
\r
221 public void keyPressed(KeyEvent evt)
\r
223 if (evt.getKeyCode() == KeyEvent.VK_ENTER
\r
224 && scriptWindow.isVisible())
\r
226 viewer.evalString(inputLine.getText());
\r
228 history.append("\n"+inputLine.getText());
\r
230 inputLine.setText("");
\r
235 public void keyTyped(KeyEvent evt)
\r
238 public void keyReleased(KeyEvent evt){}
\r
240 //////////////////////////////////
\r
241 ///StructureListener
\r
242 public String getPdbFile()
\r
249 String lastMessage;
\r
250 public void mouseOverStructure(int atomIndex, String strInfo)
\r
252 int pdbResNum = Integer.parseInt(
\r
253 strInfo.substring(strInfo.indexOf("]")+ 1, strInfo.indexOf(":")));
\r
255 String chainId = strInfo.substring
\r
256 (strInfo.indexOf(":"), strInfo.indexOf("."));
\r
258 if (chainId != null)
\r
259 chainId = chainId.substring(1, chainId.length());
\r
265 if (lastMessage == null || !lastMessage.equals(strInfo))
\r
266 ssm.mouseOverStructure(pdbResNum, chainId, pdbentry.getFile());
\r
268 lastMessage = strInfo;
\r
271 StringBuffer resetLastRes = new StringBuffer();
\r
272 StringBuffer eval = new StringBuffer();
\r
274 public void highlightAtom(int atomIndex, int pdbResNum, String chain, String pdbfile)
\r
276 if (!pdbfile.equals(pdbentry.getFile()))
\r
279 if (resetLastRes.length() > 0)
\r
281 viewer.evalStringQuiet(resetLastRes.toString());
\r
285 eval.append("select " + pdbResNum);
\r
287 resetLastRes.setLength(0);
\r
288 resetLastRes.append("select " + pdbResNum);
\r
290 if (!chain.equals(" "))
\r
292 eval.append(":" + chain);
\r
293 resetLastRes.append(":" + chain);
\r
296 eval.append(";color gold;wireframe 100");
\r
298 Color col = new Color(viewer.getAtomArgb(atomIndex));
\r
300 resetLastRes.append(";color["
\r
301 + col.getRed() + ","
\r
302 + col.getGreen() + ","
\r
303 + col.getBlue() + "];wireframe 0");
\r
305 viewer.evalStringQuiet(eval.toString());
\r
309 public void updateColours(Object source)
\r
311 colourBySequence( (AlignmentPanel) source);
\r
314 //End StructureListener
\r
315 ////////////////////////////
\r
317 FeatureRenderer fr;
\r
318 public void colourBySequence(AlignmentPanel ap)
\r
320 StructureMapping[] mapping = ssm.getMapping(pdbentry.getFile());
\r
322 if (mapping.length < 1)
\r
325 SequenceRenderer sr = ap.seqPanel.seqCanvas.getSequenceRenderer();
\r
327 boolean showFeatures = false;
\r
328 if (ap.av.showSequenceFeatures)
\r
330 showFeatures = true;
\r
333 fr = new jalview.appletgui.FeatureRenderer(ap.av);
\r
336 fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
\r
339 StringBuffer command = new StringBuffer();
\r
341 for (int s = 0; s < sequence.length; s++)
\r
343 for (int m = 0; m < mapping.length; m++)
\r
345 if (mapping[m].getSequence() == sequence[s])
\r
347 for (int r = 0; r < sequence[s].getLength(); r++)
\r
349 int pos = mapping[m].getPDBResNum(
\r
350 sequence[s].findPosition(r));
\r
355 command.append(";select " + pos);
\r
357 if (!mapping[m].getChain().equals(" "))
\r
359 command.append(":" + mapping[m].getChain());
\r
362 Color col = sr.getResidueBoxColour(sequence[s], r);
\r
365 col = fr.findFeatureColour(col, sequence[s], r);
\r
367 command.append("; color ["
\r
368 + col.getRed() + ","
\r
369 + col.getGreen() + ","
\r
370 + col.getBlue() + "]");
\r
377 viewer.evalStringQuiet(command.toString());
\r
380 /////////////////////////////////
\r
381 //JmolStatusListener
\r
383 public String eval(String strEval)
\r
385 // System.out.println(strEval);
\r
386 //"# 'eval' is implemented only for the applet.";
\r
390 public void createImage(String file, String type, int quality)
\r
392 System.out.println("JMOL CREATE IMAGE");
\r
395 public void setCallbackFunction(String callbackType,
\r
396 String callbackFunction)
\r
399 public void notifyFileLoaded(String fullPathName, String fileName,
\r
400 String modelName, Object clientFile,
\r
405 fileLoadingError = errorMsg;
\r
410 fileLoadingError = null;
\r
412 if (fileName != null)
\r
415 jmolpopup.updateComputedMenus();
\r
416 viewer.evalStringQuiet(
\r
417 "select backbone;restrict;cartoon;wireframe off;spacefill off");
\r
419 ssm = StructureSelectionManager.getStructureSelectionManager();
\r
421 MCview.PDBfile pdb;
\r
424 pdb = ssm.setMapping(sequence,
\r
425 pdbentry.getFile(),
\r
426 AppletFormatAdapter.PASTE);
\r
427 pdbentry.setFile("INLINE"+pdb.id);
\r
432 pdb = ssm.setMapping(sequence,
\r
433 pdbentry.getFile(),
\r
434 AppletFormatAdapter.URL);
\r
437 pdbentry.setId(pdb.id);
\r
439 ssm.addStructureViewerListener(this);
\r
441 Vector chains = new Vector();
\r
442 for (int i = 0; i < pdb.chains.size(); i++)
\r
444 chains.addElement( ( (MCview.PDBChain) pdb.chains.elementAt(i)).id);
\r
446 setChainMenuItems(chains);
\r
448 colourBySequence(ap);
\r
450 StringBuffer title = new StringBuffer(sequence[0].getName() + ":" +
\r
453 if (pdbentry.getProperty() != null)
\r
455 if (pdbentry.getProperty().get("method") != null)
\r
457 title.append(" Method: ");
\r
458 title.append(pdbentry.getProperty().get("method"));
\r
460 if (pdbentry.getProperty().get("chains") != null)
\r
462 title.append(" Chain:");
\r
463 title.append(pdbentry.getProperty().get("chains"));
\r
467 this.setTitle(title.toString());
\r
474 public void notifyFrameChanged(int frameNo)
\r
476 boolean isAnimationRunning = (frameNo <= -2);
\r
479 public void notifyScriptStart(String statusMessage, String additionalInfo)
\r
482 public void sendConsoleEcho(String strEcho)
\r
484 // if (scriptWindow != null)
\r
485 // scriptWindow.sendConsoleEcho(strEcho);
\r
488 public void sendConsoleMessage(String strStatus)
\r
490 // if (scriptWindow != null)
\r
491 // scriptWindow.sendConsoleMessage(strStatus);
\r
494 public void notifyScriptTermination(String strStatus, int msWalltime)
\r
496 // if (scriptWindow != null)
\r
497 // scriptWindow.notifyScriptTermination(strStatus, msWalltime);
\r
500 public void handlePopupMenu(int x, int y)
\r
502 jmolpopup.show(x, y);
\r
505 public void notifyNewPickingModeMeasurement(int iatom, String strMeasure)
\r
507 notifyAtomPicked(iatom, strMeasure);
\r
510 public void notifyNewDefaultModeMeasurement(int count, String strInfo)
\r
513 public void notifyAtomPicked(int atomIndex, String strInfo)
\r
515 // if (scriptWindow != null)
\r
517 // scriptWindow.sendConsoleMessage(strInfo);
\r
518 // scriptWindow.sendConsoleMessage("\n");
\r
522 public void notifyAtomHovered(int atomIndex, String strInfo)
\r
524 mouseOverStructure(atomIndex, strInfo);
\r
527 public void sendSyncScript(String script, String appletName)
\r
530 public void showUrl(String url)
\r
533 public void showConsole(boolean showConsole)
\r
535 if (scriptWindow == null)
\r
537 scriptWindow = new Panel(new BorderLayout());
\r
538 inputLine = new TextField();
\r
539 history = new TextArea(5, 40);
\r
540 scriptWindow.add(history, BorderLayout.CENTER);
\r
541 scriptWindow.add(inputLine, BorderLayout.SOUTH);
\r
542 add(scriptWindow, BorderLayout.SOUTH);
\r
543 scriptWindow.setVisible(false);
\r
544 history.setEditable(false);
\r
545 inputLine.addKeyListener(this);
\r
548 scriptWindow.setVisible(!scriptWindow.isVisible());
\r
552 public float functionXY(String functionName, int x, int y)
\r
557 ///End JmolStatusListener
\r
558 ///////////////////////////////
\r
564 Dimension currentSize = new Dimension();
\r
565 Rectangle rectClip = new Rectangle();
\r
567 public void update(Graphics g) {
\r
570 public void paint(Graphics g)
\r
572 currentSize = this.getSize();
\r
573 rectClip = g.getClipBounds();
\r
575 if (viewer == null)
\r
577 g.setColor(Color.black);
\r
578 g.fillRect(0, 0, currentSize.width, currentSize.height);
\r
579 g.setColor(Color.white);
\r
580 g.setFont(new Font("Verdana", Font.BOLD, 14));
\r
581 g.drawString("Retrieving PDB data....", 20, currentSize.height / 2);
\r
585 viewer.renderScreenImage(g, currentSize, rectClip);
\r