#ifndef __cpPlugins__BaseObjects__Parameters__h__ #define __cpPlugins__BaseObjects__Parameters__h__ #include #include #include #include #include #include // Some forward declarations namespace tinyxml2 { class XMLElement; class XMLDocument; } // ------------------------------------------------------------------------- #define cpPlugins_BaseObjects_Parameters_Configure( Y ) \ void ConfigureAs##Y( const std::string& name, const T##Y& init ); \ bool Has##Y( const std::string& name ) const // ------------------------------------------------------------------------- #define cpPlugins_BaseObjects_Parameters_ConfigureList( Y ) \ void ConfigureAs##Y##List( const std::string& name ); \ bool Has##Y##List( const std::string& name ) const // ------------------------------------------------------------------------- #define cpPlugins_BaseObjects_Parameters_GetSet( Y ) \ T##Y Get##Y( const std::string& name ) const; \ void Set##Y( const std::string& name, const T##Y& v ) // ------------------------------------------------------------------------- #define cpPlugins_BaseObjects_Parameters_GetSetList( Y ) \ std::vector< T##Y > Get##Y##List( const std::string& name ) const; \ void AddTo##Y##List( const std::string& name, const T##Y& v ); \ void Clear##Y##List( const std::string& name ) // ------------------------------------------------------------------------- namespace cpPlugins { namespace QT { class ParametersDialog; } namespace BaseObjects { /** */ class cpPlugins_EXPORT Parameters { // Frienship with forward declaration to improve Qt dialog execution friend class cpPlugins::QT::ParametersDialog; friend std::ostream& operator<<( std::ostream& o, const Parameters& p ) { for( auto i = p.m_Parameters.begin( ); i != p.m_Parameters.end( ); ++i ) o << i->first << ": (" << i->second.first << " | " << i->second.second << ")" << std::endl; return( o ); } public: typedef Parameters Self; enum Type { String , Bool , Int , Uint , Real , OpenFileName , SaveFileName , PathName , StringList , BoolList , IntList , UintList , RealList , OpenFileNameList , SaveFileNameList , PathNameList , Choices , NoType }; typedef bool TBool; typedef long TInt; typedef unsigned long TUint; typedef double TReal; typedef std::string TString; typedef std::string TOpenFileName; typedef std::string TSaveFileName; typedef std::string TPathName; typedef std::pair< Self::Type, std::string > TParameter; typedef std::map< std::string, TParameter > TParameters; public: cpPlugins_BaseObjects_Parameters_Configure( String ); cpPlugins_BaseObjects_Parameters_Configure( Bool ); cpPlugins_BaseObjects_Parameters_Configure( Int ); cpPlugins_BaseObjects_Parameters_Configure( Uint ); cpPlugins_BaseObjects_Parameters_Configure( Real ); cpPlugins_BaseObjects_Parameters_Configure( OpenFileName ); cpPlugins_BaseObjects_Parameters_Configure( SaveFileName ); cpPlugins_BaseObjects_Parameters_Configure( PathName ); cpPlugins_BaseObjects_Parameters_ConfigureList( String ); cpPlugins_BaseObjects_Parameters_ConfigureList( Bool ); cpPlugins_BaseObjects_Parameters_ConfigureList( Int ); cpPlugins_BaseObjects_Parameters_ConfigureList( Uint ); cpPlugins_BaseObjects_Parameters_ConfigureList( Real ); cpPlugins_BaseObjects_Parameters_ConfigureList( OpenFileName ); cpPlugins_BaseObjects_Parameters_ConfigureList( SaveFileName ); cpPlugins_BaseObjects_Parameters_ConfigureList( PathName ); cpPlugins_BaseObjects_Parameters_GetSet( Bool ); cpPlugins_BaseObjects_Parameters_GetSet( Int ); cpPlugins_BaseObjects_Parameters_GetSet( Uint ); cpPlugins_BaseObjects_Parameters_GetSet( Real ); cpPlugins_BaseObjects_Parameters_GetSet( OpenFileName ); cpPlugins_BaseObjects_Parameters_GetSet( SaveFileName ); cpPlugins_BaseObjects_Parameters_GetSet( PathName ); cpPlugins_BaseObjects_Parameters_GetSetList( String ); cpPlugins_BaseObjects_Parameters_GetSetList( Bool ); cpPlugins_BaseObjects_Parameters_GetSetList( Int ); cpPlugins_BaseObjects_Parameters_GetSetList( Uint ); cpPlugins_BaseObjects_Parameters_GetSetList( Real ); cpPlugins_BaseObjects_Parameters_GetSetList( OpenFileName ); cpPlugins_BaseObjects_Parameters_GetSetList( SaveFileName ); cpPlugins_BaseObjects_Parameters_GetSetList( PathName ); public: Parameters( ); virtual ~Parameters( ); virtual void Modified( ) const; virtual itk::ModifiedTimeType GetMTime( ) const; // Parameters container configuration void Clear( ); // Get methods void GetNames( std::vector< std::string >& container ) const; Type GetType( const std::string& name ) const; std::string GetTypeAsString( const std::string& name ) const; static Type GetTypeFromString( const std::string& t ); // Base string methods std::string GetString( const std::string& name, bool force = true ) const; void SetString( const std::string& name, const std::string& v, bool force = true ); void ConfigureAsChoices( const std::string& name, const std::vector< std::string >& choices ); void ConfigureAsRealTypesChoices( const std::string& name ); void ConfigureAsIntTypesChoices( const std::string& name ); void ConfigureAsScalarTypesChoices( const std::string& name ); std::vector< std::string > GetChoices( const std::string& name ) const; std::string GetSelectedChoice( const std::string& name ) const; bool SetSelectedChoice( const std::string& name, const std::string& choice ); std::string GetAcceptedFileExtensions( const std::string& name ) const; void SetAcceptedFileExtensions( const std::string& name, const std::string& extensions ); // XML "streaming" bool ToXML( tinyxml2::XMLDocument* doc, tinyxml2::XMLElement* parent_elem ) const; bool FromXML( const tinyxml2::XMLElement* filter_elem ); protected: TParameters& GetRawParameters( ); const TParameters& GetRawParameters( ) const; template< unsigned int _Enum > inline void _Configure( const std::string& name ); template< unsigned int _Enum > inline bool _Has( const std::string& name ) const; template< class _Type, unsigned int _Enum > inline _Type _Get( const std::string& name ) const; template< class _Type, unsigned int _Enum > inline void _Set( const std::string& name, const _Type& v ); template< class _Type, unsigned int _Enum > inline std::vector< _Type > _GetList( const std::string& name ) const; template< class _Type, unsigned int _Enum > inline void _AddToList( const std::string& name, const _Type& v ); template< unsigned int _Enum > inline void _ClearList( const std::string& name ); private: // Purposely not implemented Parameters( const Self& other ); Self& operator=( const Self& other ); protected: mutable itk::TimeStamp m_TimeStamp; TParameters m_Parameters; std::map< std::string, std::string > m_AcceptedFileExtensions; }; } // ecapseman } // ecapseman #endif // __cpPlugins__BaseObjects__Parameters__h__ // eof - $RCSfile$