
/* Generated by Interface Builder */

#import "AsciiView.h"
#import "AsciiController.h"
#import "SmsObject.h"
#import <strings.h>

@implementation AsciiView

- getTheSmsObject
{
  if (!winDelegate)
    winDelegate = [window delegate];

  if ([winDelegate respondsTo:@selector(getTheSmsObject)])
    return [winDelegate getTheSmsObject];
  else
    return NULL;
}

- initFrame:(NXRect const *)theFrame
{
    NXRect tempRect = *theFrame;
    int borderType = NX_NOBORDER;
     
    [ScrollView getContentSize:&tempRect.size forFrameSize:&theFrame->size
    		horizScroller:NO vertScroller:YES borderType:borderType];
    theTextView = [[Text alloc] initFrame:&tempRect text:NULL
   		                alignment:NX_LEFTALIGNED];
    [super initFrame:theFrame];
      /* specify scrollbars */
    [self setVertScrollerRequired:YES]; 
    [self setHorizScrollerRequired:NO];
    [self setBorderType:borderType];
    [self setDynamicScrolling:YES];
    [self setDocView:theTextView];
    [self setBackgroundGray:NX_WHITE];
    [self setAutoresizeSubviews:YES];
    [self setAutosizing:NX_WIDTHSIZABLE|NX_HEIGHTSIZABLE];
    [theTextView notifyAncestorWhenFrameChanged:YES];
    [theTextView setVertResizable:YES];
    [theTextView setHorizResizable:NO];
    [theTextView setOpaque:YES];
    [theTextView setCharFilter:NXEditorFilter];
    [theTextView setEditable:YES];
    [theTextView setSelectable:YES];
    [[theTextView superview] setAutoresizeSubviews:YES];
    [[theTextView superview] setAutosizing:NX_HEIGHTSIZABLE|NX_WIDTHSIZABLE];
    return self;
}

//-------------------------------------------------------------------
// - drawFrame: - write the ASCII representation of a frame
- copyFrame:(int)iFrame :(char *)pString
{
  id theSmsObject = [self getTheSmsObject];
  int iFirstTraj = [winDelegate getLowestTraj];
  int iLastTraj = [winDelegate getHighestTraj];
  int iTraj;
  float fFreq, fMag, fStocMag, fStocCoeff;
  char pTmpString[256];
  
  sprintf (pTmpString, "\n Frame %d (%.3f): \n ", iFrame, 
            (float) iFrame / [theSmsObject getFrameRate]); 
  strcat (pString, pTmpString);

  if ([winDelegate getDeterministicFreqState] ||
      [winDelegate getDeterministicMagState])
  {
    sprintf (pTmpString, "Deterministic: ");
    strcat (pString, pTmpString);
  }
  
  for(iTraj = iFirstTraj; iTraj < iLastTraj; iTraj++)
  {
    if ([winDelegate getDeterministicFreqState] &&
        [winDelegate getDeterministicMagState])
    {
       fFreq = [theSmsObject getDeterministicFreq:iFrame iTraj:iTraj];
       fMag = [theSmsObject getDeterministicMag:iFrame iTraj:iTraj];
       sprintf (pTmpString, "%.0f [%.0f], ", fFreq, fMag); 
       strcat (pString, pTmpString);
    }
    else if ([winDelegate getDeterministicFreqState])
    {
       fFreq = [theSmsObject getDeterministicFreq:iFrame iTraj:iTraj];
       sprintf (pTmpString, "%.0f, ", fFreq); 
       strcat (pString, pTmpString);
    }
    else if ([winDelegate getDeterministicMagState])
    {
       fMag = [theSmsObject getDeterministicMag:iFrame iTraj:iTraj];
       sprintf (pTmpString, "%.0f, ", fMag); 
       strcat (pString, pTmpString);
    }
  } 
  
  if ([winDelegate getStochasticState])
  {
    fMag = [theSmsObject getStochasticGain:iFrame];

    sprintf (pTmpString, "\n Stochastic Gain:  %.0f", fMag);
    strcat (pString, pTmpString);
  }

  return self;  
}

//-------------------------------------------------------------------
// - drawSelf:: - write the ASCII representation

- drawSelf:(const NXRect *)rects :(int)rectCount
{
  int iFrame = [winDelegate getFirstFrame];
  int iLastFrame = [winDelegate getLastFrame];
  id theSmsObject = [self getTheSmsObject];
  char pString[100000];
  
  NXEraseRect(&bounds);

  if (theSmsObject != NULL)
  {
    while(iFrame <= iLastFrame)
    {
      [self copyFrame:iFrame :pString];
      iFrame++;
    }
    [theTextView setText:pString];
  }
  return self;
}


@end
