/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.appletgui; import jalview.bin.JalviewLite; import jalview.datamodel.AlignmentI; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; import jalview.io.AppletFormatAdapter; import jalview.io.FileParse; import jalview.schemes.BuriedColourScheme; import jalview.schemes.HelixColourScheme; import jalview.schemes.HydrophobicColourScheme; import jalview.schemes.PurinePyrimidineColourScheme; import jalview.schemes.StrandColourScheme; import jalview.schemes.TaylorColourScheme; import jalview.schemes.TurnColourScheme; import jalview.schemes.UserColourScheme; import jalview.schemes.ZappoColourScheme; import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; import java.awt.BorderLayout; import awt2swing.CheckboxMenuItem; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import awt2swing.Frame; import java.awt.Graphics; import awt2swing.Menu; import awt2swing.MenuBar; import awt2swing.MenuItem; import awt2swing.Panel; import awt2swing.TextArea; import awt2swing.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Vector; public class AppletJmol //extends EmbmenuFrame implements // KeyListener, ActionListener, ItemListener { Panel scriptWindow; TextField inputLine; TextArea history; RenderPanel renderPanel; AlignmentPanel ap; List _aps = new ArrayList(); // remove? never // added to String fileLoadingError; boolean loadedInline; // boolean colourBySequence = true; FeatureRenderer fr = null; AppletJmolBinding jmb; public AppletJmol(PDBEntry entry, SequenceI[] sequenceIs, Object object, AlignmentPanel ap2, String uRL) { // TODO Auto-generated constructor stub } public void setJalviewColourScheme(UserColourScheme ucs) { // TODO Auto-generated method stub } // Menu fileMenu = new Menu(MessageManager.getString("action.file")); // // Menu viewMenu = new Menu(MessageManager.getString("action.view")); // // Menu coloursMenu = new Menu(MessageManager.getString("action.colour")); // // Menu chainMenu = new Menu(MessageManager.getString("action.show_chain")); // // Menu helpMenu = new Menu(MessageManager.getString("action.help")); // // MenuItem mappingMenuItem = new MenuItem( // MessageManager.getString("label.view_mapping")); // // CheckboxMenuItem seqColour = new CheckboxMenuItem( // MessageManager.getString("action.by_sequence"), true); // // CheckboxMenuItem jmolColour = new CheckboxMenuItem( // MessageManager.getString("action.using_jmol"), false); // // MenuItem chain = new MenuItem(MessageManager.getString("action.by_chain")); // // MenuItem charge = new MenuItem( // MessageManager.getString("label.charge_cysteine")); // // MenuItem zappo = new MenuItem(MessageManager.getString("label.zappo")); // // MenuItem taylor = new MenuItem(MessageManager.getString("label.taylor")); // // MenuItem hydro = new MenuItem( // MessageManager.getString("label.hydrophobicity")); // // MenuItem helix = new MenuItem( // MessageManager.getString("label.helix_propensity")); // // MenuItem strand = new MenuItem( // MessageManager.getString("label.strand_propensity")); // // MenuItem turn = new MenuItem( // MessageManager.getString("label.turn_propensity")); // // MenuItem buried = new MenuItem( // MessageManager.getString("label.buried_index")); // // MenuItem purinepyrimidine = new MenuItem( // MessageManager.getString("label.purine_pyrimidine")); // // MenuItem user = new MenuItem( // MessageManager.getString("label.user_defined_colours")); // // MenuItem jmolHelp = new MenuItem( // MessageManager.getString("label.jmol_help")); // // /** // * datasource protocol for access to PDBEntry // */ // String protocol = null; // // /** // * Load a bunch of pdb entries associated with sequences in the alignment and // * display them - aligning them if necessary. // * // * @param pdbentries // * each pdb file (at least one needed) // * @param boundseqs // * each set of sequences for each pdb file (must match number of pdb // * files) // * @param boundchains // * the target pdb chain corresponding with each sequence associated // * with each pdb file (may be null at any level) // * @param align // * true/false // * @param ap // * associated alignment // * @param protocol // * how to get pdb data // */ // public AppletJmol(PDBEntry[] pdbentries, SequenceI[][] boundseqs, // String[][] boundchains, boolean align, AlignmentPanel ap, // String protocol) // { // throw new Error(MessageManager.getString("error.not_yet_implemented")); // } // // public AppletJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains, // AlignmentPanel ap, String protocol) // { // this.ap = ap; // jmb = new AppletJmolBinding(this, ap.getStructureSelectionManager(), // new PDBEntry[] // { pdbentry }, new SequenceI[][] // { seq }, new String[][] // { chains }, protocol); // jmb.setColourBySequence(true); // if (pdbentry.getId() == null || pdbentry.getId().length() < 1) // { // if (protocol.equals(AppletFormatAdapter.PASTE)) // { // pdbentry.setId("PASTED PDB" // + (chains == null ? "_" : chains.toString())); // } // else // { // pdbentry.setId(pdbentry.getFile()); // } // } // // if (JalviewLite.debug) // { // System.err // .println("AppletJmol: PDB ID is '" + pdbentry.getId() + "'"); // } // // String alreadyMapped = StructureSelectionManager // .getStructureSelectionManager(ap.av.applet) // .alreadyMappedToFile(pdbentry.getId()); // MCview.PDBfile reader = null; // if (alreadyMapped != null) // { // reader = StructureSelectionManager.getStructureSelectionManager( // ap.av.applet).setMapping(seq, chains, pdbentry.getFile(), // protocol); // // PROMPT USER HERE TO ADD TO NEW OR EXISTING VIEW? // // FOR NOW, LETS JUST OPEN A NEW WINDOW // } // MenuBar menuBar = new MenuBar(); // menuBar.add(fileMenu); // fileMenu.add(mappingMenuItem); // menuBar.add(viewMenu); // mappingMenuItem.addActionListener(this); // viewMenu.add(chainMenu); // menuBar.add(coloursMenu); // menuBar.add(helpMenu); // // charge.addActionListener(this); // hydro.addActionListener(this); // chain.addActionListener(this); // seqColour.addItemListener(this); // jmolColour.addItemListener(this); // zappo.addActionListener(this); // taylor.addActionListener(this); // helix.addActionListener(this); // strand.addActionListener(this); // turn.addActionListener(this); // buried.addActionListener(this); // purinepyrimidine.addActionListener(this); // user.addActionListener(this); // // jmolHelp.addActionListener(this); // // coloursMenu.add(seqColour); // coloursMenu.add(chain); // coloursMenu.add(charge); // coloursMenu.add(zappo); // coloursMenu.add(taylor); // coloursMenu.add(hydro); // coloursMenu.add(helix); // coloursMenu.add(strand); // coloursMenu.add(turn); // coloursMenu.add(buried); // coloursMenu.add(purinepyrimidine); // coloursMenu.add(user); // coloursMenu.add(jmolColour); // helpMenu.add(jmolHelp); // this.setLayout(new BorderLayout()); // // setMenuBar(menuBar); // // renderPanel = new RenderPanel(); // embedMenuIfNeeded(renderPanel); // this.add(renderPanel, BorderLayout.CENTER); // scriptWindow = new Panel(); // scriptWindow.setVisible(false); // // this.add(scriptWindow, BorderLayout.SOUTH); // // try // { // jmb.allocateViewer(renderPanel, true, ap.av.applet.getName() // + "_jmol_", ap.av.applet.getDocumentBase(), // ap.av.applet.getCodeBase(), "-applet", scriptWindow, null); // } catch (Exception e) // { // System.err // .println("Couldn't create a jmol viewer. Args to allocate viewer were:\nDocumentBase=" // + ap.av.applet.getDocumentBase() // + "\nCodebase=" // + ap.av.applet.getCodeBase()); // e.printStackTrace(); // dispose(); // return; // } // // jmb.newJmolPopup(true, "Jmol", true); // // this.addWindowListener(new WindowAdapter() // { // public void windowClosing(WindowEvent evt) // { // closeViewer(); // } // }); // if (pdbentry.getProperty() == null) // { // pdbentry.setProperty(new Hashtable()); // pdbentry.getProperty().put("protocol", protocol); // } // if (pdbentry.getFile() != null) // { // // import structure data from pdbentry.getFile based on given protocol // if (protocol.equals(AppletFormatAdapter.PASTE)) // { // // TODO: JAL-623 : correctly record file contents for matching up later // // pdbentry.getProperty().put("pdbfilehash",""+pdbentry.getFile().hashCode()); // loadInline(pdbentry.getFile()); // } // else if (protocol.equals(AppletFormatAdapter.FILE) // || protocol.equals(AppletFormatAdapter.URL)) // { // jmb.viewer.openFile(pdbentry.getFile()); // } // else // { // // probably CLASSLOADER based datasource.. // // Try and get a reader on the datasource, and pass that to Jmol // try // { // java.io.Reader freader = null; // if (reader != null) // { // if (JalviewLite.debug) // { // System.err // .println("AppletJmol:Trying to reuse existing PDBfile IO parser."); // } // // re-use the one we opened earlier // freader = reader.getReader(); // } // if (freader == null) // { // if (JalviewLite.debug) // { // System.err // .println("AppletJmol:Creating new PDBfile IO parser."); // } // FileParse fp = new FileParse(pdbentry.getFile(), protocol); // fp.mark(); // // reader = new MCview.PDBfile(fp); // // could set ID, etc. // // if (!reader.isValid()) // // { // // throw new Exception("Invalid datasource. // // "+reader.getWarningMessage()); // // } // // fp.reset(); // freader = fp.getReader(); // } // if (freader == null) // { // throw new Exception(MessageManager.getString("exception.invalid_datasource_couldnt_obtain_reader")); // } // jmb.viewer.openReader(pdbentry.getFile(), pdbentry.getId(), // freader); // } catch (Exception e) // { // // give up! // System.err.println("Couldn't access pdbentry id=" // + pdbentry.getId() + " and file=" + pdbentry.getFile() // + " using protocol=" + protocol); // e.printStackTrace(); // } // } // } // // JalviewLite.addFrame(this, jmb.getViewerTitle(), 400, 400); // } // // public void loadInline(String string) // { // loadedInline = true; // jmb.loadInline(string); // } // // void setChainMenuItems(Vector chains) // { // chainMenu.removeAll(); // // MenuItem menuItem = new MenuItem(MessageManager.getString("label.all")); // menuItem.addActionListener(this); // // chainMenu.add(menuItem); // // CheckboxMenuItem menuItemCB; // for (String ch : chains) // { // menuItemCB = new CheckboxMenuItem(ch, true); // menuItemCB.addItemListener(this); // chainMenu.add(menuItemCB); // } // } // // boolean allChainsSelected = false; // // void centerViewer() // { // Vector toshow = new Vector(); // for (int i = 0; i < chainMenu.getItemCount(); i++) // { // if (chainMenu.getItem(i) instanceof CheckboxMenuItem) // { // CheckboxMenuItem item = (CheckboxMenuItem) chainMenu.getItem(i); // if (item.getState()) // { // toshow.addElement(item.getLabel()); // } // } // } // jmb.centerViewer(toshow); // } // // void closeViewer() // { // jmb.closeViewer(); // jmb = null; // this.setVisible(false); // } // // public void actionPerformed(ActionEvent evt) // { // if (evt.getSource() == mappingMenuItem) // { // CutAndPasteTransfer cap = new CutAndPasteTransfer( // false, null); // Frame frame = new Frame(); // frame.add(cap); // // StringBuffer sb = new StringBuffer(); // try // { // cap.setText(jmb.printMappings()); // } catch (OutOfMemoryError ex) // { // frame.dispose(); // System.err // .println("Out of memory when trying to create dialog box with sequence-structure mapping."); // return; // } // JalviewLite.addFrame(frame, // MessageManager.getString("label.pdb_sequence_mapping"), 550, // 600); // } // else if (evt.getSource() == charge) // { // setEnabled(charge); // jmb.colourByCharge(); // } // // else if (evt.getSource() == chain) // { // setEnabled(chain); // jmb.colourByChain(); // } // else if (evt.getSource() == zappo) // { // setEnabled(zappo); // jmb.setJalviewColourScheme(new ZappoColourScheme()); // } // else if (evt.getSource() == taylor) // { // setEnabled(taylor); // jmb.setJalviewColourScheme(new TaylorColourScheme()); // } // else if (evt.getSource() == hydro) // { // setEnabled(hydro); // jmb.setJalviewColourScheme(new HydrophobicColourScheme()); // } // else if (evt.getSource() == helix) // { // setEnabled(helix); // jmb.setJalviewColourScheme(new HelixColourScheme()); // } // else if (evt.getSource() == strand) // { // setEnabled(strand); // jmb.setJalviewColourScheme(new StrandColourScheme()); // } // else if (evt.getSource() == turn) // { // setEnabled(turn); // jmb.setJalviewColourScheme(new TurnColourScheme()); // } // else if (evt.getSource() == buried) // { // setEnabled(buried); // jmb.setJalviewColourScheme(new BuriedColourScheme()); // } // else if (evt.getSource() == purinepyrimidine) // { // jmb.setJalviewColourScheme(new PurinePyrimidineColourScheme()); // } // else if (evt.getSource() == user) // { // setEnabled(user); // new UserDefinedColours(this); // } // else if (evt.getSource() == jmolHelp) // { // try // { // ap.av.applet.getAppletContext().showDocument( // new java.net.URL( // "http://jmol.sourceforge.net/docs/JmolUserGuide/"), // "jmolHelp"); // } catch (java.net.MalformedURLException ex) // { // } // } // else // { // allChainsSelected = true; // for (int i = 0; i < chainMenu.getItemCount(); i++) // { // if (chainMenu.getItem(i) instanceof CheckboxMenuItem) // { // ((CheckboxMenuItem) chainMenu.getItem(i)).setState(true); // } // } // // centerViewer(); // allChainsSelected = false; // } // } // // /** // * tick or untick the seqColour menu entry or jmoColour entry depending upon // * if it was selected or not. // * // * @param itm // */ // private void setEnabled(Object itm) // BH MenuItem not superclass of CheckBoxMenuItem // { // jmolColour.setState(itm == jmolColour); // seqColour.setState(itm == seqColour); // jmb.setColourBySequence(itm == seqColour); // } // // public void itemStateChanged(ItemEvent evt) // { // if (evt.getSource() == jmolColour) // { // setEnabled(jmolColour); // jmb.setColourBySequence(false); // } // else if (evt.getSource() == seqColour) // { // setEnabled(seqColour); // jmb.colourBySequence(ap); // } // else if (!allChainsSelected) // { // centerViewer(); // } // } // // public void keyPressed(KeyEvent evt) // { // if (evt.getKeyCode() == KeyEvent.VK_ENTER && scriptWindow.isVisible()) // { // jmb.eval(inputLine.getText()); // history.append("\n$ " + inputLine.getText()); // inputLine.setText(""); // } // // } // // public void keyTyped(KeyEvent evt) // { // } // // public void keyReleased(KeyEvent evt) // { // } // // public void updateColours(Object source) // { // AlignmentPanel panel = (AlignmentPanel) source; // jmb.colourBySequence(panel); // } // // public void updateTitleAndMenus() // { // if (jmb.fileLoadingError != null && jmb.fileLoadingError.length() > 0) // { // repaint(); // return; // } // setChainMenuItems(jmb.chainNames); // jmb.colourBySequence(ap); // // setTitle(jmb.getViewerTitle()); // } // // public void showUrl(String url) // { // try // { // ap.av.applet.getAppletContext().showDocument(new java.net.URL(url), // "jmolOutput"); // } catch (java.net.MalformedURLException ex) // { // } // } // // Panel splitPane = null; // // public void showConsole(boolean showConsole) // { // if (showConsole) // { // remove(renderPanel); // splitPane = new Panel(); // // splitPane.setLayout(new java.awt.GridLayout(2, 1)); // splitPane.add(renderPanel); // splitPane.add(scriptWindow); // scriptWindow.setVisible(true); // this.add(splitPane, BorderLayout.CENTER); // splitPane.setVisible(true); // splitPane.validate(); // } // else // { // scriptWindow.setVisible(false); // remove(splitPane); // add(renderPanel, BorderLayout.CENTER); // splitPane = null; // } // validate(); // } // // public float[][] functionXY(String functionName, int x, int y) // { // return null; // } // // // /End JmolStatusListener // // ///////////////////////////// // class RenderPanel extends Panel { Dimension currentSize = new Dimension(); public void update(Graphics g) { paint(g); } public void PaintComponent(Graphics g) { currentSize = this.getSize(); // if (jmb.viewer == null) // { // g.setColor(Color.black); // g.fillRect(0, 0, currentSize.width, currentSize.height); // g.setColor(Color.white); // g.setFont(new Font("Verdana", Font.BOLD, 14)); // awt2swing.Util.drawString(g, MessageManager.getString("label.retrieving_pdb_data"), // 20, currentSize.height / 2); // } // else // { // jmb.viewer.renderScreenImage(g, currentSize.width, // currentSize.height); // } } } // // /* // * @Override public Color getColour(int atomIndex, int pdbResNum, String // * chain, String pdbId) { return jmb.getColour(atomIndex, pdbResNum, chain, // * pdbId); } // * // * @Override public String[] getPdbFile() { return jmb.getPdbFile(); } // * // * @Override public void highlightAtom(int atomIndex, int pdbResNum, String // * chain, String pdbId) { jmb.highlightAtom(atomIndex, pdbResNum, chain, // * pdbId); // * // * } // * // * @Override public void mouseOverStructure(int atomIndex, String strInfo) { // * jmb.mouseOverStructure(atomIndex, strInfo); // * // * } // */ // public void setJalviewColourScheme(UserColourScheme ucs) // { // jmb.setJalviewColourScheme(ucs); // } // // public AlignmentPanel getAlignmentPanelFor(AlignmentI alignment) // { // for (int i = 0; i < _aps.size(); i++) // { // if (_aps.get(i).av.getAlignment() == alignment) // { // return (_aps.get(i)); // } // } // return ap; // } }