package name.abuchen.portfolio.ui.wizards.datatransfer;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.graphics.Image;
import name.abuchen.portfolio.datatransfer.Extractor;
import name.abuchen.portfolio.datatransfer.actions.InsertAction;
import name.abuchen.portfolio.datatransfer.csv.CSVImporter;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.SecurityPrice;
import name.abuchen.portfolio.ui.ConsistencyChecksJob;
import name.abuchen.portfolio.ui.Images;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.wizards.AbstractWizardPage;
public class CSVImportWizard extends Wizard
{
private static class ExtractorProxy implements Extractor
{
private final CSVImporter importer;
public ExtractorProxy(CSVImporter importer)
{
this.importer = importer;
}
@Override
public String getLabel()
{
return this.importer.getExtractor().getLabel();
}
@Override
public String getFilterExtension()
{
return this.importer.getExtractor().getFilterExtension();
}
@Override
public List<Item> extract(List<File> files, List<Exception> errors)
{
return this.importer.createItems(errors);
}
}
private Client client;
private IPreferenceStore preferences;
private CSVImporter importer;
/**
* If a target security is given, then only security prices are imported
* directly into that security.
*/
private Security target;
private CSVImportDefinitionPage definitionPage;
private ReviewExtractedItemsPage reviewPage;
private SelectSecurityPage selectSecurityPage;
public CSVImportWizard(Client client, IPreferenceStore preferences, File inputFile)
{
this.client = client;
this.preferences = preferences;
this.importer = new CSVImporter(client, inputFile);
setWindowTitle(Messages.CSVImportWizardTitle);
}
public void setTarget(Security target)
{
this.target = target;
}
@Override
public Image getDefaultPageImage()
{
return Images.BANNER.image();
}
@Override
public void addPages()
{
definitionPage = new CSVImportDefinitionPage(importer, target != null);
addPage(definitionPage);
reviewPage = new ReviewExtractedItemsPage(client, new ExtractorProxy(importer), preferences,
Arrays.asList(importer.getInputFile()));
addPage(reviewPage);
selectSecurityPage = new SelectSecurityPage(client);
addPage(selectSecurityPage);
AbstractWizardPage.attachPageListenerTo(getContainer());
}
@Override
public boolean canFinish()
{
return super.canFinish() && (target != null || getContainer().getCurrentPage() != definitionPage);
}
@Override
public boolean performFinish()
{
((AbstractWizardPage) getContainer().getCurrentPage()).afterPage();
boolean isDirty = false;
if (importer.getExtractor() == importer.getSecurityPriceExtractor())
isDirty = importSecurityPrices();
else
isDirty = importItems();
if (isDirty)
{
client.markDirty();
new ConsistencyChecksJob(client, false).schedule();
}
return true;
}
private boolean importSecurityPrices()
{
Security security = target != null ? target : selectSecurityPage.getSelectedSecurity();
List<SecurityPrice> prices = importer.createItems(new ArrayList<>()).get(0).getSecurity().getPrices();
boolean isDirty = false;
for (SecurityPrice p : prices)
{
if (security.addPrice(p))
isDirty = true;
}
return isDirty;
}
private boolean importItems()
{
InsertAction action = new InsertAction(client);
action.setConvertBuySellToDelivery(reviewPage.doConvertToDelivery());
boolean isDirty = false;
for (ExtractedEntry entry : reviewPage.getEntries())
{
if (entry.isImported())
{
entry.getItem().apply(action, reviewPage);
isDirty = true;
}
}
return isDirty;
}
}