256 lines
11 KiB
Text
256 lines
11 KiB
Text
//
|
|
//吉里吉里Z用MenuItemクラス
|
|
//kag.menuを封印するための差し替え用クラス
|
|
//
|
|
class ZMenuItem
|
|
{
|
|
var f_window,f_caption;
|
|
var f_checked;
|
|
var f_children = [];
|
|
var f_enabled;
|
|
var f_group;
|
|
var f_parent;
|
|
var f_radio;
|
|
var f_root;
|
|
// var f_shortcut;
|
|
var f_visible;
|
|
|
|
var onPopup = void;
|
|
var onClickZ = void; //引数にsender
|
|
|
|
property HMENU{getter(){return 0;}}
|
|
property caption{setter(v){f_caption=v;}getter(){return f_caption;}}
|
|
property checked{
|
|
setter(v)
|
|
{
|
|
f_checked=v;
|
|
if(v && f_radio>0){
|
|
for(var i=0 ; i<parent.children.count ; i++){
|
|
if(f_radio==parent.children[i].f_radio) parent.children[i].f_checked=false;
|
|
}
|
|
}
|
|
}
|
|
getter()
|
|
{
|
|
return f_checked;
|
|
}
|
|
}
|
|
property children{getter(){return f_children;}}
|
|
property enabled{setter(v){f_enabled=v;}getter(){return f_enabled;}}
|
|
property group{setter(v){f_group=v;}getter(){return f_group;}}
|
|
property index
|
|
{
|
|
setter(v)
|
|
{
|
|
if(f_parent.children.find(this)>=0) f_parent.children.remove(this,true);
|
|
f_parent.children.insert(v,this);
|
|
}
|
|
getter()
|
|
{
|
|
return f_parent.children.find(this);
|
|
}
|
|
}
|
|
property parent{setter(v){f_parent=v;}getter(){return f_parent;}}
|
|
property radio{setter(v){f_radio=v;}getter(){return f_radio;}}
|
|
property root{getter(){return f_root;}}
|
|
property shortcut
|
|
{
|
|
setter(v){
|
|
f_window.shortcuts.add(this,v);
|
|
}
|
|
getter(){
|
|
return f_window.shortcuts.getShortcut(this);
|
|
}
|
|
}
|
|
property visible{setter(v){f_visible=v;}getter(){return f_visible;}}
|
|
property window{setter(v){f_window=v;}getter(){return f_window;}}
|
|
|
|
function ZMenuItem(_window,_caption)
|
|
{
|
|
f_window = _window;
|
|
f_caption = _caption;
|
|
f_checked = false;
|
|
f_enabled = true;
|
|
f_group = 0;
|
|
f_parent = void;
|
|
f_radio = 0;
|
|
f_root = this;
|
|
// f_shortcut = "";
|
|
f_visible = true;
|
|
}
|
|
|
|
function add(item)
|
|
{
|
|
item.f_root = f_root;
|
|
item.f_parent = this;
|
|
children.add(item);
|
|
}
|
|
function insert(item,index)
|
|
{
|
|
item.f_root = f_root;
|
|
item.f_parent = this;
|
|
children.insert(index,item);
|
|
}
|
|
function popup(flags,x,y)
|
|
{
|
|
/*要るか分からんけどflagsの指定
|
|
水平方向
|
|
TPM_CENTERALIGN ショートカットメニューの中心を、x パラメータが指定する座標に合わせます
|
|
TPM_LEFTALIGN ショートカットメニューの左端を、x パラメータが指定する座標に合わせます
|
|
TPM_RIGHTALIGN ショートカットメニューの右端を、x パラメータが指定する座標に合わせます
|
|
垂直方向
|
|
TPM_BOTTOMALIGN ショートカットメニューの下端を、y パラメータが指定する座標に合わせます
|
|
TPM_TOPALIGN ショートカットメニューの上端を、y パラメータが指定する座標に合わせます
|
|
TPM_VCENTERALIGN ショートカットメニューの中心を、y パラメータが指定する座標に合わせます
|
|
親ウィンドウが無い場合
|
|
TPM_NONOTIFY ユーザーがメニュー項目をクリックしたとき、通知メッセージを送りません
|
|
TPM_RETURNCMD 関数の戻り値として、ユーザーが選択したメニュー項目の ID を返します
|
|
マウスボタン処理
|
|
TPM_LEFTBUTTON マウスの左ボタンでポップアップ メニューからの選択が行えるようにします
|
|
TPM_RIGHTBUTTON マウスの右ボタンでポップアップ メニューからの選択が行えるようにします
|
|
*/
|
|
if(onPopup) onPopup(flags,x,y);
|
|
}
|
|
function remove(item)
|
|
{
|
|
children.remove(item,true);
|
|
}
|
|
|
|
function onClick()
|
|
{
|
|
if(onClickZ) onClickZ(this);
|
|
}
|
|
|
|
//test----------------------------------------
|
|
function getinfo(prefix=' ')
|
|
{
|
|
dm('%s\'%s\',visible:%d,checked:%d,radio:%d,shortcut:%s'.sprintf(prefix,caption,visible,checked,radio,shortcut));
|
|
for(var i=0 ; i<children.count ; i++){
|
|
children[i].getinfo(prefix+prefix);
|
|
}
|
|
}
|
|
}
|
|
//----------------------------------------
|
|
class ZMenuItemShortcut
|
|
{
|
|
var shortcut;
|
|
var item;
|
|
var key;
|
|
var shift;
|
|
var ctrl;
|
|
property enabled{
|
|
getter(){
|
|
if(item===void) return false;
|
|
return item.enabled;
|
|
}
|
|
setter(v){
|
|
if(item===void) return;
|
|
item.enabled = v;
|
|
}
|
|
}
|
|
|
|
function ZMenuItemShortcut(_item,_shortcut)
|
|
{
|
|
item = _item;
|
|
shortcut = _shortcut;
|
|
shift=false;
|
|
ctrl=false;
|
|
|
|
var a = shortcut.toLowerCase().split(' +\t',,true);
|
|
for( var i=0 ; i<a.count ; i++ )
|
|
{
|
|
if( a[i].length > 0 )
|
|
{
|
|
switch(a[i])
|
|
{
|
|
case 'shift':shift=true;break;
|
|
case 'ctrl':ctrl=true;break;
|
|
default:key=str2key(a[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function str2key(str)
|
|
{
|
|
switch(str) //欲しいのは適当に追加して
|
|
{
|
|
case 'backspace':case 'bs':case 'back':return 0x08;
|
|
case 'tab':return 0x09;
|
|
case 'enter':return 0x0d;
|
|
case 'esc':case 'escape':return 0x1b;
|
|
case '変換':return 0x1c;
|
|
case '無変換':return 0x1d;
|
|
case 'space':return 0x20;
|
|
case 'f1':return 0x70;
|
|
case 'f2':return 0x71;
|
|
case 'f3':return 0x72;
|
|
case 'f4':return 0x73;
|
|
case 'f5':return 0x74;
|
|
case 'f6':return 0x75;
|
|
case 'f7':return 0x76;
|
|
case 'f8':return 0x77;
|
|
case 'f9':return 0x78;
|
|
case 'f10':return 0x79;
|
|
case 'f11':return 0x7a;
|
|
case 'f12':return 0x7b;
|
|
case 'f13':return 0x7c;
|
|
case 'f14':return 0x7d;
|
|
case 'f15':return 0x7e;
|
|
case 'f16':return 0x7f;
|
|
case 'f17':return 0x80;
|
|
case 'f18':return 0x81;
|
|
case 'f19':return 0x82;
|
|
case 'f20':return 0x83;
|
|
case 'f21':return 0x84;
|
|
case 'f22':return 0x85;
|
|
case 'f23':return 0x86;
|
|
case 'f24':return 0x87;
|
|
default:
|
|
if(#str[0]>=#'a' && #str[0]<=#'z'){
|
|
return 0x41 + (#str[0]-#'a');
|
|
}
|
|
}
|
|
}
|
|
function processKeys(_key,_shift) //入力されたキーと設定されてるショートカットが一致しているかチェック
|
|
{
|
|
if(shift!=_shift) return; //シフトが一致しなかったらダメ
|
|
if(key == _key)
|
|
{
|
|
item.onClick();
|
|
}
|
|
}
|
|
function getstr()
|
|
{
|
|
return (shift)? 'shift':'' + (ctrl)? 'ctrl':'' + $key;
|
|
}
|
|
}
|
|
class ZMenuItemShortcutManager
|
|
{
|
|
var list = [];
|
|
function ZMenuItemShortcutManager(){}
|
|
function add(item,shortcut)
|
|
{
|
|
list.add(new ZMenuItemShortcut(item,shortcut));
|
|
}
|
|
function getShortcut(item)
|
|
{
|
|
for(var i=0 ; i<list.count ; i++ ){
|
|
if(list[i].item == item){
|
|
return list[i].shortcut;
|
|
}
|
|
}
|
|
return void;
|
|
}
|
|
function processKeys(key, shift)
|
|
{
|
|
for(var i=0 ; i<list.count ; i++ ){
|
|
if(list[i].enabled){
|
|
list[i].processKeys(key,shift);
|
|
}
|
|
// else{
|
|
// if(debugmode) dm('ZMenuItemShortcutManager:'+list[i].getstr());
|
|
// }
|
|
}
|
|
}
|
|
}
|
|
//メニューのenabledとの連携どうしよ
|