Commit 69332305 authored by Alexander Diewald's avatar Alexander Diewald
Browse files

JFX editors: Define MVCs for the hierarchical platform

* TODO: refine port logic.
* TODO: The FX editor of the platform does not yet open up. All lower
  layers are fine,

Issue-Ref: 3883
Issue-Url: https://af3-developer.fortiss.org/issues/3883

Signed-off-by: Alexander Diewald's avatarAlexander Diewald <diewald@fortiss.org>
parent edfdbc41
......@@ -66,8 +66,22 @@
<!-- Model editor binding -->
<!--======================-->
<extension point="org.fortiss.tooling.kernel.ui.modelEditorBinding">
<modelEditorBinding
binding="org.fortiss.af3.platform.hierarchic.ui.editor.fx.PlatformArchitectureFXEditor">
<modelElementClass
modelElementClass="org.fortiss.af3.platform.model.PlatformArchitecture"></modelElementClass>
</modelEditorBinding>
<modelEditorBinding binding="org.fortiss.af3.platform.hierarchic.ui.editor.fx.HierarchicPlatformFXEditorBinding">
<modelElementClass modelElementClass="org.fortiss.af3.platform.hierarchic.model.cluster.Cluster"/>
</modelEditorBinding>
<modelEditorBinding binding="org.fortiss.af3.platform.hierarchic.ui.editor.fx.HierarchicPlatformFXEditorBinding">
<modelElementClass modelElementClass="org.fortiss.af3.platform.hierarchic.model.node.Node"/>
</modelEditorBinding>
<modelEditorBinding binding="org.fortiss.af3.platform.hierarchic.ui.editor.fx.HierarchicPlatformFXEditorBinding">
<modelElementClass modelElementClass="org.fortiss.af3.platform.hierarchic.model.tile.Tile"/>
</modelEditorBinding>
<modelEditorBinding binding="org.fortiss.af3.platform.hierarchic.ui.editor.ClusterStructureEditorBinding">
<modelElementClass modelElementClass="org.fortiss.af3.platform.hierarchic.model.cluster.Cluster"/>
<modelElementClass modelElementClass="org.fortiss.af3.platform.hierarchic.model.cluster.Cluster"/>
</modelEditorBinding>
<modelEditorBinding binding="org.fortiss.af3.platform.hierarchic.ui.editor.NodeStructureEditorBinding">
<modelElementClass modelElementClass="org.fortiss.af3.platform.hierarchic.model.node.Node"/>
......
HierarchicPlatformFXEditorBinding.java 0270918548bb3f616699d5755f1ca8de98b69402 YELLOW
PlatformArchitectureControllerFactory.java c49e4fb96ca1cbb796163cf0dcd6da97b650c13b YELLOW
PlatformArchitectureFXEditor.java f1146b069bd182be7e71b65b51c14d9936e37ed2 YELLOW
PlatformComponentControllerFactory.java b9e09906c0d5428d507d3affd879f30d9ed7d697 YELLOW
PlatformComponentFXEditor.java 610ea3aa678a33a6e780b3c50a1dd432c1a05d33 YELLOW
PlatformComponentVisualFactory.java 716c16155a90740e7ed9e28100a2814dc151b46d YELLOW
PlatformElementModelFactory.java 89f1ed401dd43b78b8102cd4930cbb86d10df40b YELLOW
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.hierarchic.ui.editor.fx;
import org.eclipse.ui.IEditorPart;
import org.fortiss.af3.platform.model.IPlatformArchitectureElement;
import org.fortiss.af3.platform.model.PlatformArchitecture;
import org.fortiss.tooling.kernel.ui.extension.IModelEditorBinding;
import org.fortiss.tooling.kernel.ui.extension.base.ModelEditorBindingBase;
import com.google.common.reflect.TypeToken;
/**
* Generic {@link IModelEditorBinding} for the multiple layers of hierarchical
* {@link PlatformArchitecture}s.
*
* @author diewald
*/
public class HierarchicPlatformFXEditorBinding<T extends IPlatformArchitectureElement>
extends ModelEditorBindingBase<T> {
/** Token of the generic parameter defining the type of the edited element. */
TypeToken<T> token = new TypeToken<>(getClass()) { /**/
};
/** {@inheritDoc} */
@Override
public Class<? extends IEditorPart> getEditorClass() {
return PlatformComponentFXEditor.class;
}
/** {@inheritDoc} */
@Override
public String getLabel() {
return token.getRawType().getSimpleName() + " Structure (FX)";
}
/** {@inheritDoc} */
@Override
public int getPriority() {
return -100;
}
}
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.hierarchic.ui.editor.fx;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IController;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
import org.fortiss.af3.platform.model.PlatformArchitecture;
/**
* {@link IControllerFactory} for the top-most layer of hierarchical {@link PlatformArchitecture}s.
*
* @author diewald
*/
public class PlatformArchitectureControllerFactory extends PlatformComponentControllerFactory {
/** {@inheritDoc} */
@Override
public IController createDiagramAnchorageController(IDiagramAnchorageMVCBundle modelBundle) {
return null;
}
}
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.hierarchic.ui.editor.fx;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
import org.fortiss.af3.platform.hierarchic.compose.HierarchicalCompositionRules;
import org.fortiss.af3.platform.hierarchic.compose.base.IArchitectureDomainDependant;
import org.fortiss.af3.platform.hierarchic.compose.base.IPlatformHierarchicalCompositionRules;
import org.fortiss.af3.platform.model.IArchitectureDomain;
import org.fortiss.af3.platform.model.IPlatformDomain;
import org.fortiss.af3.platform.model.PlatformArchitecture;
import org.fortiss.tooling.kernel.ui.extension.base.LWFXEFEditorBase;
/**
* Editor for the top-most layer of hierarchical {@link PlatformArchitecture}s.
*
* @author diewald
*/
final class PlatformArchitectureFXEditor extends LWFXEFEditorBase<PlatformArchitecture>
implements IArchitectureDomainDependant {
/** {@inheritDoc} */
@Override
public IPlatformHierarchicalCompositionRules getPlatformCompositionRules() {
return HierarchicalCompositionRules.INSTANCE;
}
/** {@inheritDoc} */
@Override
protected IModelFactory createModelFactory() {
return new PlatformElementModelFactory<>(getEditedObject());
}
/** {@inheritDoc} */
@Override
protected IVisualFactory createVisualFactory() {
return new PlatformComponentVisualFactory();
}
/** {@inheritDoc} */
@Override
protected IControllerFactory createControllerFactory() {
return new PlatformArchitectureControllerFactory();
}
/** {@inheritDoc} */
@Override
public Class<? extends IArchitectureDomain> getArchitectureDomain() {
return IPlatformDomain.class;
}
}
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.hierarchic.ui.editor.fx;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IController;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
import org.fortiss.af3.platform.model.IPlatformArchitectureElement;
import org.fortiss.af3.platform.model.PlatformArchitecture;
import org.fortiss.af3.platform.model.PlatformConnectorUnit;
import org.fortiss.af3.platform.model.TransmissionConnection;
import org.fortiss.tooling.base.ui.editor.fx.controller.EObjectDiagramController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedContentAnchorageController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedDiagramAnchorageController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedLinkBendPointController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedRectangularResizableContentController;
/**
* {@link IControllerFactory} for the or the lower layers of hierarchical
* {@link PlatformArchitecture}s.
*
* @author diewald
*/
public class PlatformComponentControllerFactory implements IControllerFactory {
/** {@inheritDoc} */
@Override
public IController createContentController(IContentMVCBundle model) {
return new LayoutedRectangularResizableContentController<IPlatformArchitectureElement>(
model, IPlatformArchitectureElement.class);
}
/** {@inheritDoc} */
@Override
public IController createDiagramAnchorageController(IDiagramAnchorageMVCBundle modelBundle) {
return new LayoutedDiagramAnchorageController<>(modelBundle, PlatformConnectorUnit.class);
}
/** {@inheritDoc} */
@Override
public IController createContentAnchorageController(IContentAnchorageMVCBundle modelBundle) {
return new LayoutedContentAnchorageController<>(modelBundle, PlatformConnectorUnit.class);
}
/** {@inheritDoc} */
@Override
public IController createLinkController(ILinkMVCBundle modelBundle) {
return new LayoutedLinkBendPointController<>(modelBundle, TransmissionConnection.class);
}
/** {@inheritDoc} */
@Override
public IController createDiagramController(IDiagramMVCBundle diagramBundle) {
return new EObjectDiagramController<>(diagramBundle, IPlatformArchitectureElement.class);
}
}
/*-------------------------------------------------------------------------+
| Copyright 2013 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.hierarchic.ui.editor.fx;
import static org.eclipse.core.runtime.Assert.isTrue;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
import org.fortiss.af3.platform.hierarchic.compose.HierarchicalCompositionRules;
import org.fortiss.af3.platform.hierarchic.compose.base.IArchitectureDomainDependant;
import org.fortiss.af3.platform.hierarchic.compose.base.IPlatformHierarchicalCompositionRules;
import org.fortiss.af3.platform.model.IArchitectureDomain;
import org.fortiss.af3.platform.model.PlatformArchitecture;
import org.fortiss.af3.platform.utils.PlatformArchitectureUtils;
import org.fortiss.tooling.base.model.element.IHierarchicElement;
import org.fortiss.tooling.base.model.element.IHierarchicElementContainer;
import org.fortiss.tooling.kernel.extension.data.Prototype;
import org.fortiss.tooling.kernel.service.IPrototypeService;
import org.fortiss.tooling.kernel.ui.extension.base.LWFXEFEditorBase;
/**
* Editor for all levels of a hierarchical platform, except the root {@link PlatformArchitecture}.
*
* @author diewald
*/
public class PlatformComponentFXEditor<T extends IHierarchicElementContainer & IArchitectureDomain>
extends LWFXEFEditorBase<T> implements IArchitectureDomainDependant {
/** Admissible child object classes. */
private Class<? extends EObject>[] visibleObjectTypes;
/** {@link IArchitectureDomain} of the edited element. */
private Class<? extends T> domain;
/** Constructor. */
@SuppressWarnings("unchecked")
public PlatformComponentFXEditor(Class<? extends T> inputType) {
domain = (Class<? extends T>)PlatformArchitectureUtils.getArchitectureDomain(inputType);
isTrue(domain != null);
Set<Class<? extends EObject>> visibleObjectTypesSet = getVisibleEObjectTypesSet();
visibleObjectTypes = new Class[visibleObjectTypesSet.size()];
visibleObjectTypes = visibleObjectTypesSet.toArray(visibleObjectTypes);
}
/** Computes the set of admissible child object classes. */
@SuppressWarnings("unchecked")
protected Set<Class<? extends EObject>> getVisibleEObjectTypesSet() {
Set<Class<? extends EObject>> visibleObjectTypesSet =
new HashSet<Class<? extends EObject>>();
Class<? extends IArchitectureDomain> ad = getArchitectureDomain();
for(Prototype p : IPrototypeService.getInstance().getAllPrototypes()) {
EObject contained = p.getPrototype();
if((contained instanceof IArchitectureDomain) &&
(getPlatformCompositionRules().isValidContainer(ad,
(Class<? extends IArchitectureDomain>)contained.getClass()))) {
boolean add = false;
List<Class<? extends IArchitectureDomain>> childDomains =
getPlatformCompositionRules().getAdmissibleChildDomains(domain);
if(!childDomains.isEmpty()) {
for(Class<? extends IArchitectureDomain> domain : childDomains) {
if(domain.isAssignableFrom(contained.getClass())) {
add = true;
break;
}
}
} else {
add = true;
}
if(add) {
visibleObjectTypesSet.add(contained.getClass());
}
}
}
return visibleObjectTypesSet;
}
/** {@inheritDoc} */
@Override
public Class<? extends EObject>[] getVisibleEObjectTypes() {
return visibleObjectTypes;
}
/** {@inheritDoc} */
@Override
public Class<? extends T> getArchitectureDomain() {
return domain;
}
/** {@inheritDoc} */
@Override
public IPlatformHierarchicalCompositionRules getPlatformCompositionRules() {
return HierarchicalCompositionRules.INSTANCE;
}
/** {@inheritDoc} */
@Override
protected IModelFactory createModelFactory() {
return new PlatformElementModelFactory<>((IHierarchicElement)getEditedObject());
}
/** {@inheritDoc} */
@Override
protected IVisualFactory createVisualFactory() {
return new PlatformComponentVisualFactory();
}
/** {@inheritDoc} */
@Override
protected IControllerFactory createControllerFactory() {
return new PlatformComponentControllerFactory();
}
}
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.hierarchic.ui.editor.fx;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentAnchorageVisual;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentVisual;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IDiagramAnchorageVisual;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.ILinkVisual;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
import org.fortiss.af3.platform.hierarchic.model.cluster.Cluster;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.DirectedPlatformConnectorContentVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.DirectedPlatformConnectorDiagramVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformClusterVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformExecutionUnitVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformGatewayUnitVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformMemoryUnitVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformTransmissionUnitVisual;
import org.fortiss.af3.platform.model.ExecutionUnit;
import org.fortiss.af3.platform.model.GatewayUnit;
import org.fortiss.af3.platform.model.MemoryUnit;
import org.fortiss.af3.platform.model.PlatformArchitecture;
import org.fortiss.af3.platform.model.PlatformConnectorUnit;
import org.fortiss.af3.platform.model.TransmissionConnection;
import org.fortiss.af3.platform.model.TransmissionUnit;
import org.fortiss.tooling.base.ui.editor.fx.visual.NamedLayoutedLineLinkVisual;
/**
* {@link IVisualFactory} for the or the lower layers of hierarchical
* {@link PlatformArchitecture}s.
*
* @author diewald
*/
public final class PlatformComponentVisualFactory implements IVisualFactory {
/** {@inheritDoc} */
@Override
public IContentVisual createContentVisual(IContentMVCBundle modelBundle) {
Object model = modelBundle.getModel();
if(model instanceof Cluster) {
return new PlatformClusterVisual(modelBundle);
} else if(model instanceof ExecutionUnit) {
return new PlatformExecutionUnitVisual(modelBundle);
} else if(model instanceof TransmissionUnit) {
return new PlatformTransmissionUnitVisual(modelBundle);
} else if(model instanceof GatewayUnit) {
return new PlatformGatewayUnitVisual(modelBundle);
} else if(model instanceof MemoryUnit) {
return new PlatformMemoryUnitVisual(modelBundle);
}
return null;
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
public IDiagramAnchorageVisual
createDiagramAnchorageVisual(IDiagramAnchorageMVCBundle modelBundle) {
Object anchorageObj = modelBundle.getModel();
if(anchorageObj instanceof PlatformConnectorUnit) {
return new DirectedPlatformConnectorDiagramVisual<PlatformConnectorUnit>(modelBundle,
(Class<PlatformConnectorUnit>)anchorageObj.getClass());
}
return null;
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
public IContentAnchorageVisual
createContentAnchorageVisual(IContentAnchorageMVCBundle modelBundle) {
Object anchorageObj = modelBundle.getModel();
if(anchorageObj instanceof PlatformConnectorUnit) {
return new DirectedPlatformConnectorContentVisual<PlatformConnectorUnit>(modelBundle,
(Class<PlatformConnectorUnit>)anchorageObj.getClass());
}
return null;
}
/** {@inheritDoc} */
@Override
public ILinkVisual createLinkVisual(ILinkMVCBundle modelBundle) {
Object linkObj = modelBundle.getModel();
if(linkObj instanceof TransmissionConnection) {
return new NamedLayoutedLineLinkVisual<>(modelBundle, TransmissionConnection.class);
}
return null;
}
}
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.hierarchic.ui.editor.fx;
import static java.util.Arrays.asList;
import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickInstanceOf;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
import org.fortiss.af3.platform.model.ExecutionUnit;
import org.fortiss.af3.platform.model.GatewayUnit;
import org.fortiss.af3.platform.model.GenericPlatformUnit;
import org.fortiss.af3.platform.model.ILogicalPlatformArchitectureElement;
import org.fortiss.af3.platform.model.MemoryUnit;
import org.fortiss.af3.platform.model.PlatformArchitecture;
import org.fortiss.af3.platform.model.TransmissionUnit;
import org.fortiss.tooling.base.model.element.IHierarchicElement;