X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2FMCview%2FAppletPDBCanvas.java;h=cadbc77ffcddf40f694e498eb76f31f6c4e5a82c;hb=797df64fa2a0a30773d0f48f5494d4155e5a8be3;hp=4cba94de10cb5b0df8af30ce76c7585286a0f6c8;hpb=5a60f6428df1108a96524aae0c34d615ae48c227;p=jalview.git diff --git a/src/MCview/AppletPDBCanvas.java b/src/MCview/AppletPDBCanvas.java old mode 100755 new mode 100644 index 4cba94d..cadbc77 --- a/src/MCview/AppletPDBCanvas.java +++ b/src/MCview/AppletPDBCanvas.java @@ -1,1003 +1,1202 @@ /* -* Jalview - A Sequence Alignment Editor and Viewer -* Copyright (C) 2006 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 -*/ + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle + * + * 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 . + */ package MCview; -import jalview.analysis.AlignSeq; - -import jalview.datamodel.*; +import java.io.*; +import java.util.*; // JBPNote TODO: This class is quite noisy - needs proper log.info/log.debug import java.awt.*; import java.awt.event.*; -import java.io.*; +import jalview.analysis.*; +import jalview.datamodel.*; -import java.util.*; +import jalview.appletgui.*; +import jalview.structure.*; +public class AppletPDBCanvas extends Panel implements MouseListener, + MouseMotionListener, StructureListener +{ + MCMatrix idmat = new MCMatrix(3, 3); -public class AppletPDBCanvas extends Panel implements MouseListener, MouseMotionListener -{ + MCMatrix objmat = new MCMatrix(3, 3); - MCMatrix idmat = new MCMatrix(3, 3); - MCMatrix objmat = new MCMatrix(3, 3); - boolean redrawneeded = true; - int omx = 0; - int mx = 0; - int omy = 0; - int my = 0; - public PDBfile pdb; - int bsize; - Image img; - Graphics ig; - Dimension prefsize; - float[] centre = new float[3]; - float[] width = new float[3]; - float maxwidth; - float scale; - String inStr; - String inType; - boolean bysequence = true; - boolean depthcue = true; - boolean wire = false; - boolean bymolecule = false; - boolean zbuffer = true; - boolean dragging; - int xstart; - int xend; - int ystart; - int yend; - int xmid; - int ymid; - Font font = new Font("Helvetica", Font.PLAIN, 10); - jalview.appletgui.SeqCanvas seqcanvas; - public Sequence sequence; - final StringBuffer mappingDetails = new StringBuffer(); - String appletToolTip = null; - int toolx, tooly; - PDBChain mainchain; - Vector highlightRes; - boolean pdbAction = false; - Bond highlightBond1, highlightBond2; - boolean errorLoading = false; - boolean seqColoursReady = false; - jalview.appletgui.FeatureRenderer fr; - - public AppletPDBCanvas(jalview.appletgui.SeqCanvas seqcanvas, Sequence seq) - { - this.seqcanvas = seqcanvas; - this.sequence = seq; - - seqcanvas.setPDBCanvas(this); - addKeyListener(new KeyAdapter() - { + boolean redrawneeded = true; - public void keyPressed(KeyEvent evt) - { - doKeyPressed(evt); - } - }); - } + int omx = 0; + int mx = 0; - public void setPDBFile(PDBfile pdb) - { - int max = -10; - int maxchain = -1; - int pdbstart = 0; - int pdbend = 0; - int seqstart = 0; - int seqend = 0; - AlignSeq maxAlignseq = null;; + int omy = 0; - for (int i = 0; i < pdb.chains.size(); i++) - { + int my = 0; - mappingDetails.append("\n\nPDB Sequence is :\nSequence = " + ((PDBChain) pdb.chains.elementAt(i)).sequence.getSequenceAsString()); - mappingDetails.append("\nNo of residues = " + ((PDBChain) pdb.chains.elementAt(i)).residues.size()+"\n\n"); - - // Now lets compare the sequences to get - // the start and end points. - // Align the sequence to the pdb - AlignSeq as = new AlignSeq(sequence, - ((PDBChain) pdb.chains.elementAt(i)).sequence, "pep"); - as.calcScoreMatrix(); - as.traceAlignment(); - PrintStream ps = new PrintStream(System.out) - { - public void print(String x) { - mappingDetails.append(x); - } - public void println() - { - mappingDetails.append("\n"); - } - }; - - as.printAlignment(ps); - - if (as.maxscore > max) { - max = as.maxscore; - maxchain = i; - - pdbstart = as.seq2start; - pdbend = as.seq2end; - seqstart = as.seq1start + sequence.getStart()-1; - seqend = as.seq1end + sequence.getEnd()-1; - maxAlignseq = as; - } + public PDBfile pdb; - mappingDetails.append("\nPDB start/end " + pdbstart + " " + pdbend); - mappingDetails.append("\nSEQ start/end "+ seqstart + " " + seqend); - } + PDBEntry pdbentry; - mainchain = (PDBChain) pdb.chains.elementAt(maxchain); - - mainchain.pdbstart = pdbstart; - mainchain.pdbend = pdbend; - mainchain.seqstart = seqstart; - mainchain.seqend = seqend; - mainchain.isVisible = true; - mainchain.makeExactMapping(maxAlignseq, sequence); - - this.pdb = pdb; - this.prefsize = new Dimension(getSize().width, getSize().height); - - //Initialize the matrices to identity - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - if (i != j) { - idmat.addElement(i, j, 0); - objmat.addElement(i, j, 0); - } else { - idmat.addElement(i, j, 1); - objmat.addElement(i, j, 1); - } - } - } + int bsize; - addMouseMotionListener(this); - addMouseListener(this); + Image img; + Graphics ig; - findCentre(); - findWidth(); + Dimension prefsize; - setupBonds(); + float[] centre = new float[3]; - scale = findScale(); - } + float[] width = new float[3]; + float maxwidth; - Vector visiblebonds; - void setupBonds() - { - seqColoursReady = false; - // Sort the bonds by z coord - visiblebonds = new Vector(); + float scale; - for (int ii = 0; ii < pdb.chains.size(); ii++) - { - if ( ( (PDBChain) pdb.chains.elementAt(ii)).isVisible) - { - Vector tmp = ( (PDBChain) pdb.chains.elementAt(ii)).bonds; + String inStr; - for (int i = 0; i < tmp.size(); i++) - { - visiblebonds.addElement(tmp.elementAt(i)); - } - } - } - updateSeqColours(); - seqColoursReady = true; - redrawneeded = true; - repaint(); - } + String inType; + boolean bysequence = true; - public void findWidth() { - float[] max = new float[3]; - float[] min = new float[3]; + boolean depthcue = true; - max[0] = (float) -1e30; - max[1] = (float) -1e30; - max[2] = (float) -1e30; + boolean wire = false; - min[0] = (float) 1e30; - min[1] = (float) 1e30; - min[2] = (float) 1e30; + boolean bymolecule = false; - for (int ii = 0; ii < pdb.chains.size(); ii++) { - if (((PDBChain) pdb.chains.elementAt(ii)).isVisible) { - Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + boolean zbuffer = true; - for (int i = 0; i < bonds.size(); i++) { - Bond tmp = (Bond) bonds.elementAt(i); + boolean dragging; - if (tmp.start[0] >= max[0]) { - max[0] = tmp.start[0]; - } + int xstart; - if (tmp.start[1] >= max[1]) { - max[1] = tmp.start[1]; - } + int xend; - if (tmp.start[2] >= max[2]) { - max[2] = tmp.start[2]; - } + int ystart; - if (tmp.start[0] <= min[0]) { - min[0] = tmp.start[0]; - } + int yend; - if (tmp.start[1] <= min[1]) { - min[1] = tmp.start[1]; - } + int xmid; - if (tmp.start[2] <= min[2]) { - min[2] = tmp.start[2]; - } + int ymid; - if (tmp.end[0] >= max[0]) { - max[0] = tmp.end[0]; - } + Font font = new Font("Helvetica", Font.PLAIN, 10); - if (tmp.end[1] >= max[1]) { - max[1] = tmp.end[1]; - } + public SequenceI[] sequence; - if (tmp.end[2] >= max[2]) { - max[2] = tmp.end[2]; - } + final StringBuffer mappingDetails = new StringBuffer(); - if (tmp.end[0] <= min[0]) { - min[0] = tmp.end[0]; - } + String appletToolTip = null; - if (tmp.end[1] <= min[1]) { - min[1] = tmp.end[1]; - } + int toolx, tooly; - if (tmp.end[2] <= min[2]) { - min[2] = tmp.end[2]; - } - } - } - } + PDBChain mainchain; - width[0] = (float) Math.abs(max[0] - min[0]); - width[1] = (float) Math.abs(max[1] - min[1]); - width[2] = (float) Math.abs(max[2] - min[2]); + Vector highlightRes; - maxwidth = width[0]; + boolean pdbAction = false; - if (width[1] > width[0]) { - maxwidth = width[1]; - } + Bond highlightBond1, highlightBond2; - if (width[2] > width[1]) { - maxwidth = width[2]; - } + boolean errorLoading = false; - // System.out.println("Maxwidth = " + maxwidth); - } + boolean seqColoursReady = false; - public float findScale() { - int dim; - int width; - int height; + FeatureRenderer fr; - if (getSize().width != 0) { - width = getSize().width; - height = getSize().height; - } else { - width = prefsize.width; - height = prefsize.height; - } + AlignmentPanel ap; - if (width < height) { - dim = width; - } else { - dim = height; - } + StructureSelectionManager ssm; - return (float) (dim / (1.5d * maxwidth)); - } + public AppletPDBCanvas(PDBEntry pdbentry, SequenceI[] seq, + String[] chains, AlignmentPanel ap, String protocol) - public void findCentre() { - float xtot = 0; - float ytot = 0; - float ztot = 0; + { + this.ap = ap; + this.pdbentry = pdbentry; + this.sequence = seq; - int bsize = 0; + ssm = StructureSelectionManager.getStructureSelectionManager(ap.av.applet); - //Find centre coordinate - for (int ii = 0; ii < pdb.chains.size(); ii++) { - if (((PDBChain) pdb.chains.elementAt(ii)).isVisible) { - Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + try + { + pdb = ssm.setMapping(seq, chains, pdbentry.getFile(), protocol); - bsize += bonds.size(); + if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE)) + pdbentry.setFile("INLINE" + pdb.id); - for (int i = 0; i < bonds.size(); i++) { - xtot = xtot + ((Bond) bonds.elementAt(i)).start[0] + - ((Bond) bonds.elementAt(i)).end[0]; + } catch (Exception ex) + { + ex.printStackTrace(); + return; + } - ytot = ytot + ((Bond) bonds.elementAt(i)).start[1] + - ((Bond) bonds.elementAt(i)).end[1]; + pdbentry.setId(pdb.id); - ztot = ztot + ((Bond) bonds.elementAt(i)).start[2] + - ((Bond) bonds.elementAt(i)).end[2]; - } - } - } + ssm.addStructureViewerListener(this); - centre[0] = xtot / (2 * (float) bsize); - centre[1] = ytot / (2 * (float) bsize); - centre[2] = ztot / (2 * (float) bsize); - } + colourBySequence(); - public void paint(Graphics g) - { + int max = -10; + int maxchain = -1; + int pdbstart = 0; + int pdbend = 0; + int seqstart = 0; + int seqend = 0; - if(errorLoading) - { - g.setColor(Color.white); - g.fillRect(0,0,getSize().width, getSize().height); - g.setColor(Color.black); - g.setFont(new Font("Verdana", Font.BOLD, 14)); - g.drawString("Error loading PDB data!!", 50, getSize().height/2); - return; - } + // JUST DEAL WITH ONE SEQUENCE FOR NOW + SequenceI sequence = seq[0]; + + for (int i = 0; i < pdb.chains.size(); i++) + { - if( !seqColoursReady ) + mappingDetails.append("\n\nPDB Sequence is :\nSequence = " + + ((PDBChain) pdb.chains.elementAt(i)).sequence + .getSequenceAsString()); + mappingDetails.append("\nNo of residues = " + + ((PDBChain) pdb.chains.elementAt(i)).residues.size() + + "\n\n"); + + // Now lets compare the sequences to get + // the start and end points. + // Align the sequence to the pdb + // TODO: DNa/Pep switch + AlignSeq as = new AlignSeq(sequence, + ((PDBChain) pdb.chains.elementAt(i)).sequence, + ((PDBChain) pdb.chains.elementAt(i)).isNa ? AlignSeq.DNA + : AlignSeq.PEP); + as.calcScoreMatrix(); + as.traceAlignment(); + PrintStream ps = new PrintStream(System.out) { - g.setColor(Color.black); - g.setFont(new Font("Verdana", Font.BOLD, 14)); - g.drawString("Fetching PDB data...", 50, getSize().height/2); - return; - } + public void print(String x) + { + mappingDetails.append(x); + } + public void println() + { + mappingDetails.append("\n"); + } + }; + as.printAlignment(ps); - //Only create the image at the beginning - - //this saves much memory usage - if ((img == null) || (prefsize.width != getSize().width) || - (prefsize.height != getSize().height)) { + if (as.maxscore > max) + { + max = as.maxscore; + maxchain = i; - try{ prefsize.width = getSize().width; - prefsize.height = getSize().height; + pdbstart = as.seq2start; + pdbend = as.seq2end; + seqstart = as.seq1start + sequence.getStart() - 1; + seqend = as.seq1end + sequence.getEnd() - 1; + } - scale = findScale(); - img = createImage(prefsize.width, prefsize.height); - ig = img.getGraphics(); + mappingDetails.append("\nPDB start/end " + pdbstart + " " + pdbend); + mappingDetails.append("\nSEQ start/end " + seqstart + " " + seqend); + } - redrawneeded = true; - }catch(Exception ex) - { - ex.printStackTrace(); - } - } + mainchain = (PDBChain) pdb.chains.elementAt(maxchain); + mainchain.pdbstart = pdbstart; + mainchain.pdbend = pdbend; + mainchain.seqstart = seqstart; + mainchain.seqend = seqend; + mainchain.isVisible = true; + // mainchain.makeExactMapping(maxAlignseq, sequence); + // mainchain.transferRESNUMFeatures(sequence, null); + this.pdb = pdb; + this.prefsize = new Dimension(getSize().width, getSize().height); - if (redrawneeded) + // Initialize the matrices to identity + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + if (i != j) { - drawAll(ig, prefsize.width, prefsize.height); - redrawneeded = false; + idmat.addElement(i, j, 0); + objmat.addElement(i, j, 0); } - if(appletToolTip!=null) + else { - ig.setColor(Color.red); - ig.drawString(appletToolTip, toolx, tooly); + idmat.addElement(i, j, 1); + objmat.addElement(i, j, 1); } - - g.drawImage(img, 0, 0, this); - - pdbAction = false; + } } - public void drawAll(Graphics g, int width, int height) - { - ig.setColor(Color.black); - ig.fillRect(0, 0, width, height); - drawScene(ig); - drawLabels(ig); - } + addMouseMotionListener(this); + addMouseListener(this); - void setColours(jalview.schemes.ColourSchemeI cs) - { - bysequence = false; - pdb.setColours(cs); - redrawneeded = true; - repaint(); - } - public void updateSeqColours() + addKeyListener(new KeyAdapter() { - if (pdbAction) + public void keyPressed(KeyEvent evt) { - return; + doKeyPressed(evt); } + }); + + findCentre(); + findWidth(); + + setupBonds(); - if(bysequence && pdb!=null) + scale = findScale(); + } + + Vector visiblebonds; + + void setupBonds() + { + seqColoursReady = false; + // Sort the bonds by z coord + visiblebonds = new Vector(); + + for (int ii = 0; ii < pdb.chains.size(); ii++) + { + if (((PDBChain) pdb.chains.elementAt(ii)).isVisible) { - for (int ii = 0; ii < pdb.chains.size(); ii++) + Vector tmp = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + + for (int i = 0; i < tmp.size(); i++) { - colourBySequence((PDBChain) pdb.chains.elementAt(ii)); + visiblebonds.addElement(tmp.elementAt(i)); } } - - redrawneeded=true; - repaint(); } - - - int findTrueIndex(int pos) + seqColoursReady = true; + colourBySequence(); + redrawneeded = true; + repaint(); + } + + public void findWidth() + { + float[] max = new float[3]; + float[] min = new float[3]; + + max[0] = (float) -1e30; + max[1] = (float) -1e30; + max[2] = (float) -1e30; + + min[0] = (float) 1e30; + min[1] = (float) 1e30; + min[2] = (float) 1e30; + + for (int ii = 0; ii < pdb.chains.size(); ii++) { - // returns the alignment position for a residue - int j = sequence.getStart(); - int i = 0; - - while ( (i < sequence.getLength()) && (j <= sequence.getEnd()) && (j <= pos+1)) + if (((PDBChain) pdb.chains.elementAt(ii)).isVisible) { - if (!jalview.util.Comparison.isGap(sequence.getCharAt(i))) + Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + + for (int i = 0; i < bonds.size(); i++) { - j++; - } + Bond tmp = (Bond) bonds.elementAt(i); - i++; - } + if (tmp.start[0] >= max[0]) + { + max[0] = tmp.start[0]; + } - if(i>1) - i--; + if (tmp.start[1] >= max[1]) + { + max[1] = tmp.start[1]; + } - if ( (j == sequence.getEnd()) && (j < pos)) - { - return sequence.getEnd() + 1; - } - else - { - return i; - } - } + if (tmp.start[2] >= max[2]) + { + max[2] = tmp.start[2]; + } + if (tmp.start[0] <= min[0]) + { + min[0] = tmp.start[0]; + } - // This method has been taken out of PDBChain to allow - // Applet and Application specific sequence renderers to be used - void colourBySequence(PDBChain chain) - { - boolean showFeatures = false; + if (tmp.start[1] <= min[1]) + { + min[1] = tmp.start[1]; + } - if(seqcanvas.getViewport().getShowSequenceFeatures()) - { - if(fr==null) + if (tmp.start[2] <= min[2]) { - fr = new jalview.appletgui.FeatureRenderer(seqcanvas.getViewport()); + min[2] = tmp.start[2]; } - fr.transferSettings( seqcanvas.getFeatureRenderer()); - showFeatures = true; - } - for (int i = 0; i < chain.bonds.size(); i++) - { - Bond tmp = (Bond) chain.bonds.elementAt(i); - tmp.startCol = Color.lightGray; - tmp.endCol = Color.lightGray; - if(chain!=mainchain) - continue; - - if ( (tmp.at1.resNumber >= ( (chain.offset + chain.pdbstart) - 1)) && - (tmp.at1.resNumber <= ( (chain.offset + chain.pdbend) - 1))) - { + if (tmp.end[0] >= max[0]) + { + max[0] = tmp.end[0]; + } - int index = findTrueIndex(tmp.at1.alignmentMapping); - //sequence.findIndex(tmp.at1.alignmentMapping); - if (index != -1) - { - tmp.startCol = seqcanvas.getSequenceRenderer(). - getResidueBoxColour( sequence, index); + if (tmp.end[1] >= max[1]) + { + max[1] = tmp.end[1]; + } - if(showFeatures) - tmp.startCol = fr.findFeatureColour(tmp.startCol, sequence, index); - } - } + if (tmp.end[2] >= max[2]) + { + max[2] = tmp.end[2]; + } - int index = findTrueIndex(tmp.at2.alignmentMapping); - //sequence.findIndex( tmp.at2.alignmentMapping ); - if (index != -1) - { - tmp.endCol = seqcanvas.getSequenceRenderer(). - getResidueBoxColour( sequence, index); + if (tmp.end[0] <= min[0]) + { + min[0] = tmp.end[0]; + } + + if (tmp.end[1] <= min[1]) + { + min[1] = tmp.end[1]; + } - if(showFeatures) - tmp.endCol = fr.findFeatureColour(tmp.endCol, sequence, index); + if (tmp.end[2] <= min[2]) + { + min[2] = tmp.end[2]; + } } } } + width[0] = (float) Math.abs(max[0] - min[0]); + width[1] = (float) Math.abs(max[1] - min[1]); + width[2] = (float) Math.abs(max[2] - min[2]); - Zsort zsort; - public void drawScene(Graphics g) + maxwidth = width[0]; + + if (width[1] > width[0]) { - if (zbuffer) - { - if(zsort ==null) - zsort = new Zsort(); + maxwidth = width[1]; + } - zsort.Zsort(visiblebonds); - } + if (width[2] > width[1]) + { + maxwidth = width[2]; + } + // System.out.println("Maxwidth = " + maxwidth); + } - Bond tmpBond=null; - for (int i = 0; i < visiblebonds.size(); i++) - { - tmpBond = (Bond) visiblebonds.elementAt(i); + public float findScale() + { + int dim; + int width; + int height; + if (getSize().width != 0) + { + width = getSize().width; + height = getSize().height; + } + else + { + width = prefsize.width; + height = prefsize.height; + } - xstart = (int) (((tmpBond.start[0] - centre[0]) * scale) + - (getSize().width / 2)); - ystart = (int) (((tmpBond.start[1] - centre[1]) * scale) + - (getSize().height / 2)); + if (width < height) + { + dim = width; + } + else + { + dim = height; + } - xend = (int) (((tmpBond.end[0] - centre[0]) * scale) + - (getSize().width / 2)); - yend = (int) (((tmpBond.end[1] - centre[1]) * scale) + - (getSize().height / 2)); + return (float) (dim / (1.5d * maxwidth)); + } - xmid = (xend + xstart) / 2; - ymid = (yend + ystart) / 2; + public void findCentre() + { + float xtot = 0; + float ytot = 0; + float ztot = 0; - if (depthcue && !bymolecule) - { - if (tmpBond.start[2] < (centre[2] - (maxwidth / 6))) { - g.setColor(tmpBond.startCol.darker().darker()); - drawLine(g, xstart, ystart, xmid, ymid); - - g.setColor(tmpBond.endCol.darker().darker()); - drawLine(g, xmid, ymid, xend, yend); - } else if (tmpBond.start[2] < (centre[2] + (maxwidth / 6))) { - g.setColor(tmpBond.startCol.darker()); - drawLine(g, xstart, ystart, xmid, ymid); - - g.setColor(tmpBond.endCol.darker()); - drawLine(g, xmid, ymid, xend, yend); - } else { - g.setColor(tmpBond.startCol); - drawLine(g, xstart, ystart, xmid, ymid); - - g.setColor(tmpBond.endCol); - drawLine(g, xmid, ymid, xend, yend); - } + int bsize = 0; - } else if (depthcue && bymolecule) { - if (tmpBond.start[2] < (centre[2] - (maxwidth / 6))) { - g.setColor(Color.green.darker().darker()); - drawLine(g, xstart, ystart, xend, yend); - } else if (tmpBond.start[2] < (centre[2] + (maxwidth / 6))) { - g.setColor(Color.green.darker()); - drawLine(g, xstart, ystart, xend, yend); - } else { - g.setColor(Color.green); - drawLine(g, xstart, ystart, xend, yend); - } - } else if (!depthcue && !bymolecule) { - g.setColor(tmpBond.startCol); - drawLine(g, xstart, ystart, xmid, ymid); - g.setColor(tmpBond.endCol); - drawLine(g, xmid, ymid, xend, yend); - } else { - drawLine(g, xstart, ystart, xend, yend); - } + // Find centre coordinate + for (int ii = 0; ii < pdb.chains.size(); ii++) + { + if (((PDBChain) pdb.chains.elementAt(ii)).isVisible) + { + Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; - if(highlightBond1!=null && highlightBond1==tmpBond) - { - g.setColor(Color.white); - drawLine(g, xmid, ymid, xend, yend); - } + bsize += bonds.size(); - if(highlightBond2!=null && highlightBond2==tmpBond) - { - g.setColor(Color.white); - drawLine(g, xstart, ystart, xmid, ymid); - } + for (int i = 0; i < bonds.size(); i++) + { + xtot = xtot + ((Bond) bonds.elementAt(i)).start[0] + + ((Bond) bonds.elementAt(i)).end[0]; - } - } + ytot = ytot + ((Bond) bonds.elementAt(i)).start[1] + + ((Bond) bonds.elementAt(i)).end[1]; - public void drawLine(Graphics g, int x1, int y1, int x2, int y2) { - if (!wire) { - if (((float) Math.abs(y2 - y1) / (float) Math.abs(x2 - x1)) < 0.5) { - g.drawLine(x1, y1, x2, y2); - g.drawLine(x1 + 1, y1 + 1, x2 + 1, y2 + 1); - g.drawLine(x1, y1 - 1, x2, y2 - 1); - } else { - g.setColor(g.getColor().brighter()); - g.drawLine(x1, y1, x2, y2); - g.drawLine(x1 + 1, y1, x2 + 1, y2); - g.drawLine(x1 - 1, y1, x2 - 1, y2); - } - } else { - g.drawLine(x1, y1, x2, y2); + ztot = ztot + ((Bond) bonds.elementAt(i)).start[2] + + ((Bond) bonds.elementAt(i)).end[2]; } + } } - public Dimension minimumsize() { - return prefsize; + centre[0] = xtot / (2 * (float) bsize); + centre[1] = ytot / (2 * (float) bsize); + centre[2] = ztot / (2 * (float) bsize); + } + + public void paint(Graphics g) + { + + if (errorLoading) + { + g.setColor(Color.white); + g.fillRect(0, 0, getSize().width, getSize().height); + g.setColor(Color.black); + g.setFont(new Font("Verdana", Font.BOLD, 14)); + g.drawString("Error loading PDB data!!", 50, getSize().height / 2); + return; } - public Dimension preferredsize() { - return prefsize; + if (!seqColoursReady) + { + g.setColor(Color.black); + g.setFont(new Font("Verdana", Font.BOLD, 14)); + g.drawString("Fetching PDB data...", 50, getSize().height / 2); + return; } - public void doKeyPressed(KeyEvent evt) + // Only create the image at the beginning - + // this saves much memory usage + if ((img == null) || (prefsize.width != getSize().width) + || (prefsize.height != getSize().height)) { - if (evt.getKeyCode() == KeyEvent.VK_UP) + + try { - scale = (float) (scale * 1.1); + prefsize.width = getSize().width; + prefsize.height = getSize().height; + + scale = findScale(); + img = createImage(prefsize.width, prefsize.height); + ig = img.getGraphics(); + redrawneeded = true; - repaint(); + } catch (Exception ex) + { + ex.printStackTrace(); } - else if (evt.getKeyCode() == KeyEvent.VK_DOWN) + } + + if (redrawneeded) + { + drawAll(ig, prefsize.width, prefsize.height); + redrawneeded = false; + } + if (appletToolTip != null) + { + ig.setColor(Color.red); + ig.drawString(appletToolTip, toolx, tooly); + } + + g.drawImage(img, 0, 0, this); + + pdbAction = false; + } + + public void drawAll(Graphics g, int width, int height) + { + ig.setColor(Color.black); + ig.fillRect(0, 0, width, height); + drawScene(ig); + drawLabels(ig); + } + + public void setColours(jalview.schemes.ColourSchemeI cs) + { + bysequence = false; + pdb.setColours(cs); + redrawneeded = true; + repaint(); + } + + // This method has been taken out of PDBChain to allow + // Applet and Application specific sequence renderers to be used + void colourBySequence() + { + SequenceRenderer sr = new SequenceRenderer(ap.av); + + StructureMapping[] mapping = ssm.getMapping(pdbentry.getFile()); + + boolean showFeatures = false; + if (ap.av.getShowSequenceFeatures()) + { + if (fr == null) { - scale = (float) (scale * 0.9); - redrawneeded = true; - repaint(); + fr = new jalview.appletgui.FeatureRenderer(ap.av); } + + fr.transferSettings(ap.getFeatureRenderer()); + + showFeatures = true; } - public void mousePressed(MouseEvent e) { - pdbAction = true; - Atom fatom = findAtom(e.getX(), e.getY()); - if(fatom!=null) + PDBChain chain; + if (bysequence && pdb != null) + { + for (int ii = 0; ii < pdb.chains.size(); ii++) { - fatom.isSelected = !fatom.isSelected; + chain = (PDBChain) pdb.chains.elementAt(ii); - redrawneeded = true; - repaint(); - if (foundchain != -1) + for (int i = 0; i < chain.bonds.size(); i++) { - PDBChain chain = (PDBChain) pdb.chains.elementAt(foundchain); - if (chain == mainchain) + Bond tmp = (Bond) chain.bonds.elementAt(i); + tmp.startCol = Color.lightGray; + tmp.endCol = Color.lightGray; + if (chain != mainchain) + { + continue; + } + + for (int s = 0; s < sequence.length; s++) { - if (fatom.alignmentMapping != -1) + for (int m = 0; m < mapping.length; m++) { - if (highlightRes == null) - highlightRes = new Vector(); + if (mapping[m].getSequence() == sequence[s]) + { + int pos = mapping[m].getSeqPos(tmp.at1.resNumber) - 1; + if (pos > 0) + { + pos = sequence[s].findIndex(pos); + tmp.startCol = sr.getResidueBoxColour(sequence[s], pos); + if (showFeatures) + { + tmp.startCol = fr.findFeatureColour(tmp.startCol, + sequence[s], pos); + } + } + pos = mapping[m].getSeqPos(tmp.at2.resNumber) - 1; + if (pos > 0) + { + pos = sequence[s].findIndex(pos); + tmp.endCol = sr.getResidueBoxColour(sequence[s], pos); + if (showFeatures) + { + tmp.endCol = fr.findFeatureColour(tmp.endCol, + sequence[s], pos); + } + } - if (highlightRes.contains(fatom.alignmentMapping+"" + "")) - highlightRes.removeElement(fatom.alignmentMapping + ""); - else - highlightRes.addElement(fatom.alignmentMapping + ""); + } } } } - - } - mx = e.getX(); - my = e.getY(); - omx = mx; - omy = my; - dragging = false; + } } + } + + Zsort zsort; - public void mouseMoved(MouseEvent e) { - pdbAction = true; - if(highlightBond1!=null) + public void drawScene(Graphics g) + { + if (zbuffer) + { + if (zsort == null) { - highlightBond1.at2.isSelected = false; - highlightBond2.at1.isSelected = false; - highlightBond1 = null; - highlightBond2 = null; + zsort = new Zsort(); } - Atom fatom = findAtom(e.getX(), e.getY()); + zsort.Zsort(visiblebonds); + } + + Bond tmpBond = null; + for (int i = 0; i < visiblebonds.size(); i++) + { + tmpBond = (Bond) visiblebonds.elementAt(i); + + xstart = (int) (((tmpBond.start[0] - centre[0]) * scale) + (getSize().width / 2)); + ystart = (int) (((centre[1] - tmpBond.start[1]) * scale) + (getSize().height / 2)); - PDBChain chain = null; - if(foundchain!=-1) + xend = (int) (((tmpBond.end[0] - centre[0]) * scale) + (getSize().width / 2)); + yend = (int) (((centre[1] - tmpBond.end[1]) * scale) + (getSize().height / 2)); + + xmid = (xend + xstart) / 2; + ymid = (yend + ystart) / 2; + + if (depthcue && !bymolecule) + { + if (tmpBond.start[2] < (centre[2] - (maxwidth / 6))) { - chain = (PDBChain) pdb.chains.elementAt(foundchain); - if(chain == mainchain) - { - highlightSeqcanvas( fatom.alignmentMapping ); - } + g.setColor(tmpBond.startCol.darker().darker()); + drawLine(g, xstart, ystart, xmid, ymid); + + g.setColor(tmpBond.endCol.darker().darker()); + drawLine(g, xmid, ymid, xend, yend); } + else if (tmpBond.start[2] < (centre[2] + (maxwidth / 6))) + { + g.setColor(tmpBond.startCol.darker()); + drawLine(g, xstart, ystart, xmid, ymid); - if (fatom != null) { - toolx = e.getX(); - tooly = e.getY(); - - appletToolTip = chain.id+":"+ fatom.resNumber+" "+ fatom.resName; - redrawneeded = true; - repaint(); - } else { - highlightSeqcanvas( -1); - appletToolTip = null; - redrawneeded = true; - repaint(); + g.setColor(tmpBond.endCol.darker()); + drawLine(g, xmid, ymid, xend, yend); } - } + else + { + g.setColor(tmpBond.startCol); + drawLine(g, xstart, ystart, xmid, ymid); + g.setColor(tmpBond.endCol); + drawLine(g, xmid, ymid, xend, yend); + } - void highlightSeqcanvas(int pos) - { - SearchResults searchResults = new SearchResults(); - if(highlightRes!=null) + } + else if (depthcue && bymolecule) { - for (int i = 0; i < highlightRes.size(); i++) + if (tmpBond.start[2] < (centre[2] - (maxwidth / 6))) { - int a = Integer.parseInt(highlightRes.elementAt( - i).toString())+1; - - searchResults.addResult(sequence, a, a); + g.setColor(Color.green.darker().darker()); + drawLine(g, xstart, ystart, xend, yend); + } + else if (tmpBond.start[2] < (centre[2] + (maxwidth / 6))) + { + g.setColor(Color.green.darker()); + drawLine(g, xstart, ystart, xend, yend); + } + else + { + g.setColor(Color.green); + drawLine(g, xstart, ystart, xend, yend); } } - - if(pos!=-1) + else if (!depthcue && !bymolecule) { - searchResults.addResult(sequence, pos+1, pos+1); + g.setColor(tmpBond.startCol); + drawLine(g, xstart, ystart, xmid, ymid); + g.setColor(tmpBond.endCol); + drawLine(g, xmid, ymid, xend, yend); + } + else + { + drawLine(g, xstart, ystart, xend, yend); } - seqcanvas.highlightSearchResults(searchResults); - } + if (highlightBond1 != null && highlightBond1 == tmpBond) + { + g.setColor(Color.white); + drawLine(g, xmid, ymid, xend, yend); + } + if (highlightBond2 != null && highlightBond2 == tmpBond) + { + g.setColor(Color.white); + drawLine(g, xstart, ystart, xmid, ymid); + } - public void mouseClicked(MouseEvent e) { } + } - public void mouseEntered(MouseEvent e) { + public void drawLine(Graphics g, int x1, int y1, int x2, int y2) + { + if (!wire) + { + if (((float) Math.abs(y2 - y1) / (float) Math.abs(x2 - x1)) < 0.5) + { + g.drawLine(x1, y1, x2, y2); + g.drawLine(x1 + 1, y1 + 1, x2 + 1, y2 + 1); + g.drawLine(x1, y1 - 1, x2, y2 - 1); + } + else + { + g.setColor(g.getColor().brighter()); + g.drawLine(x1, y1, x2, y2); + g.drawLine(x1 + 1, y1, x2 + 1, y2); + g.drawLine(x1 - 1, y1, x2 - 1, y2); + } + } + else + { + g.drawLine(x1, y1, x2, y2); } + } - public void mouseExited(MouseEvent e) { + public Dimension minimumsize() + { + return prefsize; + } + + public Dimension preferredsize() + { + return prefsize; + } + + public void doKeyPressed(KeyEvent evt) + { + if (evt.getKeyCode() == KeyEvent.VK_UP) + { + scale = (float) (scale * 1.1); + redrawneeded = true; + repaint(); + } + else if (evt.getKeyCode() == KeyEvent.VK_DOWN) + { + scale = (float) (scale * 0.9); + redrawneeded = true; + repaint(); } + } - public void mouseDragged(MouseEvent evt) { - int x = evt.getX(); - int y = evt.getY(); - mx = x; - my = y; + public void mousePressed(MouseEvent e) + { + pdbAction = true; + Atom fatom = findAtom(e.getX(), e.getY()); + if (fatom != null) + { + fatom.isSelected = !fatom.isSelected; - MCMatrix objmat = new MCMatrix(3, 3); - objmat.setIdentity(); + redrawneeded = true; + repaint(); + if (foundchain != -1) + { + PDBChain chain = (PDBChain) pdb.chains.elementAt(foundchain); + if (chain == mainchain) + { + if (fatom.alignmentMapping != -1) + { + if (highlightRes == null) + { + highlightRes = new Vector(); + } - if ((evt.getModifiers() & Event.META_MASK) != 0) { - objmat.rotatez((float) ((mx - omx))); - } else { - objmat.rotatex((float) ((my - omy))); - objmat.rotatey((float) ((omx - mx))); + if (highlightRes.contains(fatom.alignmentMapping + "" + "")) + { + highlightRes.removeElement(fatom.alignmentMapping + ""); + } + else + { + highlightRes.addElement(fatom.alignmentMapping + ""); + } + } } + } + + } + mx = e.getX(); + my = e.getY(); + omx = mx; + omy = my; + dragging = false; + } + + public void mouseMoved(MouseEvent e) + { + pdbAction = true; + if (highlightBond1 != null) + { + highlightBond1.at2.isSelected = false; + highlightBond2.at1.isSelected = false; + highlightBond1 = null; + highlightBond2 = null; + } - //Alter the bonds - for (int ii = 0; ii < pdb.chains.size(); ii++) { - Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + Atom fatom = findAtom(e.getX(), e.getY()); - for (int i = 0; i < bonds.size(); i++) { - Bond tmpBond = (Bond) bonds.elementAt(i); + PDBChain chain = null; + if (foundchain != -1) + { + chain = (PDBChain) pdb.chains.elementAt(foundchain); + if (chain == mainchain) + { + mouseOverStructure(fatom.resNumber, chain.id); + } + } - //Translate the bond so the centre is 0,0,0 - tmpBond.translate(-centre[0], -centre[1], -centre[2]); + if (fatom != null) + { + toolx = e.getX(); + tooly = e.getY(); - //Now apply the rotation matrix - tmpBond.start = objmat.vectorMultiply(tmpBond.start); - tmpBond.end = objmat.vectorMultiply(tmpBond.end); + appletToolTip = chain.id + ":" + fatom.resNumber + " " + + fatom.resName; + redrawneeded = true; + repaint(); + } + else + { + mouseOverStructure(-1, chain != null ? chain.id : null); + appletToolTip = null; + redrawneeded = true; + repaint(); + } + } - //Now translate back again - tmpBond.translate(centre[0], centre[1], centre[2]); - } - } + public void mouseClicked(MouseEvent e) + { + } - objmat = null; + public void mouseEntered(MouseEvent e) + { + } - omx = mx; - omy = my; + public void mouseExited(MouseEvent e) + { + } - dragging = true; + public void mouseDragged(MouseEvent evt) + { + int x = evt.getX(); + int y = evt.getY(); + mx = x; + my = y; - redrawneeded = true; + MCMatrix objmat = new MCMatrix(3, 3); + objmat.setIdentity(); - repaint(); + if ((evt.getModifiers() & Event.META_MASK) != 0) + { + objmat.rotatez((float) ((mx - omx))); + } + else + { + objmat.rotatex((float) ((omy - my))); + objmat.rotatey((float) ((omx - mx))); } - public void mouseReleased(MouseEvent evt) { - dragging = false; - return; + // Alter the bonds + for (int ii = 0; ii < pdb.chains.size(); ii++) + { + Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + + for (int i = 0; i < bonds.size(); i++) + { + Bond tmpBond = (Bond) bonds.elementAt(i); + + // Translate the bond so the centre is 0,0,0 + tmpBond.translate(-centre[0], -centre[1], -centre[2]); + + // Now apply the rotation matrix + tmpBond.start = objmat.vectorMultiply(tmpBond.start); + tmpBond.end = objmat.vectorMultiply(tmpBond.end); + + // Now translate back again + tmpBond.translate(centre[0], centre[1], centre[2]); + } } - void drawLabels(Graphics g) { + objmat = null; - for (int ii = 0; ii < pdb.chains.size(); ii++) - { - PDBChain chain = (PDBChain) pdb.chains.elementAt(ii); + omx = mx; + omy = my; - if (chain.isVisible) - { - Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + dragging = true; - for (int i = 0; i < bonds.size(); i++) - { - Bond tmpBond = (Bond) bonds.elementAt(i); + redrawneeded = true; - if (tmpBond.at1.isSelected) - { - labelAtom(g, tmpBond, 1); - } + repaint(); + } - if (tmpBond.at2.isSelected) - { + public void mouseReleased(MouseEvent evt) + { + dragging = false; + return; + } - labelAtom(g, tmpBond, 2); - } - } - } + void drawLabels(Graphics g) + { + + for (int ii = 0; ii < pdb.chains.size(); ii++) + { + PDBChain chain = (PDBChain) pdb.chains.elementAt(ii); + + if (chain.isVisible) + { + Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + + for (int i = 0; i < bonds.size(); i++) + { + Bond tmpBond = (Bond) bonds.elementAt(i); + + if (tmpBond.at1.isSelected) + { + labelAtom(g, tmpBond, 1); + } + + if (tmpBond.at2.isSelected) + { + + labelAtom(g, tmpBond, 2); + } } + } } + } - public void labelAtom(Graphics g, Bond b, int n) { - g.setFont(font); + public void labelAtom(Graphics g, Bond b, int n) + { + g.setFont(font); - if (n == 1) { - int xstart = (int) (((b.start[0] - centre[0]) * scale) + - (getSize().width / 2)); - int ystart = (int) (((b.start[1] - centre[1]) * scale) + - (getSize().height / 2)); + if (n == 1) + { + int xstart = (int) (((b.start[0] - centre[0]) * scale) + (getSize().width / 2)); + int ystart = (int) (((centre[1] - b.start[1]) * scale) + (getSize().height / 2)); - g.setColor(Color.red); - g.drawString(b.at1.resName + "-" + b.at1.resNumber, xstart, ystart); - } + g.setColor(Color.red); + g.drawString(b.at1.resName + "-" + b.at1.resNumber, xstart, ystart); + } - if (n == 2) { - int xstart = (int) (((b.end[0] - centre[0]) * scale) + - (getSize().width / 2)); - int ystart = (int) (((b.end[1] - centre[1]) * scale) + - (getSize().height / 2)); + if (n == 2) + { + int xstart = (int) (((b.end[0] - centre[0]) * scale) + (getSize().width / 2)); + int ystart = (int) (((centre[1] - b.end[1]) * scale) + (getSize().height / 2)); - g.setColor(Color.red); - g.drawString(b.at2.resName + "-" + b.at2.resNumber, xstart, ystart); - } + g.setColor(Color.red); + g.drawString(b.at2.resName + "-" + b.at2.resNumber, xstart, ystart); } + } + + int foundchain = -1; - int foundchain = -1; - public Atom findAtom(int x, int y) { - Atom fatom = null; + public Atom findAtom(int x, int y) + { + Atom fatom = null; - foundchain = -1; + foundchain = -1; - for (int ii = 0; ii < pdb.chains.size(); ii++) + for (int ii = 0; ii < pdb.chains.size(); ii++) + { + PDBChain chain = (PDBChain) pdb.chains.elementAt(ii); + int truex; + Bond tmpBond = null; + + if (chain.isVisible) + { + Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + + for (int i = 0; i < bonds.size(); i++) { - PDBChain chain = (PDBChain) pdb.chains.elementAt(ii); - int truex; - Bond tmpBond=null; + tmpBond = (Bond) bonds.elementAt(i); + + truex = (int) (((tmpBond.start[0] - centre[0]) * scale) + (getSize().width / 2)); + + if (Math.abs(truex - x) <= 2) + { + int truey = (int) (((centre[1] - tmpBond.start[1]) * scale) + (getSize().height / 2)); - if (chain.isVisible) + if (Math.abs(truey - y) <= 2) { - Vector bonds = ((PDBChain) pdb.chains.elementAt(ii)).bonds; + fatom = tmpBond.at1; + foundchain = ii; + break; + } + } + } - for (int i = 0; i < bonds.size(); i++) - { - tmpBond = (Bond) bonds.elementAt(i); - - truex = (int) (((tmpBond.start[0] - centre[0]) * scale) + - (getSize().width / 2)); - - if (Math.abs(truex - x) <= 2) - { - int truey = (int) (((tmpBond.start[1] - centre[1]) * scale) + - (getSize().height / 2)); - - if (Math.abs(truey - y) <= 2) - { - fatom = tmpBond.at1; - foundchain = ii; - break; - } - } - } + // Still here? Maybe its the last bond - // Still here? Maybe its the last bond + truex = (int) (((tmpBond.end[0] - centre[0]) * scale) + (getSize().width / 2)); - truex = (int) ( ( (tmpBond.end[0] - centre[0]) * scale) + - (getSize().width / 2)); + if (Math.abs(truex - x) <= 2) + { + int truey = (int) (((tmpBond.end[1] - centre[1]) * scale) + (getSize().height / 2)); - if (Math.abs(truex - x) <= 2) - { - int truey = (int) ( ( (tmpBond.end[1] - centre[1]) * scale) + - (getSize().height / 2)); + if (Math.abs(truey - y) <= 2) + { + fatom = tmpBond.at2; + foundchain = ii; + break; + } + } - if (Math.abs(truey - y) <= 2) - { - fatom = tmpBond.at2; - foundchain = ii; - break; - } - } + } - } + if (fatom != null) // )&& chain.ds != null) + { + chain = (PDBChain) pdb.chains.elementAt(foundchain); + } + } - if (fatom != null) //)&& chain.ds != null) - { - chain = (PDBChain) pdb.chains.elementAt(foundchain); - } - } + return fatom; + } + + public void update(Graphics g) + { + paint(g); + } + + public void highlightRes(int ii) + { + if (!seqColoursReady) + { + return; + } - return fatom; + if (highlightRes != null && highlightRes.contains((ii - 1) + "")) + { + return; } - public void update(Graphics g) + int index = -1; + Bond tmpBond; + for (index = 0; index < mainchain.bonds.size(); index++) { - paint(g); + tmpBond = (Bond) mainchain.bonds.elementAt(index); + if (tmpBond.at1.alignmentMapping == ii - 1) + { + if (highlightBond1 != null) + { + highlightBond1.at2.isSelected = false; + } + + if (highlightBond2 != null) + { + highlightBond2.at1.isSelected = false; + } + + highlightBond1 = null; + highlightBond2 = null; + + if (index > 0) + { + highlightBond1 = (Bond) mainchain.bonds.elementAt(index - 1); + highlightBond1.at2.isSelected = true; + } + + if (index != mainchain.bonds.size()) + { + highlightBond2 = (Bond) mainchain.bonds.elementAt(index); + highlightBond2.at1.isSelected = true; + } + + break; + } } - public void highlightRes(int ii) - { - if(!seqColoursReady) - return; + redrawneeded = true; + repaint(); + } - if (highlightRes != null - && highlightRes.contains((ii-1) + "")) - { - return; - } + public void setAllchainsVisible(boolean b) + { + for (int ii = 0; ii < pdb.chains.size(); ii++) + { + PDBChain chain = (PDBChain) pdb.chains.elementAt(ii); + chain.isVisible = b; + } + mainchain.isVisible = true; + findCentre(); + setupBonds(); + } - int index = -1; - Bond tmpBond; - for(index=0; index 0) - { - highlightBond1 = (Bond) mainchain.bonds.elementAt(index - 1); - highlightBond1.at2.isSelected = true; - } + lastMessage = pdbResNum + chain; + } - if (index != mainchain.bonds.size()) - { - highlightBond2 = (Bond) mainchain.bonds.elementAt(index); - highlightBond2.at1.isSelected = true; - } + StringBuffer resetLastRes = new StringBuffer(); - break; - } - } + StringBuffer eval = new StringBuffer(); - redrawneeded = true; - repaint(); - } + public void highlightAtom(int atomIndex, int pdbResNum, String chain, + String pdbfile) + { + if (!seqColoursReady) + { + return; + } + if (highlightRes != null && highlightRes.contains((atomIndex - 1) + "")) + { + return; + } - public void setAllchainsVisible(boolean b) + int index = -1; + Bond tmpBond; + for (index = 0; index < mainchain.bonds.size(); index++) { - for (int ii = 0; ii < pdb.chains.size(); ii++) + tmpBond = (Bond) mainchain.bonds.elementAt(index); + if (tmpBond.at1.atomIndex == atomIndex) { - PDBChain chain = (PDBChain) pdb.chains.elementAt(ii); - chain.isVisible = b; + if (highlightBond1 != null) + { + highlightBond1.at2.isSelected = false; + } + + if (highlightBond2 != null) + { + highlightBond2.at1.isSelected = false; + } + + highlightBond1 = null; + highlightBond2 = null; + + if (index > 0) + { + highlightBond1 = (Bond) mainchain.bonds.elementAt(index - 1); + highlightBond1.at2.isSelected = true; + } + + if (index != mainchain.bonds.size()) + { + highlightBond2 = (Bond) mainchain.bonds.elementAt(index); + highlightBond2.at1.isSelected = true; + } + + break; } - mainchain.isVisible = true; - findCentre(); - setupBonds(); } + redrawneeded = true; + repaint(); + } + + public Color getColour(int atomIndex, int pdbResNum, String chain, + String pdbfile) + { + return Color.white; + // if (!pdbfile.equals(pdbentry.getFile())) + // return null; + + // return new Color(viewer.getAtomArgb(atomIndex)); + } + + public void updateColours(Object source) + { + colourBySequence(); + redrawneeded = true; + repaint(); + } + + @Override + public void releaseReferences(Object svl) + { + // TODO Auto-generated method stub + + } + }