blob: 4b50cf50122d0309be359b6f259fbe49d6ba3128 [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,
* Sebastien Gemme
*
* SPDX-License-Identifier: EPL-1.0
*******************************************************************************/
package org.eclipse.apogy.common.topology.ui.composites;
import org.eclipse.apogy.common.emf.ApogyCommonEMFFacade;
import org.eclipse.apogy.common.emf.transaction.ApogyCommonTransactionFacade;
import org.eclipse.apogy.common.emf.transaction.impl.ApogyCommonTransactionFacadeCustomImpl;
import org.eclipse.apogy.common.emf.ui.composites.EObjectComposite;
import org.eclipse.apogy.common.emf.ui.wizards.ApogyEObjectWizard;
import org.eclipse.apogy.common.topology.ApogyCommonTopologyPackage;
import org.eclipse.apogy.common.topology.GroupNode;
import org.eclipse.apogy.common.topology.Node;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TopologyTreeComposite extends Composite {
private static final Logger Logger = LoggerFactory.getLogger(TopologyTreeComposite.class);
private Node root;
private final EObjectComposite eObjectComposite;
private Button btnNew;
private Button btnDelete;
private boolean editingEnabled = true;
public TopologyTreeComposite(Composite parent, int style, boolean editingEnabled) {
super(parent, style);
this.editingEnabled = editingEnabled;
setLayout(new GridLayout(2, false));
this.eObjectComposite = new EObjectComposite(this, SWT.None) {
@Override
protected void newSelection(ISelection selection) {
checkEnableNewButton(getSelectedEObject());
if (getSelectedEObject() instanceof Node) {
TopologyTreeComposite.this.newSelection(getSelectedNode());
}
}
};
this.eObjectComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));
if (editingEnabled) {
// Buttons.
Composite composite = new Composite(this, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
composite.setLayout(new GridLayout(1, false));
this.btnNew = new Button(composite, SWT.NONE);
this.btnNew.setSize(74, 29);
this.btnNew.setText("New");
this.btnNew.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
this.btnNew.setEnabled(false);
this.btnNew.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
if (event.type == SWT.Selection) {
Node parent = getSelectedNode();
if (parent != null) {
ApogyEObjectWizard wizard = new ApogyEObjectWizard(
ApogyCommonTopologyPackage.Literals.GROUP_NODE__CHILDREN, parent, null,
ApogyCommonTopologyPackage.Literals.NODE);
WizardDialog dialog = new WizardDialog(getShell(), wizard);
dialog.open();
EObject createdEObject = wizard.getCreatedEObject();
if (createdEObject != null) {
TopologyTreeComposite.this.eObjectComposite.setSelectedEObject(createdEObject);
}
}
}
}
});
this.btnDelete = new Button(composite, SWT.NONE);
this.btnDelete.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
this.btnDelete.setSize(74, 29);
this.btnDelete.setText("Delete");
this.btnDelete.setEnabled(false);
this.btnDelete.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
Node node = getSelectedNode();
if (node != null) {
GroupNode parent = (GroupNode) node.getParent();
if (ApogyCommonTransactionFacade.INSTANCE.areEditingDomainsValid(node.eContainer(),
ApogyCommonTopologyPackage.Literals.GROUP_NODE__CHILDREN, node,
false) == ApogyCommonTransactionFacadeCustomImpl.EXECUTE_COMMAND_ON_OWNER_DOMAIN) {
try {
ApogyCommonTransactionFacade.INSTANCE.basicRemove(node.eContainer(),
ApogyCommonTopologyPackage.Literals.GROUP_NODE__CHILDREN, node);
} catch (Exception e) {
Logger.error("Unable to delete the Node <" + node.getNodeId() + ">.", e);
}
} else {
try {
ApogyCommonTransactionFacade.INSTANCE.basicRemove(node.eContainer(),
ApogyCommonTopologyPackage.Literals.GROUP_NODE__CHILDREN, node, true);
} catch (Exception e) {
Logger.error("Unable to delete the Node <" + node.getNodeId() + ">.", e);
}
}
// Have the viewer select the parent of the deleted object.
TopologyTreeComposite.this.eObjectComposite.setSelectedEObject(parent);
}
// Forces the viewer to update.
TopologyTreeComposite.this.eObjectComposite.setEObject(getRoot());
}
});
}
}
public Node getRoot() {
return this.root;
}
public void setRoot(Node root) {
this.root = root;
if (this.eObjectComposite != null && !this.eObjectComposite.isDisposed()) {
this.eObjectComposite.setEObject(root);
}
}
public void selectNode(Node selectedNode) {
if (this.eObjectComposite != null && !this.eObjectComposite.isDisposed()) {
this.eObjectComposite.setSelectedEObject(selectedNode);
}
newSelection(selectedNode);
}
public Node getSelectedNode() {
if (this.eObjectComposite.getSelectedEObject() instanceof Node) {
return (Node) this.eObjectComposite.getSelectedEObject();
} else {
return null;
}
}
protected void newSelection(Node selectedNode) {
}
private void checkEnableNewButton(EObject eObject) {
if (this.editingEnabled) {
if (eObject != null) {
if (eObject instanceof GroupNode) {
this.btnNew.setEnabled(!ApogyCommonEMFFacade.INSTANCE.getSettableEReferences(eObject).isEmpty());
}
this.btnDelete.setEnabled(true);
} else {
this.btnNew.setEnabled(false);
this.btnDelete.setEnabled(false);
}
}
}
}