package aliview.gui;
import java.awt.FlowLayout;
import java.awt.Point;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Box.Filler;
import javax.swing.event.ListDataEvent;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import utils.nexus.CharSet;
import aliview.alignment.Alignment;
import aliview.alignment.AlignmentEvent;
import aliview.alignment.AlignmentListener;
import aliview.gui.pane.AlignmentPane;
import aliview.gui.pane.InvalidAlignmentPositionException;
import aliview.sequencelist.AlignmentDataEvent;
import aliview.sequencelist.AlignmentDataListener;
import aliview.sequencelist.AlignmentSelectionEvent;
import aliview.sequencelist.AlignmentSelectionListener;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.GridLayout;
import javax.swing.JSeparator;
import javax.swing.SwingConstants;
import javax.swing.BoxLayout;
import java.awt.Component;
import java.util.ArrayList;
import javax.swing.Box;
public class StatusPanel extends JPanel implements AlignmentListener, AlignmentDataListener, AlignmentSelectionListener{
private static final Logger logger = Logger.getLogger(StatusPanel.class);
private Alignment alignment;
private AlignmentPane aliPane;
private Point pointerPos;
private JLabel lblInfo;
private JLabel lblTxtPos;
private long selectionSize;
private int posInSeq;
private int posInUngapedSeq;
private int selectedColumnCount;
private int selectedSeqCount;
private String firstSelectedSequenceName = "";
private String firstSelectedCharsetName = "";
private JLabel lblTotalSelectedChars;
private JLabel lblCols;
private JLabel lblSelectedSeqCount;
private JLabel lblPosUngaped;
private JLabel lblPos;
private JLabel lblSelectedName;
private JLabel lblAlignmentInfo;
private JLabel lblTxtCharset;
private JLabel lblCharset;
public StatusPanel(AlignmentPane alignmentPane, Alignment alignment) {
this.aliPane = alignmentPane;
this.alignment = alignment;
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
//this.setBackground(Color.red);
lblInfo = new JLabel();
lblInfo.setText(" Selected: ");
this.add(lblInfo);
lblInfo.setPreferredSize(lblInfo.getPreferredSize());
lblInfo.setMinimumSize(lblInfo.getPreferredSize());
lblSelectedName = new JLabel("Woodsia macrolaena and more...");
lblSelectedName.setHorizontalAlignment(SwingConstants.LEADING);
//lblSelectedName.setPreferredSize(lblSelectedName.getPreferredSize());
lblSelectedName.setPreferredSize(new Dimension(Short.MAX_VALUE,0));
lblSelectedName.setMinimumSize(new Dimension(0,0));
add(lblSelectedName);
lblSelectedName.setText("");
//add(Box.createHorizontalGlue());
// add(new Box.Filler(new Dimension(0,0), new Dimension(Short.MAX_VALUE,0), new Dimension(Short.MAX_VALUE, 0)));
add(createStatusPanelSeparator());
// add charset info if needed
if(alignment.getAlignmentMeta().getCharsets().size() > 0){
lblTxtCharset = new JLabel("Charset:");
add(lblTxtCharset);
lblTxtCharset.setPreferredSize(lblTxtCharset.getPreferredSize());
lblCharset = new JLabel("CharsetNameIsThis_1");
add(lblCharset);
lblCharset.setHorizontalAlignment(SwingConstants.LEADING);
lblCharset.setPreferredSize(lblCharset.getPreferredSize());
lblCharset.setMinimumSize(lblCharset.getPreferredSize());
lblCharset.setText("");
add(createStatusPanelSeparator());
}
lblTxtPos = new JLabel("Pos:");
add(lblTxtPos);
lblTxtPos.setPreferredSize(lblTxtPos.getPreferredSize());
lblPos = new JLabel("3009909");
add(lblPos);
lblPos.setHorizontalAlignment(SwingConstants.CENTER);
lblPos.setPreferredSize(lblPos.getPreferredSize());
lblPos.setMinimumSize(lblPos.getPreferredSize());
lblPos.setText("");
add(createStatusPanelSeparator());
JLabel lblNewLabel_3 = new JLabel("Pos (ungaped):");
add(lblNewLabel_3);
lblNewLabel_3.setPreferredSize(lblNewLabel_3.getPreferredSize());
lblPosUngaped = new JLabel("2776569");
add(lblPosUngaped);
lblPosUngaped.setHorizontalAlignment(SwingConstants.CENTER);
lblPosUngaped.setPreferredSize(lblPosUngaped.getPreferredSize());
lblPosUngaped.setMinimumSize(lblPosUngaped.getPreferredSize());
//lblPosUngaped.setMaximumSize(lblPosUngaped.getPreferredSize());
lblPosUngaped.setText("");
add(createStatusPanelSeparator());
JLabel lblNewLabel_5 = new JLabel("Selected seqs:");
add(lblNewLabel_5);
lblNewLabel_5.setPreferredSize(lblNewLabel_5.getPreferredSize());
lblSelectedSeqCount = new JLabel("39879");
add(lblSelectedSeqCount);
lblSelectedSeqCount.setHorizontalAlignment(SwingConstants.CENTER);
lblSelectedSeqCount.setPreferredSize(lblSelectedSeqCount.getPreferredSize());
lblSelectedSeqCount.setMinimumSize(lblSelectedSeqCount.getPreferredSize());
//lblSelectedSeqCount.setMaximumSize(lblSelectedSeqCount.getPreferredSize());
lblSelectedSeqCount.setText("");
add(createStatusPanelSeparator());
JLabel lblNewLabel_1 = new JLabel("Cols:");
lblNewLabel_1.setPreferredSize(lblNewLabel_1.getPreferredSize());
lblNewLabel_1.setMinimumSize(lblNewLabel_1.getPreferredSize());
lblNewLabel_1.setMaximumSize(lblNewLabel_1.getPreferredSize());
add(lblNewLabel_1);
lblCols = new JLabel("1087990");
add(lblCols);
lblCols.setHorizontalAlignment(SwingConstants.CENTER);
lblCols.setPreferredSize(lblCols.getPreferredSize());
lblCols.setMinimumSize(lblCols.getPreferredSize());
//lblCols.setMaximumSize(lblCols.getPreferredSize());
lblCols.setText("");
add(createStatusPanelSeparator());
JLabel lblNewLabel_8 = new JLabel("Total selected chars:");
add(lblNewLabel_8);
lblNewLabel_8.setPreferredSize(lblNewLabel_8.getPreferredSize());
lblNewLabel_8.setMaximumSize(lblNewLabel_8.getPreferredSize());
lblNewLabel_8.setMinimumSize(lblNewLabel_8.getPreferredSize());
lblNewLabel_8.setOpaque(true);
lblTotalSelectedChars = new JLabel("82099029");
add(lblTotalSelectedChars);
lblTotalSelectedChars.setHorizontalAlignment(SwingConstants.CENTER);
lblTotalSelectedChars.setPreferredSize(lblTotalSelectedChars.getPreferredSize());
//lblTotalSelectedChars.setMaximumSize(lblTotalSelectedChars.getPreferredSize());
lblTotalSelectedChars.setMinimumSize(lblTotalSelectedChars.getPreferredSize());
lblTotalSelectedChars.setText("");
add(createStatusPanelSeparator());
JLabel lblNewLabel_10 = new JLabel("Alignment:");
add(lblNewLabel_10);
lblNewLabel_10.setPreferredSize(lblNewLabel_10.getPreferredSize());
//lblNewLabel_10.setMaximumSize(lblNewLabel_10.getPreferredSize());
lblNewLabel_10.setMinimumSize(lblNewLabel_10.getPreferredSize());
logger.info(getPreferredSize());
lblAlignmentInfo = new JLabel("_133009 sequences 5509309pos.__");
add(lblAlignmentInfo);
lblAlignmentInfo.setHorizontalAlignment(SwingConstants.CENTER);
lblAlignmentInfo.setPreferredSize(lblAlignmentInfo.getPreferredSize());
lblAlignmentInfo.setMaximumSize(lblAlignmentInfo.getPreferredSize());
lblAlignmentInfo.setMinimumSize(lblAlignmentInfo.getPreferredSize());
lblAlignmentInfo.setText("");
logger.info(getPreferredSize());
this.updateAll();
}
private Component createStatusPanelSeparator() {
JSeparator sep = new JSeparator(SwingConstants.VERTICAL);
sep.setPreferredSize(new Dimension(7,18));
sep.setMaximumSize(sep.getPreferredSize());
sep.setMinimumSize(sep.getPreferredSize());
return sep;
}
public void updateAll() {
updateAlignmentText();
updateSelectionText();
}
public void updateSelectionText(){
if(alignment != null && selectionSize > 0){
String firstSelSeqName = StringUtils.substring(firstSelectedSequenceName, 0, 40);
if(selectedSeqCount > 1){
firstSelSeqName +="...";
}
String selSize = "" + selectionSize;
String ungapPos = "" + posInUngapedSeq;
String posInSeqTxt = "" + (posInSeq + 1); // +1 because internally we are working with 0 as first pos and first sequence
if(selectionSize == 0){
ungapPos = "";
posInSeqTxt = "";
}
lblSelectedName.setText(firstSelSeqName);
if(lblCharset != null){
lblCharset.setText(StringUtils.substring(firstSelectedCharsetName, 0, 40));
}
lblPos.setText(posInSeqTxt);
lblPosUngaped.setText(ungapPos);
lblSelectedSeqCount.setText("" + selectedSeqCount);
lblCols.setText("" + selectedColumnCount);
lblTotalSelectedChars.setText("" + selectionSize);
}else{
lblSelectedName.setText("");
if(lblCharset != null){
lblCharset.setText("");
}
lblPos.setText("");
lblPosUngaped.setText("");
lblSelectedSeqCount.setText("");
lblCols.setText("");
lblTotalSelectedChars.setText("");
}
}
public void updateAlignmentText(){
if(alignment == null){
lblAlignmentInfo.setText("no alignmnet loaded");
}else{
String seqCount = StringUtils.leftPad("" + alignment.getMaxY(), 6);
String width = StringUtils.leftPad("" + alignment.getMaxX(), 6);
lblAlignmentInfo.setText("" + seqCount + " sequences " + width + " pos. ");
}
}
public void setAlignment(Alignment alignment) {
this.alignment = alignment;
}
public void setPointerPos(Point pointerPos) {
this.pointerPos = pointerPos;
try {
posInSeq = aliPane.getPositionInSequenceAt(pointerPos);
posInUngapedSeq = aliPane.getUngapedPositionInSequenceAt(pointerPos);
} catch (InvalidAlignmentPositionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
updateSelectionText();
}
public void selectionChanged(AlignmentSelectionEvent e) {
logger.info("selectionChanged");
this.selectionSize = alignment.getSelectionSize();
this.selectedColumnCount = alignment.getSelectedColumnCount();
this.selectedSeqCount = alignment.getSelectedSequencesCount();
this.firstSelectedSequenceName = alignment.getFirstSelectedSequenceName();
if(firstSelectedSequenceName == null){
firstSelectedSequenceName = "";
}
ArrayList<CharSet> selectedCharsets = alignment.getSelectedCharsets();
if(selectedCharsets.size() == 0){
this.firstSelectedCharsetName = "";
}else{
for(CharSet charset: selectedCharsets){
this.firstSelectedCharsetName += charset.getName() + ",";
}
this.firstSelectedCharsetName = StringUtils.removeEnd(this.firstSelectedCharsetName, ",");
}
this.posInSeq = alignment.getFirstSelectedPositionX();
this.posInUngapedSeq = alignment.getFirstSelectedUngapedPositionX();
this.updateSelectionText();
}
//
// AlignmentListener
//
public void newSequences(AlignmentEvent alignmentEvent) {
this.updateAll();
}
public void alignmentMetaChanged(AlignmentEvent alignmentEvent) {
this.updateAll();
}
//
// AlignmentDataListener
//
public void intervalAdded(ListDataEvent e) {
if(e instanceof AlignmentDataEvent){
contentsChanged((AlignmentDataEvent)e);
}
}
public void intervalRemoved(ListDataEvent e) {
if(e instanceof AlignmentDataEvent){
contentsChanged((AlignmentDataEvent)e);
}
}
public void contentsChanged(ListDataEvent e) {
if(e instanceof AlignmentDataEvent){
contentsChanged((AlignmentDataEvent)e);
}
}
public void contentsChanged(AlignmentDataEvent e) {
this.updateAll();
}
}