home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1999 March
/
VPR9903A.BIN
/
APUPDATE
/
VC
/
Tx300d
/
TX300D.LZH
/
APIDB2.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-22
|
60KB
|
2,441 lines
// WZ EDITOR 標準機能 APIデータベース2
// Copyright 1996 TY
// 従来のapidb,cmdlistにとって替わります
//{###headline}
#define SM_EXRET 0x0001
#define SM_BT 0x0002
static BOOL headlineMatch(TX* text,int nest,mchar* szhead,SEARCHMODE searchmode)
{
int lchFind = strlen(szhead);
PARAATR paraatr;
paraatrRead(text,text->npara,¶atr);
if (paraatr.modeTitle == nest) {
txstr szstr;
txGetPara(text,szstr);
int lch = strlen(szstr);
if (lch == lchFind && !strncmp(szstr,szhead,lch)) return TRUE;
}
return FALSE;
}
static NPARA _headlineSearch(TX* text,int nest,mchar* szhead,SEARCHMODE searchmode)
{
// textのカーソル行からnestの見出しszheadを検索する
// nestより大きい見出しがあったら検索をやめて0を返す(SM_EXRETならそのnparaを返す)
// SM_BTなら、szheadより比較値が大きな見出しがあったらnparaを返す
// カーソル位置は不定
int lchFind;
if (szhead) lchFind = strlen(szhead);
if (text->editmode) {
txstr szstr;
NPARA npara;
for (npara = text->npara;;npara++) {
PARAATR paraatr;
if (!paraatrRead(text,npara,¶atr)) break;
if (paraatr.modeTitle) {
if (paraatr.modeTitle < nest) {
if (searchmode & SM_EXRET) return npara;
return 0;
}
if (paraatr.modeTitle == nest) {
txJumpNpara(text,npara);
if (szhead) {
txGetPara(text,szstr);
int lch = strlen(szstr);
if (lch == lchFind && !strncmp(szstr,szhead,lch)) return npara;
} else {
return npara;
}
}
}
}
} else {
txstr szline;
PARAATR paraatr;
txJumpParaTop(text);
while(1) {
INT lch;
int lchTop = txParaatrRead(text,¶atr,&lch);
if (paraatr.modeTitle) {
if (paraatr.modeTitle < nest) {
if (searchmode & SM_EXRET) return text->npara;
return 0;
}
if (paraatr.modeTitle == nest) {
if (szhead) {
txGetPara(text,szline);
mchar* psz = &szline[lchTop];
if (lch == -1) lch = strlen(psz);
if (searchmode & SM_BT) {
// szheadは0ターミネイトされているのでn=lchを使用
if (strncmp(psz,szhead,lch) > 0) return text->npara;
} else {
if (lch == lchFind && !strncmp(psz,szhead,lch)) return text->npara;
}
} else {
return text->npara;
}
}
}
if (!txNextPara(text)) break;
}
}
return 0;
}
static NPARA _headlineSearchPrev(TX* text,int nest,mchar* szhead,SEARCHMODE searchmode)
{
// textのカーソル行から前方方向へnestの見出しszheadを検索する
// nestより大きい見出しがあったら検索をやめて0を返す
// カーソル位置は不定
int lchFind;
if (szhead) lchFind = strlen(szhead);
if (text->editmode) {
txstr szstr;
NPARA npara;
for (npara = text->npara;npara;npara--) {
PARAATR paraatr;
if (!paraatrRead(text,npara,¶atr)) break;
if (paraatr.modeTitle) {
if (paraatr.modeTitle < nest) return 0;
if (paraatr.modeTitle == nest) {
txJumpNpara(text,npara);
if (szhead) {
txGetPara(text,szstr);
int lch = strlen(szstr);
if (lch == lchFind && !strncmp(szstr,szhead,lch)) return npara;
} else {
return npara;
}
}
}
}
} else {
txstr szline;
PARAATR paraatr;
txJumpParaTop(text);
while(1) {
INT lch;
int lchTop = txParaatrRead(text,¶atr,&lch);
if (paraatr.modeTitle) {
if (paraatr.modeTitle < nest) return 0;
if (paraatr.modeTitle == nest) {
if (szhead) {
txGetPara(text,szline);
mchar* psz = &szline[lchTop];
if (lch == -1) lch = strlen(psz);
if (lch == lchFind && !strncmp(psz,szhead,lch)) return text->npara;
} else {
return text->npara;
}
}
}
if (!txPrevPara(text)) break;
}
}
return 0;
}
NPARA TXAPI headlineSearchTop(TX* text,int nest)
{
// カーソル位置からnestの見出しの頭を検索してnparaを返す。カーソル位置をnparaにセット
// 見つからなければ0を返す。カーソル位置は保存する
NPARA npara0 = text->npara;
NPARA npara;
if (nest == 1) {
txJumpFileTop(text);
npara = _headlineSearch(text,1,NULL,0);
} else {
npara = _headlineSearchPrev(text,nest-1,NULL,0);
if (npara) {
txJumpNpara(text,npara);
if (txNextPara(text)) {
npara = _headlineSearch(text,nest,NULL,0);
} else {
npara = 0;
}
} else {
npara = _headlineSearch(text,nest,NULL,0);
}
}
if (npara) {
txJumpNpara(text,npara);
return npara;
}
txJumpNpara(text,npara0);
return 0;
}
NPARA TXAPI headlineSearch(TX* text,int nest,mchar* szhead,SEARCHMODE searchmode)
{
// textのnest見出しの先頭の見出しから前方方向へnestの見出しszheadを検索する
// 見出しがみつかったら、カーソルをセットし、見出しのnparaを返す
// nestより大きい見出しがあったら検索をやめる
// みつからなかったらカーソルを検索前のnparaの論理行頭にセットして0を返す
NPARA npara0 = text->npara;
headlineSearchTop(text,nest);
NPARA npara = _headlineSearch(text,nest,szhead,searchmode);
if (npara) {
return npara;
} else {
txJumpNpara(text,npara0);
return 0;
}
}
BOOL TXAPI headlineDel(TX* text)
{
// カーソル行の見出しとその内容を削除
// 削除した場合はカーソルを、以前の位置の前行に設定
NPARA npara = text->npara;
PARAATR paraatr;
INT lch;
txParaatrRead(text,¶atr,&lch);
if (paraatr.modeTitle) {
if (!txNextPara(text)) return FALSE;
NPARA npara1 = _headlineSearch(text,paraatr.modeTitle,NULL,SM_EXRET);
txJumpNpara(text,npara);
txSelectEx(text,CLIP_CHAR);
if (npara1) {
txJumpNpara(text,npara1);
} else {
txJumpFileEnd(text);
}
txSelectDelete(text);
txPrevPara(text);
return TRUE;
}
return FALSE;
}
BOOL TXAPI headlineDelContents(TX* text)
{
// カーソル行の見出しの内容を削除
// 子見出しは削除しない
// カーソル位置は見出しの先頭に設定
NPARA npara = text->npara;
PARAATR paraatr;
txParaatrRead(text,¶atr,NULL);
if (paraatr.modeTitle) {
if (txNextPara(text)) {
while(1) {
txParaatrRead(text,¶atr,NULL);
if (paraatr.modeTitle) break;
if (!txNextPara(text)) break;
}
txSelectEx(text,CLIP_CHAR);
txJumpNpara(text,npara + 1);
txSelectDelete(text);
}
txJumpNpara(text,npara);
return TRUE;
}
return FALSE;
}
BOOL TXAPI headlineInsert(TX* text,int nest,mchar* szhead)
{
// カーソル行に見出しを挿入
// カーソルは見出し行の論理行頭へ
txJumpParaTop(text);
txInsertReturn(text);
txPrevPara(text);
txInsert(text,szhead);
PARAATR paraatr;
txParaatrRead(text,¶atr,NULL);
paraatr.modeTitle = nest;
txParaatrWrite(text,¶atr);
txJumpParaTop(text);
return TRUE;
}
static void txAddPara(TX* text)
{
// 現在の見出しの次行に行を挿入し、カーソルをその行頭に設定する
// カーソルが常に現在の見出しの中にいるようにするため
txJumpParaEnd(text);
txInsertReturn(text);
}
//{###APIデータベース}
//現在使える全てのWZ EditorのコマンドとAPIを管理します。
#include <windows.h>
#include <windowsx.h>
#include "_filer.h"
extern "custmize" DWORD TXAPI txmenuPickup(DWORD dst,int mode,mchar* szarg);
#define PICKUP_MENUAPIDB2 6
void TXAPI apidb2FlushCache(void);
#define MYDEBUG 0
#define IDB_DEBUG IDB_API
static void textCmdselTerm(void);
// TXCMD txcmd.api
// TXCMDBASE txcmdbas.api
// TXAPI txapi.api
// TXAPIBASE txapibas.api
#export
#define IDB_CMD 0
#define IDB_CMDBASE 1
#define IDB_API 2
#define IDB_APIBASE 3
#define IDB_NSYSTEM 4 // システムコマンド/API
#define IDB_CMDUSER 4 // ユーザが登録したコマンド
#define IDB_APIUSER 5 // ユーザが登録したAPI
#define IDB_N 6
#define IDB_CMDDEFAULT 100 // IDB_CMD or IDB_CMDBASE ユーザ選択値を保持
#define IDB_APIDEFAULT 101 // IDB_API or IDB_APIBASE ユーザ選択値を保持
#endexport
#define IDB_ISBASE(idb) ((idb) == IDB_CMDBASE || (idb) == IDB_APIBASE)
#define IDB_ISCMD(idb) ((idb) == IDB_CMDBASE || (idb) == IDB_CMD || (idb) == IDB_CMDDEFAULT)
static mchar* _szCategoryMenu = "メニュー";
typedef struct {
TX* text;
TX bodytext;
BOOL fWrite;
} APIDBCONTEXT;
APIDBCONTEXT _context[IDB_N];
static mchar* apidb2GetFilename(int idb)
{
static mchar* tszfilename[IDB_N] = {
"txcmd.api","txcmd.api","txapi.api","txapi.api","txcmdusr.api","txapiusr.api",
};
return tszfilename[idb];
}
static void apidb2SetConfig(TX* text)
{
strcpy(text->tsztitle[0],".###");
strcpy(text->tsztitle[1],".##");
strcpy(text->tsztitle[2],".#");
strcpy(text->tszformat[SZFORMAT_TITLE4],"");
strcpy(text->tszformat[SZFORMAT_TITLE5],"");
strcpy(text->tszformat[SZFORMAT_TITLE6],"");
strcpy(text->tszformat[SZFORMAT_TAB],"");//3.00B1 970519 _dialogListとdialogListのAPIヘルプが同じになっていた
}
static apidb2SearchCategory(TX* db,mchar* szapi);
static void merge(TX* db,TX* text,NPARA nparaTop)
{
NPARA nparaEnd = text->npara;
txJumpNpara(text,nparaTop);
PARAATR paraatr;
INT lch;
int lchTop = txParaatrRead(text,¶atr,&lch);
txstr szline;
txGetPara(text,szline);
mchar* psz = &szline[lchTop];
if (lch == -1) lch = strlen(psz);
txstr sztitle;
txstrcpylen(sztitle,psz,lch);
//information(sztitle);
if (apidb2SearchCategory(db,sztitle)) {
txNextPara(db);
nparaTop++;
} else {
txJumpFileEnd(db);
}
txJumpNpara(text,nparaTop);
txSelectEx(text,CLIP_CHAR);
txJumpNpara(text,nparaEnd);
#if 1//3.00A2 970506 [機能一覧]を開くと、クリップボードの内容が変化した
txPrivatePush(text);
txPrivatePopJump(db);
#else
txSelectCopy(text);
txPaste(db);
#endif
}
static TX* _apidb2Open(int idb,BOOL fWrite)
{
APIDBCONTEXT* context = &_context[idb];
if (context->text) {
return context->text;
}
//
context->fWrite = fWrite;
//
TX* text = context->text = &context->bodytext;
txInitText(text);
txSetFileName(text,text->szexedir + apidb2GetFilename(idb));
apidb2SetConfig(text);
txOpenText(text);
// if (!fWrite) txSetHigh(text);//無理
//
if (text && !fWrite) {
// ユーザAPIDBのマージ
int idbUser = idb;
TX *db = text;
if (idb == IDB_CMD || idb == IDB_CMDBASE) {
idbUser = IDB_CMDUSER;
} else if (idb == IDB_API || idb == IDB_APIBASE) {
idbUser = IDB_APIUSER;
} else {
idbUser = -1;
}
if (idbUser != -1) {
TX textBody;
TX* text = &textBody;
txInitText(text);
txSetFileName(text,text->szexedir + apidb2GetFilename(idbUser));
apidb2SetConfig(text);
if (txOpenText(text)) {
// txSetHigh(text);//無理
NPARA npara0 = 0;
txJumpFileTop(text);
while(1) {
PARAATR paraatr;
INT lch;
int lchTop = txParaatrRead(text,¶atr,&lch);
if (paraatr.modeTitle == 1) {
NPARA npara = text->npara;
if (npara0) {
merge(db,text,npara0);
}
npara0 = npara;
}
if (!txNextPara(text)) {
if (npara0) {
merge(db,text,npara0);
}
break;
}
}
txClose(text);
}
// dialogaText(db,"aa");
}
if (IDB_ISCMD(idb)) {
// menu
txJumpFileEnd(text);
txAddPara(text);
headlineInsert(text,1,_szCategoryMenu);
txAddPara(text);
txmenuPickup((DWORD)text,PICKUP_MENUAPIDB2,NULL);
//dialogaText(text,"aa");
}
}
if (fWrite) {
// キャッシュをフラッシュ
textCmdselTerm();
}
return text;
}
static TX* apidb2Open(int idb)
{
return _apidb2Open(idb,FALSE);
}
static TX* apidb2OpenWrite(int idb)
{
return _apidb2Open(idb,TRUE);
}
static void apidb2Close(int idb)
{
APIDBCONTEXT* context = &_context[idb];
if (context->text) {
TX* text = context->text;
if (context->fWrite && text->fEdit) {
txSave(text);
}
txClose(text);
context->text = NULL;
}
}
static void apidb2CloseAll(void)
{
int idb;
for (idb = 0;idb < IDB_N;idb++) {
apidb2Close(idb);
}
}
static TX* apidb2GetText(int idb)
{
APIDBCONTEXT* context = &_context[idb];
TX* db = context->text;
if (db) return db;
return apidb2Open(idb);
}
static NPARA apidb2SearchApi(TX* db,mchar* szapi)
{
return headlineSearch(db,2,szapi,0);
}
static BOOL apidb2DelApi(TX* db,mchar* szapi)
{
// szapiの登録データを削除する
// szapiのデータが見つからなかったら、カーソル行は変更せず、論理行頭へジャンプ
// 見つかったら、その位置に移動
// szapiには、名前だけを指定
if (apidb2SearchApi(db,szapi)) {
return headlineDel(db);
}
return FALSE;
}
BOOL TXAPI apidb2AddApi(TX* db,mchar* szapi)
{
// szapiを挿入
// szapiがすでにあれば削除して挿入
// カーソルは挿入行に設定
if (apidb2SearchApi(db,szapi)) {
headlineDel(db);
}
if (!headlineSearchTop(db,2)) {
txNextPara(db);
} else {
// ソートして挿入
#if 01
NPARA npara = _headlineSearch(db,2,szapi,SM_BT|SM_EXRET);
if (npara) {
txJumpNpara(db,npara);
} else {
txJumpFileEnd(db);
}
#endif
}
return headlineInsert(db,2,szapi);
}
static apidb2SearchCategory(TX* db,mchar* szapi)
{
return headlineSearch(db,1,szapi,0);
}
static apidb2DelCategory(TX* db,mchar* szapi)
{
if (apidb2SearchCategory(db,szapi)) {
return headlineDel(db);
}
return FALSE;
}
static BOOL apidb2AddCategory(TX* db,mchar* szcategory)
{
if (!apidb2SearchCategory(db,szcategory)) {
if (!headlineSearchTop(db,1)) {
txJumpFileEnd(db);
} else {
// ソートして挿入
#if 01
NPARA npara = _headlineSearch(db,1,szcategory,SM_BT|SM_EXRET);
if (npara) {
txJumpNpara(db,npara);
} else {
txJumpFileEnd(db);
}
#endif
}
return headlineInsert(db,1,szcategory);
}
return TRUE;
}
// キー定義サポート
#define KEY_MS 0
#define KEY_VZ 1
#define KEY_MI 2
#define KEY_VZ98 3
#define KEY_EMACS 4 //2.99 970313
#define KEY_N 5
static TX _bodytxkey[KEY_N];
static TX *_txkey[KEY_N];
static void keyInsert(int ikey,mchar* szapi,mchar *p)
{
if (_txkey[ikey]) {
mchar *szkey = strchr(p,'}'); //"{#MS}"etcをスキップ
if (szkey) {
szkey++;
szkey = strGetWordTop(szkey);
if (*szkey) {
txInsertf(_txkey[ikey],"%s=%s\n",szapi,szkey);
}
}
}
}
static BOOL ___apidb2TakeinText(int idb,TX* text)
{
TX* db = apidb2GetText(idb);
mchar szapi[CCHWORD] = {0};
BOOL fBase = FALSE;
BOOL fBaseApi = FALSE;//3.00B1 970520
txstr szbuff(CCHLINE);
BOOL fEvalApi = FALSE;
BOOL fFunctionDesc = FALSE;
BOOL fCategoryDesc = FALSE;
BOOL fCmd = (idb == IDB_CMD || idb == IDB_CMDBASE);
txJumpFileTop(text);
while(1) {
txGetPara(text,szbuff);
mchar *p = szbuff;
p = strGetWordTop(p);
if (*p) {
if (*p == '/' && p[1] == '/') {
p += 2;
p = strGetWordTop(p);
if (*p == '{') {
if (strmatch(p,"{#API}")) {
fEvalApi = TRUE;
} else if (strmatch(p,"{###")) {
p += 4;
mchar *pend = strchr(p,'}');
if (!pend) pend = p + strlen(p);
mchar szcategory[CCHLINE];
strcpylenmax(szcategory,p,pend - p,CCHLINE);
if (!apidb2SearchCategory(db,szcategory)) {
apidb2AddCategory(db,szcategory);
}
fCategoryDesc = TRUE;
} else if (strmatch(p,"{#ENDAPI}")) {
fEvalApi = FALSE;
} else if (fEvalApi) {
if (fCmd) {//2.96 970210 wz.keyにキーが2重に登録された
if (strmatch(p,"{#MS}")) {
keyInsert(KEY_MS,szapi,p);
} else if (strmatch(p,"{#VZ}")) {
keyInsert(KEY_VZ,szapi,p);
keyInsert(KEY_VZ98,szapi,p);
} else if (strmatch(p,"{#VZIBM}")) {
keyInsert(KEY_VZ,szapi,p);
} else if (strmatch(p,"{#VZ98}")) {
keyInsert(KEY_VZ98,szapi,p);
} else if (strmatch(p,"{#MI}")) {
keyInsert(KEY_MI,szapi,p);
} else if (strmatch(p,"{#EMACS}")) {//2.99 970313
keyInsert(KEY_EMACS,szapi,p);
}
}
if (strmatch(p,"{#@}")) {
// locateを取得
txstr sz = p + 4;
sz += ".";
sz += szapi;
strcpymax(szapi,sz,cchof(szapi));
} else if (strmatch(p,"{$")) {
// {$...} setup指令は書き出さない
} else {
if (fCategoryDesc || fFunctionDesc) {
BOOL f = TRUE;
if (strmatch(p,"{#RET}")) {
if (fCmd) f = FALSE;
}
if (*p && f) {
txAddPara(db);
txInsert(db,p);
}
}
}
}
} else {
if (fCategoryDesc == 1) {
fCategoryDesc = 2;
// 古い概要の説明を削除
headlineDelContents(db);
if (*p) {
txAddPara(db);
txInsert(db,p);
}
} else if (fCategoryDesc == 2) {
if (*p) {
txAddPara(db);
txInsert(db,p);
}
} else if (fFunctionDesc == 1) {
fFunctionDesc = 2;
if (idb == IDB_APIUSER || idb == IDB_CMDUSER) {
//2.95 970131 追加機能はBASEとする
fBase = TRUE;
fBaseApi = TRUE;
}
switch (idb) {
case IDB_CMD:
case IDB_CMDBASE:
case IDB_CMDUSER: {
txstr sz = p;
sz += "(Cmd:";
sz += szapi;
sz += ")";
apidb2AddApi(db,sz);
//
#if 1
if (fBase) {
txAddPara(db);
txInsert(db,"{#BASE}");
}
#else
txAddPara(db);
txInsert(db,"{#CMD}");
txInsert(db,szapi);
#endif
txAddPara(db);
txInsert(db,"{#FUNC}");
if (*p) txInsert(db,p);
break;
}
case IDB_API:
case IDB_APIBASE:
case IDB_APIUSER: {
txAddPara(db);
if (fBaseApi) {//3.00B1 970519
txInsert(db,"{#BASE}");
txAddPara(db);
}
#if 1//3.00A2 970506 APIDBに#include情報が欠落していた
{
mchar* p = strchr(szapi,'.');
if (p) {
txInsert(db,"{#@}");
txInsertBuff(db,szapi,p - szapi);
txAddPara(db);
}
}
#endif
txInsert(db,"{#FUNC}");
if (*p) txInsert(db,p);
break;
}
}
} else if (fFunctionDesc == 2) {
if (*p) {
txAddPara(db);
txInsert(db,p);
}
}
}
} else {
fFunctionDesc = 0;
fCategoryDesc = 0;
if (fEvalApi) {
// 関数定義かどうか
BOOL fFunction = FALSE;
BOOL fTxcmdBase = FALSE;
BOOL fTxcmd = FALSE;
mchar *pPrototype = p;
fBase = FALSE;
fBaseApi = FALSE;
while(1) {
p = strGetWordTop(p);
int len = strGetWordLen(p);
if (len == 0) break;
if (strisid(p,"TXCMDBASE") || strisid(p,"_txcmdbase")) {
fTxcmd = TRUE;
fTxcmdBase = TRUE;
fBase = TRUE;
} else if (strisid(p,"TXCMD") || strisid(p,"_txcmd")) {
fTxcmd = TRUE;
} else if (strisid(p,"TXAPIBASE") || strisid(p,"_txapibase")) {//3.00B1 970519
fBaseApi = TRUE;
} else {
mchar* pc = strchr(p,'(');
if (pc && pc - p < len) { // '('の直前の単語なら...
// 関数名
strcpylenmax(szapi,p,pc - p,CCHWORD);
switch (idb) {
case IDB_CMD:
case IDB_CMDBASE:
case IDB_CMDUSER: {
if (fTxcmd) {
fFunction = TRUE;
}
break;
}
case IDB_API:
case IDB_APIBASE:
case IDB_APIUSER: {
if (strchr(szapi,'.')) {
// "."が含まれていたら、コマンド
} else {
fFunction = TRUE;
apidb2AddApi(db,szapi);
#if 0
//ここでNextParaすると
// 別カテゴリをカーソルが指すことがある
txNextPara(db);
#endif
//
txAddPara(db);
txInsert(db,pPrototype);
}
break;
}
}
break;
}
}
p += len;
}
if (fFunction) {
fFunctionDesc = TRUE;
}
}
}
} else {
fFunctionDesc = 0;
fCategoryDesc = 0;
}
if (!txNextPara(text)) break;
}
return TRUE;
}
static BOOL __apidb2TakeinText(TX* text,int idb)
{
// 書き込みオープンするために、Closeする
apidb2Close(idb);
TX* db = apidb2OpenWrite(idb);
BOOL ret = ___apidb2TakeinText(idb,text);
// 保存を行うために、Closeする
apidb2Close(idb);
return ret;
}
static BOOL _apidb2TakeinText(TX* text,BOOL fSystem)
{
// textのテキストファイルのコマンド/API情報をAPIDBに追加します。
// 既に情報がAPIDBにあれば上書きします。
//1.94 で追加
#if MYDEBUG
return __apidb2TakeinText(text,IDB_DEBUG);
#else
if (fSystem) { // システムコマンド
__apidb2TakeinText(text,IDB_CMD);
__apidb2TakeinText(text,IDB_API);
} else {
__apidb2TakeinText(text,IDB_CMDUSER);
__apidb2TakeinText(text,IDB_APIUSER);
}
return TRUE;
#endif
}
BOOL TXAPI apidb2TakeinText(tx* text)
{
return _apidb2TakeinText(text,FALSE);
}
static BOOL _apidb2TakeinFile(mchar *szfilename,BOOL fSystem)
{
// szfilenameのテキストファイルのコマンド/API情報をAPIDBに追加します。
// 既に情報がAPIDBにあれば上書きします。
TX body;
TX *text = &body;
txInitText(text);
txSetFileName(text,szfilename);
//printf("%s\n",szfilename);
text->width = MAXWIDTH;
txOpenText(text);
_apidb2TakeinText(text,fSystem);
txClose(text);
return TRUE;
}
BOOL TXAPI apidb2TakeinFile(mchar *szfilename)
{
// szfilenameのテキストファイルのコマンド/API情報をユーザAPIDBに追加します。
// 既に情報がAPIDBにあれば上書きします。
return _apidb2TakeinFile(szfilename,FALSE);
}
BOOL TXAPI apidb2TakeinFileSystem(mchar *szfilename)
{
// szfilenameのテキストファイルのコマンド/API情報をシステムAPIDBに追加します。
// 既に情報がAPIDBにあれば上書きします。
return _apidb2TakeinFile(szfilename,TRUE);
}
static void _pickfiles(mchar *szpath)
{
#ifdef __FLAT__
WIN32_FIND_DATA ffd;
HANDLE hfind;
#else
FILEFIND filefind;
#endif
mchar szfilename[CCHPATHNAME] = {0};
mchar szwk[CCHPATHNAME];
//
strcpy(szfilename,szpath);
#ifdef __FLAT__
hfind = FindFirstFile(szpath,&ffd);
if (hfind != INVALID_HANDLE_VALUE)
#else
if (!fileFindFirst(szpath,FA_NORMAL,&filefind))
#endif
{
#if TEST
int n = 10;
#endif
do {
#ifdef __FLAT__
pathSetFileName(szfilename,ffd.cFileName);
#else
pathSetFileName(szfilename,filefind.name);
#endif
if (pathEquFileName(szfilename,"dat")) continue;//1.00C dat.tllはAPIDBに含めない
if (pathEquFileName(szfilename,"term")) continue;//1.00C term.txeはAPIDBに含めない
if (pathEquFileName(szfilename,"comm")) continue;//2.00B
if (pathEquFileName(szfilename,"wzup")) continue;//3.00A6 970511
#if 0//3.00A2 970504
if (pathEquFileName(szfilename,"speak")) continue;//2.00B
#endif
if (!strnicmp(pathGetFileName(szfilename),"test",4)) continue;//1.00F3 "test*"はAPIDBに含めない
if (pathIsExt(szfilename,".txh")) {
// 無条件に実行
} else {
// 既に.txhが存在したら実行しない
strcpy(szwk,szfilename);
pathSetExt(szwk,".txh");
if (fileIsExist(szwk)) continue;
if (pathIsExt(szfilename,".h")) {
// OK
if (!stricmp(pathGetFileName(szfilename),"_text.h")) {
// _text.hは既に実行済み
continue;
}
} else {
// .txm .txe .tll
// 既に.hが存在したら見ない
pathSetExt(szwk,".h");
if (fileIsExist(szwk)) continue;
{
DWORD size;
LPVOID pmem = macroGetExport(szfilename,&size);
if (pmem) {
GetTempFileName(0,"WZ",0,szwk);
HFILE hf = _lcreat(szwk,0);
if (hf == HFILE_ERROR) {
attention("ファイル %s が作成できません",szwk);
} else {
_hwrite(hf,pmem,size);
_lclose(hf);
}
memFree(pmem);
apidb2TakeinFileSystem(szwk);
fileDelete(szwk);
}
continue;
}
}
}
apidb2TakeinFileSystem(szfilename);
#if TEST
if (n-- == 0) {
break;
}
#endif
}
#ifdef __FLAT__
while(FindNextFile(hfind,&ffd));
FindClose(hfind);
#else
while (!fileFindNext(&filefind));
#endif
}
}
static void pickfiles(mchar *_szpath)
{
mchar szpath[CCHPATHNAME] = {0};
pathSetFileName(szpath,_szpath);
_pickfiles(szpath);
}
static void apidb2DelAll(void)
{
int idb;
for (idb = 0;idb < IDB_N;idb++) {
apidb2Close(idb);
TX* db = apidb2OpenWrite(idb);
txDeleteText(db);
txInsertLine(db,"<TX>");
txInsertLine(db,"TX-APIDB 3.00");
apidb2Close(idb);
}
}
BOOL TXAPI apidb2Flush(void)
{
// txpathの *.H をパス検索して、{#API}-{#ENDAPI}を抜き出して
// データベースを構築する
apidb2DelAll();
mchar *p = wzGetEnv(WZENV_TXPATH);//1.00F
// まず、_text.hを変換
apidb2TakeinFileSystem(text->szexedir + \"\std\_text.h");
//
while(1) {
mchar *next = strchrs(p,"; ");
if (!next) break;
if (next > p) {
mchar szpath[CCHPATHNAME];
strcpylen(szpath,p,next - p);
if (!stricmp(szpath,"wz:\\ty")) {
//2.96 970210 "wz:\ty"内は無視
} else {
//printf("%s\n",szpath);
pathFormDir(szpath);
strcat(szpath,\"\*.*");
//
pathSetExt(szpath,".txh");pickfiles(szpath);
pathSetExt(szpath,".h");pickfiles(szpath);
pathSetExt(szpath,".txm");pickfiles(szpath);
pathSetExt(szpath,".txe");pickfiles(szpath);
pathSetExt(szpath,".tll");pickfiles(szpath);
}
}
p = next + 1;
}
return TRUE;
}
test
{
#if MYDEBUG
int idb = IDB_DEBUG;
apidb2Close(idb);
TX* db = apidb2OpenWrite(idb);
txDeleteText(db);
db->fEdit = TRUE;
apidb2Close(idb);
//
apidb2TakeinFileSystem(text->szexedir + "std\\edit.tll");
// apidb2TakeinFileSystem(text->szexedir + "test.c");
// apidb2TakeinFileSystem(text->szexedir + "std\\_text.h");
// apidb2Flush();
//
txOpenFast(text,text->szexedir + apidb2GetFilename(idb));
return;
#else
apidb2Flush();
#endif
for (int idb = 0;idb < IDB_N;idb++) {
apidb2Close(idb);
}
txOpenFast(text,text->szexedir + "txcmd.api");
}
//##remake apidb & key file
//2.99G 970405 MS.KEY function disp修正
static mchar **getfkey(int ikey,int ifkkind)
{
static mchar *_fkms[] = {
"ヘルプ","ヘルプ2","下検索","支援","ジャンプ","窓選択","","選択","","メニューバー","","保存",NULL,
};
static mchar *_fkms_shift[] = {
"機能","","上検索","補完","戻る","窓切替","","選択戻","","メニュー","","",NULL,
};
static mchar *_fkms_ctrl[] = {
"ヘルプ1","ヘルプ2","","","マーク","次の窓","","","","","","開く",NULL,
};
static mchar *_fkms_shiftctrl[] = { //2.99G 970405 NEW
"","","","補完戻","","前の窓","","","","","","印刷",NULL,
};
static mchar *_fkvz[] = {
"ファイル","窓換","文換","窓割","記憶","検索","置換","カット","インサート","ブロック","ページ","ヘルプ",NULL,
};
static mchar *_fkvz_shift[] = {
"設定","","比較","","複写","マルチ","複写2","コピー","ペースト"," タグ","","",NULL,
};
static mchar *_fk_null[] = {
"",NULL,//1個は""が必要
};
static mchar *_fkmi[] = {
"ファイル","切換","移動","窓割","検索↓","行選択","カット","コピー","ペースト","タグ",NULL,
};
static mchar *_fkmi_shift[] = {
"設定","","検索","","検索↑","選択","","","字ペースト","行2重",NULL,
};
static mchar *_fkmi_ctrl[] = {
"","","","","","箱選択","","","","",NULL,
};
static mchar **tfk[KEY_N][FKEY_NKIND] = {
_fkms,_fkms_shift,_fkms_ctrl,_fkms_shiftctrl,
_fkvz,_fkvz_shift,_fk_null ,_fk_null,
_fkmi,_fkmi_shift,_fkmi_ctrl,_fk_null,
_fkvz,_fkvz_shift,_fk_null ,_fk_null,
_fkvz,_fkvz_shift,_fk_null ,_fk_null,//2.99 970313
};
return tfk[ikey][ifkkind];
}
static void deleteCategory(TX* text,mchar* szCategory)
{
txSetUndispEx(text);
{
txJumpFileTop(text);
if (txSearchEx(text,szCategory,SEARCH_PARATOP|SEARCH_NOSENSECASE)) {
txSelect(text);
if (!txSearchEx(text,"[",SEARCH_PARATOP)) {
txJumpFileEnd(text);
}
txSelectDelete(text);
}
}
txSetDispEx(text);
}
//1.99K
// wz.keyから[TY]のキー定義を削除したものを_wz.keyに作成。
static void _wzkey(void)
{
TX body;
TX* text = &body;
txInit(text,text1->szexedir + "wz.key");
deleteCategory(text,"[TY]");
txSaveTo(text,text->szexedir + "_wz.key");
txReopenInternal(text);
txClose(text);
}
//2.00E4 wz.keyから[TYツール]の定義を削除したものを_wz.mnuに作成。
static void _wzmnu(void)
{
TX body;
TX* text = &body;
txInit(text,text1->szexedir + "wz.mnu");
deleteCategory(text,"[TYツール]");
txSaveTo(text,text->szexedir + "_wz.mnu");
txReopenInternal(text);
txClose(text);
}
apidb2Remake
{
static mchar *tszkey[KEY_N] = {
"Windows準拠","VZ(DOS/V版)準拠","MIFESライク","VZ(98版)準拠","Emacsライク",
};
int i;
for (i = 0;i < KEY_N;i++) {
_txkey[i] = &_bodytxkey[i];
txInitText(_txkey[i]);
txOpenText(_txkey[i]);
txInsertf(_txkey[i],"[%s]\n",tszkey[i]);
}
apidb2Flush();
{
for (i = 0;i < KEY_N;i++) {
txmenuOp(TXKEYOP_DEL,tszkey[i],NULL);
}
TX* txkey = (TX*)txmenuOp(TXKEYOP_OPEN,NULL,NULL);
for (i = 0;i < KEY_N;i++) {
{
static mchar* tszcaption[FKEY_NKIND] = {
"","+SHIFT","+CTRL","+SHIFT+CTRL",
};
int ikind;
for (ikind = 0;ikind < FKEY_NKIND;ikind++) {
mchar **fkey = getfkey(i,ikind);
txInsertf(_txkey[i],"FKEY%s=",tszcaption[ikind]);
mchar *szkey;
int ifkey;
for (ifkey = 0;szkey = fkey[ifkey];ifkey++) {
txInsertf(_txkey[i],"\"%s\" ",szkey);
}
txInsert(_txkey[i],"\n");
}
}
//
txInsertText(txkey,_txkey[i]);
//
txClose(_txkey[i]);
_txkey[i] = NULL;
}
txmenuOp(TXKEYOP_CLOSE,NULL,NULL);
_wzkey();//1.99K
_wzmnu();//2.00E4
}
}
//{###コマンド選択
#include "dialog.h"
#include "search.txh"
#ifdef __FLAT__
#pragma multidef+
extern "comctl32.dll" {
#include "c:\msvc40\include\commctrl.h"
}
#pragma multidef-
#endif
#define IDD_CONTEXTMENU 19980 //2.99G 970405 1000だとIDD_EXECと重なって変だったので、他と重ならない値に変更した
#export
#define IDD_CMDSEL_CONTEXTMENU 19989 //2.99A 970321
#define IDD_CMDSEL_CATEGORY 19990
#define IDD_CMDSEL_LIST 19991
#define IDD_CMDSEL_EXPLAIN 19992
#define IDD_CMDSEL_SEARCH 19993 //2.00E4
#define IDD_CMDSEL_SEARCHNEXT 19994 //2.00E4
#define IDD_CMDSEL_TREELIST 19995 //2.90
#define IDD_CMDSEL_KEYLIST 19996 //2.90
#define IDD_CMDSEL_DISPALL 19997 //2.90
#define IDD_CMDSEL_DISPBASE 19998 //2.90
#define IDD_CMDSEL_DISPCATEGORY 19999 //2.90
#define CS_SETSZCMD (WM_TXUSER + 0)
#define CSN_SETSZCMD (WM_TXUSER + 1)
#define CMDSEL_HOOK \
static PMACROFUNC pfunc;\
if (pfunc.address == 0) {\
macroGetFuncAddress("apidb2.dlgprocCmdsel",&pfunc);\
}\
if (pfunc.address) {\
macroCallAddress(&pfunc,NULL,4,(long)hwnd,(long)message,(long)wParam,(long)lParam);\
}
#endexport
static IFILE _adrSearch;//次に検索開始するアドレス
static DWORD _searchmode;
static txstr _txstrSearch;
static txstr _szapi;//前回見つけたCMD
__new
{
_searchmode = text->searchmode;
}
static void apidb2GetExplain(int idb,TX* text)
{
TX* db = apidb2GetText(idb);
txstr szline;
PARAATR paraatr;
txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle == 2) {
#if 1//3.00A2 970506
BOOL fDesc = (idb == IDB_API || idb == IDB_APIBASE);
BOOL fInclude = FALSE;
BOOL fSkip = FALSE;
txNextPara(db);
while(1) {
txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle) break;
txGetPara(db,szline);
//
int len = 0;
if (len = strmatch(szline,"{#FUNC}")) {
fDesc = TRUE;
} else if (len = strmatch(szline,"{#RET}")) {
if (fDesc) txInsert(text,"<返り値> ");
} else if (len = strmatch(szline,"{#EX}")) {
if (fDesc) txInsert(text,"<例> ");
} else if (
strmatch(szline,"{#MS}") ||
strmatch(szline,"{#VZ}") ||
strmatch(szline,"{#VZ98}") ||
strmatch(szline,"{#VZIBM}") ||
strmatch(szline,"{#MI}") ||
strmatch(szline,"{#EMACS}")
) {
//3.00B1 970522
fSkip = TRUE;
} else if (len = strmatch(szline,"{#BASE}")) {
fSkip = TRUE;//3.00B1 970520
} else if (len = strmatch(szline,"{#@}")) {
if (fDesc) {
mchar* p = &szline[len];
if (
!stricmp(p,"std") ||
!stricmp(p,"dialoga") ||
!stricmp(p,"window") ||
!stricmp(p,"stdlib") ||
!stricmp(p,"cmd") ||
!stricmp(p,"file") ||
!stricmp(p,"help") ||
!stricmp(p,"system") ||
!stricmp(p,"macro")
) {
// "_text.h"で#includeしてるので#includeする必要がない
fSkip = TRUE;
} else {
txInsert(text,"#include \"");
fInclude = TRUE;
}
}
}
if (fSkip) {
fSkip = FALSE;
} else {
if (fDesc) {
txInsert(text,&szline[len]);
if (fInclude) {
txInsert(text,".h\"");
fInclude = FALSE;
}
txInsertReturn(text);
}
}
if (!txNextPara(db)) break;
}
#else
int fDesc = 0;
txNextPara(db);
while(1) {
txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle) break;
txGetPara(db,szline);
if (fDesc || (idb == IDB_API || idb == IDB_APIBASE)) {
txInsert(text,szline);
txInsertReturn(text);
} else {
int len;
if (len = strmatch(szline,"{#FUNC}")) {
fDesc = TRUE;
txInsert(text,&szline[len]);
txInsertReturn(text);
}
}
if (!txNextPara(db)) break;
}
#endif
} else {
txNextPara(db);
while(1) {
txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle) break;
txGetPara(db,szline);
txInsert(text,szline);
txInsertReturn(text);
if (!txNextPara(db)) break;
}
}
}
// カーソル位置のコマンド名/API名を返す
static BOOL apidb2GetCmd(int idb,txstr szcmd)
{
TX* db = apidb2GetText(idb);
PARAATR paraatr;
INT lch;
int lchTop = txParaatrRead(db,¶atr,&lch);
if (paraatr.modeTitle) {
txstr szline;
txGetPara(db,szline);
mchar* p = &szline[lchTop];
if (lch == -1) lch = strlen(p);
if (idb == IDB_CMD || idb == IDB_CMDBASE) {
mchar* ptop = strstr(p,"(Cmd:");
if (ptop) {
ptop += 5;
} else {
ptop = p;
}
int len = strlen(ptop);
if (len && ptop[len-1] == ')') len--;
txstrcpylen(szcmd,ptop,len);
return TRUE;
} else {
szcmd = p;
return TRUE;
}
}
return FALSE;
}
// カーソル行のコマンドが基本コマンドかどうか返す
// カーソルがコマンドの見出しにあること
#if 1//3.00B1 970520
static BOOL IsCmdBase(TX* db,int idb)
{
BOOL ret = FALSE;
if (IDB_ISCMD(idb)) {
if (txNextPara(db)) {
if (txCmpCur(db,"{#BASE}")) ret = TRUE;
txPrevPara(db);
}
} else {
if (txNextPara(db)) {
if (txNextPara(db)) {
if (txCmpCur(db,"{#BASE}")) ret = TRUE;
txPrevPara(db);
}
txPrevPara(db);
}
}
return ret;
}
#else
static BOOL IsCmdBase(TX* db)
{
if (txNextPara(db)) {
BOOL ret = TRUE;
txstr szline;
txGetPara(db,szline);
if (!strstr(szline,"{#BASE}")) ret = FALSE;
txPrevPara(db);
return ret;
}
return FALSE;
}
#endif
// szcmdのコマンド名/API名を検索し、nparaを返す
static NPARA apidb2SearchCmd(int idb,mchar* szcmd,SEARCHMODE searchmode)
{
PARAATR paraatr;
TX* db = apidb2GetText(idb);
BOOL fBase = IDB_ISBASE(idb);
if (IDB_ISCMD(idb)) {
txJumpFileTop(db);
txstr sz = "(Cmd:" + szcmd + ")";
while(1) {
if (txSearchEx(db,sz,searchmode)) {
txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle == 2) {
if (!(fBase && !IsCmdBase(db,idb))) {
return db->npara;
}
}
if (!txNextPara(db)) break;
} else {
break;
}
}
return 0;
} else {
txJumpFileTop(db);
while(1) {
if (txSearchEx(db,szcmd,searchmode|SEARCH_WORD)) {
txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle == 2) {
if (!(fBase && !IsCmdBase(db,idb))) {
return db->npara;
}
}
if (!txNextPara(db)) break;
} else {
break;
}
}
return 0;
}
}
// カーソル位置が含まれるカテゴリを検索し、カテゴリのnparaを返す
static NPARA apidb2GetCategoryNpara(int idb)
{
PARAATR paraatr;
TX* db = apidb2GetText(idb);
while(1) {
txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle == 1) {
return db->npara;
}
if (!txPrevPara(db)) break;
}
return 0;
}
// カーソル位置が含まれるコマンドを検索し、コマンドのnparaを返す
static NPARA apidb2GetCmdNpara(int idb)
{
PARAATR paraatr;
TX* db = apidb2GetText(idb);
while(1) {
txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle == 2) {
return db->npara;
}
if (!txPrevPara(db)) break;
}
return 0;
}
BOOL TXAPI apidb2MakeTreetext(TX* text,int idb)
{
TX* db = apidb2GetText(idb);
txJumpFileTop(db);
txSetHigh(db);
txSetHigh(text);
txstr szline;
int nCategory = 0;
int nCmd = 0;
BOOL fBase = IDB_ISBASE(idb);
while(1) {
PARAATR paraatr;
int lchTop = txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle) {
if (paraatr.modeTitle == 1) {
nCategory++;
if (nCmd == 0) {
// コマンドが1個もないカテゴリは消す
txPrevPara(text);
txDeletePara(text);
}
nCmd = 0;
}
BOOL fOut = TRUE;
if (paraatr.modeTitle == 2) {
if (fBase) fOut = IsCmdBase(db,idb);
if (fOut) nCmd++;
}
if (fOut) {
txInsertChar(text,paraatr.modeTitle - 1 + '0');
//
txGetPara(db,szline);
mchar*pTop = &szline[lchTop];
{
mchar*p = strstr(pTop,"(Cmd:");
if (p) *p = 0;
}
txInsert(text,pTop);
txInsertChar(text,0);
txInsertf(text,"%d",db->npara);
txInsertReturn(text);
}
}
if (!txNextPara(db)) break;
}
if (nCategory && nCmd == 0) {
// コマンドが1個もないカテゴリは消す
txPrevPara(text);
txDeletePara(text);
}
txResetHigh(text);
txResetHigh(db);
//dialogaText(text,"MakeTreetext");
return TRUE;
}
BOOL TXAPI apidb2MakeCategorytext(TX* text,int idb)
{
TX* db = apidb2GetText(idb);
txJumpFileTop(db);
txstr szline;
int nCategory = 0;
int nCmd = 0;
BOOL fBase = IDB_ISBASE(idb);
while(1) {
PARAATR paraatr;
int lchTop = txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle) {
if (paraatr.modeTitle == 1) {
nCategory++;
if (nCmd == 0) {
// コマンドが1個もないカテゴリは消す
txPrevPara(text);
txDeletePara(text);
}
nCmd = 0;
//
txGetPara(db,szline);
mchar*pTop = &szline[lchTop];
txInsert(text,pTop);
txInsertChar(text,0);
txInsertf(text,"%d",db->npara);
txInsertReturn(text);
} else if (paraatr.modeTitle == 2) {
if (fBase && !IsCmdBase(db,idb)) {
} else {
nCmd++;
}
}
}
if (!txNextPara(db)) break;
}
if (nCategory && nCmd == 0) {
// コマンドが1個もないカテゴリは消す
txPrevPara(text);
txDeletePara(text);
}
return TRUE;
}
// カーソルはカテゴリ行にあること
BOOL TXAPI apidb2MakeCommandtext(TX* text,int idb)
{
TX* db = apidb2GetText(idb);
if (!txNextPara(db)) return FALSE;
txstr szline;
BOOL fBase = IDB_ISBASE(idb);
while(1) {
PARAATR paraatr;
int lchTop = txParaatrRead(db,¶atr,NULL);
if (paraatr.modeTitle == 2) {
if (fBase && !IsCmdBase(db,idb)) {
} else {
txGetPara(db,szline);
mchar*pTop = &szline[lchTop];
{
mchar*p = strstr(pTop,"(Cmd:");
if (p) *p = 0;
}
txInsert(text,pTop);
txInsertChar(text,0);
txInsertf(text,"%d",db->npara);
txInsertReturn(text);
}
} else if (paraatr.modeTitle) break;
if (!txNextPara(db)) break;
}
return TRUE;
}
#ifdef __FLAT__
static LPARAM treeviewGetParam(HWND hctrl,HTREEITEM h)
{
if (h) {
TV_ITEM tvi;
structClear(tvi);
tvi.hItem = h;
TreeView_GetItem(hctrl,&tvi);
return tvi.lParam;
}
return 0;
}
#endif
static TX _textCmdselBody[3];
static TX* _textCmdsel[3];
static int _idbCmdsel;
static int _idbCmdsel0;
permanent BOOL _fCmdBase = TRUE;
permanent BOOL _fApiBase = TRUE;
void TXAPI cmdselSetIdb(int idb)
{
// APIDBの種別を指定します
if (idb == IDB_CMDDEFAULT) {
idb = _fCmdBase ? IDB_CMDBASE : IDB_CMD;
} else if (idb == IDB_APIDEFAULT) {
idb = _fApiBase ? IDB_APIBASE : IDB_API;
}
_idbCmdsel = idb;
}
static void textCmdselTerm(void)
{
int i;
for (i = 0;i <= 2;i++) {
if (_textCmdsel[i]) {
txClose(_textCmdsel[i]);
_textCmdsel[i] = NULL;
}
}
}
static TX* textCmdselOpen(int i)
{
TX* text = _textCmdsel[i];
if (text) {
txDeleteText(text);
} else {
text = _textCmdsel[i] = &_textCmdselBody[i];
txInitText(text);
txOpenText(text);
}
return text;
}
static TX* textCmdsel(int i)
{
return _textCmdsel[i];
}
static NPARA txGetParam(TX* text,NPARA npara)
{
txJumpNpara(text,npara);
txstr szline;
int lch = txGetPara(text,szline);
mchar*p = szline;
int len = strlen(p);
//information("%d %d",len,lch);
if (len < lch) {
p += len + 1;
return atoi(p);
}
return 0;
}
static NPARA txSearchParam(TX* text,NPARA lParam)
{
NPARA ret = 0;
if (text && lParam) {
txJumpFileTop(text);
while(1) {
NPARA npara = txGetParam(text,text->npara);
if (npara == lParam) {
ret = text->npara;
break;
}
if (!txNextPara(text)) break;
}
}
return ret;
}
static void txSearchParamSet(TX* text,NPARA lParam,HWND hctrl,BOOL fListbox)
{
int isel = txSearchParam(text,lParam) - 1;
fListbox ? ListBox_SetCurSel(hctrl,isel) : ComboBox_SetCurSel(hctrl,isel);
}
static BOOL _fListboxCategory;
static BOOL _fListboxList;
static void explainPrintf(HWND hwnd,mchar* szstr,...)
{
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN);
if (hctrl) {
mchar buff[CCHLINE];
vsprintf(buff,szstr,(void*)(&szstr + 1));
SendMessage(hctrl,LB_RESETCONTENT,0,0);
SendMessage(hctrl,LB_ADDSTRING,0,buff);
}
}
static NPARA cmdselSelected(HWND hwnd,TX* textCmd,NPARA nparaCmd)
{
NPARA npara = txGetParam(textCmd,nparaCmd);
TX body;
TX* text = &body;
txInitText(text);
if (txOpenText(text)) {
txstr szcmd;
TX* db = apidb2GetText(_idbCmdsel);
txJumpNpara(db,npara);
PARAATR paraatr;
txParaatrRead(db,¶atr,NULL);
apidb2GetCmd(_idbCmdsel,szcmd);
txInsertLine(text,szcmd);
apidb2GetExplain(_idbCmdsel,text);
listboxFromText(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN),text);
//
{
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_KEYLIST);
if (hctrl) {
WZCMD wzcmd = wzcmdFromSzcmd(szcmd);
WZKEY wzkey = 0;
txDeleteText(text);
while(1) {
if (wzkey = txKeySearch(textf,wzkey,wzcmd)) {
mchar szkey[CCHKEY];
txWzkeyToSzkey(textf,wzkey,szkey);
mchar szstr[CCHWORD];
szkeyToStr(szkey,szstr);
txInsertLine(text,szstr);
} else {
break;
}
}
listboxFromText(hctrl,text);
}
}
txClose(text);
//
if (paraatr.modeTitle == 2) {// カテゴリの場合は送らない
SendMessage(hwnd,CSN_SETSZCMD,0,(mchar*)szcmd);
}
}
return npara;
}
BOOL cmdselSetSzcmd(HWND hwnd,mchar* szcmd,SEARCHMODE searchmode)
{
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_TREELIST);
BOOL ret = FALSE;
BOOL fNull = !(szcmd && *szcmd);
if (hctrl) {
#ifdef __FLAT__
NPARA npara = 0;
if (!fNull) npara = apidb2SearchCmd(_idbCmdsel,szcmd,searchmode);
if (npara) {
npara = txSearchParam(textCmdsel(0),npara);
if (npara) {
HTREEITEM h = treeviewSearchParam(hctrl,npara);
if (h) {
TreeView_SelectItem(hctrl,h);
ret = TRUE;
}
}
}
if (!ret) {
TreeView_SelectItem(hctrl,NULL);
}
#endif
} else {
NPARA npara = 0;
//statprintf(szcmd);
if (!fNull) npara = apidb2SearchCmd(_idbCmdsel,szcmd,searchmode);
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_CATEGORY);
if (hctrl) {
NPARA nparaCategory = 0;
if (npara) {
nparaCategory = apidb2GetCategoryNpara(_idbCmdsel);
if (nparaCategory) {
ret = TRUE;
}
}
//
txSearchParamSet(textCmdsel(1),nparaCategory,hctrl,_fListboxCategory);
FORWARD_WM_COMMAND(hwnd,IDD_CMDSEL_CATEGORY,hctrl,LBN_SELCHANGE,SendMessage);
//
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_LIST);
txSearchParamSet(textCmdsel(2),npara,hctrl,_fListboxList);
FORWARD_WM_COMMAND(hwnd,IDD_CMDSEL_LIST,hctrl,LBN_SELCHANGE,SendMessage);
} else {
// 「キー一覧」など、ツリー、カテゴリ、コマンドリストがない場合
TX body;
TX* text = &body;
txInitText(text);
if (txOpenText(text)) {
if (npara) {
ret = TRUE;
txInsertLine(text,szcmd);
apidb2GetExplain(_idbCmdsel,text);
listboxFromText(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN),text);
}
txClose(text);
}
}
}
if (!ret) {
if (fNull) {
explainPrintf(hwnd,"コマンドが割り当てられていません");
return FALSE;
} else {
explainPrintf(hwnd,"%sはコマンド一覧にありません",szcmd);
return FALSE;
}
}
return ret;
}
BOOL cmdselSearchNext(HWND hwnd);
BOOL cmdselSearch(HWND hwnd,mchar* szcmd,SEARCHMODE searchmode)
{
BOOL ret = FALSE;
_szapi = "";
_adrSearch = 0;
if (szcmd) {
_txstrSearch = szcmd;
_searchmode = searchmode;
}
//
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_SEARCHNEXT);
if (hctrl) {
EnableWindow(hctrl,TRUE);
cmdselSearchNext(hwnd);
}
return ret;
}
BOOL cmdselUiSearch(HWND hwnd)
{
if (txuiSearchSetForEx(text,"コマンドの検索",_txstrSearch,&_searchmode)) {
return cmdselSearch(hwnd,NULL,0);
}
return FALSE;
}
BOOL cmdselUiSearchInit(HWND hwnd,mchar* szFind,DWORD searchmode)
{
_txstrSearch = szFind;
_searchmode = searchmode;
return cmdselUiSearch(hwnd);
}
BOOL cmdselSearchNext(HWND hwnd)
{
if (_adrSearch == -1) return FALSE;
BOOL ret = TRUE;
BOOL fBase = IDB_ISBASE(_idbCmdsel);
TX* db = apidb2GetText(_idbCmdsel);
txJumpAddress(db,_adrSearch);
while(1) {
if (txSearchEx(db,_txstrSearch,_searchmode)) {
IFILE adr = txGetAddress(db);
NPARA npara = apidb2GetCmdNpara(_idbCmdsel);
if (npara) {
txstr szapi;
txstr szcategory;
txJumpNpara(db,npara);
if (fBase && !IsCmdBase(db,_idbCmdsel)) {
// 基本コマンドでなければスキップ
txJumpAddress(db,adr);
} else {
apidb2GetCmd(_idbCmdsel,szapi);
txJumpNpara(db,apidb2GetCategoryNpara(_idbCmdsel));
apidb2GetCmd(_idbCmdsel,szcategory);
if (_szapi == szapi) {
// 前回見つけたのと同じ場合はスキップ
txJumpAddress(db,adr);
} else {
//information("%s %s",_szapi,szapi);
_szapi = szapi;
// 本当にマッチしたか調べる
// TXCMDモードなのに、APIにマッチしたかもしれない
// こうゆう場合はハネる
_adrSearch = adr;
statprintf("見つかりました");
SendMessage(hwnd,CS_SETSZCMD,0,(mchar*)szapi);
ret = TRUE;
break;
}
}
}
} else {
statprintf("見つかりませんでした");
SetFocus(GetDlgItem(hwnd,IDD_CMDSEL_SEARCH));//focus windowをdisenableしないように
EnableWindow(GetDlgItem(hwnd,IDD_CMDSEL_SEARCHNEXT),FALSE);
_adrSearch = -1;
break;
}
}
return ret;
}
static void cmdselFlush(HWND hwnd)
{
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_TREELIST);
BOOL fCacheFlush = (_idbCmdsel != _idbCmdsel0);
_idbCmdsel0 = _idbCmdsel;
if (hctrl) {
// WZ3.0
TX* text = textCmdsel(0);
if (text && !fCacheFlush) {
// cached
txSetHigh(text);
treeviewFromText(hctrl,text);
txResetHigh(text);
} else {
text = textCmdselOpen(0);
if (text) {
txSetHigh(text);
apidb2MakeTreetext(text,_idbCmdsel);
treeviewFromText(hctrl,text);
txResetHigh(text);
}
}
} else {
// WZ2.0互換
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_CATEGORY);
mchar buff[CCHWORD];
GetClassName(hctrl,buff,CCHWORD);
_fListboxCategory = !stricmp(buff,"listbox");
//
TX* text = textCmdsel(1);
if (text && !fCacheFlush) {
// cached
} else {
text = textCmdselOpen(1);
if (text) {
apidb2MakeCategorytext(text,_idbCmdsel);
}
}
if (text) {
if (_fListboxCategory) {
listboxFromText(hctrl,text);
} else {
comboboxFromText(hctrl,text);
}
}
//
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_LIST);
GetClassName(hctrl,buff,CCHWORD);
_fListboxList = !stricmp(buff,"listbox");
}
}
static void contextmenu(HWND hwnd,POINT* _point)
{
HMENU hmenu = menuNew();
//
menuStr(hmenu,"検索(&F)",IDD_CMDSEL_SEARCH);
menuStr(hmenu,"次検索(&N)",IDD_CMDSEL_SEARCHNEXT);
menuSepa(hmenu);
BOOL fBase = IDB_ISBASE(_idbCmdsel);
BOOL fCmd = IDB_ISCMD(_idbCmdsel);
AppendMenu(hmenu,MF_STRING|(MF_CHECKED*!fBase),IDD_CMDSEL_DISPALL,"全て表示(&A)");
AppendMenu(hmenu,MF_STRING|(MF_CHECKED*fBase),IDD_CMDSEL_DISPBASE,"基本のみ表示(&B)");
#ifdef __FLAT__ //3.00A2 970506 API一覧の操作「分類一覧を見る」はWZ16では無効だったので、削除した
menuSepa(hmenu);
menuStr(hmenu,"分類一覧を見る(&C)",IDD_CMDSEL_DISPCATEGORY);
#endif
//
POINT point;
if (_point) {
point = *_point;
} else {
point.x = 65535;
}
if (point.x == 65535) {// by keyboard
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_TREELIST);
#ifdef __FLAT__
HTREEITEM h = TreeView_GetSelection(hctrl);
if (h) {
RECT rcItem;
TreeView_GetItemRect(hctrl,h,&rcItem,TRUE);
point.x = rcItem.right;
point.y = rcItem.bottom;
ClientToScreen(hctrl,&point);
}
#else
point.x = point.y = 0;
#endif
}
TrackPopupMenu(hmenu,TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN,point.x,point.y,0,hwnd,NULL);
menuDelete(hmenu);
}
static void cmdselFlushSel(HWND hwnd)
{
//3.00B1 970520 new
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_TREELIST);
if (hctrl) {
} else {
ListBox_SetCurSel(GetDlgItem(hwnd,IDD_CMDSEL_CATEGORY),0);
FORWARD_WM_COMMAND(hwnd,IDD_CMDSEL_CATEGORY,GetDlgItem(hwnd,IDD_CMDSEL_CATEGORY),LBN_SELCHANGE,SendMessage);
}
}
BOOL dlgprocCmdsel(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
cmdselFlush(hwnd);
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_SEARCHNEXT);
if (hctrl) EnableWindow(hctrl,FALSE);
break;
}
case WM_DESTROY: {
#if 0// 開きっぱなしにして高速化
textCmdselTerm();
#endif
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
if (notify == LBN_SELCHANGE || notify == CBN_SELCHANGE) {
if (id == IDD_CMDSEL_CATEGORY) {
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_CATEGORY);
int isel = SendMessage(hctrl,_fListboxCategory ? LB_GETCURSEL : CB_GETCURSEL,0,0);
//information("%d",isel);
if (isel >= 0) {
NPARA npara = cmdselSelected(hwnd,textCmdsel(1),isel+1);
//information("%d",npara);
if (npara) {
TX* text = textCmdselOpen(2);
TX* db = apidb2GetText(_idbCmdsel);
txJumpNpara(db,npara);
apidb2MakeCommandtext(text,_idbCmdsel);
if (_fListboxList) {
listboxFromText(GetDlgItem(hwnd,IDD_CMDSEL_LIST),text);
} else {
comboboxFromText(GetDlgItem(hwnd,IDD_CMDSEL_LIST),text);
}
}
}
} else if (id == IDD_CMDSEL_LIST) {
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_LIST);
int isel = SendMessage(hctrl,_fListboxList ? LB_GETCURSEL : CB_GETCURSEL,0,0);
if (isel >= 0) {
cmdselSelected(hwnd,textCmdsel(2),isel+1);
} else {
ListBox_ResetContent(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN));
}
}
}
switch(id) {
case IDD_CMDSEL_SEARCH: {
#if 0// TreeView_GetRootを使うとソートできない。再帰ソートの仕方不明
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_TREELIST);
HTREEITEM h = TreeView_GetSelection(hctrl);
h = NULL;
TreeView_SortChildren(hctrl,h,2);
return TRUE;
#endif
cmdselUiSearch(hwnd);
return TRUE;
}
case IDD_CMDSEL_SEARCHNEXT: {
cmdselSearchNext(hwnd);
return TRUE;
}
case IDD_CMDSEL_DISPALL: {
BOOL fBase = IDB_ISBASE(_idbCmdsel);
BOOL fCmd = IDB_ISCMD(_idbCmdsel);
if (fBase) {
_idbCmdsel = fCmd ? IDB_CMD : IDB_API;
cmdselFlush(hwnd);
fCmd ? (_fCmdBase = FALSE) : (_fApiBase = FALSE);
cmdselFlushSel(hwnd);//3.00B1 970520
}
break;
}
case IDD_CMDSEL_DISPBASE: {
BOOL fBase = IDB_ISBASE(_idbCmdsel);
BOOL fCmd = IDB_ISCMD(_idbCmdsel);
if (!fBase) {
_idbCmdsel = fCmd ? IDB_CMDBASE : IDB_APIBASE;
cmdselFlush(hwnd);
fCmd ? (_fCmdBase = TRUE) : (_fApiBase = TRUE);
cmdselFlushSel(hwnd);//3.00B1 970520
}
break;
}
case IDD_CMDSEL_CONTEXTMENU: //2.99A 970321
case IDD_CONTEXTMENU: {
//2.95 970131
HWND hctrl = GetDlgItem(hwnd,id);
RECT r;
GetWindowRect(hctrl,&r);
POINT p;
p.x = r.left + rectCx(&r) / 2;
p.y = r.top + rectCy(&r) / 2;
contextmenu(hwnd,&p);
break;
}
#ifdef __FLAT__
case IDD_CMDSEL_DISPCATEGORY: {
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_TREELIST);
HTREEITEM h = TreeView_GetRoot(hctrl);
while(h) {
TreeView_Expand(hctrl,h,TVE_COLLAPSE);
h = TreeView_GetNextSibling(hctrl,h);
}
break;
}
#endif
}
break;
}
#ifdef __FLAT__
case WM_CONTEXTMENU: {
if (wParam == GetDlgItem(hwnd,IDD_CMDSEL_TREELIST)) {
POINT point;
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
contextmenu(hwnd,&point);
return TRUE;
}
break;
}
case WM_NOTIFY: {
TV_DISPINFO* nm = (LPVOID)lParam;
if (nm->hdr.idFrom == IDD_CMDSEL_TREELIST) {
switch(nm->hdr.code) {
case TVN_SELCHANGED: {
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_TREELIST);
LPARAM lParam = treeviewGetParam(hctrl,TreeView_GetSelection(hctrl));
cmdselSelected(hwnd,textCmdsel(0),lParam);
break;
}
}
}
break;
}
#endif
case CS_SETSZCMD: {
cmdselSetSzcmd(hwnd,(mchar*)lParam,0);
break;
}
}
return FALSE;
}
//##応用関数
#define IDD_EXEC 1000
#define IDD_INSERTTEXT 1001
mchar* _szSearchApi;
#define WM_TXSEARCHCMD (WM_USER + 5)
BOOL dlgprocCmdselAp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static WZCMD wzcmd;
CMDSEL_HOOK
switch(message) {
case WM_INITDIALOG: {
wzcmd = 0;
if (_szSearchApi) PostMessage(hwnd,WM_TXSEARCHCMD,0,_szSearchApi);
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case IDD_EXEC: {
if (wzcmd) {
PostMessage(text->hwndbase,WM_COMMAND,IDM_WZCMDTOP + wzcmd,0);
} else {
return TRUE;
}
break;
}
case IDD_INSERTTEXT: {
if (wzcmd) {
if (IDB_ISCMD(_idbCmdsel)) {
txInsertf(text,"call(\"%s\");",wzcmdToSzcmd(wzcmd));
} else {
txJumpParaTop(text);
//
HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN);
int n = ListBox_GetCount(hctrl);
for (int i = 0;i < n;i++) {
int lch = ListBox_GetTextLen(hctrl,i);
mchar buff[CCHWORD];
if (lch < cchof(buff)) {
ListBox_GetText(hctrl,i,buff);
txInsertLine(text,buff);
}
}
}
} else {
return TRUE;
}
break;
}
}
break;
}
case CSN_SETSZCMD: {
mchar* szcmd = (LPVOID)lParam;
if (szcmd) {
wzcmd = wzcmdRegister(szcmd);
}
break;
}
case WM_TXSEARCHCMD: {
mchar* szcmd = (LPVOID)lParam;
if (szcmd) {
if (!cmdselSetSzcmd(hwnd,szcmd,SEARCH_NOSENSECASE)) {
// histAdd(HIST_SEARCH,szcmd);
#if 1//2.99C 970324 txapihelp 省略形TXAPIも検索できるようにした
BOOL f = FALSE;
if (strnicmp(szcmd,"tx",2)) {
txstr sz = "tx";
sz += szcmd;
#if 1//2.99F 970404 "open2"の省略形TXAPI検索に対応
mchar* p = strGetLast(sz);
if (p && *p == '2') *p = 0;
#endif
f = cmdselSetSzcmd(hwnd,sz,SEARCH_NOSENSECASE);
}
if (!f) cmdselUiSearchInit(hwnd,szcmd,SEARCH_NOSENSECASE);
#else
cmdselUiSearchInit(hwnd,szcmd,SEARCH_NOSENSECASE);
#endif
}
}
break;
}
}
return FALSE;
}
cmdlist(int idb)
{
BOOL fApi = FALSE;
cmdselSetIdb(idb);
HDIALOG hd;
if (idb == IDB_API || idb == IDB_APIBASE) {
fApi = TRUE;
hd = dialog("API一覧");
} else {
hd = dialog("機能一覧");
}
dialogSetHookEx(hd,"\m.dlgprocCmdselAp");
//
if (_fwin40) {
#ifdef __FLAT__
dialogControlID(hd,IDD_CMDSEL_TREELIST);
dialogTree(hd,"コマンド(&C):",NULL,61,15);//2.99C 970326 60->61,20->15 VGAで機能一覧がはみ出た
#endif
} else {
#if 1
dialogControlID(hd,IDD_CMDSEL_CATEGORY);
dialogList(hd,"分類(&C):",NULL,30,10);
dialogLFV(hd);
dialogControlID(hd,IDD_CMDSEL_LIST);
dialogList(hd,"コマンド(&M):",NULL,30,10);
dialogLF(hd);
#else
DTRECT r1,r2;
dialogGetPos(hd,&r1);
r1.cx = DTCX * 12;r1.cy = DTCY;
r2.x = r1.x + r1.cx + DTCX;
r2.y = r1.y;
r2.cx = DTCX * 18;r2.cy = DTCYBOX;
//
r2.cy = DTCY * 10;
_dialogAddLtext(hd,"分類(&C):",&r1);
_dialogAddCombobox(hd,IDD_CMDSEL_CATEGORY,&r2);
dialogControlHelp(hd,359);
_dialogAddControlInfo(hd,IDD_CMDSEL_CATEGORY);
r1.y = r2.y = r2.y + DTCY * 2;
//
_dialogAddLtext(hd,"コマンド(&M):",&r1);
r2.x = r1.x;r2.cx = DTCX * 31;r2.y += DTCY*3/2;//2.00B コマンド一覧を大きくした
_dialogAddCombobox(hd,IDD_CMDSEL_LIST,&r2);
_dialogAddControlInfo(hd,IDD_CMDSEL_LIST);
r1.y = r2.y = r2.y + DTCY * 2;
dialogSetPosY(hd,r1.y);
#endif
}
#if 0//2.99C 970326
if (IDB_ISCMD(idb)) {
dialogLFV(hd);
dialogControlID(hd,IDD_CMDSEL_KEYLIST);
dialogControlHelp(hd,230);
dialogList(hd,"キー割り当て(&K):",NULL,20,4);
dialogLF(hd);
}
#endif
dialogSetH(hd);//2.99C 970326
//2.95 970131
dialogControlID(hd,IDD_CONTEXTMENU);
dialogButton(hd,fApi ? "API一覧の操作(&O)..." : "機能一覧の操作(&O)...",NULL,20);//2.99C 970326 旧「コンテキストメニュー(&C)...」
//2.99C 970326
if (IDB_ISCMD(idb)) {
dialogIndent(hd,4);
dialogCaptionDynamic(hd,"キー割り当て(&K):",_fwin40 ? 14 : 15);
dialogControlID(hd,IDD_CMDSEL_KEYLIST);
dialogControlHelp(hd,230);
dialogList(hd,NULL,NULL,20,_fwin40 ? 4 : 3);
}
dialogLFSetV(hd);
DTRECT rCmd; // コマンドボタンを配置する位置
{
DTRECT r;
dialogGetPos(hd,&r);
dialogCmdLFV(hd);
dialogGetPos(hd,&rCmd);
dialogSetPos(hd,&r);
}
//
dialogSetIntXY(hd,0,0);
dialogCaption(hd,"詳細(&D):");
dialogResetInt(hd);
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 80;
r.cy = DTCY * 8;
_dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
dialogControlHelp(hd,372);
_dialogAddControlInfo(hd,IDD_CMDSEL_EXPLAIN);
//
dialogLFV(hd);
dialogSetPos(hd,&rCmd);//2.99C 970326
int cx = 16;
dialogControlID(hd,IDCANCEL);
dialogCmdDefault(hd,"閉じる",cx);
dialogControlID(hd,IDD_EXEC);
dialogCmd(hd,"実行(&X)",cx);
dialogSpaceV(hd);
dialogControlID(hd,IDD_INSERTTEXT);
dialogCmd(hd,"テキストに挿入(&I)",cx);
dialogControlID(hd,IDD_CMDSEL_SEARCH);
dialogButtonCmd(hd,"検索(&F)",NULL,cx);
dialogControlID(hd,IDD_CMDSEL_SEARCHNEXT);
dialogButtonCmd(hd,"次検索(&N)",NULL,cx);
//
return dialogOpen(hd);
}
BOOL TXCMDBASE TXAPI uiCmdList(TX* text)
{
// 機能一覧を表示
//{#VZ} {Esc}M %M ^%W
//{#MS} +{F1}
//{#EMACS} %M
cmdlist(IDB_CMDDEFAULT);
return TRUE;
}
BOOL TXCMDBASE TXAPI uiApiList(TX* text)
{
// API一覧を表示
cmdlist(IDB_APIDEFAULT);
return TRUE;
}
void TXAPI uiApiListSearch(mchar* szapi)
{
// API一覧を表示し、szapiを検索して説明を表示します。
_szSearchApi = szapi;
cmdlist(IDB_API);
_szSearchApi = NULL;
}
//{###コマンドチップヘルプ}
extern "dialoga" int _contexthelp(TX* text,int x,int y);
BOOL TXAPI apidb2TipHelp(mchar* szcmd)
{
//3.00B1 970522 new
BOOL ret = FALSE;
int idb = IDB_CMD;
TX* db = apidb2Open(idb);
if (db) {
txstr szfind = "(Cmd:";
szfind += szcmd;
szfind += ")";
txJumpFileTop(db);
if (txSearchEx(db,szfind,SEARCH_NOSENSECASE)) {
TX* text = textopen(NULL);
if (text) {
apidb2GetExplain(idb,text);
RECT r;
GetWindowRect(textf->hwndbase,&r);
_contexthelp(text,r.left + systemfontGetCx()*10,r.top + systemfontGetCy()*5);
}
textclose(text);
}
}
return ret;
}
void main(void)
{
//call("custmize.uiKeyCust");return;
//test();return;
apidb2Remake();
call("custmize.createEnglishMenuForMaster");
return;
// uiCmdList();
//uiApiList();
}
void TXAPI apidb2FlushCache(void)
{
// キャッシングをフラッシュします
apidb2CloseAll();
textCmdselTerm();
}
__delete
{
apidb2FlushCache();
}