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