InDesign SDK Plugin ExtendScriptのレイアウトの機能を拡張する

ExtendScriptのレイアウトの機能を拡張するPluginは、これで良いのかな・・・？

ExtendScriptにおいてdocumentのwindows.add()で可能な事が分かりましたが何かの参考になるかもしれませんので残しておきます。

~~~C++:ExtendLayoutScriptElement.h
/** 利用する事で起こる如何なる不具合にも責任を持てません。
	2022/08/30 更新
*/
#ifndef __ExtendLayoutScriptElement_h__
#define __ExtendLayoutScriptElement_h__

// Interface includes:
#include "IScript.h"
//#include "IScriptRequestData.h"
#include "IDocument.h"
#include "IDataBase.h"

// General includes:
#include "UIDRef.h"
#include "UIDList.h"
#include "PersistUtils.h" // このファイルには、永続オブジェクト、およびオブジェクト・モデルの対話で使用するための一連の便利な関数が含まれています。
#include "LayoutUIID.h"	// （Boss）クラスID、kOpenLayoutCmdBoss

/** スクリプトエレメントを追加する為の手順（メモ）

	０、１、sdk/devtools/dolly/のdollyツールのFeaturesタブのGenerate Script Supportをチェックしてプロジェクトを作成（JAVAが必要）
		
		２、sdk/build/win/prj/のSDKSamples.slnをVisual Studio Commmunityを開く
		
		３、ソリューションに先ほど作成したプロジェクトを（既存のプロジェクトから）追加する。
		
		４、プロジェクトを開く

		５、このファイルを○○ID.hのあるフォルダーに保存。（○○はshort name）

		６、このファイルをプロジェクトに追加

	１、Resource Files/○○.frの

		１、追加
			#include "DocFrameworkID.h" // kDocumentObjectScriptElement

		２、VersionedScriptElementInfoを変更もしくは追加

			例
			resource VersionedScriptElementInfo(1)	// リソースID	重複不可
			{
				// Contexts
				{
					kFiredrakeScriptVersion, kCoreScriptManagerBoss, kInDesignAllLanguagesFS, k_Wild,
					kFiredrakeScriptVersion, kCoreScriptManagerBoss, kInCopyAllLanguagesFS, k_Wild,
				}
	
				// Elements
				{
					Method
					{
						kEESMethodScriptElementOpenLayout,	// Script Element ID	○○ID.h（HeaderFilesにあり）のScript Element IDsで設定
						e_OpenLayout,	// Script Element ID	○○ScriptingDefs.h（外部依存関係にあり）で設定
						"open layout",	// ExtendScriptでの名前	「openLayout」としたいなら「open layout」と入力（重要）
						"Open layout window",	// 説明（どうでもよい？）
						VoidType,	// 戻り値	VoidType（無し）
						{}	// 引数	無し
					}
		
					// このプラグインのメソッドとプロパティをスクリプトに接続
					Provider
					{
						kEESScriptProviderBoss,	// provider boss ID		○○ID.h（HeaderFilesにあり）のClassIDsで設定
						{
							Object{ kDocumentObjectScriptElement },	// 追加される側のオブジェクト
							Method{ kEESMethodScriptElementOpenLayout },	// 追加するメソッド	Script Element IDで指定する
						}
					}
				}
			};

	２、Heade Files/○○ID.hのClassIDs（provider boss ID）とScript Element IDsを変更、もしくは追加

	３、外部依存関係/○○ScriptingDefs.hのScript Element ID(Method IDs）を変更、もしくは追加（ScriptingDefs.hの値と重複しない様に）

		例
		e_OpenLayout = 'eOly'

	４、Source Files/○○ScriptProvider.cppの変更
	
		１、追加
			#include "ExtendLayoutScriptElement.h" // レイアウト関連のスクリプト拡張

		２、HandleMethodをのcase部分を変更、もしくは追加
	
			例
			case e_OpenLayout:
				status = ExtendLayout::OpenLayout(parent);
				break;

	５、Releaseビルド

	６、ExtendScriptで使う
	
		例
		var file = File.openDialog("Select File");
		var document = app.open(file, false);   // レイアウトウィンドウを開かずにドキュメントを開く
		document.openLayout();  // レイアウトウィンドウを開く
*/
class ExtendLayout
{
public:
	/** レイアウトウィンドウを開く
		@param parent アプリケーションオブジェクトの親を表すスクリプトオブジェクト上のインタフェースポインタを識別します。
	*/
	static ErrorCode OpenLayout(IScript* parent);
};

/* OpenLayout
*/
ErrorCode ExtendLayout::OpenLayout(IScript* parent)
{
	ErrorCode status = kFailure;

	// エラーの場合にbreakする為
	do {
		// InterfacePtr
		// インターフェイスポインターの操作を簡略化するスマートポインタークラス
		// 
		// static ICommand* CmdUtils::CreateCommand(ClassID cmdType)	
		// 指定された（Boss）クラスのコマンドを作成します。
		InterfacePtr<ICommand> iCommand(CmdUtils::CreateCommand(kOpenLayoutCmdBoss));
		ASSERT(iCommand);
		if (iCommand == nil) {
			break;
		}

		// UIDList(const IPMUnknown *object)
		// コンストラクタ
		//
		// IPMUnknown
		// すべてのインターフェイスが継承するルートクラス
		UIDList parentUIDList(parent);

		// virtual void ICommand::SetItemList(const UIDList & newItemList)
		// 項目リストを設定します。
		iCommand->SetItemList(parentUIDList);

		// static ErrorCode CmdUtils::ProcessCommand(ICommand * cmd)
		// cmd実行のデフォルトの方法である通常のcmd処理を使用してコマンドを処理します。
		if (CmdUtils::ProcessCommand(iCommand) != kSuccess) {
			break;
		}

		// 成功
		status = kSuccess;
	} while (false);

	// kSuccessが返らないとスクリプトエラーが出るので注意
	return status;
}

#endif // __ExtendLayoutScriptElement_h__
~~~