ACF $AcfVersion:0$
TComponentCloneWrap.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// ACF includes
6#include <icomp/IComponent.h>
12
13
14namespace icomp
15{
16
17
18template <class BaseClass>
19class TComponentCloneWrap: virtual public BaseClass, protected CInterfaceManipBase
20{
21public:
22 // pseudo-reimplemented (istd::IChangeable)
24};
25
26
27// pseudo-reimplemented (istd::IChangeable)
28
29template <class BaseClass>
31{
32 icomp::IComponentContextSharedPtr contextPtr = BaseClass::GetComponentContext();
33 if (contextPtr != nullptr){
34 QByteArray contextId = contextPtr->GetContextId();
35
36 const icomp::ICompositeComponent* parentComponentPtr = dynamic_cast<const icomp::ICompositeComponent*>(BaseClass::GetParentComponent());
37 if (parentComponentPtr != nullptr){
39 // we have to check if our owner has a parent composite component.
40 // In this case we have to factorize not our component, but the complete parent composite component:
41 const CCompositeComponent* parentCompositeComponentPtr = dynamic_cast<const CCompositeComponent*>(parentComponentPtr->GetParentComponent());
42 if (parentCompositeComponentPtr != nullptr){
43 const CCompositeComponentContext* parentContextPtr = dynamic_cast<const CCompositeComponentContext*>(parentCompositeComponentPtr->GetComponentContext().get());
44
45 const IRegistry& registry = parentContextPtr->GetRegistry();
46 IRegistry::Ids elementIds = registry.GetElementIds();
47
48 for (IRegistry::Ids::ConstIterator elemIter = elementIds.constBegin(); elemIter != elementIds.constEnd(); ++elemIter){
49 const icomp::ICompositeComponent* subComponentPtr = dynamic_cast<const icomp::ICompositeComponent*>(parentCompositeComponentPtr->GetSubcomponent(*elemIter).get());
50 if (subComponentPtr != nullptr){
51 icomp::IComponentContextSharedPtr subComponentContextPtr = subComponentPtr->GetComponentContext();
52
53 if ((subComponentPtr->GetSubcomponent(contextId) != nullptr) && (subComponentContextPtr.get() == parentComponentPtr->GetComponentContext().get())) {
54 contextId = *elemIter;
55
56 parentComponentPtr = parentCompositeComponentPtr;
57 break;
58 }
59 }
60 }
61 }
62 }
63
64 icomp::IComponentUniquePtr clonedComponentPtr = parentComponentPtr->CreateSubcomponent(contextId);
66
67 if (parentComponentPtr != nullptr){
68 istd::IChangeable* changeablePtr = ExtractInterface<istd::IChangeable>(clonedComponentPtr.get());
69
70 clonedPtr.SetPtr(clonedComponentPtr.release(), changeablePtr);
71 }
72
73 if (clonedPtr.IsValid()){
74 if (clonedPtr->CopyFrom(*this, mode)){
75 return clonedPtr;
76 }
77 }
78 }
79 }
80
82}
83
84
85} // namespace icomp
86
87
virtual IComponentSharedPtr GetSubcomponent(const QByteArray &componentId) const override
Get access to subcomponent using its ID.
virtual IComponentContextSharedPtr GetComponentContext() const override
Get access to component context describing all application-specified component information loaded fro...
virtual const icomp::IComponent * GetParentComponent(bool ownerOnly=false) const =0
Get parent of this component.
virtual IComponentContextSharedPtr GetComponentContext() const =0
Get access to component context describing all application-specified component information loaded fro...
Composite component interface.
virtual IComponentUniquePtr CreateSubcomponent(const QByteArray &componentId) const =0
Create instance of subcomponent using its ID.
virtual IComponentSharedPtr GetSubcomponent(const QByteArray &componentId) const =0
Get access to subcomponent using its ID.
Interface representing information stored in component registry.
Definition IRegistry.h:48
QSet< QByteArray > Ids
Definition IRegistry.h:50
virtual Ids GetElementIds() const =0
Get ID list of existing elements.
virtual istd::IChangeableUniquePtr CloneMe(istd::IChangeable::CompatibilityMode mode=istd::IChangeable::CM_WITHOUT_REFS) const override
Common interface for data model objects, which can be changed.
Definition IChangeable.h:28
CompatibilityMode
Control how relationship betweeen objects are interpreted.
@ CM_WITHOUT_REFS
External references are simple ignored.
@ CM_WITH_REFS
External references are part of object integrity.
@ CM_CONVERT
Data of object are interpreted in context of external references.
bool IsValid() const noexcept
void SetPtr(InterfaceType *interfacePtr)
Package with interfaces and class used for components concept.
std::unique_ptr< IComponent > IComponentUniquePtr
Definition IComponent.h:72
std::shared_ptr< icomp::IComponentContext > IComponentContextSharedPtr
istd::TUniqueInterfacePtr< istd::IChangeable > IChangeableUniquePtr