/*
* 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.HashMap;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
public class ChartItem {
public static final int VERTICAL_SCALE_WIDTH = 86;
public static final int HORIZONTAL_SCALE_HEIGHT = 26;
private Composite composite;
private Canvas canvas;
private Canvas verticalScaleCanvas;
private Canvas horizontalScaleCanvas;
private Image image;
private Image verticalScaleImage;
private Image horizontalScaleImage;
private Map<String, Object> dataMap = new HashMap<String, Object>();
public ChartItem(Composite parent, int style) {
composite = new Composite(parent, style);
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = gridLayout.marginHeight = 0;
gridLayout.horizontalSpacing = gridLayout.verticalSpacing = 3;
composite.setLayout(gridLayout);
canvas = new Canvas(composite, SWT.DOUBLE_BUFFERED);
canvas.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
canvas.setData(this);
canvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
verticalScaleCanvas = new Canvas(composite, SWT.DOUBLE_BUFFERED);
verticalScaleCanvas.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
verticalScaleCanvas.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, false, false));
((GridData) verticalScaleCanvas.getLayoutData()).widthHint = VERTICAL_SCALE_WIDTH;
((GridData) verticalScaleCanvas.getLayoutData()).exclude = true;
verticalScaleCanvas.setVisible(false);
verticalScaleCanvas.setData(this);
verticalScaleCanvas.addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e) {
if (verticalScaleImage != null) {
verticalScaleImage.dispose();
verticalScaleImage = null;
}
verticalScaleCanvas.redraw();
}
});
verticalScaleCanvas.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (verticalScaleImage != null) {
verticalScaleImage.dispose();
verticalScaleImage = null;
}
}
});
horizontalScaleCanvas = new Canvas(composite, SWT.DOUBLE_BUFFERED);
horizontalScaleCanvas.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
horizontalScaleCanvas.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
((GridData) horizontalScaleCanvas.getLayoutData()).heightHint = HORIZONTAL_SCALE_HEIGHT;
((GridData) horizontalScaleCanvas.getLayoutData()).exclude = true;
horizontalScaleCanvas.setVisible(false);
horizontalScaleCanvas.setData(this);
horizontalScaleCanvas.addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e) {
if (horizontalScaleImage != null) {
horizontalScaleImage.dispose();
horizontalScaleImage = null;
}
}
});
horizontalScaleCanvas.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (horizontalScaleImage != null) {
horizontalScaleImage.dispose();
horizontalScaleImage = null;
}
}
});
canvas.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (image != null) {
image.dispose();
image = null;
}
}
});
}
public void dispose() {
canvas.dispose();
}
public void setHorizontalScaleVisible(boolean visible) {
if (visible && !horizontalScaleCanvas.getVisible()) {
((GridData) horizontalScaleCanvas.getLayoutData()).exclude = false;
horizontalScaleCanvas.setVisible(true);
composite.layout();
}
if (!visible && horizontalScaleCanvas.getVisible()) {
((GridData) horizontalScaleCanvas.getLayoutData()).exclude = true;
horizontalScaleCanvas.setVisible(false);
composite.layout();
}
}
public void setVerticalScaleVisible(boolean visible) {
if (visible && !verticalScaleCanvas.getVisible()) {
((GridData) verticalScaleCanvas.getLayoutData()).exclude = false;
verticalScaleCanvas.setVisible(true);
composite.layout();
}
if (!visible && verticalScaleCanvas.getVisible()) {
((GridData) verticalScaleCanvas.getLayoutData()).exclude = true;
verticalScaleCanvas.setVisible(false);
composite.layout();
}
}
public Display getDisplay() {
return canvas.getDisplay();
}
public boolean isDisposed() {
return canvas.isDisposed();
}
public Control getControl() {
return composite;
}
public Canvas getCanvas() {
return canvas;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Canvas getVerticalScaleCanvas() {
return verticalScaleCanvas;
}
public Image getVerticalScaleImage() {
return verticalScaleImage;
}
public void setVerticalScaleImage(Image verticalScaleImage) {
this.verticalScaleImage = verticalScaleImage;
}
public Canvas getHorizontalScaleCanvas() {
return horizontalScaleCanvas;
}
public Image getHorizontalScaleImage() {
return horizontalScaleImage;
}
public void setHorizontalScaleImage(Image horizontalScaleImage) {
this.horizontalScaleImage = horizontalScaleImage;
}
public Object getData() {
return dataMap.get(null);
}
public void setData(Object data) {
dataMap.put(null, data);
}
public Object getData(String key) {
return dataMap.get(key);
}
public void setData(String key, Object data) {
dataMap.put(key, data);
}
public void redraw() {
canvas.redraw();
if (horizontalScaleCanvas != null) {
horizontalScaleCanvas.redraw();
}
if (verticalScaleCanvas != null) {
verticalScaleCanvas.redraw();
}
}
public void layout() {
composite.layout();
}
}