public void analyze(String name, Object data) { if (!(data instanceof SequenceGroup)) { ErrorWindow.showErrorWindow( new Exception("Got a non-sequencegroup object for a dot plot analysis")); } SequenceGroup sg = (SequenceGroup) data; currentSG = sg; titleLabel.setText(name); DefaultComboBoxModel cModel1 = new DefaultComboBoxModel(); DefaultComboBoxModel cModel2 = new DefaultComboBoxModel(); for (int j = 0; j < sg.size(); j++) { cModel1.addElement(sg.get(j).getName()); cModel2.addElement(sg.get(j).getName()); } seq1Box.setModel(cModel1); seq2Box.setModel(cModel2); seq1Box.setSelectedIndex(0); seq2Box.setSelectedIndex(1); dotPlot.setBlockWidth((Integer) blockWidthSpinner.getValue()); changeSequences(); }
protected void changeSequences() { String name1 = (String) seq1Box.getSelectedItem(); Sequence seq1 = currentSG.getSequenceForName(name1); if (revComp1Box.isSelected()) { seq1 = seq1.getReverseComplement(); seq1.setName(name1); } String name2 = (String) seq2Box.getSelectedItem(); Sequence seq2 = currentSG.getSequenceForName(name2); if (revComp2Box.isSelected()) { seq2 = seq2.getReverseComplement(); seq2.setName(name2); } dotPlot.setSequences(seq1, seq2); repaint(); }
private void initializeComponents() { mainPanel = new JPanel(); mainScrollPane = new JScrollPane(mainPanel); mainPanel.setLayout(new BorderLayout()); mainPanel.setMinimumSize(new Dimension(300, 300)); mainPanel.setBackground(Color.white); mainScrollPane.setBackground(Color.white); this.setLayout(new BorderLayout()); this.add(mainScrollPane, BorderLayout.CENTER); JPanel leftPanel = new JPanel(); leftPanel.setBackground(Color.white); leftPanel.setMinimumSize(new Dimension(200, 10)); leftPanel.setPreferredSize(new Dimension(200, 10)); mainPanel.add(leftPanel, BorderLayout.WEST); leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS)); titleLabel = new JLabel(); titleLabel.setAlignmentX(RIGHT_ALIGNMENT); leftPanel.add(Box.createVerticalStrut(10)); leftPanel.add(titleLabel); JPanel buttonPanel = new JPanel(); buttonPanel.setOpaque(false); buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); JButton saveButton = new JButton("Save"); saveButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { saveImage(); } }); buttonPanel.add(saveButton); JButton restoreButton = new JButton("Restore"); restoreButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { restoreDefaultBounds(); } }); buttonPanel.add(restoreButton); JButton zoomButton = new JButton("Zoom"); zoomButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { zoomSelectedBounds(); } }); buttonPanel.add(zoomButton); leftPanel.add(buttonPanel); leftPanel.add(Box.createVerticalStrut(50)); seq1Box = new JComboBox(); seq1Box.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { changeSequences(); } }); leftPanel.add(seq1Box); seq1Box.setPreferredSize(new Dimension(180, 24)); seq1Box.setMaximumSize(new Dimension(Integer.MAX_VALUE, 28)); seq1Box.setAlignmentX(RIGHT_ALIGNMENT); revComp1Box = new JCheckBox("Use reverse complement"); revComp1Box.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { changeSequences(); } }); revComp1Box.setAlignmentX(RIGHT_ALIGNMENT); leftPanel.add(revComp1Box); leftPanel.add(Box.createVerticalStrut(10)); seq2Box = new JComboBox(); seq2Box.setPreferredSize(new Dimension(180, 24)); seq2Box.setMaximumSize(new Dimension(Integer.MAX_VALUE, 28)); seq2Box.setAlignmentX(RIGHT_ALIGNMENT); seq2Box.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { changeSequences(); } }); leftPanel.add(seq2Box); revComp2Box = new JCheckBox("Use reverse complement"); revComp2Box.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { changeSequences(); } }); revComp2Box.setAlignmentX(RIGHT_ALIGNMENT); leftPanel.add(revComp2Box); leftPanel.add(Box.createVerticalStrut(15)); blockWidthSpinner = new JSpinner(); blockWidthSpinner.setModel(new SpinnerNumberModel(3, 1, 100, 1)); blockWidthSpinner.setToolTipText("The number of sites used per rectangle"); blockWidthSpinner.addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent e) { updateBlockWidth(); } }); JPanel bwPanel = new JPanel(); bwPanel.setOpaque(false); bwPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); JLabel lab = new JLabel("Block width : "); bwPanel.add(lab); bwPanel.add(blockWidthSpinner); bwPanel.setAlignmentX(RIGHT_ALIGNMENT); leftPanel.add(bwPanel); leftPanel.add(Box.createVerticalGlue()); dotPlot = new DotPlotFigure(); dotPlot.setPreferredSize(new Dimension(300, 300)); mainPanel.add(dotPlot, BorderLayout.CENTER); }
protected void updateBlockWidth() { dotPlot.setBlockWidth((Integer) blockWidthSpinner.getValue()); dotPlot.repaint(); }
protected void restoreDefaultBounds() { dotPlot.restoreDefaultBounds(); }
/** Zoom in to the selection box */ protected void zoomSelectedBounds() { dotPlot.zoomToSelection(); }
public void paint(Graphics2D g) { if (sequenceOne == null || sequenceTwo == null) { System.out.println("Not drawing plot since one of the sequences is null"); return; } redrawImage = redrawImage || getVariablesHaveChanged(); if (redrawImage) drawImage(); int imageX = (int) Math.round(bounds.x * xFactor); int imageY = (int) Math.round(bounds.y * yFactor); if (imageIsBeingRedrawn) { g.drawString("Please wait", 20, 20); } else { if (useZoom) { // g.drawImage(dotPlotImage, imageX, imageY, dotPlotImage.getWidth(), // dotPlotImage.getHeight(), null); g.drawImage( dotPlotImage, imageX, imageY, imageX + dotPlotImage.getWidth(), imageY + dotPlotImage.getHeight(), sx1, sy1, sx2, sy2, null); // g.setColor(Color.RED); // g.drawRect(imageX+ sx1, imageY + sy1, sx2-sx1, sy2-sy1); // g.setColor(Color.black); } else g.drawImage( dotPlotImage, imageX, imageY, dotPlotImage.getWidth(), dotPlotImage.getHeight(), null); // Draw x-axis g.setColor(Color.black); int xAxisY = imageY + dotPlotImage.getHeight() + 1; // y-value in pixels of x-axis g.drawLine(imageX, xAxisY, imageX + dotPlotImage.getWidth(), xAxisY); g.setFont(labelFont); FontMetrics fm = g.getFontMetrics(); double tickStep = dotPlotImage.getWidth() / ((double) xAxisTicks - 1); for (int i = 0; i < xAxisTicks; i++) { int tickX = (int) Math.round(imageX + i * tickStep); g.drawLine(tickX, xAxisY, tickX, xAxisY + 4); String label = formatter.format(dataXForPixelX(tickX)); g.drawString(label, tickX - fm.stringWidth(label) / 2, xAxisY + 5 + fm.getHeight()); } // Draw the y-axis int yAxisX = (int) Math.round(bounds.x * xFactor); g.drawLine(yAxisX, imageY, yAxisX, imageY + dotPlotImage.getHeight()); tickStep = dotPlotImage.getHeight() / ((double) yAxisTicks - 1); for (int i = 0; i < yAxisTicks; i++) { int tickY = (int) Math.round(imageY + i * tickStep); g.drawLine(yAxisX - 4, tickY, yAxisX, tickY); String label = formatter.format(dataYForPixelY(tickY)); g.drawString(label, yAxisX - fm.stringWidth(label) - 6, tickY + 5); } if (yMarkerMax > 0 && (dotPlotParent.isCurrentlyRectSelecting() || dotPlotParent.isSelectionRectIsPreserved())) { g.setColor(Color.GRAY); g.drawLine(yAxisX - 6, yMarkerMax, yAxisX - 1, yMarkerMax); g.drawLine(yAxisX - 6, yMarkerMin, yAxisX - 1, yMarkerMin); g.drawLine(xMarkerMin, xAxisY + 1, xMarkerMin, xAxisY + 6); g.drawLine(xMarkerMax, xAxisY + 1, xMarkerMax, xAxisY + 6); g.drawString(formatter.format(dataXForPixelX(xMarkerMin)), xMarkerMin - 6, xAxisY + 17); g.drawString(formatter.format(dataXForPixelX(xMarkerMax)), xMarkerMax - 6, xAxisY + 17); String lab = formatter.format(dataYForPixelY(yMarkerMin)); g.drawString(lab, yAxisX - fm.stringWidth(lab) - 6, yMarkerMin + 4); lab = formatter.format(dataYForPixelY(yMarkerMax)); g.drawString(lab, yAxisX - fm.stringWidth(lab) - 6, yMarkerMax + 4); } } }