1 #ifndef COIN_SOFIELD_H
2 #define COIN_SOFIELD_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/SoType.h>
37 #include <Inventor/misc/SoNotification.h>
38 
39 class SbString;
40 class SoEngineOutput;
41 class SoFieldContainer;
42 class SoFieldConverter;
43 class SoFieldList;
44 class SoInput;
45 class SoOutput;
46 
47 class COIN_DLL_API SoField {
48 
49 public:
50   virtual ~SoField();
51 
52   static void initClass(void);
53   static void initClasses(void);
54   static void cleanupClass(void);
55 
56   void setIgnored(SbBool ignore);
57   SbBool isIgnored(void) const;
58 
59   void setDefault(SbBool defaultVal);
60   SbBool isDefault(void) const;
61 
62   virtual SoType getTypeId(void) const = 0;
63 
64   static SoType getClassTypeId(void);
65   SbBool isOfType(const SoType type) const;
66 
67   void enableConnection(SbBool flag);
68   SbBool isConnectionEnabled(void) const;
69 
70   // Field<-Engine connection stuff.
71   SbBool connectFrom(SoEngineOutput * master,
72                      SbBool notnotify = FALSE, SbBool append = FALSE);
73   SbBool appendConnection(SoEngineOutput * master, SbBool notnotify = FALSE);
74   void disconnect(SoEngineOutput * engineoutput);
75   SbBool isConnectedFromEngine(void) const;
76   SbBool getConnectedEngine(SoEngineOutput *& master) const;
77 
78   // Field<->Field connection stuff.
79   SbBool connectFrom(SoField * master,
80                      SbBool notnotify = FALSE, SbBool append = FALSE);
81   SbBool appendConnection(SoField * master, SbBool notnotify = FALSE);
82   void disconnect(SoField * field);
83   SbBool isConnectedFromField(void) const;
84   SbBool getConnectedField(SoField *& master) const;
85   int getNumConnections(void) const;
86   int getForwardConnections(SoFieldList & slavelist) const;
87   int getConnections(SoFieldList & masterlist) const;
88 
89   void disconnect(void);
90   SbBool isConnected(void) const;
91 
92   void setContainer(SoFieldContainer * cont);
93   SoFieldContainer * getContainer(void) const;
94 
95   SbBool set(const char * valuestring);
96   void get(SbString & valuestring);
97 
98   SbBool shouldWrite(void) const;
99 
100   virtual void touch(void);
101   virtual void startNotify(void);
102   virtual void notify(SoNotList * nlist);
103   SbBool enableNotify(SbBool on);
104   SbBool isNotifyEnabled(void) const;
105 
106   void addAuditor(void * f, SoNotRec::Type type);
107   void removeAuditor(void * f, SoNotRec::Type type);
108 
109   int operator ==(const SoField & f) const;
110   int operator !=(const SoField & f) const;
111 
112   virtual void connectionStatusChanged(int numconnections);
113   SbBool isReadOnly(void) const;
114   virtual SbBool isSame(const SoField & f) const = 0;
115   virtual void copyFrom(const SoField & f) = 0;
116 
117   virtual void fixCopy(SbBool copyconnections);
118   virtual SbBool referencesCopy(void) const;
119   void copyConnection(const SoField * fromfield);
120 
121   virtual SbBool read(SoInput * input, const SbName & name);
122   virtual void write(SoOutput * out, const SbName & name) const;
123 
124   virtual void countWriteRefs(SoOutput * out) const;
125 
126   // enums for setFieldType()/getFieldType()
127   enum FieldType {
128     NORMAL_FIELD = 0,
129     EVENTIN_FIELD,
130     EVENTOUT_FIELD,
131     EXPOSED_FIELD
132   };
133 
134   void setFieldType(int type);
135   int getFieldType(void) const;
136 
137   SbBool getDirty(void) const;
138   void setDirty(SbBool dirty);
139 
evaluate(void)140   void evaluate(void) const {
141     if ((this->statusbits & (FLAG_EXTSTORAGE|FLAG_NEEDEVALUATION)) ==
142         (FLAG_EXTSTORAGE|FLAG_NEEDEVALUATION)) this->evaluateField();
143   }
144 
145 protected:
146   SoField(void);
147 
148   void valueChanged(SbBool resetdefault = TRUE);
149   virtual void evaluateConnection(void) const;
150   virtual SbBool readValue(SoInput * in) = 0;
151   virtual void writeValue(SoOutput * out) const = 0;
152   virtual SbBool readConnection(SoInput * in);
153   virtual void writeConnection(SoOutput * out) const;
154 
155   SbBool isDestructing(void) const;
156 
157   virtual SoNotRec createNotRec(SoBase * cont);
158 
159 private:
160 
161   enum FieldFlags {
162     FLAG_TYPEMASK = 0x0007,  // need 3 bits for values [0-5]
163     FLAG_ISDEFAULT = 0x0008,
164     FLAG_IGNORE = 0x0010,
165     FLAG_EXTSTORAGE = 0x0020,
166     FLAG_ENABLECONNECTS = 0x0040,
167     FLAG_NEEDEVALUATION = 0x0080,
168     FLAG_READONLY = 0x0100,
169     FLAG_DONOTIFY = 0x0200,
170     FLAG_ISDESTRUCTING = 0x0400,
171     FLAG_ISEVALUATING = 0x0800,
172     FLAG_ISNOTIFIED = 0x1000
173   };
174 
175   void evaluateField(void) const;
176   void extendStorageIfNecessary(void);
177   SoFieldConverter * createConverter(SoType from) const;
178   SoFieldContainer * resolveWriteConnection(SbName & mastername) const;
179 
180   void notifyAuditors(SoNotList * l);
181 
182   static SoType classTypeId;
183 
184   // These are bit flags.
185   enum FileFormatFlags {
186     IGNORED = 0x01,
187     CONNECTED = 0x02,
188     DEFAULT = 0x04,
189     ALLFILEFLAGS = IGNORED|CONNECTED|DEFAULT
190   };
191 
192   SbBool changeStatusBits(const unsigned int bits, const SbBool onoff);
193   void clearStatusBits(const unsigned int bits);
194   void setStatusBits(const unsigned int bits);
195   SbBool getStatus(const unsigned int bits) const;
196   unsigned int statusbits;
197   union {
198     SoFieldContainer * container;
199     class SoConnectStorage * storage;
200   };
201 
202   SbBool hasExtendedStorage(void) const;
203 };
204 
205 
206 #ifndef COIN_INTERNAL
207 // Added to be Inventor compliant.
208 #include <Inventor/fields/SoSField.h>
209 #include <Inventor/fields/SoMField.h>
210 #endif // !COIN_INTERNAL
211 
212 #endif // !COIN_SOFIELD_H
213