Создание компонентов предварительного просмотра

В этой главе описываются, как создать Ваш собственный компонент предварительного просмотра. Перечисление демонстрационного компонента включено.

Обзор

Компоненты предварительного просмотра, создающие предварительные просмотры, имеют тип 'pmak' и подтип, соответствующий тип файла, для которого они создают предварительные просмотры.

Компоненты предварительного просмотра, выводящие на экран предварительные просмотры, имеют тип 'pnot' и подтип, соответствующий тип ресурса, который они выводят на экран.

Можно использовать следующие константы для обращения к кодам запроса для каждой из функций, которые должен поддерживать компонент предварительного просмотра.

enum {
  kPreviewShowDataSelector             = 1, /* PreviewShowData */
  kPreviewMakePreviewSelector          = 2, /* PreviewMakePreview */
  kPreviewMakePreviewReferenceSelector = 3, /* PreviewMakePreviewReference */
  kPreviewEventSelector               = 4  /* PreviewEvent */
};

Этот раздел представляет пример программы, выводящий на экран компонент предварительного просмотра для дисплея файлов анимации PICS. Сначала это реализует требуемые функции Менеджера компонентов. Тогда это преобразовывает данные изображения PICT в формат для дисплея как предварительный просмотр.

Реализация требуемых функций компонента

 Перечисление 5-1 предоставляет диспетчеров компонента для компонента предварительного просмотра вместе с банкой, делают, присваивают версию, открываются, и близко функционирует.

Перечисление 5-1  Реализовывая требуемые функции Менеджера компонентов

typedef struct {
    ComponentInstance       self;
} PICSPreviewRecord, **PICSPreviewGlobals;
 
/* entry point for all Component Manager requests */
pascal ComponentResult PICSPreviewDispatch
                            (ComponentParameters *params, Handle store)
{
    OSErr err = badComponentSelector;
    ComponentFunction componentProc = 0;
 
    switch (params->what) {
        case kComponentOpenSelect:
            componentProc = PICSPreviewOpen; break;
        case kComponentCloseSelect:
            componentProc = PICSPreviewClose; break;
        case kComponentCanDoSelect:
            componentProc = PICSPreviewCanDo; break;
        case kComponentVersionSelect:
            componentProc = PICSPreviewVersion; break;
        case kPreviewShowDataSelector:
            componentProc = PICSPreviewShowData; break;
    }
 
    if (componentProc)
        err = CallComponentFunctionWithStorage (store, params,
                                                componentProc);
    return err;
}
 
pascal ComponentResult PICSPreviewCanDo
                            (PICSPreviewGlobals store, short ftnNumber)
{
    switch (ftnNumber) {
        case kComponentOpenSelect:
        case kComponentCloseSelect:
        case kComponentCanDoSelect:
        case kComponentVersionSelect:
        case kPreviewShowDataSelector:
           return true;
       default:
           return false;
    }
}
 
pascal ComponentResult PICSPreviewVersion
                         (PICSPreviewGlobals store)
{
    return 0x00010001;
}
 
pascal ComponentResult PICSPreviewOpen (PICSPreviewGlobals store,
                                        ComponentInstance self)
{
    store = (PICSPreviewGlobals)NewHandle
                          (sizeof (PICSPreviewRecord));
    if (!store) return MemError();
    SetComponentInstanceStorage (self, (Handle)store);
    (**store).self = self;
 
    return noErr;
}
 
pascal ComponentResult PICSPreviewClose
                       (PICSPreviewGlobals store,
                         ComponentInstance self)
{
    if (store) DisposeHandle ((Handle)store);
    return noErr;
}

Отображение данных изображения как предварительный просмотр

Вывести на экран просмотр изображения файла, Ваш PreviewShowData функция вызвана. Перечисление 5-2 включает PICSPreviewShowData функция, предварительно просматривающая файл PICS. Функция загружает первое изображение PICT из файла PICS и использует компонент предварительного просмотра файла PICT для отображения его.

Перечисление 5-2  , Преобразовывающее данные в форму, которая может быть выведена на экран как предварительный просмотр

pascal ComponentResult PICSPreviewShowData(
            PICSPreviewGlobals store, OSType dataType, Handle data,
            const Rect *inHere)
{
    OSErr err = noErr;
    short resRef = 0, saveRes = CurResFile();
    FSSpec theFile;
    Boolean whoCares;
    Handle thePict = nil;
    ComponentInstance ci;
 
    /* because your component has the pnotComponentNeedsNoCache
        flag set, it should only be called to display files */
    if (dataType != rAliasType)
        return paramErr;
 
    /* open up the file to preview */
    if (err = ResolveAlias (nil, (AliasHandle)data, &theFile,
                              &whoCares)) goto bail;
   resRef = FSpOpenResFile (&theFile, fsRdPerm);
    if (err = ResError()) goto bail;
 
    /* get the first 'PICT' */
    UseResFile (resRef);
    thePict = Get1IndResource ('PICT', 1);
    if (!thePict) goto bail;
 
    /* use the PICT preview component to display the preview */
    if (ci = OpenDefaultComponent (ShowFilePreviewComponentType, 'PICT'))
    {
        PreviewShowData (ci, 'PICT', thePict, inHere);
        CloseComponent (ci);
    }
 
bail:
    if (resRef) CloseResFile (resRef);
    if (thePict) DisposeHandle (thePict);
    UseResFile (saveRes);
    return err;
}