2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.appletgui;
23 import jalview.bin.JalviewLite;
24 import jalview.datamodel.AlignmentI;
25 import jalview.datamodel.PDBEntry;
26 import jalview.datamodel.SequenceI;
27 import jalview.io.AppletFormatAdapter;
28 import jalview.io.FileParse;
29 import jalview.schemes.BuriedColourScheme;
30 import jalview.schemes.HelixColourScheme;
31 import jalview.schemes.HydrophobicColourScheme;
32 import jalview.schemes.PurinePyrimidineColourScheme;
33 import jalview.schemes.StrandColourScheme;
34 import jalview.schemes.TaylorColourScheme;
35 import jalview.schemes.TurnColourScheme;
36 import jalview.schemes.UserColourScheme;
37 import jalview.schemes.ZappoColourScheme;
38 import jalview.structure.StructureSelectionManager;
39 import jalview.util.MessageManager;
41 import java.awt.BorderLayout;
42 import awt2swing.CheckboxMenuItem;
43 import java.awt.Color;
44 import java.awt.Dimension;
46 import awt2swing.Frame;
47 import java.awt.Graphics;
48 import awt2swing.Menu;
49 import awt2swing.MenuBar;
50 import awt2swing.MenuItem;
51 import awt2swing.Panel;
52 import awt2swing.TextArea;
53 import awt2swing.TextField;
54 import java.awt.event.ActionEvent;
55 import java.awt.event.ActionListener;
56 import java.awt.event.ItemEvent;
57 import java.awt.event.ItemListener;
58 import java.awt.event.KeyEvent;
59 import java.awt.event.KeyListener;
60 import java.awt.event.WindowAdapter;
61 import java.awt.event.WindowEvent;
62 import java.util.ArrayList;
63 import java.util.Hashtable;
64 import java.util.List;
65 import java.util.Vector;
67 public class AppletJmol //extends EmbmenuFrame implements
68 // KeyListener, ActionListener, ItemListener
78 RenderPanel renderPanel;
82 List<AlignmentPanel> _aps = new ArrayList<AlignmentPanel>(); // remove? never
85 String fileLoadingError;
89 // boolean colourBySequence = true;
91 FeatureRenderer fr = null;
93 AppletJmolBinding jmb;
96 public AppletJmol(PDBEntry entry, SequenceI[] sequenceIs, Object object,
97 AlignmentPanel ap2, String uRL) {
98 // TODO Auto-generated constructor stub
102 public void setJalviewColourScheme(UserColourScheme ucs) {
103 // TODO Auto-generated method stub
108 // Menu fileMenu = new Menu(MessageManager.getString("action.file"));
110 // Menu viewMenu = new Menu(MessageManager.getString("action.view"));
112 // Menu coloursMenu = new Menu(MessageManager.getString("action.colour"));
114 // Menu chainMenu = new Menu(MessageManager.getString("action.show_chain"));
116 // Menu helpMenu = new Menu(MessageManager.getString("action.help"));
118 // MenuItem mappingMenuItem = new MenuItem(
119 // MessageManager.getString("label.view_mapping"));
121 // CheckboxMenuItem seqColour = new CheckboxMenuItem(
122 // MessageManager.getString("action.by_sequence"), true);
124 // CheckboxMenuItem jmolColour = new CheckboxMenuItem(
125 // MessageManager.getString("action.using_jmol"), false);
127 // MenuItem chain = new MenuItem(MessageManager.getString("action.by_chain"));
129 // MenuItem charge = new MenuItem(
130 // MessageManager.getString("label.charge_cysteine"));
132 // MenuItem zappo = new MenuItem(MessageManager.getString("label.zappo"));
134 // MenuItem taylor = new MenuItem(MessageManager.getString("label.taylor"));
136 // MenuItem hydro = new MenuItem(
137 // MessageManager.getString("label.hydrophobicity"));
139 // MenuItem helix = new MenuItem(
140 // MessageManager.getString("label.helix_propensity"));
142 // MenuItem strand = new MenuItem(
143 // MessageManager.getString("label.strand_propensity"));
145 // MenuItem turn = new MenuItem(
146 // MessageManager.getString("label.turn_propensity"));
148 // MenuItem buried = new MenuItem(
149 // MessageManager.getString("label.buried_index"));
151 // MenuItem purinepyrimidine = new MenuItem(
152 // MessageManager.getString("label.purine_pyrimidine"));
154 // MenuItem user = new MenuItem(
155 // MessageManager.getString("label.user_defined_colours"));
157 // MenuItem jmolHelp = new MenuItem(
158 // MessageManager.getString("label.jmol_help"));
161 // * datasource protocol for access to PDBEntry
163 // String protocol = null;
166 // * Load a bunch of pdb entries associated with sequences in the alignment and
167 // * display them - aligning them if necessary.
169 // * @param pdbentries
170 // * each pdb file (at least one needed)
171 // * @param boundseqs
172 // * each set of sequences for each pdb file (must match number of pdb
174 // * @param boundchains
175 // * the target pdb chain corresponding with each sequence associated
176 // * with each pdb file (may be null at any level)
180 // * associated alignment
182 // * how to get pdb data
184 // public AppletJmol(PDBEntry[] pdbentries, SequenceI[][] boundseqs,
185 // String[][] boundchains, boolean align, AlignmentPanel ap,
188 // throw new Error(MessageManager.getString("error.not_yet_implemented"));
191 // public AppletJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains,
192 // AlignmentPanel ap, String protocol)
195 // jmb = new AppletJmolBinding(this, ap.getStructureSelectionManager(),
197 // { pdbentry }, new SequenceI[][]
198 // { seq }, new String[][]
199 // { chains }, protocol);
200 // jmb.setColourBySequence(true);
201 // if (pdbentry.getId() == null || pdbentry.getId().length() < 1)
203 // if (protocol.equals(AppletFormatAdapter.PASTE))
205 // pdbentry.setId("PASTED PDB"
206 // + (chains == null ? "_" : chains.toString()));
210 // pdbentry.setId(pdbentry.getFile());
214 // if (JalviewLite.debug)
217 // .println("AppletJmol: PDB ID is '" + pdbentry.getId() + "'");
220 // String alreadyMapped = StructureSelectionManager
221 // .getStructureSelectionManager(ap.av.applet)
222 // .alreadyMappedToFile(pdbentry.getId());
223 // MCview.PDBfile reader = null;
224 // if (alreadyMapped != null)
226 // reader = StructureSelectionManager.getStructureSelectionManager(
227 // ap.av.applet).setMapping(seq, chains, pdbentry.getFile(),
229 // // PROMPT USER HERE TO ADD TO NEW OR EXISTING VIEW?
230 // // FOR NOW, LETS JUST OPEN A NEW WINDOW
232 // MenuBar menuBar = new MenuBar();
233 // menuBar.add(fileMenu);
234 // fileMenu.add(mappingMenuItem);
235 // menuBar.add(viewMenu);
236 // mappingMenuItem.addActionListener(this);
237 // viewMenu.add(chainMenu);
238 // menuBar.add(coloursMenu);
239 // menuBar.add(helpMenu);
241 // charge.addActionListener(this);
242 // hydro.addActionListener(this);
243 // chain.addActionListener(this);
244 // seqColour.addItemListener(this);
245 // jmolColour.addItemListener(this);
246 // zappo.addActionListener(this);
247 // taylor.addActionListener(this);
248 // helix.addActionListener(this);
249 // strand.addActionListener(this);
250 // turn.addActionListener(this);
251 // buried.addActionListener(this);
252 // purinepyrimidine.addActionListener(this);
253 // user.addActionListener(this);
255 // jmolHelp.addActionListener(this);
257 // coloursMenu.add(seqColour);
258 // coloursMenu.add(chain);
259 // coloursMenu.add(charge);
260 // coloursMenu.add(zappo);
261 // coloursMenu.add(taylor);
262 // coloursMenu.add(hydro);
263 // coloursMenu.add(helix);
264 // coloursMenu.add(strand);
265 // coloursMenu.add(turn);
266 // coloursMenu.add(buried);
267 // coloursMenu.add(purinepyrimidine);
268 // coloursMenu.add(user);
269 // coloursMenu.add(jmolColour);
270 // helpMenu.add(jmolHelp);
271 // this.setLayout(new BorderLayout());
273 // setMenuBar(menuBar);
275 // renderPanel = new RenderPanel();
276 // embedMenuIfNeeded(renderPanel);
277 // this.add(renderPanel, BorderLayout.CENTER);
278 // scriptWindow = new Panel();
279 // scriptWindow.setVisible(false);
280 // // this.add(scriptWindow, BorderLayout.SOUTH);
284 // jmb.allocateViewer(renderPanel, true, ap.av.applet.getName()
285 // + "_jmol_", ap.av.applet.getDocumentBase(),
286 // ap.av.applet.getCodeBase(), "-applet", scriptWindow, null);
287 // } catch (Exception e)
290 // .println("Couldn't create a jmol viewer. Args to allocate viewer were:\nDocumentBase="
291 // + ap.av.applet.getDocumentBase()
293 // + ap.av.applet.getCodeBase());
294 // e.printStackTrace();
298 // // jmb.newJmolPopup(true, "Jmol", true);
300 // this.addWindowListener(new WindowAdapter()
302 // public void windowClosing(WindowEvent evt)
307 // if (pdbentry.getProperty() == null)
309 // pdbentry.setProperty(new Hashtable());
310 // pdbentry.getProperty().put("protocol", protocol);
312 // if (pdbentry.getFile() != null)
314 // // import structure data from pdbentry.getFile based on given protocol
315 // if (protocol.equals(AppletFormatAdapter.PASTE))
317 // // TODO: JAL-623 : correctly record file contents for matching up later
318 // // pdbentry.getProperty().put("pdbfilehash",""+pdbentry.getFile().hashCode());
319 // loadInline(pdbentry.getFile());
321 // else if (protocol.equals(AppletFormatAdapter.FILE)
322 // || protocol.equals(AppletFormatAdapter.URL))
324 // jmb.viewer.openFile(pdbentry.getFile());
328 // // probably CLASSLOADER based datasource..
329 // // Try and get a reader on the datasource, and pass that to Jmol
332 // java.io.Reader freader = null;
333 // if (reader != null)
335 // if (JalviewLite.debug)
338 // .println("AppletJmol:Trying to reuse existing PDBfile IO parser.");
340 // // re-use the one we opened earlier
341 // freader = reader.getReader();
343 // if (freader == null)
345 // if (JalviewLite.debug)
348 // .println("AppletJmol:Creating new PDBfile IO parser.");
350 // FileParse fp = new FileParse(pdbentry.getFile(), protocol);
352 // // reader = new MCview.PDBfile(fp);
353 // // could set ID, etc.
354 // // if (!reader.isValid())
356 // // throw new Exception("Invalid datasource.
357 // // "+reader.getWarningMessage());
360 // freader = fp.getReader();
362 // if (freader == null)
364 // throw new Exception(MessageManager.getString("exception.invalid_datasource_couldnt_obtain_reader"));
366 // jmb.viewer.openReader(pdbentry.getFile(), pdbentry.getId(),
368 // } catch (Exception e)
371 // System.err.println("Couldn't access pdbentry id="
372 // + pdbentry.getId() + " and file=" + pdbentry.getFile()
373 // + " using protocol=" + protocol);
374 // e.printStackTrace();
379 // JalviewLite.addFrame(this, jmb.getViewerTitle(), 400, 400);
382 // public void loadInline(String string)
384 // loadedInline = true;
385 // jmb.loadInline(string);
388 // void setChainMenuItems(Vector<String> chains)
390 // chainMenu.removeAll();
392 // MenuItem menuItem = new MenuItem(MessageManager.getString("label.all"));
393 // menuItem.addActionListener(this);
395 // chainMenu.add(menuItem);
397 // CheckboxMenuItem menuItemCB;
398 // for (String ch : chains)
400 // menuItemCB = new CheckboxMenuItem(ch, true);
401 // menuItemCB.addItemListener(this);
402 // chainMenu.add(menuItemCB);
406 // boolean allChainsSelected = false;
408 // void centerViewer()
410 // Vector<String> toshow = new Vector<String>();
411 // for (int i = 0; i < chainMenu.getItemCount(); i++)
413 // if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
415 // CheckboxMenuItem item = (CheckboxMenuItem) chainMenu.getItem(i);
416 // if (item.getState())
418 // toshow.addElement(item.getLabel());
422 // jmb.centerViewer(toshow);
425 // void closeViewer()
427 // jmb.closeViewer();
429 // this.setVisible(false);
432 // public void actionPerformed(ActionEvent evt)
434 // if (evt.getSource() == mappingMenuItem)
436 // CutAndPasteTransfer cap = new CutAndPasteTransfer(
438 // Frame frame = new Frame();
441 // StringBuffer sb = new StringBuffer();
444 // cap.setText(jmb.printMappings());
445 // } catch (OutOfMemoryError ex)
449 // .println("Out of memory when trying to create dialog box with sequence-structure mapping.");
452 // JalviewLite.addFrame(frame,
453 // MessageManager.getString("label.pdb_sequence_mapping"), 550,
456 // else if (evt.getSource() == charge)
458 // setEnabled(charge);
459 // jmb.colourByCharge();
462 // else if (evt.getSource() == chain)
464 // setEnabled(chain);
465 // jmb.colourByChain();
467 // else if (evt.getSource() == zappo)
469 // setEnabled(zappo);
470 // jmb.setJalviewColourScheme(new ZappoColourScheme());
472 // else if (evt.getSource() == taylor)
474 // setEnabled(taylor);
475 // jmb.setJalviewColourScheme(new TaylorColourScheme());
477 // else if (evt.getSource() == hydro)
479 // setEnabled(hydro);
480 // jmb.setJalviewColourScheme(new HydrophobicColourScheme());
482 // else if (evt.getSource() == helix)
484 // setEnabled(helix);
485 // jmb.setJalviewColourScheme(new HelixColourScheme());
487 // else if (evt.getSource() == strand)
489 // setEnabled(strand);
490 // jmb.setJalviewColourScheme(new StrandColourScheme());
492 // else if (evt.getSource() == turn)
495 // jmb.setJalviewColourScheme(new TurnColourScheme());
497 // else if (evt.getSource() == buried)
499 // setEnabled(buried);
500 // jmb.setJalviewColourScheme(new BuriedColourScheme());
502 // else if (evt.getSource() == purinepyrimidine)
504 // jmb.setJalviewColourScheme(new PurinePyrimidineColourScheme());
506 // else if (evt.getSource() == user)
509 // new UserDefinedColours(this);
511 // else if (evt.getSource() == jmolHelp)
515 // ap.av.applet.getAppletContext().showDocument(
517 // "http://jmol.sourceforge.net/docs/JmolUserGuide/"),
519 // } catch (java.net.MalformedURLException ex)
525 // allChainsSelected = true;
526 // for (int i = 0; i < chainMenu.getItemCount(); i++)
528 // if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
530 // ((CheckboxMenuItem) chainMenu.getItem(i)).setState(true);
535 // allChainsSelected = false;
540 // * tick or untick the seqColour menu entry or jmoColour entry depending upon
541 // * if it was selected or not.
545 // private void setEnabled(Object itm) // BH MenuItem not superclass of CheckBoxMenuItem
547 // jmolColour.setState(itm == jmolColour);
548 // seqColour.setState(itm == seqColour);
549 // jmb.setColourBySequence(itm == seqColour);
552 // public void itemStateChanged(ItemEvent evt)
554 // if (evt.getSource() == jmolColour)
556 // setEnabled(jmolColour);
557 // jmb.setColourBySequence(false);
559 // else if (evt.getSource() == seqColour)
561 // setEnabled(seqColour);
562 // jmb.colourBySequence(ap);
564 // else if (!allChainsSelected)
570 // public void keyPressed(KeyEvent evt)
572 // if (evt.getKeyCode() == KeyEvent.VK_ENTER && scriptWindow.isVisible())
574 // jmb.eval(inputLine.getText());
575 // history.append("\n$ " + inputLine.getText());
576 // inputLine.setText("");
581 // public void keyTyped(KeyEvent evt)
585 // public void keyReleased(KeyEvent evt)
589 // public void updateColours(Object source)
591 // AlignmentPanel panel = (AlignmentPanel) source;
592 // jmb.colourBySequence(panel);
595 // public void updateTitleAndMenus()
597 // if (jmb.fileLoadingError != null && jmb.fileLoadingError.length() > 0)
602 // setChainMenuItems(jmb.chainNames);
603 // jmb.colourBySequence(ap);
605 // setTitle(jmb.getViewerTitle());
608 // public void showUrl(String url)
612 // ap.av.applet.getAppletContext().showDocument(new java.net.URL(url),
614 // } catch (java.net.MalformedURLException ex)
619 // Panel splitPane = null;
621 // public void showConsole(boolean showConsole)
625 // remove(renderPanel);
626 // splitPane = new Panel();
628 // splitPane.setLayout(new java.awt.GridLayout(2, 1));
629 // splitPane.add(renderPanel);
630 // splitPane.add(scriptWindow);
631 // scriptWindow.setVisible(true);
632 // this.add(splitPane, BorderLayout.CENTER);
633 // splitPane.setVisible(true);
634 // splitPane.validate();
638 // scriptWindow.setVisible(false);
639 // remove(splitPane);
640 // add(renderPanel, BorderLayout.CENTER);
646 // public float[][] functionXY(String functionName, int x, int y)
651 // // /End JmolStatusListener
652 // // /////////////////////////////
654 class RenderPanel extends Panel
656 Dimension currentSize = new Dimension();
658 public void update(Graphics g)
663 public void PaintComponent(Graphics g)
665 currentSize = this.getSize();
667 // if (jmb.viewer == null)
669 // g.setColor(Color.black);
670 // g.fillRect(0, 0, currentSize.width, currentSize.height);
671 // g.setColor(Color.white);
672 // g.setFont(new Font("Verdana", Font.BOLD, 14));
673 // g.drawString(MessageManager.getString("label.retrieving_pdb_data"),
674 // 20, currentSize.height / 2);
678 // jmb.viewer.renderScreenImage(g, currentSize.width,
679 // currentSize.height);
685 // * @Override public Color getColour(int atomIndex, int pdbResNum, String
686 // * chain, String pdbId) { return jmb.getColour(atomIndex, pdbResNum, chain,
689 // * @Override public String[] getPdbFile() { return jmb.getPdbFile(); }
691 // * @Override public void highlightAtom(int atomIndex, int pdbResNum, String
692 // * chain, String pdbId) { jmb.highlightAtom(atomIndex, pdbResNum, chain,
697 // * @Override public void mouseOverStructure(int atomIndex, String strInfo) {
698 // * jmb.mouseOverStructure(atomIndex, strInfo);
702 // public void setJalviewColourScheme(UserColourScheme ucs)
704 // jmb.setJalviewColourScheme(ucs);
707 // public AlignmentPanel getAlignmentPanelFor(AlignmentI alignment)
709 // for (int i = 0; i < _aps.size(); i++)
711 // if (_aps.get(i).av.getAlignment() == alignment)
713 // return (_aps.get(i));