blob: c08f3e6106805471600abcd088f02f90414e2b0b [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2019 CEA LIST.
*
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Xavier Le Pallec (for CEA LIST) xlepallec@lilo.org - Bug 558456
*
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.clazz.lf.autosizeableclasses.adapters.notation;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.gmf.runtime.notation.BasicCompartment;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.infra.gmfdiag.css.CSSShapeImpl;
import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.AbstractPackageableElementCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ClassAttributeCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ClassAttributeCompartmentEditPartCN;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ClassEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ClassEditPartCN;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ClassNestedClassifierCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ClassNestedClassifierCompartmentEditPartCN;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ClassOperationCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ClassOperationCompartmentEditPartCN;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ModelEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.NestedClassForClassEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.OperationForClassEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.PropertyForClassEditPart;
import org.eclipse.papyrus.uml.diagram.clazz.lf.autosizeableclasses.edit.policies.utils.ConcernedCompartment;
import org.eclipse.papyrus.uml.diagram.clazz.lf.autosizeableclasses.edit.policies.utils.ClassExpanderCollapser;
import org.eclipse.papyrus.uml.diagram.clazz.lf.autosizeableclasses.preference.FakeSettings;
import org.eclipse.papyrus.uml.diagram.clazz.lf.autosizeableclasses.preference.Settings;
public class ContainerAdapter extends EContentAdapter {
private Notifier containerCreator = null;
public ContainerAdapter(ModelEditPart modelEditPart) {
this.containerCreator = Notifier.class.cast(modelEditPart.getModel());
for (Adapter adapter : containerCreator.eAdapters()) {
if (adapter instanceof ContainerAdapter) {
return;
}
}
containerCreator.eAdapters().add(this);
}
public ContainerAdapter(AbstractPackageableElementCompartmentEditPart packageCompartmentEditPart) {
this.containerCreator = Notifier.class.cast(packageCompartmentEditPart.getModel());
for (Adapter adapter : containerCreator.eAdapters()) {
if (adapter instanceof ContainerAdapter) {
return;
}
}
containerCreator.eAdapters().add(this);
}
@Override
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
processIfCompartmentInvolved(notification);
}
private void processIfCompartmentInvolved(Notification notification) {
if ((isDeletion(notification) || isAddition(notification))
&& (notification.getNotifier() instanceof BasicCompartment)) {
BasicCompartment compartment = (BasicCompartment) notification.getNotifier();
processChangeInCompartment(notification, compartment);
}
}
private void processChangeInCompartment(Notification notification, BasicCompartment compartment) {
if (compartment.eContainer() instanceof CSSShapeImpl) {
CSSShapeImpl container = (CSSShapeImpl) compartment.eContainer();
if (container.getType().equals(ClassEditPart.VISUAL_ID)
|| container.getType().equals(ClassEditPartCN.VISUAL_ID)
|| container.getType()
.equals(org.eclipse.papyrus.uml.diagram.clazz.edit.parts.PackageEditPart.VISUAL_ID)
|| container.getType()
.equals(org.eclipse.papyrus.uml.diagram.clazz.edit.parts.PackageEditPartCN.VISUAL_ID)) {
if ((isDeletion(notification) && isAConcernedValue(notification.getOldValue()))
|| (isAddition(notification) && isAConcernedValue(notification.getNewValue()))) {
expandCollapseClass(isDeletion(notification), container, compartment);
}
}
}
}
private boolean isAConcernedValue(Object newValue) {
if (newValue instanceof View) {
View shape = (View) newValue;
String type = shape.getType();
if (type.equals(PropertyForClassEditPart.VISUAL_ID)
|| type.equals(OperationForClassEditPart.VISUAL_ID)
|| type.equals(NestedClassForClassEditPart.VISUAL_ID)
|| type.equals(ClassEditPartCN.VISUAL_ID)) {
return true;
}
}
return false;
}
private boolean isDeletion(Notification notification) {
return (notification.getEventType() == Notification.REMOVE
|| notification.getEventType() == Notification.REMOVE_MANY);
}
private boolean isAddition(Notification notification) {
return (notification.getEventType() == Notification.ADD
|| notification.getEventType() == Notification.ADD_MANY);
}
private void expandCollapseClass(boolean collapse, CSSShapeImpl container, BasicCompartment compartment) {
int concernedCompartment = -1;
if (compartment.getType().equals(ClassAttributeCompartmentEditPart.VISUAL_ID)
|| compartment.getType().equals(ClassAttributeCompartmentEditPartCN.VISUAL_ID)) {
concernedCompartment = ConcernedCompartment.PROPERTIES;
}
else if (compartment.getType().equals(ClassOperationCompartmentEditPart.VISUAL_ID)
|| compartment.getType().equals(ClassOperationCompartmentEditPartCN.VISUAL_ID)) {
concernedCompartment = ConcernedCompartment.OPERATIONS;
}
else if (compartment.getType().equals(ClassNestedClassifierCompartmentEditPart.VISUAL_ID)
|| compartment.getType().equals(ClassNestedClassifierCompartmentEditPartCN.VISUAL_ID)) {
concernedCompartment = ConcernedCompartment.NESTED_CLASSES;
}
if (concernedCompartment != -1) {
org.eclipse.papyrus.uml.diagram.clazz.lf.autosizeableclasses.edit.policies.utils.ClassExpanderCollapsertFactory factory = org.eclipse.papyrus.uml.diagram.clazz.lf.autosizeableclasses.edit.policies.utils.ClassExpanderCollapsertFactory
.getInstance();
ClassExpanderCollapser expandCollapse = factory.createExpandingCollapsing(container, concernedCompartment,
new FakeSettings(Settings.getInstance().isActivated(), Settings.getInstance().keepsCreationSize(),
true));
if (collapse) {
expandCollapse.collapseIfPossible();
}
else {
expandCollapse.expandIfPossible();
}
}
}
}