1 #ifndef COIN_SOSUBKIT_H 2 #define COIN_SOSUBKIT_H 3 4 /**************************************************************************\ 5 * Copyright (c) Kongsberg Oil & Gas Technologies AS 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are 10 * met: 11 * 12 * Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * 15 * Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * Neither the name of the copyright holder nor the names of its 20 * contributors may be used to endorse or promote products derived from 21 * this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 \**************************************************************************/ 35 36 #include <Inventor/nodes/SoSubNode.h> 37 #include <Inventor/fields/SoSFNode.h> 38 #include <Inventor/nodekits/SoNodekitCatalog.h> 39 #include <Inventor/C/tidbits.h> 40 41 #ifndef COIN_INTERNAL 42 // Include this header file for better Open Inventor compatibility. 43 #include <Inventor/nodekits/SoNodeKitListPart.h> 44 #endif // !COIN_INTERNAL 45 46 47 // FIXME: document all the macros, as they are part of the public 48 // API. 20011024 mortene. 49 50 #define PRIVATE_KIT_HEADER(_kitclass_) \ 51 public: \ 52 static const SoNodekitCatalog * getClassNodekitCatalog(void); \ 53 virtual const SoNodekitCatalog * getNodekitCatalog(void) const; \ 54 \ 55 protected: \ 56 static const SoNodekitCatalog ** getClassNodekitCatalogPtr(void); \ 57 \ 58 private: \ 59 static SoNodekitCatalog * classcatalog; \ 60 static const SoNodekitCatalog ** parentcatalogptr; \ 61 static void atexit_cleanupkit(void) 62 63 #define SO_KIT_HEADER(_kitclass_) \ 64 SO_NODE_HEADER(_kitclass_); \ 65 PRIVATE_KIT_HEADER(_kitclass_) 66 67 #define SO_KIT_ABSTRACT_HEADER(_kitclass_) \ 68 SO_NODE_ABSTRACT_HEADER(_kitclass_); \ 69 PRIVATE_KIT_HEADER(_kitclass_) 70 71 #define SO_KIT_CATALOG_ENTRY_HEADER(_entry_) \ 72 protected: SoSFNode _entry_ 73 74 75 #define PRIVATE_KIT_SOURCE(_class_) \ 76 SoNodekitCatalog * _class_::classcatalog = NULL; \ 77 const SoNodekitCatalog ** _class_::parentcatalogptr = NULL; \ 78 \ 79 const SoNodekitCatalog * \ 80 _class_::getClassNodekitCatalog(void) \ 81 { \ 82 return _class_::classcatalog; \ 83 } \ 84 \ 85 const SoNodekitCatalog * \ 86 _class_::getNodekitCatalog(void) const \ 87 { \ 88 return _class_::classcatalog; \ 89 } \ 90 \ 91 const SoNodekitCatalog ** \ 92 _class_::getClassNodekitCatalogPtr(void) \ 93 { \ 94 return const_cast<const class SoNodekitCatalog **>(&_class_::classcatalog); \ 95 } \ 96 \ 97 void \ 98 _class_::atexit_cleanupkit(void) \ 99 { \ 100 delete _class_::classcatalog; \ 101 _class_::classcatalog = NULL; \ 102 _class_::parentcatalogptr = NULL; \ 103 } 104 105 #define SO_KIT_SOURCE(_class_) \ 106 SO_NODE_SOURCE(_class_) \ 107 PRIVATE_KIT_SOURCE(_class_) 108 109 #define SO_KIT_ABSTRACT_SOURCE(_class_) \ 110 SO_NODE_ABSTRACT_SOURCE(_class_); \ 111 PRIVATE_KIT_SOURCE(_class_) 112 113 #define SO_KIT_IS_FIRST_INSTANCE() \ 114 SO_NODE_IS_FIRST_INSTANCE() 115 116 #define SO_KIT_INIT_CLASS(_class_, _parentclass_, _parentname_) \ 117 do { \ 118 SO_NODE_INIT_CLASS(_class_, _parentclass_, _parentname_); \ 119 _class_::parentcatalogptr = _parentclass_::getClassNodekitCatalogPtr(); \ 120 } WHILE_0 121 122 #define SO_KIT_INIT_ABSTRACT_CLASS(_class_, _parentclass_, _parentname_) \ 123 do { \ 124 SO_NODE_INIT_ABSTRACT_CLASS(_class_, _parentclass_, _parentname_); \ 125 _class_::parentcatalogptr = _parentclass_::getClassNodekitCatalogPtr(); \ 126 } WHILE_0 127 128 129 #define SO_KIT_CONSTRUCTOR(_class_) \ 130 do { \ 131 SO_NODE_CONSTRUCTOR(_class_); \ 132 SoBase::staticDataLock(); \ 133 if (_class_::classcatalog == NULL) { \ 134 SoType mytype = SoType::fromName(SO__QUOTE(_class_)); \ 135 _class_::classcatalog = (*_class_::parentcatalogptr)->clone(mytype); \ 136 cc_coin_atexit_static_internal(_class_::atexit_cleanupkit); \ 137 } \ 138 SoBase::staticDataUnlock(); \ 139 } WHILE_0 140 141 142 143 #define SO_KIT_ADD_CATALOG_ENTRY(_part_, _partclass_, _isdefnull_ , _parent_, _sibling_, _ispublic_) \ 144 do { \ 145 classcatalog->addEntry(SO__QUOTE(_part_), \ 146 SoType::fromName(SO__QUOTE(_partclass_)), \ 147 SoType::fromName(SO__QUOTE(_partclass_)), \ 148 _isdefnull_, \ 149 SO__QUOTE(_parent_), \ 150 SO__QUOTE(_sibling_), \ 151 FALSE, \ 152 SoType::badType(), \ 153 SoType::badType(), \ 154 _ispublic_); \ 155 SO_NODE_ADD_FIELD(_part_,(NULL)); \ 156 } WHILE_0 157 158 159 160 #define SO_KIT_ADD_CATALOG_LIST_ENTRY(_part_, _containertype_, _isdefnull_, _parent_, _sibling_, _itemtype_, _ispublic_) \ 161 do { \ 162 classcatalog->addEntry(SO__QUOTE(_part_), \ 163 SoNodeKitListPart::getClassTypeId(), \ 164 SoNodeKitListPart::getClassTypeId(), \ 165 _isdefnull_, \ 166 SO__QUOTE(_parent_), \ 167 SO__QUOTE(_sibling_), \ 168 TRUE, \ 169 _containertype_::getClassTypeId(), \ 170 _itemtype_::getClassTypeId(), \ 171 _ispublic_); \ 172 SO_NODE_ADD_FIELD(_part_,(NULL)); \ 173 } WHILE_0 174 175 176 177 #define SO_KIT_ADD_CATALOG_ABSTRACT_ENTRY(_part_, _class_, _defaultclass_, _isdefnull_, _parent_, _sibling_, _ispublic_) \ 178 do { \ 179 classcatalog->addEntry(SO__QUOTE(_part_), \ 180 _class_::getClassTypeId(), \ 181 _defaultclass_::getClassTypeId(), \ 182 _isdefnull_, \ 183 SO__QUOTE(_parent_), \ 184 SO__QUOTE(_sibling_), \ 185 FALSE, \ 186 SoType::badType(), \ 187 SoType::badType(), \ 188 _ispublic_); \ 189 SO_NODE_ADD_FIELD(_part_,(NULL)); \ 190 } WHILE_0 191 192 193 194 #define SO_KIT_ADD_LIST_ITEM_TYPE(_part_, _listitemtype_) \ 195 do { \ 196 classcatalog->addListItemType(SO__QUOTE(_part_), \ 197 _listitemtype_::getClassTypeId()); \ 198 } WHILE_0 199 200 201 #define SO_KIT_INIT_INSTANCE() \ 202 this->createFieldList(); \ 203 this->createDefaultParts() 204 205 #define SO_KIT_ADD_FIELD(_fieldname_, _defvalue_) \ 206 SO_NODE_ADD_FIELD(_fieldname_, _defvalue_) 207 208 // New for Coin-3 209 #define SO_KIT_ADD_EMPTY_MFIELD(_fieldname_) \ 210 SO_NODE_ADD_EMPTY_MFIELD(_fieldname_) 211 212 #define SO_KIT_DEFINE_ENUM_VALUE(_enumtype_, _enumvalue_) \ 213 SO_NODE_DEFINE_ENUM_VALUE(_enumtype_, _enumvalue_) 214 215 #define SO_KIT_SET_MF_ENUM_TYPE(_fieldname_, _enumtype_) \ 216 SO_NODE_SET_MF_ENUM_TYPE(_fieldname_, _enumtype_) 217 218 #define SO_KIT_SET_SF_ENUM_TYPE(_fieldname_, _enumtype_) \ 219 SO_NODE_SET_SF_ENUM_TYPE(_fieldname_, _enumtype_) 220 221 #define SO_KIT_CHANGE_ENTRY_TYPE(_part_, _newpartclassname_, _newdefaultpartclassname_) \ 222 do { \ 223 classcatalog->narrowTypes(SO__QUOTE(_part_), \ 224 SoType::fromName(SO__QUOTE(_newpartclassname_)), \ 225 SoType::fromName(SO__QUOTE(_newdefaultpartclassname_))); \ 226 } WHILE_0 227 228 229 #define SO_KIT_CHANGE_NULL_BY_DEFAULT(_part_, _newnullbydefault_) \ 230 do { \ 231 classcatalog->setNullByDefault(SO__QUOTE(_part_), _newnullbydefault_); \ 232 } WHILE_0 233 234 #endif // !COIN_SOSUBKIT_H 235