package com.dgex.offspring.trader.assets;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import nxt.Asset;
import org.apache.log4j.Logger;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.osgi.service.event.Event;
import com.dgex.offspring.config.ContactsService;
import com.dgex.offspring.nxtCore.service.INxtService;
import com.dgex.offspring.swt.table.IFilteredStructuredContentProvider;
import com.dgex.offspring.swt.table.PaginationContainer;
import com.dgex.offspring.trader.api.IAssetExchange;
import com.dgex.offspring.ui.InspectAccountDialog;
import com.dgex.offspring.ui.PlaceBidOrderWizard;
import com.dgex.offspring.user.service.IUserService;
public class AssetsPart {
private static Logger logger = Logger.getLogger(AssetsPart.class);
private Composite mainComposite;
private Text filterText;
private AssetsViewer assetsViewer;
private PaginationContainer paginationContainer;
private final Runnable applyFilterDelayed = new Runnable() {
@Override
public void run() {
if (assetsViewer != null && assetsViewer.getControl() != null
&& !assetsViewer.getControl().isDisposed()) {
assetsViewer.refresh();
}
}
};
@Inject
public AssetsPart() {}
@PostConstruct
public void postConstruct(final Composite parent,
final IAssetExchange exchange, final INxtService nxt,
final IUserService userService, final IStylingEngine engine,
final UISynchronize sync) {
mainComposite = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(1).spacing(5, 2).margins(0, 0)
.applyTo(mainComposite);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true)
.applyTo(mainComposite);
filterText = new Text(mainComposite, SWT.BORDER);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
.grab(true, false).applyTo(filterText);
filterText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (assetsViewer != null) {
IFilteredStructuredContentProvider filteredProvider = (IFilteredStructuredContentProvider) assetsViewer
.getGenericTable().getContentProvider();
String text = filterText.getText().trim();
if (!text.isEmpty() && !text.endsWith("*")) {
text = text + "*";
}
filteredProvider.setFilter("NAME.FILTER", text.isEmpty() ? null
: text);
parent.getDisplay().timerExec(-1, applyFilterDelayed);
parent.getDisplay().timerExec(500, applyFilterDelayed);
}
}
});
paginationContainer = new PaginationContainer(mainComposite, SWT.NONE);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true)
.applyTo(paginationContainer);
assetsViewer = new AssetsViewer(paginationContainer.getViewerParent(), nxt);
paginationContainer.setTableViewer(assetsViewer, 200);
assetsViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) assetsViewer
.getSelection();
Object asset = selection.getFirstElement();
if (asset instanceof Asset) {
exchange.setSelectedAsset((Asset) asset);
}
}
});
assetsViewer.setInput(true);
assetsViewer.refresh();
Menu contextMenu = new Menu(assetsViewer.getTable());
assetsViewer.getTable().setMenu(contextMenu);
MenuItem itemQuickBuy = new MenuItem(contextMenu, SWT.PUSH);
itemQuickBuy.setText("Place Buy Order");
itemQuickBuy.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) assetsViewer
.getSelection();
Object asset = selection.getFirstElement();
if (asset instanceof Asset) {
Shell shell = parent.getShell();
Long assetId = ((Asset) asset).getId();
int quantity = 1;
long price = 0;
new WizardDialog(shell, new PlaceBidOrderWizard(userService, nxt,
assetId, quantity, price)).open();
}
}
});
MenuItem itemIssuer = new MenuItem(contextMenu, SWT.PUSH);
itemIssuer.setText("Show Asset Issuer");
itemIssuer.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) assetsViewer
.getSelection();
Object asset = selection.getFirstElement();
if (asset instanceof Asset) {
Long id = ((Asset) asset).getAccountId();
if (id != null) {
InspectAccountDialog.show(id, nxt, engine, userService, sync,
ContactsService.getInstance());
}
}
}
});
}
@Inject
@Optional
private void onInitializationFinished(
@UIEventTopic(INxtService.TOPIC_INITIALIZATION_FINISHED) int dummy) {
if (assetsViewer != null && !assetsViewer.getControl().isDisposed()) {
assetsViewer.refresh();
}
}
@Inject
@Optional
public void partActivation(
@UIEventTopic(UIEvents.UILifeCycle.ACTIVATE) Event event) {
if (assetsViewer != null && !assetsViewer.getControl().isDisposed()) {
assetsViewer.refresh();
}
}
@Inject
@Optional
private void onAssetSelected(
@UIEventTopic(IAssetExchange.TOPIC_ASSET_SELECTED) Asset asset) {
if (assetsViewer != null && !assetsViewer.getControl().isDisposed()) {
IStructuredSelection selection = (IStructuredSelection) assetsViewer
.getSelection();
Object selectedAsset = selection.getFirstElement();
if (selectedAsset instanceof Asset && asset instanceof Asset) {
if (!selectedAsset.equals(asset)) {
assetsViewer.setSelection(new StructuredSelection(asset));
}
}
}
}
}