/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview 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.
*
* Jalview 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 Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.gui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import jalview.api.AlignExportSettingsI;
import jalview.api.AlignViewportI;
import jalview.bin.Jalview;
import jalview.io.FileFormatI;
import jalview.util.MessageManager;
/**
* A dialog that allows the user to specify whether to include hidden columns or
* sequences in an alignment export, and possibly features, annotations and
* groups, if applicable to the output file format
*/
@SuppressWarnings("serial")
public class AlignExportOptions extends JPanel
{
protected JCheckBox chkHiddenSeqs = new JCheckBox();
protected JCheckBox chkHiddenCols = new JCheckBox();
protected JCheckBox chkExportAnnots = new JCheckBox();
protected JCheckBox chkExportFeats = new JCheckBox();
protected JCheckBox chkExportGrps = new JCheckBox();
protected AlignExportSettingsI settings;
private boolean isComplexAlignFile;
JvOptionPane dialog;
/**
* A convenience method that answers true if this dialog should be shown -
* that is, if the alignment has any hidden rows or columns, or if the file
* format is one that can (optionally) represent annotations, features or
* groups data - else false
*
* @param viewport
* @param format
* @return
*/
public static boolean isNeeded(AlignViewportI viewport,
FileFormatI format)
{
return !Jalview.getInstance().isHeadlessMode()
&& (viewport.hasHiddenColumns() || viewport.hasHiddenRows()
|| format.isComplexAlignFile());
}
/**
* Constructor that passes in an initial set of export options. User choices
* in the dialog should update this object, and the same object
* should be used in any action handler set by calling
* setResponseAction
.
*
* @param viewport
* @param format
* @param defaults
*/
public AlignExportOptions(AlignViewportI viewport, FileFormatI format,
AlignExportSettingsI defaults)
{
this.settings = defaults;
this.isComplexAlignFile = format.isComplexAlignFile();
init(viewport.hasHiddenRows(), viewport.hasHiddenColumns());
dialog = JvOptionPane.newOptionDialog(Desktop.desktop);
}
/**
* Shows the dialog, and runs any registered response actions that correspond
* to user choices
*/
public void showDialog()
{
Object[] options = new Object[] { MessageManager.getString("action.ok"),
MessageManager.getString("action.cancel") };
dialog.showInternalDialog(this,
MessageManager.getString("label.export_settings"),
JvOptionPane.OK_CANCEL_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
options, MessageManager.getString("action.ok"));
}
/**
* Registers a Runnable action to be performed for a particular user response
* in the dialog
*
* @param action
*/
public void setResponseAction(Object response, Runnable action)
{
dialog.setResponseHandler(response, action);
}
/**
* Selects/deselects all enabled and shown options on 'Check all' selected or
* deselected
*
* @param isSelected
*/
void checkAllAction(boolean isSelected)
{
boolean set = chkHiddenSeqs.isEnabled() && isSelected;
chkHiddenSeqs.setSelected(set);
settings.setExportHiddenSequences(set);
set = chkHiddenCols.isEnabled() && isSelected;
chkHiddenCols.setSelected(set);
settings.setExportHiddenColumns(set);
set = isComplexAlignFile && chkExportAnnots.isEnabled() && isSelected;
chkExportAnnots.setSelected(set);
settings.setExportAnnotations(set);
set = isComplexAlignFile && chkExportFeats.isEnabled() && isSelected;
chkExportFeats.setSelected(set);
settings.setExportFeatures(set);
set = isComplexAlignFile && chkExportGrps.isEnabled() && isSelected;
chkExportGrps.setSelected(set);
settings.setExportGroups(set);
}
/**
* Initialises the components of the display
*
* @param hasHiddenSeq
* @param hasHiddenCols
*/
private void init(boolean hasHiddenSeq, boolean hasHiddenCols)
{
chkHiddenSeqs.setText(
MessageManager.getString("action.export_hidden_sequences"));
chkHiddenSeqs.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
settings.setExportHiddenSequences(chkHiddenSeqs.isSelected());
}
});
chkHiddenCols.setText(
MessageManager.getString("action.export_hidden_columns"));
chkHiddenCols.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
settings.setExportHiddenColumns(chkHiddenCols.isSelected());
}
});
chkExportAnnots
.setText(MessageManager.getString("action.export_annotations"));
chkExportAnnots.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
settings.setExportAnnotations(chkExportAnnots.isSelected());
}
});
chkExportFeats
.setText(MessageManager.getString("action.export_features"));
chkExportFeats.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
settings.setExportFeatures(chkExportFeats.isSelected());
}
});
chkExportGrps.setText(MessageManager.getString("action.export_groups"));
chkExportGrps.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
settings.setExportGroups(chkExportGrps.isSelected());
}
});
JCheckBox chkAll = new JCheckBox(
MessageManager.getString("action.select_all"));
JPanel hiddenRegionConfPanel = new JPanel(new BorderLayout());
JPanel complexExportPanel = new JPanel(new BorderLayout());
this.setLayout(new BorderLayout());
chkAll.addItemListener(new ItemListener()
{
@Override
public void itemStateChanged(ItemEvent e)
{
checkAllAction(chkAll.isSelected());
}
});
hiddenRegionConfPanel.add(chkHiddenSeqs, BorderLayout.CENTER);
hiddenRegionConfPanel.add(chkHiddenCols, BorderLayout.SOUTH);
chkHiddenSeqs.setEnabled(hasHiddenSeq);
chkHiddenCols.setEnabled(hasHiddenCols);
complexExportPanel.add(chkExportAnnots, BorderLayout.NORTH);
complexExportPanel.add(chkExportFeats, BorderLayout.CENTER);
complexExportPanel.add(chkExportGrps, BorderLayout.SOUTH);
JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
actionPanel.add(chkAll);
JPanel optionsPanel = new JPanel();
if (this.isComplexAlignFile)
{
optionsPanel.add(complexExportPanel);
}
if (hasHiddenSeq || hasHiddenCols)
{
optionsPanel.add(hiddenRegionConfPanel);
}
add(optionsPanel, BorderLayout.NORTH);
add(actionPanel, BorderLayout.SOUTH);
}
}