3 * Copyright (C) 2016 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.molecular
.io
.wizard
;
13 import info
.bioinfweb
.commons
.io
.ContentExtensionFileFilter
;
14 import info
.bioinfweb
.commons
.io
.ContentExtensionFileFilter
.TestStrategy
;
15 import info
.bioinfweb
.commons
.io
.ExtensionFileFilter
;
16 import info
.bioinfweb
.jphyloio
.formatinfo
.JPhyloIOFormatInfo
;
20 import org
.eclipse
.core
.databinding
.DataBindingContext
;
21 import org
.eclipse
.core
.databinding
.validation
.MultiValidator
;
22 import org
.eclipse
.core
.databinding
.validation
.ValidationStatus
;
23 import org
.eclipse
.core
.runtime
.IStatus
;
24 import org
.eclipse
.jface
.databinding
.swt
.ISWTObservableValue
;
25 import org
.eclipse
.jface
.databinding
.swt
.SWTObservables
;
26 import org
.eclipse
.jface
.databinding
.wizard
.WizardPageSupport
;
27 import org
.eclipse
.jface
.wizard
.WizardPage
;
28 import org
.eclipse
.swt
.SWT
;
29 import org
.eclipse
.swt
.events
.SelectionAdapter
;
30 import org
.eclipse
.swt
.events
.SelectionEvent
;
31 import org
.eclipse
.swt
.layout
.FormAttachment
;
32 import org
.eclipse
.swt
.layout
.FormData
;
33 import org
.eclipse
.swt
.layout
.FormLayout
;
34 import org
.eclipse
.swt
.widgets
.Button
;
35 import org
.eclipse
.swt
.widgets
.Combo
;
36 import org
.eclipse
.swt
.widgets
.Composite
;
37 import org
.eclipse
.swt
.widgets
.FileDialog
;
38 import org
.eclipse
.swt
.widgets
.Label
;
39 import org
.eclipse
.swt
.widgets
.Text
;
41 import eu
.etaxonomy
.taxeditor
.molecular
.Messages
;
46 * Wizard page that allows to specify which parts of a single read alignment shall be exported to an alignment file.
48 * @author Ben Stöver
51 public class ExportSingleReadAlignmentWizardPage
extends WizardPage
{
52 private Text consensusSequenceLabelTextField
;
53 private Button exportConsensusSequenceCB
;
54 private Button exportSingleReadsCB
;
55 private Text fileTextField
;
56 private Combo formatComboBox
;
62 public ExportSingleReadAlignmentWizardPage() {
63 super("SingleReadSequencesExport"); //TODO Which pageName should be used here? Any conventions? //$NON-NLS-1$
64 setTitle(Messages
.wizardExportAlignmentTitle
);
65 setDescription(Messages
.wizardExportAlignmentDescription
);
70 * Create contents of the wizard.
72 * @param parent the parent component
75 public void createControl(Composite parent
) {
76 DataBindingContext dbc
= new DataBindingContext();
77 WizardPageSupport
.create(this, dbc
);
79 Composite container
= new Composite(parent
, SWT
.NULL
);
81 setControl(container
);
82 container
.setLayout(new FormLayout());
84 exportSingleReadsCB
= new Button(container
, SWT
.CHECK
);
85 FormData fd_exportSingleReadsCB
= new FormData();
86 fd_exportSingleReadsCB
.left
= new FormAttachment(0, 10);
87 exportSingleReadsCB
.setLayoutData(fd_exportSingleReadsCB
);
88 exportSingleReadsCB
.setText(Messages
.wizardExportAlignmentExportSingleReads
);
89 final ISWTObservableValue exportSingleReadsObservable
= SWTObservables
.observeSelection(exportSingleReadsCB
);
90 dbc
.bindValue(exportSingleReadsObservable
, getWizard().getModel().getExportSingleReadsObservable());
91 exportSingleReadsCB
.setSelection(false);
92 exportSingleReadsCB
.setSelection(true); // Must happen after the component has been bound to the model.
95 exportConsensusSequenceCB
= new Button(container
, SWT
.CHECK
);
96 exportConsensusSequenceCB
.addSelectionListener(new SelectionAdapter() {
98 public void widgetSelected(SelectionEvent e
) {
99 consensusSequenceLabelTextField
.setEnabled(exportConsensusSequenceCB
.getSelection());
102 FormData fd_exportConsensusSequenceCB
= new FormData();
103 fd_exportConsensusSequenceCB
.top
= new FormAttachment(exportSingleReadsCB
, 6);
104 fd_exportConsensusSequenceCB
.left
= new FormAttachment(0, 10);
105 exportConsensusSequenceCB
.setLayoutData(fd_exportConsensusSequenceCB
);
106 exportConsensusSequenceCB
.setText(Messages
.wizardExportAlignmentExportConsensusSeqLabel
);
107 final ISWTObservableValue exportConsensusSequenceObservable
= SWTObservables
.observeSelection(exportConsensusSequenceCB
);
108 dbc
.bindValue(exportConsensusSequenceObservable
, getWizard().getModel().getExportConsensusSequenceObservable());
109 exportConsensusSequenceCB
.setSelection(false);
110 exportConsensusSequenceCB
.setSelection(true); // Must happen after the component has been bound to the model.
112 consensusSequenceLabelTextField
= new Text(container
, SWT
.BORDER
);
113 FormData fd_consensusSequenceNameTextField
= new FormData();
114 fd_consensusSequenceNameTextField
.bottom
= new FormAttachment(exportConsensusSequenceCB
, 32, SWT
.BOTTOM
);
115 fd_consensusSequenceNameTextField
.left
= new FormAttachment(0, 32);
116 fd_consensusSequenceNameTextField
.right
= new FormAttachment(100, -10);
117 fd_consensusSequenceNameTextField
.top
= new FormAttachment(exportConsensusSequenceCB
, 6);
118 consensusSequenceLabelTextField
.setLayoutData(fd_consensusSequenceNameTextField
);
119 final ISWTObservableValue consensusSequenceLabelObservable
= SWTObservables
.observeText(consensusSequenceLabelTextField
, SWT
.Modify
);
120 dbc
.bindValue(consensusSequenceLabelObservable
, getWizard().getModel().getConsensusSequenceLabelObservable());
121 consensusSequenceLabelTextField
.setText("ConsensusSequence"); // Must happen after the component has been bound to the model. //$NON-NLS-1$
123 Label lblFormat
= new Label(container
, SWT
.NONE
);
124 FormData fd_lblFormat
= new FormData();
125 fd_lblFormat
.top
= new FormAttachment(consensusSequenceLabelTextField
, 36);
126 fd_lblFormat
.left
= new FormAttachment(exportSingleReadsCB
, 0, SWT
.LEFT
);
127 lblFormat
.setLayoutData(fd_lblFormat
);
128 lblFormat
.setText(Messages
.wizardExportAlignmentExportFormatLabel
);
130 Label lblSelectTheData
= new Label(container
, SWT
.NONE
);
131 fd_exportSingleReadsCB
.top
= new FormAttachment(lblSelectTheData
, 6);
132 FormData fd_lblSelectTheData
= new FormData();
133 fd_lblSelectTheData
.left
= new FormAttachment(0, 10);
134 fd_lblSelectTheData
.top
= new FormAttachment(0, 10);
135 lblSelectTheData
.setLayoutData(fd_lblSelectTheData
);
136 lblSelectTheData
.setText(Messages
.wizardExportAlignmentDataLabel
);
138 Label lblSelectTheExport
= new Label(container
, SWT
.NONE
);
139 FormData fd_lblSelectTheExport
= new FormData();
140 fd_lblSelectTheExport
.top
= new FormAttachment(lblFormat
, 57);
141 fd_lblSelectTheExport
.left
= new FormAttachment(exportSingleReadsCB
, 0, SWT
.LEFT
);
142 lblSelectTheExport
.setLayoutData(fd_lblSelectTheExport
);
143 lblSelectTheExport
.setText(Messages
.wizardExportAlignmentDestinationLabel
);
145 Label lblAlignmentFile
= new Label(container
, SWT
.NONE
);
146 FormData fd_lblAlignmentFile
= new FormData();
147 fd_lblAlignmentFile
.top
= new FormAttachment(lblSelectTheExport
, 9);
148 fd_lblAlignmentFile
.left
= new FormAttachment(exportSingleReadsCB
, 0, SWT
.LEFT
);
149 lblAlignmentFile
.setLayoutData(fd_lblAlignmentFile
);
150 lblAlignmentFile
.setText(Messages
.wizardExportAlignmentFileLabel
);
152 fileTextField
= new Text(container
, SWT
.BORDER
);
153 FormData fd_text
= new FormData();
154 fd_text
.right
= new FormAttachment(100, -10);
155 fd_text
.left
= new FormAttachment(lblAlignmentFile
, 6);
156 fd_text
.top
= new FormAttachment(lblSelectTheExport
, 6);
157 fileTextField
.setLayoutData(fd_text
);
158 final ISWTObservableValue fileNameObservable
= SWTObservables
.observeText(fileTextField
, SWT
.Modify
);
159 dbc
.bindValue(fileNameObservable
, getWizard().getModel().getFileNameObservable());
161 Button btnBrowse
= new Button(container
, SWT
.NONE
);
162 btnBrowse
.addSelectionListener(new SelectionAdapter() {
164 public void widgetSelected(SelectionEvent e
) {
165 FileDialog dialog
= new FileDialog(getShell(), SWT
.OPEN
);
166 dialog
.setText(Messages
.wizardExportAlignmentFileDialogTitle
);
167 ContentExtensionFileFilter filter
= getSelectedFormat().createFileFilter(TestStrategy
.EXTENSION
);
168 dialog
.setFilterExtensions(new String
[]{filter
.getExtensionsAsString()});
169 dialog
.setFilterNames(new String
[]{filter
.getDescription()});
170 String selectedFile
= dialog
.open();
171 if (selectedFile
!= null) { // Otherwise selecting was canceled.
172 fileTextField
.setText(selectedFile
);
176 FormData fd_btnBrowse
= new FormData();
177 fd_btnBrowse
.left
= new FormAttachment(100, -128);
178 fd_btnBrowse
.bottom
= new FormAttachment(fileTextField
, 43, SWT
.BOTTOM
);
179 fd_btnBrowse
.top
= new FormAttachment(fileTextField
, 13);
180 fd_btnBrowse
.right
= new FormAttachment(100, -10);
181 btnBrowse
.setLayoutData(fd_btnBrowse
);
182 btnBrowse
.setText(Messages
.wizardExportAlignmentBrowseButton
);
184 formatComboBox
= new Combo(container
, SWT
.READ_ONLY
);
185 for (JPhyloIOFormatInfo formatInfo
: ExportSingleReadAlignmentWizardModel
.FORMAT_NAMES_TO_INFO_MAP
.values()) {
186 formatComboBox
.add(formatInfo
.getFormatName());
188 FormData fd_formatComboBox
= new FormData();
189 fd_formatComboBox
.left
= new FormAttachment(0, 10);
190 fd_formatComboBox
.right
= new FormAttachment(100, -10);
191 fd_formatComboBox
.top
= new FormAttachment(lblFormat
, 6);
192 formatComboBox
.setLayoutData(fd_formatComboBox
);
193 final ISWTObservableValue formatObservable
= SWTObservables
.observeSelection(formatComboBox
); // ViewerProperties.singleSelection().observe(formatComboBox); falls ein ComboViewer verwendet wird. (Dann kann direkt FormatInfo verwendet werden.)
194 dbc
.bindValue(formatObservable
, getWizard().getModel().getFormatInfoObservable());
195 formatComboBox
.select(0); // Must happen after the component has been bound to the model.
197 Button appendExtensionButton
= new Button(container
, SWT
.NONE
);
198 appendExtensionButton
.addSelectionListener(new SelectionAdapter() {
200 public void widgetSelected(SelectionEvent e
) {
201 fileTextField
.setText(fileTextField
.getText() + ExtensionFileFilter
.EXTENSION_SEPARATOR
+
202 getSelectedFormat().createFileFilter(TestStrategy
.EXTENSION
).getDefaultExtension());
205 FormData fd_btnNewButton
= new FormData();
206 fd_btnNewButton
.left
= new FormAttachment(btnBrowse
, -276, SWT
.LEFT
);
207 fd_btnNewButton
.right
= new FormAttachment(btnBrowse
, -6);
208 fd_btnNewButton
.bottom
= new FormAttachment(fileTextField
, 43, SWT
.BOTTOM
);
209 fd_btnNewButton
.top
= new FormAttachment(fileTextField
, 13);
210 appendExtensionButton
.setLayoutData(fd_btnNewButton
);
211 appendExtensionButton
.setText(Messages
.wizardExportAlignmentAppendExtensionButton
);
213 dbc
.addValidationStatusProvider(new MultiValidator() {
215 protected IStatus
validate() {
216 String label
= (String
)consensusSequenceLabelObservable
.getValue();
217 boolean exportConsensus
= (Boolean
)exportConsensusSequenceObservable
.getValue();
218 boolean exportReads
= (Boolean
)exportSingleReadsObservable
.getValue();
220 if (!exportConsensus
&& !exportReads
) {
221 return ValidationStatus
.error(Messages
.wizardExportAlignmentErrorNothingToExport
);
223 else if (exportConsensus
&& ((label
== null) || label
.isEmpty())) {
224 return ValidationStatus
.error(Messages
.wizardExportAlignmentErrorMissingSeqLabel
);
227 String fileName
= (String
)fileNameObservable
.getValue();
228 if ((fileName
== null) || fileName
.isEmpty()) {
229 return ValidationStatus
.error(Messages
.wizardExportAlignmentErrorMissingFileName
);
231 else if (!getSelectedFormat().createFileFilter(TestStrategy
.EXTENSION
).accept(new File(fileName
))) {
232 return ValidationStatus
.warning(Messages
.wizardExportAlignmentwarningMissingExtension
);
234 else if (fileName
.charAt(0) == ExtensionFileFilter
.EXTENSION_SEPARATOR
) {
235 return ValidationStatus
.warning(Messages
.wizardExportAlignmentWarningFileNameStartsDot
);
238 return ValidationStatus
.ok();
245 private JPhyloIOFormatInfo
getSelectedFormat() {
246 return ExportSingleReadAlignmentWizardModel
.FORMAT_NAMES_TO_INFO_MAP
.get(formatComboBox
.getText());
254 public ExportSingleReadAlignmentWizard
getWizard() {
255 return (ExportSingleReadAlignmentWizard
)super.getWizard(); // Would throw an exception, if this page is used within another wizard.