00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __DS_ParmReader__
00021 #define __DS_ParmReader__
00022
00023 #include "PRM_API.h"
00024 #include <UT/UT_PtrArray.h>
00025 #include <UT/UT_String.h>
00026 #include "PRM_Type.h"
00027 #include <CH/CH_ExprLanguage.h>
00028
00029 class UT_IntArray;
00030 class UT_FloatArray;
00031 class UT_StringArray;
00032
00033 class PRM_Range;
00034
00035
00036
00037 class PRM_API DS_DefaultValue
00038 {
00039 public:
00040
00041 DS_DefaultValue( const float *fp, int size );
00042 DS_DefaultValue( const int *ip, int size );
00043 DS_DefaultValue( const char *sp[],
00044 const CH_StringMeaning *meanings,
00045 int size );
00046 DS_DefaultValue(const UT_FloatArray &values);
00047 DS_DefaultValue(const UT_IntArray &values);
00048 DS_DefaultValue(const UT_StringArray &values,
00049 const CH_StringMeaning *meaning);
00050
00051 ~DS_DefaultValue();
00052
00053 int copy( const float *fp, int size );
00054 int copy( const int *ip, int size );
00055 int copy( const char *sp[],
00056 const CH_StringMeaning *meanings,
00057 int size);
00058 int copy( const UT_IntArray &v);
00059 int copy( const UT_FloatArray &v);
00060 int copy( const UT_StringArray &v,
00061 const CH_StringMeaning *meanings);
00062
00063 float *getFloat() const { return myFloat; }
00064 int *getInteger() const { return myInteger; }
00065 const char *getString(int idx) const { return myStrings[idx]; }
00066 CH_StringMeaning getStringMeaning(int idx) const
00067 { return myStringMeanings[idx]; }
00068
00069 int getSize() const { return mySize; };
00070
00071 private:
00072 void initZero();
00073 void cleanup();
00074
00075 float *myFloat;
00076 int *myInteger;
00077 char **myStrings;
00078 CH_StringMeaning *myStringMeanings;
00079
00080 int mySize;
00081 };
00082
00083
00084
00085 class PRM_API DS_MenuChoice {
00086 public:
00087 DS_MenuChoice( const char *value, const char *label)
00088 : myValue( 0 ),
00089 myLabel( 0 )
00090 {
00091 if ( value ) myValue = ::strdup( value );
00092 if ( label ) myLabel = ::strdup( label );
00093 };
00094 ~DS_MenuChoice()
00095 {
00096 if ( myValue ) ::free( myValue );
00097 if ( myLabel ) ::free( myLabel );
00098 };
00099
00100 const char *getValue() const { return myValue; }
00101 const char *getLabel() const { return myLabel; }
00102
00103 private:
00104 char *myValue;
00105 char *myLabel;
00106 };
00107
00108 class PRM_API DS_AttributeValue {
00109 public:
00110 DS_AttributeValue(const char *token, const char *value)
00111 : myToken(0), myValue(0)
00112 {
00113 if (token) myToken = ::strdup(token);
00114 if (value) myValue = ::strdup(value);
00115 }
00116 ~DS_AttributeValue()
00117 {
00118 if (myToken) ::free(myToken);
00119 if (myValue) ::free(myValue);
00120 }
00121
00122 const char *getToken() const { return myToken; }
00123 const char *getValue() const { return myValue; }
00124
00125 private:
00126 char *myToken;
00127 char *myValue;
00128 };
00129
00130 class PRM_API DS_HandleBinding {
00131 public:
00132 DS_HandleBinding(const char *channelname, const char *type,
00133 const char *desc, const char *label,
00134 const char *default_settings)
00135 : myChannelName(0), myType(0), myDesc(0), myLabel(0)
00136 {
00137 if (channelname) myChannelName = ::strdup(channelname);
00138 if (type) myType = ::strdup(type);
00139 if (desc) myDesc = ::strdup(desc);
00140 if (label) myLabel = ::strdup(label);
00141 if (default_settings)
00142 myDefaultSettings = ::strdup(default_settings);
00143 }
00144 ~DS_HandleBinding()
00145 {
00146 if (myChannelName) ::free(myChannelName);
00147 if (myType) ::free(myType);
00148 if (myDesc) ::free(myDesc);
00149 if (myLabel) ::free(myLabel);
00150 if (myDefaultSettings) ::free(myDefaultSettings);
00151 }
00152
00153 const char *getChannelName() const { return myChannelName; }
00154 const char *getType() const { return myType; }
00155 const char *getDesc() const { return myDesc; }
00156 const char *getLabel() const { return myLabel; }
00157 const char *getDefaultSettings() const { return myDefaultSettings; }
00158
00159 private:
00160 char *myChannelName, *myType, *myDesc, *myLabel, *myDefaultSettings;
00161 };
00162
00163 class PRM_API DS_SelectorBinding {
00164 public:
00165 DS_SelectorBinding(const char *parm_name,
00166 const char *type, const char *prompt, const char *desc,
00167 const char *mask, int dragging,
00168 const char *menu, int asterisk,
00169 int input_index=-1, int input_required=0)
00170 : myParmName(0), myType(0), myDesc(0), myPrompt(0), myMask(0), myMenu(0)
00171 {
00172 myDragging = dragging;
00173 myAsterisk = asterisk;
00174 myInputIndex = input_index;
00175 myInputRequired = input_required;
00176 if (parm_name) myParmName = ::strdup(parm_name);
00177 if (type) myType = ::strdup(type);
00178 if (prompt) myPrompt = ::strdup(prompt);
00179 if (desc) myDesc = ::strdup(desc);
00180 if (mask) myMask = ::strdup(mask);
00181 if (menu) myMenu = ::strdup(menu);
00182 }
00183 ~DS_SelectorBinding()
00184 {
00185 if (myParmName) ::free(myParmName);
00186 if (myType) ::free(myType);
00187 if (myPrompt) ::free(myPrompt);
00188 if (myDesc) ::free(myDesc);
00189 if (myMenu) ::free(myMenu);
00190 if (myMask) ::free(myMask);
00191 }
00192
00193 const char *getParmName() const { return myParmName; }
00194 const char *getType() const { return myType; }
00195 const char *getPrompt() const { return myPrompt; }
00196 const char *getDesc() const { return myDesc; }
00197 const char *getPrimMask() const { return myMask; }
00198 int getDragging() const { return myDragging; }
00199 const char *getMenu() const { return myMenu; }
00200 int getAsterisk() const { return myAsterisk; }
00201 int getInputIndex() const { return myInputIndex; }
00202 int getInputRequired() const { return myInputRequired; }
00203
00204 private:
00205 char *myParmName, *myType, *myPrompt, *myDesc, *myMask, *myMenu;
00206 int myDragging, myAsterisk;
00207 int myInputIndex, myInputRequired;
00208 };
00209
00210 class PRM_API DS_DisableInfo
00211 {
00212 public:
00213 DS_DisableInfo() {}
00214 ~DS_DisableInfo();
00215
00216 void addInfo(char *parm, char *value)
00217 { myControlParm.append( ::strdup(parm) );
00218 myControlValue.append( ::strdup(value) ); }
00219
00220 UT_PtrArray<char *> myControlParm;
00221 UT_PtrArray<char *> myControlValue;
00222 };
00223
00224 typedef UT_PtrArray< DS_MenuChoice * > DS_Menu;
00225 typedef UT_PtrArray< DS_AttributeValue * > DS_AttributeList;
00226 typedef UT_PtrArray< DS_HandleBinding * > DS_HandleList;
00227 typedef UT_PtrArray< DS_SelectorBinding * > DS_SelectorList;
00228 typedef UT_PtrArray< DS_DisableInfo * > DS_DisableList;
00229
00230
00231
00232 class PRM_API DS_ParmInfo
00233 {
00234 public:
00235 DS_ParmInfo( const char *token );
00236 ~DS_ParmInfo();
00237
00238 void addHelpText(const char *text);
00239
00240 UT_String myToken;
00241 UT_String myLabel;
00242 UT_String myCallback;
00243 UT_String myHelpText;
00244 UT_String myRenderManType;
00245 UT_String myOpFilter;
00246 PRM_Type myType;
00247 PRM_MultiType myMultiType;
00248 unsigned myFlag;
00249 int myToolbox;
00250
00251 UT_String myGroup;
00252 UT_String myMenuScript;
00253 DS_Menu myMenu;
00254 int myMenuType;
00255 DS_AttributeList myAttributes;
00256 DS_HandleList myHandles;
00257 DS_SelectorBinding *mySelector;
00258
00259 unsigned int mySize;
00260 DS_DefaultValue *myDefault;
00261 PRM_Range *myRange;
00262
00263 DS_DisableList myDisableInfo;
00264
00265 bool setTypeByToken( const char *token );
00266 const char *getTypeToken() const;
00267 bool isInvisible() const;
00268
00269 void setLogarithmic(bool flag);
00270 bool isLogarithmic() const;
00271
00272
00273 bool getIsArray() const { return myIsArray; }
00274 void setIsArray(bool f) { myIsArray = f; }
00275
00276 void setFlag( unsigned flag ) { myFlag |= flag; }
00277 void clearFlag( unsigned flag = (unsigned)-1 ){ myFlag &= ~flag; }
00278 unsigned getFlag( unsigned flag ) const { return myFlag & flag; }
00279 private:
00280 bool myIsArray;
00281 };
00282
00283 typedef UT_PtrArray<DS_ParmInfo*> DS_ParmInfoList;
00284
00285
00286
00287 class PRM_API DS_ParmReader
00288 {
00289 public:
00290
00291
00292 DS_ParmReader( unsigned doGroups = 0,
00293 unsigned color = 0,
00294 unsigned lightChan = 1 );
00295 virtual ~DS_ParmReader();
00296
00297 virtual const char *getClassName() const;
00298
00299
00300
00301 virtual int open( const char *fileName ) = 0;
00302 virtual void close() = 0;
00303
00304
00305
00306
00307
00308 virtual int parse() = 0;
00309
00310
00311
00312
00313
00314 virtual const char *getScriptTypeName() = 0;
00315 virtual const char *getScriptName() = 0;
00316 virtual const char *getScriptLabel() = 0;
00317 virtual const char *getScriptHelp() = 0;
00318 virtual const char *getScriptInfo() = 0;
00319 virtual const char *getInputLabel(int ) { return ""; }
00320 virtual const char *getRenderMask() { return ""; }
00321
00322
00323 int numParms() { return myParms.entries(); }
00324
00325
00326
00327 virtual DS_ParmInfo *getParmInfo( const int index );
00328
00329
00330 int isDoingGroups() const { return myDoGroups; }
00331 void setGroupSize(int g) { myGroupSize = g; }
00332 int getGroupSize() const { return myGroupSize; }
00333 UT_StringList &getGroups() { return myGroups; }
00334 DS_SelectorList &getUnboundSelectors() { return myUnboundSelectors; }
00335 DS_SelectorList &getReservedSelectors() { return myReservedSelectors; }
00336 DS_HandleList &getReservedHandles() { return myReservedHandles; }
00337 DS_HandleList &getBoundHandles() { return myBoundHandles; }
00338
00339 protected:
00340 DS_ParmInfoList myParms;
00341 UT_StringList myGroups;
00342 DS_SelectorList myUnboundSelectors;
00343 DS_SelectorList myReservedSelectors;
00344 DS_HandleList myReservedHandles;
00345 DS_HandleList myBoundHandles;
00346
00347 short myDoGroups;
00348 short myGroupSize;
00349 short myColorFlag;
00350 short myLightChan;
00351 };
00352
00353 #endif
00354