/*
*
* Source - Alternate.c
* Author - Alexander S. Colwell,
* Copyright (C) 1989
* Purpose - This application will demostrate the
* AlternateCDEF scroll bar using THINK
* C 4.0 Object Library.
*
*/
#include /* Global variables */
#include /* Application defs */
#include /* Command handler defs */
#include /* Menu handler defs */
#include /* Window handler defs */
#include /* Window layer hdler def*/
#include /* Document handler defs */
#include /* Text edit handler defs*/
#include /* Scrolling pane defs */
struct CAltDemoApp : CApplication {/* Appl object */
void CreateDocument(void);/* Creat new doc method */
};
struct CAltDemoDoc : CDocument {/* Document object */
void NewFile(void); /* Net (bogus) fil method*/
};
struct CAltDemoPane : CEditText {/* Text pane obj */
void IEditPane(CView *anEnclosure,
CBureaucrat *aSupervisor);
};
#define altWIND 500 /* WIND template res ID */
/* Define external refs */
extern CApplication *gApplication;/* Appl object */
extern CDecorator *gDecorator;/* Window object */
extern CDesktop *gDesktop; /* Desktop object */
extern CBartender *gBartender;/* Menu object */
void main()
{
gApplication = new(CAltDemoApp);/* Creat appln object*/
gApplication->IApplication(4,4096L,2048L);/* Init it */
gApplication->Run(); /* Startup application */
gApplication->Exit(); /* Return to da “Finder” */
}
void CAltDemoApp::CreateDocument()
{
CAltDemoDoc *theDocument; /* New document obj */
theDocument = new(CAltDemoDoc);/* Create doc object */
theDocument->IDocument(this,FALSE);/* Init doc obj */
theDocument->NewFile(); /* Create (bogus) doc */
}
void CAltDemoDoc::NewFile(void)
{
CScrollPane *theScrollPane;/* Scroll pane object */
CAltDemoPane *theMainPane; /* Main pane object */
itsWindow = new(CWindow); /* Create window object */
itsWindow->IWindow(altWIND,FALSE,gDesktop,this);
/* Create scrolling object*/
theScrollPane = new(CScrollPane);
theScrollPane->IScrollPane(itsWindow,this,10,10,0,0,
sizELASTIC,sizELASTIC, TRUE,TRUE,TRUE);
theScrollPane->FitToEnclFrame(TRUE, TRUE);
theMainPane = new(CAltDemoPane);
itsMainPane = theMainPane;
itsGopher = theMainPane;
theMainPane->IEditPane(theScrollPane,this);
theScrollPane->InstallPanorama(theMainPane);
itsWindow->Select(); /* Select our window now!*/
}
void CAltDemoPane::IEditPane(CView *anEnclosure,
CBureaucrat *aSupervisor)
{
Rect margin; /* Margin rect area */
/* Setup text edit stuff */
CEditText::IEditText(anEnclosure,aSupervisor,1,1,0,0,
sizELASTIC,sizELASTIC,432);
FitToEnclosure(TRUE,TRUE);
SetRect(&margin,2,2,-2,-2);
ChangeSize(&margin,FALSE);
}
/*
*
* Source - AlternateCDEF.c
* Author - Alexander S. Colwell,
* Copyright (C) 1988, 1989
* Purpose - This is a dual-arrow scroll bar control
* definition procedure. It is similiar to
* the standard scroll bar except this has
* two arrow indicators on both ends.
*/
#include /* QuickDraw defs */
#include /* Color defs */
#include /* Window Manager defs */
#include /* Control Manager defs */
#include /* Tool Box Utilities */
#include /* Color Tool Box defs */
typedef struct { /* Dual Control */
short hasColor; /* Has color monitor flag*/
short altButton; /* Using alternate button*/
Rect thumb; /* Thumb rectangle area */
Rect cThumb; /* Current thmb rect area*/
PolyHandle up; /* Up button handle */
PolyHandle down; /* Down button handle */
short bLen; /* Button length */
short hBLen; /* Half button length */
short sLen; /* Scroll bar length */
double tFactor; /* Thumb factor */
short hFactor; /* Horizontal factor */
short vFactor; /* Vertical factor */
ControlHandle cHdl; /* Ctrl hdl to reference */
long blackPat[2]; /* Black pattern */
long ltGrayPat[2];/* Light gray pattern */
} DS;
typedef DS *DSPTR;
typedef DSPTR *DSHDL;
typedef struct { /* Thumb Info */
Rect limitRect; /* Limit rect scrolling */
Rect slopRect; /* Slop rect scrolling */
short axis; /* Drag axis control */
} THUMB;
typedef THUMB *THUMBPTR;
/* Misc definitions */
#define NIL (0L) /* NIL pointer */
#define abs(a) (a<0?-a:a) /* Absolute macro func */
#define min(a,b) (a
#define max(a,b) (a
/* Trap definitions */
#define SysEnvironsTrap 0xa090/* System Enviroment */
#define UnknownTrap 0xa89f/* Unknown instruction */
/* System 7.0 CDEF msgs */
#define calcCntlRgn 10 /* Calculate ctnl region */
#define calcThumbRgn 11 /* Calculate “thumb” rgn */
/* Control’s macro procs */
#define DSFrameHUpBtn()
DSDrawHBtn(dPtr,dPtr->up,FALSE)
#define DSFrameHDownBtn()
DSDrawHBtn(dPtr,dPtr->down,FALSE)
#define DSFrameLUpBtn()
DSDrawLBtn(dPtr,dPtr->up,FALSE)
#define DSFrameLDownBtn()
DSDrawLBtn(dPtr,dPtr->down,FALSE)
#define DSFillHUpBtn()
DSDrawHBtn(dPtr,dPtr->up,TRUE)
#define DSFillHDownBtn()
DSDrawHBtn(dPtr,dPtr->down,TRUE)
#define DSFillLUpBtn()
DSDrawLBtn(dPtr,dPtr->up,TRUE)
#define DSFillLDownBtn()
DSDrawLBtn(dPtr,dPtr->down,TRUE)
#define DSFrameBody(a)
DSDrawObject(dPtr->cHdl,DSGetForeGround,
DSSetForeGround,DSFrameRect,
cFrameColor,a)
#define DSClearBody(a)
DSDrawObject(dPtr->cHdl,DSGetBackGround,
DSSetBackGround,DSEraseRect,
cBodyColor,a)
#define DSFillBody(a)
DSDrawObject(dPtr->cHdl,DSGetBackGround,
DSSetBackGround,DSFillRect,cBodyColor,a,
dPtr->ltGrayPat)
#define DSFrameThumb(a)
DSDrawObject(dPtr->cHdl,DSGetForeGround,
DSSetForeGround,DSFrameRect,
cFrameColor,a)
#define DSFillThumb(a)
DSDrawObject(dPtr->cHdl,DSGetBackGround,
DSSetBackGround,DSEraseRect,
cThumbColor,a)
#define DSFrameArrow(a)
DSDrawObject(dPtr->cHdl,DSGetForeGround,
DSSetForeGround,DSFramePoly,
cFrameColor,a)
#define DSClearArrow(a)
DSDrawObject(dPtr->cHdl,DSGetBackGround,
DSSetBackGround,DSErasePoly,
cBodyColor,a)
#define DSFillArrow(a)
DSDrawObject(dPtr->cHdl,DSGetForeGround,
DSSetForeGround,DSFillPoly,
cFrameColor,a,dPtr->blackPat)
/* Define forward refs */
void DSInitControl(),DSDrawThumb(),DSPositionThumb(),
DSSetupThumb(),DSDrawHBtn(),DSDrawLBtn(),
DSGetBackGround(),DSGetForeGround(),
DSSetBackGround(),DSSetForeGround(),
DSFrameButtons(),DSEraseRect(),DSFrameRect(),
DSFillRect(),DSErasePoly(),DSFramePoly(),
DSFillPoly(),DSDrawObject();
long DSTestControl();
pascal long main(varCode,theControl,message,param)
short varCode; /* Variable control code */
ControlHandle theControl; /* Control handle */
short message; /* Control message */
long param; /* Control parameter */
{
ControlPtr cPtr; /* Working control ptr */
DSHDL dHdl; /* Working dual ctrl hdl */
DSPTR dPtr = NIL; /* Working dual ctrl ptr */
Rect wRect; /* Working scroll area */
SysEnvRec sysEnv; /* Working system envt */
long status = 0; /* Working status flag */
HLock(theControl); /* Lock down the ctrl hdl*/
cPtr = *theControl; /* Set control pointer */
if (message != initCntl) { /* Check if already init */
if (cPtr->contrlData) { /* Check if valid handle */
HLock(cPtr->contrlData); /* Lock it down for work */
dPtr = *((DSHDL)cPtr->contrlData);/* Set dual ptr */
}
}
switch(message) { /* Process specified msg */
case drawCntl: /* Draw the control */
if (dPtr) { /* Check if it’s valid */
if (cPtr->contrlVis) { /* Check if it’s visible */
PenNormal(); /* Set to normal pen */
switch(LoWord(param)) {/* Switch on control part*/
case 0: /* Re-draw scroll bar */
DSInitControl(dPtr,cPtr);/* Re-init it */
DSFrameBody(&cPtr->contrlRect);/* Init scroll */
DSFrameButtons(dPtr);/* Frame the buttons */
DSFrameHUpBtn();
DSFrameHDownBtn();
DSFrameLUpBtn();
DSFrameLDownBtn();
DSDrawThumb(dPtr,theControl); break;
case 129: /* Value/Min/Max changed */
DSDrawThumb(dPtr,theControl); break;
case 0xff: /* Control to be inactive*/
DSSetScrollRgn(dPtr,&wRect);
DSClearBody(&wRect); break;
case inPageUp: /* Hilite scroll bar */
case inPageDown:
DSDrawThumb(dPtr,theControl); break;
case inUpButton: /* Hilite high up button */
if (dPtr->altButton) {/* Check if alt button */
if (cPtr->contrlHilite == 0 ||
cPtr->contrlMin == cPtr->contrlMax)
DSFrameLUpBtn();
else
DSFillLUpBtn();
}
else {
if (cPtr->contrlHilite == 0 ||
cPtr->contrlMin == cPtr->contrlMax)
DSFrameHUpBtn();
else
DSFillHUpBtn();
}
break;
case inDownButton: /* Hilite high down buttn*/
if (dPtr->altButton) {/* Check if alt button */
if (cPtr->contrlHilite == 0 ||
cPtr->contrlMin == cPtr->contrlMax)
DSFrameLDownBtn();
else
DSFillLDownBtn();
}
else {
if (cPtr->contrlHilite == 0 ||
cPtr->contrlMin == cPtr->contrlMax)
DSFrameHDownBtn();
else
DSFillHDownBtn();
}
}
}
}
break;
case testCntl: /* Test the control */
if (dPtr) /* Check if ptr valid */
if (cPtr->contrlHilite != -1)/* Check if active */
if (cPtr->contrlMin != cPtr->contrlMax)
if (PtInRect(param,&cPtr->contrlRect))
status = DSTestControl(dPtr,param);/* Find it */
break;
case calcCRgns: /* Calculate ctrl region */
if (dPtr) { /* Check if pointer valid*/
if (!(param & 0x80000000L))/* Check if whole ctrl*/
RectRgn((Handle)(param & 0x7fffffffL),
&cPtr->contrlRect);
else { /* Want thumb’s region */
/* Setup thumb’s area */
RectRgn((Handle)(param & 0x7fffffffL),
&dPtr->cThumb);
/* Setup drag pattern */
BlockMove(dPtr->ltGrayPat,DragPattern,8L);
}
}
break;
case calcCntlRgn: /* Calculate cntl region */
if (dPtr) /* Check if ptr valid */
RectRgn((Handle)(param),&cPtr->contrlRect);
break;
case calcThumbRgn: /* Calculate “thumb” rgn */
if (dPtr) { /* Check if pointer valid*/
/* Setup thumb’s region */
RectRgn((Handle)(param),&dPtr->cThumb);
/* Setup drag pattern */
BlockMove(dPtr->ltGrayPat,DragPattern,8L);
}
break;
case initCntl: /* Initialized control */
/* Allocate data handle */
if (dHdl = (DSHDL)NewHandle(sizeof(DS))) {
HLock(dHdl); /* Lock it down for init */
dPtr = *dHdl; /* Set dual control ptr */
dPtr->cHdl = theControl;/* Save it for reference */
dPtr->up = dPtr->down = NIL;/* Init poly handles */
dPtr->blackPat[0] = 0xffffffffL;/* Init patterns */
dPtr->blackPat[1] = 0xffffffffL;
dPtr->ltGrayPat[0] = 0x88228822L;
dPtr->ltGrayPat[1] = 0x88228822L;
dPtr->hasColor = FALSE; /* Set to black & white */
dPtr->altButton = FALSE;/* Not using alt button */
/* Check SysEnvirons OK */
if ((long)NGetTrapAddress(SysEnvironsTrap,OSTrap)!=
(long)NGetTrapAddress(UnknownTrap,ToolTrap)) {
SysEnvirons(1,&sysEnv);/* Get system enviroment */
dPtr->hasColor = sysEnv.hasColorQD;/* Save color*/
}
DSInitControl(dPtr,cPtr);/* Init control’s stuff */
cPtr->contrlAction = (ProcPtr)(-1L);
cPtr->contrlData = (Handle)dHdl;/* Save data hdl */
}
break;
case dispCntl: /* Dispose the control */
if (dPtr) { /* Check if pointer valid*/
if (dPtr->up) /* Kill the polys */
KillPoly(dPtr->up);
if (dPtr->down)
KillPoly(dPtr->down);
HUnlock(cPtr->contrlData);/* Unlock it now */
DisposHandle(cPtr->contrlData);/* Return it */
}
cPtr->contrlData = NIL; /* Clear it */
break;
case posCntl: /* Re-position control */
if (dPtr) /* Check if pointer valid*/
DSPositionThumb(dPtr,theControl,param);
break;
case thumbCntl: /* Calculate for dragging*/
if (dPtr) /* Check if pointer valid*/
DSSetupThumb(dPtr,param);/* Setup for dragging */
break;
case dragCntl: /* Drag the control */
status = 0; /* Only drag thumb! */
break;
case autoTrack: /* Execute ctrl’s action */
break;
}
if (cPtr->contrlData) /* Check if valid pointer*/
HUnlock(cPtr->contrlData);/* Unlock for memory mgr */
HUnlock(theControl); /* Unlock control handle */
return(status); /* Return status code */
}
void DSInitControl(dPtr,cPtr)
DSPTR dPtr; /* Dual control pointer */
ControlPtr cPtr; /* Control pointer */
{
PolyHandle pHdl; /* Working poly handle */
short bLen; /* Working button length */
short hBLen; /* Working 1/2 button len*/
short hLen; /* Working horizontal len*/
short vLen; /* Working vertical len */
short tmp1,tmp2; /* Working tmp variables */
Rect cRect; /* Working ctrl rect area*/
cRect = cPtr->contrlRect; /* Set scroll bar area */
InsetRect(&cRect,1,1); /* Shrink it by one-pixel*/
/* Set horz & vert lens */
hLen = abs(cRect.right - cRect.left) + 1;
vLen = abs(cRect.bottom - cRect.top) + 1;
if (hLen > vLen) { /* Check if horz longer */
dPtr->bLen = vLen; /* Set button length */
dPtr->sLen = hLen + 1; /* Set scroll bar length */
dPtr->hFactor = 1; /* Set horizontal factor */
dPtr->vFactor = 0; /* Set vertical factor */
}
else { /* Nope, must be vertical*/
dPtr->bLen = hLen; /* Set button length */
dPtr->sLen = vLen + 1; /* Set scroll bar length */
dPtr->hFactor = 0; /* Set horizontal factor */
dPtr->vFactor = 1; /* Set vertical factor */
}
bLen = dPtr->bLen; /* Set button length */
hBLen = dPtr->hBLen = bLen / 2;/* Set 1/2 buttn len*/
dPtr->thumb.top = dPtr->thumb.left = 0;/* Init pt */
if (dPtr->hFactor) { /* Check if horz position*/
dPtr->thumb.bottom = bLen - 1;
dPtr->thumb.right = hBLen + hBLen / 2;
}
else { /* Nope, vert position */
dPtr->thumb.bottom = hBLen + hBLen / 2;
dPtr->thumb.right = bLen - 1;
}
tmp1 = hBLen - 1; /* Set tmp calculations */
tmp2 = hBLen - 2;
/* Create up poly handle */
if (pHdl = OpenPoly()) { /* Check if got poly hdl */
if (dPtr->hFactor) { /* Check horz position */
MoveTo(0,tmp1);
LineTo(tmp2,tmp2 * 2 + 1);
LineTo(tmp2,1);
LineTo(0,tmp1);
}
else { /* Nope, vert position */
MoveTo(tmp1,0);
LineTo(1,tmp2);
LineTo(tmp2 * 2 + 1,tmp2);
LineTo(tmp1,0);
}
ClosePoly(); /* Close the poly handle */
}
if (dPtr->up) /* Check if old poly hdl */
KillPoly(dPtr->up); /* Release this poly hdl */
dPtr->up = pHdl; /* Set up poly handle */
/* Create down poly hdl */
if (pHdl = OpenPoly()) { /* Check if got poly hdl */
if (dPtr->hFactor) { /* Check horz position */
MoveTo(tmp2,tmp1);
LineTo(0,tmp2 * 2 + 1);
LineTo(0,1);
LineTo(tmp2,tmp1);
OffsetPoly(pHdl,hBLen,0);
}
else { /* Nope, vert position */
MoveTo(1,0);
LineTo(tmp2 * 2 + 1,0);
LineTo(tmp1,tmp1);
LineTo(1,0);
OffsetPoly(pHdl,0,hBLen);
}
ClosePoly(); /* Close the poly handle */
}
if (dPtr->down) /* Check if old poly hdl */
KillPoly(dPtr->down); /* Release this poly hdl */
dPtr->down = pHdl; /* Set down poly handle */
}
void DSCalcThumb(dPtr,cPtr)
DSPTR dPtr; /* Dual control pointer */
ControlPtr cPtr; /* Control pointer */
{
double tmp1,tmp2; /* Working tmp registers */
short offset; /* Working pixel offset */
Rect wRect; /* Working scroll area */
/* Make sure this is min */
cPtr->contrlMin = min(cPtr->contrlMin, cPtr->contrlMax);
/* Make sure this is max */
cPtr->contrlMax = max(cPtr->contrlMin, cPtr->contrlMax);
/* Make it min
cPtr->contrlValue = min(cPtr->contrlMax,
max(cPtr->contrlMin, cPtr->contrlValue));
DSSetScrollRgn(dPtr,&wRect);/* Set scroll region */
/* Init thumb factor calc*/
tmp1 = max(abs(wRect.bottom - wRect.top) * dPtr->vFactor,
abs(wRect.right - wRect.left) * dPtr->hFactor)
- dPtr->bLen + dPtr->hBLen - 2;
tmp2 = abs(cPtr->contrlMax - cPtr->contrlMin);
dPtr->tFactor = tmp1 / tmp2;/* Set relative factor */
tmp1 = cPtr->contrlValue - /*Set thumb pixel offset*/
cPtr->contrlMin;
tmp2 = tmp1 * dPtr->tFactor;
offset = tmp2;
dPtr->cThumb = dPtr->thumb;/* Set thumb rect area */
OffsetRect(&dPtr->cThumb, wRect.left + offset * dPtr->hFactor,
wRect.top + offset * dPtr->vFactor);
}
void DSDrawThumb(dPtr,cHdl)
DSPTR dPtr; /* Dual control pointer */
ControlHandle cHdl; /* Control handle */
{
Rect tRect; /* Working thumb area */
ControlPtr cPtr = *cHdl; /* Working control ptr */
DSSetScrollRgn(dPtr,&tRect);/* Set scroll region */
if (cPtr->contrlHilite != 255 &&/* Check if show it */
cPtr->contrlMax != cPtr->contrlMin) {
DSCalcThumb(dPtr,cPtr); /* Re-calculate thumb */
ForeColor((long)(blackColor));/* Make it’s b & w */
BackColor((long)(whiteColor));
DSFillBody(&tRect); /* Fill in scroll bar */
tRect = dPtr->cThumb; /* Set thumb rect area */
DSFrameThumb(&tRect); /* Frame thumb */
InsetRect(&tRect,1,1); /* Inset by one pixel */
DSFillThumb(&tRect); /* Clear inside of thumb */
}
else /* Nope, don’t want it */
DSClearBody(&tRect); /* Clr scroll region */
}
void DSPositionThumb(dPtr,cHdl,pt)
DSPTR dPtr; /* Dual control pointer */
ControlHandle cHdl; /* Control handle */
Point pt; /* Pt position of thumb */
{
double offset; /* Working value offset */
if (dPtr->hFactor) /* Check if horizontal */
offset = pt.h; /* Use horizontal offset */
else /* Nope, it’s vertical */
offset = pt.v; /* Use vertical offset */
offset = offset / dPtr->tFactor;/* Reset ctrl value */
(*cHdl)->contrlValue += offset;
DSDrawThumb(dPtr,cHdl); /* Draw da thumb, again! */
}
void DSSetupThumb(dPtr,thumbPtr)
DSPTR dPtr; /* Dual control pointer */
THUMBPTR thumbPtr; /* Thumb’s info pointer */
{
Point msePt; /* Working mouse point */
msePt.h = thumbPtr->limitRect.left;/* Save mse down */
msePt.v = thumbPtr->limitRect.top;
DSSetScrollRgn(dPtr,&thumbPtr->limitRect);/*Set limt*/
if (dPtr->hFactor) { /* Check if horz scroll */
/* Adjust it for mse */
thumbPtr->limitRect.left += msePt.h - dPtr->cThumb.left;
thumbPtr->limitRect.right -= dPtr->cThumb.right - msePt.h - 1;
/* Set slop rect area */
thumbPtr->slopRect.top = thumbPtr->limitRect.top - 16;
thumbPtr->slopRect.bottom = thumbPtr->limitRect.bottom + 16;
thumbPtr->slopRect.left = -32000;
thumbPtr->slopRect.right = 32000;
thumbPtr->axis = hAxisOnly;/* Set axis dragging dir*/
}
else { /* Nope, vert scroll bar*/
/* Adjust it for mse */
thumbPtr->limitRect.top += msePt.v - dPtr->cThumb.top;
thumbPtr->limitRect.bottom -= dPtr->cThumb.bottom - msePt.v - 1;
/* Set slop rect area */
thumbPtr->slopRect.left = thumbPtr->limitRect.left - 16;
thumbPtr->slopRect.right = thumbPtr->limitRect.right + 16;
thumbPtr->slopRect.top = -32000;
thumbPtr->slopRect.bottom = 32000;
thumbPtr->axis = vAxisOnly;/* Set axis dragging dir*/
}
}
void DSDrawHBtn(dPtr,btn,fill)
DSPTR dPtr; /* Dual control pointer */
PolyHandle btn; /* Poly button handle */
short fill; /* Fill flag indicator */
{
/* Offset where button */
OffsetPoly(btn,(*dPtr->cHdl)->contrlRect.left + 1,
(*dPtr->cHdl)->contrlRect.top + 1);
if (fill) /* Check if filling arrow*/
DSFillArrow(btn); /* Fill in arrow button */
else /* Nope, not clearing it */
DSClearArrow(btn); /* Clear the arrow button*/
DSFrameArrow(btn); /* Frame the arrow button*/
/* Restore the button */
OffsetPoly(btn,-(*dPtr->cHdl)->contrlRect.left - 1,
-(*dPtr->cHdl)->contrlRect.top - 1);
}
void DSDrawLBtn(dPtr,btn,fill)
DSPTR dPtr; /* Dual control pointer */
PolyHandle btn; /* Poly button handle */
short fill; /* Fill flag indicator */
{
short tmp1,tmp2; /* Working tmp variables */
short offset; /* Working offset */
offset = dPtr->sLen - dPtr->bLen - 1;/* Set offset */
/* Offset where button */
OffsetPoly(btn,tmp1 = (*dPtr->cHdl)->contrlRect.left +
dPtr->hFactor * offset + 1,tmp2 =
(*dPtr->cHdl)->contrlRect.top + dPtr->vFactor * offset + 1);
if (fill) /* Check if filling arrow */
DSFillArrow(btn); /* Fill in arrow button */
else /* Nope, not clearing it */
DSClearArrow(btn); /* Clear the arrow button */
DSFrameArrow(btn); /* Frame the arrow button */
OffsetPoly(btn,-tmp1,-tmp2);/* Restore the button */
}
void DSFrameButtons(dPtr)
DSPTR dPtr; /* Dual control pointer */
{
Rect bRect; /* Working box rect area */
short offset; /* Working low button */
bRect.left = bRect.top = 0;/* Setup rect area */
bRect.right = bRect.bottom = dPtr->bLen + 1;
/* Offset high button box*/
OffsetRect(&bRect,(*dPtr->cHdl)->contrlRect.left,
(*dPtr->cHdl)->contrlRect.top);
DSClearBody(&bRect); /* Clear the body part */
DSFrameBody(&bRect); /* Frame high button box */
/* Set low button offset */
offset = dPtr->sLen - dPtr->bLen - 1;
OffsetRect(&bRect,dPtr->hFactor * offset,
dPtr->vFactor * offset);
DSClearBody(&bRect); /* Clear the body part */
DSFrameBody(&bRect); /* Frame low button box */
}
long DSTestControl(dPtr,pt)
DSPTR dPtr; /* Dual control pointer */
Point pt; /* Point position */
{
Rect cRect; /* Working control rect */
Rect tRect; /* Working temp rect area*/
Rect bRect; /* Working button rect */
short offset; /* Working offset */
short point; /* Working pt in region */
long status = 0; /* Working status flag */
cRect = (*dPtr->cHdl)->contrlRect;/* Set ctrl rect */
bRect = dPtr->thumb; /* Set button rect area */
if (dPtr->hFactor) /* Check if horz button */
bRect.right = dPtr->hBLen;/* Adjust for horz button*/
else
bRect.bottom = dPtr->hBLen;/* Adjust for vert buttn*/
tRect = bRect; /* Set the temp rect area*/
OffsetRect(&tRect,cRect.left,cRect.top);
if (PtInRect(pt,&tRect)) { /* Check if high up buttn*/
status = inUpButton; /* Set high up button */
dPtr->altButton = FALSE; /* Not using alt button */
}
if (!status) { /* Check if prev part */
/* Adjust for down button*/
OffsetRect(&tRect,dPtr->hFactor * dPtr->hBLen,
dPtr->vFactor * dPtr->hBLen);
if (PtInRect(pt,&tRect)) {/* Check if high down */
status = inDownButton; /* Set high down button */
dPtr->altButton = FALSE; /* Not using alt button */
}
}
if (!status) { /* Check if prev part */
tRect = bRect; /* Set the temp rect area*/
offset = dPtr->sLen - dPtr->bLen;
/* Offset where low up */
OffsetRect(&tRect,cRect.left + dPtr->hFactor*offset,
cRect.top + dPtr->vFactor*offset);
if (PtInRect(pt,&tRect)) {/* Check if low up button*/
status = inUpButton; /* Set low up button */
dPtr->altButton = TRUE; /* Using alt button */
}
}
if (!status) { /* Check if prev part */
/* Offset where low down */
OffsetRect(&tRect,dPtr->hFactor * dPtr->hBLen,
dPtr->vFactor * dPtr->hBLen);
if (PtInRect(pt,&tRect)) {/* Check if the low down */
status = inDownButton; /* Set low down button */
dPtr->altButton = TRUE; /* Using alt button */
}
}
if (!status) { /* Check if prev part */
if (PtInRect(pt,&dPtr->cThumb))/* Check if thumb */
status = inThumb; /* Set thumb part */
}
if (!status) { /* Check if prev part */
/* Set relative point */
point = pt.h * dPtr->hFactor + pt.v * dPtr->vFactor;
/* Set relative offset */
offset = dPtr->cThumb.left * dPtr->hFactor +
dPtr->cThumb.top * dPtr->vFactor;
if (point > offset) /* Check if in down page */
status = inPageDown; /* Set down page region */
else
status = inPageUp; /* Set up page region */
}
return(status); /* Return status part */
}
DSSetScrollRgn(dPtr,scrollRgn)
DSPTR dPtr; /* Dual control pointer */
Rect *scrollRgn; /* Scrolling region area */
{
*scrollRgn = (*dPtr->cHdl)->contrlRect;/* Set area */
InsetRect(scrollRgn,1,1);/* Shrink it a bit */
if (dPtr->hFactor) { /* Check if horizontal bar*/
scrollRgn->left += dPtr->bLen;/* Adjust rect area */
scrollRgn->right -= dPtr->bLen;
}
else { /* It’s a vert scroll bar */
scrollRgn->top += dPtr->bLen;/* Adjust rect area */
scrollRgn->bottom -= dPtr->bLen;
}
}
void DSGetBackGround(color)
RGBColor *color; { GetBackColor(color); }
void DSGetForeGround(color)
RGBColor *color; { GetForeColor(color); }
void DSSetBackGround(color)
RGBColor *color; { RGBBackColor(color); }
void DSSetForeGround(color)
RGBColor *color; { RGBForeColor(color); }
void DSEraseRect(rect)
Rect *rect; { EraseRect(rect); }
void DSFrameRect(rect)
Rect *rect; { FrameRect(rect); }
void DSFillRect(rect,pattern)
Rect *rect; Pattern *pattern; {FillRect(rect,pattern);}
void DSErasePoly(poly)
PolyHandle poly; { ErasePoly(poly); }
void DSFramePoly(poly)
PolyHandle poly; { FramePoly(poly); }
void DSFillPoly(poly,pattern)
PolyHandle poly; Pattern *pattern;
{ FillPoly(poly,pattern); }
void DSDrawObject(cHdl,getGround,setGround,
object,color,arg1,arg2)
ControlHandle cHdl; /* Control handle */
ProcPtr getGround; /* Get back/fore grd proc*/
ProcPtr setGround; /* Set back/fore grd proc*/
ProcPtr object; /* Draw object proc */
short color; /* Color index */
long arg1,arg2; /* Argument’s parameters */
{
AuxCtlHndl acHdl = NIL; /* Working aux color hdl */
RGBColor oldColor; /* Working old color */
RGBColor newColor; /* Working new color */
/* Check if has color */
if ((*((DSHDL)((*cHdl)->contrlData)))->hasColor) {
GetAuxCtl(cHdl,&acHdl); /* Get control color info*/
if (acHdl) { /* Check if really got it*/
(*getGround)(&oldColor); /* Get back-ground color */
/* Get object’s color */
newColor =(*(*acHdl)->acCTable)->ctTable[color].rgb;
(*setGround)(&newColor); /* Set control obj color */
}
}
(*object)(arg1,arg2); /* Draw the object */
if (acHdl) /* Check if have aux hdl */
(*setGround)(&oldColor); /* Restore back-grd color*/
}