#author("2020-04-15T22:39:04+09:00","","")
#author("2020-04-15T22:41:16+09:00","","")
[[Ys TOOLs A]]

cmd一覧expand ver 0.1.0~
~
・始めに~
このTOOLは一覧からHSP標準命令と拡張命令を検索するTOOLです~
~
・特徴~
このTOOLはlistboxから命令を選択し~
その後、button一つでコピペできます~
また、PATHを選択することでクリップボードの中身を引数に~
HDLを起動できます~
~
・使い方~
~
・・左側のbutton~
~
そのbuttonを押すと~
一覧にbuttonの文字から始まる命令を表示します~
~
・inputbox 内容 ~
現在、選択中の命令を表示します~
~
・inputbox クリップボード~
現在のクリップボードの中身を表示します~
~
・button コピー~
内容 inputboxの中身をコピーします~
~
・listbox~
現在の範囲の命令を一覧表示します~
ここのlistboxの項目を選択すると~
その選択項目が、内容 inputboxに表示されます~
~
・PATH指定 button~
このbuttonを押すとFILE選択dialogを開きます~
HDLのPATHを選択しましょう~
~
また、FILE選択dialogっでFILEを選択すると自動的にFILE名が保存されます~
そしてそのFILE名はTOOL起動時に読み込まれます~
~
・HDL button~
FILE選択dialogで選択したFILEを実行します~
引数付きで呼び出すので、引数に対応していないFILEだと上手くいきません~
HDLのPATHを設定した後でこのbuttonを押してHDLを起動することを想定しています~
~
作成:高畑ラボ(Y_repeat)~
~
・連絡先~
バグなどありましたらご報告ください~
また改造後再配布時配布URLを教えていただけると嬉しいです~
y.tack2010@gmail.com~

#code(C,nooutline){{
#include "hspda.as"
#include "hspext.as"

#define global push_on_button_set_A %tbt_set_unil_A %i0
#define global get_on_button_set_A %tbt_set_unil_A *%p
#define global pop_on_button_set_A %tbt_set_unil_A *%o
#define global push_on_button_set_B %tbt_set_unil_B %i0
#define global get_on_button_set_B %tbt_set_unil_B *%p
#define global pop_on_button_set_B %tbt_set_unil_B *%o

//	特殊マクロについて 詳しくは、HSP Document Libraryの#defineのページにて

//	buttonを押すと変数に値を代入してからjumpするマクロ
//	%1:buttonに表示する文字列
//	%2:buttonを押すと代入する対象
//	%3:代入する値
//	%4:buttonを押すと代入をしてからjumpするラベル

#define global ctype button_set(%1,%2,%3,%4):push_on_button_set_A:push_on_button_set_B:\
button %1,get_on_button_set_A:goto get_on_button_set_B:pop_on_button_set_A:%2=%3:goto %4:pop_on_button_set_B

pos 100,0

//	ノートパッド用。cmd一覧のtxtを取得するのに使う
sdim s,65000

notesel s
noteload "cmd_expand.txt"
//	同じ文字から始まる命令名を\nで区切って一要素にする
//	それを格納する文字列配列
sdim sort_cmd,1000,500
//	命令名格納用配列
//	選択するとここから取り出す
sdim t,256,1000
//	命令名は\nで区切っているので\nで分割
split s,"\n",t
//	命令が入っているtxtの行数繰り返し
repeat notemax
	tmp=""
//	ノートパッドより一行取得
	noteget tmp,cnt
//	その一行の先頭の文字を取得
	c=peek(tmp,0)
//	配列の文字の値番目に加算
	sort_cmd.c+=tmp+"\n"
loop

//	小文字から始まる命令群に大文字から始まる命令群を加算
gosub *add_many_uppercase
ss=""
u=""
flag=0
pos 100,0
mes "内容"
mes "クリップボード"
pos 200,0
//	選択中の命令を表示するinputbox
input ss, 300,20
//	クリップボードの中身を表示するinputbox
input u,300,20
pos 100,40
//	このbuttonを押すと選択中の命令をコピペ
button "コピー",*sel
objsize 400,400
//	命令一覧表示用listbox
listbox flag,0,s
objsize 64,20
pos 500,0
//	このbuttonを押すとHDL起動
button "HDL",*use_my_HDL
//	このbuttonを押すとdialogでHDLのPATHを選択
button "PATH指定",*set_HDL_path
objsize 30,30
//	これらのbuttonを押すとその文字から始まる命令をlistboxに表示
pos 0,0
button_set("#",sel_char,'#',*do_sel)
button_set("_",sel_char,'_',*do_sel)

button_set("a",sel_char,'a',*do_sel)
button_set("b",sel_char,'b',*do_sel)
button_set("c",sel_char,'c',*do_sel)
button_set("d",sel_char,'d',*do_sel)
button_set("e",sel_char,'e',*do_sel)
button_set("f",sel_char,'f',*do_sel)
button_set("g",sel_char,'g',*do_sel)

pos 30,0
button_set("h",sel_char,'h',*do_sel)
button_set("i",sel_char,'i',*do_sel)
button_set("j",sel_char,'j',*do_sel)
button_set("k",sel_char,'k',*do_sel)
button_set("l",sel_char,'l',*do_sel)
button_set("m",sel_char,'m',*do_sel)
button_set("n",sel_char,'n',*do_sel)

button_set("o",sel_char,'o',*do_sel)
button_set("p",sel_char,'p',*do_sel)

pos 60,0
button_set("q",sel_char,'q',*do_sel)
button_set("r",sel_char,'r',*do_sel)
button_set("s",sel_char,'s',*do_sel)
button_set("t",sel_char,'t',*do_sel)
button_set("u",sel_char,'u',*do_sel)


button_set("v",sel_char,'v',*do_sel)
button_set("w",sel_char,'w',*do_sel)
button_set("x",sel_char,'x',*do_sel)
button_set("y",sel_char,'y',*do_sel)
//	txt(最初は空)よりPATHを読み込む
gosub *set_HDL_PATH_begin
//	listboxの選択項目とクリップボードの中身を調べるループへ
goto *sel_loop

//	txt(最初は空)よりPATHを読み込む
*set_HDL_PATH_begin
//	HDLのPATH格納用変数
	HDL_PATH=""
//	ノートパッド用変数
	for_note=""
//	ノートパッド指定
	notesel for_note
//	FILE読み込み
	noteload "HDL_PATH.txt"
//	FILEの一行目読み込み
	noteget HDL_PATH,0
//	ノートパッド指定解除
	noteunsel
	return

//	HDL起動
*use_my_HDL
	tmp_cb=""
//	クリップボードより文字列取得
	clipget tmp_cb
//	PATHのFILEは存在するか?
	exist HDL_PATH
//	存在すれば
	if strsize!=-1{
//	クリップボードの中身を引数に起動
		exec ""+HDL_PATH+" "+tmp_cb
	}else{
//	PATHのFILEが存在しないのでerrorメッセージ
		dialog {"HDLのPATHが設定されていないか、正しくありません。
		PATH設定buttonを押してHDLのPATHを指定してください"}
	}
//	listboxの選択項目とクリップボードの中身を調べるループへ
	goto *sel_loop
/**use_hdl
	tmp_cb=""
	clipget tmp_cb
	exec "C:\\Program Files (x86)\\hsp32\\hsphelp\\helpman"+" "+tmp_cb
	goto *sel_loop*/
	
//	HDLのPATHを設定するサブルーチン
*set_HDL_PATH
//	ノートパッド用
	for_note=""
//	ノートパッド指定
	notesel for_note
//	FILE選択dialog
	dialog "exe",16,"HDLのPATH"
//	FILE選択が成功なら
	if stat==1{
		for_note=refstr
//	FILEの名前を保存
		notesave "HDL_PATH.txt"
//	FILEの名前を代入
		noteget HDL_PATH,0		
	}
//	ノートパッド指定解除
	noteunsel
//	listboxの選択項目とクリップボードの中身を調べるループへ
	goto *sel_loop
	
//	listboxの選択項目とクリップボードの中身を調べるループ
*sel_loop
//	flagにはlistboxの選択項目が入っている
	tmp=flag
//	ループ開始
*hoge
//	listboxの選択が-1でない
//	更にflagとtmpが等しくない場合(listboxの選択項目が変わっている)
	if flag!=tmp&flag!=-1{
//	tは命令名格納用配列
//	選択するとここから取り出す
//	そのflag番目を取り出すことはlistboxで選択中の項目を取得すること
		ss=t.flag
//	選択中の命令を表示するinputbox更新
		objprm 0,ss
		tmp=flag
	}
//	クリップボードの中身代入用
	cb_hoge=""
	clipget cb_hoge
//	uはクリップボードの中身を表示するinputbox用文字列
	if u!=cb_hoge{
		u=cb_hoge
//	クリップボードの中身を表示するinputbox更新
		objprm 1,cb_hoge
	}
//	少々待つ
	await 50
//	gotoによるループ
	goto *hoge
//	サブルーチン:小文字から始まる命令群に大文字から始まる命令群を加算
*add_many_uppercase
	add_uppercase "A","a"
	add_uppercase "B","b"
	add_uppercase "C","c"
	add_uppercase "D","d"
	add_uppercase "E","e"
	add_uppercase "F","f"
	add_uppercase "G","g"
	add_uppercase "H","h"
	add_uppercase "I","i"
	add_uppercase "J","j"
	add_uppercase "K","k"
	add_uppercase "L","l"
	add_uppercase "M","m"
	add_uppercase "N","n"
	add_uppercase "O","o"
	add_uppercase "P","p"
	add_uppercase "Q","q"
	add_uppercase "R","r"
	add_uppercase "S","s"
	add_uppercase "T","t"
	add_uppercase "U","u"
	add_uppercase "V","v"
	add_uppercase "W","w"
	add_uppercase "X","x"
	add_uppercase "Y","y"
	add_uppercase "Z","z"
	return
//	小文字から始まる命令群に大文字から始まる命令群を加算
#deffunc add_uppercase str upper,str lower
	tmp_upper=upper
	tmp_lower=lower
//	文字の数値表現を取得
	upper_hoge=peek(tmp_upper,0)
	lower_hoge=peek(tmp_lower,0)
//	sort_cmdは字の数値表現番目の字から始まる命令が\n区切りで入っている
//	小文字から始まる命令群の入った文字列に大文字から始まる命令群を加算
	sort_cmd.lower_hoge+=sort_cmd.upper_hoge
	return
//	命令名の先頭の文字のbuttonを押した
*do_sel
//	選択一文字を数値表現で取得
	n=peek(sel_char,0)
//	sort_cmdの数値番目を取得すると
//	その文字から始まる\nで区切った命令一覧を得られる
	sss=sort_cmd.n
//	listbox更新
	objprm 3,sss
//	命令名格納用配列
//	選択するとここから取り出す
	sdim t,500,500
//	命令名は\nで区切っているので\nで分割
	split sss,"\n",t
	flag=0
//	listboxの選択項目とクリップボードの中身を調べるループへ
	goto *sel_loop
	
//	選択中の命令をコピペ
*sel
//	listboxが非選択なら選択を0に
	if flag<0:flag=0
//	tは命令名格納用配列
//	選択するとここから取り出す
//	そのflag番目を取り出すことはlistboxで選択中の項目を取得すること
	ss=t.flag
//	クリップボードの中身を表示するinputbox更新
	objprm 1,ss
//	クリップボード更新
	clipset ss
//	listboxの選択項目とクリップボードの中身を調べるループへ
	goto *sel_loop
}}