org.dynami.views.OrdersView.java Source code

Java tutorial

Introduction

Here is the source code for org.dynami.views.OrdersView.java

Source

/*
 * Copyright 2013 Alessandro Atria
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.dynami.views;

import java.util.Date;

import org.dynami.core.service.IOrderManager.STATUS;
import org.dynami.core.type.OrderType;
import org.dynami.core.util.DUtils;
import org.dynami.msg.Order;
import org.dynami.services.EDispatcher;
import org.dynami.services.EOrderService;
import org.dynami.utils.RCPUtils;
import org.dynami.utils.UIUtils;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.wb.swt.SWTResourceManager;

public class OrdersView extends ViewPart {
    public static final String ID = "org.dynami.views.OrdersPart";

    private static final Color GREY = SWTResourceManager.getColor(SWT.COLOR_GRAY);
    private static final Color RED = SWTResourceManager.getColor(SWT.COLOR_RED);
    private static final Color BLUE = SWTResourceManager.getColor(SWT.COLOR_BLUE);
    private static final Color MAGENTA = SWTResourceManager.getColor(SWT.COLOR_MAGENTA);
    private Text txtSearch;
    private final OrderTextFilter filter = new OrderTextFilter();
    private Table table;
    private TableViewer tableViewer;
    private TableColumn tblclmnPlacementTime, tblclmnExecutionTime, tblclmnStatus, tblclmnTradable, tblclmnPrice,
            tblclmnQuantity, tblclmnNotes;

    private TableColumn tblclmnValue;

    private final EOrderService orderService = RCPUtils.getService(EOrderService.class);

    private final EDispatcher.EServiceListener<Order> orderListener = new EDispatcher.EServiceListener<Order>() {
        @Override
        public void update(final Order o) {
            Display.getDefault().asyncExec(new Runnable() {
                @Override
                public void run() {
                    tableViewer.add(o);
                    tableViewer.getTable().setSelection(tableViewer.getTable().getItemCount() - 1);
                }
            });
        }
    };

    public OrdersView() {

    }

    @Override
    public void createPartControl(Composite parent) {
        parent.setLayout(new GridLayout(2, false));

        txtSearch = new Text(parent, SWT.BORDER);
        txtSearch.setFont(SWTResourceManager.getFont("Segoe UI", 9, SWT.ITALIC));
        txtSearch.setText(UIUtils.SEARCH_HINT);
        txtSearch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        txtSearch.addFocusListener(new FocusListener() {
            @Override
            public void focusLost(FocusEvent e) {
                txtSearch.setText(UIUtils.SEARCH_HINT);
            }

            @Override
            public void focusGained(FocusEvent e) {
                txtSearch.setText("");
            }
        });

        txtSearch.addTraverseListener(new TraverseListener() {
            @Override
            public void keyTraversed(TraverseEvent event) {
                if (event.detail == SWT.TRAVERSE_RETURN) {
                    final String search = txtSearch.getText();
                    if (!UIUtils.SEARCH_HINT.equals(search) && !"".equals(search)) {
                        filter.setSearchText(txtSearch.getText());
                        tableViewer.addFilter(filter);
                    } else {
                        tableViewer.removeFilter(filter);
                    }
                }
            }
        });

        Composite tbl_composite = new Composite(parent, SWT.NONE);
        tbl_composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));

        TableColumnLayout tcl_layout = new TableColumnLayout();
        tbl_composite.setLayout(tcl_layout);
        tableViewer = new TableViewer(tbl_composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL);
        tableViewer.setUseHashlookup(true);
        tableViewer.setContentProvider(ArrayContentProvider.getInstance());
        tableViewer.addFilter(filter);
        table = tableViewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        {
            TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            tblclmnPlacementTime = tableViewerColumn.getColumn();
            tblclmnPlacementTime.setText("PlacementTime");
            tcl_layout.setColumnData(tblclmnPlacementTime, new ColumnWeightData(10, true));
            tableViewerColumn.setLabelProvider(new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    Order o = (Order) cell.getElement();
                    cell.setText(DUtils.LONG_DATE_FORMAT.format(new Date(o.creationDate)));
                    colorizeOrder(cell, o);
                }
            });
        }
        {
            TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            tblclmnExecutionTime = tableViewerColumn.getColumn();
            tblclmnExecutionTime.setText("ExecutionTime");
            tcl_layout.setColumnData(tblclmnExecutionTime, new ColumnWeightData(10, true));
            tableViewerColumn.setLabelProvider(new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    Order o = (Order) cell.getElement();
                    if (o.executionDate > 0) {
                        cell.setText(DUtils.LONG_DATE_FORMAT.format(new Date(o.executionDate)));
                    } else {
                        cell.setText("-");
                    }
                    colorizeOrder(cell, o);
                }
            });

        }
        {
            TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            tblclmnStatus = tableViewerColumn.getColumn();
            tblclmnStatus.setText("Status");
            tcl_layout.setColumnData(tblclmnStatus, new ColumnWeightData(10, true));
            tableViewerColumn.setLabelProvider(new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    Order o = (Order) cell.getElement();
                    switch (o.status) {
                    case STATUS.EXECUTED:
                        cell.setText("Executed");
                        colorizeOrder(cell, o);
                        break;
                    case STATUS.CANCELLED:
                        cell.setText("Cancelled");
                        colorizeOrder(cell, o);
                        break;
                    case STATUS.PARTIALLY_EXECUTED:
                        cell.setText("Partially executed");
                        colorizeOrder(cell, o);
                        break;
                    case STATUS.PENDING:
                        cell.setText("Pending");
                        colorizeOrder(cell, o);
                        break;
                    case STATUS.REFUSED:
                        cell.setText("Refused");
                        colorizeOrder(cell, o);
                        break;
                    default:
                        break;
                    }

                }
            });
        }
        {
            TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            tblclmnTradable = tableViewerColumn.getColumn();
            tblclmnTradable.setText("Tradable");
            tcl_layout.setColumnData(tblclmnTradable, new ColumnWeightData(20, true));
            tableViewerColumn.setLabelProvider(new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    Order o = (Order) cell.getElement();
                    cell.setText(o.asset);
                    colorizeOrder(cell, o);
                }
            });
        }
        {
            TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            tblclmnPrice = tableViewerColumn.getColumn();
            tblclmnPrice.setAlignment(SWT.RIGHT);
            tblclmnPrice.setText("Price");
            tcl_layout.setColumnData(tblclmnPrice, new ColumnWeightData(10, true));
            tableViewerColumn.setLabelProvider(new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    Order o = (Order) cell.getElement();
                    cell.setText("" + DUtils.scale(o.price, 3));
                    colorizeOrder(cell, o);
                }
            });
        }
        {
            TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            tblclmnQuantity = tableViewerColumn.getColumn();
            tblclmnQuantity.setAlignment(SWT.RIGHT);
            tblclmnQuantity.setText("Qt.");
            tcl_layout.setColumnData(tblclmnQuantity, new ColumnWeightData(5, true));
            tableViewerColumn.setLabelProvider(new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    Order o = (Order) cell.getElement();
                    int qt = o.quantity * ((o.orderType == OrderType.BUY.type()) ? 1 : -1);
                    cell.setText("" + qt);
                    colorizeOrder(cell, o);
                }
            });

        }
        {
            TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            tblclmnValue = tableViewerColumn.getColumn();
            tblclmnValue.setAlignment(SWT.RIGHT);
            tblclmnValue.setText("Value");
            tcl_layout.setColumnData(tblclmnValue, new ColumnWeightData(10, true));
            tableViewerColumn.setLabelProvider(new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    Order o = (Order) cell.getElement();
                    //double value = o.price*o.quantity*o.getAsset().getLotSize()*o.getAsset().getPointValue();
                    cell.setText(DUtils.EURO_DECIMAL_FORMAT.format(o.value));
                    colorizeOrder(cell, o);
                }
            });
        }
        {
            TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            tblclmnNotes = tableViewerColumn.getColumn();
            tcl_layout.setColumnData(tblclmnNotes, new ColumnWeightData(25, true));
            tblclmnNotes.setText("Notes");
            tableViewerColumn.setLabelProvider(new CellLabelProvider() {
                @Override
                public void update(ViewerCell cell) {
                    Order o = (Order) cell.getElement();
                    cell.setText(o.note);
                    colorizeOrder(cell, o);
                }
            });
        }

        tableViewer.setInput(orderService.getOrders());
        orderService.dispatch().subscribe(orderListener);
    }

    @Override
    public void setFocus() {
    }

    @Override
    public void dispose() {
        orderService.dispatch().unsubscribe(orderListener);
        super.dispose();
    }

    private void colorizeOrder(final ViewerCell cell, final Order order) {
        switch (order.status) {
        case STATUS.CANCELLED:
            cell.setForeground(GREY);
            cell.setBackground(getRevertColor(GREY));
            break;
        case STATUS.PARTIALLY_EXECUTED:
            cell.setForeground(MAGENTA);
            cell.setBackground(getRevertColor(MAGENTA));
            break;
        case STATUS.PENDING:
            cell.setForeground(BLUE);
            cell.setBackground(getRevertColor(BLUE));
            break;
        case STATUS.REFUSED:
            cell.setForeground(RED);
            cell.setBackground(getRevertColor(RED));
            break;
        default:
            break;
        }
    }

    public static Color getRevertColor(Color color) {
        RGB reverse = new RGB(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue());
        return SWTResourceManager.getColor(reverse);
    }

    public static class OrderTextFilter extends ViewerFilter {
        private String searchString;

        public void setSearchText(final String s) {
            // Search must be a substring of the existing value
            this.searchString = ".*" + s.toUpperCase() + ".*";
        }

        @Override
        public boolean select(Viewer viewer, Object parentElement, Object element) {
            if (searchString == null || searchString.length() == 0 || "Search".equals(searchString)) {
                return true;
            }
            Order trace = (Order) element;
            if (trace.toString().toUpperCase().matches(searchString)) {
                return true;
            }
            return false;
        }
    }
}