| /***************************************************************************** |
| * 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(); |
| } |
| } |
| } |
| |
| } |