JAL-1807 - Bob's last(?) before leaving Dundee -- adds fast file loading
[jalviewjs.git] / src / jalview / appletgui / AppletJmol.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
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.
11  *  
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.
16  * 
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.
20  */
21 package jalview.appletgui;
22
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;
40
41 import java.awt.BorderLayout;
42 import awt2swing.CheckboxMenuItem;
43 import java.awt.Color;
44 import java.awt.Dimension;
45 import java.awt.Font;
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;
66
67 public class AppletJmol //extends EmbmenuFrame implements
68 //        KeyListener, ActionListener, ItemListener
69
70 {
71
72   Panel scriptWindow;
73
74   TextField inputLine;
75
76   TextArea history;
77
78   RenderPanel renderPanel;
79
80   AlignmentPanel ap;
81
82   List<AlignmentPanel> _aps = new ArrayList<AlignmentPanel>(); // remove? never
83                                                                // added to
84
85   String fileLoadingError;
86
87   boolean loadedInline;
88
89   // boolean colourBySequence = true;
90
91   FeatureRenderer fr = null;
92
93   AppletJmolBinding jmb;
94
95
96         public AppletJmol(PDBEntry entry, SequenceI[] sequenceIs, Object object,
97                         AlignmentPanel ap2, String uRL) {
98                 // TODO Auto-generated constructor stub
99         }
100
101
102         public void setJalviewColourScheme(UserColourScheme ucs) {
103                 // TODO Auto-generated method stub
104                 
105         }
106
107         
108         //  Menu fileMenu = new Menu(MessageManager.getString("action.file"));
109 //
110 //  Menu viewMenu = new Menu(MessageManager.getString("action.view"));
111 //
112 //  Menu coloursMenu = new Menu(MessageManager.getString("action.colour"));
113 //
114 //  Menu chainMenu = new Menu(MessageManager.getString("action.show_chain"));
115 //
116 //  Menu helpMenu = new Menu(MessageManager.getString("action.help"));
117 //
118 //  MenuItem mappingMenuItem = new MenuItem(
119 //          MessageManager.getString("label.view_mapping"));
120 //
121 //  CheckboxMenuItem seqColour = new CheckboxMenuItem(
122 //          MessageManager.getString("action.by_sequence"), true);
123 //
124 //  CheckboxMenuItem jmolColour = new CheckboxMenuItem(
125 //          MessageManager.getString("action.using_jmol"), false);
126 //
127 //  MenuItem chain = new MenuItem(MessageManager.getString("action.by_chain"));
128 //
129 //  MenuItem charge = new MenuItem(
130 //          MessageManager.getString("label.charge_cysteine"));
131 //
132 //  MenuItem zappo = new MenuItem(MessageManager.getString("label.zappo"));
133 //
134 //  MenuItem taylor = new MenuItem(MessageManager.getString("label.taylor"));
135 //
136 //  MenuItem hydro = new MenuItem(
137 //          MessageManager.getString("label.hydrophobicity"));
138 //
139 //  MenuItem helix = new MenuItem(
140 //          MessageManager.getString("label.helix_propensity"));
141 //
142 //  MenuItem strand = new MenuItem(
143 //          MessageManager.getString("label.strand_propensity"));
144 //
145 //  MenuItem turn = new MenuItem(
146 //          MessageManager.getString("label.turn_propensity"));
147 //
148 //  MenuItem buried = new MenuItem(
149 //          MessageManager.getString("label.buried_index"));
150 //
151 //  MenuItem purinepyrimidine = new MenuItem(
152 //          MessageManager.getString("label.purine_pyrimidine"));
153 //
154 //  MenuItem user = new MenuItem(
155 //          MessageManager.getString("label.user_defined_colours"));
156 //
157 //  MenuItem jmolHelp = new MenuItem(
158 //          MessageManager.getString("label.jmol_help"));
159 //
160 //  /**
161 //   * datasource protocol for access to PDBEntry
162 //   */
163 //  String protocol = null;
164 //
165 //  /**
166 //   * Load a bunch of pdb entries associated with sequences in the alignment and
167 //   * display them - aligning them if necessary.
168 //   * 
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
173 //   *          files)
174 //   * @param boundchains
175 //   *          the target pdb chain corresponding with each sequence associated
176 //   *          with each pdb file (may be null at any level)
177 //   * @param align
178 //   *          true/false
179 //   * @param ap
180 //   *          associated alignment
181 //   * @param protocol
182 //   *          how to get pdb data
183 //   */
184 //  public AppletJmol(PDBEntry[] pdbentries, SequenceI[][] boundseqs,
185 //          String[][] boundchains, boolean align, AlignmentPanel ap,
186 //          String protocol)
187 //  {
188 //    throw new Error(MessageManager.getString("error.not_yet_implemented"));
189 //  }
190 //
191 //  public AppletJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains,
192 //          AlignmentPanel ap, String protocol)
193 //  {
194 //    this.ap = ap;
195 //    jmb = new AppletJmolBinding(this, ap.getStructureSelectionManager(),
196 //            new PDBEntry[]
197 //            { pdbentry }, new SequenceI[][]
198 //            { seq }, new String[][]
199 //            { chains }, protocol);
200 //    jmb.setColourBySequence(true);
201 //    if (pdbentry.getId() == null || pdbentry.getId().length() < 1)
202 //    {
203 //      if (protocol.equals(AppletFormatAdapter.PASTE))
204 //      {
205 //        pdbentry.setId("PASTED PDB"
206 //                + (chains == null ? "_" : chains.toString()));
207 //      }
208 //      else
209 //      {
210 //        pdbentry.setId(pdbentry.getFile());
211 //      }
212 //    }
213 //
214 //    if (JalviewLite.debug)
215 //    {
216 //      System.err
217 //              .println("AppletJmol: PDB ID is '" + pdbentry.getId() + "'");
218 //    }
219 //
220 //    String alreadyMapped = StructureSelectionManager
221 //            .getStructureSelectionManager(ap.av.applet)
222 //            .alreadyMappedToFile(pdbentry.getId());
223 //    MCview.PDBfile reader = null;
224 //    if (alreadyMapped != null)
225 //    {
226 //      reader = StructureSelectionManager.getStructureSelectionManager(
227 //              ap.av.applet).setMapping(seq, chains, pdbentry.getFile(),
228 //              protocol);
229 //      // PROMPT USER HERE TO ADD TO NEW OR EXISTING VIEW?
230 //      // FOR NOW, LETS JUST OPEN A NEW WINDOW
231 //    }
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);
240 //
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);
254 //
255 //    jmolHelp.addActionListener(this);
256 //
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());
272 //
273 //    setMenuBar(menuBar);
274 //
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);
281 //
282 //    try
283 //    {
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)
288 //    {
289 //      System.err
290 //              .println("Couldn't create a jmol viewer. Args to allocate viewer were:\nDocumentBase="
291 //                      + ap.av.applet.getDocumentBase()
292 //                      + "\nCodebase="
293 //                      + ap.av.applet.getCodeBase());
294 //      e.printStackTrace();
295 //      dispose();
296 //      return;
297 //    }
298 //    // jmb.newJmolPopup(true, "Jmol", true);
299 //
300 //    this.addWindowListener(new WindowAdapter()
301 //    {
302 //      public void windowClosing(WindowEvent evt)
303 //      {
304 //        closeViewer();
305 //      }
306 //    });
307 //    if (pdbentry.getProperty() == null)
308 //    {
309 //      pdbentry.setProperty(new Hashtable());
310 //      pdbentry.getProperty().put("protocol", protocol);
311 //    }
312 //    if (pdbentry.getFile() != null)
313 //    {
314 //      // import structure data from pdbentry.getFile based on given protocol
315 //      if (protocol.equals(AppletFormatAdapter.PASTE))
316 //      {
317 //        // TODO: JAL-623 : correctly record file contents for matching up later
318 //        // pdbentry.getProperty().put("pdbfilehash",""+pdbentry.getFile().hashCode());
319 //        loadInline(pdbentry.getFile());
320 //      }
321 //      else if (protocol.equals(AppletFormatAdapter.FILE)
322 //              || protocol.equals(AppletFormatAdapter.URL))
323 //      {
324 //        jmb.viewer.openFile(pdbentry.getFile());
325 //      }
326 //      else
327 //      {
328 //        // probably CLASSLOADER based datasource..
329 //        // Try and get a reader on the datasource, and pass that to Jmol
330 //        try
331 //        {
332 //          java.io.Reader freader = null;
333 //          if (reader != null)
334 //          {
335 //            if (JalviewLite.debug)
336 //            {
337 //              System.err
338 //                      .println("AppletJmol:Trying to reuse existing PDBfile IO parser.");
339 //            }
340 //            // re-use the one we opened earlier
341 //            freader = reader.getReader();
342 //          }
343 //          if (freader == null)
344 //          {
345 //            if (JalviewLite.debug)
346 //            {
347 //              System.err
348 //                      .println("AppletJmol:Creating new PDBfile IO parser.");
349 //            }
350 //            FileParse fp = new FileParse(pdbentry.getFile(), protocol);
351 //            fp.mark();
352 //            // reader = new MCview.PDBfile(fp);
353 //            // could set ID, etc.
354 //            // if (!reader.isValid())
355 //            // {
356 //            // throw new Exception("Invalid datasource.
357 //            // "+reader.getWarningMessage());
358 //            // }
359 //            // fp.reset();
360 //            freader = fp.getReader();
361 //          }
362 //          if (freader == null)
363 //          {
364 //            throw new Exception(MessageManager.getString("exception.invalid_datasource_couldnt_obtain_reader"));
365 //          }
366 //          jmb.viewer.openReader(pdbentry.getFile(), pdbentry.getId(),
367 //                  freader);
368 //        } catch (Exception e)
369 //        {
370 //          // give up!
371 //          System.err.println("Couldn't access pdbentry id="
372 //                  + pdbentry.getId() + " and file=" + pdbentry.getFile()
373 //                  + " using protocol=" + protocol);
374 //          e.printStackTrace();
375 //        }
376 //      }
377 //    }
378 //
379 //    JalviewLite.addFrame(this, jmb.getViewerTitle(), 400, 400);
380 //  }
381 //
382 //  public void loadInline(String string)
383 //  {
384 //    loadedInline = true;
385 //    jmb.loadInline(string);
386 //  }
387 //
388 //  void setChainMenuItems(Vector<String> chains)
389 //  {
390 //    chainMenu.removeAll();
391 //
392 //    MenuItem menuItem = new MenuItem(MessageManager.getString("label.all"));
393 //    menuItem.addActionListener(this);
394 //
395 //    chainMenu.add(menuItem);
396 //
397 //    CheckboxMenuItem menuItemCB;
398 //    for (String ch : chains)
399 //    {
400 //      menuItemCB = new CheckboxMenuItem(ch, true);
401 //      menuItemCB.addItemListener(this);
402 //      chainMenu.add(menuItemCB);
403 //    }
404 //  }
405 //
406 //  boolean allChainsSelected = false;
407 //
408 //  void centerViewer()
409 //  {
410 //    Vector<String> toshow = new Vector<String>();
411 //    for (int i = 0; i < chainMenu.getItemCount(); i++)
412 //    {
413 //      if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
414 //      {
415 //        CheckboxMenuItem item = (CheckboxMenuItem) chainMenu.getItem(i);
416 //        if (item.getState())
417 //        {
418 //          toshow.addElement(item.getLabel());
419 //        }
420 //      }
421 //    }
422 //    jmb.centerViewer(toshow);
423 //  }
424 //
425 //  void closeViewer()
426 //  {
427 //    jmb.closeViewer();
428 //    jmb = null;
429 //    this.setVisible(false);
430 //  }
431 //
432 //  public void actionPerformed(ActionEvent evt)
433 //  {
434 //    if (evt.getSource() == mappingMenuItem)
435 //    {
436 //      CutAndPasteTransfer cap = new CutAndPasteTransfer(
437 //              false, null);
438 //      Frame frame = new Frame();
439 //      frame.add(cap);
440 //
441 //      StringBuffer sb = new StringBuffer();
442 //      try
443 //      {
444 //        cap.setText(jmb.printMappings());
445 //      } catch (OutOfMemoryError ex)
446 //      {
447 //        frame.dispose();
448 //        System.err
449 //                .println("Out of memory when trying to create dialog box with sequence-structure mapping.");
450 //        return;
451 //      }
452 //      JalviewLite.addFrame(frame,
453 //              MessageManager.getString("label.pdb_sequence_mapping"), 550,
454 //              600);
455 //    }
456 //    else if (evt.getSource() == charge)
457 //    {
458 //      setEnabled(charge);
459 //      jmb.colourByCharge();
460 //    }
461 //
462 //    else if (evt.getSource() == chain)
463 //    {
464 //      setEnabled(chain);
465 //      jmb.colourByChain();
466 //    }
467 //    else if (evt.getSource() == zappo)
468 //    {
469 //      setEnabled(zappo);
470 //      jmb.setJalviewColourScheme(new ZappoColourScheme());
471 //    }
472 //    else if (evt.getSource() == taylor)
473 //    {
474 //      setEnabled(taylor);
475 //      jmb.setJalviewColourScheme(new TaylorColourScheme());
476 //    }
477 //    else if (evt.getSource() == hydro)
478 //    {
479 //      setEnabled(hydro);
480 //      jmb.setJalviewColourScheme(new HydrophobicColourScheme());
481 //    }
482 //    else if (evt.getSource() == helix)
483 //    {
484 //      setEnabled(helix);
485 //      jmb.setJalviewColourScheme(new HelixColourScheme());
486 //    }
487 //    else if (evt.getSource() == strand)
488 //    {
489 //      setEnabled(strand);
490 //      jmb.setJalviewColourScheme(new StrandColourScheme());
491 //    }
492 //    else if (evt.getSource() == turn)
493 //    {
494 //      setEnabled(turn);
495 //      jmb.setJalviewColourScheme(new TurnColourScheme());
496 //    }
497 //    else if (evt.getSource() == buried)
498 //    {
499 //      setEnabled(buried);
500 //      jmb.setJalviewColourScheme(new BuriedColourScheme());
501 //    }
502 //    else if (evt.getSource() == purinepyrimidine)
503 //    {
504 //      jmb.setJalviewColourScheme(new PurinePyrimidineColourScheme());
505 //    }
506 //    else if (evt.getSource() == user)
507 //    {
508 //      setEnabled(user);
509 //      new UserDefinedColours(this);
510 //    }
511 //    else if (evt.getSource() == jmolHelp)
512 //    {
513 //      try
514 //      {
515 //        ap.av.applet.getAppletContext().showDocument(
516 //                new java.net.URL(
517 //                        "http://jmol.sourceforge.net/docs/JmolUserGuide/"),
518 //                "jmolHelp");
519 //      } catch (java.net.MalformedURLException ex)
520 //      {
521 //      }
522 //    }
523 //    else
524 //    {
525 //      allChainsSelected = true;
526 //      for (int i = 0; i < chainMenu.getItemCount(); i++)
527 //      {
528 //        if (chainMenu.getItem(i) instanceof CheckboxMenuItem)
529 //        {
530 //          ((CheckboxMenuItem) chainMenu.getItem(i)).setState(true);
531 //        }
532 //      }
533 //
534 //      centerViewer();
535 //      allChainsSelected = false;
536 //    }
537 //  }
538 //
539 //  /**
540 //   * tick or untick the seqColour menu entry or jmoColour entry depending upon
541 //   * if it was selected or not.
542 //   * 
543 //   * @param itm
544 //   */
545 //  private void setEnabled(Object itm) // BH MenuItem not superclass of CheckBoxMenuItem
546 //  {
547 //    jmolColour.setState(itm == jmolColour);
548 //    seqColour.setState(itm == seqColour);
549 //    jmb.setColourBySequence(itm == seqColour);
550 //  }
551 //
552 //  public void itemStateChanged(ItemEvent evt)
553 //  {
554 //    if (evt.getSource() == jmolColour)
555 //    {
556 //      setEnabled(jmolColour);
557 //      jmb.setColourBySequence(false);
558 //    }
559 //    else if (evt.getSource() == seqColour)
560 //    {
561 //      setEnabled(seqColour);
562 //      jmb.colourBySequence(ap);
563 //    }
564 //    else if (!allChainsSelected)
565 //    {
566 //      centerViewer();
567 //    }
568 //  }
569 //
570 //  public void keyPressed(KeyEvent evt)
571 //  {
572 //    if (evt.getKeyCode() == KeyEvent.VK_ENTER && scriptWindow.isVisible())
573 //    {
574 //      jmb.eval(inputLine.getText());
575 //      history.append("\n$ " + inputLine.getText());
576 //      inputLine.setText("");
577 //    }
578 //
579 //  }
580 //
581 //  public void keyTyped(KeyEvent evt)
582 //  {
583 //  }
584 //
585 //  public void keyReleased(KeyEvent evt)
586 //  {
587 //  }
588 //
589 //  public void updateColours(Object source)
590 //  {
591 //    AlignmentPanel panel = (AlignmentPanel) source;
592 //    jmb.colourBySequence(panel);
593 //  }
594 //
595 //  public void updateTitleAndMenus()
596 //  {
597 //    if (jmb.fileLoadingError != null && jmb.fileLoadingError.length() > 0)
598 //    {
599 //      repaint();
600 //      return;
601 //    }
602 //    setChainMenuItems(jmb.chainNames);
603 //    jmb.colourBySequence(ap);
604 //
605 //    setTitle(jmb.getViewerTitle());
606 //  }
607 //
608 //  public void showUrl(String url)
609 //  {
610 //    try
611 //    {
612 //      ap.av.applet.getAppletContext().showDocument(new java.net.URL(url),
613 //              "jmolOutput");
614 //    } catch (java.net.MalformedURLException ex)
615 //    {
616 //    }
617 //  }
618 //
619 //  Panel splitPane = null;
620 //
621 //  public void showConsole(boolean showConsole)
622 //  {
623 //    if (showConsole)
624 //    {
625 //      remove(renderPanel);
626 //      splitPane = new Panel();
627 //
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();
635 //    }
636 //    else
637 //    {
638 //      scriptWindow.setVisible(false);
639 //      remove(splitPane);
640 //      add(renderPanel, BorderLayout.CENTER);
641 //      splitPane = null;
642 //    }
643 //    validate();
644 //  }
645 //
646 //  public float[][] functionXY(String functionName, int x, int y)
647 //  {
648 //    return null;
649 //  }
650 //
651 //  // /End JmolStatusListener
652 //  // /////////////////////////////
653 //
654   class RenderPanel extends Panel
655   {
656     Dimension currentSize = new Dimension();
657
658     public void update(Graphics g)
659     {
660       paint(g);
661     }
662
663     public void PaintComponent(Graphics g)
664     {
665       currentSize = this.getSize();
666
667 //      if (jmb.viewer == null)
668 //      {
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 //        awt2swing.Util.drawString(g, MessageManager.getString("label.retrieving_pdb_data"),
674 //                20, currentSize.height / 2);
675 //      }
676 //      else
677 //      {
678 //        jmb.viewer.renderScreenImage(g, currentSize.width,
679 //                currentSize.height);
680 //      }
681     }
682   }
683 //
684 //  /*
685 //   * @Override public Color getColour(int atomIndex, int pdbResNum, String
686 //   * chain, String pdbId) { return jmb.getColour(atomIndex, pdbResNum, chain,
687 //   * pdbId); }
688 //   * 
689 //   * @Override public String[] getPdbFile() { return jmb.getPdbFile(); }
690 //   * 
691 //   * @Override public void highlightAtom(int atomIndex, int pdbResNum, String
692 //   * chain, String pdbId) { jmb.highlightAtom(atomIndex, pdbResNum, chain,
693 //   * pdbId);
694 //   * 
695 //   * }
696 //   * 
697 //   * @Override public void mouseOverStructure(int atomIndex, String strInfo) {
698 //   * jmb.mouseOverStructure(atomIndex, strInfo);
699 //   * 
700 //   * }
701 //   */
702 //  public void setJalviewColourScheme(UserColourScheme ucs)
703 //  {
704 //    jmb.setJalviewColourScheme(ucs);
705 //  }
706 //
707 //  public AlignmentPanel getAlignmentPanelFor(AlignmentI alignment)
708 //  {
709 //    for (int i = 0; i < _aps.size(); i++)
710 //    {
711 //      if (_aps.get(i).av.getAlignment() == alignment)
712 //      {
713 //        return (_aps.get(i));
714 //      }
715 //    }
716 //    return ap;
717 //  }
718 }