/*
* 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.charts;
import java.util.Date;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
public class ChartToolEditor {
private BaseChartViewer viewer;
private ChartCanvas chartCanvas;
private Graphics graphics;
private IEditableChartObject object;
private ListenerList listeners = new ListenerList(ListenerList.IDENTITY);
public static class ChartObjectEditorEvent {
public int x;
public int y;
public Date date;
public Number value;
public int button;
public int count;
public Display display;
public ChartCanvas chartCanvas;
public Canvas canvas;
public IGraphics graphics;
}
private MouseListener mouseListener = new MouseListener() {
@Override
public void mouseDoubleClick(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
handleMouseDown(createEvent(e));
}
@Override
public void mouseUp(MouseEvent e) {
handleMouseUp(createEvent(e));
}
};
private MouseMoveListener mouseMoveListener = new MouseMoveListener() {
@Override
public void mouseMove(MouseEvent e) {
handleMouseMove(createEvent(e));
}
};
public ChartToolEditor() {
}
public void activate(BaseChartViewer viewer, ChartCanvas chartCanvas, IEditableChartObject object) {
if (this.chartCanvas != null) {
deactivate();
}
this.viewer = viewer;
this.chartCanvas = chartCanvas;
this.object = object;
this.graphics = new Graphics(chartCanvas.getCanvas(), viewer.getLocation(), viewer.datesAxis, chartCanvas.getVerticalAxis());
chartCanvas.getCanvas().addMouseListener(mouseListener);
chartCanvas.getCanvas().addMouseMoveListener(mouseMoveListener);
}
public boolean isActive() {
return this.object != null;
}
public void cancelEditing() {
if (this.object != null) {
Object[] l = listeners.getListeners();
for (int i = 0; i < l.length; i++) {
try {
((IChartEditorListener) l[i]).cancelEditor();
} catch (Throwable e) {
e.printStackTrace();
}
}
deactivate();
}
}
public void applyEditing() {
if (this.object != null) {
Object[] l = listeners.getListeners();
for (int i = 0; i < l.length; i++) {
try {
((IChartEditorListener) l[i]).applyEditorValue();
} catch (Throwable e) {
e.printStackTrace();
}
}
deactivate();
}
}
private void deactivate() {
if (this.object != null) {
if (this.chartCanvas != null) {
chartCanvas.getCanvas().removeMouseListener(mouseListener);
chartCanvas.getCanvas().removeMouseMoveListener(mouseMoveListener);
this.chartCanvas = null;
}
if (this.graphics != null) {
this.graphics.dispose();
this.graphics = null;
}
this.object = null;
}
}
protected void handleMouseDown(ChartObjectEditorEvent e) {
if (object != null) {
object.handleMouseDown(e);
chartCanvas.getCanvas().setData(BaseChartViewer.K_NEEDS_REDRAW, Boolean.TRUE);
}
}
protected void handleMouseUp(ChartObjectEditorEvent e) {
if (object != null) {
object.handleMouseUp(e);
applyEditing();
viewer.deactivateEditor();
}
}
protected void handleMouseMove(ChartObjectEditorEvent e) {
if (object != null) {
object.handleMouseMove(e);
}
}
public ChartCanvas getChartCanvas() {
return chartCanvas;
}
public IEditableChartObject getObject() {
return object;
}
protected ChartObjectEditorEvent createEvent(MouseEvent e) {
ChartObjectEditorEvent event = new ChartObjectEditorEvent();
event.x = e.x;
event.y = e.y;
event.date = (Date) viewer.datesAxis.mapToValue(e.x + viewer.getLocation().x);
event.value = (Number) chartCanvas.getVerticalAxis().mapToValue(e.y);
event.button = e.button;
event.count = e.count;
event.display = e.display;
event.chartCanvas = chartCanvas;
event.canvas = chartCanvas.getCanvas();
event.graphics = graphics;
return event;
}
/**
* Adds a listener to this chart editor.
* Has no effect if an identical listener is already registered.
*
* @param listener a chart editor listener
*/
public void addListener(IChartEditorListener listener) {
listeners.add(listener);
}
/**
* Removes the given listener from this chart editor.
* Has no affect if an identical listener is not registered.
*
* @param listener a chart editor listener
*/
public void removeListener(IChartEditorListener listener) {
listeners.remove(listener);
}
}