/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program 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.
*
* This program 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 this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.fileimport.wizard.text;
import org.gitools.api.analysis.IProgressMonitor;
import org.gitools.api.matrix.IMatrixLayer;
import org.gitools.api.persistence.FileFormat;
import org.gitools.api.resource.IResource;
import org.gitools.api.resource.IResourceLocator;
import org.gitools.ui.app.fileimport.ImportWizard;
import org.gitools.ui.app.fileimport.wizard.text.reader.FlatTextImporter;
import org.gitools.ui.app.fileimport.wizard.text.reader.TableReaderAssistant;
import org.gitools.ui.core.Application;
import org.gitools.ui.core.utils.FileFormatFilter;
import org.gitools.ui.platform.dialog.MessageStatus;
import org.gitools.ui.platform.progress.JobRunnable;
import org.gitools.ui.platform.progress.JobThread;
import org.gitools.ui.platform.wizard.AbstractWizard;
import org.gitools.ui.platform.wizard.IWizardPage;
import org.gitools.ui.platform.wizard.WizardDialog;
import org.gitools.utils.readers.profile.ReaderProfile;
import org.gitools.utils.readers.profile.ReaderProfileValidationException;
import javax.swing.*;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
public class FlatTextImportWizard extends AbstractWizard implements ImportWizard {
private static FileFormat[] FILE_FORMATS = new FileFormat[]{new FileFormat("CSV", "csv"), new FileFormat("TSV", "tsv"), new FileFormat("TXT", "txt")};
private static FileFormatFilter FILE_FORMAT_FILTER = new FileFormatFilter("Text files", FILE_FORMATS);
private IResourceLocator locator;
private SelectDataLayoutPage selectDataLayoutPage;
private SelectTableColumnsPage selectTableColumnsPage;
private SelectMatrixColumnsPage selectMatrixColumnsPage;
private IProgressMonitor monitor;
private WizardDialog wizDlg;
private Callback callback;
public FlatTextImportWizard() {
setTitle("Import a text file");
setHelpContext("import_text");
}
@Override
public FileFormatFilter getFileFormatFilter() {
return FILE_FORMAT_FILTER;
}
public void setLocator(IResourceLocator locator) {
this.locator = locator;
}
@Override
public void setCallback(Callback callbackFunction) {
this.callback = callbackFunction;
}
@Override
public void addPages() {
selectDataLayoutPage = new SelectDataLayoutPage(new FlatTextImporter(locator, monitor, true));
selectDataLayoutPage.setTitle("Select data Layout");
selectDataLayoutPage.setMessage(MessageStatus.INFO, "");
addPage(selectDataLayoutPage);
selectTableColumnsPage = new SelectTableColumnsPage();
selectTableColumnsPage.setTitle("Table format");
addPage(selectTableColumnsPage);
selectMatrixColumnsPage = new SelectMatrixColumnsPage();
selectMatrixColumnsPage.setTitle("Matrix format");
addPage(selectMatrixColumnsPage);
}
@Override
public IWizardPage getNextPage(IWizardPage page) {
IWizardPage nextPage = super.getNextPage(getCurrentPage());
if (selectDataLayoutPage.equals(page)) {
String layout = selectDataLayoutPage.getReader().getReaderProfile().getLayout();
if (layout.equals(ReaderProfile.MATRIX)) {
selectMatrixColumnsPage.setReader(selectDataLayoutPage.getReader());
nextPage = selectMatrixColumnsPage;
} else if (layout.equals(ReaderProfile.TABLE)) {
selectTableColumnsPage.setReader(selectDataLayoutPage.getReader());
nextPage = selectTableColumnsPage;
}
}
return nextPage;
}
@Override
public boolean isLastPage(IWizardPage page) {
if (page.equals(selectTableColumnsPage) || page.equals(selectMatrixColumnsPage))
return true;
return super.isLastPage(page);
}
@Override
public void performFinish() {
if (getCurrentPage() instanceof IFileImportStep) {
IFileImportStep page = (IFileImportStep) getCurrentPage();
try {
page.finish();
} catch (ReaderProfileValidationException e) {
e.printStackTrace();
}
// validation succeded, close dialog and read file
wizDlg.setVisible(false);
final FlatTextImporter reader = page.getReader();
JobRunnable loadFile = new CommandConvertAndLoadCsvFile(reader) {
@Override
public void afterLoad(IResource resource, IProgressMonitor monitor) throws CommandException {
// Configure categorical color scales
Map<IMatrixLayer, Map<String, Integer>> factorMap = null;
if(reader.getReaderAssistant() instanceof TableReaderAssistant) {
factorMap = ((TableReaderAssistant) reader.getReaderAssistant()).getFactorMap();
}
addAfterLoadCommand(new CommandEditAllColorScales(factorMap));
callback.afterLoad(resource, monitor);
}
};
JobThread.execute(Application.get(), loadFile);
Application.get().showNotification("Data imported.");
} else {
throw new RuntimeException("Premature finish");
}
}
@Override
public void run(IProgressMonitor monitor) throws IOException, InvocationTargetException, InterruptedException {
init();
this.monitor = monitor;
this.wizDlg = new WizardDialog(Application.get(), this);
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
wizDlg.open();
}
});
}
}