We value your input! Please participate in Archicad 28 Home Screen and Tooltips/Quick Tutorials survey
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