Graphisoft®

API Development KitVersion: 18

APIPaletteControlCallBackProc

Modeless Palette에 대한 특수 메시지 처리를 위한 사용자 제공 콜백 함수입니다.

    typedef GSErrCode  APIPaletteControlCallBackProc (
        Int32                    referenceID,
        API_PaletteMessageID     messageID,
        GS::IntPtr               param
    );

 

파라미터

referenceID
[in] Modeless Palette를 식별하는 유일 ID입니다.
messageID
[in] Palette 컨트롤 콜백 프로시저에서 처리되는 이벤트입니다.
param API 16
[out] 리턴 파라미터입니다. APIPalMsg_IsPaletteVisible에서 사용합니다.

 

리턴 값

NoError
함수가 성공적으로 완료되었습니다.

다른 공통 API 오류들에 대해서는 API 오류 문서를 보십시오.

 

설명

당신은 ACAPI_RegisterModelessWindow로 이 함수를 등록할 수 있습니다. 이제부터는 당신의 팔레트의 행동을 다른 팔레트들에게 맞춰서 조정하는 것은 당신의 책임입니다.

다음 타입의 이벤트들이 당신의 커스텀 창에 나타날 것입니다:

메시지 타입 설명
APIPalMsg_ClosePalette API가 애드온에게 팔레트를 닫으라고 요청합니다.
APIPalMsg_HidePalette_Begin 팔레트가 어떤 이유로 숨겨져야 합니다. 예. 사용자가 메뉴에서 Hide All Palettes를 선택함.
APIPalMsg_HidePalette_End 필요한 경우 팔레트는 다시 나타나게 됩니다.
APIPalMsg_DisableItems_Begin 사용자가 입력을 수행하는 중이므로 특정 팔레트 항목들이 비활성화되어야 합니다. 입력하는 동안 데이터베이스를 수정하지 말아야 하므로 이것은 필수입니다.
APIPalMsg_DisableItems_End APIPalMsg_DisableItems_Begin이 끝났으므로 팔레트에서 항목들을 활성화합니다.
APIPalMsg_OpenPalette Featuring API 15 Work Environment에서 설정한 대로 팔레트를 자동으로 열어야 할 때 보냅니다. 생성될 때 팔레트는 GUID를 전달해야 합니다: 이 작업을 하려면 DG::Palette (resourceId, paletteGuid)
APIPalMsg_IsPaletteVisible Featuring API 16 Work Environment는 현재 문서를 닫거나 애플리케이션을 종료할 때 팔레트에게 가시성 상태를 쿼리합니다. 만약 param에서 true(실제로는 bool*)를 리턴하면, ArchiCAD는 다음 실행시 그 애드온에게 APIPalMsg_OpenPalette를 보냅니다. 그러면 당신은 애드온의 팔레트를 다시 열 수 있습니다.

 

예제

const GS::Guid paletteGuid ("{A20B280D-928B-4258-9A4A-8617B57124F8}");

void        MainPaletteDestroyed (void);

// --- MainPalette -----------------------------------------------------------

class MainPalette: public DG::Palette,
                   public GS::DisposableObject
{
friend class    MainObserver;

public:

    MainPalette (short resId);
    ~MainPalette ();
};


// --- MainObserver ---------------------------------------------------------

class MainObserver: private DG::PanelObserver,
                    public  DG::CompoundItemObserver,
                    public  GS::DisposableObject,
                    public  GS::DisposeHandler
{
private:
    MainPalette*    paletteQL;

public:
    MainObserver (MainPalette* mainPalette);
    ~MainObserver ();

    virtual void    PanelOpened (const DG::PanelOpenEvent& ev);
    virtual void    PanelClosed (const DG::PanelCloseEvent& ev);
    virtual void    PanelCloseRequested (const DG::PanelCloseRequestEvent& ev, bool* accept);
    virtual void    DisposeRequested (GS::DisposableObject& source);
};


// --- MainPalette --------------------------------------------------------------

MainPalette::MainPalette (short resId):
    DG::Palette (resId, paletteGuid)
{
    SetDefaultGarbageCollector ();
}


MainPalette::~MainPalette ()
{
}


// --- MainObserver ---------------------------------------------------------

MainObserver::MainObserver (MainPalette* mainPalette):
    paletteQL (mainPalette)
{
    paletteQL->Attach (*this);
    AttachToAllItems (*paletteQL);
    paletteQL->BeginEventProcessing ();

    SetDefaultGarbageCollector ();
    paletteQL->SetDisposeHandler (*this);
}


MainObserver::~MainObserver ()
{
}


void    MainObserver::PanelOpened (const DG::PanelOpenEvent& /*ev*/)
{
}


void    MainObserver::PanelClosed (const DG::PanelCloseEvent& /*ev*/)
{
}


void    MainObserver::PanelCloseRequested (const DG::PanelCloseRequestEvent& /*ev*/, bool* /*accept*/)
{
    paletteQL->EndEventProcessing ();
    paletteQL->MarkAsDisposable ();
}

// -----------------------------------------------------------------------------
// 팔레트 파괴를 처리함
// -----------------------------------------------------------------------------

void    MainObserver::DisposeRequested (GS::DisposableObject& source)
{
    if (&source == paletteQL) {
        paletteQL = NULL;
        MainPaletteDestroyed ();
        MarkAsDisposable ();    // 가비지 컬렉터가 나중에 지울 수 있게 표시함
    }
}


MainPalette* mainPalette = NULL;
MainObserver* mainObserver = NULL;


void        MainPaletteDestroyed (void);
{
    mainPalette = NULL;
}

// -----------------------------------------------------------------------------
// 특수 팔레트 메시지들
// -----------------------------------------------------------------------------
static GSErrCode __ACENV_CALL PaletteAPIControlCallBack (Int32 referenceID, API_PaletteMessageID messageID, GS::IntPtr param)

{
    if (referenceID == paletteRefId) {
        switch (messageID) {
            case APIPalMsg_OpenPalette:
                if (mainPalette != NULL) {
                    mainPalette->Show ();
                } else {
                    UseOwnResClass resClass;
                    mainPalette  = new MainPalette (32400);
                    mainObserver = new MainObserver (mainPalette);
                    mainPalette->Show ();
                }
                break;

            case APIPalMsg_ClosePalette:
                if (mainPalette != NULL) {
                    mainPalette->Hide ();
                    mainPalette->SendCloseRequest ();
                }
                break;

            case APIPalMsg_HidePalette_Begin:
                if (mainPalette != NULL) {
                    mainPalette->Hide ();
                    SetMenuItemTextState (false);
                }
                break;

            case APIPalMsg_HidePalette_End:
                if (mainPalette != NULL) {
                    mainPalette->Show ();
                }
                break;

            case APIPalMsg_DisableItems_Begin:
                if (mainPalette != NULL) {
                    mainPalette->DisableItems ();
                }
                break;

            case APIPalMsg_DisableItems_End:
                if (mainPalette != NULL) {
                    mainPalette->EnableItems ();
                }
                break;

            case APIPalMsg_IsPaletteVisible:
                * reinterpret_cast (param) = (mainObserver != NULL);
                break;

            default:
                break;
        }
    }

    return NoError;
}

// -----------------------------------------------------------------------------
// ArchiCAD로부터 알림들을 처리함
// -----------------------------------------------------------------------------

GSErrCode __ACENV_CALL APIEventHandler (API_NotifyEventID notifID, Int32 /*param*/)
{
    switch (notifID) {
        case APINotify_NewAndReset:
        case APINotify_Quit:
            if (mainPalette != NULL) {
                mainPalette->Hide ();
                mainPalette->SendCloseRequest ();
            }
            break;
    }

    return NoError;
}


//------------------------------------------------------
// 의존성 정의
//------------------------------------------------------
API_AddonType   __ACENV_CALL    CheckEnvironment (API_EnvirParams* /*envir*/)
{
    return APIAddon_Preload;
}       // RegisterAddOn


//------------------------------------------------------
// Add-On 초기화
//------------------------------------------------------
GSErrCode   __ACENV_CALL    Initialize (void)

{
    GSErrCode err = ACAPI_RegisterModelessWindow (paletteRefId, PaletteAPIControlCallBack,
                                                  API_PalEnabled_FloorPlan + API_PalEnabled_Section + API_PalEnabled_Elevation +
                                                  API_PalEnabled_InteriorElevation + API_PalEnabled_3D +
                                                  API_PalEnabled_Detail + API_PalEnabled_Worksheet + API_PalEnabled_Layout +
                                                  API_PalEnabled_DocumentFrom3D, GSGuid2APIGuid (paletteGuid));

    if (err == NoError)
        err = ACAPI_Notify_CatchProjectEvent (APINotify_NewAndReset | APINotify_Quit, APIEventHandler);

    return err;
}


//------------------------------------------------------
// 최종 호출...
//------------------------------------------------------
GSErrCode   __ACENV_CALL    FreeData (void)

{
    ACAPI_Notify_CatchProjectEvent (APINotify_NewAndReset | APINotify_Quit, NULL);
    if (mainPalette != NULL) {
        mainPalette->Hide ();
        mainPalette->SendCloseRequest ();
    }

    ACAPI_UnregisterModelessWindow (paletteRefId);

    return NoError;
}

 

요구사항

버전: API 4.1 또는 이후
헤더: APIdefs_Callback.h

 

참고사항

ACAPI_RegisterModelessWindow, API 함수