]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/canvas/impl/MouseCaptureContext.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / canvas / impl / MouseCaptureContext.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.g2d.canvas.impl;
13
14 import java.lang.reflect.Method;
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.Map;
18 import java.util.Set;
19
20 import org.simantics.g2d.canvas.IMouseCaptureContext;
21 import org.simantics.g2d.canvas.IMouseCaptureHandle;
22 import org.simantics.g2d.canvas.IMouseCaptureHandleListener;
23 import org.simantics.g2d.canvas.IMouseCaptureListener;
24 import org.simantics.utils.threads.IThreadWorkQueue;
25 import org.simantics.utils.threads.SyncListenerList;
26
27 /**
28  * @author Toni Kalajainen
29  */
30 public class MouseCaptureContext implements IMouseCaptureContext {
31
32     protected Map<Integer, Set<IMouseCaptureHandle>> mouseCapture = 
33         new HashMap<Integer, Set<IMouseCaptureHandle>>();
34     
35     protected SyncListenerList<IMouseCaptureListener> mouseCaptureListeners =
36         new SyncListenerList<IMouseCaptureListener>(IMouseCaptureListener.class);
37     
38     public void addMouseCaptureListener(IMouseCaptureListener listener) {
39         mouseCaptureListeners.add(listener);
40     }
41     public void addMouseCaptureListener(IMouseCaptureListener listener, IThreadWorkQueue thread) {
42         mouseCaptureListeners.add(thread, listener);
43     }    
44     public void removeMouseCaptureListener(IMouseCaptureListener listener) {
45         mouseCaptureListeners.remove(listener);
46     }
47     public void removeMouseCaptureListener(IMouseCaptureListener listener, IThreadWorkQueue thread) {
48         mouseCaptureListeners.remove(thread, listener);
49     }
50     
51     private final static Method onMouseCaptured = SyncListenerList.getMethod(IMouseCaptureListener.class, "onMouseCaptured");
52     private final static Method onMouseReleased = SyncListenerList.getMethod(IMouseCaptureListener.class, "onMouseReleased");
53     protected void fireMouseCaptured(int mouseId) {
54         mouseCaptureListeners.fireEventSync(onMouseCaptured, this, mouseId);
55     }
56     protected void fireAsyncMouseCaptured(int mouseId) {
57         mouseCaptureListeners.fireEventAsync(onMouseCaptured, this, mouseId);
58     }
59     protected void fireMouseReleased(int mouseId) {
60         mouseCaptureListeners.fireEventSync(onMouseReleased, this, mouseId);
61     }
62     protected void fireAsyncMouseReleased(int mouseId) {
63         mouseCaptureListeners.fireEventAsync(onMouseReleased, this, mouseId);
64     }
65     
66     public synchronized IMouseCaptureHandle captureMouse(int mouseId) {
67         Set<IMouseCaptureHandle> captures = mouseCapture.get(mouseId);
68         IMouseCaptureHandle capture = new MouseCaptureHandle(mouseId);
69         capture.addMouseCaptureHandleListener(new IMouseCaptureHandleListener() {
70             @Override
71             public void onCaptureReleased(IMouseCaptureHandle sender) {
72                 synchronized(MouseCaptureContext.this)
73                 {
74                     Set<IMouseCaptureHandle> captures = mouseCapture.get(sender.mouseId());
75                     if (!captures.contains(this)) return;
76                     captures.remove(this);
77                     if (captures.isEmpty()) {
78                         mouseCapture.remove(captures);
79                         fireMouseReleased(sender.mouseId());
80                     }
81                 }
82             }});
83         if (captures==null) {
84             captures = new HashSet<IMouseCaptureHandle>();
85             mouseCapture.put(mouseId, captures);
86             fireMouseCaptured(mouseId);
87         }
88         captures.add(capture);
89         return capture;
90     }
91
92     
93
94 }