package aliview.gui;
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import javax.swing.JToggleButton;
import javax.swing.KeyStroke;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListDataEvent;
import javax.swing.text.DefaultEditorKit.PasteAction;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import utils.OSNativeUtils;
import utils.nexus.CharSet;
import utils.nexus.CharSets;
import aliview.AliView;
import aliview.AliViewWindow;
import aliview.GeneticCode;
import aliview.alignment.Alignment;
import aliview.alignment.AlignmentEvent;
import aliview.alignment.AlignmentListener;
import aliview.color.ColorScheme;
import aliview.color.ColorSchemeFactory;
import aliview.externalcommands.CommandItem;
import aliview.gui.pane.CharPixels;
import aliview.importer.FileFormat;
import aliview.sequencelist.AlignmentDataEvent;
import aliview.sequencelist.AlignmentDataListener;
import aliview.sequencelist.AlignmentSelectionEvent;
import aliview.sequencelist.AlignmentSelectionListener;
import aliview.sequencelist.FilePage;
import aliview.sequencelist.FileSequenceAlignmentListModel;
import aliview.settings.Settings;
import aliview.settings.SettingsListener;
public class AliViewJMenuBar extends JMenuBar implements AlignmentListener, AlignmentDataListener, AlignmentSelectionListener, SettingsListener{
private static final Logger logger = Logger.getLogger(AliViewJMenuBar.class);
private AliViewWindow aliViewWindow;
private ArrayList<AbstractButton> editFunctions = new ArrayList<AbstractButton>();
private ArrayList<AbstractButton> alwaysAvailableFunctions = new ArrayList<AbstractButton>();
private ArrayList<AbstractButton> loadedAlignmentFunctions = new ArrayList<AbstractButton>();
private ArrayList<AbstractButton> nucleotideFunctions = new ArrayList<AbstractButton>();
private ArrayList<AbstractButton> aminoAcidFunctions = new ArrayList<AbstractButton>();
private ArrayList<AbstractButton> hasSelectionFunctions = new ArrayList<AbstractButton>();
private ArrayList<AbstractButton> undoFunctions = new ArrayList<AbstractButton>();
private ArrayList<AbstractButton> reorderAndDeleteFunctions = new ArrayList<AbstractButton>();
private JMenu mnRecentFiles;
private JMenu mnExternal;
private JMenu mnFilePages;
private JMenu mnGeneticCodeCode;
private JMenuItem undoButton;
private JMenuItem redoButton;
private ButtonModel toggleTranslationButtonModel;
private ButtonModel highlightConsButtonModel;
private ButtonModel highlightNonConsButtonModel;
private ButtonModel highlightDiffButtonModel;
private ButtonModel decFontSizeButtonModel;
private ButtonModel incFontSizeButtonModel;
private ButtonModel drawCoonPosOnRulerButtonModel;
private ButtonModel nonCodingButtonModel;
private ButtonModel showAACodeButtonMoes;
private ButtonModel coding1ButtonModel;
private ButtonModel coding0ButtonModel;
private ButtonModel coding2ButtonModel;
private ButtonModel transOnePosButtonModel;
private ButtonModel copyAsFastaButtonModel;
private ButtonModel copyAsCharatersButtonModel;
private ButtonModel realignSelectedBlockButtonModel;
private ButtonModel realignSelectedSequencesButtonModel;
private ButtonModel pasteAsFastaButtonModel;
private ButtonModel editModeButtonModel;
private boolean menuLock;
private ButtonModel copyNameButtonModel;
private ButtonModel renameButtonModel;
private JMenu mnSelectCharset;
private ButtonModel countCodonButtonModel;
private ButtonModel addEmptySeqButtonModel;
/*
*
* TODO Currently the MenuBar is containing both the GUI and all the Actions
* The button models are shared with Popup menu, ToolBar etc.
* this could be separated into menu and then separate Actions
* The menu buttons are also taking responsibility for when "Actions" are enabled/disabled
*
*
*/
public AliViewJMenuBar(AliViewWindow aliViewWin){
super();
aliViewWindow = aliViewWin;
logger.debug("create menubar");
JMenu mnFile = new JMenu("File");
mnFile.setMnemonic(KeyEvent.VK_F);
this.add(mnFile);
JMenuItem mntmNew = new JMenuItem("New");
mntmNew.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AliView.createNewWindow();
}
});
mntmNew.setIcon(AppIcons.getNewIcon());
mntmNew.setAccelerator(OSNativeUtils.getNewFileAccelerator());
mnFile.add(mntmNew);
alwaysAvailableFunctions.add(mntmNew);
JMenuItem mntmOpenFile = new JMenuItem("Open File");
mntmOpenFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AliView.openAlignmentFileViaChooser(aliViewWindow.getParent());
}
});
mntmOpenFile.setAccelerator(OSNativeUtils.getOpenFileAccelerator());
mnFile.add(mntmOpenFile);
alwaysAvailableFunctions.add(mntmOpenFile);
mnFile.add(new JSeparator());
mnRecentFiles = new JMenu("Recent Files");
mnFile.add(mnRecentFiles);
rebuildRecentFilesSubmenu();
alwaysAvailableFunctions.add(mnRecentFiles);
mnFile.add(new JSeparator());
JMenuItem mntmReloadFile = new JMenuItem("Reload file");
mntmReloadFile.setAccelerator(OSNativeUtils.getReloadKeyAccelerator());
mntmReloadFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.reloadCurrentFile();
}
});
mnFile.add(mntmReloadFile);
loadedAlignmentFunctions.add(mntmReloadFile);
mnFile.add(new JSeparator());
JMenuItem saveFileMenu = new JMenuItem("Save");
saveFileMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
aliViewWindow.saveAlignmentFile();
}
});
saveFileMenu.setAccelerator(OSNativeUtils.getSaveFileAccelerator());
mnFile.add(saveFileMenu);
loadedAlignmentFunctions.add(saveFileMenu);
JMenuItem saveAlignmentAsFastaNebu = new JMenuItem("Save as Fasta");
saveAlignmentAsFastaNebu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.FASTA, false);
}
});
mnFile.add(saveAlignmentAsFastaNebu);
loadedAlignmentFunctions.add(saveAlignmentAsFastaNebu);
JMenuItem mntmSaveAlignmentAsNexus = new JMenuItem("Save as Nexus");
mntmSaveAlignmentAsNexus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.NEXUS, false);
}
});
mnFile.add(mntmSaveAlignmentAsNexus);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsNexus);
JMenuItem mntmSaveAlignmentAsSimpleNexus = new JMenuItem("Save as Nexus (Illegal name chars replaced by _ (e.g. for MrBayes)");
mntmSaveAlignmentAsSimpleNexus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.NEXUS_SIMPLE, false);
}
});
mnFile.add(mntmSaveAlignmentAsSimpleNexus);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsSimpleNexus);
JMenuItem mntmSaveAlignmentAsNexusCodon = new JMenuItem("Save as codonpos Nexus (codonpos as charsets - excluded removed)");
mntmSaveAlignmentAsNexusCodon.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.NEXUS_CODONPOS_CHARSET, false);
}
});
mnFile.add(mntmSaveAlignmentAsNexusCodon);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsNexusCodon);
nucleotideFunctions.add(mntmSaveAlignmentAsNexusCodon);
JMenuItem mntmSaveAlignmentAsPhylipRelaxedPadded = new JMenuItem("Save as Phylip (full names & padded)");
mntmSaveAlignmentAsPhylipRelaxedPadded.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.PHYLIP_RELAXED_PADDED_AKA_LONG_NAME_SEQUENTIAL, false);
}
});
mnFile.add(mntmSaveAlignmentAsPhylipRelaxedPadded);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsPhylipRelaxedPadded);
JMenu menuPhylipSubmenu = new JMenu("Save as Phylip (other format versions)");
mnFile.add(menuPhylipSubmenu);
JMenuItem mntmSaveAlignmentAsPhylipRelaxedPaddedInterleaved = new JMenuItem("Save as Phylip (full names, padded & interleaved)");
mntmSaveAlignmentAsPhylipRelaxedPaddedInterleaved.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.PHYLIP_RELAXED_PADDED_INTERLEAVED_AKA_LONG_NAME_INTERLEAVED, false);
}
});
menuPhylipSubmenu.add(mntmSaveAlignmentAsPhylipRelaxedPaddedInterleaved);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsPhylipRelaxedPaddedInterleaved);
JMenuItem mntmSaveAlignmentAsPhylip = new JMenuItem("Save as Phylip (full names)");
mntmSaveAlignmentAsPhylip.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.PHYLIP_RELAXED, false);
}
});
menuPhylipSubmenu.add(mntmSaveAlignmentAsPhylip);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsPhylip);
JMenuItem mntmSaveAlignmentAsPhylipStrictSequential = new JMenuItem("Save as Phylip (strict 10 char names)");
mntmSaveAlignmentAsPhylipStrictSequential.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.PHYLIP_STRICT_SEQUENTIAL_AKA_SHORT_NAME_SEQUENTIAL, false);
}
});
menuPhylipSubmenu.add(mntmSaveAlignmentAsPhylipStrictSequential);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsPhylipStrictSequential);
JMenuItem mntmSaveAlignmentAsClustal = new JMenuItem("Save as Clustal (aln)");
mntmSaveAlignmentAsClustal.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.CLUSTAL, false);
}
});
mnFile.add(mntmSaveAlignmentAsClustal);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsClustal);
JMenuItem mntmSaveAlignmentAsMSF = new JMenuItem("Save as MSF/GCG");
mntmSaveAlignmentAsMSF.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.MSF, false);
}
});
mnFile.add(mntmSaveAlignmentAsMSF);
loadedAlignmentFunctions.add(mntmSaveAlignmentAsMSF);
mnFile.add(new JSeparator());
JMenuItem mntmSaveSelAsFasta = new JMenuItem("Save selection as Fasta");
mntmSaveSelAsFasta.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveSelectionAsFastaFileViaChooser();
}
});
mnFile.add(mntmSaveSelAsFasta);
hasSelectionFunctions.add(mntmSaveSelAsFasta);
mnFile.add(new JSeparator());
JMenuItem mntmSaveTranslatedAlignmentAsFasta = new JMenuItem("Save Translated alignment (Amino Acid) as Fasta");
mntmSaveTranslatedAlignmentAsFasta.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.FASTA_TRANSLATED_AMINO_ACID, false);
}
});
mnFile.add(mntmSaveTranslatedAlignmentAsFasta);
loadedAlignmentFunctions.add(mntmSaveTranslatedAlignmentAsFasta);
nucleotideFunctions.add(mntmSaveTranslatedAlignmentAsFasta);
/*
JMenuItem mntmSaveTranslatedAlignmentAsPhylip = new JMenuItem("Save Translated alignment (Amino Acid) as Phylip");
mntmSaveTranslatedAlignmentAsPhylip.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.PHYLIP_TRANSLATED_AMINO_ACID, false);
}
});
mnFile.add(mntmSaveTranslatedAlignmentAsPhylip);
loadedAlignmentFunctions.add(mntmSaveTranslatedAlignmentAsPhylip);
nucleotideFunctions.add(mntmSaveTranslatedAlignmentAsPhylip);
JMenuItem mntmSaveTranslatedAlignmentAsNexus = new JMenuItem("Save Translated alignment (Amino Acid) as Nexus");
mntmSaveTranslatedAlignmentAsNexus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.NEXUS_TRANSLATED_AMINO_ACID, false);
}
});
mnFile.add(mntmSaveTranslatedAlignmentAsNexus);
loadedAlignmentFunctions.add(mntmSaveTranslatedAlignmentAsNexus);
nucleotideFunctions.add(mntmSaveTranslatedAlignmentAsNexus);
*/
mnFile.add(new JSeparator());
JMenuItem mntmSaveFastaIndex = new JMenuItem("Save fasta index file (.fai)");
mntmSaveFastaIndex.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveFastaIndex();
}
});
mnFile.add(mntmSaveFastaIndex);
loadedAlignmentFunctions.add(mntmSaveFastaIndex);
mnFile.add(new JSeparator());
JMenuItem mntmExportAlignmentAsImage = new JMenuItem("Export alignment as image");
mntmExportAlignmentAsImage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.saveAlignmentAsFileViaChooser(FileFormat.IMAGE_PNG, true);
}
});
mnFile.add(mntmExportAlignmentAsImage);
loadedAlignmentFunctions.add(mntmExportAlignmentAsImage);
mnFile.add(new JSeparator());
JMenuItem mntmExportRaxMLFile = new JMenuItem("Export RaxML partition file");
mntmExportRaxMLFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.exportRaxMLFile();
}
});
mnFile.add(mntmExportRaxMLFile);
loadedAlignmentFunctions.add(mntmExportRaxMLFile);
mnFile.add(new JSeparator());
// JMenuItem mntmGenoPheno = new JMenuItem("Genotype > phenotype");
// mntmGenoPheno.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// aliViewWindow.genotype2phenotype();
// }
// });
// mnFile.add(mntmGenoPheno);
// alwaysAvailableFunctions.add(mntmGenoPheno);
//
// mnFile.add(new JSeparator());
JMenuItem mntmPrint = new JMenuItem("Print");
mntmPrint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.printAlignment();
}
});
mnFile.add(mntmPrint);
mntmPrint.setAccelerator(OSNativeUtils.getPrintAccelerator());
loadedAlignmentFunctions.add(mntmPrint);
mnFile.add(new JSeparator());
/*
JMenuItem mntmDebug = new JMenuItem("Start debug");
mntmDebug.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.startDebug();
}
});
mnFile.add(mntmDebug);
alwaysAvailableFunctions.add(mntmDebug);
*/
JMenuItem mntmLogFile = new JMenuItem("Show message log");
mntmLogFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.showMessageLog();
}
});
mnFile.add(mntmLogFile);
alwaysAvailableFunctions.add(mntmLogFile);
mnFile.add(new JSeparator());
// show stats
JMenuItem mntmShowStats = new JMenuItem("Show statistics");
mntmShowStats.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.createStats();
}
});
mnFile.add(mntmShowStats);
alwaysAvailableFunctions.add(mntmShowStats);
// end show stats
// Mac has its own menu item
if(OSNativeUtils.isAnythingButMac()){
JMenuItem mntmExit = new JMenuItem("Exit");
mntmExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AliView.quitProgram();
}
});
mntmExit.setIcon(AppIcons.getQuitIcon());
mnFile.add(mntmExit);
alwaysAvailableFunctions.add(mntmExit);
}
JMenu mnEdit = new JMenu("Edit");
mnEdit.setMnemonic(KeyEvent.VK_E);
this.add(mnEdit);
undoButton = new JMenuItem("Undo");
undoButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.getUndoControler().undo();
}
});
undoButton.setAccelerator(OSNativeUtils.getUndoKeyAccelerator());
undoButton.setIcon(AppIcons.getUndoIcon());
mnEdit.add(undoButton);
undoFunctions.add(undoButton);
redoButton = new JMenuItem("Redo");
redoButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.getUndoControler().redo();
}
});
redoButton.setAccelerator(OSNativeUtils.getRedoKeyAccelerator());
redoButton.setIcon(AppIcons.getRedoIcon());
mnEdit.add(redoButton);
undoFunctions.add(redoButton);
mnEdit.add(new JSeparator());
JMenuItem mntmCopySelectionAsFasta = new JMenuItem("Copy selection as fasta");
mntmCopySelectionAsFasta.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.copySelectionAsFasta();
}
});
mntmCopySelectionAsFasta.setAccelerator(OSNativeUtils.getCopySelectionAsFastaKeyAccelerator());
copyAsFastaButtonModel = mntmCopySelectionAsFasta.getModel();
mnEdit.add(mntmCopySelectionAsFasta);
hasSelectionFunctions.add(mntmCopySelectionAsFasta);
JMenuItem mntmCopySelectionAsNucleotides = new JMenuItem("Copy selection as characters");
mntmCopySelectionAsNucleotides.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.copySelectionAsNucleotides();
}
});
mntmCopySelectionAsNucleotides.setAccelerator(OSNativeUtils.getCopyKeyAccelerator());
copyAsCharatersButtonModel = mntmCopySelectionAsNucleotides.getModel();
mnEdit.add(mntmCopySelectionAsNucleotides);
hasSelectionFunctions.add(mntmCopySelectionAsNucleotides);
JMenuItem mntmCopyName = new JMenuItem("Copy name(s) only");
mntmCopyName.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.copyNames();
}
});
//mntmCopyName.setAccelerator(OSNativeUtils.getCopyKeyAccelerator());
copyNameButtonModel = mntmCopyName.getModel();
mnEdit.add(mntmCopyName);
hasSelectionFunctions.add(mntmCopyName);
JMenuItem mntmPasteClipboard = new JMenuItem("Paste (fasta-sequences)");
mntmPasteClipboard.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.pasteFasta();
}
});
mntmPasteClipboard.setAccelerator(OSNativeUtils.getPasteKeyAccelerator());
pasteAsFastaButtonModel = mntmPasteClipboard.getModel();
mnEdit.add(mntmPasteClipboard);
editFunctions.add(mntmPasteClipboard);
alwaysAvailableFunctions.add(mntmPasteClipboard);
mnEdit.add(new JSeparator());
JMenuItem mntmRename = new JMenuItem("Rename sequence");
mntmRename.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.renameFirstSelected();
}
});
mntmRename.setAccelerator(OSNativeUtils.getRenameKeyAccelerator());
renameButtonModel = mntmRename.getModel();
mnEdit.add(mntmRename);
editFunctions.add(mntmRename);
hasSelectionFunctions.add(mntmRename);
mnEdit.add(new JSeparator());
JMenuItem mntmAddFromFile = new JMenuItem("Add sequences from file");
mntmAddFromFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.addSequencesFromFile(0);
}
});
mnEdit.add(mntmAddFromFile);
editFunctions.add(mntmAddFromFile);
JMenuItem mntmAddNewSeq = new JMenuItem("Add new empty sequence");
mntmAddNewSeq.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.addNewSequence();
}
});
addEmptySeqButtonModel = mntmAddNewSeq.getModel();
mnEdit.add(mntmAddNewSeq);
editFunctions.add(mntmAddNewSeq);
mnEdit.add(new JSeparator());
JCheckBoxMenuItem mntmEditMode = new JCheckBoxMenuItem("Edit mode");
mntmEditMode.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JCheckBoxMenuItem cbxItem = (JCheckBoxMenuItem) e.getSource();
aliViewWindow.setEditMode(cbxItem.isSelected());
}
});
editModeButtonModel = mntmEditMode.getModel();
mnEdit.add(mntmEditMode);
editFunctions.add(mntmEditMode);
loadedAlignmentFunctions.add(mntmEditMode);
JMenuItem mntmClearSelectedItem = new JMenuItem("Clear selected bases");
mntmClearSelectedItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.clearSelectedBases();
}
});
mntmClearSelectedItem.setIcon(AppIcons.getClearIcon());
mntmClearSelectedItem.setAccelerator(OSNativeUtils.getClearKeyAccelerator());
mnEdit.add(mntmClearSelectedItem);
editFunctions.add(mntmClearSelectedItem);
hasSelectionFunctions.add(mntmClearSelectedItem);
JMenuItem mntmDeleteSelectedItem = new JMenuItem("Delete selected");
mntmDeleteSelectedItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.deleteSelected();
}
});
mntmDeleteSelectedItem.setAccelerator(OSNativeUtils.getDeleteKeyAccelerator());
mnEdit.add(mntmDeleteSelectedItem);
reorderAndDeleteFunctions.add(mntmDeleteSelectedItem);
JMenuItem mntmRemoveVerticalGaps = new JMenuItem("Delete gap-only columns");
mntmRemoveVerticalGaps.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.deleteVerticalGaps();
}
});
//mntmRemoveVerticalGaps.setAccelerator(KeyStroke.getKeyStroke(??));
mnEdit.add(mntmRemoveVerticalGaps);
editFunctions.add(mntmRemoveVerticalGaps);
loadedAlignmentFunctions.add(mntmRemoveVerticalGaps);
JMenuItem mntmRemoveAllGaps = new JMenuItem("Delete all gaps in all sequences");
mntmRemoveAllGaps.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.deleteAllGaps();
}
});
mnEdit.add(mntmRemoveAllGaps);
editFunctions.add(mntmRemoveAllGaps);
loadedAlignmentFunctions.add(mntmRemoveAllGaps);
JMenuItem mntmTrim = new JMenuItem("Trim sequences");
mntmTrim.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.trimSequences();
}
});
mnEdit.add(mntmTrim);
editFunctions.add(mntmTrim);
loadedAlignmentFunctions.add(mntmTrim);
JMenuItem mntmDeleteExcluded = new JMenuItem("Delete excluded bases");
mntmDeleteExcluded.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.deleteExludedBases();
}
});
mnEdit.add(mntmDeleteExcluded);
editFunctions.add(mntmDeleteExcluded);
loadedAlignmentFunctions.add(mntmDeleteExcluded);
JMenuItem mntmDeleteEmpty = new JMenuItem("Delete empty sequences");
mntmDeleteEmpty.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.deleteEmptySequences();
}
});
mnEdit.add(mntmDeleteEmpty);
editFunctions.add(mntmDeleteEmpty);
loadedAlignmentFunctions.add(mntmDeleteEmpty);
mnEdit.add(new JSeparator());
JMenuItem mntmFind = new JMenuItem("Find");
mntmFind.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
mntmFind.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
aliViewWindow.find();
}
});
mnEdit.add(mntmFind);
loadedAlignmentFunctions.add(mntmFind);
JMenuItem mntmFindDupes = new JMenuItem("Find and select duplicate sequences");
//mntmFindDupes.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
mntmFindDupes.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
aliViewWindow.selectDuplicates();
}
});
mnEdit.add(mntmFindDupes);
loadedAlignmentFunctions.add(mntmFindDupes);
JMenuItem mntmFindClipboardNames = new JMenuItem("Find sequence names from clipboard");
mntmFindClipboardNames.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
mntmFindClipboardNames.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
aliViewWindow.findNamesFromClipboard();
}
});
mnEdit.add(mntmFindClipboardNames);
loadedAlignmentFunctions.add(mntmFindClipboardNames);
mnEdit.add(new JSeparator());
JMenuItem mntmMerger = new JMenuItem("Merge 2 selected sequences");
mntmMerger.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK));
mntmMerger.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.merge2SelectedSequences();
}
});
mnEdit.add(mntmMerger);
editFunctions.add(mntmMerger);
loadedAlignmentFunctions.add(mntmMerger);
mnEdit.add(new JSeparator());
JMenuItem mntmRevCompSequences = new JMenuItem("Reverse Complement Selected Sequences");
mntmRevCompSequences.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
logger.info("action perf mntmRevCompSequences");
aliViewWindow.reverseComplementSelectedSequences();
}
});
mnEdit.add(mntmRevCompSequences);
editFunctions.add(mntmRevCompSequences);
loadedAlignmentFunctions.add(mntmRevCompSequences);
JMenuItem mntmRevCompAlignment = new JMenuItem("Reverse Complement Alignment");
mntmRevCompAlignment.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
logger.info("action perf");
aliViewWindow.reverseComplementAlignment();
}
});
mnEdit.add(mntmRevCompAlignment);
editFunctions.add(mntmRevCompAlignment);
loadedAlignmentFunctions.add(mntmRevCompAlignment);
JMenuItem mntmCompAlignment = new JMenuItem("Complement Alignment");
mntmCompAlignment.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
logger.info("action perf");
aliViewWindow.complementAlignment();
}
});
mnEdit.add(mntmCompAlignment);
editFunctions.add(mntmCompAlignment);
loadedAlignmentFunctions.add(mntmCompAlignment);
JMenuItem mntmRevComp = new JMenuItem("Reverse Complement Clipboard");
mntmRevComp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
logger.info("action perf");
aliViewWindow.reverseComplementClipboard();
}
});
mnEdit.add(mntmRevComp);
alwaysAvailableFunctions.add(mntmRevComp);
mnEdit.add(new JSeparator());
JMenuItem mntmEditCharsets = new JMenuItem("Edit charsets");
mntmEditCharsets.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
aliViewWindow.editCharsets();
}
});
mnEdit.add(mntmEditCharsets);
loadedAlignmentFunctions.add(mntmEditCharsets);
mnEdit.add(new JSeparator());
// Mac has its own menu item
if(OSNativeUtils.isAnythingButMac()){
JMenuItem mntmPreferences = new JMenuItem("Preferences");
mntmPreferences.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.openPreferencesGeneral();
}
});
mnEdit.add(mntmPreferences);
}
JMenu mnSelection = new JMenu("Selection");
mnSelection.setMnemonic(KeyEvent.VK_S);
this.add(mnSelection);
JMenuItem mntmSelectAll = new JMenuItem("Select all");
mntmSelectAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.selectAll();
}
});
mntmSelectAll.setAccelerator(OSNativeUtils.getSelectAllKeyAccelerator());
mnSelection.add(mntmSelectAll);
loadedAlignmentFunctions.add(mntmSelectAll);
JMenuItem mntmClearSelection = new JMenuItem("De-select");
mntmClearSelection.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.clearSelection();
}
});
mnSelection.add(mntmClearSelection);
hasSelectionFunctions.add(mntmClearSelection);
// JMenuItem mntmInvertSelection = new JMenuItem("Invert selection");
// mntmInvertSelection.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// aliViewWindow.invertSelection();
// }
// });
// //mntmInvertSelection.setAccelerator(OSNativeUtils.getSelectAllKeyAccelerator());
// mntmInvertSelection.setMnemonic(KeyEvent.VK_I);
// mnSelection.add(mntmInvertSelection);
// hasSelectionFunctions.add(mntmInvertSelection);
JMenuItem mntmExpandSelectionRight = new JMenuItem("Expand selection Right");
mntmExpandSelectionRight.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.expandSelectionRight();
}
});
mntmExpandSelectionRight.setAccelerator(OSNativeUtils.getSelectionExpandRightKeyAccelerator());
mnSelection.add(mntmExpandSelectionRight);
hasSelectionFunctions.add(mntmExpandSelectionRight);
JMenuItem mntmExpandSelectionLeft = new JMenuItem("Expand selection Left");
mntmExpandSelectionLeft.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.expandSelectionLeft();
}
});
mntmExpandSelectionLeft.setAccelerator(OSNativeUtils.getSelectionExpandLeftKeyAccelerator());
mnSelection.add(mntmExpandSelectionLeft);
hasSelectionFunctions.add(mntmExpandSelectionLeft);
mnSelection.add(new JSeparator());
// This way of binding key action to menu buttom makes repeat work much faster
// http://stackoverflow.com/questions/9622260/java-swing-actionlistener-much-slower-than-keylistener
AbstractAction meveSelUpAction = new AbstractAction("Move selected sequences up"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getMoveSelectionUpKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.moveSelectedUp();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getMoveSelectionUpKeyAccelerator(), "meveSelUpAction");
aliViewWin.getRootPane().getActionMap().put("meveSelUpAction", meveSelUpAction);
JMenuItem mntmMoveSelectionUp = new JMenuItem(meveSelUpAction);
mnSelection.add(mntmMoveSelectionUp);
mntmMoveSelectionUp.setIcon(AppIcons.getGoUpIcon());
hasSelectionFunctions.add(mntmMoveSelectionUp);
reorderAndDeleteFunctions.add(mntmMoveSelectionUp);
// This way of binding key action to menu buttom makes repeat work much faster
// http://stackoverflow.com/questions/9622260/java-swing-actionlistener-much-slower-than-keylistener
AbstractAction moveSelDownAction = new AbstractAction("Move selected sequences down"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getMoveSelectionDownKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.moveSelectedDown();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getMoveSelectionDownKeyAccelerator(), "moveSelDownAction");
aliViewWin.getRootPane().getActionMap().put("moveSelDownAction", moveSelDownAction);
JMenuItem mntmMoveSelectionDown = new JMenuItem(moveSelDownAction);
mntmMoveSelectionDown.setIcon(AppIcons.getGoDownIcon());
mnSelection.add(mntmMoveSelectionDown);
hasSelectionFunctions.add(mntmMoveSelectionDown);
reorderAndDeleteFunctions.add(mntmMoveSelectionDown);
JMenuItem mntmMoveSelectionToTop = new JMenuItem("Move selected sequences to top");
mntmMoveSelectionToTop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.moveSelectedToTop();
}
});
mntmMoveSelectionToTop.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_UP, InputEvent.ALT_MASK));
mntmMoveSelectionToTop.setIcon(AppIcons.getGoTopIcon());
mnSelection.add(mntmMoveSelectionToTop);
hasSelectionFunctions.add(mntmMoveSelectionToTop);
reorderAndDeleteFunctions.add(mntmMoveSelectionToTop);
JMenuItem mntmMoveSelectionToBottom = new JMenuItem("Move selected sequences to bottom");
mntmMoveSelectionToBottom.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.moveSelectedToBottom();
}
});
mntmMoveSelectionToBottom.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.ALT_MASK));
mntmMoveSelectionToBottom.setIcon(AppIcons.getGoBottomIcon());
mnSelection.add(mntmMoveSelectionToBottom);
hasSelectionFunctions.add(mntmMoveSelectionToBottom);
reorderAndDeleteFunctions.add(mntmMoveSelectionToBottom);
mnSelection.add(new JSeparator());
JMenuItem mntmAddExcludes = new JMenuItem("Add or Remove selection to Excludes/Exset");
mntmAddExcludes.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.addOrRemoveSelectionToExcludes();
}
});
mntmAddExcludes.setAccelerator(OSNativeUtils.getAddOrRemoveExcludesKeyAccelerator());
mnSelection.add(mntmAddExcludes);
hasSelectionFunctions.add(mntmAddExcludes);
/*
JMenuItem mntmRemoveExcludes = new JMenuItem("Remove selection from Excludes/Exset");
mntmRemoveExcludes.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.removeSelectionFromExcludes();
}
});
mnSelection.add(mntmRemoveExcludes);
hasSelectionFunctions.add(mntmRemoveExcludes);
*/
mnSelection.add(new JSeparator());
mnSelectCharset = new JMenu("Select Charset");
// mntmSelectCharset.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// aliViewWindow.setSelectionAsCoding(0);
// }
// });
mnSelection.add(mnSelectCharset);
mnSelectCharset.setEnabled(false);
mnSelection.add(new JSeparator());
JMenuItem mntmSetSelectionAsCoding0 = new JMenuItem("Set selection as coding (selection starting with codon position=1)");
mntmSetSelectionAsCoding0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.setSelectionAsCoding(1);
}
});
mnSelection.add(mntmSetSelectionAsCoding0);
coding0ButtonModel=mntmSetSelectionAsCoding0.getModel();
hasSelectionFunctions.add(mntmSetSelectionAsCoding0);
nucleotideFunctions.add(mntmSetSelectionAsCoding0);
JMenuItem mntmSetSelectionAsCoding1 = new JMenuItem("Set selection as coding (selection starting with codon position=2)");
mntmSetSelectionAsCoding1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.setSelectionAsCoding(2);
}
});
coding1ButtonModel=mntmSetSelectionAsCoding1.getModel();
mnSelection.add(mntmSetSelectionAsCoding1);
hasSelectionFunctions.add(mntmSetSelectionAsCoding1);
nucleotideFunctions.add(mntmSetSelectionAsCoding1);
JMenuItem mntmSetSelectionAsCoding2 = new JMenuItem("Set selection as coding (selection starting with codon position=3)");
mntmSetSelectionAsCoding2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.setSelectionAsCoding(3);
}
});
coding2ButtonModel=mntmSetSelectionAsCoding2.getModel();
mnSelection.add(mntmSetSelectionAsCoding2);
hasSelectionFunctions.add(mntmSetSelectionAsCoding2);
nucleotideFunctions.add(mntmSetSelectionAsCoding2);
JMenuItem mntmSetSelectionAsNonCoding = new JMenuItem("Set selection as Non-coding");
mntmSetSelectionAsNonCoding.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.setSelectionAsNonCoding();
}
});
nonCodingButtonModel = mntmSetSelectionAsNonCoding.getModel();
mnSelection.add(mntmSetSelectionAsNonCoding);
hasSelectionFunctions.add(mntmSetSelectionAsNonCoding);
nucleotideFunctions.add(mntmSetSelectionAsNonCoding);
JMenu mnViewMenu = new JMenu("View");
mnViewMenu.setMnemonic(KeyEvent.VK_V);
this.add(mnViewMenu);
// This way of binding key action to menu buttom makes repeat work much faster
AbstractAction decFontSizeAction = new AbstractAction("Decrease Font Size"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getDecreaseFontSizeKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.zoomOut();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getDecreaseFontSizeKeyAccelerator(), "decfontsize");
aliViewWin.getRootPane().getActionMap().put("decfontsize", decFontSizeAction);
JMenuItem mntmDecreaseFontSize = new JMenuItem(decFontSizeAction);
mntmDecreaseFontSize.setAction(decFontSizeAction);
decFontSizeButtonModel = mntmDecreaseFontSize.getModel();
mnViewMenu.add(decFontSizeAction);
loadedAlignmentFunctions.add(mntmDecreaseFontSize);
// This way of binding key action to menu buttom makes repeat work much faster
AbstractAction incFontSizeAction = new AbstractAction("Increase Font Size"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getIncreaseFontSizeKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.zoomIn();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getIncreaseFontSizeKeyAccelerator(), "incfontsize");
aliViewWin.getRootPane().getActionMap().put("incfontsize", incFontSizeAction);
JMenuItem mntmIncreaseFontSize = new JMenuItem(incFontSizeAction);
mntmIncreaseFontSize.setAction(incFontSizeAction);
incFontSizeButtonModel = mntmIncreaseFontSize.getModel();
mnViewMenu.add(incFontSizeAction);
loadedAlignmentFunctions.add(mntmIncreaseFontSize);
mnViewMenu.add(new JSeparator());
JCheckBoxMenuItem highlightCons = new JCheckBoxMenuItem("Highlight consensus characters");
highlightCons.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e){
JCheckBoxMenuItem btn = (JCheckBoxMenuItem ) e.getSource();
aliViewWindow.setHighlightConsensus(btn.isSelected());
}
});
ButtonGroup buttonGroupOneViewAtATime = new NoneSelectedButtonGroup();
buttonGroupOneViewAtATime.add(highlightCons);
highlightConsButtonModel = highlightCons.getModel();
mnViewMenu.add(highlightCons);
loadedAlignmentFunctions.add(highlightCons);
JCheckBoxMenuItem highlightNonCons = new JCheckBoxMenuItem("Highlight Non-consensus characters");
highlightNonCons.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e){
JCheckBoxMenuItem btn = (JCheckBoxMenuItem ) e.getSource();
aliViewWindow.setHighlightNonConsensus(btn.isSelected());
}
});
buttonGroupOneViewAtATime.add(highlightNonCons);
highlightNonConsButtonModel = highlightNonCons.getModel();
mnViewMenu.add(highlightNonCons);
loadedAlignmentFunctions.add(highlightNonCons);
JCheckBoxMenuItem highlightDiff = new JCheckBoxMenuItem("Highlight diff from a selected sequence");
highlightDiff.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e){
JCheckBoxMenuItem btn = (JCheckBoxMenuItem ) e.getSource();
aliViewWindow.setHighlightDiff(btn.isSelected());
}
});
buttonGroupOneViewAtATime.add(highlightDiff);
highlightDiffButtonModel = highlightDiff.getModel();
mnViewMenu.add(highlightDiff);
loadedAlignmentFunctions.add(highlightDiff);
mnViewMenu.add(new JSeparator());
JMenuItem mntmSortSequencesByName = new JMenuItem("Sort sequences by name");
mntmSortSequencesByName.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.sortSequencesByName();
}
});
mnViewMenu.add(mntmSortSequencesByName);
reorderAndDeleteFunctions.add(mntmSortSequencesByName);
loadedAlignmentFunctions.add(mntmSortSequencesByName);
JMenuItem mntmSortSequencesByCharColumn = new JMenuItem("Sort sequences by character in selected column");
mntmSortSequencesByCharColumn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.sortSequencesByCharColumn();
}
});
mnViewMenu.add(mntmSortSequencesByCharColumn);
reorderAndDeleteFunctions.add(mntmSortSequencesByCharColumn);
loadedAlignmentFunctions.add(mntmSortSequencesByCharColumn);
mnViewMenu.add(new JSeparator());
JCheckBoxMenuItem mntmToggleTranslation = new JCheckBoxMenuItem("Show as translation");
mntmToggleTranslation.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e){
JCheckBoxMenuItem btn = (JCheckBoxMenuItem ) e.getSource();
aliViewWindow.setShowTranslation(btn.isSelected());
}
});
mntmToggleTranslation.setAccelerator(OSNativeUtils.getToggleTranslationKeyAccelerator());
buttonGroupOneViewAtATime.add(highlightNonCons);
toggleTranslationButtonModel = mntmToggleTranslation.getModel();
mnViewMenu.add(mntmToggleTranslation);
nucleotideFunctions.add(mntmToggleTranslation);
loadedAlignmentFunctions.add(mntmToggleTranslation);
JCheckBoxMenuItem mntmToggleTranslationOnePos = new JCheckBoxMenuItem("Show as translation (1 pos per AminoAcid)");
mntmToggleTranslationOnePos.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.mntmToggleTranslationOnePos();
}
});
mntmToggleTranslationOnePos.setAccelerator(OSNativeUtils.getToggleTranslationOnePosKeyAccelerator());
transOnePosButtonModel = mntmToggleTranslationOnePos.getModel();
mnViewMenu.add(mntmToggleTranslationOnePos);
nucleotideFunctions.add(mntmToggleTranslationOnePos);
loadedAlignmentFunctions.add(mntmToggleTranslationOnePos);
JCheckBoxMenuItem mntmToggleAminoAcidCode = new JCheckBoxMenuItem("Show as Amino acid code (when show translate)");
mntmToggleAminoAcidCode.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.toggleDrawAminoAcidCode();
}
});
mntmToggleAminoAcidCode.setAccelerator(OSNativeUtils.getToggleTranslateShowAACodeKeyAccelerator());
showAACodeButtonMoes = mntmToggleAminoAcidCode.getModel();
mnViewMenu.add(mntmToggleAminoAcidCode);
nucleotideFunctions.add(mntmToggleAminoAcidCode);
loadedAlignmentFunctions.add(mntmToggleAminoAcidCode);
JCheckBoxMenuItem mntmToggleTranslateShowBoth = new JCheckBoxMenuItem("Show both aminoacid and nucleotides when translating");
mntmToggleTranslateShowBoth.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.toggleTranslationShowBoth();
}
});
mntmToggleTranslateShowBoth.setAccelerator(OSNativeUtils.getToggleTranslateShowBothKeyAccelerator());
mnViewMenu.add(mntmToggleTranslateShowBoth);
nucleotideFunctions.add(mntmToggleTranslateShowBoth);
loadedAlignmentFunctions.add(mntmToggleTranslateShowBoth);
JCheckBoxMenuItem mntmToggleIgnoreGapInTranslation = new JCheckBoxMenuItem("Ignore gaps when translating");
mntmToggleIgnoreGapInTranslation.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.toggleIgnoreGapInTranslation();
}
});
mntmToggleIgnoreGapInTranslation.setAccelerator(OSNativeUtils.getToggleIgnoreGapInTranslationKeyAccelerator());
mnViewMenu.add(mntmToggleIgnoreGapInTranslation);
nucleotideFunctions.add(mntmToggleIgnoreGapInTranslation);
loadedAlignmentFunctions.add(mntmToggleIgnoreGapInTranslation);
JMenuItem mntmToggleDrawCodonPos = new JMenuItem("Show codonpositions on ruler");
mntmToggleDrawCodonPos.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.toggleDrawCodonpos();
}
});
mnViewMenu.add(mntmToggleDrawCodonPos);
drawCoonPosOnRulerButtonModel = mntmToggleDrawCodonPos.getModel();
nucleotideFunctions.add(mntmToggleDrawCodonPos);
loadedAlignmentFunctions.add(mntmToggleDrawCodonPos);
// Create Menu and submenu for gen-code-alternatives
mnGeneticCodeCode = new JMenu("Select genetic code for translation");
for(final GeneticCode aCode: GeneticCode.allCodesArray){
JMenuItem genCodeSubM = new JMenuItem("" + aCode.transTable + ". " + aCode.name);
genCodeSubM.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.setGeneticCode(aCode);
}
});
mnGeneticCodeCode.add(genCodeSubM);
}
mnViewMenu.add(mnGeneticCodeCode);
alwaysAvailableFunctions.add(mnGeneticCodeCode);
JMenuItem mntmIncreaseReadingFrame = new JMenuItem("Reading frame +1");
mntmIncreaseReadingFrame.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
aliViewWindow.incReadingFrame();
}
});
mntmIncreaseReadingFrame.setAccelerator(OSNativeUtils.incReadingFrameKeyAccelerator());
mnViewMenu.add(mntmIncreaseReadingFrame);
nucleotideFunctions.add(mntmIncreaseReadingFrame);
loadedAlignmentFunctions.add(mntmIncreaseReadingFrame);
JMenuItem mntmDecreaseReadingFrame = new JMenuItem("Reading frame -1");
mntmDecreaseReadingFrame.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.decReadingFrame();
}
});
mntmDecreaseReadingFrame.setAccelerator(OSNativeUtils.decReadingFrameKeyAccelerator());
mnViewMenu.add(mntmDecreaseReadingFrame);
nucleotideFunctions.add(mntmDecreaseReadingFrame);
loadedAlignmentFunctions.add(mntmDecreaseReadingFrame);
JMenuItem mntmCountStopCodons = new JMenuItem("Count stop codons");
mntmCountStopCodons.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.countStopCodons();
}
});
countCodonButtonModel=mntmCountStopCodons.getModel();
mntmCountStopCodons.setAccelerator(OSNativeUtils.countStopCodonsKeyAccelerator());
mnViewMenu.add(mntmCountStopCodons);
loadedAlignmentFunctions.add(mntmCountStopCodons);
mnViewMenu.add(new JSeparator());
JCheckBoxMenuItem mntmShowCharsetsRuler = new JCheckBoxMenuItem("Show charsets ruler (if charsets are defined)");
boolean isShowCharsetRuler = Settings.getShowCharsetRuler().getBooleanValue();
if(isShowCharsetRuler){
mntmShowCharsetsRuler.setSelected(true);
}
mntmShowCharsetsRuler.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e){
JCheckBoxMenuItem btn = (JCheckBoxMenuItem ) e.getSource();
aliViewWindow.showCharsetsRuler(btn.isSelected());
}
});
//mntmFontCase.setAccelerator(OSNativeUtils.getToggleTranslationKeyAccelerator());
//buttonGroupOneViewAtATime.add(highlightNonCons);
//toggleTranslationButtonModel = mntmToggleTranslation.getModel();
mnViewMenu.add(mntmShowCharsetsRuler);
alwaysAvailableFunctions.add(mntmShowCharsetsRuler);
mnViewMenu.add(new JSeparator());
JCheckBoxMenuItem mntmFontCase = new JCheckBoxMenuItem("Always display as Upper case characters");
mntmFontCase.setMnemonic(KeyEvent.VK_U);
int fontCase = Settings.getFontCase().getIntValue();
if(fontCase == CharPixels.CASE_UPPER){
mntmFontCase.setSelected(true);
}
mntmFontCase.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e){
JCheckBoxMenuItem btn = (JCheckBoxMenuItem ) e.getSource();
aliViewWindow.setFontCaseUpper(btn.isSelected());
}
});
//mntmFontCase.setAccelerator(OSNativeUtils.getToggleTranslationKeyAccelerator());
//buttonGroupOneViewAtATime.add(highlightNonCons);
//toggleTranslationButtonModel = mntmToggleTranslation.getModel();
mnViewMenu.add(mntmFontCase);
alwaysAvailableFunctions.add(mntmFontCase);
// create ColorMenu and submenu
JMenu mnColorScheme = new JMenu("Colors");
JMenu mnNucleotideSub = new JMenu("Nucleotide");
mnColorScheme.add(mnNucleotideSub);
ButtonGroup colorSchemeGroup = new ButtonGroup();
ColorScheme settingsColorScheme = Settings.getColorSchemeNucleotide();
for(final ColorScheme aScheme: ColorSchemeFactory.getNucleotideColorSchemes()){
JCheckBoxMenuItem colorSubmenu = new JCheckBoxMenuItem(aScheme.getName());
colorSubmenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.setColorSchemeNucleotide(aScheme);
}
});
colorSchemeGroup.add(colorSubmenu);
// if this is the one from settings then select button
if(settingsColorScheme == aScheme){
colorSubmenu.setSelected(true);
}
mnNucleotideSub.add(colorSubmenu);
}
JMenu mnAASub = new JMenu("Amino Acid");
mnColorScheme.add(mnAASub);
ButtonGroup colorSchemeGroupAA = new ButtonGroup();
ColorScheme settingsColorSchemeAA = Settings.getColorSchemeAminoAcid();
for(final ColorScheme aScheme: ColorSchemeFactory.getAAColorSchemes()){
JCheckBoxMenuItem colorSubmenu = new JCheckBoxMenuItem(aScheme.getName());
colorSubmenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.setColorSchemeAminoAcid(aScheme);
}
});
colorSchemeGroupAA.add(colorSubmenu);
// if this is the one from settings then select button
if(settingsColorSchemeAA == aScheme){
colorSubmenu.setSelected(true);
}
mnAASub.add(colorSubmenu);
}
mnColorScheme.setIcon(AppIcons.getColorsIcon());
mnViewMenu.add(mnColorScheme);
alwaysAvailableFunctions.add(mnColorScheme);
JMenu mnAlign = new JMenu("Align");
mnAlign.setMnemonic(KeyEvent.VK_A);
this.add(mnAlign);
//
// Automatic alignment functions
//
JMenuItem mntmAlignInCurrent = new JMenuItem("Add and align sequences from clipboard (fasta)");
mntmAlignInCurrent.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.addAndAlignSeqFromClipboard();
}
});
mnAlign.add(mntmAlignInCurrent);
editFunctions.add(mntmAlignInCurrent);
loadedAlignmentFunctions.add(mntmAlignInCurrent);
/*
*
* TODO This has to be looked over so it works with thread
*
*/
//
// JMenuItem mntmAlignInMultiple = new JMenuItem("Add and align multiplesequences from clipboard one by one (fasta)");
// mntmAlignInMultiple.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
//
// aliViewWindow.addAndAlignMultipleSeqFromClipOneByOne();
//
// }
// });
// mnAlign.add(mntmAlignInMultiple);
// editFunctions.add(mntmAlignInMultiple);
JMenuItem mntmAlignInFromFile = new JMenuItem("Add and align sequences from file (fasta)");
mntmAlignInFromFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.addAndAlignSeqFromFile();
}
});
mnAlign.add(mntmAlignInFromFile);
editFunctions.add(mntmAlignInFromFile);
loadedAlignmentFunctions.add(mntmAlignInFromFile);
JMenuItem mntmReAlignSelection = new JMenuItem("Realign selected block");
mntmReAlignSelection.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
aliViewWindow.reAlignSelectionInSeparateThread();
}
});
mnAlign.add(mntmReAlignSelection);
realignSelectedBlockButtonModel = mntmReAlignSelection.getModel();
editFunctions.add(mntmReAlignSelection);
hasSelectionFunctions.add(mntmReAlignSelection);
JMenuItem mntmReAlignSelectedSequence = new JMenuItem("Realign selected sequence(s)");
mntmReAlignSelectedSequence.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.reAlignSelectedSequences();
}
});
mnAlign.add(mntmReAlignSelectedSequence);
realignSelectedSequencesButtonModel = mntmReAlignSelectedSequence.getModel();
editFunctions.add(mntmReAlignSelectedSequence);
loadedAlignmentFunctions.add(mntmReAlignSelectedSequence);
JMenuItem mntmAlign = new JMenuItem("Realign everything");
mntmAlign.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.reAlignEverythingWithDefaultProgram();
}
});
//mntmAlign.setIcon(AppIcons.getAlignIcon());
mnAlign.add(mntmAlign);
editFunctions.add(mntmAlign);
editFunctions.add(mntmAlign);
loadedAlignmentFunctions.add(mntmAlign);
JMenuItem mntmAlignAsAA = new JMenuItem("Realign everything as Translated Amino Acids");
mntmAlignAsAA.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.reAlignEverythingAsTranslatedAA();
}
});
//mntmAlign.setIcon(AppIcons.getAlignIcon());
mnAlign.add(mntmAlignAsAA);
editFunctions.add(mntmAlignAsAA);
loadedAlignmentFunctions.add(mntmAlignAsAA);
nucleotideFunctions.add(mntmAlignAsAA);
mnAlign.add(new JSeparator());
JMenu mnuAlignerSettings = new JMenu("Change default Aligner program");
mnAlign.add(mnuAlignerSettings);
alwaysAvailableFunctions.add(mnuAlignerSettings);
// Create submenu 1
JMenuItem mntmALLAlignerSettings = new JMenuItem("for realigning all (or selected blocks)");
mntmALLAlignerSettings.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.editAlignerALLSettings();
}
});
mnuAlignerSettings.add(mntmALLAlignerSettings);
// Create submenu 2
JMenuItem mntmADDAlignerSettings = new JMenuItem("when pasting new sequences (profile-alignment)");
mntmADDAlignerSettings.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.editAlignerADDSettings();
}
});
mnuAlignerSettings.add(mntmADDAlignerSettings);
//
// Manual alignment functions
//
mnAlign.add(new JSeparator());
// This way of binding key action to menu buttom makes repeat work much faster
// http://stackoverflow.com/questions/9622260/java-swing-actionlistener-much-slower-than-keylistener
AbstractAction moveselrightAction = new AbstractAction("Move selected positions right"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getMoveSelectedRightKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.moveSelectionRight();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getMoveSelectedRightKeyAccelerator(), "moveselright");
aliViewWin.getRootPane().getActionMap().put("moveselright", moveselrightAction);
JMenuItem mntmMoveSelectionRight = new JMenuItem(moveselrightAction);
mnAlign.add(mntmMoveSelectionRight);
mntmMoveSelectionRight.setIcon(AppIcons.getMoveRightIcon());
hasSelectionFunctions.add(mntmMoveSelectionRight);
editFunctions.add(mntmMoveSelectionRight);
// This way of binding key action to menu buttom makes repeat work much faster
// http://stackoverflow.com/questions/9622260/java-swing-actionlistener-much-slower-than-keylistener
AbstractAction moveselleftAction = new AbstractAction("Move selected positions left"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getMoveSelectedLeftKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.moveSelectionLeft();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getMoveSelectedLeftKeyAccelerator(), "moveselleft");
aliViewWin.getRootPane().getActionMap().put("moveselleft", moveselleftAction);
JMenuItem mntmMoveSelectionLeft = new JMenuItem(moveselleftAction);
mntmMoveSelectionLeft.setAction(moveselleftAction);
mnAlign.add(mntmMoveSelectionLeft);
mntmMoveSelectionLeft.setIcon(AppIcons.getMoveLeftIcon());
editFunctions.add(mntmMoveSelectionLeft);
hasSelectionFunctions.add(mntmMoveSelectionLeft);
// This way of binding key action to menu buttom makes repeat work much faster
// http://stackoverflow.com/questions/9622260/java-swing-actionlistener-much-slower-than-keylistener
AbstractAction insertGapMRAction = new AbstractAction("Insert Gap move right"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getInsertGapMoveRightKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.insertGapMoveRight();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getInsertGapMoveRightKeyAccelerator(), "insertGapMRAction");
aliViewWin.getRootPane().getActionMap().put("insertGapMRAction", insertGapMRAction);
JMenuItem mntmInsertGapMoveRight = new JMenuItem(insertGapMRAction);
mnAlign.add(mntmInsertGapMoveRight);
editFunctions.add(mntmInsertGapMoveRight);
hasSelectionFunctions.add(mntmInsertGapMoveRight);
// This way of binding key action to menu buttom makes repeat work much faster
// http://stackoverflow.com/questions/9622260/java-swing-actionlistener-much-slower-than-keylistener
AbstractAction insertGapMoveLeftAction = new AbstractAction("Insert Gap move left"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getInsertGapMoveLeftKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.insertGapMoveLeft();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getInsertGapMoveLeftKeyAccelerator(), "insertGapMoveLeftAction");
aliViewWin.getRootPane().getActionMap().put("insertGapMoveLeftAction", insertGapMoveLeftAction);
JMenuItem mntmInsertGapMoveLeft = new JMenuItem(insertGapMoveLeftAction);
mnAlign.add(mntmInsertGapMoveLeft);
editFunctions.add(mntmInsertGapMoveLeft);
hasSelectionFunctions.add(mntmInsertGapMoveLeft);
// This way of binding key action to menu buttom makes repeat work much faster
// http://stackoverflow.com/questions/9622260/java-swing-actionlistener-much-slower-than-keylistener
AbstractAction deleteGapMoveLeftAction = new AbstractAction("Delete Gap at left"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getDeleteGapMoveLeftKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.deleteGapMoveLeft();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getDeleteGapMoveLeftKeyAccelerator(), "deleteGapMoveLeftAction");
aliViewWin.getRootPane().getActionMap().put("deleteGapMoveLeftAction", deleteGapMoveLeftAction);
JMenuItem mntmDeleteGapMoveLeft = new JMenuItem(deleteGapMoveLeftAction);
mnAlign.add(mntmDeleteGapMoveLeft);
editFunctions.add(mntmDeleteGapMoveLeft);
hasSelectionFunctions.add(mntmDeleteGapMoveLeft);
// This way of binding key action to menu buttom makes repeat work much faster
// http://stackoverflow.com/questions/9622260/java-swing-actionlistener-much-slower-than-keylistener
AbstractAction deleteGapMoveRightAction = new AbstractAction("Delete Gap at right"){
{
putValue(ACCELERATOR_KEY, OSNativeUtils.getDeleteGapMoveRightKeyAccelerator());
}
public void actionPerformed(ActionEvent e) {
aliViewWindow.deleteGapMoveRight();
}
};
aliViewWin.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OSNativeUtils.getDeleteGapMoveRightKeyAccelerator(), "deleteGapMoveRightAction");
aliViewWin.getRootPane().getActionMap().put("deleteGapMoveRightAction", deleteGapMoveRightAction);
JMenuItem mntmDeleteGapMoveRight = new JMenuItem(deleteGapMoveRightAction);
mnAlign.add(mntmDeleteGapMoveRight);
editFunctions.add(mntmDeleteGapMoveRight);
hasSelectionFunctions.add(mntmDeleteGapMoveRight);
/*
JMenuItem mntmReAlignSelectionMafft = new JMenuItem("Realign selection with mafft");
mntmReAlignSelectionMafft.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliView.pushUndoState();
aliView.reAlignSelectionWithMafft();
}
});
mnAlign.add(mntmReAlignSelectionMafft);
*/
JMenu mnPrimer = new JMenu("Primer");
mnPrimer.setMnemonic(KeyEvent.VK_P);
this.add(mnPrimer);
JMenuItem mntmPrimerInCurrent = new JMenuItem("Find primer in current selection");
mntmPrimerInCurrent.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.findPrimerInCurrentSelection();
}
});
mnPrimer.add(mntmPrimerInCurrent);
hasSelectionFunctions.add(mntmPrimerInCurrent);
nucleotideFunctions.add(mntmPrimerInCurrent);
JMenuItem mntmFindPrimerSettings = new JMenuItem("Find primer settings");
mntmFindPrimerSettings.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.findPrimerSettings();
}
});
mnPrimer.add(mntmFindPrimerSettings);
alwaysAvailableFunctions.add(mntmFindPrimerSettings);
// Menu with External Commands
mnExternal = new JMenu("External commands");
mnExternal.setMnemonic(KeyEvent.VK_E);
this.add(mnExternal);
rebuildExternalCommandsSubmenu();
JMenu mnHelp = new JMenu("Help");
mnHelp.setMnemonic(KeyEvent.VK_H);
this.add(mnHelp);
JMenuItem mntmHelpOpen = new JMenuItem("Help");
mntmHelpOpen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.openHelp();
}
});
mnHelp.add(mntmHelpOpen);
alwaysAvailableFunctions.add(mntmHelpOpen);
//mnHelp.add(new JSeparator());
JMenuItem mntmCheckNew = new JMenuItem("Check for new version/version history");
mntmCheckNew.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.checkNewVersion();
}
});
mnHelp.add(mntmCheckNew);
alwaysAvailableFunctions.add(mntmCheckNew);
/*
JMenuItem mntmVersionHistory = new JMenuItem("Check version history");
mntmVersionHistory.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.displayVersionHistory();
}
});
mnHelp.add(mntmVersionHistory);
alwaysAvailableFunctions.add(mntmVersionHistory);
*/
JMenuItem mntmReportBug = new JMenuItem("Report bug/feature request");
mntmReportBug.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.openBugReportPage();
}
});
mnHelp.add(mntmReportBug);
alwaysAvailableFunctions.add(mntmReportBug);
mnHelp.add(new JSeparator());
// Mac has its own menu item
if(OSNativeUtils.isAnythingButMac()){
JMenuItem mntmAbout = new JMenuItem("About");
mntmAbout.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.showAbout();
}
});
mnHelp.add(mntmAbout);
alwaysAvailableFunctions.add(mntmAbout);
}
}
private void rebuildExternalCommandsSubmenu(){
mnExternal.removeAll();
// get saved commands (or default will be served by settings if none)
ArrayList<CommandItem> cmdItems = Settings.getExternalCommands();
for(final CommandItem anItem: cmdItems){;
if(anItem.isActivated() && anItem.getName() != null && anItem.getName().length() > 0){
JMenuItem nextCommandItem = new JMenuItem(anItem.getName());
nextCommandItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.runExternalCommand(anItem);
}
});
nextCommandItem.setSelected(anItem.isActivated());
alwaysAvailableFunctions.add(nextCommandItem);
mnExternal.add(nextCommandItem);
}
}
mnExternal.add(new JSeparator());
JMenuItem mntmEditExternal = new JMenuItem("Edit external command");
mntmEditExternal.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.editExternalCommands();
}
});
mnExternal.add(mntmEditExternal);
alwaysAvailableFunctions.add(mntmEditExternal);
}
private void rebuildRecentFilesSubmenu(){
logger.info("rebuildRecentFilesSubmenu()");
mnRecentFiles.removeAll();
// submenu
for(final File nextFile: Settings.getRecentFiles()){
JMenuItem nextItem = new JMenuItem(nextFile.getAbsolutePath());
nextItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AliView.openAlignmentFile(nextFile);
}
});
mnRecentFiles.add(nextItem);
}
mnRecentFiles.invalidate();
mnRecentFiles.repaint();
}
public void rebuildSelectCharsetsSubmenu(){
logger.info("rebuildSelectCharsetsSubmenu()" + aliViewWindow.getAlignment().getAlignmentMeta().getCharsets());
mnSelectCharset.removeAll();
CharSets charsets = aliViewWindow.getAlignment().getAlignmentMeta().getCharsets();
// submenu
for(final CharSet aCharset: charsets){
JMenuItem nextItem = new JMenuItem(aCharset.getName());
nextItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aliViewWindow.selectAll(aCharset);
}
});
mnSelectCharset.add(nextItem);
}
if(charsets != null && charsets.size() > 0){
mnSelectCharset.setEnabled(true);
}else{
mnSelectCharset.setEnabled(false);
}
mnSelectCharset.invalidate();
mnSelectCharset.repaint();
}
public final void setEditFunctionsEnabled(boolean enable){
setAllEnabled(editFunctions, enable);
}
public final void setAlwaysFunctionsEnabled(boolean enable){
setAllEnabled(alwaysAvailableFunctions, enable);
}
public final void setLoadedFunctionsEnabled(boolean enable){
setAllEnabled(loadedAlignmentFunctions, enable);
}
public final void setNucleotideFunctionsEnabled(boolean enable){
setAllEnabled(nucleotideFunctions, enable);
}
public final void setAAFunctionsEnabled(boolean enable){
setAllEnabled(aminoAcidFunctions, enable);
}
public final void setHasSelectionFunctionsEnabled(boolean enable){
setAllEnabled(hasSelectionFunctions, enable);
}
public final void setReorderFunctionsEnabled(boolean enable){
setAllEnabled(reorderAndDeleteFunctions, enable);
}
public void setUndoButtonEnabled(boolean b) {
this.undoButton.setEnabled(b);
}
public void setRedoButtonEnabled(boolean b) {
this.redoButton.setEnabled(b);
}
private void setAllEnabled(ArrayList<AbstractButton> comps, boolean enable) {
if(!menuLock){
for(AbstractButton comp: comps){
comp.setEnabled(enable);
Component[] subComponents = comp.getComponents();
if(subComponents != null && subComponents.length>0){
setEnabledAllJMenuButtonsRecursive(subComponents, enable);
}
}
}
}
public void setMenuLock(boolean lock){
logger.info("lock" + lock);
if(lock){
// first make sure we can change buttons
menuLock = false;
disableAllButEssentialButtons();
// now lock;
menuLock = true;
}else{
menuLock = false;
updateAllMenuEnabled();
}
}
private void disableAllRegisterdMenusAndSubs(){
boolean enable = false;
setAllEnabled(editFunctions, enable);
setAllEnabled(alwaysAvailableFunctions, enable);
setAllEnabled(loadedAlignmentFunctions, enable);
setAllEnabled(nucleotideFunctions, enable);
setAllEnabled(aminoAcidFunctions, enable);
setAllEnabled(hasSelectionFunctions, enable);
setAllEnabled(undoFunctions, enable);
setAllEnabled(reorderAndDeleteFunctions, enable);
}
public void updateAllMenuEnabled() {
this.disableAllButEssentialButtons();
if(! aliViewWindow.isEmpty()){
logger.info("alignment.isAAAlignment()" + aliViewWindow.getAlignment().isAAAlignment());
logger.info("alignment.isNucleotideAlignment()" + aliViewWindow.getAlignment().isNucleotideAlignment());
this.setLoadedFunctionsEnabled(true);
this.setReorderFunctionsEnabled(true);
this.setUndoButtonEnabled(!aliViewWindow.isUndoStackEmpty());
this.setRedoButtonEnabled(!aliViewWindow.isRedoStackEmpty());
if(aliViewWindow.getAlignment().isEditable()){
this.setEditFunctionsEnabled(true);
logger.info("editFunctions" + true);
}
if(aliViewWindow.getAlignment().isNucleotideAlignment()){
this.setNucleotideFunctionsEnabled(true);
this.setHasSelectionFunctionsEnabled(aliViewWindow.getAlignment().hasSelection());
this.setAAFunctionsEnabled(false);
}
if(aliViewWindow.getAlignment().isAAAlignment()){
this.setAAFunctionsEnabled(true);
this.setHasSelectionFunctionsEnabled(aliViewWindow.getAlignment().hasSelection());
this.setNucleotideFunctionsEnabled(false);
}
if(!aliViewWindow.getAlignment().isEditable()){
this.setEditFunctionsEnabled(false);
}
}
}
public void disableAllButEssentialButtons() {
disableAllRegisterdMenusAndSubs();
setAlwaysFunctionsEnabled(true);
}
private void setEnabledAllJMenuButtonsRecursive(Component[] allComps, boolean isEnabled){
for(Component comp: allComps){
comp.setEnabled(isEnabled);
if(comp instanceof AbstractButton){
Component[] subcomps = ((AbstractButton) comp).getComponents();
if(subcomps != null && subcomps.length > 0){
setEnabledAllJMenuButtonsRecursive(subcomps, isEnabled);
}
}
}
}
public void createDynamicLoadFilePages(final FileSequenceAlignmentListModel seqList, List<FilePage> pages) {
logger.info("beforemenu");
/*
if(mnFilePages == null){
mnFilePages = new JMenu("Load more sequences from file");
this.add(mnFilePages);
}else{
mnFilePages.removeAll();
}
ButtonGroup bg = new ButtonGroup();
for(final FilePage page: pages){
String startIndexPrefix = "";
if(page.startIndex != 0){
startIndexPrefix = "~";
}
JCheckBoxMenuItem nextItem = new JCheckBoxMenuItem("Load sequence "+ startIndexPrefix + page.startIndex + " to ~" + page.endIndex);
nextItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
seqList.loadMoreSequencesFromFile(page);
}
});
bg.add(nextItem);
mnFilePages.add(nextItem);
logger.info("seqList.getActivePage()" + seqList.getActivePage());
if(seqList.getActivePage() == page){
nextItem.setSelected(true);
}
}
*/
}
public void removeDynamicLoadFilePagesMenu(){
if(mnFilePages != null){
this.remove(mnFilePages);
}
}
public ButtonModel getToggleTranslationButtonModel() {
return toggleTranslationButtonModel;
}
public ButtonModel getHighlightConsButtonModel() {
return highlightConsButtonModel;
}
public ButtonModel getHighlightDiffTraceButtonModel() {
return highlightDiffButtonModel;
}
public ButtonModel getHighlightNonConsButtonModel() {
return highlightNonConsButtonModel;
}
public ButtonModel getShowAACodeButtonModel() {
return showAACodeButtonMoes;
}
public ButtonModel getIncFontSizeButtonModel() {
return incFontSizeButtonModel;
}
public ButtonModel getDecFontSizeButtonModel() {
return decFontSizeButtonModel;
}
public ButtonModel getCoding0ButtonModel() {
return coding0ButtonModel;
}
public ButtonModel getCoding1ButtonModel() {
return coding1ButtonModel;
}
public ButtonModel getCoding2ButtonModel() {
return coding2ButtonModel;
}
public ButtonModel getCodingNoneButtonModel() {
return nonCodingButtonModel;
}
public ButtonModel getDrawCoonPosOnRulerButtonModel() {
return drawCoonPosOnRulerButtonModel;
}
public ButtonModel getTransOnePosButtonModel() {
return transOnePosButtonModel;
}
public ButtonModel getCountCodonButtonModel() {
return countCodonButtonModel;
}
/*
*
*
* AlignmentListener
*
*
*/
public void newSequences(AlignmentEvent alignmentEvent) {
this.updateAllMenuEnabled();
}
public void alignmentMetaChanged(AlignmentEvent alignmentEvent) {
}
//
// 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.updateAllMenuEnabled();
}
//
// AlignmentSelectionListener
//
public void selectionChanged(AlignmentSelectionEvent e) {
if(aliViewWindow.getAlignment().isNucleotideAlignment()){
setHasSelectionFunctionsEnabled(aliViewWindow.getAlignment().hasSelection());
setAAFunctionsEnabled(false);
setEditFunctionsEnabled(aliViewWindow.getAlignment().isEditable());
}
if(aliViewWindow.getAlignment().isAAAlignment()){
setHasSelectionFunctionsEnabled(aliViewWindow.getAlignment().hasSelection());
setNucleotideFunctionsEnabled(false);
setEditFunctionsEnabled(aliViewWindow.getAlignment().isEditable());
}
}
public void recentFilesChanged() {
rebuildRecentFilesSubmenu();
}
public void alignAllCmdsChanged() {
}
public void alignAddCmdsChanged() {
}
public void externalCmdsChanged() {
rebuildExternalCommandsSubmenu();
}
public ButtonModel getCopyAsFastaButtonModel() {
return copyAsFastaButtonModel;
}
public ButtonModel getCopyAsCharactersButtonModel() {
return copyAsCharatersButtonModel;
}
public ButtonModel getRealignSelectedBlock() {
return realignSelectedBlockButtonModel;
}
public ButtonModel getRealignSelectedSequences() {
return realignSelectedSequencesButtonModel;
}
public ButtonModel getPasteAsFastaButtonModel() {
return pasteAsFastaButtonModel;
}
public void editModeChanged() {
logger.info("aliViewWindow.isEditMode()" + aliViewWindow.isEditMode());
editModeButtonModel.setSelected(aliViewWindow.isEditMode());
}
public ButtonModel getCopyNameButtonModel() {
return copyNameButtonModel;
}
public ButtonModel getRenameButtonModel() {
return renameButtonModel;
}
public ButtonModel getAddNewSequenceButtonModel() {
return addEmptySeqButtonModel;
}
}