Java tutorial
/* * 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; } } }