X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FJalviewLite.java;h=c7cc4f3b990aa6c163cfc6c6d3bb98c6b9c5e75d;hb=d6ad9619070895df810de190dd202b1698632438;hp=c9ec3918e3f65231aced553aeaf2cc9372c6ed6d;hpb=9344c308a62c48e2ddedd12247edab74e581c2e7;p=jalview.git diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index c9ec391..c7cc4f3 100755 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -1,249 +1,1034 @@ -/* -* Jalview - A Sequence Alignment Editor and Viewer -* Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle -* -* This program 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 2 -* of the License, or (at your option) any later version. -* -* This program 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 this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA -*/ -package jalview.bin; - -import jalview.appletgui.AlignFrame; - -import jalview.datamodel.*; - -import jalview.io.*; - -import java.applet.*; - -import java.awt.*; -import java.awt.event.*; - - -/** - * Jalview Applet. Runs in Java 1.18 runtime - * - * @author $author$ - * @version $Revision$ - */ -public class JalviewLite extends Applet -{ - static int lastFrameX = 200; - static int lastFrameY = 200; - static Applet applet; - boolean fileFound = true; - String file = "No file"; - Button launcher = new Button("Start Jalview"); - - /** - * init method for Jalview Applet - */ - public void init() - { - applet = this; - - int r = 255; - int g = 255; - int b = 255; - String param = getParameter("RGB"); - - if (param != null) - { - try - { - r = Integer.parseInt(param.substring(0, 2), 16); - g = Integer.parseInt(param.substring(2, 4), 16); - b = Integer.parseInt(param.substring(4, 6), 16); - } - catch (Exception ex) - { - r = 255; - g = 255; - b = 255; - } - } - - this.setBackground(new Color(r, g, b)); - - file = getParameter("file"); - - if (file != null) - { - add(launcher); - file = applet.getCodeBase() + file; - launcher.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(ActionEvent e) - { - String format = jalview.io.IdentifyFile.Identify(file, - "URL"); - LoadFile(file, "URL", format); - } - }); - } - else - { - file = "NO FILE"; - fileFound = false; - } - } - - public static void main(String [] args) - { - if(args.length!=1) - { - System.out.println("\nUsage: java -jar jalviewApplet.jar fileName\n"); - System.exit(1); - } - - String format = jalview.io.IdentifyFile.Identify(args[0],"File"); - SequenceI[] sequences = FormatAdapter.readFile(args[0], "File", format); - - if ( (sequences != null) && (sequences.length > 0)) - { - AlignFrame af = new AlignFrame(new Alignment(sequences), null); - addFrame(af, args[0], AlignFrame.NEW_WINDOW_WIDTH, - AlignFrame.NEW_WINDOW_HEIGHT); - af.statusBar.setText("Successfully loaded file " + args[0]); - } - } - - /** - * Displays the given URL in a new browser window - * - * @param url URL to display in browser window. - *
New window will be named "HELP_WINDOW" - */ - public static void showURL(String url) - { - showURL(url, "HELP"); - } - - public static void showURL(String url, String target) - { - if(applet==null) - { - System.out.println("Not running as applet - no browser available."); - } - else - { - try - { - applet.getAppletContext().showDocument(new java.net.URL(url), - target); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - } - - - /** - * Starts a new LoadingThread for loading an alignment file - * - * @param file file name including full path to file - * @param protocol file or URL or paste - * @param format Fasta, Clustal, PFAM, MSF, PIR, BLC, Jalview - */ - public void LoadFile(String file, String protocol, String format) - { - LoadingThread loader = new LoadingThread(file, protocol, format, this); - loader.start(); - } - - /** - * Initialises and displays a new java.awt.Frame - * - * @param frame java.awt.Frame to be displayed - * @param title title of new frame - * @param width width if new frame - * @param height height of new frame - */ - public static void addFrame(final Frame frame, String title, int width, - int height) - { - frame.setLocation(lastFrameX, lastFrameY); - lastFrameX += 40; - lastFrameY += 40; - frame.setSize(width, height); - frame.setTitle(title); - frame.addWindowListener(new WindowAdapter() - { - public void windowClosing(WindowEvent e) - { - frame.dispose(); - } - }); - frame.setVisible(true); - } - - /** - * This paints the background surrounding the "Launch Jalview button" - *
- *
If file given in parameter not found, displays error message - * - * @param g graphics context - */ - public void paint(Graphics g) - { - if (!fileFound) - { - g.setColor(new Color(200, 200, 200)); - g.setColor(Color.cyan); - g.fillRect(0, 0, getSize().width, getSize().height); - g.setColor(Color.red); - g.drawString("Jalview can't open file", 5, 15); - g.drawString("\"" + file + "\"", 5, 30); - } - } - - class LoadingThread extends Thread - { - String file; - String protocol; - String format; - JalviewLite jlapplet; - - public LoadingThread(String file, String protocol, String format, - JalviewLite applet) - { - this.file = file; - this.protocol = protocol; - this.format = format; - this.jlapplet = applet; - } - - public void run() - { - SequenceI[] sequences = null; - sequences = FormatAdapter.readFile(file, protocol, format); - - if ((sequences != null) && (sequences.length > 0)) - { - AlignFrame af = new AlignFrame(new Alignment(sequences), - jlapplet); - addFrame(af, file, AlignFrame.NEW_WINDOW_WIDTH, - AlignFrame.NEW_WINDOW_HEIGHT); - af.statusBar.setText("Successfully loaded file " + file); - } - else - { - fileFound = false; - remove(launcher); - repaint(); - } - } - } -} +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package jalview.bin; + +import java.applet.*; + +import java.awt.*; +import java.awt.event.*; +import java.util.*; + +import jalview.appletgui.*; +import jalview.datamodel.*; +import jalview.io.*; + +/** + * Jalview Applet. Runs in Java 1.18 runtime + * + * @author $author$ + * @version $Revision$ + */ +public class JalviewLite + extends Applet +{ + + + + /////////////////////////////////////////// + //The following public methods maybe called + //externally, eg via javascript in HTML page + /** + * @return String list of selected sequence IDs, each terminated by "¬" (¬) + */ + public String getSelectedSequences() + { + return getSelectedSequencesFrom(getDefaultTargetFrame()); + } + /** + * @param sep separator string or null for default + * @return String list of selected sequence IDs, each terminated by sep or ("¬" as default) + */ + public String getSelectedSequences(String sep) + { + return getSelectedSequencesFrom(getDefaultTargetFrame(), sep); + } + /** + * @param alf alignframe containing selection + * @return String list of selected sequence IDs, each terminated by "¬" + * + */ + public String getSelectedSequencesFrom(AlignFrame alf) + { + return getSelectedSequencesFrom(alf, "¬"); + } + /** + * get list of selected sequence IDs separated by given separator + * @param alf window containing selection + * @param sep separator string to use - default is "¬" + * @return String list of selected sequence IDs, each terminated by the given separator + */ + public String getSelectedSequencesFrom(AlignFrame alf, String sep) + { + StringBuffer result = new StringBuffer(""); + if (sep==null || sep.length()==0) + { + sep = "¬"; + } + if (alf.viewport.getSelectionGroup() != null) + { + SequenceI[] seqs = alf.viewport.getSelectionGroup(). + getSequencesInOrder( + alf.viewport.getAlignment()); + + for (int i = 0; i < seqs.length; i++) + { + result.append(seqs[i].getName()); + result.append(sep); + } + } + + return result.toString(); + } + + /** + * get sequences selected in current alignFrame and return their alignment in format 'format' either with or without suffix + * @param alf - where selection is + * @param format - format of alignment file + * @param suffix - "true" to append /start-end string to each sequence ID + * @return selected sequences as flat file or empty string if there was no current selection + */ + public String getSelectedSequencesAsAlignment(String format, String suffix) { + return getSelectedSequencesAsAlignmentFrom(currentAlignFrame, format, suffix); + } + + /** + * get sequences selected in alf and return their alignment in format 'format' either with or without suffix + * @param alf - where selection is + * @param format - format of alignment file + * @param suffix - "true" to append /start-end string to each sequence ID + * @return selected sequences as flat file or empty string if there was no current selection + */ + public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf, String format, String suffix) + { + try + { + boolean seqlimits = suffix.equalsIgnoreCase("true"); + if (alf.viewport.getSelectionGroup()!=null) + { + String reply = new AppletFormatAdapter().formatSequences(format, + new Alignment(alf.viewport.getSelectionAsNewSequence()), seqlimits); + return reply; + } + } + catch (Exception ex) + { + ex.printStackTrace(); + return "Error retrieving alignment in " + format + " format. "; + } + return ""; + } + + public String getAlignment(String format) + { + return getAlignmentFrom(getDefaultTargetFrame(), format, "true"); + } + public String getAlignmentFrom(AlignFrame alf, String format) + { + return getAlignmentFrom(alf, format, "true"); + } + public String getAlignment(String format, String suffix) + { + return getAlignmentFrom(getDefaultTargetFrame(), format, suffix); + } + public String getAlignmentFrom(AlignFrame alf, String format, String suffix) + { + try + { + boolean seqlimits = suffix.equalsIgnoreCase("true"); + + String reply = new AppletFormatAdapter().formatSequences(format, + alf.viewport.getAlignment(), seqlimits); + return reply; + } + catch (Exception ex) + { + ex.printStackTrace(); + return "Error retrieving alignment in " + format + " format. "; + } + } + + public void loadAnnotation(String annotation) + { + loadAnnotationFrom(getDefaultTargetFrame(), annotation); + } + public void loadAnnotationFrom(AlignFrame alf, String annotation) + { + if (new AnnotationFile().readAnnotationFile( + alf.getAlignViewport().getAlignment(), annotation, + AppletFormatAdapter.PASTE)) + { + alf.alignPanel.fontChanged(); + alf.alignPanel.setScrollValues(0, 0); + } + else + { + alf.parseFeaturesFile(annotation, AppletFormatAdapter.PASTE); + } + } + + public String getFeatures(String format) + { + return getFeaturesFrom(getDefaultTargetFrame(), format); + } + public String getFeaturesFrom(AlignFrame alf, String format) + { + return alf.outputFeatures(false, format); + } + public String getAnnotation() + { + return getAnnotationFrom(getDefaultTargetFrame()); + } + public String getAnnotationFrom(AlignFrame alf) + { + return alf.outputAnnotations(false); + } + public AlignFrame newView() + { + return newViewFrom(getDefaultTargetFrame()); + } + public AlignFrame newView(String name) + { + return newViewFrom(getDefaultTargetFrame(), name); + } + + public AlignFrame newViewFrom(AlignFrame alf) + { + return alf.newView(null); + } + public AlignFrame newViewFrom(AlignFrame alf, String name) + { + return alf.newView(name); + } + /** + * + * @param text alignment file as a string + * @param title window title + * @return null or new alignment frame + */ + public AlignFrame loadAlignment(String text, String title) + { + Alignment al = null; + String format = new IdentifyFile().Identify(text, AppletFormatAdapter.PASTE); + try + { + al = new AppletFormatAdapter().readFile(text, + AppletFormatAdapter.PASTE, + format); + if (al.getHeight() > 0) + { + return new AlignFrame(al, this, title, false); + } + } + catch (java.io.IOException ex) + { + ex.printStackTrace(); + } + return null; + } + + //////////////////////////////////////////////// + //////////////////////////////////////////////// + + + + static int lastFrameX = 200; + static int lastFrameY = 200; + boolean fileFound = true; + String file = "No file"; + Button launcher = new Button("Start Jalview"); + + /** + * The currentAlignFrame is static, it will change + * if and when the user selects a new window. + * Note that it will *never* point back to the embedded AlignFrame + * if the applet is started as embedded on the page and then afterwards a new view is created. + */ + public static AlignFrame currentAlignFrame; + + /** + * This is the first frame to be displayed, and does not change. + * API calls will default to this instance if currentAlignFrame is null. + */ + AlignFrame initialAlignFrame; + + boolean embedded = false; + + public boolean jmolAvailable = false; + public static boolean debug; + + /** + * init method for Jalview Applet + */ + public void init() + { + String dbg = getParameter("debug"); + if (dbg!=null) + { + debug = dbg.toLowerCase().equals("true"); + } + /** + * get the separator parameter if present + */ + String sep = getParameter("separator"); + if (sep!=null) + { + if (sep.length()>0) + { separator = sep; + if (debug) + { + System.err.println("Separator set to '"+separator+"'"); + } + } else { + throw new Error("Invalid separator parameter - must be non-zero length"); + } + } + int r = 255; + int g = 255; + int b = 255; + String param = getParameter("RGB"); + + if (param != null) + { + try + { + r = Integer.parseInt(param.substring(0, 2), 16); + g = Integer.parseInt(param.substring(2, 4), 16); + b = Integer.parseInt(param.substring(4, 6), 16); + } + catch (Exception ex) + { + r = 255; + g = 255; + b = 255; + } + } + + param = getParameter("label"); + if (param != null) + { + launcher.setLabel(param); + } + + this.setBackground(new Color(r, g, b)); + + file = getParameter("file"); + + if (file == null) + { + //Maybe the sequences are added as parameters + StringBuffer data = new StringBuffer("PASTE"); + int i = 1; + while ( (file = getParameter("sequence" + i)) != null) + { + data.append(file.toString() + "\n"); + i++; + } + if (data.length() > 5) + { + file = data.toString(); + } + } + + LoadJmolThread jmolAvailable = new LoadJmolThread(); + jmolAvailable.start(); + + final JalviewLite applet = this; + if (getParameter("embedded") != null + && getParameter("embedded").equalsIgnoreCase("true")) + { + embedded = true; + LoadingThread loader = new LoadingThread(file, applet); + loader.start(); + } + else if (file != null) + { + add(launcher); + + launcher.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(ActionEvent e) + { + LoadingThread loader = new LoadingThread(file, + applet); + loader.start(); + } + }); + } + else + { + file = "NO FILE"; + fileFound = false; + } + } + + + /** + * Initialises and displays a new java.awt.Frame + * + * @param frame java.awt.Frame to be displayed + * @param title title of new frame + * @param width width if new frame + * @param height height of new frame + */ + public static void addFrame(final Frame frame, String title, int width, + int height) + { + frame.setLocation(lastFrameX, lastFrameY); + lastFrameX += 40; + lastFrameY += 40; + frame.setSize(width, height); + frame.setTitle(title); + frame.addWindowListener(new WindowAdapter() + { + public void windowClosing(WindowEvent e) + { + if (frame instanceof AlignFrame) + { + ( (AlignFrame) frame).closeMenuItem_actionPerformed(); + } + if (currentAlignFrame == frame) + { + currentAlignFrame = null; + } + lastFrameX -= 40; + lastFrameY -= 40; + if (frame instanceof EmbmenuFrame) + { + ((EmbmenuFrame) frame).destroyMenus(); + } + frame.setMenuBar(null); + frame.dispose(); + } + + public void windowActivated(WindowEvent e) + { + if (frame instanceof AlignFrame) + { + currentAlignFrame = (AlignFrame) frame; + if (debug) + { + System.err.println("Activated window "+frame); + } + } + // be good. + super.windowActivated(e); + } + /* Probably not necessary to do this - see TODO above. + * (non-Javadoc) + * @see java.awt.event.WindowAdapter#windowDeactivated(java.awt.event.WindowEvent) + * + public void windowDeactivated(WindowEvent e) + { + if (currentAlignFrame == frame) + { + currentAlignFrame = null; + if (debug) + { + System.err.println("Deactivated window "+frame); + } + } + super.windowDeactivated(e); + } + */ + }); + frame.setVisible(true); + } + + /** + * This paints the background surrounding the "Launch Jalview button" + *
+ *
If file given in parameter not found, displays error message + * + * @param g graphics context + */ + public void paint(Graphics g) + { + if (!fileFound) + { + g.setColor(new Color(200, 200, 200)); + g.setColor(Color.cyan); + g.fillRect(0, 0, getSize().width, getSize().height); + g.setColor(Color.red); + g.drawString("Jalview can't open file", 5, 15); + g.drawString("\"" + file + "\"", 5, 30); + } + else if (embedded) + { + g.setColor(Color.black); + g.setFont(new Font("Arial", Font.BOLD, 24)); + g.drawString("Jalview Applet", 50, this.getSize().height / 2 - 30); + g.drawString("Loading Data...", 50, this.getSize().height / 2); + } + } + + + class LoadJmolThread extends Thread + { + public void run() + { + try + { + if (!System.getProperty("java.version").startsWith("1.1")) + { + Class.forName("org.jmol.adapter.smarter.SmarterJmolAdapter"); + jmolAvailable = true; + } + } + catch (java.lang.ClassNotFoundException ex) + { + System.out.println("Jmol not available - Using MCview for structures"); + } + } + } + + + class LoadingThread + extends Thread + { + /** + * State variable: File source + */ + String file; + /** + * State variable: protocol for access to file source + */ + String protocol; + /** + * State variable: format of file source + */ + String format; + JalviewLite applet; + private void dbgMsg(String msg) + { + if (applet.debug) + { + System.err.println(msg); + } + } + /** + * update the protocol state variable for accessing the datasource + * located by file. + * @param file + * @return possibly updated datasource string + */ + public String setProtocolState(String file) + { + if (file.startsWith("PASTE")) + { + file = file.substring(5); + protocol = AppletFormatAdapter.PASTE; + } + else if (inArchive(file)) + { + protocol = AppletFormatAdapter.CLASSLOADER; + } + else + { + file = addProtocol(file); + protocol = AppletFormatAdapter.URL; + } + dbgMsg("Protocol identified as '"+protocol+"'"); + return file; + } + public LoadingThread(String _file, + JalviewLite _applet) + { + dbgMsg("Loading thread started with:\n>>file\n"+_file+">>endfile"); + file = setProtocolState(_file); + + format = new jalview.io.IdentifyFile().Identify(file, protocol); + dbgMsg("File identified as '"+format+"'"); + applet = _applet; + } + + public void run() + { + startLoading(); + } + + private void startLoading() + { + dbgMsg("Loading started."); + Alignment al = null; + try + { + al = new AppletFormatAdapter().readFile(file, protocol, + format); + } + catch (java.io.IOException ex) + { + dbgMsg("File load exception."); + ex.printStackTrace(); + } + if ( (al != null) && (al.getHeight() > 0)) + { + dbgMsg("Successfully loaded file."); + initialAlignFrame = new AlignFrame(al, + applet, + file, + embedded); + // update the focus. + currentAlignFrame = initialAlignFrame; + + if (protocol == jalview.io.AppletFormatAdapter.PASTE) + { + currentAlignFrame.setTitle("Sequences from " + getDocumentBase()); + } + + currentAlignFrame.statusBar.setText("Successfully loaded file " + file); + + String treeFile = applet.getParameter("tree"); + if (treeFile == null) + { + treeFile = applet.getParameter("treeFile"); + } + + if (treeFile != null) + { + try + { + treeFile = setProtocolState(treeFile); + /*if (inArchive(treeFile)) + { + protocol = AppletFormatAdapter.CLASSLOADER; + } + else + { + protocol = AppletFormatAdapter.URL; + treeFile = addProtocol(treeFile); + } + */ + jalview.io.NewickFile fin = new jalview.io.NewickFile(treeFile, + protocol); + + fin.parse(); + + if (fin.getTree() != null) + { + currentAlignFrame.loadTree(fin, treeFile); + dbgMsg("Successfuly imported tree."); + } else { + dbgMsg("Tree parameter did not resolve to a valid tree."); + } + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + + String param = getParameter("features"); + if (param != null) + { + param = setProtocolState(param); + + currentAlignFrame.parseFeaturesFile(param, protocol); + } + + param = getParameter("showFeatureSettings"); + if (param != null && param.equalsIgnoreCase("true")) + { + currentAlignFrame.viewport.showSequenceFeatures(true); + new FeatureSettings(currentAlignFrame.alignPanel); + } + + param = getParameter("annotations"); + if (param != null) + { + param = setProtocolState(param); + + if (new AnnotationFile().readAnnotationFile( + currentAlignFrame.viewport.getAlignment(), + param, + protocol)) + { + currentAlignFrame.alignPanel.fontChanged(); + currentAlignFrame.alignPanel.setScrollValues(0, 0); + } else { + System.err.println("Annotations were not added from annotation file '"+param+"'"); + } + + } + + param = getParameter("jnetfile"); + if (param != null) + { + try + { + param = setProtocolState(param); + jalview.io.JPredFile predictions = new jalview.io.JPredFile( + param, protocol); + JnetAnnotationMaker.add_annotation(predictions, + currentAlignFrame.viewport.getAlignment(), + 0, false); // false==do not add sequence profile from concise output + currentAlignFrame.alignPanel.fontChanged(); + currentAlignFrame.alignPanel.setScrollValues(0, 0); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + + /* + + + + + + */ + + + int pdbFileCount = 0; + do{ + if (pdbFileCount > 0) + param = getParameter("PDBFILE" + pdbFileCount); + else + param = getParameter("PDBFILE"); + + if (param != null) + { + PDBEntry pdb = new PDBEntry(); + + String seqstring; + SequenceI[] seqs = null; + String [] chains = null; + + StringTokenizer st = new StringTokenizer(param, " "); + + if (st.countTokens() < 2) + { + String sequence = applet.getParameter("PDBSEQ"); + if (sequence != null) + seqs = new SequenceI[] + { + (Sequence) currentAlignFrame. + getAlignViewport().getAlignment(). + findName(sequence)}; + + } + else + { + param = st.nextToken(); + Vector tmp = new Vector(); + Vector tmp2 = new Vector(); + + while (st.hasMoreTokens()) + { + seqstring = st.nextToken(); + StringTokenizer st2 = new StringTokenizer(seqstring,"="); + if(st2.countTokens()>1) + { + //This is the chain + tmp2.addElement(st2.nextToken()); + seqstring = st2.nextToken(); + } + tmp.addElement( (Sequence) currentAlignFrame. + getAlignViewport().getAlignment(). + findName(seqstring)); + } + + seqs = new SequenceI[tmp.size()]; + tmp.copyInto(seqs); + if(tmp2.size()==tmp.size()) + { + chains = new String[tmp2.size()]; + tmp2.copyInto(chains); + } + } + param = setProtocolState(param); + + if (!jmolAvailable && protocol==AppletFormatAdapter.CLASSLOADER) + { + // TODO: pass PDB file in classloader on to Jmol + // This exception preserves the current behaviour where, even if the local pdb file was identified in the class loader + protocol = AppletFormatAdapter.URL; // this is probably NOT CORRECT! + param = addProtocol(param); // + } + + pdb.setFile(param); + + if(seqs!=null) + { + for (int i = 0; i < seqs.length; i++) + { + if (seqs[i]!=null) + { + ( (Sequence) seqs[i]).addPDBId(pdb); + } else { + if (JalviewLite.debug) + { + // this may not really be a problem but we give a warning anyway + System.err.println("Warning: Possible input parsing error: Null sequence for attachment of PDB (sequence "+i+")"); + } + } + } + + if (jmolAvailable) + { + new jalview.appletgui.AppletJmol(pdb, + seqs, + chains, + currentAlignFrame.alignPanel, + protocol); + lastFrameX += 40; + lastFrameY+=40; + } + else + new MCview.AppletPDBViewer(pdb, + seqs, + chains, + currentAlignFrame.alignPanel, + protocol); + } + } + + pdbFileCount++; + } + while(pdbFileCount < 10); + + ///////////////////////////// + // modify display of features + // + // hide specific groups + param = getParameter("hidefeaturegroups"); + if (param != null) + { + applet.setFeatureGroupState(param, false); + } + // show specific groups + param = getParameter("showfeaturegroups"); + if (param != null) + { + applet.setFeatureGroupState(param, true); + } + } + else + { + fileFound = false; + remove(launcher); + repaint(); + } + } + + /** + * Discovers whether the given file is in the Applet Archive + * @param file String + * @return boolean + */ + boolean inArchive(String file) + { + //This might throw a security exception in certain browsers + //Netscape Communicator for instance. + try + { + boolean rtn = (getClass().getResourceAsStream("/" + file) != null); + if (debug) + { System.err.println("Resource '"+file+"' was "+(rtn ? "" : "not") +" located by classloader."); + } + return rtn; + } + catch (Exception ex) + { + System.out.println("Exception checking resources: " + file + " " + ex); + return false; + } + } + + String addProtocol(String file) + { + if (file.indexOf("://") == -1) + { + file = getCodeBase() + file; + if (debug) + { + System.err.println("Prepended codebase for resource: '"+file+"'"); + } + } + + return file; + } + } + /** + * @return the default alignFrame acted on by the public applet methods. + * May return null with an error message on System.err indicating the fact. + */ + protected AlignFrame getDefaultTargetFrame() + { + if (currentAlignFrame!=null) + { + return currentAlignFrame; + } + if (initialAlignFrame!=null) + { + return initialAlignFrame; + } + System.err.println("Implementation error: Jalview Applet API cannot work out which AlignFrame to use."); + return null; + } + /** + * separator used for separatorList + */ + protected String separator = "|"; // this is a safe(ish) separator - tabs don't work for firefox + /** + * parse the string into a list + * @param list + * @return elements separated by separator + */ + public String[] separatorListToArray(String list) + { + int seplen = separator.length(); + if (list==null || list.equals("")) + return null; + java.util.Vector jv = new Vector(); + int cp=0,pos; + while ((pos=list.indexOf(separator,cp))>cp) + { + jv.addElement(list.substring(cp,pos)); + cp = pos+seplen; + } + if (cp0) + { String[] v = new String[jv.size()]; + for (int i=0; i