00001 #ifndef COIN_SOFIELD_H
00002 #define COIN_SOFIELD_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <Inventor/SoType.h>
00028 #include <Inventor/misc/SoNotification.h>
00029
00030 class SbString;
00031 class SoEngineOutput;
00032 class SoFieldContainer;
00033 class SoFieldConverter;
00034 class SoFieldList;
00035 class SoInput;
00036 class SoOutput;
00037
00038 class COIN_DLL_API SoField {
00039
00040 public:
00041 virtual ~SoField();
00042
00043 static void initClass(void);
00044 static void initClasses(void);
00045
00046 void setIgnored(SbBool ignore);
00047 SbBool isIgnored(void) const;
00048
00049 void setDefault(SbBool def);
00050 SbBool isDefault(void) const;
00051
00052 virtual SoType getTypeId(void) const = 0;
00053
00054 static SoType getClassTypeId(void);
00055 SbBool isOfType(const SoType type) const;
00056
00057 void enableConnection(SbBool flag);
00058 SbBool isConnectionEnabled(void) const;
00059
00060
00061 SbBool connectFrom(SoEngineOutput * master,
00062 SbBool notnotify = FALSE, SbBool append = FALSE);
00063 SbBool appendConnection(SoEngineOutput * master, SbBool notnotify = FALSE);
00064 void disconnect(SoEngineOutput * engineoutput);
00065 SbBool isConnectedFromEngine(void) const;
00066 SbBool getConnectedEngine(SoEngineOutput *& master) const;
00067
00068
00069 SbBool connectFrom(SoField * master,
00070 SbBool notnotify = FALSE, SbBool append = FALSE);
00071 SbBool appendConnection(SoField * master, SbBool notnotify = FALSE);
00072 void disconnect(SoField * field);
00073 SbBool isConnectedFromField(void) const;
00074 SbBool getConnectedField(SoField *& master) const;
00075 int getNumConnections(void) const;
00076 int getForwardConnections(SoFieldList & slavelist) const;
00077 int getConnections(SoFieldList & masterlist) const;
00078
00079 void disconnect(void);
00080 SbBool isConnected(void) const;
00081
00082 void setContainer(SoFieldContainer * cont);
00083 SoFieldContainer * getContainer(void) const;
00084
00085 SbBool set(const char * valuestring);
00086 void get(SbString & valuestring);
00087
00088 SbBool shouldWrite(void) const;
00089
00090 virtual void touch(void);
00091 virtual void startNotify(void);
00092 virtual void notify(SoNotList * nlist);
00093 SbBool enableNotify(SbBool on);
00094 SbBool isNotifyEnabled(void) const;
00095
00096 void addAuditor(void * f, SoNotRec::Type type);
00097 void removeAuditor(void * f, SoNotRec::Type type);
00098
00099 int operator ==(const SoField & f) const;
00100 int operator !=(const SoField & f) const;
00101
00102 virtual void connectionStatusChanged(int numconnections);
00103 SbBool isReadOnly(void) const;
00104 virtual SbBool isSame(const SoField & f) const = 0;
00105 virtual void copyFrom(const SoField & f) = 0;
00106
00107 virtual void fixCopy(SbBool copyconnections);
00108 virtual SbBool referencesCopy(void) const;
00109 void copyConnection(const SoField * fromfield);
00110
00111 virtual SbBool read(SoInput * in, const SbName & name);
00112 virtual void write(SoOutput * out, const SbName & name) const;
00113
00114 virtual void countWriteRefs(SoOutput * out) const;
00115
00116
00117 enum FieldType {
00118 NORMAL_FIELD = 0,
00119 EVENTIN_FIELD,
00120 EVENTOUT_FIELD,
00121 EXPOSED_FIELD
00122 };
00123
00124 void setFieldType(int type);
00125 int getFieldType(void) const;
00126
00127 SbBool getDirty(void) const;
00128 void setDirty(SbBool dirty);
00129
00130 void evaluate(void) const {
00131 if ((this->statusbits & (FLAG_EXTSTORAGE|FLAG_NEEDEVALUATION)) ==
00132 (FLAG_EXTSTORAGE|FLAG_NEEDEVALUATION)) this->evaluateField();
00133 }
00134
00135 protected:
00136 SoField(void);
00137
00138 void valueChanged(SbBool resetdefault = TRUE);
00139 virtual void evaluateConnection(void) const;
00140 virtual SbBool readValue(SoInput * in) = 0;
00141 virtual void writeValue(SoOutput * out) const = 0;
00142 virtual SbBool readConnection(SoInput * in);
00143 virtual void writeConnection(SoOutput * out) const;
00144
00145 SbBool isDestructing(void) const;
00146
00147 private:
00148
00149 enum FieldFlags {
00150 FLAG_TYPEMASK = 0x0007,
00151 FLAG_ISDEFAULT = 0x0008,
00152 FLAG_IGNORE = 0x0010,
00153 FLAG_EXTSTORAGE = 0x0020,
00154 FLAG_ENABLECONNECTS = 0x0040,
00155 FLAG_NEEDEVALUATION = 0x0080,
00156 FLAG_READONLY = 0x0100,
00157 FLAG_DONOTIFY = 0x0200,
00158 FLAG_ISDESTRUCTING = 0x0400,
00159 FLAG_ISEVALUATING = 0x0800,
00160 FLAG_ISNOTIFIED = 0x1000
00161 };
00162
00163 void evaluateField(void) const;
00164 void extendStorageIfNecessary(void);
00165 SoFieldConverter * createConverter(SoType from) const;
00166 SoFieldContainer * resolveWriteConnection(SbName & mastername) const;
00167
00168 void notifyAuditors(SoNotList * l);
00169
00170 static SoType classTypeId;
00171
00172
00173 enum FileFormatFlags {
00174 IGNORED = 0x01,
00175 CONNECTED = 0x02,
00176 DEFAULT = 0x04,
00177 ALLFILEFLAGS = IGNORED|CONNECTED|DEFAULT
00178 };
00179
00180 SbBool changeStatusBits(const unsigned int bits, const SbBool onoff);
00181 void clearStatusBits(const unsigned int bits);
00182 void setStatusBits(const unsigned int bits);
00183 SbBool getStatus(const unsigned int bits) const;
00184 unsigned int statusbits;
00185 union {
00186 SoFieldContainer * container;
00187 class SoConnectStorage * storage;
00188 };
00189
00190 SbBool hasExtendedStorage(void) const;
00191 };
00192
00193
00194 #ifndef COIN_INTERNAL
00195
00196 #include <Inventor/fields/SoSField.h>
00197 #include <Inventor/fields/SoMField.h>
00198 #endif // !COIN_INTERNAL
00199
00200 #endif // !COIN_SOFIELD_H