summaryrefslogtreecommitdiff
path: root/java/src/org/singinst/uf/presenter/ProxyCanvas.java
blob: 459930deca1a878dcd912a4400531a8b0d9df303 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package org.singinst.uf.presenter;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import org.singinst.uf.math.SimplePoint;

abstract class ProxyCanvas implements GraphCanvas, MouseDragListener, MouseClickListener {
	private final GraphCanvas underlyingCanvas;
	private final Set<MouseDragListener> dragListeners = new HashSet<MouseDragListener>();
	private final Set<MouseClickListener> clickListeners = new HashSet<MouseClickListener>();
	private MouseDragListener selectedDragListener;

	ProxyCanvas(GraphCanvas underlyingCanvas) {
		this.underlyingCanvas = underlyingCanvas;
	}

	public void clear() {
		getUnderlyingCanvas().clear();
	}

	public void drawDecorationPoint(SimplePoint point) {
		getUnderlyingCanvas().drawDecorationPoint(toUnderlyingCanvas(point));
	}

	private SimplePoint toUnderlyingCanvas(SimplePoint point) {
		return proxyToUnderlyingCanvas().apply(point);
	}

	private SimplePoint fromUnderlyingCanvas(SimplePoint point) {
		return proxyToUnderlyingCanvas().invert(point);
	}

	abstract GraphTransform proxyToUnderlyingCanvas();

	public void drawLine(SimpleLine line) {
		getUnderlyingCanvas().drawLine(new SimpleLine(toUnderlyingCanvas(line.p1), toUnderlyingCanvas(line.p2)));
	}

	public void drawCurve(List<SimplePoint> points) {
		List<SimplePoint> underlyingCanvasPoints = new ArrayList<SimplePoint>();
		for (SimplePoint point : points) {
			underlyingCanvasPoints.add(toUnderlyingCanvas(point));
		}
		getUnderlyingCanvas().drawCurve(underlyingCanvasPoints);
	}

	public void addMouseDragListener(final MouseDragListener listener) {
		dragListeners.add(listener);
		getUnderlyingCanvas().addMouseDragListener(this);
	}

	public void addMouseClickListener(final MouseClickListener listener) {
		clickListeners.add(listener);
		getUnderlyingCanvas().addMouseClickListener(this);
	}
	
	public void mouseClick(SimplePoint point) {
		SimplePoint ourPoint = fromUnderlyingCanvas(point);
		for (MouseClickListener listener : clickListeners) {
			listener.mouseClick(ourPoint);
		}
	}

	public void dragTo(SimplePoint point) {
		SimplePoint ourPoint = fromUnderlyingCanvas(point);
		selectedDragListener.dragTo(ourPoint);
	}

	public int mouseDown(SimplePoint point) {
		SimplePoint ourPoint = fromUnderlyingCanvas(point);
		
		SortedMap<Integer, MouseDragListener> listenersByPriority = new TreeMap<Integer, MouseDragListener>();
		for (MouseDragListener listener : dragListeners) {
			 listenersByPriority.put(listener.mouseDown(ourPoint), listener);
		}
		int maxPriority = listenersByPriority.lastKey();
		if (maxPriority > 0) {
			selectedDragListener = listenersByPriority.get(maxPriority);
		}
		return maxPriority;
	}
	
	

	public void invalidate() {
		underlyingCanvas.invalidate();
	}
	
	

	public void pushStyle(SimpleStyle style) {
		underlyingCanvas.pushStyle(style);
	}
	
	

	public void popStyle() {
		underlyingCanvas.popStyle();
	}

	public GraphCanvas getUnderlyingCanvas() {
		return underlyingCanvas;
	}

	public void write(SimplePoint point, CanvasString canvasString) {
		underlyingCanvas.write(toUnderlyingCanvas(point), canvasString);
	}
	
	
}