/*
	addctrl.h
*/

typedef struct {
	HWND  hCtrl;	// コントロールのハンドル
	UINT  i;		// hCtrl内の項目である場合の番号(使われないときはERRORVALUEが望ましい)
	UINT  ctrl;		// コントロールの種類
    UINT  opt;		// オプション指定 (各コントロールにより、意味は異なる)
	UINT  flag_opt;	// フラグオプション (意味は下記のフラグオプションを参照)
	char *key;		// 関連づけられたレジストリキー
	char *entry;	// 関連づけられたレジストリエントリ
	char *def_sz;	// デフォルトの値 または オリジナルの値（文字列の場合）
	UINT  def_dw;	// デフォルトの値 または オリジナルの値（数値の場合）
	char *text;		// テキスト（コントロールの持つWindowText）[EditBoxの場合を除く]
	char *id;		// スクリプトから参照する際のID
	UINT  byte_min;	// 関連づけられたバイト または 最小値
	UINT  bit_max;	// 関連づけられたビット または 最大値
	UINT  opt_u1;	// オプション拡張 整数1
	UINT  opt_u2;	// オプション拡張 整数2
	void *opt_p1;	// オプション拡張 ポインタ1
	void *opt_p2;	// オプション拡張 ポインタ2
	LPARAM opt_lp;	// オプション拡張 LPARAM型
	LPARAM lParam;	// LPARAM（その他）
	LPARAM dfr;		// [戻す]のときのためのデータ
	BYTE  o_enabled;	// ダイアログを開いたときに有効化状態になっていたか([戻す]のときのため)
	BYTE  stop;     // レジストリへの自動書き込みを停止するかどうか
	BYTE  changed;	// ダイアログを開いたとき、または、[適用]ボタンを押してから、変更されたか
	WNDPROC orgproc;	// 既定のメッセージプロシージャ
} RCTRLS, *LPRCTRLS;

// フラグオプション ( flag_opt )
//   無指定
#define CTRL_NORMAL		0

//   このコントロールが変更されると、他のタスクに変更が通知される
#define CTRL_NOTIFY		1
//   このコントロールが変更されると、他のタスクに通知され、さらにシェルに刺激を与える
#define CTRL_REFRESH	2
//   このコントロールが変更されると、再起動が行われる
#define CTRL_REBOOT		3

//   このコントロールが変更されても、ダイアログ全体が変更されたとは見なされない
#define CTRL_NOEFFECT	128

//   このコントロールがデフォルトの値に設定されると、レジストリエントリは消去される(DELETE_DEFAULTと共に指定できない)
#define DELETE_DEFAULT	4

//   文字列値がレジストリに格納されるとき REG_EXPAND_SZ で格納される(EDIT_BINARYと共に指定できない)
#define SZ_EXPAND		8

//   EDIT(文字列):コントロールの右側に、[参照]ボタンが設置され、押すとファイルの一覧が表示される(EDIT_FOLDERと共に指定できない)
#define EDIT_FILENAME	16
//   EDIT(文字列):コントロールの右側に、[参照]ボタンが設置され、押すとフォルダの一覧が表示される(EDIT_FILENAMEと共に指定できない)
#define EDIT_FOLDER		32

//   EDIT(文字列):コントロールの右側に、[参照]ボタンが設置され、押すと :(ID)_BUTTON ラベルが呼び出される
#define EDIT_BUTTON		48

//   EDIT(数値):値がレジストリに格納されるとき、文字列として格納される(EDIT_BINARYと共に指定できない)
#define EDIT_SZ			16
//   EDIT(数値):値がレジストリに格納されるとき、バイナリ型として格納される(EDIT_SZと共に指定できない)
#define EDIT_BINARY		32

//   EDIT:入力欄が *** になる
#define EDIT_PASSWORD	64
//   EDIT:編集ボックス作成時のデフォルトの状態に戻すためのボタンを設置
#define EDIT_DEFAULT	256
//   EDIT:読み出し専用の編集ボックスを作る
#define EDIT_READONLY	512

//   CHECK:チェックボックスの結果は数値で格納される
#define CHECK_DWORD		0
//   CHECK:チェックボックスの結果が文字列として格納されるときは、REG_EXPAND_SZになる。
#define CHECK_EXPANDSZ	8
//   CHECK:チェックボックスの結果は "0", "1" 文字列として格納される。
#define CHECK_SZ01		16
//   CHECK:チェックボックスの結果は "yes", "no" 文字列として格納される。
#define CHECK_SZYN		32
//   CHECK:チェックボックスの結果は "true", "false" 文字列として格納される。
#define CHECK_SZTF		64

//   LISTVIEW:キーリストで空文字列が入力されると、値を削除する
#define LV_DELETE_NOVALUE	4
//   LISTVIEW:リストビューの高さを小さくする
#define LV_SMALL		16
//   LISTVIEW:リストビューで複数選択を可能にする
#define LV_MULTISELECT	32
//   LISTVIEW:リストビューで項目を昇順でソートできるようにする
#define LV_SORTHEADER	64
//   LISTVIEW:リストビューの高さを中くらいにする
#define LV_MIDDLE		256
//   LISTVIEW:リストビューに"(DWORD)[0-9]+"による数値指定を許す
#define LV_DWORD		512

//   ColorButton:カラーボタンに関連付けられたレジストリエントリは数値型(0xbbggrr)です。
#define CB_DWORD		512

//   コントロールの変更には管理者権限が必要であることを明示(これがOFFでも、関連付けされたキーから推測可能な場合はON扱い)
#define CTRL_NEEDADMIN	1024

//   レジストリへ書き込まれる文字列内に '%' が2つ以上含まれていたら、REG_EXPAND_SZ で書込む
#define MAYBE_EXPAND	2048

// ダイアログの状態定義の定数(- の部分は上位互換用。ここの添え字番号がDIALOGHEADERIGNR)
#define DIALOGHEADER		"R-Script DSF ver.1.00-\r\n"
#define DIALOGHEADERSIZE	25
#define DIALOGHEADERIGNR	21

// いくつかの関数で、有限個の文字列が必要になるため
typedef struct {
	char *str1;
	char *str2;
	char *str3;
	char *str4;
	char *str5;
} MULTISTRING, *LPMULTISTRING;

// [戻す]ボタンのために、リストビューの内容をバックアップするためのメモリ
typedef struct {
	UINT nColumns;	// カラム数
	UINT nItems;	// アイテム数
	char **data;	// データ群
} RESTOREDATA_LISTVIEW, *LPRESTOREDATA_LISTVIEW;

EXTERN HWND		addctrl( HWND hSubDlg, UINT ctrl, UINT opt, UINT flag_opt, const char *key,
						 const char *entry, const char *def_sz, UINT def_dw, char *text,
						 const char *id, UINT byte_min, UINT bit_max, UINT opt_u1,
						 UINT opt_u2, void *opt_p1, void *opt_p2, LPARAM opt_lp); // コントロールの生成
EXTERN BOOL		free_controls( HWND, int ok );		// コントロールの破棄
EXTERN void		restore_controls( void );		// 「戻す」ボタン

EXTERN UINT		loadDialogStatus( HWND, const char *fname ); // ファイルからダイアログ状態を読み出す
EXTERN BOOL		saveDialogStatus( HWND, const char *fname ); // ファイルへダイアログ状態を書き込む

EXTERN UINT		GetCheckBox( const char *id );		// idからチェックボックスの状態を得る
EXTERN char		*GetEditBox( const char *id );		// idから編集ボックス/アイコン/テキスト/チェックボックス/ボタン内の文字列を取得する

EXTERN BOOL		SetCheckBox( const char *id, UINT check );	// idのチェックボックスの状態を設定
EXTERN BOOL		SetEditBox( const char *id, const char *text );		// idの編集ボックスの内容を設定
EXTERN BOOL		SetIconBox( const char *id, const char *text );		// idのアイコンボックスの内容を設定
EXTERN BOOL		SetTextCtrl( const char *id, char *text );	// idのテキスト・チェックボックス・ボタン内の文字列を設定

EXTERN BOOL		DisableControl( const char *id, UINT flag );	// idのコントロールをグレイアウト・復帰 flag:TRUE=有効 FALSE=無効
EXTERN BOOL		IsDisableControl( const char *id );             // idの有効/無効状態を取得              戻り値:TRUE=有効 FALSE=無効
EXTERN BOOL		StopControl( const char *id );		// idのコントロールを一時停止(自動書き込みを1回だけ抑制)
EXTERN BOOL		ActiveControl( const char *id );		// idのコントロールの一時停止を解除&変更があったように内部データを改鋳する

EXTERN BOOL		SetFocusControl( const char *id );		// idのコントロールにフォーカスをあわせる

EXTERN UINT		GetMultiEditLineCount( const char *id );		// 複数行編集ボックスの行数を得る
EXTERN char		*GetMultiEditLine( const char *id, UINT n );	// 複数行編集ボックスのn行目を得る
EXTERN UINT		checkMultiEdit( const char *id );				// 複数行編集ボックスに対する、よくあるチェック
EXTERN UINT		MultiEdit_Search( const char *id, const char *text );	// 複数行編集ボックスから、文字列textを検索し、見つかったら行番号を返す。

EXTERN UINT		ListView_GetNum( const char *id );		// リストビュー・チェックボックスリストのアイテムの数を得る
EXTERN UINT		ListView_SetCursor( const char *id, UINT n );	// リストビュー・チェックボックスリストの現在のカーソル位置を設定
EXTERN UINT		ListView_GetCursor( const char *id );		// リストビュー・チェックボックスリストの現在のカーソル位置を得る（カーソルがなければ-1）
EXTERN BOOL		ListView_SetText( const char *id, UINT n, UINT i, const char *text );	// リストビューのn行i桁に文字列をセットする
EXTERN BOOL		ListView_Add( const char *id, const char *text );					// リストビューに項目を追加する（追加を指示するだけで、設定は上の関数で）
EXTERN BOOL		ListView_Del( const char *id, UINT n );			// リストビューのi行目の項目を削除する
EXTERN UINT		ListView_Search( const char *id, UINT c, const char *text );	// リストビュー・チェックボックスリストのcカラム目の全項目からtextを探す
EXTERN UINT		ListView_isSelected( const char *id, UINT n ); // リストビュー・チェックボックスリストのn行目が反転表示になっているか?
EXTERN char		*ListView_GetText( const char *id, UINT n, UINT c );	// リストビュー・チェックボックスリストのn行c桁の文字列を得る（戻り値は、あとでfreeすること）

EXTERN UINT		GetComboBoxCursor( const char *id );			// コンボボックスのカーソル位置を得る
EXTERN UINT		SetComboBoxCursor( const char *id, UINT n );	// コンボボックスのカーソル位置を設定

EXTERN UINT		GetColorButton( const char *id );				// 色選択ボタンから値を取得
EXTERN UINT		SetColorButton( const char *id, UINT rgb );		// 色選択ボタンへ値を設定

EXTERN UINT     ListCheck_Add( HWND hCheckBoxList, UINT type, char *text ); // チェックボックスリストへの項目追加(type:0=カテゴリ 2=2state 3=3state, 戻り値=リストビュー内の通番)
EXTERN BOOL     ListCheck_Set( const char *id, UINT state );	            // チェックボックスリストへ追加済みデータへのチェック状態変更
EXTERN UINT     ListCheck_Get( const char *id );				            // チェックボックスリストへ追加済みデータからのチェック状態取得
EXTERN BOOL     ListCheck_Disable( const char *id, BOOL fDisable );	        // チェックボックスリストの項目を無効化する(fDisable:TRUE=有効 FALSE=無効)
EXTERN BOOL     ListCheck_IsDisable( const char *id );		                // チェックボックスリストの項目を有効/無効状態を調べる(戻り値:TRUE=有効 FALSE=無効)
EXTERN BOOL     ListCheck_Change( HWND hCheckBoxList, int cur, int state ); // チェックボックスリストの項目のチェック状態を切り替える(state=-1で、現在の状態に合わせた切り替え)

EXTERN void     createImageLists(void);										// アイコンハンドル／共有イメージリスト準備
EXTERN void     destroyImageLists(void);									// アイコンハンドル／共有イメージリスト破棄

EXTERN UINT		isChanged( const char *id );			// ダイアログを開いてから、または、[適用]を押してから変更されたか
EXTERN char		*getControlType( const char *id );		// idのコントロールが何者だかを調べる
EXTERN UINT		searchID( const char *id );				// idのコントロールが何番目だかを調べる（idが存在しなければ 0xffffffff を返す）
EXTERN UINT     searchHandle( HWND hCtrl );				// hCtrlのコントロールが何番目だかを調べる（idが存在しなければ 0xffffffff を返す）

EXTERN BOOL		stdButtonStatus( HWND hDlg, int ctrlID, BOOL status ); // 各標準ボタンの有効化/無効化
EXTERN void		stdButtonsStatus( HWND hDlg, BOOL sOK, BOOL sCancel, BOOL sAppry, BOOL sRetry, BOOL sSave, BOOL sLoad, BOOL sHelp ); // 各標準ボタンの有効化/無効化

EXTERN UINT		nctrls;				// コントロールの個数
EXTERN UINT		yctrls;				// 最後のコントロールの下端のy座標
EXTERN UINT		dHeight;			// ダイアログの高さ
EXTERN RCTRLS	*rctrls;			// コントロールについて格納
EXTERN UINT		gDialogWidthMin;		// ダイアログの横幅の最小値（スクロールバーの有無で変化する）
EXTERN BOOL     bCannotWriteHKLM;	// この環境で HKLM 配下の値にアクセスできなければ 1。そうでなければ 0。
EXTERN HFONT	hBoldFont;			// ダイアログ用太字フォント

EXTERN char *rscname, *g_item, *helpfile, *rndname;
EXTERN UINT  contextid;

EXTERN double scaleX;
EXTERN double scaleY;
#define SCALEX(argX) ((int) ((argX) * scaleX))
#define SCALEY(argY) ((int) ((argY) * scaleY))

// 各コントロールタイプ
#define	AC_INIT				0		// 初期化
#define	AC_FINISH			1		// 終了
#define AC_DOWN				2		// スペースを空ける
#define	TEXT_CTRL			3		// スタティックテキスト(上は1行, 下は複数行)
#define	CHECK_CTRL			4		// チェックボックス
#define	EDIT_CTRL			5		// 編集コントロール
#define ICON_BUTTON			6		// アイコン編集ボタン
#define	LIST_CTRL			7		// リストビューコントロール
#define LVC_BUTTON_NEW		8		// リストビュー用「新規」ボタン
#define LVC_BUTTON_EDIT		9		// リストビュー用「編集」ボタン
#define LVC_BUTTON_DEL		10		// リストビュー用「削除」ボタン
#define	COMBO_CTRL			11		// コンボボックス
#define REF_BUTTON_FILE		12		// ファイルを[参照] (Browse files)
#define REF_BUTTON_FOLDER	13		// フォルダを[参照] (Browse folders)
#define SPIN_CTRL			14		// 編集ボックスにくっつくスピンコントロール
#define GOTO_BUTTON			15		// ボタンを押されると、スクリプト内の指定されたラベルにジャンプ
#define MULTI_EDIT			16		// 複数行編集ボックス
#define AC_RESIZE			17		// 編集ダイアログがリサイズされたら
#define TODEFAULT_BUTTON	18		// デフォルトへ戻すボタン
#define COLOR_BUTTON		19		// 色選択ボタン
#define CHKLIST_CTRL		20		// チェックボックスリスト コントロール
#define MIN_GOTO_BUTTON		21		// ボタンを押されると、スクリプト内の指定されたラベルにジャンプ（編集ボックスの右に配置）

// チェックボックスリスト用アイコン番号
#define CBL_ICON_CATEGORY	0
#define CBL_ICON_UNCHECK	1
#define CBL_ICON_CHECK		2
#define CBL_ICON_NODET		3
#define CBL_ICON_DISABLE	4

// チェックボックスリストの各項目のLPARAMのビットフィールド
union CBL_FLAG {
	LPARAM u;
	struct {
		unsigned type:2;
		unsigned state:2;
		unsigned disable:1;
	} b;
};
