#if !defined(__TGARXENTRYPOINT_H__) #define __TGARXENTRYPOINT_H__ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // Only can incule this file in Source file(.c/.cpp) Only one time! // Do not include this file in other "Include file(.h/.hpp)"! --wyg #define TG_BEGIN_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT_EX(CArxEntryApp) \ CArxEntryApp theTGArxEntryApp; \ extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) \ { \ if (msg == AcRx::kInitAppMsg) \ { \ #define TG_BEGIN_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ TG_BEGIN_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT_EX(TGArxEntryApp) \ #define ON_TG_ARXCMD_GROUP(CArxCmdGroup) \ theTGArxEntryApp.AddArxCommandGroup(RUNTIME_CLASS(CArxCmdGroup)); \ #define ON_TG_ADSCMD_GROUP(CAdsCmdGroup) \ theTGArxEntryApp.AddAdsCommandGroup(RUNTIME_CLASS(CAdsCmdGroup)); \ #define TG_END_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ } \ return theTGArxEntryApp.DispatchEntryMsg(msg, pkt); \ } \ const TGArxEntryApp* GetArxEntryApp() \ { \ return &theTGArxEntryApp; \ } \ #define TG_IMPLEMENT_ARXAPP_ENTRYPOINT(CArxEntryApp) \ TG_BEGIN_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT_EX(CArxEntryApp) \ TG_END_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ #define TG_IMPLEMENT_CMD_ARXAPP_ENTRYPOINT(CArxCmdGroup, CAdsCmdGroup) \ TG_BEGIN_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ ON_TG_ARXCMD_GROUP(CArxCmdGroup) \ ON_TG_ADSCMD_GROUP(CAdsCmdGroup) \ TG_END_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ #define TG_IMPLEMENT_ARXCMD_ARXAPP_ENTRYPOINT(CArxCmdGroup) \ TG_BEGIN_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ ON_TG_ARXCMD_GROUP(CArxCmdGroup) \ TG_END_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ #define TG_IMPLEMENT_ADSCMD_ARXAPP_ENTRYPOINT(CAdsCmdGroup) \ TG_BEGIN_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ ON_TG_ADSCMD_GROUP(CAdsCmdGroup) \ TG_END_IMPLEMENT_CMD_MAP_ARXAPP_ENTRYPOINT() \ #include "TGDebug.h" #include "TGArxEntryApp.h" #include "TGArxCmdGroup.h" #include "TGAdsCmdGroup.h" IMPLEMENT_DYNCREATE(TGArxEntryApp, CObject) TGArxEntryApp::TGArxEntryApp() { m_eCurMsg = AcRx::kNullMsg; m_pCurParam = NULL; m_pThisArxApp = NULL; // Must be 1 --wyg m_iArxFunCode = 1; m_iAdsFunCode = 1; } TGArxEntryApp::~TGArxEntryApp() { } void TGArxEntryApp::AddArxCommandGroup(CRuntimeClass* pClass) { TGASSERT(pClass != NULL); TGASSERT(pClass->IsDerivedFrom(RUNTIME_CLASS(TGArxCmdGroup))); TGASSERT(GetArxCommandGroup(pClass) == NULL); TGArxCmdGroup* pArxCmdGroup = (TGArxCmdGroup*)pClass->CreateObject(); TGASSERT(pArxCmdGroup != NULL); pArxCmdGroup->m_pArxEntryApp = this; m_arArxCmdGroups.Add(pArxCmdGroup); } void TGArxEntryApp::AddAdsCommandGroup(CRuntimeClass* pClass) { TGASSERT(pClass != NULL); TGASSERT(pClass->IsDerivedFrom(RUNTIME_CLASS(TGAdsCmdGroup))); TGASSERT(GetAdsCommandGroup(pClass) == NULL); TGAdsCmdGroup* pAdsCmdGroup = (TGAdsCmdGroup*)pClass->CreateObject(); TGASSERT(pAdsCmdGroup != NULL); pAdsCmdGroup->m_pArxEntryApp = this; m_arAdsCmdGroups.Add(pAdsCmdGroup); } TGArxCmdGroup* TGArxEntryApp::GetArxCommandGroup(CRuntimeClass* pClass) { TGASSERT(pClass != NULL); TGArxCmdGroup* pArxCmdGroup; int iSize = m_arArxCmdGroups.GetSize(); for (int i = 0; i < iSize; i++) { pArxCmdGroup = m_arArxCmdGroups[i]; TGASSERT(pArxCmdGroup != NULL); if (pArxCmdGroup->IsKindOf(pClass)) return pArxCmdGroup; } return NULL; } TGAdsCmdGroup* TGArxEntryApp::GetAdsCommandGroup(CRuntimeClass* pClass) { TGASSERT(pClass != NULL); TGAdsCmdGroup* pAdsCmdGroup; int iSize = m_arAdsCmdGroups.GetSize(); for (int i = 0; i < iSize; i++) { pAdsCmdGroup = m_arAdsCmdGroups[i]; TGASSERT(pAdsCmdGroup != NULL); if (pAdsCmdGroup->IsKindOf(pClass)) return pAdsCmdGroup; } return NULL; } AcRx::AppRetCode TGArxEntryApp::DispatchEntryMsg(AcRx::AppMsgCode eMsg, void* pParam) { m_eCurMsg = eMsg; m_pCurParam = pParam; AcRx::AppRetCode eRetCode = AcRx::kRetOK; switch (eMsg) { case AcRx::kInitAppMsg: m_pThisArxApp = pParam; eRetCode = On_PreInitAppMsg(); break; case AcRx::kLoadDwgMsg: eRetCode = On_kLoadDwgMsg(); break; case AcRx::kUnloadDwgMsg: eRetCode = On_kUnloadDwgMsg(); break; case AcRx::kInvkSubrMsg: eRetCode = On_kInvkSubrMsg(); break; case AcRx::kInitDialogMsg: eRetCode = On_kInitDialogMsg((CAdUiTabExtensionManager*)pParam); break; case AcRx::kEndDialogMsg: eRetCode = On_kEndDialogMsg(); break; case AcRx::kNullMsg: eRetCode = On_kNullMsg(); break; case AcRx::kCfgMsg: eRetCode = On_kCfgMsg(); break; case AcRx::kOleUnloadAppMsg: eRetCode = On_kOleUnloadAppMsg(); break; case AcRx::kDependencyMsg: eRetCode = On_kDependencyMsg(); break; case AcRx::kNoDependencyMsg: eRetCode = On_kNoDependencyMsg(); break; case AcRx::kSaveMsg: eRetCode = On_kSaveMsg(); break; case AcRx::kEndMsg: eRetCode = On_kEndMsg(); break; case AcRx::kPreQuitMsg: eRetCode = On_kPreQuitMsg(); break; case AcRx::kQuitMsg: eRetCode = On_kQuitMsg(); break; case AcRx::kUnloadAppMsg: eRetCode = On_kUnloadAppMsg(); break; } return eRetCode; } void TGArxEntryApp::LockApplication() { TGASSERT(m_pThisArxApp != NULL); acrxDynamicLinker->lockApplication(m_pThisArxApp); } void TGArxEntryApp::UnlockApplication() { TGASSERT(m_pThisArxApp != NULL); acrxDynamicLinker->unlockApplication(m_pThisArxApp); } void* TGArxEntryApp::GetThisArxApp() { return m_pThisArxApp; } AcRx::AppRetCode TGArxEntryApp::On_PreInitAppMsg() { TGASSERT(m_pThisArxApp != NULL); acrxDynamicLinker->unlockApplication(m_pThisArxApp); acrxDynamicLinker->registerAppMDIAware(m_pThisArxApp); return On_kInitAppMsg(); } AcRx::AppRetCode TGArxEntryApp::On_kInitAppMsg() { TGArxCmdGroup* pArxCmdGroup; int iSize = m_arArxCmdGroups.GetSize(); for (int i = 0; i < iSize; i++) { pArxCmdGroup = m_arArxCmdGroups[i]; TGASSERT(pArxCmdGroup != NULL); pArxCmdGroup->OnAddCommands(); } return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kUnloadAppMsg() { TGArxCmdGroup* pArxCmdGroup; int iSize = m_arArxCmdGroups.GetSize(); int i = 0; for (i = 0; i < iSize; i++) { pArxCmdGroup = m_arArxCmdGroups[i]; TGASSERT(pArxCmdGroup != NULL); pArxCmdGroup->OnRemoveCommands(); delete pArxCmdGroup; } TGAdsCmdGroup* pAdsCmdGroup; iSize = m_arAdsCmdGroups.GetSize(); for (i = 0; i < iSize; i++) { pAdsCmdGroup = m_arAdsCmdGroups[i]; TGASSERT(pAdsCmdGroup != NULL); delete pAdsCmdGroup; } return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kLoadDwgMsg() { TGAdsCmdGroup* pAdsCmdGroup; int iSize = m_arAdsCmdGroups.GetSize(); for (int i = 0; i < iSize; i++) { pAdsCmdGroup = m_arAdsCmdGroups[i]; TGASSERT(pAdsCmdGroup != NULL); pAdsCmdGroup->OnAddCommands(); } return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kUnloadDwgMsg() { TGAdsCmdGroup* pAdsCmdGroup; int iSize = m_arAdsCmdGroups.GetSize(); for (int i = 0; i < iSize; i++) { pAdsCmdGroup = m_arAdsCmdGroups[i]; TGASSERT(pAdsCmdGroup != NULL); pAdsCmdGroup->OnRemoveCommands(); } return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kInvkSubrMsg() { TGAdsCmdGroup* pAdsCmdGroup; int iSize = m_arAdsCmdGroups.GetSize(); for (int i = 0; i < iSize; i++) { pAdsCmdGroup = m_arAdsCmdGroups[i]; TGASSERT(pAdsCmdGroup != NULL); pAdsCmdGroup->OnInvkSubCommand(); } return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kInitDialogMsg(CAdUiTabExtensionManager* pTabMgr) { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kEndDialogMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kNullMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kCfgMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kOleUnloadAppMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kDependencyMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kNoDependencyMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kSuspendMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kSaveMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kEndMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kPreQuitMsg() { return AcRx::kRetOK; } AcRx::AppRetCode TGArxEntryApp::On_kQuitMsg() { return AcRx::kRetOK; } IMPLEMENT_DYNAMIC(TGArxCmdGroup, CObject) TGArxCmdGroup::TGArxCmdGroup() { m_pArxEntryApp = NULL; } TGArxCmdGroup::~TGArxCmdGroup() { } LPCTSTR TGArxCmdGroup::GetStringFromId(int iID) { return NULL; } void TGArxCmdGroup::OnAddCommands() { AcRxFunctionPtr pfnMainProc = OnGetMainProc(); TGASSERT(pfnMainProc != NULL); TGArxCmdInfo* pCmdEntry = OnGetCmdEntry(); TGASSERT(pCmdEntry != NULL); LPCTSTR pszGroupName = OnGetGroupName(); TGASSERT(pszGroupName != NULL); int iSize = OnGetCmdEntrySize(); for (int i = 0; i < iSize; i++, m_pArxEntryApp->m_iArxFunCode++) { pCmdEntry[i].pszGroup = pszGroupName; pCmdEntry[i].iFunCode = m_pArxEntryApp->m_iArxFunCode; if (pCmdEntry[i].idLocal > 0) { acedRegCmds->addCommand(pszGroupName, pCmdEntry[i].pszInter, GetStringFromId(pCmdEntry[i].idLocal), pCmdEntry[i].lFlags, pfnMainProc, NULL, m_pArxEntryApp->m_iArxFunCode); } else { acedRegCmds->addCommand(pszGroupName, pCmdEntry[i].pszInter, pCmdEntry[i].pszLocal, pCmdEntry[i].lFlags, pfnMainProc, NULL, m_pArxEntryApp->m_iArxFunCode); } } } void TGArxCmdGroup::OnRemoveCommands() { LPCTSTR pszGroupName = OnGetGroupName(); TGASSERT(pszGroupName != NULL); acedRegCmds->removeGroup(pszGroupName); } void TGArxCmdGroup::OnInvkSubCommand() { TGArxCmdInfo* pCmdEntry = OnGetCmdEntry(); TGASSERT(pCmdEntry != NULL && OnGetCmdEntrySize() > 0); int iFunCode = acedGetFunCode(); int iFunIndex = iFunCode - pCmdEntry[0].iFunCode; if (iFunIndex < 0 || iFunIndex >= OnGetCmdEntrySize() || pCmdEntry[iFunIndex].iFunCode != iFunCode) return; (this->*pCmdEntry[iFunIndex].pFnCmd)(); } IMPLEMENT_DYNAMIC(TGAdsCmdGroup, CObject) TGAdsCmdGroup::TGAdsCmdGroup() { m_pArxEntryApp = NULL; } TGAdsCmdGroup::~TGAdsCmdGroup() { } void TGAdsCmdGroup::OnAddCommands() { TGAdsCmdInfo* pCmdEntry = OnGetCmdEntry(); TGASSERT(pCmdEntry != NULL); int iSize = OnGetCmdEntrySize(); for (int i = 0; i < iSize; i++, m_pArxEntryApp->m_iAdsFunCode++) { pCmdEntry[i].iFunCode = m_pArxEntryApp->m_iAdsFunCode; if (acedDefun(pCmdEntry[i].pszName, m_pArxEntryApp->m_iAdsFunCode) == RTNORM) { // not use or to be repaired // if (pCmdEntry[i].bRegFunc) // acedRegFunc(pCmdEntry[i].pFnCmd, m_pArxEntryApp->m_iAdsFunCode); } } } void TGAdsCmdGroup::OnRemoveCommands() { TGAdsCmdInfo* pCmdEntry = OnGetCmdEntry(); TGASSERT(pCmdEntry != NULL); int iSize = OnGetCmdEntrySize(); for (int i = 0; i < iSize; i++) { acedUndef(pCmdEntry[i].pszName, pCmdEntry[i].iFunCode); } } void TGAdsCmdGroup::OnInvkSubCommand() { TGAdsCmdInfo* pCmdEntry = OnGetCmdEntry(); TGASSERT(pCmdEntry != NULL && OnGetCmdEntrySize() > 0); int iFunCode = acedGetFunCode(); int iFunIndex = iFunCode - pCmdEntry[0].iFunCode; if (iFunIndex < 0 || iFunIndex >= OnGetCmdEntrySize() || pCmdEntry[iFunIndex].iFunCode != iFunCode) return; #ifdef RENDER // not use or to be repaired // if (pCmdEntry[iFunIndex].bRenderCmd) // InitRender(false); #endif // RENDER if (!(this->*pCmdEntry[iFunIndex].pFnCmd)()) acedRetVoid(); } #endif // __TGARXENTRYPOINT_H__