/*
* Copyright (c) 2004-2011 Marco Maccaferri and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.ui.internal.views;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.IParameter;
import org.eclipse.core.commands.Parameterization;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipsetrader.core.feed.IBookEntry;
import org.eclipsetrader.core.trading.IOrderSide;
import org.eclipsetrader.ui.internal.UIActivator;
public class Level2QuickTradeDecorator implements MouseTrackListener, MouseMoveListener, SelectionListener {
Table table;
ICommandService commandService;
IHandlerService handlerService;
Cursor buyCursor;
Cursor sellCursor;
boolean entered;
public Level2QuickTradeDecorator(Table table, ICommandService commandService, IHandlerService handlerService) {
this.table = table;
this.commandService = commandService;
this.handlerService = handlerService;
initializeCursors();
table.addMouseTrackListener(this);
table.addMouseMoveListener(this);
table.addSelectionListener(this);
table.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
buyCursor.dispose();
sellCursor.dispose();
}
});
}
void initializeCursors() {
ImageDescriptor sourceDescriptor = UIActivator.getImageDescriptor("icons/pointers/buysell-source.bmp");
ImageDescriptor buyMaskDescriptor = UIActivator.getImageDescriptor("icons/pointers/buy-mask.bmp");
ImageDescriptor sellMaskDescriptor = UIActivator.getImageDescriptor("icons/pointers/sell-mask.bmp");
buyCursor = new Cursor(Display.getCurrent(), sourceDescriptor.getImageData(), buyMaskDescriptor.getImageData(), 15, 7);
sellCursor = new Cursor(Display.getCurrent(), sourceDescriptor.getImageData(), sellMaskDescriptor.getImageData(), 15, 7);
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseTrackListener#mouseEnter(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseEnter(MouseEvent e) {
entered = true;
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseMove(MouseEvent e) {
int x = 0;
if (!entered) {
return;
}
if (table.getItem(new Point(e.x, e.y)) == null) {
table.setCursor(null);
return;
}
TableColumn[] column = table.getColumns();
int i = 0;
for (; i < column.length / 2; i++) {
if (e.x >= x && e.x <= x + column[i].getWidth()) {
if (table.getCursor() != buyCursor) {
table.setCursor(buyCursor);
}
return;
}
x += column[i].getWidth();
}
for (; i < column.length; i++) {
if (e.x >= x && e.x <= x + column[i].getWidth()) {
if (table.getCursor() != sellCursor) {
table.setCursor(sellCursor);
}
return;
}
x += column[i].getWidth();
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseTrackListener#mouseExit(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseExit(MouseEvent e) {
if (entered) {
table.setCursor(null);
}
entered = false;
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseTrackListener#mouseHover(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseHover(MouseEvent e) {
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
IBookEntry entry = null;
IOrderSide orderSide = null;
if (table.getCursor() == buyCursor) {
entry = (IBookEntry) e.item.getData("bid");
orderSide = IOrderSide.Buy;
}
else if (table.getCursor() == sellCursor) {
entry = (IBookEntry) e.item.getData("ask");
orderSide = IOrderSide.Sell;
}
if (entry == null) {
return;
}
Command tradeCommand = commandService.getCommand("org.eclipsetrader.ui.file.trade");
if (tradeCommand != null) {
try {
IParameter limitPrice = tradeCommand.getParameter("limitPrice");
IParameter side = tradeCommand.getParameter("side");
ParameterizedCommand parmCommand = new ParameterizedCommand(tradeCommand, new Parameterization[] {
new Parameterization(limitPrice, Double.toString(entry.getPrice())),
new Parameterization(side, orderSide.getId())
});
handlerService.executeCommand(parmCommand, null);
} catch (Exception e1) {
UIActivator.log("Error executing org.eclipsetrader.ui.file.trade command", e1);
}
}
}
}