Sample Components/SGPictPanel.c

/*
    File:       SGPictPanel.c
 
    Written by: Peter Hoddie
 
    Copyright:  © 1992 by Apple Computer, Inc., all rights reserved.
 
*/
 
#include <Dialogs.h>
#include <Errors.h>
#include <Memory.h>
#include <QuickDraw.h>
#include <Resources.h>
 
#include <QuickTimeComponents.h>
 
#define sgcPictShowTicksType 'TICK'
 
typedef struct {
    ComponentInstance       self;
    ControlHandle           ch;
} PictPanelGlobalsRecord, *PictPanelGlobals;
 
pascal ComponentResult PictPanelDispatcher(ComponentParameters *params, Handle storage);
pascal ComponentResult PictPanelOpen (PictPanelGlobals store, ComponentInstance self);
pascal ComponentResult PictPanelClose (PictPanelGlobals store, ComponentInstance self);
pascal ComponentResult PictPanelCanDo (PictPanelGlobals store, short ftnNumber );
pascal ComponentResult PictPanelVersion (PictPanelGlobals store);
pascal ComponentResult PictPanelPanelGetDitl (PictPanelGlobals store, Handle *ditl);
pascal ComponentResult PictPanelPanelInstall (PictPanelGlobals store, SGChannel c, DialogPtr d, short itemOffset);
pascal ComponentResult PictPanelPanelItem (PictPanelGlobals store, SGChannel c, DialogPtr d, short itemOffset, short itemNum);
pascal ComponentResult PictPanelPanelRemove (PictPanelGlobals store, SGChannel c, DialogPtr d, short itemOffset);
pascal ComponentResult PictPanelPanelGetSettings (PictPanelGlobals store, SGChannel c, UserData *ud, long flags);
pascal ComponentResult PictPanelPanelSetSettings (PictPanelGlobals store, SGChannel c, UserData ud, long flags);
 
// only for PICT channels
pascal ComponentResult SGSetShowTickCount (SGChannel c, Boolean show) = {0x2f3c,2,0x100,0x7000,0xA82A};
pascal ComponentResult SGGetShowTickCount (SGChannel c, Boolean *show) = {0x2f3c,4,0x101,0x7000,0xA82A};
 
pascal ComponentResult PictPanelDispatcher(ComponentParameters *params, Handle storage)
{
    OSErr err = badComponentSelector;
    ComponentFunction componentProc = 0;
 
    switch (params->what) {
        case kComponentOpenSelect: componentProc = PictPanelOpen; break;
        case kComponentCloseSelect: componentProc = PictPanelClose; break;
        case kComponentCanDoSelect: componentProc = PictPanelCanDo; break;
        case kComponentVersionSelect: componentProc = PictPanelVersion; break;
 
        case kSGCPanelGetDitlSelect: componentProc = PictPanelPanelGetDitl; break;
        case kSGCPanelInstallSelect: componentProc = PictPanelPanelInstall; break;
        case kSGCPanelItemSelect: componentProc = PictPanelPanelItem; break;
        case kSGCPanelRemoveSelect: componentProc = PictPanelPanelRemove; break;
        case kSGCPanelGetSettingsSelect: componentProc = PictPanelPanelGetSettings; break;
        case kSGCPanelSetSettingsSelect: componentProc = PictPanelPanelSetSettings; break;
    }
 
    if (componentProc)
        err = CallComponentFunctionWithStorage(storage, params, componentProc);
 
    return err;
}
 
pascal ComponentResult PictPanelCanDo (PictPanelGlobals store, short ftnNumber )
{
    switch (ftnNumber) {
        case kComponentOpenSelect: 
        case kComponentCloseSelect: 
        case kComponentCanDoSelect: 
        case kComponentVersionSelect: 
 
        case kSGCPanelGetDitlSelect: 
        case kSGCPanelInstallSelect: 
        case kSGCPanelItemSelect: 
        case kSGCPanelRemoveSelect: 
        case kSGCPanelGetSettingsSelect: 
        case kSGCPanelSetSettingsSelect: 
            return true;
        default:
            return false;
    }
}
 
pascal ComponentResult PictPanelVersion (PictPanelGlobals store)
{
    return 0x00020001;  
}
 
pascal ComponentResult PictPanelOpen (PictPanelGlobals store, ComponentInstance self)
{
    OSErr err;
 
    store = (PictPanelGlobals)NewPtrClear(sizeof(PictPanelGlobalsRecord));
    if (err = MemError()) goto bail;
 
    store->self = self;
    SetComponentInstanceStorage(self, (Handle)store);
 
bail:
    return err;
}
 
pascal ComponentResult PictPanelClose (PictPanelGlobals store, ComponentInstance self)
{
    if (store) DisposePtr((Ptr)store);
    return noErr;
}
 
pascal ComponentResult PictPanelPanelGetDitl (PictPanelGlobals store, Handle *ditl)
{
    *ditl = GetResource('DITL', 7001); 
    if (!*ditl) return resNotFound;
    DetachResource(*ditl);
    return noErr;
}
 
pascal ComponentResult PictPanelPanelInstall (PictPanelGlobals store, SGChannel c, DialogPtr d, short itemOffset)
{
    Rect r;
    short kind;
    Handle h;
    Boolean ticksShowing;
 
    GetDItem(d, 1 + itemOffset, &kind, &h, &r);
    store->ch = (ControlHandle)h;
    SGGetShowTickCount(c, &ticksShowing);
    SetCtlValue(store->ch, ticksShowing);
 
    return noErr;
}
 
pascal ComponentResult PictPanelPanelItem (PictPanelGlobals store, SGChannel c, DialogPtr d, short itemOffset, short itemNum)
{
    if ((itemNum - itemOffset) == 1) {
        Boolean showing = GetCtlValue(store->ch);
        SetCtlValue(store->ch, !showing);
        SGSetShowTickCount(c, !showing);
    }
 
    return noErr;
}
 
pascal ComponentResult PictPanelPanelRemove (PictPanelGlobals store, SGChannel c, DialogPtr d, short itemOffset)
{
    store->ch = nil;
    return noErr;
}
 
pascal ComponentResult PictPanelPanelGetSettings (PictPanelGlobals store, SGChannel c, UserData *result, long flags)
{
    OSErr err;
    UserData ud;
    Boolean ticksShowing;
 
    if (err = NewUserData(&ud)) goto bail;
    if (err = SGGetShowTickCount(c, &ticksShowing)) goto bail;
    if (err = SetUserDataItem(ud, &ticksShowing, sizeof(ticksShowing), sgcPictShowTicksType, 1)) goto bail;
 
bail:
    if (err) {
        DisposeUserData(ud);
        ud = 0;
    }
    *result = ud;
 
    return err;
}
 
pascal ComponentResult PictPanelPanelSetSettings (PictPanelGlobals store, SGChannel c, UserData ud, long flags)
{
    Boolean ticksShowing;
 
    if (GetUserDataItem(ud, &ticksShowing, sizeof(ticksShowing), sgcPictShowTicksType, 1) == noErr)
        SGSetShowTickCount(c, ticksShowing);
 
    return noErr;
}