home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
594a.lha
/
maker_v0.1
/
maker.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-18
|
12KB
|
590 lines
#define MAIN //this tells global.h to declare globals, rather than making them externs
#include "global.h"
#include <libraries/asl.h>
#include <graphics/gfxmacros.h>
#include <intuition/gadgetclass.h>
#include <exec/memory.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/asl.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/layers.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZEBOX_X 8
#define SIZEBOX_Y 6
Point minRectSize = { 5, 5 },
maxRectSize = { 1000, 1000 };
void main()
{
IntuiMessage *message;
BOOL done = FALSE;
USHORT code;
Gadget *gadgetPtr;
ULONG class;
Point mousePt;
TimeStamp timeStamp;
init();
while (!done)
{
Wait(1 << gWindPtr->UserPort->mp_SigBit);
while (message = GT_GetIMsg( gWindPtr->UserPort ))
{
class = message->Class;
code = message->Code;
mousePt.x = message->MouseX;
mousePt.y = message->MouseY;
timeStamp.seconds = message->Seconds;
timeStamp.micros = message->Micros;
if (class == GADGETUP || class == GADGETDOWN)
gadgetPtr = (Gadget *) message->IAddress;
GT_ReplyIMsg(message);
switch(class)
{
case IDCMP_MOUSEBUTTONS:
DoMouse(&mousePt, code, &timeStamp);
break;
case IDCMP_GADGETUP:
DoGadget(gadgetPtr, code);
break;
case IDCMP_MENUPICK:
DoMenu(code);
break;
case IDCMP_CLOSEWINDOW:
done = TRUE;
break;
case IDCMP_VANILLAKEY:
DoKey(code);
break;
case IDCMP_RAWKEY:
break;
case IDCMP_NEWSIZE:
SetClip();
ReDraw();
break;
}
}
}
quit("Normal Termination\n");
}
void DoGadget(Gadget *gadgetPtr, USHORT code)
{
GadgetObj *objPtr = gadgetPtr->UserData;
if (!objPtr)
return;
switch(objPtr->type)
{
case OTYPE_Cycle:
// GT_SetGadgetAttrs(gadgetPtr, gWindPtr, 0L,
// GTCY_Active, ( (CycleObj *) objPtr)->tempValue,
// TAG_DONE);
break;
}
}
/* ===================================================================================== */
void DoKey(USHORT code)
{
switch (code)
{
case KEYCODE_Delete:
case KEYCODE_BackSpace:
if (gSelObj)
{
DisposeObj(gSelObj);
gSelObj = 0L;
ReDraw();
}
break;
default:
printf("got key code %d\n", code);
break;
}
}
/* ===================================================================================== */
void DoMouse(Point *mousePt, USHORT code, TimeStamp *timeStamp)
{
LinkNode *nodePtr,
*oldSelObj = gSelObj;
Rect sizeRect;
BOOL changedFlag = FALSE;
if (code != SELECTDOWN)
return;
// Erase the current selection rectangle
if (gSelObj)
SelectObj(gSelObj);
gSelObj = 0L;
nodePtr = FindObj(mousePt);
if (nodePtr)
{
sizeRect = nodePtr->rect;
sizeRect.minX = sizeRect.maxX - SIZEBOX_X;
sizeRect.minY = sizeRect.maxY - SIZEBOX_Y;
// first, check for a double-click
if (oldSelObj == nodePtr && DoubleClick(gSelTime.seconds, gSelTime.micros,
timeStamp->seconds, timeStamp->micros))
{
HandleDoubleClick(nodePtr);
}
// second, check for a click in the size box
else if (CanResize(nodePtr) && PtinRect( mousePt, &sizeRect ))
{
UpdateInfoItem(nodePtr);
if (SizeRect(gWindPtr, mousePt, &nodePtr->rect, &minRectSize, &maxRectSize))
changedFlag = TRUE;
}
// otherwise, it's an ordinary drag operation
else
{
UpdateInfoItem(nodePtr);
if (DragRect(gWindPtr, mousePt, &nodePtr->rect))
changedFlag = TRUE;
}
gSelObj = nodePtr;
gSelTime = *timeStamp;
}
// Draw the selection rectangle
if (changedFlag)
{
if (GetGadgetData(nodePtr, 0L, 0L, 0L, 0L, 0L)) // just verify that it's a gadget object
MakeGadget( nodePtr );
// if there are any current ListView connections to this gadget, update them
UpdateLVConnect( nodePtr, FALSE );
ReDraw();
}
else if (gSelObj)
{
SelectObj(gSelObj);
UpdateInfoItem(gSelObj);
UpdateInfoWindow(&gSelObj->rect);
}
else
{
UpdateInfoItem(0L);
UpdateInfoWindow(0L);
}
}
LinkNode *FindObj(Point *mousePt)
{
LinkNode *nodePtr;
for (nodePtr=gObjList; nodePtr; nodePtr=nodePtr->next)
{
if (PtinRect( mousePt, &nodePtr->rect ))
{
return nodePtr;
}
}
return 0L;
}
void PickLVString(USHORT code)
{
USHORT itemNum;
LinkNode *nodePtr;
if (gSelObj && gSelObj->type == OTYPE_ListView)
{
printf("Enter the item number of the string gadget that you wish to connect:\n");
scanf("%hd", &itemNum);
nodePtr = FindNode(&gObjList, itemNum);
if (nodePtr && nodePtr->type == OTYPE_String)
{
if (!UpdateLVConnect(nodePtr, TRUE)) // clear any current connections to this string
// gadget
{
printf("Selection failed\n");
return;
}
( (ListViewObj *) gSelObj)->stringObj = nodePtr;
if (MakeGadget(gSelObj) != 0)
{
DisposeObj(gSelObj);
gSelObj = 0L;
printf("Selection failed\n");
}
else
printf("Selection successful\n");
ReDraw();
}
else if (nodePtr)
printf("Error: the selected item is not a string gadget (operation aborted)\n");
else
printf("Error: invalid item number (operation aborted)\n");
}
}
/* ===================================================================================== */
void SelectObj(LinkNode *selObj)
{
RastPort *rp = gWindPtr->RPort;
Rect tempRect = selObj->rect;
if (!selObj)
return;
SetDrPt(rp, DASH);
SetDrMd(rp, COMPLEMENT);
Move(rp, tempRect.minX, tempRect.minY);
Draw(rp, tempRect.maxX, tempRect.minY);
Draw(rp, tempRect.maxX, tempRect.maxY);
Draw(rp, tempRect.minX, tempRect.maxY);
Draw(rp, tempRect.minX, tempRect.minY);
if (CanResize(selObj))
{
tempRect.minX = tempRect.maxX - SIZEBOX_X;
tempRect.minY = tempRect.maxY - SIZEBOX_Y;
RectFill( rp, tempRect.minX, tempRect.minY, tempRect.maxX, tempRect.maxY );
}
SetDrMd(rp, JAM1);
SetDrPt(rp, SOLID);
}
/* ===================================================================================== */
BOOL CanResize(LinkNode *objPtr)
{
switch(objPtr->type)
{
case OTYPE_Rect:
case OTYPE_Button:
case OTYPE_Cycle:
case OTYPE_String:
case OTYPE_Palette:
case OTYPE_ListView:
case OTYPE_Scroller:
case OTYPE_Text:
return TRUE;
default:
return FALSE;
}
}
/* ===================================================================================== */
void ReDraw()
{
LinkNode *nodePtr;
RastPort *rp = gWindPtr->RPort;
Rect *rectPtr;
SetAPen(rp, grayPen);
RectFill(rp, gWindPtr->BorderLeft,
gWindPtr->BorderTop,
gWindPtr->Width - gWindPtr->BorderRight - 1,
gWindPtr->Height - gWindPtr->BorderBottom - 1);
for (nodePtr=gObjList; nodePtr; nodePtr=nodePtr->next)
{
rectPtr = &( (RectObj *) nodePtr)->rect;
switch(nodePtr->type)
{
case OTYPE_Rect:
SetAPen( rp, ( (RectObj *) nodePtr)->color );
Move(rp, rectPtr->minX, rectPtr->minY);
Draw(rp, rectPtr->maxX, rectPtr->minY);
Draw(rp, rectPtr->maxX, rectPtr->maxY);
Draw(rp, rectPtr->minX, rectPtr->maxY);
Draw(rp, rectPtr->minX, rectPtr->minY);
break;
case OTYPE_IText:
PrintIText(rp, &( (ITextObj *) nodePtr)->iText, rectPtr->minX, rectPtr->minY);
break;
case OTYPE_Button:
// RefreshGList( ((ButtonObj *) nodePtr)->gadget, gWindPtr, NULL, 1);
break;
case OTYPE_String:
// RefreshGList( ((StringObj *) nodePtr)->gadget, gWindPtr, NULL, 1);
break;
}
}
SetAPen(rp, blackPen);
if (!gGadgetsOn)
{
AddGList(gWindPtr, gGadgetContext, -1L, -1L, 0L);
gGadgetsOn = TRUE;
}
RefreshGList(gGadgetContext, gWindPtr, NULL, -1);
GT_RefreshWindow(gWindPtr, NULL);
if (gEditMode)
{
RemoveGList(gWindPtr, gGadgetContext, -1L);
gGadgetsOn = FALSE;
}
if (gSelObj)
{
SelectObj(gSelObj);
UpdateInfoItem(gSelObj);
UpdateInfoWindow(&gSelObj->rect);
}
else
{
UpdateInfoItem(0L);
UpdateInfoWindow(0L);
}
}
/* ===================================================================================== */
void DoMenu(USHORT code)
{
struct MenuItem *itemPtr;
void (*fPtr)(USHORT);
USHORT itemNum;
while (code != MENUNULL)
{
itemPtr = ItemAddress(gMenuPtr, code);
fPtr = MENU_USERDATA(itemPtr);
if (fPtr)
{
itemNum = ITEMNUM(code);
fPtr(itemNum);
}
code = itemPtr->NextSelect;
}
}
void About(USHORT code)
{
printf("Maker version 0.1 (7/9/91)\n by John Champion\n\n");
}
/* ===================================================================================== */
void Quit(USHORT code)
{
quit("Quit by User\n");
}
/* ===================================================================================== */
void HandleDoubleClick(LinkNode *objPtr)
{
if (GetGadgetData( objPtr, 0L, 0L, 0L, 0L, 0L ) || objPtr->type == OTYPE_IText )
DoubleIText(objPtr);
else
printf("got doubleclick!\n");
}
/* ===================================================================================== */
void DoWindSize(USHORT code)
{
USHORT left = gWindPtr->LeftEdge,
top = gWindPtr->TopEdge,
width = gWindPtr->Width,
height = gWindPtr->Height;
gWindSizeable = ! gWindSizeable;
NewWindow(left, top, width, height, gWindSizeable);
ReDraw();
}
BOOL NewWindow(USHORT left, USHORT top, USHORT width, USHORT height, BOOL sizeable)
{
if (gWindPtr)
{
if (gGadgetsOn)
{
RemoveGList(gWindPtr, gGadgetContext, -1L); // detach the gadget list
gGadgetsOn = FALSE;
}
ClearMenuStrip(gWindPtr);
CloseWindow(gWindPtr);
}
gWindPtr =
OpenWindowTags(0L,
WA_Left, left,
WA_Top, top,
WA_Width, width,
WA_Height, height,
WA_IDCMP, WIND_IDCMP,
WA_Flags, WIND_FLAG | (gWindSizeable ? WFLG_SIZEGADGET : 0),
WA_Title, gWindTitle,
WA_PubScreen, gPubScreen,
WA_MinWidth, 70,
WA_MinHeight, 30,
WA_MaxWidth, -1L,
WA_MaxHeight, -1L,
TAG_DONE);
if (!gWindPtr)
quit("failed to open a window\n");
SetClip();
SetFont(gWindPtr->RPort, gFont);
SetMenuStrip(gWindPtr, gMenuPtr);
if (!gEditMode)
{
AddGList(gWindPtr, gGadgetContext, -1L, -1L, 0L); // reattach the gadgets
gGadgetsOn = TRUE;
}
return TRUE;
}
void SetClip()
{
struct Rectangle tempRect;
if (!gClipRegion)
gClipRegion = NewRegion();
if (!gClipRegion)
{
printf("failed to allocate a region!\n");
return;
}
ClearRegion(gClipRegion);
tempRect.MinX = gWindPtr->BorderLeft;
tempRect.MinY = gWindPtr->BorderTop;
tempRect.MaxX = gWindPtr->Width - gWindPtr->BorderRight - 1;
tempRect.MaxY = gWindPtr->Height - gWindPtr->BorderBottom - 1;
OrRectRegion(gClipRegion, &tempRect);
InstallClipRegion(gWindPtr->WLayer, gClipRegion);
}
void DoEditMode(USHORT code)
{
gEditMode = !gEditMode;
if (!gEditMode)
gSelObj = 0L;
ReDraw();
}
void UpdateInfoItem(LinkNode *nodePtr)
{
RastPort *rp = gInfoWindPtr->RPort;
char buf[100];
short itemNum;
if (nodePtr)
itemNum = NodeNum( &gObjList, nodePtr );
else
itemNum = -1;
if (itemNum >= 0)
{
sprintf(buf, " Item: %3d", itemNum);
Move(rp, 10, 20);
Text(rp, buf, 11);
}
else
{
sprintf(buf, " Item: ");
Move(rp, 10, 20);
Text(rp, buf, 11);
}
}
void UpdateInfoWindow(Rect *rectPtr)
{
RastPort *rp = gInfoWindPtr->RPort;
char buf[100];
if (rectPtr)
{
sprintf(buf, " Left: %3d", rectPtr->minX);
Move(rp, 10, 30);
Text(rp, buf, 11);
sprintf(buf, " Top: %3d", rectPtr->minY);
Move(rp, 10, 40);
Text(rp, buf, 11);
sprintf(buf, " Width: %3d", RectWidth(*rectPtr));
Move(rp, 10, 50);
Text(rp, buf, 11);
sprintf(buf, "Height: %3d", RectHeight(*rectPtr));
Move(rp, 10, 60);
Text(rp, buf, 11);
}
else
{
sprintf(buf, " Left: ");
Move(rp, 10, 30);
Text(rp, buf, 11);
sprintf(buf, " Top: ");
Move(rp, 10, 40);
Text(rp, buf, 11);
sprintf(buf, " Width: ");
Move(rp, 10, 50);
Text(rp, buf, 11);
sprintf(buf, "Height: ");
Move(rp, 10, 60);
Text(rp, buf, 11);
}
}