MultiVarProbeWidget.m
上传用户:shenzhenrh
上传日期:2013-05-12
资源大小:2904k
文件大小:8k
源码类别:

信息检索与抽取

开发平台:

Unix_Linux

  1. #import <simtoolsgui/MultiVarProbeWidget.h>
  2. #import <objectbase/SwarmObject.h>
  3. #import <objectbase.h>
  4. #import <gui.h>
  5. #include <misc.h>
  6. @interface MultiProbe: SwarmObject
  7. {
  8.   id <Frame> parent;
  9.   id <VarProbe> varProbe;
  10.   id <Frame> frame;
  11.   id <Label> label;
  12.   id <Map> entryMap;
  13.   compare_t compareFunction;
  14.   BOOL interactiveFlag;
  15.   BOOL labelingFlag;
  16. }
  17. - setParent: parent;
  18. - setLabelingFlag: (BOOL)flag;
  19. - setCompareFunction: (compare_t)aFunction;
  20. - setVarProbe: (id <VarProbe>)probe;
  21. - createEnd;
  22. - addEntries: (id <List>)objectList;
  23. - Spawn: (const char *)windowName;
  24. - idReceive: (const char *)windowName;
  25. - (const char *)package: (const char *)window;
  26. @end
  27. @implementation MultiProbe
  28. - setParent: (id <Frame>)parentFrame
  29. {
  30.   parent = parentFrame;
  31.   return self;
  32. }
  33. - setVarProbe: (id <VarProbe>)probe
  34. {
  35.   varProbe = probe;
  36.  
  37.   return self;
  38. }
  39. - setCompareFunction: (compare_t)aFunction
  40. {
  41.   compareFunction = aFunction;
  42.   return self;
  43. }
  44. - setLabelingFlag: (BOOL)flag
  45. {
  46.   labelingFlag = flag;
  47.   return self;
  48. }
  49. - createEnd
  50. {
  51.   frame = [Frame createParent: parent];
  52.   if (labelingFlag)
  53.     {
  54.       label = [VarProbeLabel createParent: frame];
  55.       [label setText: [varProbe getProbedVariable]];
  56.     }
  57.   entryMap = [Map createBegin: [self getZone]];
  58.   [entryMap setCompareFunction: compareFunction];
  59.   entryMap = [entryMap createEnd];
  60.   return self;
  61. }
  62. - addEntryFor: obj
  63. {
  64.   id <VarProbeEntry> entry = [VarProbeEntry createBegin: [self getZone]];
  65.   
  66.   [entry setParent: frame];
  67.   [entry setVarProbe: varProbe];
  68.   [entry setInteractiveFlag: [varProbe getInteractiveFlag]];
  69.   [entry setOwner: self];
  70.   entry = [entry createEnd];
  71.   if (![varProbe getInteractiveFlag])
  72.     [entry setActiveFlag: NO];
  73.   else
  74.     [entry setActiveFlag: YES];
  75.   
  76.   [entryMap at: obj insert: entry];
  77.   
  78.   return self;
  79. }
  80. - addEntries: (id <List>)objectList
  81. {
  82.   id <ListIndex> li = [objectList begin: [self getZone]];
  83.   id obj;
  84.   while ((obj = [li next]) != nil)
  85.     [self addEntryFor: obj];
  86.   [li drop];
  87.   return self;
  88. }
  89. static BOOL
  90. findObject (id entryMap, const char *windowName,
  91.             id *obj_ptr, id *entry_ptr)
  92. {
  93.   id <MapIndex> emi = [entryMap begin: [entryMap getZone]];
  94.   id <VarProbeEntry> entry;
  95.   id obj;
  96.   while ((entry = [emi next: &obj]) != nil)
  97.     {
  98.       if (strcmp (windowName, [entry getWidgetName]) == 0)
  99.         {
  100.           *obj_ptr = obj;
  101.           if (entry_ptr)
  102.             *entry_ptr = entry;
  103.           [emi drop];
  104.           return YES;
  105.         }
  106.     }
  107.   *obj_ptr = nil;
  108.   if (entry_ptr)
  109.     *entry_ptr = nil;
  110.   [emi drop];
  111.   return NO;
  112. }
  113. - setVariableValue: (const char *)windowName
  114. {
  115.   id obj;
  116.   id <VarProbeEntry> entry;
  117.   if (findObject (entryMap, windowName, &obj, &entry))
  118.     [varProbe setData: obj ToString: [entry getValue]];
  119.   return self;
  120. }
  121. - (void)update
  122. {
  123.   id <MapIndex> emi = [entryMap begin: [self getZone]];
  124.   char buffer[512];
  125.   id <VarProbeEntry> entry;
  126.   id obj;
  127.   while ((entry = [emi next: &obj]) != nil)
  128.     {
  129.       const char *originalValue = STRDUP ([entry getValue]);
  130.       const char *newValue =
  131.         STRDUP ([varProbe probeAsString: obj Buffer: buffer]);
  132.       if (strcmp (newValue, originalValue) != 0)
  133.         {
  134.           if ([varProbe getInteractiveFlag])
  135.             [entry setValue: newValue];
  136.           else
  137.             {
  138.               [entry setActiveFlag: YES];
  139.               [entry setValue: newValue];
  140.               [entry setActiveFlag: NO];
  141.             }
  142.         }
  143.     }
  144.   [emi drop];
  145. }
  146. - (void)packFillLeft
  147. {
  148.   [frame packFillLeft: NO];
  149.   [label pack];
  150.   [entryMap forEach: M(pack)];
  151. }
  152. - (void)drop
  153. {
  154.   [frame drop];
  155.   [label drop];
  156.   [entryMap forEach: M(drop)];
  157.   [entryMap drop];
  158. }
  159. - Spawn: (const char *)windowName
  160. {
  161.   return self;
  162. - idReceive: (const char *)windowName
  163. {
  164.   id resObj = GUI_DRAG_AND_DROP_OBJECT ();
  165.   id obj;
  166.   id <VarProbeEntry> entry;
  167.   if (findObject (entryMap, windowName, &obj, &entry))
  168.     {
  169.       [[entry getVarProbe] setData: obj To: &resObj];
  170.       
  171.       [self update];
  172.     }
  173.   return self;
  174. }      
  175. - (const char *)package: (const char *)windowName
  176. {
  177.   id obj;
  178.   id <VarProbeEntry> entry;
  179.   if (findObject (entryMap, windowName, &obj, &entry))
  180.     {
  181.       id *content = [[entry getVarProbe] probeRaw: obj];
  182.       
  183.       if (*content == nil)
  184.         {
  185.           GUI_BEEP ();
  186.           GUI_UPDATE ();
  187.           return "";
  188.         }
  189.       return [*content getObjectName];         
  190.     }
  191.   return "";
  192. }
  193. - (const char *)getId: (const char *)windowName
  194. {
  195.   id obj;
  196.   id <VarProbeEntry> entry;
  197.   
  198.   if (findObject (entryMap, windowName, &obj, &entry))
  199.     {
  200.       const char *str = [entry getValue];
  201.       
  202.       return str;
  203.     }
  204.   return "";
  205. }
  206. @end
  207. @implementation MultiVarProbeWidget
  208. PHASE(Creating)
  209. + createBegin: aZone
  210. {
  211.   MultiVarProbeWidget *obj = [super createBegin: aZone];
  212.   obj->fieldLabelingFlag = NO;
  213.   return obj;
  214. }
  215. - setObjectList: (id <List>)l
  216. {
  217.   objectList = l;
  218.   return self;
  219. }
  220. - setProbeMap: (id <ProbeMap>)aProbeMap
  221. {
  222.   probeMap = aProbeMap;
  223.   return self;
  224. }
  225. - setFieldLabelingFlag: (BOOL)flag
  226. {
  227.   fieldLabelingFlag = flag;
  228.   return self;
  229. }
  230. - setObjectNameSelector: (SEL)sel
  231. {
  232.   objectNameSelector = sel;
  233.   return self;
  234. }
  235. - setParent: (id <Frame>)frame
  236. {
  237.   parent = frame;
  238.   
  239.   return self;
  240. }
  241. - createEnd
  242. {
  243.   id <Zone> aZone = [self getZone];
  244.   int findPosition (id <List> l, id obj)
  245.     {
  246.       id <ListIndex> li;
  247.       id lobj;
  248.       
  249.       li = [l listBegin: aZone];
  250.       while ((lobj = [li next]) != nil)
  251.         if (lobj == obj)
  252.           {
  253.             int offset = [li getOffset];
  254.             [li drop];
  255.             return offset;
  256.           }
  257.       abort ();
  258.     }
  259.   int compareObjects (id a, id b)
  260.     {
  261.       return findPosition (objectList, a) - findPosition (objectList, b);
  262.     }
  263.   int compareProbes (id a, id b)
  264.     {
  265.       BOOL aIsVarProbe = [a conformsTo: @protocol (VarProbe)];
  266.       BOOL bIsVarProbe = [b conformsTo: @protocol (VarProbe)];
  267.       int typediff = aIsVarProbe - bIsVarProbe;
  268.       if (typediff == 0)
  269.         {
  270.           if (aIsVarProbe)
  271.             return strcmp ([a getProbedVariable], [b getProbedVariable]);
  272.           else
  273.             return strcmp ([a getProbedMessage], [b getProbedMessage]);
  274.         }
  275.       return typediff;
  276.     }
  277.   objectsLabelFrame = [Frame createParent: parent];
  278.   labelMap = [Map createBegin: aZone];
  279.   [labelMap setCompareFunction: compareObjects];
  280.   labelMap = [labelMap createEnd];
  281.   if (objectNameSelector)
  282.     {
  283.       id oli = [objectList begin: aZone];
  284.       id obj;
  285.       objectsTitleLabel = [VarProbeLabel createParent: objectsLabelFrame];
  286.       [objectsTitleLabel setText: [[objectList getFirst] name]];
  287.       
  288.       while ((obj = [oli next]) != nil)
  289.         {
  290.           id <Label> label = [Label createParent: objectsLabelFrame];
  291.         
  292.           [label setText: (const char *)[obj perform: objectNameSelector]];
  293.           
  294.         [labelMap at: obj insert: label];
  295.         }
  296.       [oli drop];
  297.     }
  298.   
  299.   multiProbeMap = [Map createBegin: aZone];
  300.   [multiProbeMap setCompareFunction: compareProbes];
  301.   multiProbeMap = [multiProbeMap createEnd];
  302.   {
  303.     id pmi = [probeMap begin: aZone];
  304.     id probe;
  305.     
  306.     while ((probe = [pmi next]) != nil)
  307.       {
  308.         if ([probe conformsTo: @protocol (VarProbe)])
  309.           {
  310.             id multiProbe = [MultiProbe createBegin: aZone];
  311.             [multiProbe setLabelingFlag: fieldLabelingFlag];
  312.             [multiProbe setParent: parent];
  313.             [multiProbe setCompareFunction: compareObjects];
  314.             [multiProbe setVarProbe: probe];
  315.             multiProbe = [multiProbe createEnd];
  316.             
  317.             [multiProbe addEntries: objectList];
  318.             
  319.             [multiProbeMap at: probe insert: multiProbe];
  320.           }
  321.       }
  322.     [pmi drop];
  323.   }
  324.   [self update];
  325.   
  326.   return self;
  327. - (void)update
  328. {
  329.   [multiProbeMap forEach: M(update)];
  330.   GUI_UPDATE ();
  331. }
  332. - (void)pack 
  333. {
  334.   [objectsLabelFrame packFillLeft: NO];
  335.   [multiProbeMap forEach: M(packFillLeft)];
  336.   [objectsTitleLabel pack];
  337.   [labelMap forEach: M(pack)];
  338. }
  339. - (void)drop
  340. {
  341.   [objectsTitleLabel drop];
  342.   [labelMap forEach: M(drop)];
  343.   [multiProbeMap forEach: M(drop)];
  344.   [objectsLabelFrame drop];
  345. }  
  346. @end