This is StatusTics.m in view mode; [Download] [Up]
/*
* Copyright (C) 1993 Robert Davis
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of Version 2, or any later version, of
* the GNU General Public License as published by the Free Software
* Foundation.
*/
static char RCSId[]="$Id: StatusTics.m,v 1.4 1993/05/04 16:22:53 davis Exp $";
#import <stdlib.h>
#import "DoubleValueSortedList.h"
#import "StatusTics.h"
#import "TicObject.h"
/* structs from plot.h */
struct ticdef {
int type; /* one of three constants */
union {
struct { /* for TIC_SERIES */
double start, incr;
double end;
} series;
struct ticmark *user; /* for TIC_USER */
} def;
};
struct ticmark {
double position; /* where on axis is this */
char *label; /* optional string label */
struct ticmark *next; /* linked list */
};
extern int tic_in; /* s_tics_in */
extern int xtics, ytics, ztics; /* s_ticsCoord[] */
extern struct ticdef xticdef; /* s_ticdefCoord[] */
extern struct ticdef yticdef;
extern struct ticdef zticdef;
/*
* Frees the list of ticmarks whose head is pointed to by t and sets
* t to NULL.
*/
static void _freeLinkedList(struct ticmark **t)
{
struct ticmark *cur;
while (*t) {
cur = *t;
*t = (*t)->next;
free (cur);
}
*t = NULL;
return;
}
@implementation Status (Tics)
- initTics
{
int counter;
for (counter = 0 ; counter < 3 ; counter++)
ticDefs[counter] = nil;
return self;
}
- freeTics
{
int counter;
for (counter = 0 ; counter < 3 ; counter++)
if (ticDefs[counter])
[[ticDefs[counter] freeObjects] free];
return self;
}
- resetCurrentTics
{
int counter;
for (counter = 0 ; counter < 3 ; counter++) {
s_ticsCoord[counter] = 1;
s_ticTypeCoord[counter] = TIC_COMPUTED;
s_ticSeriesCoord[counter].start = -10.0;
s_ticSeriesCoord[counter].incr = 5.0;
s_ticSeriesCoord[counter].end = 10.0;
if (ticDefs[counter])
[ticDefs[counter] freeObjects];
else
ticDefs[counter] = [[DoubleValueSortedList allocFromZone:zone]
init];
}
s_tics_in = YES;
return self;
}
- applyCurrentTics
{
int count;
struct ticmark *new;
id tic;
struct ticdef *ticd[3] = {&xticdef, &yticdef, &zticdef};
int i;
tic_in = s_tics_in;
xtics = s_ticsCoord[X_TAG];
ytics = s_ticsCoord[Y_TAG];
ztics = s_ticsCoord[Z_TAG];
for (i = 0; i <= 2; i++) {
switch (s_ticTypeCoord[i]) {
case TIC_SERIES:
ticd[i]->def.series.start = s_ticSeriesCoord[i].start;
ticd[i]->def.series.incr = s_ticSeriesCoord[i].incr;
ticd[i]->def.series.end = s_ticSeriesCoord[i].end;
break;
case TIC_USER:
if (ticd[i]->type == TIC_USER)
_freeLinkedList (&(ticd[i]->def.user));
else
ticd[i]->def.user = NULL;
if ((count = [ticDefs[i] count] - 1) >= 0) {
new = ticd[i]->def.user = malloc (sizeof (struct ticmark));
while (count >= 0) {
new->position = [tic = [ticDefs[i] objectAt:count]
doubleValue];
new->label = (char *) [tic stringValue];
if (count--) {
new->next = malloc (sizeof (struct ticmark));
new = new->next;
} else
new->next = NULL;
}
break;
}
}
ticd[i]->type = s_ticTypeCoord[i];
}
return self;
}
- grabCurrentTics
{
int count, t;
struct ticmark *cur;
id tic;
struct ticdef *ticd[3] = {&xticdef, &yticdef, &zticdef};
int i;
s_tics_in = tic_in;
s_ticsCoord[X_TAG] = xtics;
s_ticsCoord[Y_TAG] = ytics;
s_ticsCoord[Z_TAG] = ztics;
for (i = 0; i <= 2; i++) {
switch (s_ticTypeCoord[i] = ticd[i]->type) {
case TIC_SERIES:
s_ticSeriesCoord[i].start = ticd[i]->def.series.start;
s_ticSeriesCoord[i].incr = ticd[i]->def.series.incr;
s_ticSeriesCoord[i].end = ticd[i]->def.series.end;
break;
case TIC_USER:
count = [ticDefs[i] count] - 1;
t = 0;
for (cur = ticd[i]->def.user ; cur != NULL ; cur = cur->next) {
if (t <= count) {
[tic = [ticDefs[i] objectAt:t]
setDoubleValue:cur->position];
[tic setStringValue:cur->label];
} else {
TicObject *tobj = [[TicObject allocFromZone:zone]
initFromString:cur->label
doubleValue:cur->position];
if ([ticDefs[i] addObjectIfDoubleAbsent:tobj]
== NX_NOT_IN_LIST)
[tobj free];
}
t++;
}
break;
}
}
return self;
}
- setTicsIn:(BOOL) cond
{
if (s_tics_in != cond) {
s_tics_in = cond;
[self reportSettingsChange:self];
}
return self;
}
- (BOOL) ticsIn
{
return s_tics_in;
}
- setTicsCoord:(int)coord isOn:(BOOL)isOn
{
if (s_ticsCoord[coord] != isOn) {
s_ticsCoord[coord] = isOn;
[self reportSettingsChange:self];
}
return self;
}
- (BOOL) ticsCoord:(int)coord
{
return s_ticsCoord[coord];
}
- setTicTypeCoord:(int)coord to:(int)anInt
{
if (s_ticTypeCoord[coord] != anInt) {
s_ticTypeCoord[coord] = anInt;
[self reportSettingsChange:self];
}
return self;
}
- (int)ticTypeCoord:(int)coord
{
return s_ticTypeCoord[coord];
}
- setTicStartCoord:(int)coord to:(double)aDouble
{
if (s_ticSeriesCoord[coord].start != aDouble) {
s_ticSeriesCoord[coord].start = aDouble;
[self reportSettingsChange:self];
}
return self;
}
- (double)ticStartCoord:(int)coord
{
return s_ticSeriesCoord[coord].start;
}
- setTicEndCoord:(int)coord to:(double)aDouble
{
if (s_ticSeriesCoord[coord].end != aDouble) {
s_ticSeriesCoord[coord].end = aDouble;
[self reportSettingsChange:self];
}
return self;
}
- (double)ticEndCoord:(int)coord
{
return s_ticSeriesCoord[coord].end;
}
- setTicIncrementCoord:(int)coord to:(double)aDouble
{
if (s_ticSeriesCoord[coord].incr != aDouble) {
s_ticSeriesCoord[coord].incr = aDouble;
[self reportSettingsChange:self];
}
return self;
}
- (double)ticIncrementCoord:(int)coord
{
return s_ticSeriesCoord[coord].incr;
}
- (DoubleValueSortedList *)ticDefsCoord:(int)coord
{
return ticDefs[coord];
}
// Shuts up compiler
- (const char *) rcsid
{
return RCSId;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.