diff --git a/biojava-genome/src/main/java/org/biojava/nbio/genome/util/ChromosomeMappingTools.java b/biojava-genome/src/main/java/org/biojava/nbio/genome/util/ChromosomeMappingTools.java index 422f3fdfa3..07ace5278b 100644 --- a/biojava-genome/src/main/java/org/biojava/nbio/genome/util/ChromosomeMappingTools.java +++ b/biojava-genome/src/main/java/org/biojava/nbio/genome/util/ChromosomeMappingTools.java @@ -39,7 +39,7 @@ public static String formatExonStructure(GeneChromosomePosition chromosomePositi return formatExonStructureReverse(chromosomePosition); } - + private static String formatExonStructureForward(GeneChromosomePosition chromPos) { diff --git a/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/align/gui/jmol/MultipleAlignmentJmol.java b/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/align/gui/jmol/MultipleAlignmentJmol.java index 3efd52964a..3c4cacc0e8 100644 --- a/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/align/gui/jmol/MultipleAlignmentJmol.java +++ b/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/align/gui/jmol/MultipleAlignmentJmol.java @@ -20,6 +20,7 @@ */ package org.biojava.nbio.structure.align.gui.jmol; +import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; @@ -40,6 +41,7 @@ import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuBar; +import javax.swing.JPanel; import javax.swing.JTextField; import org.biojava.nbio.structure.Atom; @@ -56,6 +58,7 @@ import org.biojava.nbio.structure.align.multiple.util.MultipleAlignmentTools; import org.biojava.nbio.structure.align.multiple.util.MultipleAlignmentWriter; import org.biojava.nbio.structure.align.webstart.AligUIManager; +import org.biojava.nbio.structure.gui.WrapLayout; import org.biojava.nbio.structure.jama.Matrix; import org.forester.archaeopteryx.Archaeopteryx; import org.forester.phylogeny.Phylogeny; @@ -137,14 +140,13 @@ public void windowClosing(WindowEvent e) { }); Container contentPane = frame.getContentPane(); - Box vBox = Box.createVerticalBox(); jmolPanel.addMouseMotionListener(this); jmolPanel.addMouseListener(this); - jmolPanel - .setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT)); + jmolPanel.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT)); + contentPane.add(jmolPanel,BorderLayout.CENTER); - vBox.add(jmolPanel); + Box vBox = Box.createVerticalBox(); // / USER SCRIPTING COMMAND JTextField field = new JTextField(); @@ -162,8 +164,10 @@ public void windowClosing(WindowEvent e) { // / STRUCTURE SELECTION if (multAln != null) { - Box hBox00 = Box.createHorizontalBox(); - hBox00.setMaximumSize(new Dimension(Short.MAX_VALUE, 30)); + JPanel modelSelection = new JPanel(); + modelSelection.setLayout(new WrapLayout(WrapLayout.LEFT)); + modelSelection.setSize(new Dimension(DEFAULT_WIDTH,30)); + vBox.add(modelSelection); JButton show = new JButton("Show Only: "); show.addActionListener(new ActionListener() { @@ -184,27 +188,16 @@ public void actionPerformed(ActionEvent e) { jmolPanel.executeCmd(cmd + " restore selection;"); } }); - hBox00.add(show); - hBox00.add(Box.createGlue()); - vBox.add(hBox00); + modelSelection.add(show); - // A line of structures of maximum 5 - for (int line = 0; line < 1 + (multAln.size() / 5); line++) { - Box hBox0 = Box.createHorizontalBox(); - hBox0.setMaximumSize(new Dimension(Short.MAX_VALUE, 30)); - - for (int str = line * 5; str < Math.min((line + 1) * 5, - multAln.size()); str++) { - JCheckBox structureSelection = new JCheckBox(multAln - .getEnsemble().getStructureIdentifiers().get(str) - .getIdentifier()); - hBox0.add(structureSelection); - hBox0.add(Box.createGlue()); - structureSelection.setSelected(true); - selectedStructures.add(structureSelection); - } - - vBox.add(hBox0); + // Check boxes for all models + for(int str = 0; str < multAln.size();str++) { + JCheckBox structureSelection = new JCheckBox(multAln + .getEnsemble().getStructureIdentifiers().get(str) + .getIdentifier()); + modelSelection.add(structureSelection); + structureSelection.setSelected(true); + selectedStructures.add(structureSelection); } } @@ -214,21 +207,20 @@ public void actionPerformed(ActionEvent e) { String[] styles = new String[] { "Cartoon", "Backbone", "CPK", "Ball and Stick", "Ligands", "Ligands and Pocket" }; - JComboBox style = new JComboBox(styles); + JComboBox style = new JComboBox<>(styles); hBox1.setMaximumSize(new Dimension(Short.MAX_VALUE, 30)); hBox1.add(new JLabel("Style")); hBox1.add(style); vBox.add(hBox1); - contentPane.add(vBox); style.addActionListener(jmolPanel); String[] colorModes = new String[] { "Secondary Structure", "By Chain", "Rainbow", "By Element", "By Amino Acid", "Hydrophobicity", "Suggest Domains", "Show SCOP Domains" }; - JComboBox jcolors = new JComboBox(colorModes); + JComboBox jcolors = new JComboBox<>(colorModes); jcolors.addActionListener(jmolPanel); hBox1.add(Box.createGlue()); @@ -236,13 +228,14 @@ public void actionPerformed(ActionEvent e) { hBox1.add(jcolors); String[] cPalette = { "Spectral", "Set1", "Set2", "Pastel" }; - JComboBox palette = new JComboBox(cPalette); + JComboBox palette = new JComboBox<>(cPalette); palette.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - JComboBox source = (JComboBox) e.getSource(); + @SuppressWarnings("unchecked") + JComboBox source = (JComboBox) e.getSource(); String value = source.getSelectedItem().toString(); evalString("save selection; select *; color grey; " + "select ligand; color CPK;"); @@ -268,6 +261,7 @@ public void actionPerformed(ActionEvent e) { // / CHECK BOXES Box hBox2 = Box.createHorizontalBox(); + hBox2.setMaximumSize(new Dimension(Short.MAX_VALUE, 30)); JButton resetDisplay = new JButton("Reset Display"); resetDisplay.addActionListener(new ActionListener() { @@ -337,7 +331,7 @@ public void itemStateChanged(ItemEvent e) { vBox.add(hBox); - contentPane.add(vBox); + contentPane.add(vBox,BorderLayout.SOUTH); MyJmolStatusListener li = (MyJmolStatusListener) jmolPanel .getStatusListener(); diff --git a/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/gui/WrapLayout.java b/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/gui/WrapLayout.java new file mode 100644 index 0000000000..1516a643ef --- /dev/null +++ b/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/gui/WrapLayout.java @@ -0,0 +1,195 @@ +package org.biojava.nbio.structure.gui; + +import java.awt.*; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +/** + * FlowLayout subclass that fully supports wrapping of components. + * + * Originally written by Rob Camick + * https://tips4java.wordpress.com/2008/11/06/wrap-layout/ + */ +public class WrapLayout extends FlowLayout +{ + private Dimension preferredLayoutSize; + + /** + * Constructs a new WrapLayout with a left + * alignment and a default 5-unit horizontal and vertical gap. + */ + public WrapLayout() + { + super(); + } + + /** + * Constructs a new FlowLayout with the specified + * alignment and a default 5-unit horizontal and vertical gap. + * The value of the alignment argument must be one of + * WrapLayout, WrapLayout, + * or WrapLayout. + * @param align the alignment value + */ + public WrapLayout(int align) + { + super(align); + } + + /** + * Creates a new flow layout manager with the indicated alignment + * and the indicated horizontal and vertical gaps. + *

+ * The value of the alignment argument must be one of + * WrapLayout, WrapLayout, + * or WrapLayout. + * @param align the alignment value + * @param hgap the horizontal gap between components + * @param vgap the vertical gap between components + */ + public WrapLayout(int align, int hgap, int vgap) + { + super(align, hgap, vgap); + } + + /** + * Returns the preferred dimensions for this layout given the + * visible components in the specified target container. + * @param target the component which needs to be laid out + * @return the preferred dimensions to lay out the + * subcomponents of the specified container + */ + @Override + public Dimension preferredLayoutSize(Container target) + { + return layoutSize(target, true); + } + + /** + * Returns the minimum dimensions needed to layout the visible + * components contained in the specified target container. + * @param target the component which needs to be laid out + * @return the minimum dimensions to lay out the + * subcomponents of the specified container + */ + @Override + public Dimension minimumLayoutSize(Container target) + { + Dimension minimum = layoutSize(target, false); + minimum.width -= (getHgap() + 1); + return minimum; + } + + /** + * Returns the minimum or preferred dimension needed to layout the target + * container. + * + * @param target target to get layout size for + * @param preferred should preferred size be calculated + * @return the dimension to layout the target container + */ + private Dimension layoutSize(Container target, boolean preferred) + { + synchronized (target.getTreeLock()) + { + // Each row must fit with the width allocated to the containter. + // When the container width = 0, the preferred width of the container + // has not yet been calculated so lets ask for the maximum. + + int targetWidth = target.getSize().width; + Container container = target; + + while (container.getSize().width == 0 && container.getParent() != null) + { + container = container.getParent(); + } + + targetWidth = container.getSize().width; + + if (targetWidth == 0) + targetWidth = Integer.MAX_VALUE; + + int hgap = getHgap(); + int vgap = getVgap(); + Insets insets = target.getInsets(); + int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2); + int maxWidth = targetWidth - horizontalInsetsAndGap; + + // Fit components into the allowed width + + Dimension dim = new Dimension(0, 0); + int rowWidth = 0; + int rowHeight = 0; + + int nmembers = target.getComponentCount(); + + for (int i = 0; i < nmembers; i++) + { + Component m = target.getComponent(i); + + if (m.isVisible()) + { + Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize(); + + // Can't add the component to current row. Start a new row. + + if (rowWidth + d.width > maxWidth) + { + addRow(dim, rowWidth, rowHeight); + rowWidth = 0; + rowHeight = 0; + } + + // Add a horizontal gap for all components after the first + + if (rowWidth != 0) + { + rowWidth += hgap; + } + + rowWidth += d.width; + rowHeight = Math.max(rowHeight, d.height); + } + } + + addRow(dim, rowWidth, rowHeight); + + dim.width += horizontalInsetsAndGap; + dim.height += insets.top + insets.bottom + vgap * 2; + + // When using a scroll pane or the DecoratedLookAndFeel we need to + // make sure the preferred size is less than the size of the + // target containter so shrinking the container size works + // correctly. Removing the horizontal gap is an easy way to do this. + + Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target); + + if (scrollPane != null && target.isValid()) + { + dim.width -= (hgap + 1); + } + + return dim; + } + } + + /* + * A new row has been completed. Use the dimensions of this row + * to update the preferred size for the container. + * + * @param dim update the width and height when appropriate + * @param rowWidth the width of the row to add + * @param rowHeight the height of the row to add + */ + private void addRow(Dimension dim, int rowWidth, int rowHeight) + { + dim.width = Math.max(dim.width, rowWidth); + + if (dim.height > 0) + { + dim.height += getVgap(); + } + + dim.height += rowHeight; + } +} \ No newline at end of file diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java index e5f6e890c7..4d8541c2da 100644 --- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java +++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java @@ -721,7 +721,7 @@ public void documentEnd() { } // we'll only add seqres chains that are polymeric or unknown - if (type==null || (type!=null && type==EntityType.POLYMER) ) { + if (type==null || type==EntityType.POLYMER ) { seqResChains.add(seqres); } @@ -1318,6 +1318,7 @@ private void setStructNcsOps() { } } + /** This method will return the parsed protein structure, once the parsing has been finished * * @return a BioJava protein structure object diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ZipChemCompProvider.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ZipChemCompProvider.java index 5ffc9d06c9..ef7c984946 100644 --- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ZipChemCompProvider.java +++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ZipChemCompProvider.java @@ -167,7 +167,7 @@ private ChemComp downloadAndAdd(String recordName){ final File [] files = new File[1]; Path cif = m_tempDir.resolve("chemcomp").resolve(recordName + ".cif.gz"); files[0] = cif.toFile(); - if (files != null) { + if (files[0] != null) { addToZipFileSystem(m_zipFile, files, m_zipRootDir); if (m_removeCif) for (File f : files) f.delete(); }