Thread View: comp.sources.mac
1 messages
1 total messages
Started by rlong
Sat, 06 Jun 1987 18:00
SimpleTools2 Demos Source
Author: rlong
Date: Sat, 06 Jun 1987 18:00
Date: Sat, 06 Jun 1987 18:00
498 lines
16798 bytes
16798 bytes
[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 *)(<Gray); 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
---
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads