package net.helipilot50.stocktrade.client;
import java.util.ArrayList;
import java.util.List;
import net.helipilot50.stocktrade.model.Order;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.Orientation;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
public class TraderWindow extends Window {
ListStore<Order> orders;
private Grid<Order> ordersGrid;
public TraderWindow() {
super();
setClosable(false);
setResizable(false);
setAutoWidth(true);
setAutoHeight(true);
setSize("460px", "300px");
setPagePosition(10, 200);
orders = new ListStore<Order>();
orders.setMonitorChanges(true);
setHeading("Trader");
setLayout(new RowLayout(Orientation.VERTICAL));
List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
ColumnConfig clmncnfgOrderID = new ColumnConfig("orderID", "ID", 30);
configs.add(clmncnfgOrderID);
ColumnConfig clmncnfgStockName = new ColumnConfig("stockName", "Stock", 80);
configs.add(clmncnfgStockName);
ColumnConfig clmncnfgCustomer = new ColumnConfig("customerName", "Customer", 150);
configs.add(clmncnfgCustomer);
ColumnConfig clmncnfgPrice = new ColumnConfig("price", "Price", 60);
configs.add(clmncnfgPrice);
ColumnConfig clmncnfgQuantity = new ColumnConfig("quantity", "Quantity", 60);
configs.add(clmncnfgQuantity);
ColumnConfig clmncnfgType = new ColumnConfig("type", "Type", 60);
configs.add(clmncnfgType);
ColumnModel cm = new ColumnModel(configs);
ordersGrid = new Grid<Order>(orders, cm);
ordersGrid.setSize("445px", "235px");
ordersGrid.setBorders(true);
add(ordersGrid);
HorizontalPanel horizontalPanel = new HorizontalPanel();
horizontalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
add(horizontalPanel);
Button btnMakeTradde = new Button("Make Trade");
btnMakeTradde.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
makeTrade();
}
});
horizontalPanel.add(btnMakeTradde);
Button btnRefresh = new Button("Refresh");
btnRefresh.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
getOrders();
}
});
horizontalPanel.add(btnRefresh);
Button btnExit = new Button("Exit");
btnExit.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
TraderWindow.this.showWindow(false);
}
});
horizontalPanel.add(btnExit);
getOrders();
}
@Override
protected void onRender(Element parent, int pos) {
super.onRender(parent, pos);
//getOrders();
}
private void setOrders(List<Order> tradeOrders){
this.orders.removeAll();
this.orders.add(tradeOrders);
setHeading("Trade: " + tradeOrders.size() + " orders");
}
private void getOrders(){
// List<Order> orders = new ArrayList<Order>();
// orders.add(new Order());
// setOrders(orders);
TradeServiceAsync tradeSO = Registry.get("TradeService");
tradeSO.getOrderList(new AsyncCallback<List<Order>>() {
@Override
public void onSuccess(List<Order> result) {
Info.display("Success", "Orders found: " + result.size());
setOrders(result);
}
@Override
public void onFailure(Throwable caught) {
MessageBox.alert("Trade Error", caught.getMessage(), null);
setOrders(new ArrayList<Order>());
}
});
}
private void makeTrade(){
TradeServiceAsync tradeSO = Registry.get("TradeService");
Order buyOrder = null;
Order sellOrder = null;
boolean foundSell = false;
boolean foundBuy = false;
int quantity = 0;
double price = 0.0f;
List<Order> selected = ordersGrid.getSelectionModel().getSelectedItems();
for (Order order : selected){
if (order.getType().equalsIgnoreCase("Buy") && !foundBuy){
buyOrder = order;
quantity = order.getQuantity();
}
if (order.getType().equalsIgnoreCase("Sell") && !foundSell){
sellOrder = order;
price = order.getPrice();
}
if (foundBuy && foundSell)
break;
}
tradeSO.makeTrade(buyOrder, sellOrder, quantity, price, new AsyncCallback<String>() {
@Override
public void onSuccess(String result) {
Info.display("Success", "Trade complete");
getOrders(); //Kludgy refresh
}
@Override
public void onFailure(Throwable caught) {
MessageBox.alert("Trade Error", caught.getMessage(), null);
}
});
}
}