package name.abuchen.portfolio.ui.wizards.client;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Table;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.ui.Images;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.wizards.AbstractWizardPage;
public class ImportIndizesPage extends AbstractWizardPage
{
private static final class ProposedSecurities
{
private String label;
private List<Security> securities = new ArrayList<Security>();
public ProposedSecurities(String label)
{
this.label = label;
}
@Override
public String toString()
{
return label;
}
}
private Client client;
private List<ProposedSecurities> proposals = new ArrayList<ProposedSecurities>();
private Combo comboDropDown;
public ImportIndizesPage(Client client)
{
super(ImportIndizesPage.class.getSimpleName());
this.client = client;
setTitle(Messages.NewFileWizardSecurityTitle);
setDescription(Messages.NewFileWizardSecurityDescription);
ResourceBundle bundle = ResourceBundle.getBundle("name.abuchen.portfolio.ui.wizards.client.index"); //$NON-NLS-1$
String indices = bundle.getString("proposals"); //$NON-NLS-1$
String[] indAr = indices.split(","); //$NON-NLS-1$
for (String index : indAr)
{
String label = bundle.getString(index + ".name"); //$NON-NLS-1$
ProposedSecurities proposal = new ProposedSecurities(label);
proposals.add(proposal);
String[] values = bundle.getString(index).split(","); //$NON-NLS-1$
for (String ticker : values)
{
String key = index + '.' + ticker;
Security security = new Security();
security.setTickerSymbol(ticker);
security.setName(bundle.getString(key + ".name")); //$NON-NLS-1$
security.setIsin(safeGetString(bundle, key + ".isin")); //$NON-NLS-1$
security.setFeed("YAHOO"); //$NON-NLS-1$
security.setRetired(safeGetBoolean(bundle, key + ".isRetired")); //$NON-NLS-1$
proposal.securities.add(security);
}
}
}
private String safeGetString(ResourceBundle bundle, String key)
{
try
{
return bundle.getString(key);
}
catch (MissingResourceException ignore)
{
return null;
}
}
private boolean safeGetBoolean(ResourceBundle bundle, String key)
{
try
{
return Boolean.parseBoolean(bundle.getString(key));
}
catch (MissingResourceException ignore)
{
return false;
}
}
@Override
public void beforePage()
{
comboDropDown.notifyListeners(SWT.Selection, new Event());
}
@Override
public void createControl(Composite parent)
{
Composite container = new Composite(parent, SWT.NULL);
setControl(container);
GridLayoutFactory.fillDefaults().applyTo(container);
comboDropDown = new Combo(container, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.FILL).applyTo(comboDropDown);
final ComboViewer comboViewer = new ComboViewer(comboDropDown);
comboViewer.setContentProvider(ArrayContentProvider.getInstance());
comboViewer.setInput(proposals);
Composite tableContainer = new Composite(container, SWT.NONE);
GridDataFactory.fillDefaults().span(2, 1).grab(true, true).applyTo(tableContainer);
TableColumnLayout layout = new TableColumnLayout();
tableContainer.setLayout(layout);
final TableViewer tViewer = new TableViewer(tableContainer);
comboViewer.addSelectionChangedListener(new ISelectionChangedListener()
{
@Override
public void selectionChanged(SelectionChangedEvent event)
{
ProposedSecurities element = (ProposedSecurities) ((IStructuredSelection) event.getSelectionProvider()
.getSelection()).getFirstElement();
if (element != null)
tViewer.setInput(element.securities);
}
});
Table table = tViewer.getTable();
table.setHeaderVisible(true);
tViewer.setContentProvider(ArrayContentProvider.getInstance());
TableViewerColumn aCol = new TableViewerColumn(tViewer, SWT.NONE);
layout.setColumnData(aCol.getColumn(), new ColumnWeightData(90));
aCol.getColumn().setText(Messages.ColumnSecurity);
aCol.setLabelProvider(new ColumnLabelProvider()
{
@Override
public String getText(Object element)
{
return ((Security) element).getName();
}
@Override
public Image getImage(Object element)
{
return Images.SECURITY.image();
}
});
aCol = new TableViewerColumn(tViewer, SWT.NONE);
layout.setColumnData(aCol.getColumn(), new ColumnWeightData(10));
aCol.setLabelProvider(new ColumnLabelProvider()
{
@Override
public String getText(Object element)
{
return null;
}
@Override
public Image getImage(Object element)
{
return client.getSecurities().contains(element) ? Images.CHECK.image() : null;
}
});
tViewer.addDoubleClickListener(new IDoubleClickListener()
{
@Override
public void doubleClick(DoubleClickEvent event)
{
Security security = (Security) ((IStructuredSelection) event.getSelection()).getFirstElement();
if (security != null && !client.getSecurities().contains(security))
{
client.addSecurity(security);
tViewer.refresh(security);
}
}
});
Button button = new Button(container, SWT.PUSH);
button.setText(Messages.NewFileWizardAddAll);
GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.FILL).applyTo(button);
button.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
ProposedSecurities proposal = (ProposedSecurities) ((IStructuredSelection) comboViewer.getSelection())
.getFirstElement();
for (Security security : proposal.securities)
{
if (!client.getSecurities().contains(security))
client.addSecurity(security);
}
tViewer.refresh();
}
});
comboDropDown.select(0);
container.pack();
setPageComplete(true);
}
}