blob: 2925d90137db79f9abd3b2fb894bdddfcf5fbad1 [file] [log] [blame]
package ca.gc.asc_csa.apogy.addons;
/*
* Copyright (c) 2016 Canadian Space Agency (CSA) / Agence spatiale canadienne (ASC).
* 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 (Pierre.Allard@canada.ca),
* Regent L'Archeveque (Regent.Larcheveque@canada.ca),
* Sebastien Gemme (Sebastien.Gemme@canada.ca),
* Canadian Space Agency (CSA) - Initial API and implementation
*/
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import ca.gc.asc_csa.apogy.common.log.EventSeverity;
import ca.gc.asc_csa.apogy.common.log.Logger;
import ca.gc.asc_csa.apogy.common.topology.Node;
import ca.gc.asc_csa.apogy.common.topology.ui.NodeSelection;
import ca.gc.asc_csa.apogy.common.topology.ui.viewer.ApogyCommonTopologyUIViewerPackage;
import ca.gc.asc_csa.apogy.common.topology.ui.viewer.MouseButton;
import ca.gc.asc_csa.apogy.common.topology.ui.viewer.TopologyViewerRegistry;
import ca.gc.asc_csa.apogy.common.transaction.ApogyCommonTransactionFacade;
import ca.gc.asc_csa.apogy.core.ApogyTopology;
import ca.gc.asc_csa.apogy.core.invocator.ApogyCoreInvocatorFacade;
import ca.gc.asc_csa.apogy.core.invocator.InvocatorSession;
import ca.gc.asc_csa.apogy.core.topology.ApogyCoreTopologyFacade;
import ca.gc.asc_csa.apogy.core.topology.ApogyCoreTopologyPackage;
public class TopologyViewerListenerManager
{
private Adapter topologyViewerRegistryAdapter = null;
private Adapter sessionAdapter = null;
private TopologyViewerRegistry topologyViewerRegistry;
private Node currentRootNode = null;
private 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(topologyViewerRegistry != null)
{
topologyViewerRegistry.eAdapters().remove(getTopologyViewerRegistryAdapter());
}
}
public void registerSimple3DTool(Simple3DTool tool)
{
if(!simple3DTools.contains(tool)) simple3DTools.add(tool);
try
{
// Set the tool root Node in a Transaction friendly way.
ApogyCommonTransactionFacade.INSTANCE.basicSet(tool, ApogyAddonsPackage.Literals.SIMPLE3_DTOOL__ROOT_NODE, currentRootNode);
}
catch(Throwable t)
{
t.printStackTrace();
}
}
public void unRegisterSimple3DTool(Simple3DTool tool)
{
simple3DTools.remove(tool);
}
public void setAllSimple3DToolRootNode(Node root)
{
Logger.INSTANCE.log(Activator.ID, this, "Updating Simple3DTool Root Node to <" + root + ">...", EventSeverity.INFO);
currentRootNode = root;
if(currentRootNode != null)
{
for(Simple3DTool tool : simple3DTools)
{
try
{
// Set the tool root Node in a Transaction friendly way.
ApogyCommonTransactionFacade.INSTANCE.basicSet(tool, ApogyAddonsPackage.Literals.SIMPLE3_DTOOL__ROOT_NODE, currentRootNode);
}
catch(Throwable t)
{
t.printStackTrace();
}
}
}
}
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 : simple3DTools)
{
try
{
if(tool.isActive())
{
tool.selectionChanged(nodeSelection);
}
}
catch(Throwable t)
{
t.printStackTrace();
}
}
}
protected void notifyAllSimple3DTool(MouseButton mouseButtonClicked)
{
for(Simple3DTool tool : simple3DTools)
{
try
{
if(tool.isActive())
{
tool.mouseButtonClicked(mouseButtonClicked);
}
}
catch(Throwable t)
{
t.printStackTrace();
}
}
}
protected Adapter getTopologyViewerRegistryAdapter()
{
if(topologyViewerRegistryAdapter == null)
{
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 topologyViewerRegistryAdapter;
}
private Adapter getApogyTopologyAdapter()
{
if(sessionAdapter == null)
{
sessionAdapter = new ApogyTopologyAdapter();
}
return 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;
}
}
}
}
}