[comp.sources.mac] SimpleTools2 Demos Source

rlong@felix.UUCP (06/06/87)

[SimpleTools2 Demos Source]

---
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	LittleDemo.c
#	SimpleDemo.c
sed 's/^X//' << 'SHAR_EOF' > LittleDemo.c
X
X/*  This is a very simple demonstration of a complete application
X    using SimpleTools.
X    
X    Link this file with SimpleTools.o
X    (SimpleTools.o is created by compiling SimpleTools.c)
X */
X 
X#include "simple.h"		/* SimpleTools header file	*/
X
X#ifdef MEGAMAX
X  #include <qd.h>		/* Quickdraw header file	*/
X#endif
X
X#ifdef LIGHTSPEED
X  #include <Quickdraw.h>
X#endif
X
Xgotbeep ()			/* to be executed when beep is picked */
X{
X  SysBeep (10);
X}
X
Xinwindow (x, y)			/* executed when click in our window */
Xint x, y;
X{
X  Point m, lm;
X  MoveTo (x, y);		/* draw a Point where the mouse is */
X  LineTo (x, y);
X  #ifdef MEGAMAX
X    lm.a.h = x; lm.a.v = y;
X    while (StillDown()) {	/* and keep drawing like a pencil  */
X      GetMouse (&m);		/* but only when the mouse moves   */
X      if ((m.a.h != lm.a.h) || (m.a.v != lm.a.v)) {
X        LineTo (m.a.h, m.a.v);
X        lm = m;
X      }
X    }
X  #else
X    lm.h = x; lm.v = y;
X    while (StillDown()) {	/* and keep drawing like a pencil  */
X      GetMouse (&m);		/* but only when the mouse moves   */
X      if ((m.h != lm.h) || (m.v != lm.v)) {
X        LineTo (m.h, m.v);
X        lm = m;
X      }
X    }
X  #endif
X}
X
Xredraw ()			/* to redraw our window */
X{
X  MoveTo (50, 50);		/* draw a box the hard way */
X  LineTo (50, 100);
X  LineTo (100, 100);
X  LineTo (100, 50);
X  LineTo (50, 50);
X}
X
Xno_edit ()			/* turn off edit menu (on activation) */
X{
X  menu ("Edit", "", itemdisable);
X}
X
Xyes_edit ()			/* turn on edit menu (on deactivation) */
X{
X  menu ("Edit", "", itemenable);
X}
X
Xaboutme()			/* About message */
X{
X  message ("LittleDemo\rSimpleTools demonstration\rBy Erik Kilk");
X}
X
Xsetup ()			/* Setup the menus and windows */
X{
X  menu (applestring, "About LittleDemo...", aboutme);
X  				/* Default About is disabled */
X  menu (applestring, "About LittleDemo...", itemenable);
X  menu ("File", "Beep", gotbeep);
X  simplequits ();
X  window ("LittleDemo", 20, 50, 490, 325, 
X  	no_edit, yes_edit, redraw, inwindow);
X}
X
Xmain ()
X{
X  simpletools ("About LittleDemo...");	/* Initialize SimpleTools	*/
X  setup ();				/* Install our menus and window */
X  for (;;) simpleevents ();		/* Handle all events		*/
X}
SHAR_EOF
sed 's/^X//' << 'SHAR_EOF' > SimpleDemo.c
X
X/*
X	Title	: SimpleDemo.c
X	Author	: Erik Kilk
X	Date	: June 9, 1985
X	Revised	: July 17, 1985, November 1986
X	
X	Synopsis: A demonstration of the use of SimpleTools with 
X		other toolbox calls.  This demonstrates a very 
X		advanced use of SimpleTools.  I've always disliked
X		being given simple examples.  So, this example 
X		uses many, many optional features of SimpleTools and
X		shows how you can use the standard toolbox calls.
X		
X	The SimpleTools routines are being freely distributed.
X	You may use them, distribute your applications which use them,
X	and copy them if you send $20 or more to:
X	
X			Erik Kilk
X			4949 Snyder Lane, #247
X			Rohnert Park,  CA  94928
X			
X	Link this demonstration program with SimpleTools.
X		
X*/
X
X/*********************************/
X/*  DEFINITIONS FOR SIMPLETOOLS  */
X/*********************************/
X
X#include "simple.h"
X
X
X/*******************************/
X/*  INCLUDE FILES FOR TOOLBOX  */
X/*******************************/
X
X#ifdef MEGAMAX
X  #include <qd.h>
X  #include <event.h>
X  #include <mem.h>
X  #include <font.h>
X  #include <qdvars.h>
X  #include <misc.h>
X  #include <win.h>
X  #include <string.h>
X  #include <stdio.h>
X  #define TRUE (-1)			/* Common boolean constants */
X  #define FALSE 0
X#else
X  #include <Quickdraw.h>
X  #include <EventMgr.h>
X  #include <MemoryMgr.h>
X  #include <fontMgr.h>
X  #include <WindowMgr.h>
X  #include <strings.h>
X  #include <stdio.h>
X#endif
X
X/**********************/
X/*  GLOBAL VARIABLES  */
X/**********************/
X
Xint circspeed = 50;		/* rate of drawing new circles */
Xint ourpensize = 1;		/* global pen size instead of windows */
XRect drag;			/* for moving our free mem manually */
Xchar name[100];
Xchar outstring[100];
X
X
X/*********************/
X/*   Odds and Ends   */
X/*********************/
X
Xnop() 				/* Attached as a null pointer */
X{
X}			
X
X/***********************/
X/*  Sketch Window      */
X/***********************/
X
Xsketactivate()			/* Attached to sketch's activate */
X{				/* Disable the whole sketch menu */
X  menu ("Sketch", "", itemenable);
X  menu ("Edit", "Clear", home);  /* put our clear routine into place */
X}
X	
Xsketdeactivate()		/* Attached to sketch's deactivate */
X{				/* Enable the whole sketch menu */
X  menu ("Sketch", "", itemdisable);
X  menu ("Edit", "Clear", nop);	/* take off our clear routine */
X}
X
Xsketch(x,y)			/* follow mouse while it's down */
Xint x,y;			/* we will get passed the mouse Point */
X{
X  Point xy, lastxy;		/* points of interest */
X  WindowPtr ourport;
X  
X  GetPort (&ourport);
X  PenSize (ourpensize, ourpensize);
X  MoveTo (x, y);		/* position pen at mouse down Point */
X  while ( StillDown() ) {	/* while the Button is pressed */
X    GetMouse (&xy);		/* read the mouse position */
X    #ifdef MEGAMAX
X    if ( (xy.a.v != lastxy.a.v) || (xy.a.h != lastxy.a.h) ) {
X      LineTo (xy.a.h, xy.a.v);	/* if mouse moved, draw a Line to it */
X      lastxy.a.v = xy.a.v;	/* record position so we can detect */
X      lastxy.a.h = xy.a.h;	/*   a Move. */
X    }				/* could runruns here to have circles */
X    #else
X    if ( (xy.v != lastxy.v) || (xy.h != lastxy.h) ) {
X      LineTo (xy.h, xy.v);	/* if mouse moved, draw a Line to it */
X      lastxy.v = xy.v;		/* record position so we can detect */
X      lastxy.h = xy.h;		/*   a Move. */
X    }				/* could runruns here to have circles */
X    #endif
X	runruns(0L);
X	SetPort (ourport);
X  }
X}
X    
Xsetpensize(size)		/* Attached to pen size menus */
Xchar *size;			/* menu Item name given to us */
X{
X  static char lastsize[5]={'1','\0'};	/* keep last setting */
X  menu ("Sketch", lastsize, itemuncheck);	/* remove old check mark */
X  menu ("Sketch", size, itemcheck);	/* install a new check mark */
X  strcpy (lastsize, size);	/* save size for the next setpensize */
X  ourpensize = *size - '0';		/* convert to a number */
X}
X
X/**************************/
X/*   The Circles Window   */
X/**************************/
X
Xint newabs(x)			/* an absolute value funtion */
Xint x;
X{
X  if (x < 0)
X    x = -x;
X  return (x);
X}
X
Xcircles()			/* draw a Random sized circle */
X{
X  static WindowPtr wind = (WindowPtr) 0; /* keep "circle" WindowPtr */
X  static int speed = 1;		/* current count between new circles */
X  register int cx, cy;		/* center of the circle */
X  int r, b, rd;			/* right and bottom edges */
X  register Pattern *color;	/* color for the circle */
X  Rect therect;			/* rectangle to draw circle in */
X  if ( --speed == 0) {		/* count, and if it reaches zero... */
X    speed = circspeed;		/* reset the count */
X    if ((long)wind == 0L) 	/* get window pointer if we need */
X      wind = windowpoint ("Circles");  /* save window for next time */
X    SetPort (wind);		/* set output to the circle window */
X    #ifdef MEGAMAX
X      r = wind->portRect.a.right;	/* get current size of window */
X      b = wind->portRect.a.bottom;
X    #else
X      r = wind->portRect.right;	/* get current size of window */
X      b = wind->portRect.bottom;
X    #endif
X    cx = newabs(Random()) % (r-30) + 1;	/* pick a Random location */
X    cy = newabs(Random()) % (b-30) + 1;
X    rd = newabs(Random()) % 25 + 5;		/* and size */
X    SetRect ( &therect, cx, cy, cx+rd, cy+rd);	/* make a rectangle */
X    switch ( newabs(Random()) % 4) {		/* pick a color */
X      case 0: color = (Pattern *)(&dkGray); break;
X      case 1: color = (Pattern *)(&ltGray); break;
X      case 2: color = (Pattern *)(&gray); break;
X      case 3: color = (Pattern *)(&black); break;
X    }
X    FillOval ( &therect, color);	/* make the circle */
X  }
X}
X
Xsetspeed(name)				/* attached to circle's menu */
Xchar *name;
X{
X  menu ("Circles","Slow/S", itemuncheck);	/* another way to uncheck last */
X  menu ("Circles","Medium/M", itemuncheck); /* just uncheck everything */
X  menu ("Circles","Fast/F", itemuncheck);
X  menu ("Circles", name, itemcheck);	/* then check the current  */
X  if (strcmp("Slow/S", name) ==0) circspeed = 100;  /* set the reset count */
X  else if (strcmp("Medium/M", name) ==0) circspeed = 50;
X  else if (strcmp("Fast/F", name) ==0) circspeed = 1;
X}
X
X/***********************************************/
X/*   Generate a new sketch window by command   */
X/***********************************************/
X
Xnwindow()			/* command to attatch to new window menu */
X{
X  static topplace = 100;	/* remember where to put next window */
X  char newname[255];		/* string storage for window's name */
X  strcpy (newname, "New Window");	/* default window name */
Xretry:				/* prompt for the name from user */
X  if (prompt ("Give me a unique name for the new window:", newname)) {
X    if ( (long)windowpoint(newname) != 0L ) {
X      if (message ("Sorry, a window by that name already exists.")) 
X        goto retry;		/* if exists, ask for another name */
X    } else {
X      if ( strlen(newname) > 0)  {  /* if ok, make the new window */
X        /* then it is new */
X        window (newname, 20,topplace, 200,topplace+60, 
X	  sketactivate, sketdeactivate, nop, sketch);
X        topplace += 5;		/* adjust top for next new window */
X        if (topplace > 300) topplace = 100;  /* reset top if too low */
X      }
X    }
X  }
X}
X
X/**********************/
X/*  About SimpleDemo  */
X/**********************/
X
Xusageinfo()		/* messages for Usage Info menu choice */
X{
X  char mess[255];	/* string to form a message */
X  strcpy (mess,"You may use, distribute your programs which use, ");
X  strcat (mess,"and copy SimpleTools if you send ");
X  strcat (mess,"$20 or more to ...");
X  if (message (mess)) {  /* if OK pressed for first message */
X    strcpy (mess, "Erik Kilk\r4949 Snyder Lane, #247\r");
X    strcat (mess, "Rohnert Park, CA  94928");
X    if (message (mess))  /* if OK pressed for 2nd message */
X      message ("Thank you for your support.");  /* show final message */
X  }
X}
X
Xtellabout()		/* for the About SimpleDemo menu choice */
X{
X  char mess[255];	/* string to form a message */
X  strcpy (mess,"SimpleDemo -- Copyright 1986 Erik Kilk\r");
X  strcat (mess,"A demonstration of the use of SimpleTools");
X  strcat (mess," as a Macintosh toolbox aid.");
X  if (message (mess))	/* display the string in a dialog */
X    usageinfo();
X}
X  
X/**************************/
X/* The free memory window */
X/**************************/
X
Xwritemem(forsure)			/* write the FreeMem value */
Xint forsure;				/* true if force write */
X{					/* false if only on change */
X  static long lastmem;
X  long mem;
X  int foo;
X  char thestring[10], outstr[10];
X  Rect erasearea;
X  mem = FreeMem();			/* get new free memory */
X  foo = mem != lastmem;			/* compare it to last reading */
X  if ( forsure | foo ) {		/* if forsure or different */
X    withwindow ("FreeMem");		/* set window for output */
X    home();
X    MoveTo (0, 12);			/* write new value */
X    NumToString (mem, thestring);
X    #ifndef MEGAMAX
X      PtoCstr (thestring);
X    #endif
X    strcpy (outstr, " Free ");
X    strcat (outstr, thestring);
X    #ifndef MEGAMAX
X      CtoPstr (outstr);
X    #endif
X    DrawString (outstr);
X    lastmem = mem;			/* record this for next time */
X  }
X}
X
Xshowmem(windp)				/* write FreeMem on an update */
XWindowPtr windp;
X{
X  EndUpdate (windp);			/* allow use of entire window */
X  writemem(TRUE);			/* clear and write new value */
X  BeginUpdate (windp);
X}
X
Xnewmemvalue()				/* write FreeMem occasionally */
X{
X  writemem(FALSE);			/* write only if value changed */
X}
X
X/* This is a special, non-standard, method of moving a window.  Our
X   free memory window does not have a title bar.  So, I have decided
X   to allow it to be moved if the mouse is clicked in its content
X   Region.  This routine is attached to the free memory in content
X   procedure with SimpleTools.  SimpleTools convenienly gives us
X   various parameters, here we need the window pointer and the event
X   record.  The event record has the coordinates of the mouse in
X   globals */
X   
Xmovemem(x,y,windp,event)	/* free mem's inContent procedure */
Xint x,y;			/* SimpleTools gives us these for */
XWindowPtr windp;		/* an in-content procedure */
XEventRecord *event;
X{
X  #ifdef MEGAMAX
X  	DragWindow (windp, &(event->where), &drag);
X  #else
X  	DragWindow (windp, event->where, &drag);
X  #endif
X}
X
X/************************/
X/*   Question window    */
X/************************/
X
Xquest_update ()				/* repaint question window	*/
X{
X    stgotoxy (0, 0);			/* top left corner textwise	*/
X    strcpy (outstring, "Hello, ");
X    strcat (outstring, name);
X    #ifndef MEGAMAX
X    	CtoPstr(outstring);
X    #endif
X    DrawString(outstring);
X}
X
Xquest_getname ()			/* get a name in quest window	*/
X{
X    getlinecaps = TRUE;			/* force each word to be cap'd	*/
X    showawindow ("Questions");		/* make window active		*/
X    quest_update ();
X    stgotoxy (0, 2);			/* 3rd row, far left textwise	*/
X    strcpy (outstring,"What is your name? ");  
X    #ifndef MEGAMAX
X    	CtoPstr (outstring);
X    #endif
X    DrawString (outstring);
X    getline ("", name);			/* ask for name of user		*/
X    home ();				/* erase the window		*/
X    quest_update ();			/* repaint the window		*/
X}
X
X/**********************/
X/*   Initialization   */
X/**********************/
X
Xsetup()		/* to be called with Start Demo menu choice */
X{
X  int temp;
X  strcpy (name, "World");
X  SetRect (&drag, 4, 24, 508, 338);  /* drag area for free mem window */
X  windmenu = FALSE;	/* modify default values, optional */
X  dogoaway = FALSE;	/* optional change */
X  window("Circles", 20, 55, 245, 315,nop, nop, nop, nop); /* circles */
X  temp = wprocid;	/* save value for an optional change */
X  wprocid = 3; 		/* optional change to set to altDBoxProc */
X  window ("FreeMem", 407, 322, 502, 337, nop, nop, showmem, movemem);
X  wprocid = temp;	/* return to defaults */
X  windmenu = TRUE;	
X  dogoaway = TRUE;
X  window ("Sketch", 265, 55, 490, 315,sketactivate,sketdeactivate, 
X  	nop, sketch);	/* display the sketch pad window */
X  window ("Questions", 146, 276, 368, 337, nop, nop, quest_update, nop);
X  menu ( applestring, "About SimpleDemo", tellabout);
X  menu ( applestring, "About SimpleDemo", itemenable);
X  menu ( "File", "New", nwindow);		/* setup File menu */
X  menu ( "File", "New", itemenable);
X  menu ( "File", "Set Name", quest_getname);
X  simplequits ();				/* Transfer and Quit	*/
X  menu ("Circles", "Speed", itemdisable);	/* install circles menu */
X  menu ("Circles", "Slow/S", setspeed);		/* optional key equivs */
X  menu ("Circles", "Medium/M", setspeed);
X  menu ("Circles", "Fast/F", setspeed);
X  menu ("Circles", "Medium/M", itemcheck);
X  menu ("Sketch", "Pen Size", itemdisable);  /* install sketches menu */
X  menu ("Sketch", "", itemdisable);
X  menu ("Sketch", "1", setpensize);
X  menu ("Sketch", "1", itemcheck);
X  menu ("Sketch", "2", setpensize);
X  menu ("Sketch", "3", setpensize);
X  menu ("Sketch", "4", setpensize);
X  menu ("Sketch", "5", setpensize);
X  menu ("Sketch", "6", setpensize);
X  run (circles);		/* keep drawing circles */
X  run (newmemvalue);		/* check if mem changed occasionally */
X}
X
Xmain()
X{
X  simpletools("About SimpleDemo");	/* setup Apple and Edit menus */
X  setup();				/* setup our program */
X  for (;;) simpleevents();		/* process events */
X}
SHAR_EOF
exit
---