#pragma once #include "cafPdmBase.h" #include #include namespace caf { class PdmObjectHandle; class PdmUiFieldHandle; class PdmXmlFieldHandle; //================================================================================================== /// Base class for all fields, making it possible to handle them generically //================================================================================================== class PdmFieldCapability; class PdmFieldHandle { public: PdmFieldHandle() { m_ownerObject = nullptr; } virtual ~PdmFieldHandle(); QString keyword() const { return m_keyword; } bool matchesKeyword( const QString& keyword ) const; PdmObjectHandle* ownerObject(); QString ownerClass() const; void registerKeywordAlias( const QString& alias ); bool matchesKeywordAlias( const QString& keyword ) const; std::vector keywordAliases() const; // Child objects bool hasChildren() const; [[nodiscard]] virtual std::vector children() const { return {}; } virtual void removeChild( PdmObjectHandle* ) {} void setOwnerClass( const QString& ownerClass ); // Ptr referenced objects bool hasPtrReferencedObjects() const; virtual std::vector ptrReferencedObjects() const { return {}; } // Capabilities void addCapability( PdmFieldCapability* capability, bool takeOwnership ) { m_capabilities.push_back( std::make_pair( capability, takeOwnership ) ); } std::vector capabilities() const; template CapabilityType* capability(); template const CapabilityType* capability() const; PdmUiFieldHandle* uiCapability(); PdmXmlFieldHandle* xmlCapability(); protected: bool isInitializedByInitFieldMacro() const { return m_ownerObject != nullptr; } private: PDM_DISABLE_COPY_AND_ASSIGN( PdmFieldHandle ); friend class PdmObjectHandle; // Give access to m_ownerObject and set Keyword void setKeyword( const QString& keyword ); PdmObjectHandle* m_ownerObject; QString m_ownerClass; QString m_keyword; std::vector m_keywordAliases; std::vector> m_capabilities; }; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- template CapabilityType* PdmFieldHandle::capability() { for ( size_t i = 0; i < m_capabilities.size(); ++i ) { CapabilityType* capability = dynamic_cast( m_capabilities[i].first ); if ( capability ) return capability; } return NULL; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- template const CapabilityType* PdmFieldHandle::capability() const { for ( size_t i = 0; i < m_capabilities.size(); ++i ) { const CapabilityType* capability = dynamic_cast( m_capabilities[i].first ); if ( capability ) return capability; } return NULL; } } // End of namespace caf