home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1995 August / NEBULA.mdf / SourceCode / NMK / Historian / Historian.m < prev    next >
Encoding:
Text File  |  1993-01-18  |  5.2 KB  |  324 lines

  1. /***** Historian.m -- recorded data browser object implementation
  2.     NeXTstep Measurement Kit
  3.     by Alex Meyer <ameyer@phoenix.Princeton.EDU>
  4.     for computer science senior thesis
  5.     17 April 1992 -- created
  6.     22 April 1992 -- incorporated structs.h & added more types
  7.         utilized identify messages & centralized filename extension
  8.     25 April 1992 -- hid presenter only when necessary to avoid flicker
  9. *****/
  10.  
  11. #import <stdio.h>
  12. #import <string.h>
  13. #import <appkit/NXBrowserCell.h>
  14. #import <appkit/OpenPanel.h>
  15. #import "Historian.h"
  16.  
  17. @implementation Historian
  18.  
  19. - hideVisible
  20. {
  21.     if (visPresent) {
  22.         [visPresent hide:self];
  23.         visPresent = nil;
  24.     }
  25.     return (self);
  26. }
  27.  
  28. - buildHierarchy
  29. {
  30.     unsigned i,num;
  31.  
  32.     num = [manager numRecords];
  33.     for (i = 0;i < num;++i) {
  34.         id store;
  35.         tmRec rec;
  36.  
  37.         [manager copyRecordIndex:i
  38.             into:&rec];
  39.         store = indices[rec.type];
  40.         [store addElement:&i];
  41.     }
  42.     return (self);
  43. }
  44.  
  45.  
  46. - destroyHierarchy
  47. {
  48.     int i;
  49.  
  50.     for (i = 1;i < TM_NUM;++i)
  51.         [indices[i] empty];
  52.     return (self);
  53. }
  54.  
  55.  
  56. - selectType:(NXAtom)key
  57. {
  58.     int i;
  59.  
  60.     type = TM_ERR;
  61.     for (i = 1;i < TM_NUM;++i)
  62.         if (key == [presenters[i] identify])
  63.             type = i;
  64.     return (self);
  65. }
  66.  
  67.  
  68. - selectRecord:(NXAtom)key
  69. {
  70.     if (type != TM_ERR) {
  71.         BOOL res;
  72.         unsigned ind;
  73.  
  74.         res = [manager findIndex:&ind
  75.             ofKey:key
  76.             andType:type];
  77.         if (res) {
  78.             index = ind;
  79.             visPresent = presenters[type];
  80.             [visPresent showData:self];
  81.             return (self);
  82.         }
  83.     }
  84.     return (nil);
  85. }
  86.  
  87.  
  88. - determineType
  89. {
  90.     int col;
  91.  
  92.     col = [browser selectedColumn];
  93.     if (col == 0) {
  94.         id matrix,cell;
  95.         NXAtom key;
  96.  
  97.         matrix = [browser matrixInColumn:0];
  98.         cell = [matrix selectedCell];
  99.         key = NXUniqueString([cell stringValue]);
  100.         [self selectType:key];
  101.     }
  102.     return (self);
  103. }
  104.  
  105.  
  106. - (BOOL)openFilename:(const char *)fname
  107. {
  108.     id res;
  109.  
  110.     if (opened)
  111.         return (NO);
  112.     [manager setFile:NXUniqueString(fname)];
  113.     res = [manager load];
  114.     if (res) {
  115.         [self buildHierarchy];
  116.         opened = YES;
  117.         type = TM_ERR;
  118.         [window setTitleAsFilename:fname];
  119.         [openMenuCell setEnabled:NO];
  120.         [closeMenuCell setEnabled:YES];
  121.         [browser loadColumnZero];
  122.         return (YES);
  123.     }
  124.     [manager close];
  125.     return (NO);
  126. }
  127.  
  128.  
  129. - (int)app:sender
  130.     openFile:(const char *)filename
  131.     type:(const char *)aType
  132. {
  133.     BOOL res;
  134.  
  135.     if (strcmp(aType,FILEEXT))
  136.         return (NO);
  137.     res = [self openFilename:filename];
  138.     return (res);
  139. }
  140.  
  141.  
  142. - (BOOL)appAcceptsAnotherFile:sender
  143. {
  144.     return (!(opened));
  145. }
  146.  
  147.  
  148. - appWillInit:sender
  149. {
  150.     int i;
  151.  
  152.     manager = [TranscriptManager alloc];
  153.     [manager init];
  154.     indices[TM_ERR] = nil;
  155.     for (i = 1;i < TM_NUM;++i) {
  156.         indices[i] = [Storage alloc];
  157.         [indices[i] initCount:0
  158.             elementSize:sizeof(unsigned)
  159.             description:NULL];
  160.     }
  161.     presenters[TM_ERR] = nil;
  162.     presenters[TM_BUTTON] = [ButtonPresenter new];
  163.     presenters[TM_SLIDER] = [SliderPresenter new];
  164.     presenters[TM_SCROLLER] = [ScrollerPresenter new];
  165.     presenters[TM_MENU] = [MenuPresenter new];
  166.     visPresent = nil;
  167.     opened = NO;
  168.     type = TM_ERR;
  169.     return (self);
  170. }
  171.  
  172.  
  173. - appWillTerminate:sender
  174. {
  175.     int i;
  176.  
  177.     [self hideVisible];
  178.     for (i = 1;i < TM_NUM;++i)
  179.         [indices[i] free];
  180.     /* should try to free presenters too */
  181.     [manager free];
  182.     return (self);
  183. }
  184.  
  185.  
  186. - (int)browser:sender
  187.     fillMatrix:matrix
  188.     inColumn:(int)column
  189. {
  190.     id cell;
  191.     int rows,cols;
  192.  
  193.     if (!(opened))
  194.         return (0);
  195.     if (column == 0) {
  196.         int i;
  197.         NXAtom key;
  198.  
  199.         for (i = 1;i < TM_NUM;++i) {
  200.             [matrix addRow];
  201.             [matrix getNumRows:&rows
  202.                 numCols:&cols];
  203.             cell = [matrix cellAt:rows - 1
  204.                 :0];
  205.             key = [presenters[i] identify];
  206.             [cell setStringValue:key];
  207.             [cell setLoaded:YES];
  208.             [cell setLeaf:NO];
  209.         }
  210.         return (TM_NUM - 1);
  211.     }
  212.     else {
  213.         id store;
  214.         unsigned i,num;
  215.  
  216.         [self determineType];    /* because of oddity in NXBrowser */
  217.         store = indices[type];
  218.         num = [store count];
  219.         for (i = 0;i < num;++i) {
  220.             tmRec rec;
  221.             unsigned *Ind;
  222.  
  223.             Ind = [store elementAt:i];
  224.             [manager copyRecordIndex:*Ind
  225.                 into:&rec];
  226.             [matrix addRow];
  227.             [matrix getNumRows:&rows
  228.                 numCols:&cols];
  229.             cell = [matrix cellAt:rows - 1
  230.                 :0];
  231.             [cell setStringValue:rec.key];
  232.             [cell setLoaded:YES];
  233.             [cell setLeaf:YES];
  234.         }
  235.         return (num);
  236.     }
  237. }
  238.  
  239.  
  240. - cellSelected:sender
  241. {
  242.     int col;
  243.  
  244.     col = [browser selectedColumn];
  245.     if (col >= 0) {
  246.         id matrix,cell;
  247.         NXAtom key;
  248.  
  249.         matrix = [browser matrixInColumn:col];
  250.         cell = [matrix selectedCell];
  251.         key = NXUniqueString([cell stringValue]);
  252.         if (col == 0) {
  253.             [self hideVisible];
  254.             [self selectType:key];
  255.         }
  256.         else
  257.             [self selectRecord:key];
  258.     }
  259.     return (self);
  260. }
  261.  
  262.  
  263. - openDoc:sender
  264. {
  265.     id panel;
  266.     int succ;
  267.     char *fileType;
  268.     char *dir;
  269.     char **fileList;
  270.     char temp[512];
  271.     char *typeList[2];
  272.  
  273.     panel = [OpenPanel new];
  274.     [panel allowMultipleFiles:NO];
  275.     fileType = FILEEXT;
  276.     typeList[0] = fileType;
  277.     typeList[1] = NULL;
  278.     succ = [panel runModalForTypes:typeList];
  279.     if (succ) {
  280.         fileList = [panel filenames];
  281.         dir = [panel directory];
  282.         sprintf(temp,"%s/%s",dir,*fileList);
  283.         [self openFilename:temp];
  284.     }
  285.     return (self);
  286. }
  287.  
  288.  
  289. - closeDoc:sender
  290. {
  291.     [self hideVisible];
  292.     [manager close];
  293.     [self destroyHierarchy];
  294.     opened = NO;
  295.     type = TM_ERR;
  296.     [window setTitle:"Historian"];
  297.     [openMenuCell setEnabled:YES];
  298.     [closeMenuCell setEnabled:NO];
  299.     [browser loadColumnZero];
  300.     return (self);
  301. }
  302.  
  303.  
  304. - copyDataTo:(void *)dst;
  305. {
  306.     tmRec rec;
  307.     [manager copyRecordIndex:index
  308.         into:&rec];
  309.     memcpy(dst,rec.Stats,rec.statsSize);
  310.     return (self);
  311. }
  312.  
  313.  
  314. - (NXAtom)getKey
  315. {
  316.     tmRec rec;
  317.  
  318.     [manager copyRecordIndex:index
  319.         into:&rec];
  320.     return (rec.key);
  321. }
  322.  
  323. @end
  324.