NotificationMon.ƒ/Source/NotificationPrefs.c

#include "NotificationMon.h"
 
#define PrefsID         128
#define PrefsOK         1
#define PrefsCAN        2
#define PrefsFlash      6
#define PrefsHide       5
#define PrefsBGSleep    3
#define PrefsFGSleep    4
#define PrefsHilite     9
 
#define ENTER_KEY       0x03
#define TAB_KEY         0x09
#define BACKSPACE_KEY   0x08
#define RETURN_KEY      0x0D
#define ESCAPE_KEY      0x1B
#define ABORT_KEY       '.'
 
pascal void HiliteItemProc(WindowPtr wp, short item);
 
Boolean IsCursorControlKey(char key)
{
    Boolean result = false;
 
    if ( (key >= 0x28) && (key <= 0x31) )
        result = true;
    else if(key == TAB_KEY)
        result = true;
    else if(key == BACKSPACE_KEY)
        result = true;
 
    return result;
}
 
pascal Boolean PrefsFilter(DialogPtr dp, EventRecord *event, short *item)
{
    Boolean result = false;
    char    key;
    long    endTicks;
    Boolean cmdKeyDown;
    
    if( ! ((event->what == keyDown) || (event->what == autoKey)) )
        return false;
        
    key = (char)event->message & charCodeMask;
    cmdKeyDown = (Boolean)((event->modifiers & cmdKey) != false);
    if ( (key == RETURN_KEY)  || (key == ENTER_KEY) ||
        (cmdKeyDown && ((key == 'O') || (key == 'o'))) ) {
        SetDialogCtlHilite(dp,PrefsOK,1);
        Delay(15, &endTicks);
        SetDialogCtlHilite(dp,PrefsOK,0);
        Delay(10, &endTicks);
        result = true;
        *item = PrefsOK;
    } else if((key == ESCAPE_KEY) 
                || ( (cmdKeyDown) 
                    && ( (key == '.') 
                        || (key == '`')
                        || (key == 'c') || (key == 'C') ))) {
        
        SetDialogCtlHilite(dp,PrefsCAN,1);
        Delay(15,&endTicks);
        SetDialogCtlHilite(dp,PrefsCAN,0);
        Delay(10,&endTicks);
        result = true;
        *item = PrefsCAN;
    } else if(IsCursorControlKey(key)) {
        result = false;
    } else if( (key < '0') || (key > '9') ) {
        SysBeep(5);
        result = true;
    }
    
    return result;
}
 
void DoNotificationPrefsDialog(notificationDoc *nmd)
{
    DialogPtr   dp;
    short       itemHit;
    
    dp = GetNewDialog(PrefsID,nil,(WindowPtr)-1);
    SetDialogCtlValue(dp,PrefsHide,nmd->prefs.hideWindowInBackground);
    SetDialogCtlValue(dp,PrefsFlash,nmd->prefs.notifyNewMessage);
    PutNumericItem(dp,PrefsBGSleep,nmd->prefs.backTime);
    PutNumericItem(dp,PrefsFGSleep,nmd->prefs.foreTime);
    SetUserItemProc(dp, PrefsHilite, HiliteItemProc);
    
    ShowWindow(dp);
    do {
        ModalDialog(PrefsFilter,&itemHit);
        switch(itemHit) {
            case PrefsHide:
            case PrefsFlash:
                SetDialogCtlValue(dp,itemHit,
                    !GetDialogCtlValue(dp,itemHit));
                    break;
        }
    } while( (itemHit != PrefsOK) && (itemHit != PrefsCAN));
    
    if(itemHit == PrefsOK) {
        nmd->prefs.hideWindowInBackground = GetDialogCtlValue(dp,PrefsHide);
        nmd->prefs.notifyNewMessage = GetDialogCtlValue(dp,PrefsFlash);
        nmd->prefs.backTime = GetNumericItem(dp,PrefsBGSleep);
        nmd->prefs.foreTime = GetNumericItem(dp,PrefsFGSleep);
    }
    DisposDialog(dp);
}
 
void InitNotificationPrefs(notificationDoc *nmd)
{
    Handle  prefs;
 
    if(prefs = GetResource('PREF',128)) {
        BlockMove(*prefs,&nmd->prefs,sizeof(prefRec));
        ReleaseResource(prefs);
        MoveWindow(&nmd->nWin.port,
            nmd->prefs.windowLoc.left,
            nmd->prefs.windowLoc.top,
            false);
        SizeWindow(&nmd->nWin,
                    RECT_WIDTH(nmd->prefs.windowLoc),
                    RECT_HEIGHT(nmd->prefs.windowLoc),
                    false);
    } else {
        nmd->prefs.hideWindowInBackground = false;
        nmd->prefs.notifyNewMessage = true;
        nmd->prefs.backTime = 60 * 15;      /* Maybe every 15 seconds we run */
        nmd->prefs.foreTime = 60 * 5;       /* we don't need much time */
        /* leaving windowloc field uninitialized */
    }
    
}
 
void UpdateNotificationPrefs(notificationDoc *nmd)
{
    prefRec **prefs;
    short   err;
    
    GetWindowGlobalRect(&nmd->nWin.port, 
                    &nmd->nWin.port.portRect, 
                    &nmd->prefs.windowLoc);
                    
    if(prefs = GetResource('PREF',128)) {
        BlockMove(&nmd->prefs,*prefs,sizeof(prefRec));
        ChangedResource(prefs);
        if(err = ResError()) {
            error("\pChangedResource fail in UpdateNotificationPrefs",err);
            return;
        }
        ReleaseResource(prefs);
    } else { 
        prefs = NewHandle(sizeof(prefRec));
        if(!prefs) {
            error("\pError - update prefs failed.",MemError());
            return;
        }
        BlockMove(&nmd->prefs,*prefs,sizeof(prefRec));
        AddResource(prefs,'PREF',128,"\p");
        if(err = ResError()) {
            error("\pUpdateNotificationPrefs addres fail.",err);
            return;
        }
        ReleaseResource(prefs);
    }
}