import jalview.api.AlignViewControllerI;
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+import jalview.api.FeatureSettingsControllerI;
import jalview.api.SplitContainerI;
import jalview.api.ViewStyleI;
import jalview.api.analysis.ScoreModelI;
import jalview.bin.Cache;
+import jalview.bin.Jalview;
import jalview.commands.CommandI;
import jalview.commands.EditCommand;
import jalview.commands.EditCommand.Action;
import jalview.datamodel.AlignedCodonFrame;
import jalview.datamodel.Alignment;
import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentExportData;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.AlignmentOrder;
import jalview.datamodel.AlignmentView;
import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenSequences;
import jalview.datamodel.PDBEntry;
import jalview.datamodel.SeqCigar;
import jalview.datamodel.Sequence;
import jalview.io.AlignmentProperties;
import jalview.io.AnnotationFile;
import jalview.io.BioJsHTMLOutput;
-import jalview.io.FeaturesFile;
import jalview.io.FileLoader;
import jalview.io.FormatAdapter;
import jalview.io.HtmlSvgOutput;
import java.awt.BorderLayout;
import java.awt.Component;
-import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.util.Set;
import java.util.Vector;
-import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JEditorPane;
import javax.swing.JInternalFrame;
-import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JProgressBar;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
this(al, hiddenColumns, width, height, null);
}
+
/**
* Create alignment frame for al with hiddenColumns, a specific width and
* height, and specific sequenceId
init();
}
+ public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs,
+ ColumnSelection hiddenColumns, int width, int height)
+ {
+ setSize(width, height);
+
+ if (al.getDataset() == null)
+ {
+ al.setDataset(null);
+ }
+
+ viewport = new AlignViewport(al, hiddenColumns);
+
+ if (hiddenSeqs != null && hiddenSeqs.length > 0)
+ {
+ viewport.hideSequence(hiddenSeqs);
+ }
+ alignPanel = new AlignmentPanel(this, viewport);
+ addAlignmentPanel(alignPanel, true);
+ init();
+ }
+
+
/**
* Make a new AlignFrame from existing alignmentPanels
*
*/
void init()
{
+ if (!Jalview.isHeadlessMode())
+ {
+ progressBar = new ProgressBar(this.statusPanel, this.statusBar);
+ }
+
avc = new jalview.controller.AlignViewController(this, viewport,
alignPanel);
if (viewport.getAlignmentConservationAnnotation() == null)
updateEditMenuBar();
}
- // methods for implementing IProgressIndicator
- // need to refactor to a reusable stub class
- Hashtable progressBars, progressBarHandlers;
+ private IProgressIndicator progressBar;
/*
* (non-Javadoc)
@Override
public void setProgressBar(String message, long id)
{
- if (progressBars == null)
- {
- progressBars = new Hashtable();
- progressBarHandlers = new Hashtable();
- }
-
- JPanel progressPanel;
- Long lId = new Long(id);
- GridLayout layout = (GridLayout) statusPanel.getLayout();
- if (progressBars.get(lId) != null)
- {
- progressPanel = (JPanel) progressBars.get(new Long(id));
- statusPanel.remove(progressPanel);
- progressBars.remove(lId);
- progressPanel = null;
- if (message != null)
- {
- statusBar.setText(message);
- }
- if (progressBarHandlers.contains(lId))
- {
- progressBarHandlers.remove(lId);
- }
- layout.setRows(layout.getRows() - 1);
- }
- else
- {
- progressPanel = new JPanel(new BorderLayout(10, 5));
-
- JProgressBar progressBar = new JProgressBar();
- progressBar.setIndeterminate(true);
-
- progressPanel.add(new JLabel(message), BorderLayout.WEST);
- progressPanel.add(progressBar, BorderLayout.CENTER);
-
- layout.setRows(layout.getRows() + 1);
- statusPanel.add(progressPanel);
-
- progressBars.put(lId, progressPanel);
- }
- // update GUI
- // setMenusForViewport();
- validate();
+ progressBar.setProgressBar(message, id);
}
@Override
public void registerHandler(final long id,
final IProgressIndicatorHandler handler)
{
- if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
- {
- throw new Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler"));
- }
- progressBarHandlers.put(new Long(id), handler);
- final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
- if (handler.canCancel())
- {
- JButton cancel = new JButton(
- MessageManager.getString("action.cancel"));
- final IProgressIndicator us = this;
- cancel.addActionListener(new ActionListener()
- {
-
- @Override
- public void actionPerformed(ActionEvent e)
- {
- handler.cancelActivity(id);
- us.setProgressBar(MessageManager.formatMessage("label.cancelled_params", new Object[]{((JLabel) progressPanel.getComponent(0)).getText()}), id);
- }
- });
- progressPanel.add(cancel, BorderLayout.EAST);
- }
+ progressBar.registerHandler(id, handler);
}
/**
@Override
public boolean operationInProgress()
{
- if (progressBars != null && progressBars.size() > 0)
- {
- return true;
- }
- return false;
+ return progressBar.operationInProgress();
}
@Override
public void setStatus(String text)
{
statusBar.setText(text);
- };
+ }
/*
* Added so Castor Mapping file can obtain Jalview Version
.lastIndexOf(java.io.File.separatorChar) + 1);
}
- /*
- * First save any linked Chimera session.
- */
- Desktop.instance.saveChimeraSessions(file);
-
success = new Jalview2XML().saveAlignment(this, file, shortName);
statusBar.setText(MessageManager.formatMessage(
{
warningMessage("Cannot save file " + fileName + " using format "
+ format, "Alignment output format not supported");
- saveAs_actionPerformed(null);
- // JBPNote need to have a raise_gui flag here
+ if (!Jalview.isHeadlessMode())
+ {
+ saveAs_actionPerformed(null);
+ }
return false;
}
- String[] omitHidden = null;
-
- if (viewport.hasHiddenColumns())
+ AlignmentExportData exportData = getAlignmentForExport(format, viewport);
+ if (exportData.getSettings().isCancelled())
{
- int reply = JOptionPane
- .showInternalConfirmDialog(
- Desktop.desktop,
- MessageManager
- .getString("label.alignment_contains_hidden_columns"),
- MessageManager
- .getString("action.save_omit_hidden_columns"),
- JOptionPane.YES_NO_OPTION,
- JOptionPane.QUESTION_MESSAGE);
-
- if (reply == JOptionPane.YES_OPTION)
- {
- omitHidden = viewport.getViewAsString(false);
- }
+ return false;
}
- FeatureRenderer fr = new FeatureRenderer(this.alignPanel);
- viewport.setFeatureRenderer(fr);
- FormatAdapter f = new FormatAdapter(viewport);
+ FormatAdapter f = new FormatAdapter(alignPanel,
+ exportData.getSettings());
String output = f.formatSequences(format,
- viewport.getAlignment(), // class cast exceptions will
+ exportData.getAlignment(), // class cast exceptions will
// occur in the distant future
- omitHidden, f.getCacheSuffixDefault(format),
+ exportData.getOmitHidden(), exportData.getStartEndPostions(),
+ f.getCacheSuffixDefault(format),
viewport.getColumnSelection());
if (output == null)
return success;
}
+
private void warningMessage(String warning, String title)
{
if (new jalview.util.Platform().isHeadless())
@Override
protected void outputText_actionPerformed(ActionEvent e)
{
- String[] omitHidden = null;
- FeatureRenderer fr = new FeatureRenderer(this.alignPanel);
- viewport.setFeatureRenderer(fr);
- if (viewport.hasHiddenColumns())
- {
- int reply = JOptionPane
- .showInternalConfirmDialog(
- Desktop.desktop,
- MessageManager
- .getString("label.alignment_contains_hidden_columns"),
- MessageManager
- .getString("action.save_omit_hidden_columns"),
- JOptionPane.YES_NO_OPTION,
- JOptionPane.QUESTION_MESSAGE);
- if (reply == JOptionPane.YES_OPTION)
- {
- omitHidden = viewport.getViewAsString(false);
- }
+ AlignmentExportData exportData = getAlignmentForExport(
+ e.getActionCommand(), viewport);
+ if (exportData.getSettings().isCancelled())
+ {
+ return;
}
-
CutAndPasteTransfer cap = new CutAndPasteTransfer();
cap.setForInput(null);
-
try
{
- cap.setText(new FormatAdapter(viewport).formatSequences(
+ cap.setText(new FormatAdapter(alignPanel, exportData.getSettings())
+ .formatSequences(
e.getActionCommand(),
- viewport.getAlignment(), omitHidden,
+ exportData.getAlignment(),
+ exportData.getOmitHidden(), exportData.getStartEndPostions(),
viewport.getColumnSelection()));
Desktop.addInternalFrame(cap, MessageManager.formatMessage(
"label.alignment_output_command", new Object[]
}
+ public static AlignmentExportData getAlignmentForExport(String exportFomat,
+ AlignViewportI viewport)
+ {
+ AlignmentI alignmentToExport = null;
+ String[] omitHidden = null;
+ int[] alignmentStartEnd = new int[2];
+
+ HiddenSequences hiddenSeqs = viewport.getAlignment()
+ .getHiddenSequences();
+
+
+ alignmentToExport = viewport.getAlignment();
+ alignmentStartEnd = new int[]
+ { 0, alignmentToExport.getWidth() - 1 };
+
+ boolean hasHiddenSeqs = hiddenSeqs.getSize() > 0;
+ AlignExportSettings settings = new AlignExportSettings(hasHiddenSeqs,
+ viewport.hasHiddenColumns(), exportFomat);
+ settings.isExportAnnotations();
+
+ if (viewport.hasHiddenColumns() && !settings.isExportHiddenColumns())
+ {
+ omitHidden = viewport.getViewAsString(false);
+ }
+
+ if (hasHiddenSeqs && settings.isExportHiddenSequences())
+ {
+ alignmentToExport = hiddenSeqs.getFullAlignment();
+ }
+ else
+ {
+ alignmentToExport = viewport.getAlignment();
+ alignmentStartEnd = getStartEnd(alignmentStartEnd, viewport
+ .getColumnSelection().getHiddenColumns());
+ }
+ AlignmentExportData ed = new AlignmentExportData(alignmentToExport, omitHidden, alignmentStartEnd,
+ settings);
+ return ed;
+ }
+
+ private static int[] getStartEnd(int[] aligmentStartEnd,
+ List<int[]> hiddenCols)
+ {
+ int startPos = aligmentStartEnd[0];
+ int endPos = aligmentStartEnd[1];
+
+ int[] lowestRange = new int[2];
+ int[] higestRange = new int[2];
+
+ for (int[] hiddenCol : hiddenCols)
+ {
+ // System.out.println("comparing : " + hiddenCol[0] + "-" + hiddenCol[1]);
+
+ lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange;
+ higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange;
+ }
+ // System.out.println("min : " + lowestRange[0] + "-" + lowestRange[1]);
+ // System.out.println("max : " + higestRange[0] + "-" + higestRange[1]);
+
+ if (lowestRange[0] == 0 && lowestRange[1] == 0)
+ {
+ startPos = aligmentStartEnd[0];
+ }
+ else
+ {
+ startPos = lowestRange[1] + 1;
+ }
+
+ if (higestRange[0] == 0 && higestRange[1] == 0)
+ {
+ endPos = aligmentStartEnd[1];
+ }
+ else
+ {
+ endPos = higestRange[0];
+ }
+
+ // System.out.println("Export range : " + minPos + " - " + maxPos);
+ return new int[]
+ { startPos, endPos };
+ }
+
+ public static void main(String[] args)
+ {
+ ArrayList<int[]> hiddenCols = new ArrayList<int[]>();
+ hiddenCols.add(new int[]
+ { 0, 4 });
+ hiddenCols.add(new int[]
+ { 6, 9 });
+ hiddenCols.add(new int[]
+ { 11, 12 });
+ hiddenCols.add(new int[]
+ { 33, 33 });
+ hiddenCols.add(new int[]
+ { 45, 50 });
+
+ int[] x = getStartEnd(new int[]
+ { 0, 50 }, hiddenCols);
+ // System.out.println("Export range : " + x[0] + " - " + x[1]);
+ }
+
/**
* DOCUMENT ME!
*
@Override
protected void htmlMenuItem_actionPerformed(ActionEvent e)
{
- // new HTMLOutput(alignPanel,
- // alignPanel.getSeqPanel().seqCanvas.getSequenceRenderer(),
- // alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
new HtmlSvgOutput(null, alignPanel);
}
@Override
public void bioJSMenuItem_actionPerformed(ActionEvent e)
{
- new BioJsHTMLOutput(alignPanel,
- alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
+ BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel);
+ bjs.exportJalviewAlignmentAsBioJsHtmlFile();
}
public void createImageMap(File file, String image)
{
viewport.getSelectionGroup().getEndRes() + groupAdjustment);
}
+ /*
+ * just extend the last slide command if compatible; but not if in
+ * SplitFrame mode (to ensure all edits are broadcast - JAL-1802)
+ */
boolean appendHistoryItem = false;
Deque<CommandI> historyList = viewport.getHistoryList();
- if (historyList != null
+ boolean inSplitFrame = getSplitViewContainer() != null;
+ if (!inSplitFrame && historyList != null
&& historyList.size() > 0
&& historyList.peek() instanceof SlideSequencesCommand)
{
}
String output = new FormatAdapter().formatSequences("Fasta", seqs,
- omitHidden);
+ omitHidden, null);
StringSelection ss = new StringSelection(output);
public FeatureSettings featureSettings;
@Override
+ public FeatureSettingsControllerI getFeatureSettingsUI()
+ {
+ return featureSettings;
+ }
+
+ @Override
public void featureSettings_actionPerformed(ActionEvent e)
{
if (featureSettings != null)
// temporary flag until SplitFrame is released
boolean asSplitFrame = Cache.getDefault(
- Preferences.ENABLE_SPLIT_FRAME, false);
+ Preferences.ENABLE_SPLIT_FRAME, true);
if (asSplitFrame)
{
/*
"label.translation_of_params", new Object[]
{ this.getTitle() });
af.setTitle(newTitle);
- if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, false))
+ if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true))
{
final SequenceI[] seqs = viewport.getSelectionAsNewSequence();
viewport.openSplitFrame(af, new Alignment(seqs),
* contents or path to retrieve file
* @param type
* access mode of file (see jalview.io.AlignFile)
- * @return true if features file was parsed corectly.
+ * @return true if features file was parsed correctly.
*/
public boolean parseFeaturesFile(String file, String type)
{
- boolean featuresFile = false;
- try
- {
- featuresFile = new FeaturesFile(file, type).parse(viewport
- .getAlignment().getDataset(), alignPanel.getSeqPanel().seqCanvas
- .getFeatureRenderer().getFeatureColours(), false,
- jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));
- } catch (Exception ex)
- {
- ex.printStackTrace();
- }
+ return avc.parseFeaturesFile(file, type,
+ jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));
+
+ }
- if (featuresFile)
+ @Override
+ public void refreshFeatureUI(boolean enableIfNecessary)
+ {
+ // note - currently this is only still here rather than in the controller
+ // because of the featureSettings hard reference that is yet to be
+ // abstracted
+ if (enableIfNecessary)
{
viewport.setShowSequenceFeatures(true);
showSeqFeatures.setSelected(true);
- if (alignPanel.getSeqPanel().seqCanvas.fr != null)
- {
- // update the min/max ranges where necessary
- alignPanel.getSeqPanel().seqCanvas.fr.findAllFeatures(true);
- }
- if (featureSettings != null)
- {
- featureSettings.setTableData();
- }
- alignPanel.paintAlignment(true);
}
- return featuresFile;
- }
+ }
@Override
public void dragEnter(DropTargetDragEvent evt)
{
for (AlignmentAnnotation aa : alignPanel.getAlignment()
.getAlignmentAnnotation())
{
+ /*
+ * don't display non-positional annotations on an alignment
+ */
+ if (aa.annotations == null)
+ {
+ continue;
+ }
boolean apply = (aa.sequenceRef == null && forAlignment)
|| (aa.sequenceRef != null && forSequences);
if (apply)
aa.visible = visible;
}
}
- alignPanel.validateAnnotationDimensions(false);
+ alignPanel.validateAnnotationDimensions(true);
alignPanel.alignmentChanged();
}
sf.setComplementVisible(this, show);
}
}
+
}
class PrintThread extends Thread