home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2002 March
/
VPR0203B.ISO
/
APUPDATE
/
VC
/
TXC0601S
/
TXC0601S.LZH
/
_IDMTXC.C
< prev
next >
Wrap
C/C++ Source or Header
|
2001-01-01
|
18KB
|
580 lines
/*
TX-C/マクロのIDMコマンド処理群
Start 99年12月 4日
*/
#if __TXC__
#include <_wz.h>
#include <windows.h>
#include <windowsx.h>
#include <_idm.h>
#else
#include "_sys.h"
#endif
#include "_idmlib.h"
#include "_list.h"
//##設定の読み書き
mchar* txcGetsetEventMacro(mchar szEventMacros[CCHEVENTMACROS],BOOL fSet)
{
//WZ3.90L 981116 new
wchar wsz[CCHPATHNAME];
TX* text = textopenW(wpathFullConfig(wsz,L"txc.cfg"));
txMsghdrGetsetString(text,"eventmacro:",szEventMacros,CCHEVENTMACROS,fSet);
if (fSet) txSave(text);
textclose(text);
return szEventMacros;
}
mchar* txcGetEventMacro(mchar buff[CCHEVENTMACROS])
{
//WZ3.90L 981116 new
return txcGetsetEventMacro(buff,FALSE);
}
static void txcGetsetLastexec(mchar szLastexec[CCHWORD],BOOL fSet)
{
//WZ3.90L 981116 new
wchar wsz[CCHPATHNAME];
TX* text = textopenW(wpathFullConfig(wsz,L"txc.cfg"));
txMsghdrGetsetString(text,"lastexec:",szLastexec,CCHWORD,fSet);
if (fSet) txSave(text);
textclose(text);
}
#if __TXC__
mchar* strGetNextWordTop(mchar* szStr)
{
//WZ3.90I 981013 new
szStr = strGetWordTop(szStr); //WZ3.90J 981108
return strGetWordTop(szStr + strGetWordLen(szStr));
}
#endif
//##TX-Cの設定ダイアログ
#if WZFUNC_TXC //WZ4.00Be 990513
typedef struct {
LISTITEM head; // 必ず先頭にこれを入れる
// mydata
mchar szStatus[10];
mchar szModule[CCHWORD];
mchar szName[CCHWORD];
mchar szAuthor[40];
mchar szVersion[20];
WORD fConfig:1;
WORD fHelp:1;
} PLUGIN_ITEM;
enum {
IDD_UP=100,IDD_DOWN,IDD_DELETE,IDD_ADD,IDD_STATUS,IDD_CONFIG,IDD_HELP,
};
typedef struct {
TX* text;
LIST* list;
TXCOPTION copt;
mchar szEventMacros[CCHEVENTMACROS];
} CONTEXT_TXCCONFIG;
static mchar _szOK[] = "OK";
static mchar _szErr[] = "エラー";
static mchar _szSkip[] = "無効";
mchar* szEventMacrosSetError(mchar szEventMacros[CCHEVENTMACROS],mchar* p)
{
// pの位置から始まるマクロ名をエラーとしてマークを付ける。
// 次のマクロ名のアドレスを返す。
// バッファオーバーした場合はマクロ名を削除してpを返す。
//WZ4.00Ca 991204 new
if (p >= szEventMacros+2 && p[-2] == ' ') {
p[-1] = '!';
return strGetNextWordTop(p);
} else {
if (strlen(szEventMacros) + 1 > CCHEVENTMACROS) {
strcpy(p,strGetNextWordTop(p) - p);
return p;
} else {
memmove(p+1,p,strlen(p)+1);
p[0] = '!';
return strGetNextWordTop(p);
}
}
}
static BOOL plugitemGetInfo(PLUGIN_ITEM* item)
{
// item->szModuleの情報を取得。エラーが発生した場合はFALSEを返す
strcpy(item->szName,"(不明)");
strcpy(item->szAuthor,"(不明)");
strcpy(item->szVersion,"(不明)");
if (strcmp(item->szStatus,_szErr)) {
mchar szMacro[120];
sstrcpy(szMacro,item->szModule);
sstrcat(szMacro,".__pluginGetProperty");
{
FARPROC pc = macroGetTxpcode(szMacro);
if (pc) {
txstr str;
DWORD tArg[2] = {&str,NULL};
//information(szMacro);
structClear(str);tArg[1] = "name";
txpcodeCallAddress(pc,2,tArg);
sstrcpy(item->szName,str.szString);
//
structClear(str);tArg[1] = "author";
txpcodeCallAddress(pc,2,tArg);
sstrcpy(item->szAuthor,str.szString);
//
structClear(str);tArg[1] = "version";
txpcodeCallAddress(pc,2,tArg);
sstrcpy(item->szVersion,str.szString);
// __pluginGetPropertyできたときのみ、Config/Helpを調べる。
// コンパイルエラーの場合に何度もコンパイルしないように。
sstrcpy(szMacro,item->szModule);
sstrcat(szMacro,".__pluginConfig");
item->fConfig = !!macroGetTxpcode(szMacro);
//
sstrcpy(szMacro,item->szModule);
sstrcat(szMacro,".__pluginHelp");
item->fHelp = !!macroGetTxpcode(szMacro);
return TRUE;
} else if (sh->fTxcCompileError) {
// このmacroGetTxpcodeでエラーになった場合。
strcpy(item->szStatus,_szErr);
return FALSE;
}
}
}
return TRUE;
}
static BOOL plugitemIsExist(LIST* list,mchar* szModule)
{
int i;
for (i = 0;;i++) {
PLUGIN_ITEM* item = listRead(list,i);
if (!item) break;
if (!stricmp(szModule,item->szModule)) return TRUE;
}
return FALSE;
}
static BOOL plugitemCheck(mchar* szModule)
{
mchar szMacro[CCHWORD];
strcpy(szMacro,szModule);
sstrcat(szMacro,".__on_txFrameNew");
return macroGetTxpcode(szMacro);
}
BOOL CALLBACK dlgprocTxcConfig(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
CONTEXT_TXCCONFIG* context = (LPVOID)dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
if (GetDlgItem(hwnd,IDD_LIST)) {
BOOL fEdit = FALSE;
PLUGIN_ITEM item;
#if WINDOWSCE
LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
#else
LIST* list = listh_GetList(GetDlgItem(hwnd,IDD_LIST));
#endif
SUBLISTITEMATR* atr = &list->tSubitem[0];
context->list = list;
list->fNoHeaderTrack = TRUE; //WZ4.00Cb 000117 「TX-Cの設定|プラグイン」でヘッダカラム幅を変更できないようにした。
list->fNoSelect = TRUE; //WZ4.00Db 000213 「TX-Cの設定|プラグイン」で複数選択できないようにした。
listSetFont(list,systemfontGetFaceName(),systemfontGetHeight());
SetWindowLong(list->hwnd,GWL_ID,IDD_LIST); // for context-help
// atr->type = LISTITEM_INT;
// atr->offset = (LPBYTE)&item.npara - (LPBYTE)&item;
// atr->cx = dtcx(DTCX * 6);
// atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szStatus - (LPBYTE)&item;
atr->cx = dtcxListString(list,"エラー");
atr->fCenter = TRUE;
#if !WINDOWSCE
strcpy(atr->szGuide,"状態");
#endif
atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szModule - (LPBYTE)&item;
atr->cx = dtcxList(list,DTCX*12);
#if !WINDOWSCE
strcpy(atr->szGuide,"マクロ名");
#endif
atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szAuthor - (LPBYTE)&item;
atr->cx = dtcxList(list,DTCX*12);
atr->fCenter = TRUE;
#if !WINDOWSCE
strcpy(atr->szGuide,"作者");
#endif
atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szVersion - (LPBYTE)&item;
atr->cx = dtcxList(list,DTCX*(10-WINDOWSCE*2));
atr->fCenter = TRUE;
#if !WINDOWSCE
strcpy(atr->szGuide,"バージョン");
#endif
atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szName - (LPBYTE)&item;
atr->cx = -1;
#if !WINDOWSCE
strcpy(atr->szGuide,"説明");
#endif
atr++;
list->nSubitem = atr - &list->tSubitem[0];
listHeaderSetup(list);
{
mchar* p = context->szEventMacros;
while(1) {
int lch;
p = strGetWordTop(p);
lch = strGetWordLen(p);
if (!lch) break;
{
PLUGIN_ITEM* item = zmalloc(sizeof(PLUGIN_ITEM));
strcpy(item->szStatus,_szOK);
if (p[0] == '!') {
strcpy(item->szStatus,_szErr);
p++;lch--;
} else if (p[0] == '#') {
strcpy(item->szStatus,_szSkip);
p++;lch--;
}
sstrcpylen(item->szModule,p,lch);
if (!plugitemGetInfo(item)) {
p = szEventMacrosSetError(context->szEventMacros,p);
lch = 0;
fEdit = TRUE;
}
listAdd(list,item);
}
p += lch;
}
}
listDispAll(list);
PostMessage(hwnd,WM_TXUSER,0,0);
if (fEdit) txcSaveConfig(&context->copt); // コンパイルエラーが出た場合はエラー状態を保存するためにセーブする。
}
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
LIST* list = context->list;
switch(id) {
case IDD_UP: {
listMoveUp(list);
return TRUE;
}
case IDD_DOWN: {
listMoveDown(list);
return TRUE;
}
case IDD_DELETE: {
PLUGIN_ITEM* item = listReadCur(list);
if (item) {
if (question("マクロ %s をプラグインから外します。\nディスク上のマクロプログラムファイルはそのまま残ります。\nよろしいですか?",item->szModule) == IDYES) {
listDelCur(list);
PostMessage(hwnd,WM_TXUSER,0,0);
}
}
return TRUE;
}
case IDD_ADD: {
HDIALOG hd = dialog("プラグインマクロに追加");
mchar szfilename[CCHPATHNAME] = {0};
dialogControlRefer(hd,"-a wz:\\macro\\*.*");
// dialogControlRefer(hd,"-a c:\\program files\\wz editor\\*.*");
dialogString(hd,"マクロ名(&N):",10,szfilename,cchof(szfilename),30);
if (dialogOpen(hd)) {
mchar szModule[CCHWORD];
pathSetExt(szfilename,NULL);
sstrcpy(szModule,pathGetFileName(szfilename));
if (plugitemIsExist(list,szModule)) {
information("%s は既に組み込まれています",szModule);
} else if (!plugitemCheck(szModule)) {
if (sh->fTxcCompileError) {
information("コンパイルエラーが発生しました。");
} else {
information("%s はプラグインマクロではありません。",szModule);
}
} else {
PLUGIN_ITEM* item = zmalloc(sizeof(PLUGIN_ITEM));
strcpy(item->szStatus,_szOK);
sstrcpy(item->szModule,szModule);
plugitemGetInfo(item);
listInsert(list,item);
listDispAll(list);
PostMessage(hwnd,WM_TXUSER,0,0);
}
}
return TRUE;
}
case IDD_STATUS: {
PLUGIN_ITEM* item = listReadCur(list);
if (item) {
HDIALOG hd = dialog("状態");
int fOK = !strcmp(item->szStatus,_szOK);
dialogChoiceRadio(hd,&fOK,"無効 ","&OK ",NULL); //WZ4.00Ca 991210 space : ダイアログが小さすぎるのを直す。
if (dialogOpen(hd)) {
strcpy(item->szStatus,fOK ? _szOK : _szSkip);
listDispAll(list);
}
}
return TRUE;
}
case IDD_CONFIG: {
PLUGIN_ITEM* item = listReadCur(list);
if (item && item->fConfig) {
mchar szMacro[CCHWORD];
strcpy(szMacro,item->szModule);
sstrcat(szMacro,".__pluginConfig");
macroExec(szMacro,context->text);
}
return TRUE;
}
case IDD_HELP: {
PLUGIN_ITEM* item = listReadCur(list);
if (item && item->fHelp) {
mchar szMacro[CCHWORD];
strcpy(szMacro,item->szModule);
sstrcat(szMacro,".__pluginHelp");
macroExec(szMacro,context->text);
}
return TRUE;
}
}
break;
}
case WM_NOTIFY: {
LISTNOTIFY* notify = lParam;
LIST* list = context->list;
if (list && notify->hdr.hwndFrom == list->hwnd) {
if (notify->hdr.code == LISTN_SELCHANGE) {
PostMessage(hwnd,WM_TXUSER,0,0);
}
}
break;
}
case WM_TXDIALOG_NOTIFY: {
//// XZ,PWZで動作するか要確認。
if (wParam == TXDLGN_PSN_APPLY) {
LIST* list = context->list;
int i;
context->szEventMacros[0] = 0;
for (i = 0;;i++) {
PLUGIN_ITEM* item = listRead(list,i);
if (!item) break;
if (strlen(context->szEventMacros) + strlen(item->szModule) + 10 > cchof(context->szEventMacros)) {
information("プラグインマクロが多すぎます");
return TRUE;
}
if (context->szEventMacros[0]) strcat(context->szEventMacros," ");
strcat(context->szEventMacros,!strcmp(item->szStatus,_szOK) ? " " : (!strcmp(item->szStatus,_szSkip) ? "#" : "!"));
strcat(context->szEventMacros,item->szModule);
}
break;
}
break;
}
case WM_TXUSER: {
LIST* list = context->list;
PLUGIN_ITEM* item = listReadCur(list);
if (item) {
EnableDlgItem(hwnd,IDD_CONFIG,item->fConfig);
EnableDlgItem(hwnd,IDD_HELP,item->fHelp);
}
break;
}
}
return FALSE;
}
BOOL txIDM_TXC_CONFIG(TX* text)
{
BOOL ret = FALSE;
CONTEXT_TXCCONFIG context;
TXCOPTION* copt = &context.copt;
HDIALOG hd0 = dialog("TX-Cの設定");
HDIALOG hd;
//
hd0->fNoApplyNow = TRUE;
dialogSetDlgproc(hd0,dlgprocTxcConfig);
//
structClear(context);
txcLoadConfig(copt);
context.text = text;
txcGetEventMacro(context.szEventMacros);
dialogSetCustdata(hd0,&context);
//
#if 1//WZ4.00Ca 991203 プラグインの設定を行いやすくした。組み込み順が重要なマクロもあるので。
if (!stricmp(context.szEventMacros,"plugin")) { // ykome氏のマクロからの乗り換え
if (question("プラグイン管理をマクロからWZ本体に移しますか?") == IDYES) {
wchar wszfilename[CCHPATHNAME];
wchar* wsz = wstrdupA(copt->szpathMacro);
if (wpathSearch(wszfilename,L"plugin.cfg",wsz,NULL)) {
mchar sz[CCHPATHNAME];
txstr str;
wpathtopath(wszfilename,sz);
_permanentGetTxstr(sz,"eventmacro:",&str);
//information(str.szString);
sstrcpy(context.szEventMacros,str.szString);
while(1) { // 無効印'-'を'!'に置き換え。
mchar* p = strchr(context.szEventMacros,'-');
if (!p) break;
*p = '!';
}
txcGetsetEventMacro(context.szEventMacros,TRUE);
}
}
}
hd = dialog("プラグイン");
{
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * (60 + !WINDOWSCE*10 - _pspc*30);
r.cy = DTCY * (8 + !WINDOWSCE*5);
__dialogAddItem(hd,WINDOWSCE?szclassList:szclassListH,NULL,IDD_LIST,&r,WS_GROUP|WS_TABSTOP|WS_BORDER|WS_CHILD|WS_VISIBLE|(WINDOWSCE*WS_HSCROLL));
dialogControlHelpEx(hd,"txc",8);_dialogAddControlInfo(hd,IDD_LIST);
dialogSetPosY(hd,r.y + r.cy + DTCYINT);
dialogSetH(hd);
dialogControlHelpEx(hd,"txc",9);dialogControlID(hd,IDD_STATUS);dialogPushbutton(hd,"状態(&O)...",11-_pspc);
dialogControlHelpEx(hd,"txc",10);dialogControlID(hd,IDD_UP);dialogPushbutton(hd,"↑ &[",5);
dialogControlHelpEx(hd,"txc",11);dialogControlID(hd,IDD_DOWN);dialogPushbutton(hd,"↓ &]",5);
dialogIndent(hd,2 - 2*_pspc);
dialogControlHelpEx(hd,"txc",12);dialogControlID(hd,IDD_ADD);dialogPushbutton(hd,"新規登録(&N)...",12);
dialogControlHelpEx(hd,"txc",13);dialogControlID(hd,IDD_DELETE);dialogPushbutton(hd,"削除(&D)",8);
dialogLF(hd);
dialogControlHelpEx(hd,"txc",14);dialogControlID(hd,IDD_CONFIG);dialogPushbutton(hd,"設定(&S)...",11-_pspc);
dialogControlHelpEx(hd,"txc",15);dialogControlID(hd,IDD_HELP);dialogPushbutton(hd,"ヘルプ(&H)...",11-_pspc);
}
dialogAddPage(hd0,hd);
#else
hd = dialog("マクロ");
dialogString(hd,"イベントマクロ(&E):",24,context.szEventMacros,cchof(CCHEVENTMACROS),30);
dialogCaption(hd," マクロ名を空白で区切って指定してください");
dialogAddPage(hd0,hd);
#endif
//
hd = dialog("設定");
dialogControlHelpEx(hd,"txc",1);
dialogChoiceB(hd,"プラットフォーム(&P):",20,&copt->modePlatform,20,"Windows98/95/NT","WindowsCE1.0","WindowsCE2.0","UNIX",NULL);
//
dialogControlHelpEx(hd,"txc",2);
dialogCheckB(hd,"自動makeを行う(&M)",&copt->fAutoMake);
//
dialogControlHelpEx(hd,"txc",3);
dialogString(hd,"マクロパス(&R):",24,copt->szpathMacro,cchof(copt->szpathMacro),30);
dialogControlHelpEx(hd,"txc",4);
dialogString(hd,"includeファイルのパス(&I):",24,copt->szpathInclude,cchof(copt->szpathInclude),30);
dialogControlHelpEx(hd,"txc",5);
dialogString(hd,"出力ファイルのパス(&O):",24,copt->szpathOutput,cchof(copt->szpathOutput),30);
dialogAddPage(hd0,hd);
//
hd = dialog("メッセージ");
dialogControlHelpEx(hd,"txc",6);
dialogControlGuide(hd,"個のエラーでコンパイルを中止",28);
dialogIntegerW(hd,NULL,0,&copt->nErrorMessage,5);
dialogHeadline(hd,"ワーニングとレポートの出力",44);
dialogSetPosLF(hd);
dialogControlHelpEx(hd,"txc",7);
dialogCheckB(hd,"関数は呼ばれない(&N)",&copt->fWarnFuncNotCall);
dialogControlHelpEx(hd,"txc",7);
dialogCheckB(hd,"符号のミスマッチ(&S)",&copt->fWarnSignMismatch);
dialogControlHelpEx(hd,"txc",7);
dialogCheckB(hd,"小さいサイズへ代入(&L)",&copt->fWarnLoseDigit);
if (!_pspc) dialogLFV(hd); //WZ4.00Ea 001127 !_pspc
dialogControlHelpEx(hd,"txc",7);
dialogCheckB(hd,"変数自動定義(&D)",&copt->fReportAutoDef);
dialogControlHelpEx(hd,"txc",7);
dialogCheckB(hd,"関数呼び出し変換(&F)",&copt->fReportTxapi);
dialogAddPage(hd0,hd);
//
if (dialogOpen(hd0)) {
txcSaveConfig(copt);
//information(context.szEventMacros);
txcGetsetEventMacro(context.szEventMacros,TRUE);
ret = TRUE;
}
return ret;
}
#endif
//##マクロの実行
#if WZFUNC_TXC
BOOL txIDM_MACRO_UIEXEC(TX* text)
{
BOOL ret = FALSE;
HDIALOG hd = dialog("マクロの実行");
HSTRBLK sb = historyOpen("macroexec",4096);
mchar szMacro[CCHWORD] = {0};
hd->fPpcPopup = TRUE; //WZ4.00Eb 010101
txcGetsetLastexec(szMacro,FALSE);
dialogControlStrblkHist(hd,sb);
dialogString(hd,"マクロ名(&M):",12,szMacro,cchof(szMacro),30);
if (dialogOpen(hd)) {
txcGetsetLastexec(szMacro,TRUE);
macroExec(szMacro,text);
ret = TRUE;
}
historyClose("macroexec",sb);
return ret;
}
#endif
//##プラグイン
#if __TXC__
void __pluginGetProperty(mchar* prop,txstr res)
{
//information("%s",prop);
if (!stricmp(prop,"name")) res = "マクロ/TX-C IDM処理";
if (!stricmp(prop,"author")) res = sysGetName();
if (!stricmp(prop,"version")) res = sysGetVersionPrim();
}
BOOL __pluginRelease(void)
{
return TRUE;
}
static HOOKRESULT CALLBACK wndprocTextHook(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
if (message == WM_TXEVENT && wParam == TXEVENT_IDMEXEC) {
TX* text = hwndtextGetText(hwnd);
int idm = lParam;
switch(idm) {
case IDM_MACRO_UIEXEC: { // サンプル
statprintf("IDM_MACRO_UIEXEC by macro");
txIDM_MACRO_UIEXEC(text);
return HOOK_CAPTURE;
}
case IDM_TXC_CONFIG: { // サンプル
statprintf("IDM_TXC_CONFIG by macro");
txIDM_TXC_CONFIG(text);
return HOOK_CAPTURE;
}
}
}
return HOOK_CONTINUE;
}
void __on_txFrameNew(TX* text)
{
txSetHookWndproctextTxpcode(text,wndprocTextHook);
}
#endif