home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 March
/
VPR9803B.ISO
/
APUPDATE
/
VC
/
Tx300b
/
TX300B.LZH
/
CUSTMIZE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-06-13
|
110KB
|
4,056 lines
// WZ EDITOR 標準機能 キー/メニュー/ツールバーカスタマイズ
// Copyright 1995-96 TY
//{###設定}
//2.95 970127 高速オープン対応
//2.96A 970214 text別キー、メニュー、ツールバーに対応
//2.99A 970321 "←(S)"を"更新"に変更し、内容を変更してないときは灰色表示にした
#include <windows.h>
#include <windowsx.h>
#include "dialog.h"
#include "dialoga.h"
#include "edit.h"
#include "apidb2.h"
#define apidbOpen()
#define apidbClose()
#define MYDEBUG 0
//##common
static mchar _szcmdsepa[] = "--(区切り)--";
static mchar _szcmdfilehist[] = "(ファイル ヒストリ)";
static mchar _szcmdwindowlist[] = "(ウィンドウ リスト)";
static mchar _szlast[] = "--(末尾)--";
#define IDD_KEYLIST 2000
#define IDD_2KEY 2001
#define IDD_2KEY_ADD 2002
#define IDD_2KEY_DEL 2003
#define IDD_SHIFT 2004
#define IDD_ALT 2005
#define IDD_CTRL 2006
#define IDD_NEXT 2007
#define IDD_BACK 2008
#define IDD_CMDTEST 2009
#define IDD_CMDUNDO 2010
#define IDD_SELICON 2011
#define IDD_ICON 2012
#define IDD_REDUCE 2013
#define IDD_SET 2014
#define IDD_ADD 2015
#define IDD_CLEAR 2016
#define IDD_UP 2017
#define IDD_DOWN 2018
#define IDD_COMMAND 2019
#define IDD_DISPLAY 2020
#define IDD_DISPLAYGUIDE 2021
#define IDD_LOAD 2022
#define IDD_SAVE 2023
#define IDD_EXEC 2024
#define IDD_SEPARATOR 2025
#define IDD_INSERT 2026
#define IDD_FILEHIST 2027
#define IDD_WINDOWLIST 2028
#define IDD_NAME 2029
#define IDD_DETAIL 2030
#define IDD_PASTE 2031
#define IDD_KEYDEF_LIST 2032
#define IDD_KEYDEF_DEL 2033
#define IDD_COPY 2034
#define IDD_CUT 2035
#define IDD_CONVERTKEY 2036
#define IDD_COPYTEXT 2037
#define IDD_OLDPATH 2038
#define IDD_INSERTNEW 2039 //2.99A 970321 新規挿入ボタン
#define IDD_DISPLAYSETAUTO 2040 //2.99C 970326
#define IDD_INIT 2041 //2.99D 970328 キー、メニュー、ツールバーのカスタマイズダイアログに[初期化]を追加
#define PICKUP_NOTFOUND 9999
//
#define ID_MENU 0
#define ID_KEY 1
#define ID_TOOLBAR 2
#define idFromMode(mode) (mode / 100)
//
#define PICKUP_MENUTOP 0
#define PICKUP_MENUEND 99
#define PICKUP_KEYTOP 100
#define PICKUP_KEYEND 199
#define PICKUP_TOOLBARTOP 200
#define PICKUP_TOOLBAREND 299
//
#define PICKUP_MENUCUST 1
#define PICKUP_MENUSEARCH 2
#export
#define PICKUP_MENUAPIDB 3
#define PICKUP_MENUBARWZ 4
#define PICKUP_MENU 5
#define PICKUP_MENUAPIDB2 6
#define PICKUP_KEYALL 101
#define PICKUP_KEYWZ 102
#define PICKUP_KEYSEARCH 103
#define PICKUP_TOOLBARALL 201
#define PICKUP_TOOLBARWZ 202
#define PICKUP_TOOLBARSEARCH 203
#endexport
#define MENU_N 100 // 編集可能なメニュー数
#define MENUNEST_N 10 // 最大サブメニューネスト数
typedef struct {
HWND hwnd;
TX* text;
//
mchar szcur[CCHNAME];
TXMENU *cur;
//
TXMENU* tmenu[MENU_N];
int nmenu;
//
TXMENU* tnestMenu[MENUNEST_N];
int tnestCmd[MENUNEST_N];
int nnest;
//
TXMENUITEM txmenuClip;
BOOL fTxmenuClip;
//
BOOL fMenubar;
BOOL fEdited;//2.99A 970321 編集された?
BOOL fNoSetEdit;//2.99A 970321 fEditedを変更しない?
mchar* szname;
} MENUCONTEXT;
static MENUCONTEXT* _menucontext; // 設定中のメニュー for PICKUP_MENUAPIDB
// mode=PICKUP_MENUSEARCH: szargにnameを指定するとオフセットを返す
DWORD TXAPI txmenuPickup(DWORD dst,int mode,mchar* szarg)
{
if (mode <= PICKUP_MENUEND) {
if (mode == PICKUP_MENUAPIDB && _menucontext) {
for (int i = 0;i < _menucontext->nmenu;i++) {
TXMENU* menu = _menucontext->tmenu[i];
if (menu->fNew) {
txInsert((tx*)dst,"menu.");
txInsert((tx*)dst,menu->szname);
txInsertReturn((tx*)dst);
}
}
} else if (mode == PICKUP_MENUAPIDB2 && _menucontext) {
TX* text = (TX*)dst;
for (int i = 0;i < _menucontext->nmenu;i++) {
TXMENU* menu = _menucontext->tmenu[i];
if (menu->fNew) {
txInsertLine(text,".##%sメニュー(Cmd:menu.%s)",menu->szname,menu->szname);
}
}
}
tx* txmenu = (tx*)txmenuOp(TXMENUOP_OPEN,NULL,NULL);
txJumpFileTop(txmenu);
txstr szline;
int i;
for (i = 0;;i++) {
if (txSearchEx(txmenu,"[",SEARCH_CUR|SEARCH_NOSENSECASE|SEARCH_PARATOP)) {
txGetLine(txmenu,szline);
mchar* szname = &szline[1];
mchar*p = strchr(szline,']');
if (p) {
mchar* szcaption = NULL;
*p = 0;
switch(mode) {
case PICKUP_MENUSEARCH: {
if (!stricmp(szname,szarg)) {
return i;
}
break;
}
case PICKUP_MENUAPIDB: {
txInsert((tx*)dst,"menu.");
txInsert((tx*)dst,szname);
txInsertReturn((tx*)dst);
break;
}
case PICKUP_MENUAPIDB2: {
// ソートすると遅いのでメニューコマンドはソートしない
TX* text = (TX*)dst;
txInsertLine(text,".##%sメニュー(Cmd:menu.%s)",szname,szname);
break;
}
case PICKUP_MENU: {
SendMessage(dst,CB_ADDSTRING,0,(LPARAM)(mchar*)szname);
break;
}
case PICKUP_MENUBARWZ: {
int len;
if (len = strimatch(szname,"bar_")) {
SendMessage(dst,CB_ADDSTRING,0,(LPARAM)(mchar*)&szname[len]);
}
break;
}
case PICKUP_MENUCUST: {
SendMessage(dst,CB_ADDSTRING,0,(LPARAM)(mchar*)szname);
#if 0
if (mode == PICKUP_MENUCUST) {
strcpymax(_tmenu[_nmenu].szfunc,szname,CCHNAME);
_nmenu++;
}
#endif
break;
}
}
}
if (!txNextPara(txmenu)) break;
} else {
break;
}
}
txmenuOp(TXMENUOP_CLOSE,NULL,NULL);//2.00E2
if (mode == PICKUP_MENUSEARCH) return PICKUP_NOTFOUND;
return TRUE;
}
{
int op = 0;
int ope = 0;//2.00E2
BOOL fAll = TRUE;
BOOL fSearch = FALSE;
switch(mode) {
case PICKUP_KEYWZ: {
fAll = FALSE;
op = TXKEYOP_OPEN;
ope = TXKEYOP_CLOSE;
break;
}
case PICKUP_KEYALL: {
op = TXKEYOP_OPEN;
ope = TXKEYOP_CLOSE;
break;
}
case PICKUP_KEYSEARCH: {
op = TXKEYOP_OPEN;
ope = TXKEYOP_CLOSE;
fSearch = TRUE;
break;
}
case PICKUP_TOOLBARWZ: {
fAll = FALSE;
op = TXTOOLBAROP_OPEN;
ope = TXTOOLBAROP_CLOSE;
break;
}
case PICKUP_TOOLBARALL: {
op = TXTOOLBAROP_OPEN;
ope = TXTOOLBAROP_CLOSE;
break;
}
case PICKUP_TOOLBARSEARCH: {
op = TXTOOLBAROP_OPEN;
ope = TXTOOLBAROP_CLOSE;
fSearch = TRUE;
break;
}
default: {
return FALSE;
}
}
tx* txkey = (tx*)txmenuOp(op,NULL,NULL);
txJumpFileTop(txkey);
txstr szline;
int i;
for (i = 0;;i++) {
if (txSearchEx(txkey,"[",SEARCH_CUR|SEARCH_NOSENSECASE|SEARCH_PARATOP)) {
txGetLine(txkey,szline);
mchar* szname = &szline[1];
mchar*p = strchr(szline,']');
if (p) {
*p = 0;
if (fSearch) {
if (!stricmp(szname,szarg)) {
return i;
}
} else if (!fAll && strimatch(szname,"txe_")) {
// skip
} else {
SendMessage(dst,CB_ADDSTRING,0,(LPARAM)(mchar*)szname);
}
}
if (!txNextPara(txkey)) break;
} else {
break;
}
}
txmenuOp(ope,NULL,NULL);//2.00E2
if (fSearch) return PICKUP_NOTFOUND;
return TRUE;
}
}
static void txKeyLoadName(TX* text,mchar* szkey)
{
txOp(text,TXOP_KEYLOADNAME,(LPARAM)szkey,0);
}
#if 0//2.99C 970323
static void EnableDlgItem(HWND hwnd,int id,BOOL fenable)
{
HWND hctrl = GetDlgItem(hwnd,id);
if (hctrl) EnableWindow(hctrl,fenable);
}
static void EnableDlgItemEx(HWND hwnd,int id,BOOL fenable,int idDefault)
{
// idにフォーカスがあるときは、idDefaultにフォーカスを移す
//2.99A 970321 new
HWND hctrl = GetDlgItem(hwnd,id);
if (hctrl) {
if (GetFocus() == hctrl) {
SetFocus(GetDlgItem(hwnd,idDefault));
}
EnableWindow(hctrl,fenable);
}
}
#endif
typedef struct {
TXTOOLBAR ttxtoolbar[TXTOOLBAR_N];
int ntoolbar;
int itoolbar; // current
//
HWND hwnd;
TX* text;
TXTOOLBAR now; // currentの設定中の内容
BOOL fEdited;//2.99A 970321 編集された?
BOOL fNoSetEdit;//2.99A 970321 fEditedを変更しない?
BOOL fNoSetDisplay;//3.00A3 970508
} TOOLBARCONTEXT;
typedef struct {
TX* text;
int id;
int op;
int opDel;
mchar* szcur;
mchar* szcaption;
LPVOID context;
} DEFS;
BOOL dlgprocKeysload(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
DEFS* defs = (LPVOID)dialogGetCustdata(hd);
TX* text = defs->text;
switch(message) {
case WM_INITDIALOG: {
HWND hctrl = GetDlgItem(hwnd,IDD_KEYDEF_LIST);
txmenuPickup(hctrl,defs->op,NULL);
comboboxSelectStr(hctrl,defs->szcur);
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case IDOK: {
mchar szkey[10];
HWND hctrl = GetDlgItem(hwnd,IDD_KEYDEF_LIST);
SendMessage(hctrl,CB_GETLBTEXT,SendMessage(hctrl,CB_GETCURSEL,0,0),(LPARAM)szkey);
if (defs->id == ID_KEY) {
txKeyLoadName(text,szkey);
} else {
TOOLBARCONTEXT *context = defs->context;
TXTOOLBAR ttxtoolbar[TXTOOLBAR_N];
int ntoolbar = text->ntoolbar;
memcpy(ttxtoolbar,text->ttxtoolbar,sizeof(ttxtoolbar));
txOp(text,TXOP_TOOLBARLOADNAME,(LPARAM)szkey,0);
//
memcpy(context->ttxtoolbar,text->ttxtoolbar,sizeof(context->ttxtoolbar));
context->ntoolbar = text->ntoolbar;
//
text->ntoolbar = ntoolbar;
memcpy(text->ttxtoolbar,ttxtoolbar,sizeof(ttxtoolbar));
}
break;
}
case IDD_KEYDEF_DEL: {
mchar szkey[CCHNAME];
GetDlgItemText(hwnd,IDD_KEYDEF_LIST,szkey,CCHNAME);
if (question("%s %s定義を削除しても良いですか。\n\n(削除のキャンセルはできません)",szkey,defs->szcaption) == IDYES) {
txmenuOp(defs->opDel,szkey,NULL);
//
SendDlgItemMessage(hwnd,IDD_KEYDEF_LIST,CB_RESETCONTENT,0,0);
txmenuPickup(
GetDlgItem(hwnd,IDD_KEYDEF_LIST),
defs->op,
NULL
);
SendDlgItemMessage(hwnd,IDD_KEYDEF_LIST,CB_SETCURSEL,0,0);
}
break;
}
}
break;
}
}
return FALSE;
}
static BOOL keysLoad(HWND hwnd,TX* text,int mode,LPVOID context)
{
// キー、メニュー、ツールバーの読み込み
HDIALOG hd;
DEFS defs;
defs.text = text;
defs.id = idFromMode(mode);
defs.op = mode;
defs.context = context;
//
if (defs.id == ID_KEY) {
defs.szcur = text->szKey;
defs.szcaption = "キー";
defs.opDel = TXKEYOP_DEL;
} else if (defs.id == ID_MENU) {
defs.szcur = text->szMenu;
defs.szcaption = "メニュー";
defs.opDel = TXMENUOP_DEL;
} else {
defs.szcur = text->szToolbar;
defs.szcaption = "ツールバー";
defs.opDel = TXTOOLBAROP_DEL;
}
hd = dialog(defs.szcaption + "定義のロード");
dialogSetHookEx(hd,"\m.dlgprocKeysload");
dialogSetCustdata(hd,(DWORD)&defs);
//
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 20;
r.cy = DTCY * 8;
__dialogAddItem(hd,"COMBOBOX",NULL,IDD_KEYDEF_LIST,&r,CBS_AUTOHSCROLL|CBS_DROPDOWN|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP);
//
r.x += r.cx + DTCXINT;
r.cx = DTCX * 10;
r.cy = DTCYCMDBUTTON;
_dialogAddButton(hd,"削除...",IDD_KEYDEF_DEL,&r);
//2.00E2 OKとCancelボタンがくっついた
r.x += r.cx;
r.y += r.cy;
dialogSetPos(hd,&r);
BOOL ret = dialogOpen(hd);
return ret;
}
//##メニュー
//{###設定}
static TXMENU* menuCreate(MENUCONTEXT* context,mchar* szname)
{
if (context->nmenu < MENU_N) {
TXMENU* txmenu = malloc(sizeof(TXMENU));
if (txmenu) {
memset(txmenu,0,sizeof(TXMENU));
context->tmenu[context->nmenu++] = txmenu;
strcpy(txmenu->szname,szname);
//information(szname);
txmenuOp(TXMENUOP_LOADEX,(LPVOID)txmenu,NULL);
return txmenu;
}
}
return NULL;
}
static TXMENU* menuLoad(MENUCONTEXT* context,mchar* szname)
{
int i;
for (i = 0;i < context->nmenu;i++) {
if (!stricmp(context->tmenu[i]->szname,szname)) {
return context->tmenu[i];
}
}
return menuCreate(context,szname);
}
static BOOL _fEnableMenuNext;
static BOOL _fEnableMenuBack;
static void menuCmdChanged(MENUCONTEXT* context)
{
context->fNoSetEdit++;//2.99A 970321
context->fEdited = FALSE;//2.99A 970321
HWND hwnd = context->hwnd;
EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321
int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
mchar* szcmd = "";
mchar* szcaption = "";
if (isel < context->cur->nmenuitem) {
szcmd = context->cur->tmenuitem[isel].szcmd;
szcaption = context->cur->tmenuitem[isel].szcaption;
}
SetDlgItemText(hwnd,IDD_COMMAND,szcmd);
_fEnableMenuNext = strmatch(szcmd,"menu.");
#if 1//2.99A 970321
EnableDlgItemEx(hwnd,IDD_NEXT,_fEnableMenuNext,IDD_KEYLIST);
#else
EnableWindow(GetDlgItem(hwnd,IDD_NEXT),_fEnableMenuNext);
#endif
//
txstr szname = szcaption;
int chkey = 0; // access key
{
mchar *p = szname;
while(1) {
p = strstr(p,"(&");
if (!p) break;
p += 2;
if (*p == '&') {
p++;
continue;
} else {
chkey = *p;
if (!strcmp(p + 1,")...")) {
strcpy(p-2,"...");
} else {
p[-2] = 0;
}
break;
}
}
}
SetDlgItemText(hwnd,IDD_DISPLAY,szname);
mchar szkey[2] = {chkey,0};
SetDlgItemText(hwnd,IDD_DISPLAYGUIDE,szkey);
//
//information(szcmd);
SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)szcmd);
context->fNoSetEdit--;//2.99A 970321
}
static void menuChanged(MENUCONTEXT* context,BOOL fJumpTop)
{
HWND hwnd = context->hwnd;
HWND hctrl = GetDlgItem(hwnd,IDD_KEYLIST);
TXMENU *menu = context->cur;
ListBox_ResetContent(hctrl);
int i;
for (i = 0;i < menu->nmenuitem;i++) {
mchar* szcaption = menu->tmenuitem[i].szcaption;
mchar* szcmd = menu->tmenuitem[i].szcmd;
mchar* szhead = "";
if (strimatch(szcmd,"menu.")) szhead = "+ ";
if (szcaption[0]) {
ListBox_AddString(hctrl,szhead + szcaption);
} else {
if (!stricmp(szcmd,"__sepa")) {
ListBox_AddString(hctrl,_szcmdsepa);
} else if (!stricmp(szcmd,"__filehist")) {
ListBox_AddString(hctrl,_szcmdfilehist);
} else if (!stricmp(szcmd,"__windowlist")) {
ListBox_AddString(hctrl,_szcmdwindowlist);
} else {
ListBox_AddString(hctrl,szhead + "名前なし");
}
}
}
ListBox_AddString(hctrl,_szlast);
if (fJumpTop) ListBox_SetCurSel(hctrl,0);
//
if (context->fMenubar) {
mchar* szname = menu->szname;
txstr sz;
int len;
if (
(len = strmatch(szname,"bar_")) ||
(len = strmatch(szname,"bartxe_"))
) {
sz = (szname + len);
sz += "メニューバー";
} else {
sz = szname;
sz += "メニュー";
}
sz += "(&M)";
SetDlgItemText(hwnd,IDD_NAME,sz);
} else {
int isel = txmenuPickup(NULL,PICKUP_MENUSEARCH,menu->szname);
if (isel != PICKUP_NOTFOUND) {
SendDlgItemMessage(hwnd,IDD_NAME,CB_SETCURSEL,isel,0);
}
}
//
_fEnableMenuBack = context->nnest;
#if 1//2.99A 970321
EnableDlgItemEx(hwnd,IDD_BACK,_fEnableMenuBack,IDD_KEYLIST);
#else
EnableWindow(GetDlgItem(hwnd,IDD_BACK),_fEnableMenuBack);
#endif
}
static void menuNext(MENUCONTEXT* context)
{
HWND hwnd = context->hwnd;
if (context->nnest < MENUNEST_N) {
int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
mchar* szcmd = context->cur->tmenuitem[isel].szcmd;
int len;
if (len = strimatch(szcmd,"menu.")) {
context->tnestMenu[context->nnest] = context->cur;
context->tnestCmd[context->nnest] = isel;
context->nnest++;
//
context->cur = menuLoad(context,szcmd + len);
menuChanged(context,TRUE);
menuCmdChanged(context);
}
}
}
static void menuBack(MENUCONTEXT* context)
{
HWND hwnd = context->hwnd;
if (context->nnest) {
--context->nnest;
context->cur = context->tnestMenu[context->nnest];
menuChanged(context,FALSE);
ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),context->tnestCmd[context->nnest]);
menuCmdChanged(context);
}
}
static void menuOpenClose(MENUCONTEXT* context)
{
if (_fEnableMenuNext) {
menuNext(context);
} else {
menuBack(context);
}
}
static void menuWrite(MENUCONTEXT* context)
{
context->fNoSetEdit++;//2.99A 970321
context->fEdited = FALSE;//2.99A 970321
HWND hwnd = context->hwnd;
EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321
mchar szkey[CCHNAME];
GetDlgItemText(hwnd,IDD_DISPLAYGUIDE,szkey,CCHNAME);
mchar szcaption[CCHWORD];
GetDlgItemText(hwnd,IDD_DISPLAY,szcaption,CCHWORD);
txstr szname = szcaption;
if (szkey[0]) {
if (!strcmp(strright(szname,3),"...")) {
szname = strleft(szname,strlen(szname) - 3);
szname += "(&" + chartostr(toupper(szkey[0])) + ")";
szname += "...";
} else {
szname += "(&" + chartostr(toupper(szkey[0])) + ")";
}
}
//
int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
if (isel < context->cur->nmenuitem) {
GetDlgItemText(hwnd,IDD_COMMAND,context->cur->tmenuitem[isel].szcmd,CCHWORD);
strcpymax(context->cur->tmenuitem[isel].szcaption,szname,CCHWORD);
menuChanged(context,FALSE);
ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),isel);
}
context->fNoSetEdit--;//2.99A 970321
}
static void menuSet(MENUCONTEXT* context,mchar* szcmd)
{
HWND hwnd = context->hwnd;
int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
if (isel < context->cur->nmenuitem) {
TXMENUITEM* item = &context->cur->tmenuitem[isel];
strcpymax(item->szcmd,szcmd,CCHWORD);
if (szcmd[0] == '_') {
item->szcaption[0] = 0;
} else {
mchar*p = strchr(szcmd,'.');
if (p) {
strcpymax(item->szcaption,p + 1,CCHWORD);
}
}
menuChanged(context,FALSE);
ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),isel);
menuCmdChanged(context);
}
}
static TXMENUITEM* menuInsert(MENUCONTEXT* context)
{
HWND hwnd = context->hwnd;
int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
//
TXMENU* menu = context->cur;
if (menu->nmenuitem < TXMENUITEM_N) {
if (i < menu->nmenuitem) {
memmove(
&menu->tmenuitem[i+1],
&menu->tmenuitem[i],
(TXMENUITEM_N - i - 1) * sizeof(TXMENUITEM)
);
}
menu->nmenuitem++;
return &menu->tmenuitem[i];
}
return NULL;
}
static BOOL menuCopy(MENUCONTEXT* context)
{
HWND hwnd = context->hwnd;
int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
TXMENU* menu = context->cur;
if (i < menu->nmenuitem) {
context->fTxmenuClip = TRUE;
context->txmenuClip = menu->tmenuitem[i];
EnableWindow(GetDlgItem(hwnd,IDD_PASTE),TRUE);
return TRUE;
}
return FALSE;
}
static BOOL menuDel(MENUCONTEXT* context)
{
HWND hwnd = context->hwnd;
int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
//
TXMENU* menu = context->cur;
if (i < menu->nmenuitem) {
menuCopy(context);
//
memcpy(
&menu->tmenuitem[i],
&menu->tmenuitem[i+1],
(TXMENUITEM_N - i - 1) * sizeof(TXMENUITEM)
);
menu->nmenuitem--;
return TRUE;
}
return FALSE;
}
static BOOL menuExistName(MENUCONTEXT* context,mchar* szname)
{
if (txmenuOp(TXMENUOP_SEARCH,szname,NULL)) return TRUE;
//
int i;
for (i = 0;i < context->nmenu;i++) {
TXMENU* menu = context->tmenu[i];
if (menu->fNew) {
if (!stricmp(menu->szname,szname)) return TRUE;
}
}
return FALSE;
}
static TXMENU* menuAdd(MENUCONTEXT* context,BOOL fNew)
{
txstr szname(CCHWORD);
szname = context->cur->szname;
if (context->nmenu == MENU_N) {
attention("これ以上追加できません。\n一回ウィンドウを閉じてからやり直してください。");
return NULL;
}
while(1) {
HDIALOG hd;
if (fNew) {
hd = dialog("新規メニュー");
} else {
hd = dialog("名前を付けて保存");
}
dialogStr(hd,"名前(&N):",szname,10,CCHNAME);
dialogCaption(hd," (30文字まで)");
dialogCaption(hd," (メニュバーは、頭に\"bar_\"をつけてください)");
if (dialogOpen(hd)) {
int len = strlen(szname);
if (len == 0) {
attention("名前は省略できません");
continue;
}
if (len >= CCHNAME) {
attention("長さ制限を越えています");
continue;
}
if (menuExistName(context,szname)) {
attention("名前 %s は既に使われています。\n別の名前を指定してください。",szname);
continue;
}
//
TXMENU* menu = menuCreate(context,szname);
if (menu) {
if (!fNew) {
memcpy(menu,context->cur,sizeof(TXMENU));
}
strcpy(menu->szname,szname);
menu->fNew = TRUE;
menuCmdChanged(context);
}
return menu;
} else {
return NULL;
}
break;
}
}
static BOOL myfileCopy(mchar* src,mchar* dst)
{
//2.99G 970404 wzprint.cfgなどは存在せず、fileCopyがエラーになって取り込みが中断されていた
if (fileIsExist(src)) {
return fileCopy(src,dst);
}
return TRUE;
}
static BOOL initUiConfig(mchar* szfilename)
{
//2.99D 970328 new
txstr szOriginal = text->szexedir + szfilename;
pathSetExt(szOriginal,NULL);
szOriginal += "0";
pathSetExt(szOriginal,pathGetExt(szfilename));
//information(szOriginal);
if (fileIsExist(szOriginal)) {
BOOL ret = TRUE;
{
txstr szSys = text->szexedir + szfilename;
//information("%s %s",szOriginal,szSys);
if (!myfileCopy(szOriginal,szSys)) {
information("%sから%sにコピー失敗しました。",szOriginal,szSys);
ret = FALSE;
}
}
if (ret) {
mchar szUser[CCHPATHNAME];
pathFullConfig(szUser,szfilename);
if (fileIsExist(szUser)) {
if (!myfileCopy(szOriginal,szUser)) {
information("%sから%sにコピー失敗しました。",szOriginal,szUser);
ret = FALSE;
}
}
}
return ret;
} else {
information("%sがありません。",szOriginal);
return FALSE;
}
}
BOOL dlgprocCustmenu(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
MENUCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
CMDSEL_HOOK
switch(message) {
case WM_INITDIALOG: {
context->hwnd = hwnd;
context->cur = menuLoad(context,context->szcur);
menuChanged(context,TRUE);
menuCmdChanged(context);
EnableWindow(GetDlgItem(hwnd,IDD_PASTE),FALSE);
if (!context->fMenubar) {
HWND hctrl = GetDlgItem(hwnd,IDD_NAME);
SendMessage(hctrl,CB_RESETCONTENT,0,0);
SendMessage(hctrl,CB_SETEXTENDEDUI,TRUE,0);
txmenuPickup((DWORD)hctrl,PICKUP_MENUCUST,0);
if (context->szname) {
int isel = txmenuPickup(NULL,PICKUP_MENUSEARCH,context->szname);
if (isel != PICKUP_NOTFOUND) {
SendMessage(hctrl,CB_SETCURSEL,isel,0);
}
} else {
ComboBox_SetCurSel(hctrl,0);
}
}
break;
}
#ifdef __FLAT__
case WM_CONTEXTMENU: {
if (wParam == GetDlgItem(hwnd,IDD_KEYLIST)) {
FORWARD_WM_COMMAND(hwnd,IDD_DETAIL,0,0,SendMessage);
}
break;
}
#endif
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case IDD_COMMAND:
case IDD_DISPLAYGUIDE:
case IDD_DISPLAY: {
//2.99A 970321
if (!context->fNoSetEdit && notify == EN_CHANGE) {
context->fEdited = TRUE;
EnableDlgItem(hwnd,IDD_SET,TRUE);
}
break;
}
case IDD_NAME: {
if (!context->fMenubar) {
mchar szname[CCHWORD];
GetDlgItemText(hwnd,IDD_NAME,szname,CCHWORD);
context->cur = menuLoad(context,szname);
menuChanged(context,TRUE);
menuCmdChanged(context);
}
break;
}
case IDD_KEYLIST: {
if (notify == LBN_SELCHANGE) {
menuCmdChanged(context);
return TRUE;
} else if (notify == LBN_DBLCLK) {
menuOpenClose(context);
}
break;
}
case IDD_BACK: {
menuBack(context);
break;
}
case IDD_NEXT: {
menuNext(context);
return TRUE;
}
case IDOK: {
if (GetKeyState(VK_SHIFT) < 0) {
menuOpenClose(context);
return TRUE;
} else {
#if 1//2.99A 970321 OKされたときに自動の"←"はしない。問い合わせる
if (context->fEdited) {
int ret = question("変更中の内容を更新しますか?");
if (ret == IDYES) {
SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
} else if (ret == IDCANCEL) {
return TRUE;
}
}
#else
//1.97 OKされたときは"←"もやる
SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
#endif
}
break;
}
case IDD_SET: {
//2.99C 970326 「表示」が空の場合に対処
mchar szDisp[CCHWORD];
GetDlgItemText(hwnd,IDD_DISPLAY,szDisp,cchof(szDisp));
if (!szDisp[0]) {
SetDlgItemText(hwnd,IDD_DISPLAY,"(名前なし)");
}
//
menuWrite(context);
#if 1 //2.99A 970321 「サブメニューを開く」ボタンがフラッシュされてなかった
menuCmdChanged(context);
#endif
return TRUE;
}
case IDD_INSERT: {
if (menuInsert(context)) menuWrite(context);
return TRUE;
}
case IDD_INSERTNEW: {//2.99A 970321
if (menuInsert(context)) {
SetDlgItemText(hwnd,IDD_COMMAND,"");
SetDlgItemText(hwnd,IDD_DISPLAYGUIDE,"");
SetDlgItemText(hwnd,IDD_DISPLAY,"(名前なし)");//2.99C 970326 「表示」が空だと間抜けだった
menuWrite(context);
menuCmdChanged(context);
}
return TRUE;
}
case IDD_PASTE: {
if (context->fTxmenuClip) {
int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
TXMENUITEM* item;
if (item = menuInsert(context)) {
*item = context->txmenuClip;
menuChanged(context,FALSE);
ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),isel);
menuCmdChanged(context);
}
}
return TRUE;
}
case IDD_COPY: {
menuCopy(context);
return TRUE;
}
case IDD_CUT: {
if (menuDel(context)) {
int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
menuChanged(context,FALSE);
ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),isel);
menuCmdChanged(context);
}
return TRUE;
}
case IDD_SEPARATOR: {
if (menuInsert(context)) menuSet(context,"__sepa");
return TRUE;
}
case IDD_FILEHIST: {
if (menuInsert(context)) menuSet(context,"__filehist");
return TRUE;
}
case IDD_WINDOWLIST: {
if (menuInsert(context)) menuSet(context,"__windowlist");
return TRUE;
}
case IDD_UP: {
int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
TXMENU* menu = context->cur;
if (0 < i && i < menu->nmenuitem) {
TXMENUITEM item = menu->tmenuitem[i-1];
menu->tmenuitem[i-1] = menu->tmenuitem[i];
menu->tmenuitem[i] = item;
//
i--;
menuChanged(context,FALSE);
ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),i);
}
return TRUE;
}
case IDD_DOWN: {
int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
TXMENU* menu = context->cur;
if (0 <= i && i + 1 < menu->nmenuitem) {
TXMENUITEM item = menu->tmenuitem[i+1];
menu->tmenuitem[i+1] = menu->tmenuitem[i];
menu->tmenuitem[i] = item;
//
i++;
menuChanged(context,FALSE);
ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),i);
}
return TRUE;
}
case IDD_SAVE: {
menuAdd(context,FALSE);
return TRUE;
}
case IDD_LOAD: {
TXMENU* menu;
if (menu = menuAdd(context,TRUE)) {
if (menuInsert(context)) {
txstr sz = "menu." + menu->szname;
menuSet(context,sz);
}
}
return TRUE;
}
case IDD_DETAIL: {
#if 1//2.90
HMENU hmenu = menuNew();
menuStr(hmenu,"セパレータの挿入(&S)",IDD_SEPARATOR);
menuStr(hmenu,"ファイルヒストリの挿入(&F)",IDD_FILEHIST);
menuStr(hmenu,"ウィンドウリストの挿入(&W)",IDD_WINDOWLIST);
menuStr(hmenu,"新規メニューの挿入(&M)...",IDD_LOAD);
menuSepa(hmenu);
AppendMenu(hmenu,MF_STRING|(MF_GRAYED*!_fEnableMenuNext),IDD_NEXT,"サブメニューの編集(&O)\tダブルクリック");
AppendMenu(hmenu,MF_STRING|(MF_GRAYED*!_fEnableMenuBack),IDD_BACK,"親メニューの編集(&B)\tダブルクリック");
menuStr(hmenu,"名前を付けて保存(&A)...",IDD_SAVE);
menuSepa(hmenu);
menuStr(hmenu,"コピー(&C)",IDD_COPY);
menuStr(hmenu,"貼り付け(&P)",IDD_PASTE);
POINT point;
GetCursorPos(&point);
TrackPopupMenu(hmenu,TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN,point.x,point.y,0,hwnd,NULL);
menuDelete(hmenu);
#else
HDIALOG hd = dialog("詳細");
int cx = 24;
dialogControlID(hd,IDD_SEPARATOR);
dialogCmd(hd,"セパレータの挿入(&S)",cx);
dialogControlID(hd,IDD_FILEHIST);
dialogCmd(hd,"ファイルヒストリの挿入(&F)",cx);
dialogControlID(hd,IDD_WINDOWLIST);
dialogCmd(hd,"ウィンドウリストの挿入(&W)",cx);
dialogSpaceV(hd);
dialogControlID(hd,IDD_LOAD);
dialogCmd(hd,"新規メニューの挿入(&M)...",cx);
dialogControlID(hd,IDD_SAVE);
dialogCmd(hd,"名前を付けて保存(&A)...",cx);
#if 0
dialogSpaceV(hd);
dialogControlID(hd,IDD_CLEAR);
dialogCmd(hd,"削除(&D)...",cx);
#endif
int id = dialogOpen(hd);
if (id) SendMessage(hwnd,WM_COMMAND,id,0);
#endif
return TRUE;
}
case IDD_DISPLAYSETAUTO: {//2.99C 970326
mchar sz[CCHWORD] = {0};
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN);
int n = ListBox_GetCount(hctrl);
if (n >= 2) {
listboxGetItemText(hctrl,1,sz,CCHWORD);
} else if (n) {
listboxGetItemText(hctrl,0,sz,CCHWORD);
}
SetDlgItemText(hwnd,IDD_DISPLAY,sz);
break;
}
case IDD_INIT: {//2.99D 970328
int ret = question("メニュー定義を初期状態に戻します。よろしいですか?");
if (ret == IDYES) {
// OK
return FALSE;
} else {
return TRUE;
}
break;
}
}
break;
}
case CSN_SETSZCMD: {
SetDlgItemText(hwnd,IDD_COMMAND,(mchar*)lParam);
#if 0//2.99A 970321 コマンドを選ぶと「表示」がコマンド名になっていた
{
mchar sz[CCHWORD];
listboxGetItemText(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN),0,sz,CCHWORD);
SetDlgItemText(hwnd,IDD_DISPLAY,sz);
}
#endif
break;
}
}
return FALSE;
}
//2.00E
static mchar* captionGet(mchar* szCaption)
{
static mchar buff[CCHPATHNAME];
strcpy(buff,szCaption);
return buff;
}
static BOOL txuiCustMenu(TX* text,mchar* szname,BOOL fMenubar)
{
int ret = 0;
apidbOpen();
//
MENUCONTEXT context;
structClear(context);
context.text = text;
strcpy(context.szcur,text->szMenu);
context.fMenubar = fMenubar;
context.szname = szname;
_menucontext = &context;
{
int cxMenu = (_fwin40 ? 27 : 30);
HDIALOG hd;
if (fMenubar) {
hd = dialogbig(captionGet("メニューバーのカスタマイズ"));
} else {
hd = dialogbig(captionGet("メニューのカスタマイズ"));
}
dialogSetCustdata(hd,(DWORD)&context);
dialogSetHookEx(hd,"\m.dlgprocCustmenu");
dialogSetContexthelp(hd,TRUE);
if (fMenubar) {
dialogControlID(hd,IDD_NAME);
dialogCaptionDynamic(hd,NULL,cxMenu);
} else {
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 22;
r.cy = DTCY * 10;
__dialogAddItem(hd,"COMBOBOX",NULL,IDD_NAME,&r,CBS_AUTOHSCROLL|CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP);
dialogControlHelp(hd,373);
_dialogAddControlInfo(hd,IDD_NAME);
dialogSetPosY(hd,r.y + DTCY * 2);
}
dialogControlID(hd,IDD_KEYLIST);
dialogControlHelp(hd,374);
dialogList(hd,NULL,NULL,cxMenu,(_fwin40 ? 18+2 : 16));
#if 1//2.99A 970321 メニューカスタマイズ:「サブメニューの編集」と「戻る」が必要
dialogSetH(hd);
dialogControlHelp(hd,383);
dialogControlID(hd,IDD_NEXT);
dialogButton(hd,"サブメニューの編集(&E)",NULL,18);//3.00B1 970612 (&S)->(&E)
//
dialogControlHelp(hd,384);
dialogControlID(hd,IDD_BACK);
dialogButton(hd,"戻る(&B)",NULL,8); // 「親メニューに戻る」だとWZ16で大きすぎる
dialogLFSetV(hd);
#endif
int ey = dialogGetPosY(hd) - DTCYINT;
dialogLFV(hd);
#if 1//2.90
dialogSetPosY(hd,dialogGetPosY(hd) + DTCY * 4);
#else
dialogSetPosY(hd,dialogGetPosY(hd) + DTCY * 1);
#endif
int cx = _fwin40 ? 7 : 10;
#if 1//2.99A 970321
dialogControlID(hd,IDD_SET);
dialogControlHelp(hd,375);
dialogCmd(hd,"更新(&S)",cx);
dialogControlID(hd,IDD_INSERTNEW);
dialogControlHelp(hd,376);
dialogCmd(hd,"挿入(&A)",cx);
#else
dialogControlID(hd,IDD_SET);
dialogControlHelp(hd,375);
dialogCmd(hd,"← (&S)",cx);
dialogControlID(hd,IDD_INSERT);
dialogControlHelp(hd,376);
dialogCmd(hd,"追加(&A)",cx);
#endif
#if 1//2.90
dialogControlID(hd,IDD_CUT);
dialogControlHelp(hd,378);
dialogCmd(hd,"削除(&T)",cx);
#else
dialogSpaceV(hd);
dialogControlID(hd,IDD_DETAIL);
dialogControlHelp(hd,377);
dialogCmd(hd,"詳細(&E)...",cx);
dialogSpaceV(hd);
dialogControlID(hd,IDD_CUT);
dialogControlHelp(hd,378);
dialogCmd(hd,"削除(&T)",cx);
dialogControlID(hd,IDD_COPY);
dialogControlHelp(hd,379);
dialogCmd(hd,"コピー(&C)",cx);
dialogControlID(hd,IDD_PASTE);
dialogControlHelp(hd,380);
dialogCmd(hd,"貼付(&P)",cx);
#endif
dialogSpaceV(hd);
dialogControlID(hd,IDD_UP);
dialogControlHelp(hd,381);
dialogCmd(hd,"↑ (&U)",cx);
dialogControlID(hd,IDD_DOWN);
dialogControlHelp(hd,382);
dialogCmd(hd,"↓ (&D)",cx);
#if 1//2.90
dialogSpaceV(hd);
dialogControlID(hd,IDD_DETAIL);
dialogControlHelp(hd,377);
dialogCmd(hd,"他(&O)...",cx);
#endif
dialogLFV(hd);
//
dialogSpaceV(hd);
dialogGroup(hd,"内容(&C)");
dialogSetGroupBottom(hd,ey);
{
DTRECT r1,r2;
int cx = _fwin40 ? 38 : 30;
if (_fwin40) {//2.90
cmdselSetIdb(IDB_CMDDEFAULT);//2.90
dialogControlID(hd,IDD_CMDSEL_TREELIST);
dialogTree(hd,"機能一覧(&L):",NULL,cx,10);//2.98 970308 コマンド一覧->機能一覧
//2.99A 970321 機能一覧の下に、操作メニュー追加
dialogControlID(hd,IDD_CMDSEL_CONTEXTMENU);
dialogButton(hd,"機能一覧の操作(&O)...",NULL,20);
} else {
cmdselSetIdb(IDB_CMD);//2.90
dialogGetPos(hd,&r1);
r1.cx = DTCX * 12;r1.cy = DTCY;
r2.x = r1.x + r1.cx + DTCX;
r2.y = r1.y;
r2.cx = DTCX * (cx - 12 - 1);
r2.cy = DTCYBOX;
//
r2.cy = DTCY * 10;
_dialogAddLtext(hd,"分類一覧(&L):",&r1);
_dialogAddCombobox(hd,IDD_CMDSEL_CATEGORY,&r2);
dialogControlHelp(hd,359);
_dialogAddControlInfo(hd,IDD_CMDSEL_CATEGORY);
r1.y = r2.y = r2.y + DTCY * 2;
//
{
DTRECT r = r1;r.cx = DTCX * 16;
_dialogAddLtext(hd,"コマンド一覧(&W):",&r);
}
r2.x = r1.x;r2.cx = DTCX * 31;r2.y += DTCY*3/2;//2.00B コマンド一覧を大きくした
_dialogAddCombobox(hd,IDD_CMDSEL_LIST,&r2);
dialogControlHelp(hd,360);
_dialogAddControlInfo(hd,IDD_CMDSEL_LIST);
r1.y = r2.y = r2.y + DTCY * 2;
dialogSetPosY(hd,r1.y);
//2.00E4
dialogSetH(hd);
dialogControlID(hd,IDD_CMDSEL_SEARCH);
dialogControlHelp(hd,229);
dialogButtonCmd(hd,"検索(&F)...",NULL,15);
dialogControlID(hd,IDD_CMDSEL_SEARCHNEXT);
dialogControlHelp(hd,229);
dialogButtonCmd(hd,"次検索(&N)",NULL,15);
dialogLF(hd);
dialogSetV(hd);
dialogSpaceV(hd);
}
//
dialogGetPos(hd,&r1);
r1.cx = DTCX * 12;r1.cy = DTCY;
r2.x = r1.x + r1.cx + DTCX;
r2.y = r1.y;
r2.cx = DTCX * (cx - 12 - 1);r2.cy = DTCYBOX;
//
_dialogAddLtext(hd,"コマンド(&X):",&r1);
_dialogAddEditbox(hd,IDD_COMMAND,&r2);
dialogControlHelp(hd,361);
_dialogAddControlInfo(hd,IDD_COMMAND);
#if 0//2.90
r1.y = r2.y = r2.y + DTCYBOX + DTCYINT;
_dialogAddButton(hd,"メニューの編集(&O)",IDD_NEXT,&r2);
dialogControlHelp(hd,383);
_dialogAddControlInfo(hd,IDD_NEXT);
r1.y = r2.y = r2.y + DTCYBOX + DTCYINT;
_dialogAddButton(hd,"戻る(&B)",IDD_BACK,&r2);
dialogControlHelp(hd,384);
_dialogAddControlInfo(hd,IDD_BACK);
#endif
r1.y = r2.y = r2.y + DTCY * 2;
_dialogAddLtext(hd,"表示(&Y):",&r1);
_dialogAddEditbox(hd,IDD_DISPLAY,&r2);
dialogControlHelp(hd,385);
_dialogAddControlInfo(hd,IDD_DISPLAY);
//2.99C 970326 「表示」にコマンドの説明をセットするボタンを追加
#if 1//2.99C 970326
r1.y = r2.y = r2.y + DTCYBOX + DTCYINT;
_dialogAddButton(hd,"説明からコピー(&Z)",IDD_DISPLAYSETAUTO,&r2);
dialogControlHelp(hd,431);
_dialogAddControlInfo(hd,IDD_DISPLAYSETAUTO);
r1.y = r2.y = r2.y + DTCYBOX + DTCYINT * 2;
#else
//2.99C 970326
r1.y = r2.y = r2.y + DTCY * 2;
dialogSetPosY(hd,r1.y);
dialogControlID(hd,IDD_DISPLAYSETAUTO);
dialogButton(hd,"コマンドの説明を表示(&Z)",NULL,30);
dialogSpaceV(hd);
r1.y = r2.y = dialogGetPosY(hd);
#endif
//
_dialogAddLtext(hd,"アクセスキー(&K):",&r1);
_dialogAddEditbox(hd,IDD_DISPLAYGUIDE,&r2);
dialogControlHelp(hd,386);
_dialogAddControlInfo(hd,IDD_DISPLAYGUIDE);
}
dialogGroupEnd(hd);
dialogLFV(hd);
int xcmd = dialogGetPosX(hd) + DTCX * 1;
dialogLF(hd);
dialogSpaceV(hd);
//2.00E4
dialogSetIntXY(hd,0,0);
dialogCaption(hd,"コマンドの説明:");
dialogResetInt(hd);
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 80;
r.cy = DTCY * (_fwin40 ? 7 : 4);
_dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
dialogControlHelp(hd,372);
_dialogAddControlInfo(hd,IDD_CMDSEL_EXPLAIN);
dialogLFV(hd);
dialogSetPosX(hd,xcmd);
int cx = _fwin40 ? 8 : 11;
dialogOK(hd,cx);
dialogCancel(hd,cx);
dialogHelpID(hd,cx,"wz",IDH_CUSTMENU);
dialogSpaceV(hd);
//2.99D 970328
dialogSpaceV(hd);
dialogControlID(hd,IDD_INIT);
dialogCmd(hd,"初期化...",cx);
ret = dialogOpen(hd);
}
if (ret == IDD_INIT) {//2.99D 970328
if (initUiConfig("wz.mnu")) {
// OK
call("custmize.createEnglishMenu"); // 英語メニューを自動生成する
txFlushUI(text);
}
return FALSE;
} else if (ret) {
int i;
for (i = 0;i < context.nmenu;i++) {
txmenuOp(TXMENUOP_SAVEEX,(LPVOID)context.tmenu[i],NULL);
}
SendMessage(text->hwndbase,WM_TXFLUSHMENU,0,0);
apidb2FlushCache();
}
// 後始末
_menucontext = NULL;
apidbClose();
{
int i;
for (i = 0;i < context.nmenu;i++) {
free(context.tmenu[i]);
}
}
return ret;
}
BOOL TXCMDBASE menubar(void)
{
// メニューバーのカスタマイズ
return txuiCustMenu(text,NULL,TRUE);
}
menuMouseR
{
return txuiCustMenu(text,text->szMenuMouseR,FALSE);
}
menuMouseRClip
{
return txuiCustMenu(text,text->szMenuMouseRClip,FALSE);
}
menu
{
return txuiCustMenu(text,"ファイル",FALSE);// 初期値が"bar_xxx"だと良くないので明示
}
//##キー
//{###編集}
#define txGetFkey(text,ikind,ikey) \
(text->tszfkey + (ikind) * FKEY_NKEY * FKEY_SIZE + (ikey) * FKEY_SIZE)
BOOL TXAPI _txKeySave(TX* text,mchar* szKey,BOOL fFKeySave)
{
// キーを保存
// fFKeySaveが真ならファンクションキー表示内容も保存
//3.00A2 970507 txKeySaveの補完のため、TXAPI化
if (!szKey[0]) return FALSE;
txmenuOp(TXKEYOP_DEL,szKey,NULL);
//
TX* txkey = (TX*)txmenuOp(TXKEYOP_OPEN,NULL,NULL);
{
txInsertf(txkey,"[%s]\n",szKey);
//
WZKEY wzkey;
WZKEY wzkeyEnd = wzkeyGetEnd();
for (wzkey = 1;wzkey <= wzkeyEnd;wzkey++) {
WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
if (wzcmd) {
if (WZCMD_PRETOP <= wzcmd && wzcmd <= WZCMD_PREEND) continue;
mchar szkey[CCHKEY];
txInsertf(txkey,"%s=%s\n",wzcmdToSzcmd(wzcmd),txWzkeyToSzkey(text,wzkey,szkey));
}
}
if (fFKeySave && text->tszfkey) {
int ikind;
for (ikind = 0;ikind < FKEY_NKIND;ikind++) {
static mchar* tszcaption[FKEY_NKIND] = {
"","+SHIFT","+CTRL","+SHIFT+CTRL",
};
txInsertf(txkey,"FKEY%s=",tszcaption[ikind]);
int i;
for (i = 0;i < FKEY_NKEY;i++) {
txInsertf(txkey,"\"%s\" ",txGetFkey(text,ikind,i));
}
txInsert(txkey,"\n");
}
}
}
txmenuOp(TXKEYOP_CLOSE,NULL,NULL);
text->share->fKeyInited = FALSE;// shareのキャッシングを無効化する
return TRUE;
}
static BOOL txkeyPickup(HWND dst)
{
return txmenuPickup(dst,PICKUP_KEYALL,NULL);
}
//{###設定}
BOOL TXAPI txKeySave(TX* text)
{
// 現在のキー定義をカレントキーファイルに保存します
// 使用中の.keyファイルも書き換えます
// ファンクションキー表示内容は保存しないので注意してください。
// ファンクションキー表示内容を保存するには
// _txKeySave(text,text->szKey,TRUE);
// してください。
//2.96A 970214 旧wzkeySave
return _txKeySave(text,text->szKey,FALSE);
}
mchar TXAPI *szkeyFromStr(mchar szkey[CCHKEY],mchar *szstr)
{
// 「Shift+LEFT」のようなszstrのキー指定を、
// szkeyに「+[LEFT]」のように変換します
// szkeyを返します
mchar *dst = szkey;
while(1) {
int len;
if (len = strmatch(szstr,"Shift+")) {
szstr += len;
*dst++ = '+';
} else if (len = strmatch(szstr,"Ctrl+")) {
szstr += len;
*dst++ = '^';
} else if (len = strmatch(szstr,"Alt+")) {
szstr += len;
*dst++ = '@';
} else {
break;
}
}
if (strlen(szstr) >= 2) {
mchar *p = strchr(szstr,'-');
if (p) {
int len = p - szstr;
if (len >= 2) {
*dst++ = '[';
strcpylen(dst,szstr,len);
dst += len;
*dst++ = ']';
} else {
*dst++ = *szstr;
}
p++;
strcpy(dst,p);
} else {
*dst++ = '[';
strcpy(dst,szstr);
strcat(dst,"]");
}
} else {
strcpy(dst,szstr);
}
return szkey;
}
//##UI
typedef struct {
HWND hwnd;
tx* text;
WZCMD wzcmdClip;
WZCMD wzcmdSeled;
BOOL fCustCharKeyAble;
BOOL fEdited;//2.99A 970321 編集された?
BOOL fNoSetEdit;//2.99A 970321 fEditedを変更しない?
} KEYCONTEXT;
static void keylistPre(KEYCONTEXT* context,HWND hctrl,mchar *szkey,int npre)
{
TX* text = context->text;
WZKEY wzkey = txWzkeyFromSzkey(text,szkey);
WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
if (WZCMD_PRETOP <= wzcmd && wzcmd <= WZCMD_PREEND) {
if (wzcmd == WZCMD_PRETOP + npre - 1) {
mchar szpre[CCHKEY];
if (*szkey == '[') {
strcpy(szpre,szkey+1);
*strchr(szpre,']') = 0;
} else {
strcpy(szpre,"Ctrl+");
strcat(szpre,szkey+1);
}
strcat(szpre,"-");
{
int ch;
for (ch = 0x40;ch <= 0x5F;ch++) {
ListBox_AddString(hctrl,szpre+chartostr(ch));
}
for (ch = '0';ch <= '9';ch++) {
ListBox_AddString(hctrl,szpre+chartostr(ch));
}
}
}
}
}
// 現在リストボックスで選択されているキーのコードを返す
// 選択されているキーに応じてボタンのイネーブル状態も設定
static WZKEY keylistGetWzkey(KEYCONTEXT* context)
{
HWND hwnd = context->hwnd;
TX* text = context->text;
int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
if (isel != LB_ERR) {
mchar szstr[CCHWORD];
ListBox_GetText(GetDlgItem(hwnd,IDD_KEYLIST),isel,(LPARAM)szstr);
mchar szkey[CCHKEY];
szkeyFromStr(szkey,szstr);
WZKEY wzkey = txWzkeyFromSzkey(text,szkey);
EnableDlgItem(
hwnd,IDD_2KEY_ADD,
SendDlgItemMessage(hwnd,IDD_2KEY,CB_GETCURSEL,0,0) == 0 &&// 1ストロークキーを表示中
txKeyGetWzcmd(text,wzkey) < WZCMD_PRETOP && // 2ストロークキーでない
(
szkey[0] == '[' ||
(szkey[0] == '^' && isalpha(szkey[1]))
)
);
return wzkey;
}
return 0;
}
static void keylistMake(KEYCONTEXT* context,int npre)
{
HWND hwnd = context->hwnd;
HWND hctrl = GetDlgItem(hwnd,IDD_KEYLIST);
int isel = ListBox_GetCurSel(hctrl);
if (isel == -1) isel = 0;
ListBox_ResetContent(hctrl);
EnableDlgItem(hwnd,IDD_2KEY_ADD,FALSE);
if (npre) {
mchar **tszvk = wzkeyGetVk();
mchar *szvk;
int i;
for (i = 0;szvk = tszvk[i];i++) {
keylistPre(context,hctrl,"[" + szvk + "]",npre);
}
int ch;
for (ch = 'A';ch <= 'Z';ch++) {
keylistPre(context,hctrl,"^" + chartostr(ch),npre);
}
} else {
BOOL fchar = !context->fCustCharKeyAble;// [A]-[Z]が文字を生成する
txstr szshift;
if (IsDlgButtonChecked(hwnd,IDD_SHIFT)) szshift += "Shift+";
if (IsDlgButtonChecked(hwnd,IDD_CTRL)) {
fchar = FALSE;
szshift += "Ctrl+";
}
if (IsDlgButtonChecked(hwnd,IDD_ALT)) {
fchar = FALSE;
szshift += "Alt+";
}
{
mchar **tszvk = wzkeyGetVk();
mchar *szvk;
int i;
for (i = 0;szvk = tszvk[i];i++) {
// Spaceは最後に追加する
// Shift状態が変わってもできるだけカーソル位置を同じにするため
if (!stricmp(szvk,"Space")) continue;
//
ListBox_AddString(hctrl,szshift+szvk);
}
if (
!IsDlgButtonChecked(hwnd,IDD_ALT) &&
(
IsDlgButtonChecked(hwnd,IDD_SHIFT) ||
IsDlgButtonChecked(hwnd,IDD_CTRL)
)
) {
ListBox_AddString(hctrl,szshift+"Space");
}
}
if (!fchar) {
int i;
for (i = 0x40;i <= 0x5F;i++) {
int ch = i;
#if 0 //1.00H5 ここだけ変えても駄目。
switch(ch) {
case '@': ch = '2';break;
case '^': ch = '6';break;
case '\\': ch = '7';break;
case '_': ch = '-';break;
}
#endif
ListBox_AddString(hctrl,szshift+chartostr(ch));
}
}
}
SendDlgItemMessage(hwnd,IDD_2KEY,CB_SETCURSEL,npre,0);
ListBox_SetCurSel(hctrl,isel);
}
// 2ストロークキーグループボックスの表示内容をフラッシュする
static void prelistFlush(KEYCONTEXT* context)
{
HWND hwnd = context->hwnd;
TX* text = context->text;
WZCMD wzcmd;
HWND hctrl = GetDlgItem(hwnd,IDD_2KEY);
SendMessage(hctrl,CB_RESETCONTENT,0,0);
SendMessage(hctrl,CB_ADDSTRING,0,(LPARAM)"1ストロークキー");
for (wzcmd = WZCMD_PRETOP;wzcmd <= WZCMD_PREEND;wzcmd++) {
WZKEY wzkey = txKeySearch(text,0,wzcmd);
mchar szstr[CCHWORD];
if (wzkey) {
mchar szkey[CCHKEY];
txWzkeyToSzkey(text,wzkey,szkey);
szkeyToStr(szkey,szstr);
} else {
strcpy(szstr,"空き");
}
SendMessage(hctrl,CB_ADDSTRING,0,(LPARAM)szstr);
}
}
static BOOL IsFKeyDisp(KEYCONTEXT* context,WZKEY wzkey,int *modeshift,int *ikey)
{
// wzkeyがファンクションバーに表示可能なものなら、modeshift/ikeyに
// ファンクションキー番号をセットしてTRUEを返す
// そうでなければFALSEを返す
TX* text = context->text;
BOOL ffkey = FALSE;
mchar szkey[CCHKEY];
txWzkeyToSzkey(text,wzkey,szkey);
if (
(
strmatch(szkey,"[F") ||
strmatch(szkey,"+[F") ||
strmatch(szkey,"^[F") ||
strmatch(szkey,"+^[F")
) &&
(atoi(strstr(szkey,"[F") + 2) <= FKEY_NKEY)
) {
//
*modeshift = FKEY_NORMAL;
if (szkey[0] == '+') {
if (szkey[1] == '^') {
*modeshift = FKEY_SHIFTCTRL;
} else {
*modeshift = FKEY_SHIFT;
}
} else if (szkey[0] == '^') {
*modeshift = FKEY_CTRL;
}
//
*ikey = atoi(strstr(szkey,"[F") + 2) - 1;
return TRUE;
}
return FALSE;
}
static void keyFlushDisp(KEYCONTEXT* context)
{
context->fNoSetEdit++;//2.99A 970321
context->fEdited = FALSE;//2.99A 970321
HWND hwnd = context->hwnd;
EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321
TX* text = context->text;
WZKEY wzkey = keylistGetWzkey(context);
int modeshift;
int ikey;
HWND hctrl = GetDlgItem(hwnd,IDD_DISPLAY);
BOOL fDisp = IsFKeyDisp(context,wzkey,&modeshift,&ikey);
EnableWindow(hctrl,fDisp);
EnableWindow(GetDlgItem(hwnd,IDD_DISPLAYGUIDE),fDisp);
if (fDisp && text->tszfkey) {
SetWindowText(hctrl,txGetFkey(text,modeshift,ikey));
} else {
SetWindowText(hctrl,"");
}
context->fNoSetEdit--;//2.99A 970321
}
static BOOL keySave(KEYCONTEXT* context)
{
HWND hwnd = context->hwnd;
TX* text = context->text;
txstr szstr = text->szKey;
while(1) {
HDIALOG hd = dialog("キー定義を名前を付けて保存");
dialogStr(hd,"キー定義名:",szstr,12,20);
if (dialogOpen(hd)) {
if (txmenuPickup(NULL,PICKUP_KEYSEARCH,szstr) != PICKUP_NOTFOUND) {
int ret = question("%sは存在します。上書きしますか?",szstr);
if (ret == IDNO) return FALSE;
if (ret == IDYES) {
_txKeySave(text,szstr,TRUE);
return TRUE;
}
} else {
_txKeySave(text,szstr,TRUE);
return TRUE;
}
} else {
return FALSE;
}
}
}
static void keyChanged(KEYCONTEXT* context)
{
context->fNoSetEdit++;//2.99A 970321
context->fEdited = FALSE;//2.99A 970321
HWND hwnd = context->hwnd;
EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321
WZKEY wzkey = keylistGetWzkey(context);
WZCMD wzcmd = txKeyGetWzcmd(context->text,wzkey);
mchar* szcmd = wzcmdToSzcmd(wzcmd);
if (wzcmd == 0) szcmd = "";
SetDlgItemText(hwnd,IDD_COMMAND,szcmd);
SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)szcmd);
// ファンクションキー表示
keyFlushDisp(context);
context->fNoSetEdit--;//2.99A 970321
}
static BOOL keyCopy(KEYCONTEXT* context)
{
HWND hwnd = context->hwnd;
TX* text = context->text;
WZKEY wzkey = keylistGetWzkey(context);
WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
if (wzcmd) {
context->wzcmdClip = wzcmd;
EnableWindow(GetDlgItem(hwnd,IDD_PASTE),TRUE);
return TRUE;
}
return FALSE;
}
BOOL dlgprocKeycust(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
KEYCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
TX* text = context->text;
CMDSEL_HOOK
switch(message) {
case WM_INITDIALOG: {
context->hwnd = hwnd;
prelistFlush(context);
keylistMake(context,0);
EnableDlgItem(hwnd,IDD_2KEY_DEL,FALSE);
keyFlushDisp(context);
EnableWindow(GetDlgItem(hwnd,IDD_PASTE),FALSE);
keyChanged(context);//1.97 init
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
if (notify == LBN_SELCHANGE) {
if (id == IDD_KEYLIST) {
keyChanged(context);
}
} else if (
id == IDD_SHIFT ||
id == IDD_CTRL ||
id == IDD_ALT
) {
keylistMake(context,0);
keyChanged(context);//2.00B キーカスタマイズのShift,Ctrl,Altをチェックしてもコマンドが変わらなかった
} else if (id == IDD_2KEY_ADD) {
WZKEY wzkey = keylistGetWzkey(context);
mchar szkey[CCHKEY];
if (question("%s を2ストロークキーとして登録しますか?",txWzkeyToSzkey(text,wzkey,szkey)) == IDYES) {
txKeySetWzcmd(text,wzkey,WZCMD_PRETOP);
int npre = txKeyGetWzcmd(text,wzkey) - WZCMD_PRETOP + 1;
EnableDlgItem(hwnd,id,FALSE);
prelistFlush(context);
//
keylistMake(context,npre);
SendDlgItemMessage(hwnd,IDD_2KEY,CB_SETCURSEL,npre,0);
}
}
switch(id) {
case IDD_COMMAND:
case IDD_DISPLAY: {
//2.99A 970321
if (!context->fNoSetEdit && notify == EN_CHANGE) {
context->fEdited = TRUE;
EnableDlgItem(hwnd,IDD_SET,TRUE);
}
break;
}
case IDD_2KEY: {
if (notify == CBN_SELCHANGE) {
int npre = SendDlgItemMessage(hwnd,IDD_2KEY,CB_GETCURSEL,0,0);
EnableDlgItem(hwnd,IDD_2KEY_DEL,txKeySearch(text,0,WZCMD_PRETOP + npre - 1));
EnableDlgItem(hwnd,IDD_SHIFT,!npre);
EnableDlgItem(hwnd,IDD_CTRL,!npre);
EnableDlgItem(hwnd,IDD_ALT,!npre);
keylistMake(context,npre);
keyChanged(context);//2.00D キーカスタマイズの2ストロークキーを選択してもコマンドが変わらなかった
}
break;
}
case IDD_LOAD: {
if (keysLoad(hwnd,context->text,PICKUP_KEYALL,NULL)) {
prelistFlush(context);
keylistMake(context,0);
}
return TRUE;
}
case IDD_SAVE: {
keySave(context);
return TRUE;
}
case IDD_2KEY_DEL: {
int npre = SendDlgItemMessage(hwnd,IDD_2KEY,CB_GETCURSEL,0,0);
WZKEY wzkey = txKeySearch(text,0,WZCMD_PRETOP + npre - 1);
mchar szkey[CCHKEY];
if (question("2ストロークキー %s を削除してもよろしいですか?",txWzkeyToSzkey(text,wzkey,szkey)) == IDYES) {
txKeySetWzcmd(text,wzkey,0);
prelistFlush(context);
keylistMake(context,npre);
EnableDlgItem(hwnd,id,FALSE);
}
break;
}
case IDD_SET: {
mchar szcmd[CCHWORD];
GetDlgItemText(hwnd,IDD_COMMAND,szcmd,CCHWORD);
WZCMD wzcmd = wzcmdRegister(szcmd);
WZKEY wzkey = keylistGetWzkey(context);
if (wzcmd) {
txKeySetWzcmd(text,wzkey,wzcmd);
}
// ファンクションキー表示
int modeshift;
int ikey;
if (IsFKeyDisp(context,wzkey,&modeshift,&ikey) && text->tszfkey) {
GetDlgItemText(hwnd,IDD_DISPLAY,txGetFkey(text,modeshift,ikey),FKEY_SIZE);
}
return TRUE;
}
case IDD_PASTE: {
if (context->wzcmdClip) {
WZKEY wzkey = keylistGetWzkey(context);
txKeySetWzcmd(text,wzkey,context->wzcmdClip);
keyChanged(context);
}
return TRUE;
}
case IDD_COPY: {
keyCopy(context);
return TRUE;
}
case IDD_CUT: {
WZKEY wzkey = keylistGetWzkey(context);
keyCopy(context);
// 削除
txKeySetWzcmd(text,wzkey,0);
// ファンクションキー表示
int modeshift;
int ikey;
if (IsFKeyDisp(context,wzkey,&modeshift,&ikey) && text->tszfkey) {
txGetFkey(text,modeshift,ikey)[0] = 0;
}
//
SetDlgItemText(hwnd,IDD_COMMAND,"");
SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)"");
return TRUE;
}
case IDD_CMDTEST: {
EndDialog(hwnd,id);
break;
}
case IDD_CMDUNDO: {
txKeyLoad(text);
break;
}
case IDOK: {
#if 1//2.99A 970321 OKされたときに自動の"←"はしない。問い合わせる
if (context->fEdited) {
int ret = question("変更中の内容を更新しますか?");
if (ret == IDYES) {
SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
} else if (ret == IDCANCEL) {
return TRUE;
}
}
#else
//1.97 OKされたときは"←"もやる
SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
#endif
//
context->wzcmdSeled = keylistGetWzkey(context);
break;
}
case IDD_INIT: {//2.99D 970328
int ret = question("キー定義を初期状態に戻します。よろしいですか?");
if (ret == IDYES) {
// OK
return FALSE;
} else {
return TRUE;
}
break;
}
}
break;
}
case CSN_SETSZCMD: {
SetDlgItemText(hwnd,IDD_COMMAND,(mchar*)lParam);
break;
}
}
return FALSE;
}
static WZKEY txuiKeyList(TX* text,int mode,BOOL fCustCharKeyAble)
{
WZKEY ret = 0;
apidbOpen();
//
KEYCONTEXT context;
structClear(context);
context.text = text;
context.fCustCharKeyAble = fCustCharKeyAble;
//
{
DTRECT rbutton;
int xcmd;
HDIALOG hd;
if (mode == 0) {
hd = dialogbig(captionGet("キー割り当ての変更"));
} else {
hd = dialogbig(captionGet("キーの選択"));
}
dialogSetHookEx(hd,"\m.dlgprocKeycust");
dialogSetCustdata(hd,(DWORD)&context);
dialogSetContexthelp(hd,TRUE);//2.00E4 カスタマイズダイアログにコンテキストヘルプを追加
dialogGroup(hd,"キー(&K)");
{
int cx = (_fwin40 ? 25 : 30);//2.00E4 カスタマイズダイアログがWin95 640*480に完全に収まる様にした
DTRECT r;
//
dialogGetPos(hd,&r);
r.cx = DTCX * (cx - 11 - 1);
r.cy = DTCY * 10;
_dialogAddCombobox(hd,IDD_2KEY,&r);
dialogControlHelp(hd,368);
_dialogAddControlInfo(hd,IDD_2KEY);
if (mode == 0) {
r.x += r.cx + DTCX;
r.cx = DTCX * 11;
r.cy = DTCYBUTTON;
_dialogAddButton(hd,"削除(&D)...",IDD_2KEY_DEL,&r);
dialogControlHelp(hd,369);
_dialogAddControlInfo(hd,IDD_2KEY_DEL);
}
r.y += DTCY * 2;
dialogSetPosY(hd,r.y);
//
dialogControlID(hd,IDD_KEYLIST);
dialogControlHelp(hd,367);
dialogList(hd,NULL,NULL,cx,12);
dialogSetFocus(hd,IDD_KEYLIST);
//
DTRECT r;
dialogGetPos(hd,&r);
DTRECT r0 = r;
r.cy = DTCYKEY;
r.cx = DTCX * (cx / 2);
_dialogAddCheck(hd,"Shift(&1)",IDD_SHIFT,&r);
r.x += r.cx;
_dialogAddCheck(hd,"Ctrl(&2)",IDD_CTRL,&r);
r.x = r0.x;
r.y += r.cy + DTCYINT;
_dialogAddCheck(hd,"Alt(&3)",IDD_ALT,&r);
//
r0.y = r.y + r.cy + DTCYINT * 2;
r = r0;
r.cx = DTCX * cx;
r.cy = DTCYBUTTON;
rbutton = r;
if (mode == 0) {
_dialogAddButton(hd,"2ストロークキーに追加(&I)...",IDD_2KEY_ADD,&r);
dialogControlHelp(hd,371);
_dialogAddControlInfo(hd,IDD_2KEY_ADD);
}
}
dialogGroupEnd(hd);
int ey = dialogGetPosY(hd) - DTCYINT;
if (mode == 0) {
dialogLFV(hd);
dialogSetPosY(hd,dialogGetPosY(hd) + DTCY * 7);
int cx = _fwin40 ? 7 : 10;
#if 1//2.99A 970321
dialogControlID(hd,IDD_SET);
dialogControlHelp(hd,363);
dialogCmd(hd,"更新(&S)",cx);
#else
dialogControlID(hd,IDD_SET);
dialogControlHelp(hd,363);
dialogCmd(hd,"← (&S)",cx);
#endif
dialogControlID(hd,IDD_CUT);
dialogControlHelp(hd,364);
dialogCmd(hd,"消去(&T)",cx);
dialogControlID(hd,IDD_COPY);
dialogControlHelp(hd,365);
dialogCmd(hd,"コピー(&C)",cx);
dialogControlID(hd,IDD_PASTE);
dialogControlHelp(hd,366);
dialogCmd(hd,"貼付(&P)",cx);
dialogLFV(hd);
//
dialogGroup(hd,"内容");
dialogSetGroupBottom(hd,ey);
{
DTRECT r1,r2;
int cx = _fwin40 ? 38 : 30;
if (_fwin40) {//2.90
cmdselSetIdb(IDB_CMDDEFAULT);//2.90
dialogControlID(hd,IDD_CMDSEL_TREELIST);
dialogTree(hd,"機能一覧(&L):",NULL,cx,10);//2.98 970308 コマンド一覧->機能一覧
//2.99A 970321 機能一覧の下に、操作メニュー追加
dialogControlID(hd,IDD_CMDSEL_CONTEXTMENU);
dialogButton(hd,"機能一覧の操作(&O)...",NULL,20);
} else {
cmdselSetIdb(IDB_CMD);//2.90
dialogGetPos(hd,&r1);
r1.cx = DTCX * 12;
r1.cy = DTCY;
r2.x = r1.x + r1.cx + DTCX;
r2.y = r1.y;
r2.cx = DTCX * (cx - 12 - 1);
r2.cy = DTCY * 10;
_dialogAddLtext(hd,"分類一覧(&L):",&r1);
_dialogAddCombobox(hd,IDD_CMDSEL_CATEGORY,&r2);
dialogControlHelp(hd,359);
_dialogAddControlInfo(hd,IDD_CMDSEL_CATEGORY);
r1.y = r2.y = r2.y + DTCY * 2;
//
{
DTRECT r = r1;r.cx = DTCX * 16;
_dialogAddLtext(hd,"コマンド一覧(&W):",&r);
}
r2.x = r1.x;r2.cx = DTCX * 31;r2.y += DTCY*3/2;//2.00B コマンド一覧を大きくした
_dialogAddCombobox(hd,IDD_CMDSEL_LIST,&r2);
dialogControlHelp(hd,360);
_dialogAddControlInfo(hd,IDD_CMDSEL_LIST);
r1.y = r2.y = r2.y + DTCY * 2;
//
dialogSetPosY(hd,r1.y);
//2.00E4
dialogControlID(hd,IDD_CMDSEL_SEARCH);
dialogControlHelp(hd,229);
dialogButtonCmd(hd,"検索(&F)...",NULL,16);
dialogControlID(hd,IDD_CMDSEL_SEARCHNEXT);
dialogControlHelp(hd,229);
dialogButtonCmd(hd,"次検索(&N)",NULL,16);
}
//
dialogSpaceV(hd);
dialogGetPos(hd,&r1);
r1.cx = DTCX * cx;
r1.cy = DTCY;
_dialogAddLtext(hd,"コマンド(&X):",&r1);
r1.y += r1.cy;
r1.cy = DTCYBOX;
_dialogAddEditbox(hd,IDD_COMMAND,&r1);
dialogControlHelp(hd,361);
_dialogAddControlInfo(hd,IDD_COMMAND);
r1.y += r1.cy + DTCYINT;
r1.cy = DTCY;
__dialogAddItem(hd,"STATIC","ファンクションキーの表示(&Y):",IDD_DISPLAYGUIDE,&r1,SS_LEFT|WS_GROUP|WS_CHILD|WS_VISIBLE);
r1.y += r1.cy;
r1.cy = DTCYBOX;
_dialogAddEditbox(hd,IDD_DISPLAY,&r1);
dialogControlHelp(hd,362);
_dialogAddControlInfo(hd,IDD_DISPLAY);
}
dialogGroupEnd(hd);
}
dialogLFV(hd);
xcmd = dialogGetPosX(hd) + DTCX * 1;
dialogLF(hd);
//2.00E4
dialogSetIntXY(hd,0,0);
dialogCaption(hd,"コマンドの説明:");
dialogResetInt(hd);
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 80;
r.cy = DTCY * (_fwin40 ? 8 : 4);
_dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
dialogControlHelp(hd,372);
_dialogAddControlInfo(hd,IDD_CMDSEL_EXPLAIN);
dialogLFV(hd);
dialogSetPosX(hd,xcmd);
int cx = _fwin40 ? 8 : 11;
dialogOK(hd,cx);
dialogCancel(hd,cx);
if (mode == 0) {
dialogSpaceV(hd);
dialogHelpID(hd,cx,"wz",IDH_CUSTKEY);
dialogSpaceV(hd);
dialogControlID(hd,IDD_LOAD);
dialogCmd(hd,"読込み...",cx);
dialogControlID(hd,IDD_SAVE);
dialogCmd(hd,"別保存...",cx);
//2.99D 970328
dialogControlID(hd,IDD_INIT);
dialogCmd(hd,"初期化...",cx);
}
int idsel = dialogOpen(hd);
if (idsel == IDD_INIT) {//2.99D 970328
if (initUiConfig("wz.key")) {
txFlushUI(text);
}
return FALSE;
} else if (idsel == IDOK) {
if (mode == 0) {
_txKeySave(text,text->szKey,TRUE);
txKeyLoad(text);
} else {
ret = context.wzcmdSeled;
}
} else if (idsel == 0) {
txKeyLoad(text);
}
}
apidbClose();
return ret;
}
//{###設定}
WZKEY TXAPI txSelectWzkey(TX* text)
{
// [キーの選択]ダイアログを出します。
// 選択されたキーを返します。選択されなかったときは0を返します。
//2.96A 970214 旧wzkeySelect
return txuiKeyList(text,1,FALSE);
}
static BOOL txKeyIsCustAble(TX* text)
{
if (txKeyIsEdited(text)) {
//information("%lX %lX",text,text1,text->szKey);
information("キーが編集されています。\nキーカスタマイズできません");
return FALSE;
}
return TRUE;
}
uiKeyCust
{
if (!txKeyIsCustAble(text)) return FALSE;
return txuiKeyList(text,0,FALSE);
}
uiKeyCustCharAble
{
// 文字キーもカスタマイズ可能なuiKeyCust
if (!txKeyIsCustAble(text)) return FALSE;
return txuiKeyList(text,0,TRUE);
}
BOOL TXCMDBASE key(void)
{
// キーのカスタマイズ
return uiKeyCust();
}
//##キー一覧
static WZCMD keylistGetWzcmd(HWND hwnd,TX* text)
{
int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
int j = 0;
WZKEY wzkey;
WZKEY wzkeyEnd = wzkeyGetEnd();
for (wzkey = 0;wzkey <= wzkeyEnd;wzkey++) {
WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
if (wzcmd) {
if (j == i) {
return wzcmd;
}
j++;
}
}
return 0;
}
static void keylistFlush(HWND hwnd,TX* text)
{
WZCMD wzcmd = keylistGetWzcmd(hwnd,text);
SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)wzcmdToSzcmd(wzcmd));
}
BOOL dlgprocKeyList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
TX* text = (TX*)dialogGetCustdata(hd);
CMDSEL_HOOK
switch(message) {
case WM_INITDIALOG: {
HWND hctrl = GetDlgItem(hwnd,IDD_KEYLIST);
WZKEY wzkeyEnd = wzkeyGetEnd();
WZKEY wzkey;
for (wzkey = 0;wzkey <= wzkeyEnd;wzkey++) {
WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
if (wzcmd) {
mchar szkey[CCHKEY];
mchar szstr[CCHWORD];
txWzkeyToSzkey(text,wzkey,szkey);
szkeyToStr(szkey,szstr);
ListBox_AddString(hctrl,szstr);
}
}
ListBox_SetCurSel(hctrl,0);
keylistFlush(hwnd,text);
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case IDD_KEYLIST: {
if (notify == LBN_SELCHANGE) {
keylistFlush(hwnd,text);
}
break;
}
case IDD_EXEC: {
WZCMD wzcmd = keylistGetWzcmd(hwnd,text);
PostMessage(text->hwndbase,WM_COMMAND,IDM_WZCMDTOP + wzcmd,0);
break;
}
}
break;
}
}
return FALSE;
}
BOOL TXCMDBASE uiKeyList(TX* text)
{
// キー一覧
WZKEY ret = 0;
apidbOpen();
cmdselSetIdb(IDB_CMD);//2.90
{
DTRECT rbutton;
int xcmd;
HDIALOG hd = dialogbig(captionGet("キー一覧"));
dialogSetCustdata(hd,(DWORD)textf);
dialogSetHookEx(hd,"\m.dlgprocKeyList");
#if 0 // 水平スクロールバーを付けようと思ったが、
// スクロール処理は自分でしなければ
// いけないみたいなので、面倒なので止める
dialogControlStyle(hd,WS_HSCROLL|WS_GROUP|LBS_DISABLENOSCROLL);
#endif
dialogControlID(hd,IDD_KEYLIST);
dialogList(hd,"キー(&K):",NULL,30,10);
dialogLFV(hd);
dialogCaption(hd,NULL);
dialogCaption(hd,"コマンドが割り当てられているキーの一覧です。");
dialogCaption(hd,"[実行]で、実行してみることもできます。");
dialogLF(hd);
dialogSpaceV(hd);
dialogSpaceV(hd);
dialogCaption(hd,"コマンド:");
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 80;
r.cy = DTCY * (_fwin40 ? 8 : 6);
_dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
dialogLFV(hd);
int cxbutton = 10;
dialogSetPosX(hd,dialogGetPosX(hd) - cxbutton * DTCX - DTCX);
dialogClose(hd,cxbutton);
//
dialogControlID(hd,IDD_EXEC);
dialogCmd(hd,"実行(&X)",cxbutton);
dialogOpen(hd);
}
apidbClose();
return ret;
}
//##ツールバー
#ifndef __FLAT__
extern "shell.dll" {
#include <shellapi.h>
}
#endif
static BOOL toolbarSave(TOOLBARCONTEXT* context,mchar* szname)
{
txmenuOp(TXTOOLBAROP_DEL,szname,NULL);
//
tx* txkey = (tx*)txmenuOp(TXTOOLBAROP_OPEN,NULL,NULL);
txInsertf(txkey,"[%s]\n",szname);
{
int i;
TXTOOLBAR *src = context->ttxtoolbar;
for (i = 0;i < context->ntoolbar;i++,src++) {
int iicon = src->iicon;
if (src->fReduce) iicon = -(iicon + 1);// "-0"はないので
if (src->wzcmd == WZCMD_SEPARATOR) {
txInsertf(txkey,"__sepa\n");
} else {
txInsertf(txkey,"%s=\"%s\" %d \"%s\"\n",wzcmdToSzcmd(src->wzcmd),src->sziconfilename,iicon,src->szcaption);
}
}
}
txmenuOp(TXTOOLBAROP_CLOSE,NULL,NULL);
return TRUE;
}
#define CXICON 32
#define CYICON 32
static void drawIcon(HWND hwnd,TXTOOLBAR *tool)
{
HWND hctrl = GetDlgItem(hwnd,IDD_ICON);
InvalidateRect(hctrl,NULL,TRUE);
UpdateWindow(hctrl);
mchar szpath[CCHPATHNAME];
pathSetFileName(szpath,tool->sziconfilename);
HICON hicon = ExtractIcon(text->hInstance,szpath,tool->iicon);
if (hicon >= 2) {
HDC hdc = GetDC(hctrl);
if (tool->fReduce) {
HBITMAP hbitmaptmp = CreateCompatibleBitmap(hdc,CXICON,CYICON);
HDC hdctmp = CreateCompatibleDC(hdc);
SelectObject(hdctmp,hbitmaptmp);
SelectObject(hdctmp,GetStockObject(NULL_PEN));
SelectObject(hdctmp,text1->hbrushBtnFace);
Rectangle(hdctmp,0,0,CXICON+1,CYICON+1);
DrawIcon(hdctmp,0,0,hicon);
SelectObject(hdc,GetStockObject(NULL_PEN));
SelectObject(hdc,text1->hbrushBtnFace);
Rectangle(hdc,0,0,CXICON,CYICON);
StretchBlt(
hdc,0,0,CXICON/2,CYICON/2,
hdctmp,0,0,CXICON,CYICON,
SRCCOPY
);
DeleteDC(hdctmp);
DeleteObject(hbitmaptmp);
} else {
DrawIcon(hdc,0,0,hicon);
}
ReleaseDC(hctrl,hdc);
}
}
static WZCMD tlbFlush(TOOLBARCONTEXT* context)
{
context->fNoSetEdit++;//2.99A 970321
context->fEdited = FALSE;//2.99A 970321
HWND hwnd = context->hwnd;
EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321
//
TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
#if 1//2.00E
context->now = *tool;
drawIcon(hwnd,&context->now);
#else
drawIcon(hwnd,tool);
#endif
CheckDlgButton(hwnd,IDD_REDUCE,tool->fReduce);
SetDlgItemText(hwnd,IDD_DISPLAY,tool->szcaption);
//
WZCMD wzcmd = tool->wzcmd;
mchar* szcmd = wzcmdToSzcmd(wzcmd);
//1.99G NTでアプリエラーになった
if (!szcmd) {
szcmd = "";
}
//
SetDlgItemText(hwnd,IDD_COMMAND,szcmd);
SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)szcmd);
context->fNoSetEdit--;//2.99A 970321
return tool->wzcmd;
}
static void tlbFlushlist(TOOLBARCONTEXT* context)
{
HWND hwnd = context->hwnd;
HWND hctrl = GetDlgItem(hwnd,IDD_KEYLIST);
int i;
int itop = SendMessage(hctrl,LB_GETTOPINDEX,0,0);
SendMessage(hctrl,LB_RESETCONTENT,0,0);
for (i = 0;i < context->ntoolbar;i++) {
WZCMD wzcmd = context->ttxtoolbar[i].wzcmd;
mchar* szcmd;
if (wzcmd == WZCMD_SEPARATOR) {
szcmd = _szcmdsepa;
} else {
szcmd = wzcmdToSzcmd(wzcmd);
}
ListBox_AddString(hctrl,szcmd);
}
ListBox_AddString(hctrl,_szlast);
SendMessage(hctrl,LB_SETTOPINDEX,itop,0);
ListBox_SetCurSel(hctrl,context->itoolbar);
tlbFlush(context);
}
static void _tlbInsert(TOOLBARCONTEXT* context)
{
memmove(
&context->ttxtoolbar[context->itoolbar+1],
&context->ttxtoolbar[context->itoolbar],
(TXTOOLBAR_N - context->itoolbar - 1) * sizeof(TXTOOLBAR)
);
context->ntoolbar++;
}
static void tlbInsert(TOOLBARCONTEXT* context,WZCMD wzcmd)
{
HWND hwnd = context->hwnd;
_tlbInsert(context);
TXTOOLBAR *dst = &context->ttxtoolbar[context->itoolbar];
memset(dst,0,sizeof(*dst));
mchar szcmd[CCHWORD];
if (wzcmd == WZCMD_SEPARATOR) {
strcpy(szcmd,"__sepa");
} else {
strcpy(szcmd,wzcmdToSzcmd(wzcmd));
}
dst->wzcmd = wzcmd;
dst->iicon = TOOLBAR_ICONSTR;
dst->fSelAble = TRUE;
tlbFlushlist(context);
}
static void tlbDelete(TOOLBARCONTEXT* context)
{
memcpy(
&context->ttxtoolbar[context->itoolbar],
&context->ttxtoolbar[context->itoolbar+1],
(TXTOOLBAR_N - context->itoolbar - 1) * sizeof(TXTOOLBAR)
);
context->ntoolbar--;
if (context->itoolbar > context->ntoolbar) context->itoolbar = context->ntoolbar;
tlbFlushlist(context);
}
static void tlbRead(HWND hwnd,TXTOOLBAR *tool,TOOLBARCONTEXT* context)
{
*tool = context->now;//2.00E
mchar szcmd[CCHWORD];
GetDlgItemText(hwnd,IDD_COMMAND,szcmd,CCHWORD);
if (*szcmd) {//1.99H セパレータでIDD_SETされると駄目だった
tool->wzcmd = wzcmdRegister(szcmd);
GetDlgItemText(hwnd,IDD_DISPLAY,tool->szcaption,CCHSWORD);
}
}
static void tlbFlushButton(TOOLBARCONTEXT *context)
{
HWND hwnd = context->hwnd;
int i = context->itoolbar;
EnableWindow(GetDlgItem(hwnd,IDD_UP),(i > 0));
EnableWindow(GetDlgItem(hwnd,IDD_DOWN),(i + 1 < context->ntoolbar));
EnableWindow(GetDlgItem(hwnd,IDD_CLEAR),(i < context->ntoolbar));//2.00B
}
static BOOL tlbSave(TOOLBARCONTEXT *context)
{
TX* text = context->text;
txstr szstr = text->szToolbar;
while(1) {
HDIALOG hd = dialog("ツールバー定義を名前を付けて保存");
dialogStr(hd,"ツールバー定義名:",szstr,20,20);
if (dialogOpen(hd)) {
if (txmenuPickup(NULL,PICKUP_TOOLBARSEARCH,szstr) != PICKUP_NOTFOUND) {
int ret = question("%sは存在します。上書きしますか?",szstr);
if (ret == IDNO) return FALSE;
if (ret == IDYES) {
toolbarSave(context,szstr);
return TRUE;
}
} else {
toolbarSave(context,szstr);
return TRUE;
}
} else {
return FALSE;
}
}
}
static void tlbSetEdited(TOOLBARCONTEXT *context)
{
//2.99A 970321 new
context->fEdited = TRUE;
EnableDlgItem(context->hwnd,IDD_SET,TRUE);
}
BOOL dlgprocToolbar(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
TOOLBARCONTEXT *context = (LPVOID)dialogGetCustdata(hd);
TX* text = context->text;
CMDSEL_HOOK
switch(message) {
case WM_INITDIALOG: {
context->hwnd = hwnd;
context->fNoSetDisplay++;//3.00A3 970508
tlbFlushlist(context);
tlbFlushButton(context);
context->fNoSetDisplay--;//3.00A3 970508
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
if (id == IDD_KEYLIST && notify == LBN_SELCHANGE) {
context->itoolbar = ListBox_GetCurSel(GetDlgItem(hwnd,id));
context->fNoSetDisplay++;//3.00A3 970508
tlbFlushButton(context);
tlbFlush(context);
context->fNoSetDisplay--;//3.00A3 970508
return TRUE;
}
switch(id) {
case IDD_COMMAND:
case IDD_DISPLAY: {
//2.99A 970321
if (!context->fNoSetEdit && notify == EN_CHANGE) {
tlbSetEdited(context);
}
break;
}
case IDOK: {
#if 1//2.99A 970321 OKされたときに自動の"←"はしない。問い合わせる
if (context->fEdited) {
int ret = question("変更中の内容を更新しますか?");
if (ret == IDYES) {
SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
} else if (ret == IDCANCEL) {
return TRUE;
}
}
#else
//1.97 OKされたときは"←"もやる
SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
#endif
break;
}
case IDD_INSERTNEW: {//2.99A 970321
_tlbInsert(context);
TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
structClear(*tool);
tool->wzcmd = wzcmdFromSzcmd("txNull");
tlbFlushlist(context);
return TRUE;
}
case IDD_INSERT: {
_tlbInsert(context);
// IDD_SETへ
}
case IDD_SET: {
TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
tlbRead(hwnd,tool,context);
tlbFlushlist(context);
return TRUE;
}
case IDD_UP: {
int i = context->itoolbar;
TXTOOLBAR* ttxtoolbar = context->ttxtoolbar;
if (i > 0) {
TXTOOLBAR tool = ttxtoolbar[i-1];
ttxtoolbar[i-1] = ttxtoolbar[i];
ttxtoolbar[i] = tool;
//
context->itoolbar--;
tlbFlushlist(context);
}
return TRUE;
}
case IDD_DOWN: {
int i = context->itoolbar;
TXTOOLBAR* ttxtoolbar = context->ttxtoolbar;
if (i + 1 < context->ntoolbar) {
TXTOOLBAR tool = ttxtoolbar[i+1];
ttxtoolbar[i+1] = ttxtoolbar[i];
ttxtoolbar[i] = tool;
//
context->itoolbar++;
tlbFlushlist(context);
}
return TRUE;
}
case IDD_CLEAR: {
tlbDelete(context);
return TRUE;
}
case IDD_SEPARATOR: {
tlbInsert(context,WZCMD_SEPARATOR);
return TRUE;
}
case IDD_SELICON: {
#if 1//2.00E "← (&S)"しないのにアイコンがセットされた
int iicon = context->now.iicon;
if (dialogaIconSelect(context->now.sziconfilename,&iicon)) {
context->now.iicon = iicon;
pathToWz(context->now.sziconfilename);
SendMessage(hwnd,WM_PAINT,0,0);
tlbSetEdited(context);//2.99A 970321
}
#else
TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
int iicon = tool->iicon;
if (dialogaIconSelect(tool->sziconfilename,&iicon)) {
tool->iicon = iicon;
pathToWz(tool->sziconfilename);
SendMessage(hwnd,WM_PAINT,0,0);
}
#endif
break;
}
case IDD_REDUCE: {
#if 1//2.00E
context->now.fReduce = IsDlgButtonChecked(hwnd,IDD_REDUCE);
SendMessage(hwnd,WM_PAINT,0,0);
tlbSetEdited(context);//2.99A 970321
#else
TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
tool->fReduce = IsDlgButtonChecked(hwnd,IDD_REDUCE);
SendMessage(hwnd,WM_PAINT,0,0);
#endif
break;
}
case IDD_LOAD: {
if (keysLoad(hwnd,text,PICKUP_TOOLBARALL,context)) {
tlbFlushlist(context);
}
return TRUE;
}
case IDD_SAVE: {
tlbSave(context);
return TRUE;
}
case IDD_INIT: {//2.99D 970328
int ret = question("ツールバー定義を初期状態に戻します。よろしいですか?");
if (ret == IDYES) {
// OK
return FALSE;
} else {
return TRUE;
}
break;
}
}
break;
}
case WM_PAINT: {
#if 1//2.00E
drawIcon(hwnd,&context->now);
#else
drawIcon(hwnd,&context->ttxtoolbar[context->itoolbar]);
#endif
break;
}
case CSN_SETSZCMD: {
SetDlgItemText(hwnd,IDD_COMMAND,(mchar*)lParam);
//1.99H
mchar szcaption[CCHWORD];
listboxGetItemText(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN),0,szcaption,CCHWORD);
//3.00A3 970508 ツールバーのカスタマイズでチップヘルプがコマンド名になった
if (!context->fNoSetDisplay/*3.00A3*/) {
#if 1//3.00A3 970508
mchar sz[CCHWORD];
listboxGetItemText(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN),1,sz,CCHWORD);
SetDlgItemText(hwnd,IDD_DISPLAY,sz);
#else
SetDlgItemText(hwnd,IDD_DISPLAY,szcaption);
#endif
}
break;
}
}
return FALSE;
}
static int txuiCustToolbar(TX* text)
{
int ret = 0;
//2.96A 970214 ツールバーはロードされてないことがあるのでロードする。
if (!text->szToolbar[0]) return 0;
txOp(text,TXOP_TOOLBARLOADNAME,(LPARAM)text->szToolbar,0);
//
TOOLBARCONTEXT context;
structClear(context);
context.text = text;
memcpy(context.ttxtoolbar,text->ttxtoolbar,sizeof(context.ttxtoolbar));
context.ntoolbar = text->ntoolbar;
//
apidbOpen();
//
{
HDIALOG hd = dialogbig(captionGet("ツールバーの変更"));
dialogSetCustdata(hd,(DWORD)&context);
dialogSetContexthelp(hd,TRUE);
DTRECT r;
{
PMACROFUNC pfunc;
macroGetFuncAddress("dlgprocToolbar",&pfunc);
dialogSetHook(hd,&pfunc);
}
int cx = (_fwin40 ? 27 : 30);
dialogControlID(hd,IDD_KEYLIST);
dialogControlHelp(hd,387);
dialogList(hd,"ボタン(&B):",NULL,cx,_fwin40 ? 21 : 19);
int ey = dialogGetPosY(hd) - DTCYINT;
dialogLFV(hd);
dialogSetPosY(hd,dialogGetPosY(hd) + DTCY * (_fwin40 ? 4 : 5));
int cx = _fwin40 ? 9 : 10;
#if 1//2.99A 970321
dialogControlID(hd,IDD_SET);
dialogControlHelp(hd,388);
dialogCmd(hd,"更新(&S)",cx);
dialogControlID(hd,IDD_INSERTNEW);
dialogControlHelp(hd,389);
dialogCmd(hd,"挿入(&A)",cx);
#else
dialogControlID(hd,IDD_SET);
dialogControlHelp(hd,388);
dialogCmd(hd,"← (&S)",cx);
dialogControlID(hd,IDD_INSERT);
dialogControlHelp(hd,389);
dialogCmd(hd,"追加(&A)",cx);
#endif
dialogControlID(hd,IDD_SEPARATOR);
dialogControlHelp(hd,390);
dialogCmd(hd,"セパレータ(&E)",cx);
dialogControlID(hd,IDD_CLEAR);
dialogControlHelp(hd,391);
dialogCmd(hd,"削除(&T)",cx);
dialogSpaceV(hd);
dialogControlID(hd,IDD_UP);
dialogControlHelp(hd,392);
dialogCmd(hd,"↑ (&U)",cx);
dialogControlID(hd,IDD_DOWN);
dialogControlHelp(hd,393);
dialogCmd(hd,"↓ (&D)",cx);
dialogLFV(hd);
//
dialogSpaceV(hd);
dialogGroup(hd,"内容");
dialogSetGroupBottom(hd,ey);
{
DTRECT r1,r2;
int cx = _fwin40 ? 38 : 30;
if (_fwin40) {//2.90
cmdselSetIdb(IDB_CMDDEFAULT);//2.90
dialogControlID(hd,IDD_CMDSEL_TREELIST);
dialogTree(hd,"機能一覧(&L):",NULL,cx,10);//2.98 970308 コマンド一覧->機能一覧
//2.99A 970321 機能一覧の下に、操作メニュー追加
dialogControlID(hd,IDD_CMDSEL_CONTEXTMENU);
dialogButton(hd,"機能一覧の操作(&O)...",NULL,20);
} else {
cmdselSetIdb(IDB_CMD);//2.90
dialogGetPos(hd,&r1);
r1.cx = DTCX * 12;r1.cy = DTCY;
r2.x = r1.x + r1.cx + DTCX;
r2.y = r1.y;
r2.cx = DTCX * (cx - 12 - 1);r2.cy = DTCYBOX;
//
r2.cy = DTCY * 10;
_dialogAddLtext(hd,"分類一覧(&L):",&r1);
_dialogAddCombobox(hd,IDD_CMDSEL_CATEGORY,&r2);
dialogControlHelp(hd,359);
_dialogAddControlInfo(hd,IDD_CMDSEL_CATEGORY);
r1.y = r2.y = r2.y + DTCY * 2;
//
{
DTRECT r = r1;r.cx = DTCX * 16;
_dialogAddLtext(hd,"コマンド一覧(&W):",&r);
}
r2.x = r1.x;r2.cx = DTCX * 31;r2.y += DTCY*3/2;//2.00B コマンド一覧を大きくした
_dialogAddCombobox(hd,IDD_CMDSEL_LIST,&r2);
dialogControlHelp(hd,360);
_dialogAddControlInfo(hd,IDD_CMDSEL_LIST);
r1.y = r2.y = r2.y + DTCY * 2;
dialogSetPosY(hd,r1.y);
//2.00E4
dialogSetH(hd);
dialogControlID(hd,IDD_CMDSEL_SEARCH);
dialogControlHelp(hd,229);
dialogButtonCmd(hd,"検索(&F)...",NULL,15);
dialogControlID(hd,IDD_CMDSEL_SEARCHNEXT);
dialogControlHelp(hd,229);
dialogButtonCmd(hd,"次検索(&N)",NULL,15);
dialogLF(hd);
dialogSetV(hd);
}
//
dialogGetPos(hd,&r1);
r1.cx = DTCX * 12;r1.cy = DTCY;
r2.x = r1.x + r1.cx + DTCX;
r2.y = r1.y;
r2.cx = DTCX * (cx - 12 - 1);r2.cy = DTCYBOX;
_dialogAddLtext(hd,"コマンド(&X):",&r1);
_dialogAddEditbox(hd,IDD_COMMAND,&r2);
dialogControlHelp(hd,361);
_dialogAddControlInfo(hd,IDD_COMMAND);
r1.y = r2.y = r2.y + DTCY * 2;
__dialogAddItem(hd,"STATIC","チップヘルプ(&Y):",IDD_DISPLAYGUIDE,&r1,SS_LEFT|WS_GROUP|WS_CHILD|WS_VISIBLE);
_dialogAddEditbox(hd,IDD_DISPLAY,&r2);
dialogControlHelp(hd,394);
_dialogAddControlInfo(hd,IDD_DISPLAY);
dialogSetPosY(hd,r2.y + r2.cy + DTCYINT);
//
dialogGetPos(hd,&r);
r.cx = DTCX * 8;
r.cy = DTCYBUTTON;
_dialogAddLtext(hd,"アイコン:",&r);
r.x += r.cx;
r.cx = DTCX * 5;
r.cy = DTCY * 4;
_dialogAddItem(hd,DCS_LTEXT,"",IDD_ICON,&r,0);
int ey = r.y + r.cy;
//
r.x += r.cx;
r.cx = DTCX * 14;
r.cy = DTCYBUTTON;
_dialogAddCheck(hd,"縮小表示(&R)",IDD_REDUCE,&r);
dialogControlHelp(hd,395);
_dialogAddControlInfo(hd,IDD_REDUCE);
//
r.y += r.cy;
r.cx = DTCX * 16;
r.cy = DTCYBUTTON;
_dialogAddButton(hd,"アイコンの選択(&I)...",IDD_SELICON,&r);
dialogControlHelp(hd,396);
_dialogAddControlInfo(hd,IDD_SELICON);
//
dialogSetPosY(hd,ey);
}
dialogGroupEnd(hd);
dialogLFV(hd);
int xcmd = dialogGetPosX(hd) + DTCX * 1;
dialogLF(hd);
//2.00E4
dialogSetIntXY(hd,0,0);
dialogCaption(hd,"コマンドの説明:");
dialogResetInt(hd);
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 80;
r.cy = DTCY * (_fwin40 ? 7 : 4);
_dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
dialogControlHelp(hd,372);
_dialogAddControlInfo(hd,IDD_CMDSEL_EXPLAIN);
dialogLFV(hd);
dialogSetPosX(hd,xcmd);
int cx = _fwin40 ? 7 : 11;
dialogOK(hd,cx);
dialogCancel(hd,cx);
dialogSpaceV(hd);
dialogHelpID(hd,cx,"wz",IDH_CUSTTOOL);
dialogSpaceV(hd);
dialogControlID(hd,IDD_LOAD);
dialogCmd(hd,"読込み...",cx);
dialogControlID(hd,IDD_SAVE);
dialogCmd(hd,"別保存...",cx);
//2.99D 970328
dialogControlID(hd,IDD_INIT);
dialogCmd(hd,"初期化...",cx);
ret = dialogOpen(hd);
}
apidbClose();
if (ret == IDD_INIT) {//2.99D 970328
if (initUiConfig("wz.bar")) {
txFlushUI(text);
}
return FALSE;
} else if (ret) {
toolbarSave(&context,text->szToolbar);
#if 1//2.96A 970214 WZ Filer対応
txFlushUI(text);
#else
memcpy(text->ttxtoolbar,context.ttxtoolbar,sizeof(context.ttxtoolbar));
text->ntoolbar = context.ntoolbar;
txFlushToolbar(text);
txFlush(text); // commctrlは、txFlushToolbarだけだと駄目
#endif
}
return ret;
}
BOOL TXCMDBASE toolbar(void)
{
// ツールバーのカスタマイズ
return txuiCustToolbar(textf);
}
//## WZ1.0の設定の取り込み
// thanks y.mikomeさん
//2.00-2,2.00A rewrite
static mchar *tsz[] = {
"\",", "\" ",
"select.", "edit.select",
"lp.uiPrint", "word.uiPrint",
"imetx.regword", "stdlib.imeRegWord",
"complete.main", "edit.completeNext",
"complete.main", "edit.completePrev",
"complate.add", "edit.completeAdd",
"bookmark.main", "search.uiMark",
"seikei.main", "edit.uiFormText",
"seikei.para", "edit.formtext",
"seikei.join", "edit.formtextJoinAll",
"seikei.all", "edit.formtextall",
"seikei.config", "edit.uiFormText",
"datetime.main", "edit.uiInsertDate",
"template.list", "edit.uiInsertTemplate",
"template.main", "edit.uiInsertTemplate",
"title.main", "outline.main",
//1.99A
"usermenu.umcMouseR", "edit.menuMouse",
"usermenu.umcMouseRClip", "edit.menuMouseRClip",
//1.99D
"usermenu.umcMouseR", "edit.menuMouse",
"usermenu.umcMouseRClip", "edit.menuMouseRClip",
"usermenu.umcMiFile", "file.menuFileMi",
"usermenu.umcMiJump", "search.menuJumpMi",//2.00A ucm->umc
"usermenu.umcMiSearch", "search.menuSearchMi",
"usermenu.umcMiMark", "search.menuMarkMi",
"usermenu.umcVzFile", "file.menuFileVz",
//2.00A
"configtx.uiConfig", "config.uiConfig",
0,0
};
#define GUIDE_FOLDER "フォルダ:\n %s\n"
static BOOL wzkeyIsExist(mchar* szname)
{
BOOL ret = FALSE;
TX body;
TX* text = &body;
txInitText(text);
mchar szfilename[CCHPATHNAME];
pathFullConfig(szfilename,"wz.key");//2.00E
txSetFileName(text,szfilename);
txOpenText(text);
txJumpFileTop(text);
ret = txSearchEx(text,"[" + szname + "]",0);
txClose(text);
return ret;
}
static BOOL wzkeyLoadWz10key(mchar* szname,mchar* szkeyfile)
{
BOOL ret = FALSE;
TX body;
TX* text = &body;
txInitText(text);
{
txSetFileName(text,szkeyfile);
txOpenText(text);
//
jumpfiletop;
select;
if (searchpara("#key")) {
nextpara;
selectdelete;
if (searchpara("#end")) {
select;
if (searchpara("#fkey")) {
nextpara;
selectdelete;
jumpparatop;
insert("FKEY=");
nextpara; deleteword;
insert("FKEY+SHIFT=");
nextpara; deleteword;
insert("FKEY+CTRL=");
nextpara; insertpara;
insert("FKEY+SHIFT+CTRL=\"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" ");
nextpara;
select;
jumpfileend;
selectdelete;
txReplaceEx(
text,
\"\t+\([A-Za-z.0-9]+\)[ \t]+\(.+\)$",
\"\1=\2",
SEARCH_ALL|SEARCH_RE
);
int i;
for (i = 0;tsz[i];i += 2) {
txReplaceEx(
text,
tsz[i],
tsz[i+1],
SEARCH_ALL|SEARCH_NOSENSECASE|SEARCH_WORD
);
}
ret = TRUE;
}
}
}
if (ret) {
TX* txkey = text;
{
TX body;
TX* text = &body;
txInitText(text);
{
mchar szfilename[CCHPATHNAME];
pathFullConfig(szfilename,"wz.key");//2.00E
txSetFileName(text,szfilename);
txOpenText(text);
txJumpFileEnd(text);
txInsertReturn(text);
txInsertf(text,"[%s]",szname);
txInsertReturn(text);
txInsertText(text,txkey);
txSave(text);
}
txClose(text);
}
}
}
txClose(text);
return ret;
}
static BOOL wz10GetEnvkey(mchar* szOldPath,txstr szkey)
{
BOOL ret = FALSE;
inittext2;
setfilename2(szOldPath + \"\wz.dat");
opentext2;
{
jumpfiletop2;
if (searchpara2("[Env]")) {
if (searchpara2("key=")) {
rightword2;
getword2(szkey);
ret = TRUE;
}
}
}
close2;
return ret;
}
static BOOL wz10ConvertKey(mchar* szOldPath)
{
BOOL ret = FALSE;
txstr szkey;
if (!wz10GetEnvkey(szOldPath,szkey)) {
information(GUIDE_FOLDER "のWZ EDITORはversion1.0ではありません。");
return FALSE;
}
txstr szname = szkey + "_key";
while(1) {
HDIALOG hd = dialog("キー定義の名前付け");
dialogStr(hd,"キーの名前:",szname,10,20);
dialogCaption(hd,"ここで付けた名前が設定ダイアログの");
dialogCaption(hd,"キー定義欄に表示されます。");
//
if (dialogOpen(hd)) {
if (wzkeyIsExist(szname)) {
information("名前 %s は既に使われています。\n別の名前を指定してください",szname);
continue;
} else {
if (wzkeyLoadWz10key(szname,szOldPath + "\\" + szkey + ".key")) {
information("キー定義を取り込みました。\n\n[設定]ダイアログ-[インターフェース]で、キー定義を\n\"%s\"に設定してください。\n",szname);
return TRUE;
} else {
attention("キー定義の取り込みに失敗しました");
return FALSE;
}
}
}
break;
}
return FALSE;
}
static BOOL wz10CopyText(mchar* szOldPath,mchar* szNewPath)
{
return cmd("mcopy \"" + szNewPath + "\" \"" + szOldPath + "\\text\\\"");
}
BOOL dlgprocFromwz10(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
switch(id) {
case IDD_CONVERTKEY:
case IDD_COPYTEXT: {
txstr szNewPath = text->szexedir;
pathForm(szNewPath);
//
mchar szpath[CCHPATHNAME];
GetDlgItemText(hwnd,IDD_OLDPATH,szpath,CCHPATHNAME);
BOOL fFind = FALSE;
BOOL fWZ20 = FALSE; // WZ2.0同士の再インストール? (未対応)
if (fileIsExist(szpath + \"\wz.exe")) {
fFind = TRUE;
}
if (fileIsExist(szpath + \"\wzedit32.exe")) {
fFind = TRUE;
}
if (fileIsExist(szpath + \"\wzeditor.exe")) {
fFind = TRUE;
fWZ20= TRUE;
}
if (fFind) {
if (id == IDD_COPYTEXT) {
if (wz10CopyText(szpath,szNewPath)) {
information("TEXTフォルダの内容をコピーしました");
} else {
attention("TEXTフォルダの内容のコピーに失敗しました");
}
} else {
if (fWZ20) {
information(GUIDE_FOLDER "のWZ EDITORはVer.2.0です。\nコンバートは実行しません。",szpath);
} else {
wz10ConvertKey(szpath);
}
}
} else {
information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szNewPath);
}
return TRUE;
}
}
}
}
return FALSE;
}
fromWZ10
{
// 旧版の設定を取り込み
txstr szOldPath = text->szexedir;
pathForm(szOldPath);
//
HDIALOG hd = dialog("旧版の設定の取り込み");
dialogSetHookEx(hd,"\m.dlgprocFromwz10");
dialogSetGroupRight(hd,DTCX * 60);
//
dialogGroup(hd,"旧版のWZのフォルダ(&F)");
dialogControlRefer(hd,"-d");
dialogControlID(hd,IDD_OLDPATH);
dialogStr(hd,NULL,szOldPath,0,40);
dialogGroupEnd(hd);
//
dialogGroup(hd,"説明");
dialogCaption(hd,"旧版のWZ EDITORで使用していたキー定義を取り込みます。");
dialogCaption(hd,"[TEXTフォルダのコピー]ボタンを押すと、");
dialogCaption(hd,"旧版のWZのTEXTフォルダ内の文書ファイルをコピーします。");
dialogGroupEnd(hd);
//
dialogLFV(hd);
int lcx = 20;
dialogControlID(hd,IDD_CONVERTKEY);
dialogCmdDefault(hd,"キー定義の取り込み",lcx);
//
dialogControlID(hd,IDD_COPYTEXT);
dialogCmd(hd,"TEXTフォルダのコピー(&T)",lcx);
//
dialogSpaceV(hd);
dialogControlID(hd,IDCANCEL);
dialogCmd(hd,"閉じる",lcx);
//
dialogOpen(hd);
}
//## WZ2.0 convert
//2.99C 970327 new
//#define GUIDE_FOLDER "フォルダ:\n %s\n"
//#define IDD_OLDPATH 100
//#define IDD_COPYTEXT 102
static BOOL wz20CopyText(mchar* szOldPath,mchar* szNewPath)
{
return cmd("mcopy \"" + szNewPath + "\" \"" + szOldPath + "\\text\\\"");
}
static BOOL txConvertCmdWz2To3(TX* text)
{
static mchar* tsz[] = {
"cmdlist.uiWzcmdList","apidb2.uiCmdList",
"txJumpTag","search.txJumpTagEx",
"edit.selectUp","txkeyUp",
"edit.selectDown","txkeyDown",
"edit.selectLeft","txkeyLeft",
"edit.selectRight","txkeyRight",
"edit.selectLeftWord","search.txkeyLeftWord",
"edit.selectRightWord","search.txkeyRightWord",
#if 1//3.00A 970501 WZ2.0のMS.KEYを取り込んでShift+Ctrl+左右方向キーを押すとエラーになった
"txLeftWordMi","search.txkeyLeftWord",
"txRightWordMi","search.txkeyRightWord",
"edit.selectWordTop","search.txkeyLeftWord",
"edit.selectWordEnd","search.txkeyRightWord",
#else
"edit.selectWordTop","search.txkeyJumpWordTop",
"edit.selectWordEnd","search.txkeyJumpWordEnd",
#endif
"edit.selectScreenTop","search.txkeyJumpScreenTop",
"edit.selectScreenEnd","search.txkeyJumpScreenEnd",
"edit.selectPrevPage","search.txkeyPrevPage",
"edit.selectNextPage","search.txkeyNextPage",
"edit.selectPrevHalfPage","search.txkeyPrevHalfPage",
"edit.selectNextHalfPage","search.txkeyNextHalfPage",
"edit.selectLineTop","search.txkeyJumpLineTop",
"edit.selectLineEnd","search.txkeyJumpLineTail",
"edit.selectFileTop","search.txkeyJumpFileTop",
"edit.selectFileEnd","search.txkeyJumpFileEnd",
"edit.selectParaTop","search.txkeyJumpParaTop",
"edit.selectParaEnd","search.txkeyJumpParaEnd",
"txkeyDeletePrev","edit.txkeyDeletePrev",
"txDeleteChar","edit.txkeyDeleteChar",
"txWriteReturn","edit.txkeyEnter",
"txSearchContinue","search.txkeySearchContinue",
"txSearchContinuePrev","search.txkeySearchContinuePrev",
// html
"word.txCharStrong","html.insertTagContainer([STRONG])",
"word.txCharEm","html.insertTagContainer([EM])",
"word.txCharCite","html.insertTagContainer([CITE])",
"word.txCharCode","html.insertTagContainer([CODE])",
"word.txCharKbd","html.insertTagContainer([KBD])",
"word.txCharSamp","html.insertTagContainer([SAMP])",
"word.txCharVar","html.insertTagContainer([VAR])",
"word.txCharSubscript","html.insertTagContainer([SUB])",
"word.txCharSuperscript","html.insertTagContainer([SUP])",
"word.txCharAddress","html.insertTagContainer([ADDRESS])",
"word.txCharFixedfont","html.insertTagContainer([TT])",
"word.txFormBlockquote","html.insertTagContainer([BLOCKQUOTE])",
"word.txFormPre","html.insertTagContainer([PRE])",
"word.txuiCharFontSize","html.uiColor",
"word.htmlbrowser","html.htmlbrowser",
"word.txFormTable","word.txuiConvertTable",
"word.txuiFormIndent","word.txuiParaatr",
"word.txuiInsertBitmapEx","word.txuiInsertBitmap",
"word.txuiAnchor","html.txuiInsertAnchor",
"word.txuiLinkBrowse","removed",
"word.txLinkClear","removed",
"word.txuiLinkTo","word.txuiLink",
"word.txuiFormArticle","removed",
"word.txFormDefine","html.insertArticle",
"word.txFormDefineItem","removed",
"word.txFormDefineDefine","removed",
"word.txFormDefineList","removed",
"word.txFormDefineListCompact","removed",
"word.txFormDefineClear","removed",
"word.txuiPropertyChar","edit.txkeyAltEnter",
"word.txInsertP","edit.txkeyCtrlEnter",
"word.txInsertBR","edit.txkeyShiftEnter",
"word.txInsertBrClearAll","removed",
"word.txInsertBrClearLeft","removed",
"word.txInsertBrClearRight","removed",
"word.txuiPropertyText","removed",
"word.txLfToBr","removed",
"word.txDeleteTag","html.clearTag",
"word.txCharComment","html.uiInsertTagComment",
//
"edit.txDeleteCharMs","edit.txkeyDeleteChar",
"edit.txDeletePrevMs","edit.txkeyDeletePrev",
"word.txFormTab","word.txInsertBeamtab",
//3.00A 970501 WZ2のMS.KEYを取り込むと、Shift+矢印で選択し、Shiftを離してPageUp/Downを押しても選択が解除されなかった
"txNextPage","search.txkeyNextPage",
"txPrevPage","search.txkeyPrevPage",
0,0,
};
for (int i = 0;tsz[i];i += 2) {
txReplaceEx(
text,
tsz[i],
tsz[i+1],
SEARCH_ALL|SEARCH_NOSENSECASE|SEARCH_WORD
);
}
return TRUE;
}
#define CCUI20_KEY 0x01
#define CCUI20_MENU 0x02
#define CCUI20_TOOLBAR 0x04
//2.99G 970404
static void _replace(TX* text,mchar* szSection,TX* textSrc)
{
// textのカーソル位置はszSectionの行頭であること
// この位置は変えない。
SEARCHMODE sm = SEARCH_PARATOP|SEARCH_CUR|SEARCH_NOSENSECASE;
IFILE adr = txGetAddress(text);
txJumpFileTop(textSrc);
if (txSearchEx(textSrc,szSection,sm)) {
txSelectEx(text,CLIP_CHAR);
txNextPara(text);
if (txSearchEx(text,"[",sm)) {
} else {
txJumpFileEnd(text);
}
txSelectDelete(text);
//
txSelectEx(textSrc,CLIP_CHAR);
txNextPara(textSrc);
if (txSearchEx(textSrc,"[",sm)) {
} else {
txJumpFileEnd(textSrc);
}
txPrivatePush(textSrc);
txPrivatePop(text);
}
}
//2.99G 970404 WZ2.0のWZ.KEY,WZ.MNUを読み込むとファイラーのコマンドが置き換わってファイラーが使えなくなった
static void wz20ConvertReplaceFiler(TX* text,mchar* szFilename)
{
TX* text2 = textopen(szFilename);
if (text2) {
SEARCHMODE sm = SEARCH_PARATOP|SEARCH_CUR|SEARCH_NOSENSECASE;
//
txJumpFileTop(text);
if (txSearchEx(text,"[txe_filer]",sm)) {
_replace(text,"[txe_filer]",text2);
}
//
txJumpFileTop(text);
if (txSearchEx(text,"[bartxe_filer]",sm)) {
_replace(text,"[bartxe_filer]",text2);
}
//
txJumpFileTop(text);
while(1) {
if (txSearchEx(text,"[FILER",sm)) {
txstr szline;
txGetPara(text,szline);
mchar* p = strchr(szline,']');
if (p) {
p[1] = 0;
_replace(text,szline,text2);
}
if (!txNextPara(text)) break;
} else {
break;
}
}
textclose(text2);
}
}
static BOOL wz20ConvertConfig(mchar* _szOldPath,mchar* _szNewPath,WORD mode)
{
BOOL ret = TRUE;
txstr szOldPath = _szOldPath + "\\";
txstr szNewPath = _szNewPath + "\\";
if (mode & CCUI20_KEY) {
TX* text = textopen(szOldPath + "wz.key");
if (text) {
txConvertCmdWz2To3(text);
wz20ConvertReplaceFiler(text,szNewPath + "wz.key");//2.99G 970404
txSaveTo(text,szNewPath + "wz.key");
textclose(text);
statprintf("キー定義を取り込みました");wait(300);
} else {
information("キーの取り込みができませんでした");
ret = FALSE;
}
}
if (mode & CCUI20_MENU) {
TX* text = textopen(szOldPath + "wz.mnu");
if (text) {
txConvertCmdWz2To3(text);
wz20ConvertReplaceFiler(text,szNewPath + "wz.mnu");//2.99G 970404
//
txJumpFileTop(text);
if (txSearchEx(text,"[HTML挿入]",0) && txNextPara(text)) {
txInsertLine(text,"html.uiInsertTag=タグ(&G)...");
txInsertLine(text,"__sepa");
}
//
txJumpFileTop(text);
if (txSearchEx(text,"[カスタマイズ]",0) && txNextPara(text)) {
txInsertLine(text,"config.uiCustmize=カスタマイズ(&O)...");
txInsertLine(text,"__sepa");
}
//
txJumpFileTop(text);
if (txSearchEx(text,"[編集]",0)) {
if (txSearchEx(text,"[",SEARCH_PARATOP)) {
txPrevPara(text);
while(1) {
if (txIsCurReturn(text)) {
if (!txPrevPara(text)) break;
} else {
txNextPara(text);
break;
}
}
txInsertLine(text,"paraform.sw=自動インライン整形(&M)");
}
}
//2.99G 970404 メニューをひきつぐとWZ2.0のとりこみなくなって、とりこみの続きができなかった
txJumpFileTop(text);
if (txSearchEx(text,"[追加機能]",0)) {
if (txSearchEx(text,"[",SEARCH_PARATOP)) {
txPrevPara(text);
while(1) {
if (txIsCurReturn(text)) {
if (!txPrevPara(text)) break;
} else {
txNextPara(text);
break;
}
}
txInsertLine(text,"custmize.fromWZ20=WZ2.0の設定を取り込み(&2)...");
}
}
//
txSaveTo(text,szNewPath + "wz.mnu");
textclose(text);
statprintf("メニュー定義を取り込みました");wait(300);
} else {
information("メニューの取り込みができませんでした");
ret = FALSE;
}
}
if (mode & CCUI20_TOOLBAR) {
TX* text = textopen(szOldPath + "wz.bar");
if (text) {
txConvertCmdWz2To3(text);
txSaveTo(text,szNewPath + "wz.bar");
textclose(text);
statprintf("ツールバー定義を取り込みました");wait(300);
txFlushToolbar(textf);//3.00A4 970509 WZ20の設定の取り込みでツールバーを取り込んでも、ツールバービットマップキャッシュが更新されてなかった
} else {
information("ツールバーの取り込みができませんでした");
ret = FALSE;
}
}
return ret;
}
static BOOL CheckTextconfigEnable(void)
{
txstr szPrg = text->szexedir + \"std_src\txcfgm.c";
if (!fileIsExist(szPrg)) {
information("WZを[最小]でインストールしているため、WZ2.0の設定と印刷スタイルを取り込むことはできません\n");
return FALSE;
}
return TRUE;
}
static BOOL backupConfig(void)
{
//3.00A 970502 new
int ret = question("現在のキー定義や設定のバックアップを取りますか?");
if (ret == IDCANCEL) return FALSE;
if (ret == IDYES) {
mchar* tsz[] = {
"wz.cfg","wzshare.cfg","wzprint.cfg",
"wzp.cfg",//3.00B1 970613
"wz.key","wz.mnu","wz.bar",
NULL
};
BOOL ret = TRUE;
for (int i = 0;tsz[i];i++) {
mchar szsrc[CCHPATHNAME];
pathFullConfig(szsrc,tsz[i]);
mchar szdst[CCHPATHNAME];
strcpy(szdst,szsrc);
mchar* p = pathGetFileName(szdst);
if (toupper(*p) == 'W') *p = '_';
if (!myfileCopy(szsrc,szdst)) {
information("%sから%sへのコピーに失敗しました",szsrc,szdst);
ret = FALSE;
break;
}
}
information("wz*.cfg,wz.key,wz.mnu,wz.barを、\n_z*.cfg,_z.key,_z.mnu,_z.barにバックアップを取りました。");
if (!ret) return FALSE;
}
return TRUE;
}
BOOL TXCMDBASE fromWZ20(TX* text)
{
// WZ2.0の設定を取り込み
//2.99C 970327 new
txstr szOldPath = text->szexedir;
pathForm(szOldPath);
BOOL fConvertKey = TRUE;
BOOL fConvertMenu = FALSE; //2.99H 970405 メニューは標準で使ってもらうのが望ましいのでデフォルトでは変換OFF
BOOL fConvertToolbar = TRUE;
BOOL fConvertConfig = TRUE;
BOOL fConvertLprint = TRUE;
BOOL fCopyText = FALSE;
#if MYDEBUG // for test
fConvertKey = FALSE;
fConvertMenu = FALSE;
fConvertToolbar = FALSE;
szOldPath = "c:\\wz20_16";
#endif
//
{
txstr sz = text->szexedir + "txcfg.$$$";
if (fileIsExist(sz)) {
//2.99G 970404 いきなりマクロのコンパイルが始まるのはびっくりするのでメッセージを出す
int ret = question("これからWZ2.0の設定の取り込みを実行します。\nWZのマクロのコンパイルなどが行われ、数分の時間がかかります\n実行してもよろしいですか?");
if (ret != IDYES) return FALSE;
//
fileDelete(sz);
#if 1//2.99G 970404 空白が含まれるszexedirだとだめだった。
macroFork("\"" + text->szexedir + "txcfgset.main\"");
#else
macroFork(text->szexedir + "txcfgset.main");
#endif
return TRUE;
}
}
//
HDIALOG hd = dialog("WZ2.0の設定の取り込み");
int lcxh = 60;
//
dialogHeadline(hd,"WZ2.0のフォルダ",lcxh);
dialogControlRefer(hd,"-d");
dialogControlID(hd,IDD_OLDPATH);
dialogStr(hd,"フォルダ(&F):",szOldPath,10,40);
//
dialogHeadline(hd,"取り込む内容",lcxh);
dialogCheck(hd,"キー定義(&K)",&fConvertKey);
dialogCheck(hd,"メニュー定義(&M)",&fConvertMenu);
dialogIndent(hd,4);
dialogCaption(hd,"メニュー定義は取り込まず、");//3.00A2 970507
dialogCaption(hd,"WZ3.0標準のメニューを使うことをおすすめします");//3.00A2 970507
dialogIndent(hd,-4);
dialogCheck(hd,"ツールバー定義(&T)",&fConvertToolbar);
dialogCheck(hd,"設定(&C)",&fConvertConfig);
dialogCheck(hd,"印刷スタイル(&P)",&fConvertLprint);
dialogCheck(hd,"TEXTフォルダのコピー(&O)",&fCopyText);
//
if (dialogOpen(hd)) {
txstr szNewPath = text->szexedir;
pathForm(szNewPath);
#if MYDEBUG // for test
szNewPath = "c:\\wz30_32";
#endif
//
#if 1//3.00A 970502
if (!backupConfig()) return FALSE;
#else
int ret = question("現在のキー定義や設定のバックアップを取りますか?");
if (ret == IDCANCEL) return FALSE;
if (ret == IDYES) {
mchar* tsz[] = {
"wz.cfg","wzshare.cfg","wzprint.cfg",
"wz.key","wz.mnu","wz.bar",
NULL
};
BOOL ret = TRUE;
for (int i = 0;tsz[i];i++) {
mchar szsrc[CCHPATHNAME];
pathFullConfig(szsrc,tsz[i]);
mchar szdst[CCHPATHNAME];
strcpy(szdst,szsrc);
mchar* p = pathGetFileName(szdst);
if (toupper(*p) == 'W') *p = '_';
if (!myfileCopy(szsrc,szdst)) {
information("%sから%sへのコピーに失敗しました",szsrc,szdst);
ret = FALSE;
break;
}
}
information("wz*.cfg,wz.key,wz.mnu,wz.barを、\n_z*.cfg,_z.key,_z.mnu,_z.barにバックアップを取りました。");
if (!ret) return FALSE;
}
#endif
//
if (fileIsExist(szOldPath + \"\wzeditor.exe")) {
if (fileIsExist(szNewPath + \"\wzeditor.exe")) {
if (fCopyText) {
if (wz20CopyText(szOldPath,szNewPath)) {
information("TEXTフォルダの内容をコピーしました。");
} else {
attention("TEXTフォルダの内容のコピーに失敗しました。");
}
}
if (fConvertKey) wz20ConvertConfig(szOldPath,szNewPath,CCUI20_KEY);
if (fConvertMenu) wz20ConvertConfig(szOldPath,szNewPath,CCUI20_MENU);
if (fConvertToolbar) wz20ConvertConfig(szOldPath,szNewPath,CCUI20_TOOLBAR);
// 最後に行う
if (fConvertConfig || fConvertLprint) {
if (CheckTextconfigEnable()) {
BOOL ret = TRUE;
{
TX* text = textopen(szOldPath + \"\std\txcfg.c");
fileDelete(szOldPath + \"\std\txcfg.txm");
//information(text->szfilename);
if (text) {
txDeleteText(text);
txInsert(text,"\nmain\n{\n");
txInsert(text," call(\"txcfgm.writeStd\");\n");
{
mchar* tsz[] = {
"txcfgset.c",
"txcfgs1.c","txcfgs2.c","txcfgs3.c",
"txcfgs4.c","txcfgs5.c","txcfgs6.c",
"txcfgs7.c","txcfgs8.c","txcfgs9.c",
NULL
};
for (i = 0;tsz[i];i++) {
txInsertf(text," fileCopy(text->szexedir+\\\"%s\",\\\"%s%s\");\n",tsz[i],text->szexedir,tsz[i]);
}
txInsertf(text," mchar szfilename[CCHPATHNAME];\n");
txInsertf(text," strcpy(szfilename,\\\"%s%s\");\n",text->szexedir,"txcfg.$$$");
txInsertf(text," HFILE hfile = hfileCreate(szfilename);\n");
txInsertf(text," hfileClose(hfile);\n");
}
txInsert(text," information(\"- 設定の取り込み -\\n\\nこのWZを全て終了しWZ3.0を起動して、「ツール|追加機能|WZ2.0の設定を取り込み」を実行してください。\\nこれで設定が取り込まれます\");\n");
txInsert(text,"}\n");
//
txSave(text);
textclose(text);
} else {
information("err:%s%d",__FILE__,__LINE__);
ret = FALSE;
}
}
if (ret) {
#if 1//2.99G 970404
fileCopy(text->szexedir + \"std_src\txcfgm.c",szOldPath + \"\std\txcfgm.c");
#else
fileCopy(text->szexedir + \"std\txcfgm.c",szOldPath + \"\std\txcfgm.c");
#endif
fileDelete(szOldPath + \"\std\txcfgm.txm");
txOpenForkFast(text,text->szexedir + "std\\txcfg.txt");
}
}
} else {
//3.00A4 970509
information("設定を読み込みました。\n新しい設定は次に開くファイルから有効になります。\n今現在開いているWZの窓の設定は古いままです。\nこの窓で設定を行うと古い設定が保存されるので注意してください。");
}
} else {
information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szNewPath);
}
} else {
information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szOldPath);
}
return TRUE;
}
return FALSE;
}
static BOOL copyMacro(mchar* szOldPath,mchar* szNewPath)
{
//3.00A 970502
return cmd("mcopy \"" + szNewPath + "\" \"" + szOldPath + "\\macro\\\"");
}
static BOOL copyFile(mchar* szOldPath,mchar* szNewPath,mchar* szfilename)
{
return fileCopy(szOldPath + "\\" + szfilename,szNewPath + "\\" + szfilename);
}
permanent txstr szPathFromWz30; //3.00A 970502
BOOL TXCMDBASE fromWZ30(TX* text)
{
// WZ3.0の設定を取り込み
// ネットワークには対応していません。
//3.00A 970502 new
txstr szOldPath;
if (szPathFromWz30 != "") {
szOldPath = szPathFromWz30;
} else {
szOldPath = text->szexedir;
pathForm(szOldPath);
}
BOOL fConvertKey = TRUE;
BOOL fConvertMenu = TRUE;
BOOL fConvertToolbar = TRUE;
BOOL fConvertConfig = TRUE;
BOOL fConvertLprint = TRUE;
BOOL fCopyText = TRUE;
BOOL fCopyMacro = TRUE;
BOOL fCopyIniDic = TRUE;//3.00A2 970503
//
HDIALOG hd = dialog("他のWZ3.0の設定の取り込み");
int lcxh = 60;
//
dialogHeadline(hd,"他のWZ3.0のフォルダ",lcxh);
dialogControlRefer(hd,"-d");
dialogControlID(hd,IDD_OLDPATH);
dialogStr(hd,"フォルダ(&F):",szOldPath,10,40);
//
dialogHeadline(hd,"取り込む内容",lcxh);
dialogCheck(hd,"キー定義(&K)",&fConvertKey);
dialogCheck(hd,"メニュー定義(&M)",&fConvertMenu);
dialogCheck(hd,"ツールバー定義(&T)",&fConvertToolbar);
dialogCheck(hd,"設定(&C)",&fConvertConfig);
dialogCheck(hd,"印刷スタイル(&P)",&fConvertLprint);
dialogCheck(hd,"TEXTフォルダのコピー(&O)",&fCopyText);
dialogCheck(hd,"MACROフォルダとAPIDBのコピー(&X)",&fCopyMacro);
dialogCheck(hd,"マクロの設定と辞書ファイル(&I)",&fCopyIniDic);//3.00A2 970503
//
if (dialogOpen(hd)) {
szPathFromWz30 = szOldPath;
txstr szNewPath = text->szexedir;
pathForm(szNewPath);
//
if (!backupConfig()) return FALSE;
//
if (fileIsExist(szOldPath + \"\wzeditor.exe")) {
if (fileIsExist(szNewPath + \"\wzeditor.exe")) {
if (fCopyText) {
if (wz20CopyText(szOldPath,szNewPath)) {
information("TEXTフォルダの内容をコピーしました。");
} else {
attention("TEXTフォルダの内容のコピーに失敗しました。");
}
}
if (fCopyMacro) {
if (copyMacro(szOldPath,szNewPath)) {
information("MACROフォルダの内容をコピーしました。");
} else {
attention("MACROフォルダの内容のコピーに失敗しました。");
}
copyFile(szOldPath,szNewPath,"txcmdusr.api");
copyFile(szOldPath,szNewPath,"txapiusr.api");
}
if (fConvertKey) copyFile(szOldPath,szNewPath,"wz.key");
if (fConvertMenu) {
copyFile(szOldPath,szNewPath,"wz.mnu");
// fromWZ30がメニューに存在しなければ、追加
TX* text = textopen(szNewPath + "\\wz.mnu");
if (text) {
if (!txSearchEx(text,"custmize.fromWZ30",SEARCH_NOSENSECASE)) {
txJumpFileTop(text);
if (txSearchEx(text,"[追加機能]",0)) {
txNextPara(text);
txInsertLine(text,"custmize.fromWZ30=他のWZ3.0の設定を取り込み(&3)...");
txSave(text);
}
}
textclose(text);
}
}
if (fConvertToolbar) copyFile(szOldPath,szNewPath,"wz.bar");
if (fConvertConfig) {
copyFile(szOldPath,szNewPath,"wz.cfg");
copyFile(szOldPath,szNewPath,"wzp.cfg");//3.00B1 970613
copyFile(szOldPath,szNewPath,"wzshare.cfg");
}
if (fConvertLprint) {
copyFile(szOldPath,szNewPath,"wzprint.cfg");
}
if (fCopyIniDic) {
cmd("mcopy \"" + szNewPath + "\" \"" + szOldPath + "\\*.ini");
cmd("mcopy \"" + szNewPath + "\" \"" + szOldPath + "\\*.dic");
}
} else {
information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szNewPath);
}
} else {
information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szOldPath);
}
return TRUE;
}
return FALSE;
}
BOOL TXCMDBASE textconfig(TX* text)
{
// 設定のテキスト化
//2.99D 970328 new
if (!CheckTextconfigEnable()) return FALSE;
HDIALOG hd = dialog("設定のテキスト化");
dialogSetContexthelp(hd,TRUE);
int mode = 0;
dialogControlRadioV(hd);
dialogControlHelp(hd,-434);
dialogRadioID(hd,&mode,
"現在の設定を設定テキストファイルに保存する(&W)",
"現在の設定を設定テキストファイルから読み込んで設定する(&R)",
"設定テキストファイルを開く(&O)"
);
if (dialogOpen(hd)) {
switch(mode) {
case 0: {
call("txcfgm");
break;
}
case 1: {
mchar szfilename[CCHPATHNAME];
pathFullConfig(szfilename,"txcfgset.c");
pathSetExt(szfilename,".main");
information(szfilename);
macroFork("\"" + szfilename + "\"");//2.99G 970404 ""でくくらないとロングファイル名だめ
break;
}
case 2: {
mchar szfilename[CCHPATHNAME];
pathFullConfig(szfilename,"txcfgset.c");
txOpenForkFast(text,szfilename);
break;
}
}
}
return TRUE;
}
static BOOL _createEnglishMenu(mchar* szJapaneseMenu)
{
// 英語メニューを作成します。
statprintf("英語メニュー作成中...");
TX* text = textopen(text1->szexedir + "wze.mnu");
TX* textSrc = textopen(szJapaneseMenu);
TX* textDic = textopen(text1->szexedir + "engmenu.dic");
if (text && textSrc && textDic) {
txDeleteText(text);
txstr szline;
txstr szfind;
txstr szdic;
while(1) {
txGetPara(textSrc,szline);
{
BOOL f = FALSE;
mchar* p = strchr(szline,'=');
if (p) {
txJumpFileTop(textDic);
txstrcpylen(szfind,szline,p - (mchar*)szline);
szfind += "\t";
if (txSearchEx(textDic,szfind,SEARCH_CUR)) {
txGetPara(textDic,szdic);
int lchCmd1 = strlen(szfind);
mchar* szJapanese = &szline[lchCmd1];
int chAccess = 0;
{
mchar* p = strstr(szJapanese,"(&");
if (p) chAccess = p[2];
}
mchar* szEnglish = &szdic[lchCmd1];
txInsert(text,szfind);
txDeletePrev(text);
txInsertChar(text,'=');
if (chAccess) {
mchar *p = strichr(szEnglish,chAccess);
if (p) {
mchar c = *p;
*p = 0;
txInsert(text,szEnglish);
txInsertChar(text,'&');
txInsertChar(text,c);
txInsert(text,p+1);
} else {
txInsert(text,szEnglish);
txInsertf(text,"(&%c)",chAccess);
}
} else {
txInsert(text,szEnglish);
}
if (strstr(szJapanese,"...")) {
txInsert(text,"...");
}
txInsertReturn(text);
f = TRUE;
}
}
if (!f) {
txInsert(text,szline);
txInsertReturn(text);
}
}
if (!txNextPara(textSrc)) break;
}
txSave(text);
}
textclose(textDic);
textclose(textSrc);
textclose(text);
statprintf("英語メニュー作成完了しました");
return TRUE;
}
createEnglishMenuForMaster
{
return _createEnglishMenu(text1->szexedir + "_wz.mnu");
}
BOOL TXCMDBASE createEnglishMenu(TX* text)
{
// 英語メニューを作成します。
//2.99D 970328 new
return _createEnglishMenu(text1->szexedir + "wz.mnu");
}
main
{
uiKeyList(text);return;
// key();
menu();
// toolbar();
}