]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/participant/SGFocusParticipant.java
Merge commit 'bd5bc6e45f700e755b61bd112631796631330ecb'
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / participant / SGFocusParticipant.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2013 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.participant;\r
13 \r
14 import java.awt.event.FocusEvent;\r
15 import java.awt.event.FocusListener;\r
16 \r
17 import org.simantics.g2d.canvas.ICanvasContext;\r
18 import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;\r
19 import org.simantics.g2d.canvas.impl.DependencyReflection.Reference;\r
20 import org.simantics.g2d.chassis.AWTChassis;\r
21 import org.simantics.g2d.chassis.SWTChassis;\r
22 \r
23 /**\r
24  * The purpose of this participant is to properly handle contexts in Eclipse/SWT\r
25  * based deployments G2D canvases where it is possible that Eclipse eats input\r
26  * events based on UI contexts, key bindings, etc.\r
27  * \r
28  * This participant depends on the {@link ContextUtil} canvas participant.\r
29  * \r
30  * When some other scene graph component or UI Part, besides the root pane, gets focus,\r
31  * this participant will deactivate its {@link #contextId}. When the root pane gets the \r
32  * focus back, it will restore {@link #contextId} to allow Eclipse key bindings\r
33  * for that {@link #contextId} to work properly. \r
34  * \r
35  * @see ContextUtil\r
36  * \r
37  * @author J-P Laine\r
38  * @author Tuukka Lehtonen\r
39  * @author Teemu Lempinen\r
40  */\r
41 public class SGFocusParticipant extends AbstractCanvasParticipant implements FocusListener {\r
42 \r
43     @Reference\r
44     ContextUtil                 contextUtil;\r
45     \r
46     @Reference\r
47     org.simantics.diagram.participant.e4.ContextUtil e4ContextUtil;\r
48 \r
49     final SWTChassis            chassis;\r
50     String                      contextId;\r
51     ContextState                originalContextState;\r
52 \r
53     public SGFocusParticipant(SWTChassis chassis, String contextId) {\r
54         super();\r
55         this.chassis = chassis;\r
56         this.contextId = contextId;\r
57     }\r
58 \r
59     @Override\r
60     public void addedToContext(ICanvasContext ctx) {\r
61         super.addedToContext(ctx);\r
62         chassis.getAWTComponent().addFocusListener(this);\r
63     }\r
64 \r
65     @Override\r
66     public void removedFromContext(ICanvasContext ctx) {\r
67         if (!chassis.isDisposed()) {\r
68             AWTChassis component = chassis.getAWTComponent();\r
69             if (component != null)\r
70                 component.removeFocusListener(this);\r
71         }\r
72         super.removedFromContext(ctx);\r
73     }\r
74 \r
75     @Override\r
76     public void focusGained(FocusEvent e) {\r
77         ContextUtil util = contextUtil;\r
78         if (util != null) {\r
79             DiagramCommandBindings.activateBindings(util, contextId);\r
80         } else {\r
81             org.simantics.diagram.participant.e4.ContextUtil e4Util = e4ContextUtil;\r
82             if (e4Util != null) {\r
83                 DiagramCommandBindings.activateBindings(e4Util, contextId);\r
84             }\r
85         }\r
86     }\r
87 \r
88     @Override\r
89     public void focusLost(FocusEvent e) {\r
90         ContextUtil util = contextUtil;\r
91         if (util != null) {\r
92             DiagramCommandBindings.deactivateBindings(util, contextId);\r
93         } else {\r
94             org.simantics.diagram.participant.e4.ContextUtil e4Util = e4ContextUtil;\r
95             if (e4Util != null) {\r
96                 DiagramCommandBindings.deactivateBindings(e4Util, contextId);\r
97             }\r
98         }\r
99     }\r
100 \r
101 }