/*******************************************************************************
* GenPlay, Einstein Genome Analyzer
* Copyright (C) 2009, 2014 Albert Einstein College of Medicine
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
* Authors: Julien Lajugie <julien.lajugie@einstein.yu.edu>
* Nicolas Fourel <nicolas.fourel@einstein.yu.edu>
* Eric Bouhassira <eric.bouhassira@einstein.yu.edu>
*
* Website: <http://genplay.einstein.yu.edu>
******************************************************************************/
package edu.yu.einstein.genplay.gui.controlPanel;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import edu.yu.einstein.genplay.core.manager.project.ProjectChromosomes;
import edu.yu.einstein.genplay.core.manager.project.ProjectManager;
import edu.yu.einstein.genplay.core.manager.project.ProjectWindow;
import edu.yu.einstein.genplay.dataStructure.chromosome.Chromosome;
import edu.yu.einstein.genplay.dataStructure.genomeWindow.SimpleGenomeWindow;
import edu.yu.einstein.genplay.gui.action.project.PAMoveFarLeft;
import edu.yu.einstein.genplay.gui.action.project.PAMoveFarRight;
import edu.yu.einstein.genplay.gui.action.project.PAMoveLeft;
import edu.yu.einstein.genplay.gui.action.project.PAMoveRight;
import edu.yu.einstein.genplay.gui.action.project.PAZoomIn;
import edu.yu.einstein.genplay.gui.action.project.PAZoomOut;
import edu.yu.einstein.genplay.gui.event.genomeWindowEvent.GenomeWindowEvent;
import edu.yu.einstein.genplay.gui.event.genomeWindowEvent.GenomeWindowListener;
/**
* The ChromosomePanel part of the {@link ControlPanel}
* @author Julien Lajugie
* @version 0.1
*/
final class ChromosomePanel extends JPanel implements MouseWheelListener, ItemListener, GenomeWindowListener {
private static final long serialVersionUID = -7749788921295566004L; // generated ID
private final JLabel jlChromosome; // label chromosome
private final JComboBox jcbChromosome; // combo box chromosome
private final ProjectChromosomes projectChromosomes; // Instance of the Chromosome Manager
private final ProjectWindow projectWindow; // Instance of the Genome Window Manager
/**
* Creates an instance of {@link ChromosomePanel}
* @param genomeWindow a {@link SimpleGenomeWindow}
*/
ChromosomePanel() {
projectChromosomes = ProjectManager.getInstance().getProjectChromosomes();
projectWindow = ProjectManager.getInstance().getProjectWindow();
jlChromosome = new JLabel(" Chromosome ");
// Create ComboBox for the chromosome selection
jcbChromosome = new JComboBox(projectChromosomes.toArray());
// select the first item case currentChromosome is not in the list
jcbChromosome.setSelectedIndex(0);
jcbChromosome.setSelectedItem(projectWindow.getGenomeWindow().getChromosome());
jcbChromosome.addItemListener(this);
// Add the components
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 0;
add(jlChromosome, gbc);
gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER;
//gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 1;
gbc.weighty = 0;
add(jcbChromosome, gbc);
addMouseWheelListener(this);
// Deactivate chromosome box key listener (bother the main frame key event management)
jcbChromosome.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(PAMoveLeft.ACCELERATOR, "none");
jcbChromosome.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(PAMoveFarLeft.ACCELERATOR, "none");
jcbChromosome.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(PAMoveRight.ACCELERATOR, "none");
jcbChromosome.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(PAMoveFarRight.ACCELERATOR, "none");
jcbChromosome.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(PAZoomIn.ACCELERATOR, "none");
jcbChromosome.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(PAZoomOut.ACCELERATOR, "none");
setOpaque(false);
}
@Override
public void genomeWindowChanged(GenomeWindowEvent evt) {
jcbChromosome.setSelectedItem(evt.getNewWindow().getChromosome());
}
@Override
public void itemStateChanged(ItemEvent arg0) {
Chromosome newChromosome = (Chromosome)jcbChromosome.getSelectedItem();
if ((newChromosome != null) && !newChromosome.equals(projectWindow.getGenomeWindow().getChromosome())) {
SimpleGenomeWindow newGenomeWindow = new SimpleGenomeWindow(newChromosome, 0, newChromosome.getLength());
projectWindow.setGenomeWindow(newGenomeWindow);
}
}
@Override
public void mouseWheelMoved(MouseWheelEvent mwe) {
if ((mwe.getWheelRotation() + jcbChromosome.getSelectedIndex()) < 0) {
jcbChromosome.setSelectedIndex(0);
} else if ((mwe.getWheelRotation() + jcbChromosome.getSelectedIndex()) > (jcbChromosome.getItemCount() - 1)) {
jcbChromosome.setSelectedIndex(jcbChromosome.getItemCount() - 1);
} else {
jcbChromosome.setSelectedIndex(mwe.getWheelRotation() + jcbChromosome.getSelectedIndex());
}
}
/**
* Enables or disables the chromosome panel
* @param b a boolean value, where true enables the component and false disables it
*/
public void setEnaled(boolean b) {
jcbChromosome.setEnabled(b);
super.setEnabled(b);
}
/**
* This method updates the chromosome panel when a project is loaded.
*/
public void updateChromosomePanel () {
jcbChromosome.removeAllItems();
for (Chromosome currentChromosome: projectChromosomes) {
jcbChromosome.addItem(currentChromosome);
}
}
}