Newer
Older
/* AbstractGraphPanel
*
* created: 2010
*
* This file is part of Artemis
*
* Copyright(C) 2010 Genome Research Limited
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package uk.ac.sanger.artemis.components.alignment;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
public class AbstractGraphPanel extends JPanel
{
private static final long serialVersionUID = 1L;
protected int start;
protected int end;
protected float pixPerBase;
protected BamView bamView;
protected int windowSize;
protected int max;
protected boolean autoWinSize = true;
protected int userWinSize = 1;
protected JPopupMenu popup = new JPopupMenu();
public AbstractGraphPanel()
{
super();
setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.gray));
setBackground(Color.white);
final MouseMotionListener mouseMotionListener = new MouseMotionListener()
{
public void mouseDragged(MouseEvent e)
{
if(e.getButton() == MouseEvent.BUTTON3)
return;
if(e.getClickCount() > 1)
{
bamView.getSelection().clear();
repaint();
return;
}
bamView.highlightRange(e,
MouseEvent.BUTTON1_DOWN_MASK & MouseEvent.BUTTON2_DOWN_MASK);
}
public void mouseMoved(MouseEvent e){}
};
addMouseMotionListener(mouseMotionListener);
}
protected void initPopupMenu(JComponent menu)
{
final JMenuItem setScale = new JMenuItem("Set the Window Size...");
setScale.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent _)
{
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
JPanel pane = new JPanel(gridbag);
final JTextField newWinSize = new JTextField(Integer.toString(userWinSize), 10);
final JLabel lab = new JLabel("Window size:");
c.gridy = 0;
pane.add(lab, c);
pane.add(newWinSize, c);
final JCheckBox autoSet = new JCheckBox("Automatically set window size", autoWinSize);
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
autoSet.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lab.setEnabled(!autoSet.isSelected());
newWinSize.setEnabled(!autoSet.isSelected());
}
});
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
pane.add(autoSet, c);
String window_options[] = { "OK", "Cancel" };
int select = JOptionPane.showOptionDialog(null, pane, "Window Size",
JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null,
window_options, window_options[0]);
if (select == 1)
return;
autoWinSize = autoSet.isSelected();
try
{
userWinSize = Integer.parseInt(newWinSize.getText().trim());
}
catch (NumberFormatException nfe)
{
return;
}
/**
* Draw maximum average value.
* @param g2
*/
protected void drawMax(Graphics2D g2)
{
DecimalFormat df = new DecimalFormat("0.#");
String maxStr = df.format((float)max/(float)windowSize);
FontMetrics fm = getFontMetrics(getFont());
g2.setColor(Color.black);
int xpos = bamView.getJspView().getVisibleRect().width - fm.stringWidth(maxStr) -
bamView.getJspView().getVerticalScrollBar().getWidth();
g2.drawString(maxStr, xpos, fm.getHeight());
}
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
protected void drawSelectionRange(final Graphics2D g2,
final float pixPerBase,
final int start,
final int end,
final Color c)
{
if(bamView.getSelection() != null)
{
final Range selectedRange = bamView.getSelection().getSelectionRange();
if(selectedRange != null)
{
int rangeStart = selectedRange.getStart();
int rangeEnd = selectedRange.getEnd();
if(end < rangeStart || start > rangeEnd)
return;
int x = (int) (pixPerBase*(rangeStart-bamView.getBaseAtStartOfView()));
int width = (int) (pixPerBase*(rangeEnd-rangeStart+1));
g2.setColor(c);
g2.fillRect(x, 0, width, getHeight());
}
}
}
protected void setStartAndEnd(int start, int end)
{
this.start = start;
this.end = end;
}
protected void setPixPerBase(float pixPerBase)
{
this.pixPerBase = pixPerBase;
}
/**
* Popup menu listener
*/
class PopupListener extends MouseAdapter
{
JMenuItem gotoMateMenuItem;
JMenuItem showDetails;
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount() > 1)
bamView.getSelection().clear();
}
public void mousePressed(MouseEvent e)
{
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e)
{
maybeShowPopup(e);