/* * 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.ArrayList; import java.util.List; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.MouseTrackListener; import org.eclipse.swt.graphics.Point; public class SummaryBarDecorator implements MouseListener, MouseMoveListener, MouseTrackListener, DisposeListener { private Point location; private boolean mouseDown; private List<ChartCanvas> decoratedCanvas = new ArrayList<ChartCanvas>(); private IChartObjectVisitor summaryLabelVisitor = new IChartObjectVisitor() { @Override public boolean visit(IChartObject object) { ISummaryBarDecorator factory = null; if (object instanceof IAdaptable) { factory = (ISummaryBarDecorator) ((IAdaptable) object).getAdapter(ISummaryBarDecorator.class); if (factory != null) { factory.updateDecorator(location != null ? location.x : SWT.DEFAULT, SWT.DEFAULT); } } return true; } }; public SummaryBarDecorator() { } public void decorateCanvas(ChartCanvas canvas) { canvas.getCanvas().addMouseListener(this); canvas.getCanvas().addMouseMoveListener(this); canvas.getCanvas().addMouseTrackListener(this); canvas.getCanvas().addDisposeListener(this); decoratedCanvas.add(canvas); } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent) */ @Override public void mouseDoubleClick(MouseEvent e) { } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent) */ @Override public void mouseDown(MouseEvent e) { if (e.button != 1) { return; } if (!mouseDown) { location = new Point(e.x, e.y); updateLabel(); mouseDown = true; } } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent) */ @Override public void mouseUp(MouseEvent e) { if (e.button != 1) { return; } if (mouseDown) { location = null; updateLabel(); mouseDown = false; } } private void updateLabel() { for (ChartCanvas canvas : decoratedCanvas) { canvas.accept(summaryLabelVisitor); } } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseTrackListener#mouseEnter(org.eclipse.swt.events.MouseEvent) */ @Override public void mouseEnter(MouseEvent e) { if (mouseDown) { location = new Point(e.x, e.y); updateLabel(); } } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseTrackListener#mouseExit(org.eclipse.swt.events.MouseEvent) */ @Override public void mouseExit(MouseEvent e) { if (location != null) { location = null; } } /* (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.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent) */ @Override public void mouseMove(MouseEvent e) { if (mouseDown) { location = new Point(e.x, e.y); updateLabel(); } } /* (non-Javadoc) * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent) */ @Override public void widgetDisposed(DisposeEvent e) { for (ChartCanvas canvas : decoratedCanvas) { if (canvas.getCanvas() == e.widget) { decoratedCanvas.remove(canvas); break; } } } }