License delivery maintenance is planned for Saturday, July 26, between 12:00 and 20:00 CEST. During this time, you may experience outages or limited availability across our services, including BIMcloud SaaS, License Delivery, Graphisoft ID (for customer and company management), Graphisoft Store, and BIMx Web Viewer. More details…
2015-07-14
09:49 PM
- last edited on
2023-07-13
04:20 PM
by
Doreena Deng
Code: //////////////////////////////////////////////////////////////////////// // Addon.cpp // --- Addon ------------------------------------------------------------ ... #include "Palette.h" ... GSErrCode __ACENV_CALL Initialize (void) { GSErrCode err = NoError; // Prevent the add-on auto-unloading ACAPI_KeepInMemory(1); // Install menu handler err = ACAPI_Install_MenuHandler (32500, APIMenuCommandProc_32500); ... return err; } /* Initialize */ GSErrCode __ACENV_CALL FreeData (void) { ... Palette::DeleteInstance(); return NoError; } /* FreeData */ GSErrCode __ACENV_CALL APIMenuCommandProc_32500 (const API_MenuParams *menuParams) { DBPrintf ("Test::APIMenuCommandProc_32500() %d/%d\n", menuParams->menuItemRef.menuResID, menuParams->menuItemRef.itemIndex); ACAPI_KeepInMemory(1); Palette::ToggleVisibility(); return NoError; } //////////////////////////////////////////////////////////////////////// // Palette.h #pragma once; // --- Palette ------------------------------------------------------------ class Palette: public DG::Palette { friend class PaletteObserver; private: static Palette* m_pPalette; static PaletteObserver* m_pPaletteObserver; enum { CloseButtonId = 1 }; DG::Button closeButton; private: Palette(short resId); public: ~Palette(); void SelectionChanged(const API_Neig *selElemNeig); static Palette& GetInstance(); static bool HasInstance(); static void DeleteInstance(); static void ToggleVisibility(); }; // --- PaletteObserver ------------------------------------------------------------ class PaletteObserver: private DG::PanelObserver, public DG::ButtonItemObserver, public DG::CompoundItemObserver { private: Palette* m_palette; public: PaletteObserver (Palette* palette); ~PaletteObserver(); virtual void SourceDestroyed (GS::EventSource* evSource); virtual void PanelOpened (const DG::PanelOpenEvent& ev); virtual void PanelCloseRequested (const DG::PanelCloseRequestEvent& ev, bool* accepted); virtual void PanelClosed (const DG::PanelCloseEvent& ev); virtual void PanelResized (const DG::PanelResizeEvent& ev); virtual void ButtonClicked (const DG::ButtonClickEvent& ev); }; //////////////////////////////////////////////////////////////////////// // Palette.cpp #if !defined (ACExtension) #define ACExtension #endif #if defined (_MSC_VER) #if !defined (WINDOWS) #define WINDOWS #endif #endif #if defined (WINDOWS) #include "Win32Interface.hpp" #pragma warning (disable: 4068) #endif // ------------------------------ Includes ------------------------------------- #include <stdio.h> #include <math.h> #include <string.h> #if defined (macintosh) #include <MacTypes.h> #endif #include "DG.h" #include "DGModule.hpp" #include "ACAPinc.h" #include "APICommon.h" // also includes GSRoot.hpp #include "Palette.h" static GS::Guid PaletteGuid ("{9597C98D-95BD-48d9-9999-C2297834806B}"); static GSErrCode __ACENV_CALL ModelessWindowCallBack (long referenceID, API_PaletteMessageID messageID) { if (Palette::HasInstance() && referenceID == Palette::GetInstance().GetId()) { switch (messageID) { case APIPalMsg_ClosePalette: Palette::GetInstance().SendCloseRequest(); break; case APIPalMsg_HidePalette_Begin: break; case APIPalMsg_HidePalette_End: break; case APIPalMsg_DisableItems_Begin: break; case APIPalMsg_DisableItems_End: break; } } return NoError; } // --- Palette ------------------------------------------------------------ /*static*/ Palette* Palette::m_pPalette = NULL; /*static*/ PaletteObserver* Palette::m_pPaletteObserver = NULL; /////////////////////////////////////////// /*static*/ Palette& Palette::GetInstance() { if (!m_pPalette) { GSResModule actResModule = ACAPI_UseOwnResModule (); m_pPalette = new Palette(32420); ACAPI_ResetResModule (actResModule); m_pPaletteObserver = new PaletteObserver(m_pPalette); } return *m_pPalette; } /*static*/ bool Palette::HasInstance() { return m_pPalette != NULL; } /*static*/ void Palette::DeleteInstance() { DBASSERT(m_pPalette != NULL); if (m_pPalette != NULL) { delete m_pPalette; m_pPalette = NULL; } if (m_pPaletteObserver != NULL) { delete m_pPaletteObserver; m_pPaletteObserver = NULL; } } /*static*/ void Palette::ToggleVisibility() { if (m_pPalette != NULL && m_pPalette->IsVisible()) { m_pPalette->EndEventProcessing(); m_pPalette->Hide(); } else { Palette::GetInstance().BeginEventProcessing(); m_pPalette->Show(); } } ////////////////////////////////////////////////////////// Palette::Palette(short resId) : DG::Palette(resId, PaletteGuid), closeButton (GetReference (), CloseButtonId) { ACAPI_RegisterModelessWindow (GetId(), ModelessWindowCallBack, API_PalEnabled_FloorPlan + API_PalEnabled_Section + API_PalEnabled_Detail + API_PalEnabled_Layout + API_PalEnabled_3D ); } Palette::~Palette () { ACAPI_UnregisterModelessWindow (GetId()); } void Palette::SelectionChanged(const API_Neig *selElemNeig) { if (selElemNeig->neigID != APINeig_None) { DBPrintf("Last selected element: NeigID %d; guid: %s, inIndex: %d\n", selElemNeig->neigID, (const char *) APIGuid2GSGuid (selElemNeig->guid).ToUniString ().ToCStr (), selElemNeig->inIndex); closeButton.Enable(); } else { DBPrintf("All elements deselected\n"); closeButton.Disable(); } } // --- PaletteObserver ------------------------------------------------------------ PaletteObserver::PaletteObserver (Palette* palette) : m_palette (palette) { if (DBVERIFY (m_palette != NULL)) { palette->Attach (*this); AttachToAllItems (*m_palette); } } PaletteObserver::~PaletteObserver () { if (m_palette != NULL) { m_palette->Detach (*this); DetachFromAllItems (*m_palette); } } // ... Public methods .......................................................... void PaletteObserver::SourceDestroyed (GS::EventSource* evSource) { if (evSource == m_palette) { //MarkAsFinished (); //notesObserver->FindPaletteDestroyed (); //palette = NULL; } } // ... Dialog notifications .................................................... void PaletteObserver::PanelOpened (const DG::PanelOpenEvent& /*ev*/) { SetMenuItemMark(32500, 1, true); /*palette->findEdit.SetText (palette->findData->findText); palette->replaceEdit.SetText (palette->findData->replaceText); FindValidate (); if (palette->findData->findWholeWord) palette->wholeWordCheck.Check (); if (palette->findData->findMatchCase) palette->matchCaseCheck.Check (); if (palette->findData->findWrap) palette->wrapCheck.Check (); if (palette->findData->findUp) palette->upRadio.Select (); else palette->downRadio.Select (); palette->findEdit.SetFocus ();*/ } void PaletteObserver::PanelCloseRequested (const DG::PanelCloseRequestEvent& /*ev*/, bool* /*accepted*/) { m_palette->EndEventProcessing (); } void PaletteObserver::PanelClosed (const DG::PanelCloseEvent& /*ev*/) { SetMenuItemMark(32500, 1, false); } void PaletteObserver::PanelResized (const DG::PanelResizeEvent& ev) { short dh = ev.GetHorizontalChange (); short dv = ev.GetVerticalChange (); m_palette->BeginMoveResizeItems(); //dialog->separator.Move (dh, 0); m_palette->closeButton.Move (dh, dv); m_palette->EndMoveResizeItems(); } // ... Dialog item notifications ............................................... void PaletteObserver::ButtonClicked (const DG::ButtonClickEvent& ev) { if (ev.GetSource () == &m_palette->closeButton) { m_palette->SendCloseRequest (); } }
2015-07-20 12:45 PM
Resource chain is gone (also ACAPI_UseOwnResModule() and ACAPI_ResetResModule() along with it)So you should remove all of your ACAPI_UseOwnResModule() and ACAPI_ResetResModule() calls and then that problem will be solved
OS X internally maintained a stack of open resource files called the resource chain. Whenever you want to load a resource, the system searched downwards in this stack to find the resource in any of the open resource files below the current one.
We removed that implicit mechanism; you'll have to specify each and every time the resource module explicitly (usually with ACAPI_GetOwnResModule()).
Palette::Palette(short resId) : DG::Palette(resId, PaletteGuid),to this:
Palette::Palette(short resId) : DG::Palette(ACAPI_GetOwnResModule(), resId, ACAPI_GetOwnResModule(), PaletteGuid),(You can find DG::Palette::Palette constructor in DGDialog.hpp header file.)
2015-07-20 03:35 PM
2015-07-21 04:13 PM
/* Text appearing in the menu */ 'STR#' 32500 "Menu strings" { /* [ ] */ "Test" /* [ ] */ "DG Functions" /* [ 1] */ "Open Example Palette" } 'STR#' 32520 "Prompt strings" { /* [ ] */ "Test" /* [ ] */ "DG Functions" /* [ 1] */ "Open Example Palette" } /* ---------------------------------------------------------- Example Palette */ 'GDLG' 32590 Palette | hGrow | close 0 0 160 40 "Test Palette" { /* [ 1] */ Button 10 10 140 20 LargePlain "Hide" } 'DLGH' 32590 DLG_32580_Test_Palette { 1 "" Button_0 }ExamplePalette.hpp
// ---------------------------------- Includes --------------------------------- #include "APIEnvir.h" #include "ACAPinc.h" #include "DG.h" #include "DGModule.hpp" #include "DisposableObject.hpp" #define EXAMPLEPALETTE_RESID 32590 // --- ExamplePalette ---------------------------------------------------------- class ExamplePalette: public DG::Palette, public DG::PanelObserver, public DG::ButtonItemObserver, public DG::CompoundItemObserver, public GS::DisposableObject { private: enum { HideButtonId = 1 }; DG::Button hideButton; ExamplePalette (GSResModule dialResModule, short resId); protected: virtual void PanelOpened (const DG::PanelOpenEvent& ev) override; virtual void PanelResized (const DG::PanelResizeEvent& ev) override; virtual void PanelCloseRequested (const DG::PanelCloseRequestEvent& ev, bool* accept) override; virtual void ButtonClicked (const DG::ButtonClickEvent& ev) override; public: static const GS::Guid paletteGuid; static Int32 paletteRefId; ExamplePalette (); ~ExamplePalette (); static GSErrCode __ACENV_CALL PaletteAPIControlCallBack (Int32 referenceID, API_PaletteMessageID messageID, GS::IntPtr param); }; // --- ExamplePaletteManager --------------------------------------------------- class ExamplePaletteManager : public GS::DisposeHandler { private: ExamplePalette* examplePalette; ExamplePaletteManager (); ExamplePaletteManager (const ExamplePaletteManager& source); //disabled ExamplePaletteManager operator= (const ExamplePaletteManager& source); //disabled public: ~ExamplePaletteManager (); static ExamplePaletteManager& GetInstance (); static void OpenExamplePalette (); static void CloseExamplePalette (); static bool IsExamplePaletteOpened (); ExamplePalette* GetExamplePalette (); virtual void DisposeRequested (GS::DisposableObject& source) override; };
// ---------------------------------- Includes --------------------------------- #include "ExamplePalette.hpp" //------------------------------ Class ExamplePalette -------------------------- const GS::Guid ExamplePalette::paletteGuid ("{D8A0A01F-1184-40F2-B8A8-28CF30714FA4}"); Int32 ExamplePalette::paletteRefId = (Int32) GS::GenerateHashValue (ExamplePalette::paletteGuid); ExamplePalette::ExamplePalette (): DG::Palette (ACAPI_GetOwnResModule (), EXAMPLEPALETTE_RESID, ACAPI_GetOwnResModule (), paletteGuid), hideButton (GetReference (), HideButtonId) { Attach (*this); AttachToAllItems (*this); SetDefaultGarbageCollector (); SetDisposeHandler (ExamplePaletteManager::GetInstance ()); } ExamplePalette::~ExamplePalette () { Detach (*this); DetachFromAllItems (*this); } void ExamplePalette::PanelOpened (const DG::PanelOpenEvent& /*ev*/) { } void ExamplePalette::PanelResized (const DG::PanelResizeEvent& ev) { short vGrow = ev.GetVerticalChange (); short hGrow = ev.GetHorizontalChange (); if (vGrow != 0 || hGrow != 0) { BeginMoveResizeItems (); hideButton.Move (hGrow, vGrow); EndMoveResizeItems (); } } void ExamplePalette::PanelCloseRequested (const DG::PanelCloseRequestEvent& ev, bool* /*accept*/) { if (ev.GetSource () != this) return; Hide (); EndEventProcessing (); MarkAsDisposable (); } void ExamplePalette::ButtonClicked (const DG::ButtonClickEvent& ev) { if (ev.GetSource () == &hideButton) { Hide (); } } GSErrCode __ACENV_CALL ExamplePalette::PaletteAPIControlCallBack (Int32 referenceID, API_PaletteMessageID messageID, GS::IntPtr param) { GSErrCode err = NoError; if (referenceID == paletteRefId) { switch (messageID) { case APIPalMsg_OpenPalette: ExamplePaletteManager::OpenExamplePalette (); break; case APIPalMsg_ClosePalette: ExamplePaletteManager::CloseExamplePalette (); break; case APIPalMsg_HidePalette_Begin: if (ExamplePaletteManager::IsExamplePaletteOpened ()) ExamplePaletteManager::GetInstance ().GetExamplePalette ()->Hide (); break; case APIPalMsg_HidePalette_End: if (ExamplePaletteManager::IsExamplePaletteOpened ()) ExamplePaletteManager::GetInstance ().GetExamplePalette ()->Show (); break; case APIPalMsg_DisableItems_Begin: if (ExamplePaletteManager::IsExamplePaletteOpened ()) ExamplePaletteManager::GetInstance ().GetExamplePalette ()->DisableItems (); break; case APIPalMsg_DisableItems_End: if (ExamplePaletteManager::IsExamplePaletteOpened ()) ExamplePaletteManager::GetInstance ().GetExamplePalette ()->EnableItems (); break; case APIPalMsg_IsPaletteVisible: *(reinterpret_cast<bool*> (param)) = (ExamplePaletteManager::IsExamplePaletteOpened () && ExamplePaletteManager::GetInstance ().GetExamplePalette ()->IsVisible ()); break; default: break; } } return err; } //-------------------------- Class ExamplePaletteManager ----------------------- ExamplePaletteManager& ExamplePaletteManager::GetInstance () { static ExamplePaletteManager instance; return instance; } ExamplePaletteManager::ExamplePaletteManager () : examplePalette (NULL) { } ExamplePaletteManager::~ExamplePaletteManager () { if (DBERROR (examplePalette != NULL)) { examplePalette->EndEventProcessing (); delete examplePalette; examplePalette = NULL; } } void ExamplePaletteManager::OpenExamplePalette () { ExamplePaletteManager& manager = GetInstance (); if (manager.examplePalette == NULL) { manager.examplePalette = new ExamplePalette (); if (DBERROR (manager.examplePalette == NULL)) return; } manager.examplePalette->BeginEventProcessing (); manager.examplePalette->Show (); } void ExamplePaletteManager::CloseExamplePalette () { ExamplePaletteManager& manager = GetInstance (); if (manager.examplePalette == NULL) return; manager.examplePalette->Hide (); manager.examplePalette->EndEventProcessing (); delete manager.examplePalette; manager.examplePalette = NULL; } bool ExamplePaletteManager::IsExamplePaletteOpened (void) { return GetInstance ().examplePalette != NULL; } void ExamplePaletteManager::DisposeRequested (GS::DisposableObject& source) { ExamplePaletteManager& manager = GetInstance (); if (&source == manager.examplePalette) { manager.examplePalette = NULL; } } ExamplePalette* ExamplePaletteManager::GetExamplePalette () { return this->examplePalette; }Main.cpp
// ---------------------------------- Includes --------------------------------- #include "APIEnvir.h" #include "ACAPinc.h" #include "APICommon.h" #include "ExamplePalette.hpp" // ----------------------------------------------------------------------------- // Function to open the Example Palette // ----------------------------------------------------------------------------- static void Open_ExamplePalette (void) { if (!ExamplePaletteManager::IsExamplePaletteOpened ()) ExamplePaletteManager::OpenExamplePalette (); return; } // ----------------------------------------------------------------------------- // Handles menu commands // ----------------------------------------------------------------------------- GSErrCode __ACENV_CALL MenuCommandHandler (const API_MenuParams *menuParams) { switch (menuParams->menuItemRef.menuResID) { case 32500: switch (menuParams->menuItemRef.itemIndex) { case 1: Open_ExamplePalette (); break; } break; } return NoError; } // MenuCommandHandler // ----------------------------------------------------------------------------- // Interface definitions // ----------------------------------------------------------------------------- GSErrCode __ACENV_CALL RegisterInterface (void) { GSErrCode err; err = ACAPI_Register_Menu (32500, 32520, MenuCode_UserDef, MenuFlag_Default); if (err != NoError) DBPrintf ("DG_Test:: RegisterInterface() ACAPI_Register_Menu failed\n"); return err; } // RegisterInterface // ----------------------------------------------------------------------------- // Called when the Add-On has been loaded into memory // to perform an operation // ----------------------------------------------------------------------------- GSErrCode __ACENV_CALL Initialize (void) { GSErrCode err = ACAPI_Install_MenuHandler (32500, MenuCommandHandler); if (err != NoError) DBPrintf ("DG_Test:: Initialize() ACAPI_Install_MenuHandler failed\n"); err = ACAPI_RegisterModelessWindow (ExamplePalette::paletteRefId, ExamplePalette::PaletteAPIControlCallBack, API_PalEnabled_FloorPlan + API_PalEnabled_3D + API_PalEnabled_Layout, GSGuid2APIGuid (ExamplePalette::paletteGuid)); if (err != NoError) DBPrintf ("DG_Test:: Initialize() ACAPI_RegisterModelessWindow failed\n"); return err; } // Initialize // ----------------------------------------------------------------------------- // FreeData // called when the Add-On is going to be unloaded // ----------------------------------------------------------------------------- GSErrCode __ACENV_CALL FreeData (void) { ACAPI_UnregisterModelessWindow (ExamplePalette::paletteRefId); return NoError; } // FreeData
2015-07-22 02:15 PM
2021-11-16 02:56 PM - edited 2021-11-22 04:24 PM
nice