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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.participant;
\r
14 import java.awt.event.FocusEvent;
\r
15 import java.awt.event.FocusListener;
\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
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
28 * This participant depends on the {@link ContextUtil} canvas participant.
\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
38 * @author Tuukka Lehtonen
\r
39 * @author Teemu Lempinen
\r
41 public class SGFocusParticipant extends AbstractCanvasParticipant implements FocusListener {
\r
44 ContextUtil contextUtil;
\r
47 org.simantics.diagram.participant.e4.ContextUtil e4ContextUtil;
\r
49 final SWTChassis chassis;
\r
51 ContextState originalContextState;
\r
53 public SGFocusParticipant(SWTChassis chassis, String contextId) {
\r
55 this.chassis = chassis;
\r
56 this.contextId = contextId;
\r
60 public void addedToContext(ICanvasContext ctx) {
\r
61 super.addedToContext(ctx);
\r
62 chassis.getAWTComponent().addFocusListener(this);
\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
72 super.removedFromContext(ctx);
\r
76 public void focusGained(FocusEvent e) {
\r
77 ContextUtil util = contextUtil;
\r
79 DiagramCommandBindings.activateBindings(util, contextId);
\r
81 org.simantics.diagram.participant.e4.ContextUtil e4Util = e4ContextUtil;
\r
82 if (e4Util != null) {
\r
83 DiagramCommandBindings.activateBindings(e4Util, contextId);
\r
89 public void focusLost(FocusEvent e) {
\r
90 ContextUtil util = contextUtil;
\r
92 DiagramCommandBindings.deactivateBindings(util, contextId);
\r
94 org.simantics.diagram.participant.e4.ContextUtil e4Util = e4ContextUtil;
\r
95 if (e4Util != null) {
\r
96 DiagramCommandBindings.deactivateBindings(e4Util, contextId);
\r