blob: c1219b14c882c1adca38a7d5e8fd84ad61e957e6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency.
* 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:
* Pierre Allard - initial API and implementation
* Regent L'Archeveque
* SPDX-License-Identifier: EPL-1.0
*******************************************************************************/
package org.eclipse.apogy.addons;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.apogy.common.emf.transaction.ApogyCommonTransactionFacade;
import org.eclipse.apogy.common.topology.Node;
import org.eclipse.apogy.common.topology.ui.NodeSelection;
import org.eclipse.apogy.common.topology.ui.viewer.ApogyCommonTopologyUIViewerPackage;
import org.eclipse.apogy.common.topology.ui.viewer.MouseButton;
import org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry;
import org.eclipse.apogy.core.ApogyTopology;
import org.eclipse.apogy.core.invocator.ApogyCoreInvocatorFacade;
import org.eclipse.apogy.core.invocator.InvocatorSession;
import org.eclipse.apogy.core.topology.ApogyCoreTopologyFacade;
import org.eclipse.apogy.core.topology.ApogyCoreTopologyPackage;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TopologyViewerListenerManager {
private static final Logger Logger = LoggerFactory.getLogger(TopologyViewerListenerManager.class);
private Adapter topologyViewerRegistryAdapter = null;
private Adapter sessionAdapter = null;
private final TopologyViewerRegistry topologyViewerRegistry;
private Node currentRootNode = null;
private final List<Simple3DTool> simple3DTools = new ArrayList<Simple3DTool>();
public TopologyViewerListenerManager(TopologyViewerRegistry topologyViewerRegistry) {
this.topologyViewerRegistry = topologyViewerRegistry;
topologyViewerRegistry.eAdapters().add(getTopologyViewerRegistryAdapter());
// Register to the Apogy Topology.
ApogyCoreTopologyFacade.INSTANCE.eAdapters().add(getApogyTopologyAdapter());
// Initialize the root node.
setAllSimple3DToolRootNode(resolveRootNode());
}
public void dispose() {
if (this.topologyViewerRegistry != null) {
this.topologyViewerRegistry.eAdapters().remove(getTopologyViewerRegistryAdapter());
}
}
public void registerSimple3DTool(Simple3DTool tool) {
if (!this.simple3DTools.contains(tool))
this.simple3DTools.add(tool);
try {
// Set the tool root Node in a Transaction friendly way.
ApogyCommonTransactionFacade.INSTANCE.basicSet(tool, ApogyAddonsPackage.Literals.SIMPLE3_DTOOL__ROOT_NODE,
this.currentRootNode);
} catch (Throwable t) {
Logger.error(t.getMessage(), t);
}
}
public void unRegisterSimple3DTool(Simple3DTool tool) {
this.simple3DTools.remove(tool);
}
public void setAllSimple3DToolRootNode(Node root) {
Logger.info("Updating Simple3DTool Root Node to <" + root + ">.");
this.currentRootNode = root;
if (this.currentRootNode != null) {
for (Simple3DTool tool : this.simple3DTools) {
try {
// Set the tool root Node in a Transaction friendly way.
ApogyCommonTransactionFacade.INSTANCE.basicSet(tool,
ApogyAddonsPackage.Literals.SIMPLE3_DTOOL__ROOT_NODE, this.currentRootNode);
} catch (Throwable t) {
Logger.error(t.getMessage(), t);
}
}
}
}
protected Node resolveRootNode() {
Node root = null;
InvocatorSession invocatorSession = ApogyCoreInvocatorFacade.INSTANCE.getActiveInvocatorSession();
if (invocatorSession != null) {
if (ApogyCoreTopologyFacade.INSTANCE.getApogyTopology() != null) {
root = ApogyCoreTopologyFacade.INSTANCE.getApogyTopology().getRootNode();
}
}
return root;
}
protected void notifyAllSimple3DTool(final NodeSelection nodeSelection) {
for (Simple3DTool tool : this.simple3DTools) {
try {
if (tool.isActive()) {
tool.selectionChanged(nodeSelection);
}
} catch (Throwable t) {
Logger.error(t.getMessage(), t);
}
}
}
protected void notifyAllSimple3DTool(MouseButton mouseButtonClicked) {
for (Simple3DTool tool : this.simple3DTools) {
try {
if (tool.isActive()) {
tool.mouseButtonClicked(mouseButtonClicked);
}
} catch (Throwable t) {
Logger.error(t.getMessage(), t);
}
}
}
protected Adapter getTopologyViewerRegistryAdapter() {
if (this.topologyViewerRegistryAdapter == null) {
this.topologyViewerRegistryAdapter = new AdapterImpl() {
@Override
public void notifyChanged(Notification msg) {
if (msg.getNotifier() instanceof TopologyViewerRegistry) {
int featureId = msg.getFeatureID(TopologyViewerRegistry.class);
switch (featureId) {
case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LATEST_NODE_SELECTION:
if (msg.getNewValue() instanceof NodeSelection) {
NodeSelection nodeSelection = (NodeSelection) msg.getNewValue();
notifyAllSimple3DTool(nodeSelection);
}
break;
case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED:
if (msg.getNewValue() instanceof MouseButton) {
MouseButton mouseButton = (MouseButton) msg.getNewValue();
notifyAllSimple3DTool(mouseButton);
}
break;
default:
break;
}
}
}
};
}
return this.topologyViewerRegistryAdapter;
}
private Adapter getApogyTopologyAdapter() {
if (this.sessionAdapter == null) {
this.sessionAdapter = new ApogyTopologyAdapter();
}
return this.sessionAdapter;
}
private class ApogyTopologyAdapter extends AdapterImpl {
@Override
public void notifyChanged(Notification msg) {
if (msg.getNotifier() instanceof ApogyCoreTopologyFacade) {
int featureId = msg.getFeatureID(ApogyCoreTopologyFacade.class);
switch (featureId) {
case ApogyCoreTopologyPackage.APOGY_CORE_TOPOLOGY_FACADE__APOGY_TOPOLOGY: {
ApogyTopology newApogyTopology = (ApogyTopology) msg.getNewValue();
if (newApogyTopology != null) {
setAllSimple3DToolRootNode(newApogyTopology.getRootNode());
} else {
setAllSimple3DToolRootNode(null);
}
}
break;
default:
break;
}
}
}
}
}