home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / IBPalettes / WWTCLKit / WWTCLVarTrace.m < prev    next >
Encoding:
Text File  |  1995-03-22  |  3.2 KB  |  128 lines

  1. /* Copyright 1993 Michael B. Johnson
  2.  * Permission to use, copy, modify, and distribute this
  3.  * software and its documentation for any non-commercial 
  4.  * purpose and without fee is hereby granted, provided that the 
  5.  * above copyright notice appears in all copies.  Michael B. Johnson
  6.  * makes no representations about the suitability of this
  7.  * software for any purpose.  It is provided "as is" without
  8.  * express or implied warranty.
  9.  *
  10.  * Permission to use, copy, modify or distribute this software
  11.  * and its documentation for any commercial purpose must be
  12.  * confirmed in writing with Michael B. Johnson.  He can be
  13.  * contacted at:
  14.  *              20 Ames St. E15-023G    
  15.  *              Cambridge, MA 02141
  16.  *              (617) 547 0563
  17.  *              
  18.  */
  19.  
  20.  
  21. #import "WWTCLVarTrace.h"
  22. #import "WWTCLInterp.h"
  23.  
  24. // import one UI just so it knows about the methods...
  25. #import "WWSlider.h"
  26.  
  27. @implementation WWTCLVarTrace
  28.  
  29.  
  30. - initWithVarName:(const char *)newVarName proc:(Tcl_VarTraceProc *)newTraceProcPointer datum:(ClientData)newDatum delegate:newDelegate interp:newInterp
  31. {
  32.   [super init];
  33.  
  34.   freeingMyself = NO;
  35.   varName = NXCopyStringBuffer(newVarName);
  36.   uiObject = (id)newDatum;
  37.   delegate = newDelegate;
  38.   tclInterp = newInterp;
  39.   traceProcPointer = newTraceProcPointer;
  40.  
  41.   return self;
  42. }
  43.  
  44. - initWithVarName2:(const char *)newVarName1 :(const char *)newVarName2 proc:(Tcl_VarTraceProc *)newTraceProcPointer datum:(ClientData)newDatum delegate:newDelegate interp:newInterp
  45. {
  46.   [super init];
  47.  
  48.   freeingMyself = NO;
  49.   varName = (char *)malloc(3 + strlen(newVarName1) + strlen(newVarName2));
  50.   sprintf(varName, "%s(%s)", newVarName1, newVarName2);
  51.   uiObject = (id)newDatum;
  52.   delegate = newDelegate;
  53.   tclInterp = newInterp;
  54.   traceProcPointer = newTraceProcPointer;
  55.  
  56.   return self;
  57. }
  58.  
  59. - awake
  60. {
  61.   [super awake];
  62.   freeingMyself = NO;
  63.   return self;
  64. }
  65.  
  66. - free
  67. {
  68.   //NXLogError("%s %d being free'ed\n", [[self class] name], self);
  69.   if (freeingMyself)  // don't want to recurse here when freeing the trace...
  70.   {  return nil;
  71.   }
  72.   freeingMyself = YES;
  73.   [self removeTrace];
  74.   if (varName) {  free(varName); }
  75.   return [super free];
  76. }
  77.  
  78. - (BOOL)matchWithVarName:(const char *)newVarName proc:(Tcl_VarTraceProc *)newTraceProcPointer datum:(ClientData)newDatum delegate:newDelegate
  79. {
  80.   if (strcmp(varName, newVarName))
  81.   {  return NO;
  82.   }
  83.   if (uiObject != (id)newDatum)
  84.   {  return NO;
  85.   }
  86.   if (delegate != newDelegate)
  87.   {  return NO;
  88.   }
  89.   if (traceProcPointer != newTraceProcPointer)
  90.   {  return NO;
  91.   }
  92.  
  93.   return YES;
  94. }
  95.  
  96. - (const char *)varName {  return varName; }
  97. - tclInterp {  return tclInterp; }
  98. - datum {  return uiObject; }
  99. - uiObject {  return uiObject; }
  100. - delegate { return delegate; }
  101. - (Tcl_VarTraceProc *)traceProcPointer { return traceProcPointer; }
  102.  
  103. // just so it won't complain...
  104. - tclVarChanged:(const char *)aVarName { return self; }
  105.  
  106. - setStringValue:(const char *)newValue
  107. {
  108.   [uiObject setStringValue:newValue];
  109.   if (delegate) {  [delegate tclVarChanged:varName]; }
  110.   return self;
  111. }
  112.  
  113. - executeTrace
  114. {
  115.   [uiObject evaluateSelf];
  116.   if (delegate) {  [delegate tclVarChanged:varName]; }
  117.   return self;
  118. }
  119.  
  120. - removeTrace  // need to have the interp around to do this...
  121. {
  122.    [tclInterp _untraceWritesOn:varName calling:traceProcPointer usingData:uiObject];
  123.    return self;
  124. }
  125.  
  126.  
  127. @end
  128.