/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/
/******************************************************************************
 plActionTableMgr.cpp

 Eric Ellis
******************************************************************************/

#include "HeadSpin.h"
#include "plActionTableMgr.h"


plActionTableMgr::plActionTableMgr(ActionTableInfo& actionTable, ActionCallbackFunc cbFunc)
{
    AddActionTable(actionTable, cbFunc);

    RegisterNotification(SysStartup, this, NOTIFY_SYSTEM_STARTUP);
    RegisterNotification(SysShutdown, this, NOTIFY_SYSTEM_SHUTDOWN);
}


plActionTableMgr::~plActionTableMgr()
{
    UnRegisterNotification(SysStartup, this, NOTIFY_SYSTEM_STARTUP);
    UnRegisterNotification(SysShutdown, this, NOTIFY_SYSTEM_SHUTDOWN);
}


void plActionTableMgr::AddActionTable(ActionTableInfo& actionTable, ActionCallbackFunc cbFunc)
{
    actionTable.ActionCB = new ActionTableMgrCB(cbFunc);
    fActionTables.push_back(&actionTable);
}

CoreExport void *__cdecl MAX_new(size_t size);
CoreExport void __cdecl MAX_delete(void* mem);

class plActionTable : public ActionTable
{
public:
    plActionTable(ActionTableId id, ActionContextId contextId, TSTR& name, HACCEL hDefaults, int numIds, ActionDescription* pOps, HINSTANCE hInst)
        : ActionTable(id, contextId, name, hDefaults, numIds, pOps, hInst) {}
    plActionTable(ActionTableId id, ActionContextId contextId, TSTR& name)
        : ActionTable(id, contextId, name) {}

    void *operator new (size_t)
    {
        return MAX_new(sizeof(plActionTable));
    }
    void operator delete (void * mem)
    {
        MAX_delete(mem);
    }
};

ActionTable* plActionTableMgr::GetActionTable(int i)
{
    if(i > this->NumActionTables())
    {
        return NULL;
    }

    ActionTableInfo* pTableInfo = fActionTables[i];

    if(pTableInfo->Created)
    {
        return GetCOREInterface()->GetActionManager()->FindTable(pTableInfo->TableId);
    }


    ActionTable *pTab = new plActionTable(
        pTableInfo->TableId, 
        pTableInfo->ContextId, 
        pTableInfo->Name, NULL, 
        pTableInfo->Actions.size(), 
        &pTableInfo->Actions[0], 
        hInstance
        );

    // register the action table with the system before we hand it off
    GetCOREInterface()->GetActionManager()->RegisterActionContext(pTableInfo->ContextId, pTableInfo->Name);

    pTableInfo->Created = true;

    return pTab;
}


void plActionTableMgr::SysStartup(void *param, NotifyInfo *info) 
{
    plActionTableMgr* pActionTableMgr = (plActionTableMgr*)param;

//      ((MenuTestUtil*)param)->CreateMenu();  //setup menus

    IActionManager* pActionMgr = GetCOREInterface()->GetActionManager();

    for(int i = 0; i < pActionTableMgr->NumActionTables(); i++)
    {
        ActionTableInfo* pTableInfo = pActionTableMgr->fActionTables[i];

        pActionMgr->ActivateActionTable(pTableInfo->ActionCB, pTableInfo->TableId);
    }
}


void plActionTableMgr::SysShutdown(void *param, NotifyInfo *info) 
{
    plActionTableMgr* pActionTableMgr = (plActionTableMgr*)param;

    IActionManager* pActionMgr = GetCOREInterface()->GetActionManager();

    for(int i = 0; i < pActionTableMgr->NumActionTables(); i++)
    {
        ActionTableInfo* pTableInfo = pActionTableMgr->fActionTables[i];

        pActionMgr->DeactivateActionTable(pTableInfo->ActionCB, pTableInfo->TableId);
    }
}