home *** CD-ROM | disk | FTP | other *** search
- #include "SmartDragWindow INIT.h"
- #include "DialogUtils.h"
- #include "SoundUtils.h"
-
-
- enum {
- // Dialog item numbers
- kDragPane_SmartDragOnRadio = 1,
- kDragPane_SmartDragOffRadio,
-
- kDragPane_SnapToMonitorCheck,
- kDragPane_SnapToWindowCheck,
- kDragPane_SnapToGridCheck,
- kDragPane_SnapWhenResizingCheck,
-
- kDragPane_SnapDistanceInput,
- kDragPane_SnapGridSizeInput,
-
- kDragPane_WitchBrewBtn
- };
-
- enum {
- // Maximum snap distance, size grid user can input
- kMaxSnapValue = 80
- };
-
-
- #define kSmartDragNoINITErr kSmartDragRsrcID
- #define kSmartDragVersionConflictErr -4034
-
-
- #ifdef powerc
- // for Metrowerks' linker, this defines the mixed-mode interface for main().
- ProcInfoType __procinfo = kPascalStackBased
- | RESULT_SIZE(kFourByteCode)
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(short)))
- | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(EventRecord *)))
- | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(long)))
- | STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(DialogPtr)));
- #endif
-
- // ---------------------------------------------------------------------------
-
- static void SetupPanelItems(DialogPtr CPDialog);
- static void CleanupPanelItems(DialogPtr CPDialog);
- static void HandlePanelHit(DialogPtr CPDialog, EventRecord *theEvent, short itemHit);
- static void HandlePanelKeyDown(DialogPtr CPDialog, EventRecord *theEvent, short itemHit);
- static void HandlePanelIdle(DialogPtr CPDialog, EventRecord *theEvent, short itemHit);
- static void HandlePanelActivate(DialogPtr CPDialog, short message);
-
- // ---------------------------------------------------------------------------
-
- static SmartDragGlobals *gINITGlobals; // Pointer to the INIT's globals
- static SmartDragGlobals **gPrefsResource; // Our prefs resource
-
- // ---------------------------------------------------------------------------
-
- pascal long main(short message, short Item, short numItems, short CPanelID,
- EventRecord *theEvent, register long cdevValue, DialogPtr CPDialog) {
- long oldA4;
- long versionCheck;
- OSErr err;
- SelectorFunctionUPP smartDragGestaltUPP;
-
- // We use globals so we need to use register A4
- oldA4 = SetCurrentA4();
-
- // Adjust item numbers (old vestige from System 6 control panel)
- Item -= numItems;
-
- if (message == initDev) {
- InitSoundUtils();
-
- // Load in prefs
- gPrefsResource = (SmartDragGlobals**)Get1Resource(
- kSmartDragPrefRsrcType, kSmartDragRsrcID);
- if (gPrefsResource == NULL) {
- cdevValue = cdevResErr;
- goto exitPoint;
- }
-
- // Make sure the prefs match our globals
- if (GetHandleSize((Handle)gPrefsResource) != sizeof(SmartDragGlobals)) {
- (void)Alert(kSmartDragVersionConflictErr, NULL);
- cdevValue = cdevGenErr;
- goto exitPoint;
- }
-
- // Contact the INIT - is it loaded?
- err = Gestalt(kSmartDragSignature, (long*)&smartDragGestaltUPP);
- if (err != noErr) {
- (void)Alert(kSmartDragNoINITErr, NULL);
- cdevValue = cdevGenErr;
- goto exitPoint;
- }
-
- // We've gotten here, so it's loaded. Get the INIT's version
- err = CallSelectorFunctionProc(smartDragGestaltUPP,
- gestaltVersion, (long*)&versionCheck);
- if (err != noErr || versionCheck != kSmartDragVersion) {
- (void)Alert(kSmartDragVersionConflictErr, NULL);
- cdevValue = cdevGenErr;
- goto exitPoint;
- }
-
- // Get the address of the INIT's globals so we can update
- // it when the user changes the settings in the control panel.
- err = CallSelectorFunctionProc(smartDragGestaltUPP,
- kGestaltGetSmartDragGlobals, (long*)&gINITGlobals);
- if (err != noErr) {
- cdevValue = cdevGenErr;
- goto exitPoint;
- }
-
- // Setup the dialog items in the control panel
- SetupPanelItems(CPDialog);
-
- // Pass an arbitrary value so subsequent cdev messages know
- // that the initDev message has been handled successfully.
- cdevValue = 237;
- }
- else if (cdevValue == 237) {
- switch(message) {
- case closeDev: {
- CleanupPanelItems(CPDialog);
- } break;
-
- case hitDev:
- HandlePanelHit(CPDialog, theEvent, Item);
- break;
-
- case keyEvtDev:
- HandlePanelKeyDown(CPDialog, theEvent, Item);
- break;
-
- case nulDev: {
- HandlePanelIdle(CPDialog, theEvent, Item);
- } break;
-
- case activDev:
- case deactivDev: {
- HandlePanelActivate(CPDialog, message);
- } break;
- }
- }
-
- exitPoint:
- SetA4(oldA4);
- return cdevValue;
- } // END main entrypoint
-
- // ---------------------------------------------------------------------------
-
- void SetupPanelItems(DialogPtr CPDialog) {
- Str31 text;
- short i;
-
- // Setup dialog items
- if ((**gPrefsResource).snapToMonitor) {
- SetDlogCtlValue(CPDialog, kDragPane_SnapToMonitorCheck, 1);
- }
- if ((**gPrefsResource).snapToWindows) {
- SetDlogCtlValue(CPDialog, kDragPane_SnapToWindowCheck, 1);
- }
- if ((**gPrefsResource).snapToGrid) {
- SetDlogCtlValue(CPDialog, kDragPane_SnapToGridCheck, 1);
- }
- if ((**gPrefsResource).snapWhenGrowingWindow) {
- SetDlogCtlValue(CPDialog, kDragPane_SnapWhenResizingCheck, 1);
- }
- NumToString((**gPrefsResource).snapToDistance, text);
- SetDItemText(CPDialog, kDragPane_SnapDistanceInput, text);
- NumToString((**gPrefsResource).snapGridSize, text);
- SetDItemText(CPDialog, kDragPane_SnapGridSizeInput, text);
- if ((**gPrefsResource).smartDragOn) {
- SelectRadioBtn(CPDialog, kDragPane_SmartDragOnRadio,
- kDragPane_SmartDragOnRadio, kDragPane_SmartDragOffRadio);
- for (i = kDragPane_SnapToMonitorCheck;
- i <= kDragPane_SnapWhenResizingCheck; i++)
- HiliteControl((ControlHandle)GetDItemHdl(CPDialog, i), 0);
- }
- else {
- SelectRadioBtn(CPDialog, kDragPane_SmartDragOffRadio,
- kDragPane_SmartDragOnRadio, kDragPane_SmartDragOffRadio);
- for (i = kDragPane_SnapToMonitorCheck;
- i <= kDragPane_SnapWhenResizingCheck; i++)
- HiliteControl((ControlHandle)GetDItemHdl(CPDialog, i), 255);
- }
- SelectDialogItemText(CPDialog, kDragPane_SnapDistanceInput, 0, 32767);
-
- // No support for resize-snapping (yet)
- HiliteControl((ControlHandle)GetDItemHdl(CPDialog,
- kDragPane_SnapWhenResizingCheck), 255);
- } // END SetupPanelItems
-
- // ---------------------------------------------------------------------------
-
- void CleanupPanelItems(DialogPtr CPDialog) {
- long inputNum;
- Str31 text;
-
- if (GetDlogCtlValue(CPDialog, kDragPane_SmartDragOnRadio)) {
- (**gPrefsResource).smartDragOn = true;
- }
- else {
- (**gPrefsResource).smartDragOn = false;
- }
- if (GetDlogCtlValue(CPDialog, kDragPane_SnapToMonitorCheck)) {
- (**gPrefsResource).snapToMonitor = true;
- }
- else {
- (**gPrefsResource).snapToMonitor = false;
- }
- if (GetDlogCtlValue(CPDialog, kDragPane_SnapToWindowCheck)) {
- (**gPrefsResource).snapToWindows = true;
- }
- else {
- (**gPrefsResource).snapToWindows = false;
- }
- if (GetDlogCtlValue(CPDialog, kDragPane_SnapToGridCheck)) {
- (**gPrefsResource).snapToGrid = true;
- }
- else {
- (**gPrefsResource).snapToGrid = false;
- }
- if (GetDlogCtlValue(CPDialog, kDragPane_SnapWhenResizingCheck)) {
- (**gPrefsResource).snapWhenGrowingWindow = true;
- }
- else {
- (**gPrefsResource).snapWhenGrowingWindow = false;
- }
-
- GetDialogItemText(GetDItemHdl(CPDialog, kDragPane_SnapDistanceInput), text);
- if (text[0] == 0) {
- inputNum = 10;
- NumToString(inputNum, text);
- SetDItemText(CPDialog, kDragPane_SnapDistanceInput, text);
- }
- else
- StringToNum(text, &inputNum);
- (**gPrefsResource).snapToDistance = inputNum;
- GetDialogItemText(GetDItemHdl(CPDialog, kDragPane_SnapGridSizeInput), text);
- if (text[0] == 0) {
- inputNum = 10;
- NumToString(inputNum, text);
- SetDItemText(CPDialog, kDragPane_SnapGridSizeInput, text);
- }
- else
- StringToNum(text, &inputNum);
- (**gPrefsResource).snapGridSize = inputNum;
-
- // Update INIT's globals
- *gINITGlobals = **gPrefsResource;
- ChangedResource((Handle)gPrefsResource);
- WriteResource((Handle)gPrefsResource);
- } // END CleanupPanelItems
-
- // ---------------------------------------------------------------------------
-
- void HandlePanelHit(DialogPtr CPDialog, EventRecord *theEvent, short itemHit) {
- short i;
-
- switch(itemHit) {
- case kDragPane_SmartDragOnRadio:
- case kDragPane_SmartDragOffRadio: {
- short hiliteMode;
- SelectRadioBtn(CPDialog, itemHit,
- kDragPane_SmartDragOnRadio, kDragPane_SmartDragOffRadio);
- if (GetDlogCtlValue(CPDialog, kDragPane_SmartDragOnRadio)) {
- hiliteMode = 0;
- SetDlogCtlValue(CPDialog, kDragPane_SnapToMonitorCheck, 1);
- }
- else
- hiliteMode = 255;
- // No support for resizing-snapping (yet)
- for (i = kDragPane_SnapToMonitorCheck;
- i <= kDragPane_SnapToGridCheck; i++)
- HiliteControl((ControlHandle)GetDItemHdl(CPDialog, i), hiliteMode);
- } break;
-
- case kDragPane_SnapToMonitorCheck:
- case kDragPane_SnapToWindowCheck:
- case kDragPane_SnapToGridCheck:
- FlipCtlValue(CPDialog, itemHit);
- if (!GetDlogCtlValue(CPDialog, kDragPane_SnapToMonitorCheck) &&
- !GetDlogCtlValue(CPDialog, kDragPane_SnapToWindowCheck) &&
- !GetDlogCtlValue(CPDialog, kDragPane_SnapToGridCheck)) {
- SelectRadioBtn(CPDialog, kDragPane_SmartDragOffRadio,
- kDragPane_SmartDragOnRadio, kDragPane_SmartDragOffRadio);
- for (i = kDragPane_SnapToMonitorCheck;
- i <= kDragPane_SnapToGridCheck; i++)
- HiliteControl((ControlHandle)GetDItemHdl(CPDialog, i), 255);
- }
- break;
-
- case kDragPane_SnapWhenResizingCheck:
- FlipCtlValue(CPDialog, itemHit);
- break;
-
- case kDragPane_WitchBrewBtn: {
- Handle witchSnd;
- witchSnd = Get1Resource('SND!', 1972);
- if (CreateSndChannel(0) == noErr) {
- PlayAsynch(witchSnd, 0);
- WaitTillSndDone(0);
- DisposeSndChannel(0);
- }
- HUnlock(witchSnd);
- ReleaseResource(witchSnd);
- } break;
- }
-
- // Update INIT instantly
- if (itemHit >= kDragPane_SmartDragOnRadio &&
- itemHit <= kDragPane_SnapGridSizeInput)
- CleanupPanelItems(CPDialog);
- } // END HandlePanelHit
-
- // ---------------------------------------------------------------------------
-
- enum {
- kReturn_Key = 13,
-
- kDelete_Key = (char)8,
- kTab_Key,
-
- kEscape_Key = (char)27,
- kLeftArrow_Key,
- kRightArrow_Key,
- kUpArrow_Key,
- kDownArrow_Key
-
- };
-
- void HandlePanelKeyDown(DialogPtr CPDialog, EventRecord *theEvent, short itemHit) {
- char theKey = theEvent->message & charCodeMask;
-
- if ((theKey >= '0' && theKey <= '9') || theKey == kDelete_Key) {
- }
- else if (theKey == kTab_Key) {
- }
- else if (theKey == kLeftArrow_Key || theKey == kRightArrow_Key) {
- }
- else {
- SysBeep(10);
- theEvent->what = nullEvent;
- }
- } // END HandlePanelKeyDown
-
- // ---------------------------------------------------------------------------
-
- void HandlePanelIdle(DialogPtr CPDialog, EventRecord *theEvent, short itemHit) {
- // Make sure edit text items contain valid input
- Str31 text;
- long inputNum;
-
- GetDialogItemText(GetDItemHdl(CPDialog, kDragPane_SnapDistanceInput), text);
- if (text[0] != 0) {
- StringToNum(text, &inputNum);
- if (inputNum > kMaxSnapValue) {
- inputNum = kMaxSnapValue;
- NumToString(inputNum, text);
- SetDItemText(CPDialog, kDragPane_SnapDistanceInput, text);
- }
- if (inputNum != (**gPrefsResource).snapToDistance) {
- (**gPrefsResource).snapToDistance = inputNum;
- *gINITGlobals = **gPrefsResource;
- }
- }
-
- GetDialogItemText(GetDItemHdl(CPDialog, kDragPane_SnapGridSizeInput), text);
- if (text[0] != 0) {
- StringToNum(text, &inputNum);
- if (inputNum > kMaxSnapValue) {
- inputNum = kMaxSnapValue;
- NumToString(inputNum, text);
- SetDItemText(CPDialog, kDragPane_SnapGridSizeInput, text);
- }
- if (inputNum != (**gPrefsResource).snapGridSize) {
- (**gPrefsResource).snapGridSize = inputNum;
- *gINITGlobals = **gPrefsResource;
- }
- }
- } // END HandlePanelIdle
-
- // ---------------------------------------------------------------------------
-
- void HandlePanelActivate(DialogPtr CPDialog, short message) {
- short i, hiliteMode;
-
- if (message == activDev)
- hiliteMode = 0;
- else
- hiliteMode = 255;
-
- for (i = kDragPane_SmartDragOnRadio;
- i <= kDragPane_SmartDragOffRadio; i++)
- HiliteControl((ControlHandle)GetDItemHdl(CPDialog, i), hiliteMode);
-
- if ((message == activDev && (**gPrefsResource).smartDragOn) ||
- message == deactivDev) {
- for (i = kDragPane_SnapToMonitorCheck;
- i <= kDragPane_SnapToGridCheck; i++)
- HiliteControl((ControlHandle)GetDItemHdl(CPDialog, i), hiliteMode);
- }
- } // END HanelPanelActivate