package name.abuchen.portfolio.ui.wizards.splits;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.jface.databinding.swt.WidgetProperties;
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.ColumnPixelData;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
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.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.Transaction;
import name.abuchen.portfolio.model.TransactionPair;
import name.abuchen.portfolio.money.Values;
import name.abuchen.portfolio.ui.Images;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.wizards.AbstractWizardPage;
public class PreviewTransactionsPage extends AbstractWizardPage
{
private class TransactionLabelProvider extends LabelProvider implements ITableLabelProvider
{
public Image getColumnImage(Object element, int columnIndex)
{
if (columnIndex == 1)
{
Transaction t = ((TransactionPair<?>) element).getTransaction();
if (t instanceof AccountTransaction)
return Images.ACCOUNT.image();
else if (t instanceof PortfolioTransaction)
return Images.PORTFOLIO.image();
}
return null;
}
public String getColumnText(Object element, int columnIndex)
{
TransactionPair<?> pair = (TransactionPair<?>) element;
Transaction t = pair.getTransaction();
switch (columnIndex)
{
case 0:
return Values.Date.format(t.getDate());
case 1:
if (t instanceof AccountTransaction)
return ((AccountTransaction) t).getType().toString();
else if (t instanceof PortfolioTransaction)
return ((PortfolioTransaction) t).getType().toString();
return null;
case 2:
return Values.Share.format(t.getShares());
case 3:
if (model.isChangeTransactions() && t.getDate().isBefore(model.getExDate()))
{
long shares = t.getShares() * model.getNewShares() / model.getOldShares();
return Values.Share.format(shares);
}
return null;
case 4:
return pair.getOwner().toString();
default:
return null;
}
}
}
private StockSplitModel model;
private TableViewer tableViewer;
public PreviewTransactionsPage(StockSplitModel model)
{
super("preview-transactions"); //$NON-NLS-1$
setTitle(Messages.SplitWizardReviewTransactionsTitle);
setDescription(Messages.SplitWizardReviewTransactionsDescription);
this.model = model;
}
@Override
public void beforePage()
{
Security security = model.getSecurity();
List<TransactionPair<?>> transactions = security.getTransactions(model.getClient());
Collections.sort(transactions, new TransactionPair.ByDate());
tableViewer.setInput(transactions);
}
@Override
public void createControl(Composite parent)
{
Composite container = new Composite(parent, SWT.NONE);
setControl(container);
GridLayoutFactory.fillDefaults().numColumns(1).applyTo(container);
Button checkbox = new Button(container, SWT.CHECK);
checkbox.setText(Messages.SplitWizardLabelUpdateTransactions);
Composite tableContainer = new Composite(container, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, true).applyTo(tableContainer);
TableColumnLayout layout = new TableColumnLayout();
tableContainer.setLayout(layout);
tableViewer = new TableViewer(tableContainer, SWT.BORDER);
Table table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn column = new TableColumn(tableViewer.getTable(), SWT.None);
column.setText(Messages.ColumnDate);
layout.setColumnData(column, new ColumnPixelData(80, true));
column = new TableColumn(tableViewer.getTable(), SWT.None);
column.setText(Messages.ColumnTransactionType);
layout.setColumnData(column, new ColumnPixelData(80, true));
column = new TableColumn(tableViewer.getTable(), SWT.RIGHT);
column.setText(Messages.ColumnCurrentShares);
layout.setColumnData(column, new ColumnPixelData(80, true));
column = new TableColumn(tableViewer.getTable(), SWT.RIGHT);
column.setText(Messages.ColumnUpdatedShares);
layout.setColumnData(column, new ColumnPixelData(80, true));
column = new TableColumn(tableViewer.getTable(), SWT.None);
column.setText(Messages.ColumnSource);
layout.setColumnData(column, new ColumnPixelData(200, true));
tableViewer.setLabelProvider(new TransactionLabelProvider());
tableViewer.setContentProvider(ArrayContentProvider.getInstance());
// bindings
DataBindingContext context = new DataBindingContext();
context.bindValue(WidgetProperties.selection().observe(checkbox), //
BeanProperties.value("changeTransactions").observe(model)); //$NON-NLS-1$
checkbox.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
tableViewer.refresh();
}
});
}
}