home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 March / VPR9903A.BIN / APUPDATE / VC / Tx300d / TX300D.LZH / WORD.C < prev    next >
C/C++ Source or Header  |  1997-10-13  |  163KB  |  5,875 lines

  1. // WZ EDITOR 標準機能 書式
  2. // Copyright 1995-96 TY
  3.  
  4. //2.97 970223 HTML関連のコマンドは廃止
  5. //2.99 970320 印刷時のプロポーショナルON/OFFは画面表示に合わせる
  6. //2.99D 970331 TXCMDBASE対応
  7.  
  8. //{###ワープロ機能}
  9.  
  10. #include <windows.h>
  11. #include <windowsx.h>
  12. #include "dialog.h"
  13. #include "edit.h"
  14. #include <windowsx.h>
  15. #include "dialog.h"
  16. #include "adrbook.h"
  17.  
  18. extern "html" {
  19.     BOOL txHtmlSet(TX* text,int tag,int arg);
  20.     BOOL TXAPI txInsertHtmlSzTag(TX* text,mchar* szTag,int tag);
  21. }
  22.  
  23. static CHARATR charatrNull;
  24.  
  25. //## base function
  26.  
  27. //1.98 文字装飾や段落書式を変更したらtextの編集フラグを立てる
  28. #define mySetEdit(text)    {text->fEdit = TRUE;text->nEdit++;txDispLocate(text);}
  29.  
  30. static BOOL IsEditmode(TX* text)
  31. {
  32.     if (!text->editmode) {
  33.         information(
  34.             "テキストモードでは実行できません。\n"
  35.             "体裁、詳細モードで実行してください。\n"
  36.         );
  37.         return FALSE;
  38.     }
  39.     return TRUE;
  40. }
  41.  
  42. static BOOL IsWP(TX* text)
  43. {
  44. // プレーンテキストをいきなり詳細モードにして脚注を挿入し、テキストモードに戻すと
  45. // 挿入した脚注が失われた。このような場合は挿入する時点で関数を使って
  46. // エラーメッセージを出す様にする。
  47. //// 後で余裕があるときに行う
  48. //3.00A2 970507 new
  49.     if (text->editmode) {
  50.         if (!txIsWP(text)) {
  51.             information(
  52.                 "この文書は、プレーンなテキストファイルです。\n"
  53.                 "詳細モードでの段落体裁や文字装飾機能は利用できません。\n"
  54.                 "この機能を利用するには、一旦テキストモードにしてから体裁モードにしてください\n"
  55.             );
  56.             return FALSE;
  57.         }
  58.     }
  59.     return TRUE;
  60. }
  61.  
  62. static BOOL IsParaatrFF(TX* text)
  63. {
  64. //2.98 970308 テキストモードで改ページが含まれる段落の体裁を変更するときは、警告を出す様にした。
  65.     if (!text->editmode) {
  66.         BOOL f = FALSE;
  67.         // 範囲指定されているときに、範囲全体を調べるのは大変なので調べず、
  68.         // カーソル行のみを調べる。
  69.         txstr szline;
  70.         txGetPara(text,szline);
  71.         if (strchr(szline,CHAR_FF)) f = TRUE;
  72.         if (f) {
  73.             int ret = question(
  74.                 "この段落には改ページコードが含まれています。\n"
  75.                 "テキストモードでは、このような段落に正しく段落体裁を設定することができません。\n"
  76.                 "体裁/詳細モードをご利用ください。\n"
  77.                 "\n"
  78.                 "構わず段落体裁を設定しますか?"
  79.             );
  80.             if (ret == IDYES) return TRUE;
  81.             return FALSE;
  82.         }
  83.         return TRUE;
  84.     }
  85.     return TRUE;
  86. }
  87.  
  88. static BOOL mytxParaatrSet(tx *text,int tag,PARAATR* arg)
  89. {
  90.     if (!IsParaatrFF(text)) return FALSE;
  91.     return txParaatrSet(text,tag,arg);
  92. }
  93.  
  94. static void txReplacePlug(TX* text,LPVOID plug,LPVOID plug0)
  95. {
  96. // plug0 != NULL : カーソル位置のplug0をplugに置き換える //2.99 970312 カーソル位置は移動しない
  97. // plug0 == NULL : plugをCHAR_PLUGとして挿入する。
  98. #if 1//2.98 970305 undo対応
  99.     if (plug0) txDeleteChar(text);
  100.     txInsertPlug(text,plug);
  101.     if (plug0) txLeft(text);
  102. #else
  103.     CHARATR_LINK charatr;
  104.     charatrRead(text,txGetAddress(text),(LPVOID)&charatr);
  105.     if (plug0) {
  106.         if (charatr.fLink && charatr.ibitmap) {
  107.             plugatrDelete(text,charatr.ibitmap);
  108.         }
  109.     }
  110.     charatr.fLink = TRUE;
  111.     charatr.ibitmap = plugatrGetTyp(text,plug);
  112.     if (!plug0) txCurInsertChar(text,CHAR_PLUG);
  113.     charatrWrite(text,txGetAddress(text),(LPVOID)&charatr);
  114. #endif
  115. }
  116.  
  117. DWORD convprocAlign(DWORD data,int mode)
  118. {
  119.     static int t[] = {
  120.         ALIGN_LEFT,ALIGN_CENTER,ALIGN_RIGHT,
  121.     };
  122.     int n = sizeof(t) / sizeof(int);
  123.     if (mode == TXDIALOG_READ) {
  124.         if (data < n) return t[data];
  125.         return 0;
  126.     } else {
  127.         int i;
  128.         for (i = 0;i < n;i++) {
  129.             if (t[i] == data) return i;
  130.         }
  131.         return 0;
  132.     }
  133. }
  134.  
  135. //{###ワープロ機能}
  136.  
  137. BOOL TXAPI TXCMDBASE txCharBold(tx *text)
  138. {
  139. // 選択文字列を太字に設定
  140. //2.99A 970321 {#MS} ^B new
  141. //{#MS} ^B
  142.     if (text->fHTML) return txHtmlSet(text,TAG_B,0);
  143.     return txCharatrSet(text,TAG_B,0);
  144. }
  145.  
  146. BOOL TXAPI TXCMDBASE txCharItalic(tx *text)
  147. {
  148. // 選択文字列を斜体に設定
  149. //2.99A 970321 {#MS} ^I new
  150. //{#MS} ^I
  151.     if (text->fHTML) return txHtmlSet(text,TAG_I,0);
  152.     return txCharatrSet(text,TAG_I,0);
  153. }
  154.  
  155. BOOL TXAPI TXCMDBASE txCharUnderline(tx *text)
  156. {
  157. // 選択文字列を下線に設定
  158. //2.99A 970321 {#MS} ^U new
  159. //{#MS} ^U
  160.     if (text->fHTML) return txHtmlSet(text,TAG_U,0);
  161.     return txCharatrSet(text,TAG_U,0);
  162. }
  163.  
  164. BOOL TXAPI TXCMD txCharNormal(tx *text)
  165. {
  166. // 選択文字列の文字装飾をクリア
  167.     if (text->fHTML) {
  168.         //2.99C 970327 HTMLでword.txCharNormalすると範囲内のタグを消去するようにした
  169.         return call("html.clearTag");
  170.     } else {
  171.         return txCharatrSet(text,0,0);
  172.     }
  173. }
  174.  
  175. //##論理行一般
  176.  
  177. //2.99 970320 キー割り当て{#MS} +{Enter}、{#MI} +{Enter}を外した
  178. //1.93 
  179. int TXAPI TXCMD txInsertBR(tx* text)
  180. {
  181. // 段落内改行
  182. //{#RET}実行できたか返す
  183. //1.93で追加
  184.     return txOp(text,TXOP_WRITERETURNEX,1,0);//2.97 970224 WZ.EXEへ移行
  185. }
  186.  
  187. BOOL TXAPI TXCMD txFormClear(tx *text)
  188. {
  189. // 段落書式をクリア
  190.     mytxParaatrSet(text,TAG_CLEAR,0);
  191.     return TRUE;
  192. }
  193.  
  194. BOOL TXAPI TXCMD txFormArticleClear(tx *text)
  195. {
  196. // 箇条書きをクリア
  197.     PARAATR paraatr = text->paraatr;
  198.     paraatr.fArticle = FALSE;
  199.     paraatr.modeArticle = 0;
  200.     mytxParaatrSet(text,TAG_OL,¶atr);
  201.     return TRUE;
  202. }
  203.  
  204. BOOL TXAPI TXCMD txFormArticleDisc(tx *text)
  205. {
  206. // ・箇条書き
  207.     if (text->fHTML) {
  208.         //2.99C 970325 「ツールバー|箇条書き」改良
  209.         return txHtmlSet(text,TAG_LI,0);
  210.     } else {
  211.         return mytxParaatrSet(text,TAG_LI,0);
  212.     }
  213. }
  214.  
  215. BOOL TXAPI TXCMD txFormArticleNotice(tx *text)
  216. {
  217. // ※箇条書き
  218. //[HTML不可]
  219.     return mytxParaatrSet(text,TAG_LINOTICE,0);
  220. }
  221.  
  222. BOOL TXAPI TXCMD txFormArticleNum(tx *text)
  223. {
  224. // 番号付き箇条書き
  225.     if (text->fHTML) {
  226.         //2.99C 970325 「ツールバー|番号付き箇条書き」改良
  227.         return txHtmlSet(text,TAG_LINUM,0);
  228.     } else {
  229.         return mytxParaatrSet(text,TAG_LINUM,0);
  230.     }
  231. }
  232.  
  233. BOOL TXAPI TXCMD txFormFeed(tx *text)
  234. {
  235. // 改ページ
  236. //[HTML不可]
  237.     return txCharatrSet(text,TAG_FORMFEED,0);//2.98 970309 txParaatrSet->txCharatrSet
  238. }
  239.  
  240. //2.99 970320 キー割り当て{#MS} ^{Enter}、{#VZ} ^{Enter}、{#MI} ^{Enter}を外した
  241. BOOL TXAPI TXCMD txFormFeedModal(tx *text)
  242. {
  243. // HTMLファイルでは改段、その他のファイルでは改ページ
  244.     if (text->fHTML) {
  245.         call("html.insertP");
  246.     } else {
  247.         return txCharatrSet(text,TAG_FORMFEED,0);//2.98 970309 txParaatrSet->txCharatrSet
  248.     }
  249. }
  250.  
  251. BOOL TXAPI TXCMDBASE txFormLeft(tx *text)
  252. {
  253. // 左揃え
  254.     if (text->fHTML) {
  255.         if (text->editmode == 0) {
  256.             return txCharatrSet(text,TAG_LEFT,0);
  257.         }
  258.         return txHtmlSet(text,TAG_LEFT,0);
  259.     } else {
  260.         return mytxParaatrSet(text,TAG_LEFT,0);
  261.     }
  262. }
  263.  
  264. BOOL TXAPI TXCMDBASE txFormCenter(tx *text)
  265. {
  266. // 中央揃え
  267.     if (text->fHTML) {
  268.         if (text->editmode == 0) {
  269.             return txCharatrSet(text,TAG_CENTER,0);
  270.         }
  271.         return txHtmlSet(text,TAG_CENTER,0);
  272.     } else {
  273.         return mytxParaatrSet(text,TAG_CENTER,0);
  274.     }
  275. }
  276.  
  277. BOOL TXAPI TXCMDBASE txFormRight(tx *text)
  278. {
  279. // 右揃え
  280.     if (text->fHTML) {
  281.         return txHtmlSet(text,TAG_RIGHT,0);
  282.     } else {
  283.         return mytxParaatrSet(text,TAG_RIGHT,0);
  284.     }
  285. }
  286.  
  287. BOOL TXAPI txFormIndentAdd(tx *text,int d)
  288. {
  289. // インデント増
  290.     return mytxParaatrSet(text,TAG_INDENTADD,(LPVOID)d);
  291. }
  292.  
  293. BOOL TXAPI TXCMD txFormIndentInc(tx *text)
  294. {
  295. // インデント増
  296. // 常にタブサイズで増やす
  297.     if (text->fHTML) {
  298. #if 1//2.97A 970301 
  299.         return txHtmlSet(text,TAG_UL,LCXINDENT_STD);
  300. #else
  301.         return txFormIndentAdd(text,LCXINDENT_STD);
  302. #endif
  303.     } else {
  304.         if (text->indentsize) {//2.91 
  305.             return txFormIndentAdd(text,text->indentsize);
  306.         } else {
  307.             return txFormIndentAdd(text,text->tabsize);
  308.         }
  309.     }
  310. }
  311.  
  312. BOOL TXAPI TXCMD txFormIndentDec(tx *text)
  313. {
  314. // インデント減
  315. // 常にタブサイズで減らす
  316.     if (text->fHTML) {
  317. #if 1//2.97A 970301 
  318.         return txHtmlSet(text,TAG_UL,-LCXINDENT_STD);
  319. #else
  320.         return txFormIndentAdd(text,-LCXINDENT_STD);
  321. #endif
  322.     } else {
  323.         if (text->indentsize) {//2.91 
  324.             return txFormIndentAdd(text,-text->indentsize);
  325.         } else {
  326.             return txFormIndentAdd(text,-text->tabsize);
  327.         }
  328.     }
  329. }
  330.  
  331. BOOL TXAPI txFormTitle(tx *text,int ititle)
  332. {
  333. // 見出し
  334.     if (text->fHTML) {
  335.         return txHtmlSet(text,TAG_H,ititle);
  336.     } else {
  337.         PARAATR paraatr;
  338.         paraatr.modeTitle = ititle;
  339.         return mytxParaatrSet(text,TAG_H,¶atr);
  340.     }
  341. }
  342.  
  343. BOOL TXAPI TXCMDBASE txFormTitle0(tx* text)
  344. {
  345. // 本文(見出しをクリア)
  346.     return txFormTitle(text,0);
  347. }
  348.  
  349. BOOL TXAPI TXCMDBASE txFormTitle1(tx* text)
  350. {
  351. // 見出し1
  352.     return txFormTitle(text,1);
  353. }
  354.  
  355. BOOL TXAPI TXCMDBASE txFormTitle2(tx* text)
  356. {
  357. // 見出し2
  358.     return txFormTitle(text,2);
  359. }
  360.  
  361. BOOL TXAPI TXCMDBASE txFormTitle3(tx* text)
  362. {
  363. // 見出し3
  364.     return txFormTitle(text,3);
  365. }
  366.  
  367. BOOL TXAPI TXCMDBASE txFormTitle4(tx* text)
  368. {
  369. // 見出し4
  370.     return txFormTitle(text,4);
  371. }
  372.  
  373. BOOL TXAPI TXCMDBASE txFormTitle5(tx* text)
  374. {
  375. // 見出し5
  376.     return txFormTitle(text,5);
  377. }
  378.  
  379. BOOL TXAPI TXCMDBASE txFormTitle6(tx* text)
  380. {
  381. // 見出し6
  382.     return txFormTitle(text,6);
  383. }
  384.  
  385. //##モード
  386.  
  387. //2.00B 
  388. static BOOL CheckGene(TX* text)
  389. {
  390.     if (text->fGene) {
  391.         information("世代テキストは画面表示モードを切り替えられません");
  392.         return FALSE;
  393.     }
  394.     return TRUE;
  395. }
  396.  
  397. BOOL TXAPI TXCMDBASE txSetEditmodeText(tx* text)
  398. {
  399. // 画面表示モードを「テキストモード」に設定
  400.     if (!CheckGene(text)) return FALSE;
  401.     if (text->flpPreview) txLpOp(text,TXLPOP_PREVIEWEXIT);
  402.     return txSetEditmode(text,0);
  403. }
  404.  
  405. //2.00B ヒント追加
  406. static BOOL CheckForm(TX* text)
  407. {
  408.     if (text->fForm || text->editmode) {
  409.         return TRUE;
  410.     } else if (text->fBinedit) {
  411.         return FALSE;
  412. #ifdef __FLAT__
  413.     //2.99 970316 
  414.     } else if (pathIsExt(text->szfilename,".rtf")) {
  415.         return TRUE;
  416. #endif
  417.     } else {
  418.         int ret = question(
  419.             "書式文字列を処理しますか?\n"
  420.             "\n"
  421.             "[はい]を押すとテキストの書式文字列を読み取って、文字装飾や段落体裁を整えます。\n"
  422.             "テキスト中の全ての書式文字列は削除されます。注意してください。\n"
  423.             "\n"
  424.             "[ヒント] 書式文字列の設定は、「ファイル|文書の設定」の[ファイル]タブにあります。\n"
  425.         );
  426.         if (ret == IDYES) {
  427.             text->fForm = TRUE;
  428.             text->fEdit = TRUE;//1.99G 編集フラグを立てる
  429.             return TRUE;
  430.         }
  431.         return FALSE;
  432.     }
  433. }
  434.  
  435. BOOL TXAPI TXCMDBASE txSetEditmodeForm(tx* text)
  436. {
  437. // 画面表示モードを「体裁モード」に設定
  438.     if (!CheckGene(text)) return FALSE;
  439.     if (!CheckForm(text)) return FALSE;
  440.     if (text->flpPreview) txLpOp(text,TXLPOP_PREVIEWEXIT);
  441.     return txSetEditmode(text,1);
  442. }
  443.  
  444. //1.99D 詳細モードにはプレーンテキストでも無条件で移行できる
  445. BOOL TXAPI TXCMDBASE txSetEditmodePrint(tx* text)
  446. {
  447. // 画面表示モードを「詳細モード」に設定
  448.     if (!CheckGene(text)) return FALSE;
  449.     if (text->flpPreview) txLpOp(text,TXLPOP_PREVIEWEXIT);
  450.     return txSetEditmode(text,2);
  451. }
  452.  
  453. void TXAPI txSetDispstylemode(TX* text,int dispmode)
  454. {
  455. // 画面表示スタイルを設定
  456.     text->dispstylemode = dispmode;
  457.     txConfigOp(text,TXCONFIGOP_EXTSETUPDISPSTYLE,0);
  458.     txFlushEx(text,TXFLUSHEX_TXFLUSHALL);
  459. }
  460.  
  461. void TXAPI TXCMDBASE txSetDispstyle1(TX* text)
  462. {
  463. // 画面表示スタイルをスタイル1に設定
  464.     txSetDispstylemode(text,0);
  465. }
  466.  
  467. void TXAPI TXCMDBASE txSetDispstyle2(TX* text)
  468. {
  469. // 画面表示スタイルをスタイル2に設定
  470.     txSetDispstylemode(text,1);
  471. }
  472.  
  473. void TXAPI TXCMDBASE txSetDispstyle3(TX* text)
  474. {
  475. // 画面表示スタイルをスタイル3に設定
  476.     txSetDispstylemode(text,2);
  477. }
  478.  
  479. void TXAPI TXCMDBASE txSetDispstyle4(TX* text)
  480. {
  481. // 画面表示スタイルをスタイル4に設定
  482. //2.98A 970311 new
  483.     txSetDispstylemode(text,3);
  484. }
  485.  
  486. //## 表
  487.  
  488. BOOL TXAPI TXCMDBASE txuiInsertTable(TX* text)
  489. {
  490. // 表を挿入
  491.     HDIALOG hd = dialog("表の挿入");
  492.     static int xTable = 5;
  493.     static int yTable = 3;
  494.     
  495.     dialogIntXY(hd,"表の桁数 x 行数(&S):",&xTable,&yTable,20,4);
  496.     
  497.     dialogIndent(hd,4);
  498.     dialogCaption(hd,NULL);
  499.     dialogCaption(hd,"桁数と行数は、文書ウィンドウで簡単に変更できます。");
  500.     dialogCaption(hd,"桁数や行数を縮めるには、縮めたい部分の文字を削除します。");
  501.     dialogCaption(hd,"桁数を増やすには、{Tab}を押します。");
  502.     dialogCaption(hd,"行数を増やすには、{Enter}を押します。");
  503.     
  504.     if (dialogOpen(hd)) {
  505.         txJumpParaTop(text);
  506.         if (text->fHTML) {
  507.             return txHtmlSet(text,TAG_TABLE,MAKELONG(xTable,yTable));
  508.         } else {
  509.             if (txCharatrSet(text,TAG_TABLE,(LPVOID)MAKELONG(xTable,yTable))) {
  510.                 if (text->fConfigInlineform && !text->fParaforming && text->editmode == 0) {
  511.                     call("paraform.form");
  512.                 }
  513.                 return TRUE;
  514.             }
  515.         }
  516.     }
  517.     return FALSE;
  518. }
  519.  
  520. BOOL TXAPI TXCMDBASE txuiTable(TX* text)
  521. {
  522. // テーブルのプロパティ
  523.     PLUGTAB* plug = (LPVOID)txOp(text,TXOP_PLUGTAB_CURPARA,0,0);
  524.     if (plug) {
  525.         if (plug->modeTab == MODETAB_BEAMTAB) {
  526.             information("桁揃えのプロパティはありません。");
  527.             return FALSE;
  528.         } else {
  529.             if (txGetCurPlugmode(text) == PLUG_TAB) {//2.99C 970327 
  530.                 information("表のセルのプロパティを開くには、プロパティを開きたいセルの中の文字にカーソルを合わせて「書式|プロパティ」を実行してください。");
  531.                 return FALSE;// カーソルが縦線上なら何もしない。
  532.             }
  533.             HDIALOG hd = dialog("セルのプロパティ");
  534.             dialogControlConvertEx(hd,"\m.convprocAlign");
  535.             dialogSelectIDB(hd,"配置(&A):",&plug->modeAlign,20,15,"左揃え","中央揃え","右揃え");
  536.             dialogHeadline(hd,"境界線",50);
  537.             dialogSelectIDB(hd,"左側(&L):",&plug->modeSepaLeft,20,15,"なし","細線","太線");
  538.             dialogSelectIDB(hd,"下側(&L):",&plug->modeSepaBottom,20,15,"なし","細線","太線");
  539.             if (dialogOpen(hd)) {
  540.                 txOp(text,TXOP_PLUGTAB_FLUSHCUR,0,0);
  541.                 return TRUE;
  542.             }
  543.             return FALSE;
  544.         }
  545.     } else {
  546.         return txuiInsertTable(text);
  547.     }
  548. }
  549.  
  550. BOOL TXAPI TXCMDBASE txInsertBeamtab(TX* text)
  551. {
  552. // 桁揃えを挿入
  553. //2.97 970224 new
  554. //{#VZ} +^I
  555. //{#MS} +^I
  556. //{#MI} +^I
  557.     if (text->editmode == 0) {
  558.         //2.99C 970324 桁揃えの挿入:テキストモード対応
  559.         txCharatrSet(text,TAG_TAB,0);
  560.         return TRUE;
  561.     }
  562.     {
  563.         PLUGTAB* plug = plugatrNew(text,PLUG_TAB);
  564.         if (plug) {
  565.             plug->modeTab = MODETAB_BEAMTAB;
  566.             txSetUndisp(text);
  567.             txInsertPlug(text,plug);
  568.             txOp(text,TXOP_PLUGTAB_FLUSHCUR,0,0);
  569.             txSetDisp(text);
  570.             return TRUE;
  571.         }
  572.     }
  573.     return FALSE;
  574. }
  575.  
  576. BOOL TXAPI TXCMDBASE txInsertHR(tx* text)
  577. {
  578. // 水平線を挿入
  579.     if (text->fClip) {
  580.         txSelectCopyDelete(text);
  581.     }
  582.     if (text->filekind == TEXT_MAIL) {
  583.         return call("paraform.sepa");
  584.     }
  585.     if (text->fHTML) {
  586.         if (!txIsCurParaTop(text)) txInsertReturn(text);
  587.         txCharatrSet(text,TAG_HR,NULL);
  588.     } else {
  589.         txJumpParaTop(text);//1.99C 
  590.         txCharatrSet(text,TAG_HR,NULL);
  591.     }
  592.     return TRUE;
  593. }
  594.  
  595. BOOL TXAPI TXCMD txuiLetterHeader(TX* text)
  596. {
  597. // レターヘッダのプロパティ
  598.     if (text->fHTML) {
  599.         return FALSE;
  600.     } else {
  601.         if (text->npara > MAX_NPARALETTERHEADER) {
  602.             information(
  603.                 "レターヘッダは、文書先頭段落から%d段落までの間にしか設定することができません\n"
  604.                 "(カーソル位置の段落は%d行です。)\n",MAX_NPARALETTERHEADER,text->npara
  605.             );
  606.             return FALSE;
  607.         }
  608.         HDIALOG hd = dialog("レターヘッダ");
  609.         dialogCaption(hd,"カーソル位置までをレターヘッダとして設定し、");
  610.         dialogCaption(hd,"印刷時の段組の設定に拘わらず、一段組で印刷します。");
  611.         dialogLFV(hd);
  612.         dialogOK(hd,12);
  613.         dialogCancel(hd,12);
  614.         int iddClear = dialogCmd(hd,"解除(&C)",12);
  615.         int ret;
  616.         if (ret = dialogOpen(hd)) {
  617.             if (ret == iddClear) {
  618.                 txCharatrSet(text,TAG_BODY,1);
  619.             } else {
  620.                 txCharatrSet(text,TAG_BODY,NULL);
  621.             }
  622.         }
  623.         return ret;
  624.     }
  625. }
  626.  
  627. //##メニューやステータスバーへの表示
  628.  
  629. static int idmHorizon;
  630. static int idmVertical;
  631. static int idmVertical2;
  632. static int idmEdit;
  633. static int idmDraft;
  634. static int idmPrint;
  635. static int idmPreview;
  636. static int idmNormal;
  637. static int idmBold;
  638. static int idmUnderline;
  639. static int idmItalic;
  640. static int idmArticleDisc;
  641. static int idmArticleNum;
  642. static int idmLeft;
  643. static int idmCenter;
  644. static int idmRight;
  645. static int idmTab;
  646. static int idmTable;
  647. static int idmH1;
  648. static int idmH2;
  649. static int idmH3;
  650. static int idmH4;
  651. static int idmH5;
  652. static int idmH6;
  653. static int idmDispstyle1;
  654. static int idmDispstyle2;
  655. static int idmDispstyle3;
  656. static int idmDispstyle4;
  657. //3.00B1 970522 ベタテキストやCの挿入メニューの文字装飾系コマンドを灰色表示
  658. static int idmInsertBitmap;
  659. static int idmInsertTable;
  660. static int idmInsertBeamtab;
  661. static int idmInsertFootnote;
  662. static int idmInsertFont;
  663. static int idmInsertHR;
  664. __new
  665. {
  666.     macroHookWndBase();
  667.     idmEdit = IDM_WZCMDTOP + wzcmdRegister("\m.txSetEditmodeText");
  668.     idmDraft = IDM_WZCMDTOP + wzcmdRegister("\m.txSetEditmodeForm");
  669.     idmPrint = IDM_WZCMDTOP + wzcmdRegister("\m.txSetEditmodePrint");
  670.     idmPreview = IDM_WZCMDTOP + wzcmdRegister("\m.txSetPreview");
  671.     idmDispstyle1 = IDM_WZCMDTOP + wzcmdRegister("\m.txSetDispstyle1");
  672.     idmDispstyle2 = IDM_WZCMDTOP + wzcmdRegister("\m.txSetDispstyle2");
  673.     idmDispstyle3 = IDM_WZCMDTOP + wzcmdRegister("\m.txSetDispstyle3");
  674.     idmDispstyle4 = IDM_WZCMDTOP + wzcmdRegister("\m.txSetDispstyle4");
  675.     idmNormal = IDM_WZCMDTOP + wzcmdRegister("\m.txCharNormal");
  676.     idmBold = IDM_WZCMDTOP + wzcmdRegister("\m.txCharBold");
  677.     idmUnderline = IDM_WZCMDTOP + wzcmdRegister("\m.txCharUnderline");
  678.     idmItalic = IDM_WZCMDTOP + wzcmdRegister("\m.txCharItalic");
  679.     idmArticleDisc = IDM_WZCMDTOP + wzcmdRegister("\m.txFormArticleDisc");
  680.     idmArticleNum = IDM_WZCMDTOP + wzcmdRegister("\m.txFormArticleNum");
  681.     idmLeft = IDM_WZCMDTOP + wzcmdRegister("\m.txFormLeft");
  682.     idmCenter = IDM_WZCMDTOP + wzcmdRegister("\m.txFormCenter");
  683.     idmRight = IDM_WZCMDTOP + wzcmdRegister("\m.txFormRight");
  684.     idmTab = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTab");
  685.     idmTable = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTable");
  686.     idmH1 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle1");
  687.     idmH2 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle2");
  688.     idmH3 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle3");
  689.     idmH4 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle4");
  690.     idmH5 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle5");
  691.     idmH6 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle6");
  692.     //3.00B1 970522 
  693.     idmInsertBitmap = IDM_WZCMDTOP + wzcmdRegister("\m.txuiInsertBitmap");
  694.     idmInsertTable = IDM_WZCMDTOP + wzcmdRegister("\m.txuiInsertTable");
  695.     idmInsertBeamtab = IDM_WZCMDTOP + wzcmdRegister("\m.txInsertBeamtab");
  696.     idmInsertFootnote = IDM_WZCMDTOP + wzcmdRegister("\m.txuiInsertFootnote");
  697.     idmInsertFont = IDM_WZCMDTOP + wzcmdRegister("\m.txuiInsertFont");
  698.     idmInsertHR = IDM_WZCMDTOP + wzcmdRegister("\m.txInsertHR");
  699. }
  700.  
  701. BOOL TXCMDBASE flushpage(TX* text)
  702. {
  703. // ページ番号表示をリフレッシュ
  704. // 詳細モードで、ページ番号の表示が実際とズレる場合があります。
  705. // このコマンドを実行すると正確な番号を計算して表示します。
  706.     statprintf("ページ番号リフレッシュ中");
  707.     txSetUndispEx(text);
  708.     txJumpFileTop(text);
  709.     txOp(text,TXOP_FLUSH_NPARALETTERHEADER,0,0);
  710.     txSetDispEx(text);
  711.     statprintf("ページ番号リフレッシュ完了");
  712.     return TRUE;
  713. }
  714.  
  715. BOOL TXAPI txIsCurTable(TX* text)
  716. {
  717. // カーソル行が表かどうか返す
  718. //2.00B
  719.     PLUGTAB* plug = (LPVOID)txOp(text,TXOP_PLUGTAB_CURPARA,0,0);
  720.     if (plug && plug->modeTab == MODETAB_TABLE) return TRUE;
  721.     return FALSE;
  722. }
  723.  
  724. BOOL TXAPI txIsCurTab(TX* text)
  725. {
  726. // カーソル行が桁揃えかどうか返す
  727. //2.00B
  728.     PLUGTAB* plug = (LPVOID)txOp(text,TXOP_PLUGTAB_CURPARA,0,0);
  729.     if (plug && plug->modeTab == MODETAB_BEAMTAB) return TRUE;
  730.     return FALSE;
  731. }
  732.  
  733. // -1:不明
  734. static int checked(WZCMD wzcmd)
  735. {
  736.     int idm = IDM_WZCMDTOP + wzcmd;
  737.     
  738. //statprintf("%d %d",idm,idmBold);
  739.     if (idm == idmNormal) {
  740.         return !memcmp(&text->charatr,&charatrNull,sizeof(CHARATR));
  741.     } else if (idm == idmBold) {
  742.         return text->charatr.fBold;
  743.     } else if (idm == idmUnderline) {
  744.         return text->charatr.fUnderline;
  745.     } else if (idm == idmItalic) {
  746.         return text->charatr.fItalic;
  747.     } else if (idm == idmArticleDisc) {
  748.         return (text->paraatr.fArticle && text->paraatr.modeArticle < ARTICLE_NUMBER);
  749.     } else if (idm == idmArticleNum) {
  750.         return (text->paraatr.fArticle && text->paraatr.modeArticle >= ARTICLE_NUMBER);
  751.     } else if (idm == idmEdit) {
  752.         return (text->editmode == 0);
  753. #if 0//3.00B1 970523 
  754.     } else if (idm == idmDraft) {
  755.         return (text->editmode == 1);
  756. #endif
  757.     } else if (idm == idmPrint) {
  758.         return (text->editmode == 2 && !text->flpPreview);
  759.     } else if (idm == idmPreview) {
  760.         return text->flpPreview;
  761.     } else if (idm == idmDispstyle1) {
  762.         return (text->dispstylemode == 0);
  763.     } else if (idm == idmDispstyle2) {
  764.         return (text->dispstylemode == 1);
  765.     } else if (idm == idmDispstyle3) {
  766.         return (text->dispstylemode == 2);
  767.     } else if (idm == idmDispstyle4) {//2.98A 970311 
  768.         return (text->dispstylemode == 3);
  769.     } else if (idm == idmLeft) {
  770.         return (paraatrGetAlign(text,&text->paraatr) == ALIGN_LEFT);
  771.     } else if (idm == idmCenter) {
  772.         return (paraatrGetAlign(text,&text->paraatr) == ALIGN_CENTER);
  773.     } else if (idm == idmRight) {
  774.         return (paraatrGetAlign(text,&text->paraatr) == ALIGN_RIGHT);
  775.     } else if (idm == idmTable) {
  776.         return txIsCurTable(text);
  777.     } else if (idm == idmTab) {
  778.         return txIsCurTab(text);
  779.     } else if (idm == idmH1) {
  780.         return (text->paraatr.modeTitle == 1);
  781.     } else if (idm == idmH2) {
  782.         return (text->paraatr.modeTitle == 2);
  783.     } else if (idm == idmH3) {
  784.         return (text->paraatr.modeTitle == 3);
  785.     } else if (idm == idmH4) {
  786.         return (text->paraatr.modeTitle == 4);
  787.     } else if (idm == idmH5) {
  788.         return (text->paraatr.modeTitle == 5);
  789.     } else if (idm == idmH6) {
  790.         return (text->paraatr.modeTitle == 6);
  791.     }
  792.     return -1;
  793. }
  794.  
  795. static WORD formatable(int iformat)
  796. {
  797. //3.00B1 970522 new
  798.     if (text->fWztext) return 0;
  799.     if (text->fPlaintext) return MF_GRAYED;
  800.     if (text->tszformat[iformat][0] == 0) {
  801.         // 書式文字列が設定されてない
  802.         return MF_GRAYED;
  803.     }
  804.     return 0;
  805. }
  806.  
  807. WORD at_cmdcheck(WZCMD wzcmd,HMENU hmenu)
  808. {
  809. #if 1//2.99C 970325 ファイルを開いた直後の表示メニューに、画面表示スタイルの内容が表示されてなかった
  810.     int idm = IDM_WZCMDTOP + wzcmd;
  811.     if (
  812.         idm == idmDispstyle1 ||
  813.         idm == idmDispstyle2 ||
  814.         idm == idmDispstyle3 ||
  815.         idm == idmDispstyle4    //2.98A 970311 
  816.     ) {
  817.         int style = 0;
  818.         if (idm == idmDispstyle2) style = 1;
  819.         if (idm == idmDispstyle3) style = 2;
  820.         if (idm == idmDispstyle4) style = 3;//2.98A 970311 
  821.         {
  822.             int n = GetMenuItemCount(hmenu);
  823.             int i;
  824.             for (i = 0;i < n;i++) {
  825.                 if (GetMenuItemID(hmenu,i) == idm) {
  826.                     UINT stat = GetMenuState(hmenu,i,MF_BYPOSITION);
  827.                     mchar szstr[CCHWORD];
  828.                     GetMenuString(hmenu,i,szstr,CCHWORD,MF_BYPOSITION);
  829.                     BOOL fEnglish = text->share->config.fEnglish;
  830.                     txstr sz;
  831.                     int nClm = text->tnClm[style];//2.93 
  832.                     int modeWidth = text->tmodeWidth[style];//2.99A 970321 
  833.                     if (nClm == 0) nClm = 1;
  834.                     //
  835.                     BOOL fVertical = text->tfVertical[style];
  836.                     mchar buff[CCHWORD];
  837.                     sprintf(buff,"&%d",style + 1);
  838.                     sz += buff;
  839.                     ////2.98A 970311 txstr += (f ? "str1" : "str2");はアプリエラーになる
  840.                     if (fVertical) {
  841.                         strcpy(buff,fEnglish ? " Vertical" : " 縦書き");
  842.                     } else {
  843.                         strcpy(buff,fEnglish ? " Horizontal " : " 横書き");
  844.                     }
  845.                     sz += buff;
  846.                     sprintf(buff,fEnglish ? " %dclms" : " %d段組",nClm);
  847.                     sz += buff;
  848.                     if (modeWidth == MODEWIDTH_AUTO) {//2.99A 970321 
  849.                         if (fEnglish) {//2.99F 970404 表示スタイル 英語メニュー対応
  850.                             sz += " Auto-Chars";
  851.                         } else {
  852.                             sz += " 自動折り返し幅";
  853.                         }
  854.                     } else if (modeWidth == MODEWIDTH_LPRINT) {//2.99A 970321 
  855.                         if (fEnglish) {//2.99F 970404 表示スタイル 英語メニュー対応
  856.                             sz += " Print-Chars";
  857.                         } else {
  858.                             sz += " 印刷折り返し幅";
  859.                         }
  860.                     } else {
  861.                         if (fVertical) {
  862.                             sprintf(buff,fEnglish ? " %dJapanese-chars" : " 全角%d文字",text->twidth[style] / 2);
  863.                             sz += buff;
  864.                         } else {
  865.                             sprintf(buff,fEnglish ? " %dEnglish-chars" : " 半角%d文字",text->twidth[style]);
  866.                             sz += buff;
  867.                         }
  868.                     }
  869.                     if (text->theight[style]) {
  870.                         sprintf(buff,fEnglish ? " %dlines" : " %d行",text->theight[style]);
  871.                         sz += buff;
  872.                     }
  873.                     if (text->tlfWestern[style]) {//2.99 970320 
  874.                         sprintf(buff,fEnglish ? " Western" : " 欧文");
  875.                         sz += buff;
  876.                     }
  877.                     if (text->tlfProp[style]) {//2.99 970320 
  878.                         sprintf(buff,fEnglish ? " Prop" : " プロポーショナル");
  879.                         sz += buff;
  880.                     }
  881.                     ModifyMenu(hmenu,i,MF_BYPOSITION|MF_STRING|stat,idm,sz);
  882.                 }
  883.             }
  884.         }
  885.         return (text->dispstylemode == style) ? MF_CHECKED : 0;
  886.     } else if (idm == idmInsertBitmap) {//3.00B1 970523 
  887.         return formatable(SZFORMAT_BITMAP);
  888.     } else if (idm == idmInsertTable) {//3.00B1 970523 
  889.         return formatable(SZFORMAT_TABLE);
  890.     } else if (idm == idmInsertBeamtab) {//3.00B1 970523 
  891.         return formatable(SZFORMAT_TAB);
  892.     } else if (idm == idmInsertFootnote) {//3.00B1 970523 
  893.         return formatable(SZFORMAT_FOOTNOTE_TOP);
  894.     } else if (idm == idmInsertFont) {//3.00B1 970523 
  895.         return formatable(SZFORMAT_FONT_TOP);
  896.     } else if (idm == idmInsertHR) {//3.00B1 970523 
  897.         return formatable(SZFORMAT_HR);
  898.     } else if (idm == idmDraft) {//3.00B1 970523 
  899.         if (!text->fWztext && !text->fHTML) {
  900.             if (text->tszformat[SZFORMAT_BOLD_TOP][0] == 0) return MF_GRAYED;
  901.         }
  902.         if (text->fPlaintext) return MF_GRAYED;
  903.         if (text->editmode == 1) return MF_CHECKED;
  904.         return 0;
  905.     } else {
  906.         int f = checked(wzcmd);
  907.         if (f >= 1) return MF_CHECKED;
  908.         return 0;
  909.     }
  910. #else
  911.     //2.99 970319 
  912.     int f = checked(wzcmd);
  913.     if (f >= 1) return MF_CHECKED;
  914.     return 0;
  915. #endif
  916. }
  917.  
  918. static void statusbarSet(int hsl)
  919. {
  920.     TX* text1 = txGetFrameNow();//2.99C 970324 
  921.     mchar sz[CCHLINE];
  922.     mchar*p = sz;
  923.     //
  924.     if (hsl == HSL_PARAATR) {// 段落書式
  925.         if (text->paraatr.modeTitle) {
  926.             sprintf(p,"見出%d ",text->paraatr.modeTitle);
  927.             p += strlen(p);
  928.         }
  929.         if (text->paraatr.modeArticle) {
  930.             strcpy(p,"箇条 ");
  931.             p += strlen(p);
  932.         }
  933.         if (text->paraatr.lcxIndent) {
  934.             strcpy(p,"字下 ");
  935.             p += strlen(p);
  936.         }
  937.         switch(paraatrGetAlign(text,&text->paraatr)) {
  938.             case ALIGN_CENTER: {
  939.                 strcpy(p,"中央 ");
  940.                 p += strlen(p);
  941.                 break;
  942.             }
  943.             case ALIGN_RIGHT: {
  944.                 strcpy(p,"右 ");
  945.                 p += strlen(p);
  946.                 break;
  947.             }
  948.         }
  949.         if (txIsCurTable(text)) {
  950.             strcpy(p,"表 ");
  951.             p += strlen(p);
  952.         } else if (txIsCurTab(text)) {
  953.             strcpy(p,"桁揃 ");
  954.             p += strlen(p);
  955.         }
  956.         *p = 0;
  957.         SendMessage(text1->hwndbase,WM_TXSB_SETTEXT,hsl,(LPARAM)sz);
  958.     } else if (hsl == HSL_CHARATR) {// 文字装飾
  959.         //2.00B ステータスバーのカーソル位置の文字装飾の表示が一文字ずれていた。
  960.         CHARATR charatr;
  961.         charatrRead(text,txGetAddress(text),&charatr);
  962.         if (charatr.fBold) {
  963.             strcpy(p,"太 ");
  964.             p += strlen(p);
  965.         }
  966.         if (charatr.fUnderline) {
  967.             strcpy(p,"線 ");
  968.             p += strlen(p);
  969.         }
  970.         if (charatr.fItalic) {
  971.             strcpy(p,"斜 ");
  972.             p += strlen(p);
  973.         }
  974.         *p = 0;
  975.         SendMessage(text1->hwndbase,WM_TXSB_SETTEXT,hsl,(LPARAM)sz);
  976.     }
  977. }
  978.  
  979. HOOKRESULT __wndprocbase(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  980. {
  981.     TX* text = textTarget;//2.95 970129 
  982.     switch(message) {
  983. #if 0//2.99C 970325 
  984.         case WM_INITMENUPOPUP: {
  985.             HMENU hmenu = (HMENU)wParam;
  986.             // サブメニューを生成させるため、先にWZオリジナルの処理をする
  987.             SendMessage(text->hwndbase,WM_TXINITMENU,(WPARAM)hmenu,0);//2.95 970129 text1->textTarget
  988.             {
  989.                 int n = GetMenuItemCount(hmenu);
  990.                 int i;
  991.                 for (i = 0;i < n;i++) {
  992.                     int idm = GetMenuItemID(hmenu,i);
  993.                     int fCheck = checked(idm - IDM_WZCMDTOP);
  994.                     if (fCheck != -1) {
  995.                         CheckMenuItem(hmenu,idm,MF_BYCOMMAND|(fCheck ? MF_CHECKED : MF_UNCHECKED));
  996.                     }
  997.                     if (idm == idmEdit) {
  998.                         //1.98 
  999.                         if (text->fWztext) {
  1000.                             EnableMenuItem(hmenu,idm,MF_BYCOMMAND|MF_GRAYED);
  1001.                         } else {
  1002.                             EnableMenuItem(hmenu,idm,MF_BYCOMMAND|MF_ENABLED);
  1003.                         }
  1004.                     }
  1005.                     if (
  1006.                         idm == idmDispstyle1 ||
  1007.                         idm == idmDispstyle2 ||
  1008.                         idm == idmDispstyle3 ||
  1009.                         idm == idmDispstyle4    //2.98A 970311 
  1010.                     ) {
  1011.                         int style = 0;
  1012.                         if (idm == idmDispstyle2) style = 1;
  1013.                         if (idm == idmDispstyle3) style = 2;
  1014.                         if (idm == idmDispstyle4) style = 3;//2.98A 970311 
  1015.                         {
  1016.                             UINT stat = GetMenuState(hmenu,i,MF_BYPOSITION);
  1017.                             mchar szstr[CCHWORD];
  1018.                             GetMenuString(hmenu,i,szstr,CCHWORD,MF_BYPOSITION);
  1019. //                            mchar*p = strchrs(szstr,"\t(");
  1020.                             BOOL fEnglish = text->share->config.fEnglish;
  1021.                             txstr sz;
  1022.                             int nClm = text->tnClm[style];//2.93 
  1023.                             int modeWidth = text->tmodeWidth[style];//2.99A 970321 
  1024.                             if (nClm == 0) nClm = 1;
  1025.                             //
  1026. #if 1//2.98A 970311 "0行"は表示しないようにした
  1027.                             BOOL fVertical = text->tfVertical[style];
  1028.                             mchar buff[CCHWORD];
  1029.                             sprintf(buff,"&%d",style + 1);
  1030.                             sz += buff;
  1031.                             ////2.98A 970311 txstr += (f ? "str1" : "str2");はアプリエラーになる
  1032.                             if (fVertical) {
  1033.                                 strcpy(buff,fEnglish ? " Vertical" : " 縦書き");
  1034.                             } else {
  1035.                                 strcpy(buff,fEnglish ? " Horizontal " : " 横書き");
  1036.                             }
  1037.                             sz += buff;
  1038.                             sprintf(buff,fEnglish ? " %dclms" : " %d段組",nClm);
  1039.                             sz += buff;
  1040.                             if (modeWidth == MODEWIDTH_AUTO) {//2.99A 970321 
  1041.                                 sz += " 自動折り返し幅";
  1042.                             } else if (modeWidth == MODEWIDTH_LPRINT) {//2.99A 970321 
  1043.                                 sz += " 印刷折り返し幅";
  1044.                             } else {
  1045.                                 if (fVertical) {
  1046.                                     sprintf(buff,fEnglish ? " %dJapanese-chars" : " 全角%d文字",text->twidth[style] / 2);
  1047.                                     sz += buff;
  1048.                                 } else {
  1049.                                     sprintf(buff,fEnglish ? " %dEnglish-chars" : " 半角%d文字",text->twidth[style]);
  1050.                                     sz += buff;
  1051.                                 }
  1052.                             }
  1053.                             if (text->theight[style]) {
  1054.                                 sprintf(buff,fEnglish ? " %dlines" : " %d行",text->theight[style]);
  1055.                                 sz += buff;
  1056.                             }
  1057.                             if (text->tlfWestern[style]) {//2.99 970320 
  1058.                                 sprintf(buff,fEnglish ? " Western" : " 欧文");
  1059.                                 sz += buff;
  1060.                             }
  1061.                             if (text->tlfProp[style]) {//2.99 970320 
  1062.                                 sprintf(buff,fEnglish ? " Prop" : " プロポーショナル");
  1063.                                 sz += buff;
  1064.                             }
  1065. #else
  1066.                             if (text->tfVertical[style]) {
  1067.                                 sprintf(sz,
  1068.                                     fEnglish ? 
  1069.                                     "DisplayStyle&%d Vertical %dJapanese-chars * %dlines" :
  1070.                                     "&%d 縦書き %d段組 全角%d文字 * %d行",
  1071.                                     style + 1,
  1072.                                     nClm,
  1073.                                     text->twidth[style] / 2,
  1074.                                     text->theight[style]
  1075.                                 );
  1076.                             } else {
  1077.                                 sprintf(sz,
  1078.                                     fEnglish ? 
  1079.                                     "DisplayStyle&%d Horizontal %dEnglish-chars * %dlines" :
  1080.                                     "&%d 横書き %d段組 半角%d文字 * %d行",
  1081.                                     style + 1,
  1082.                                     nClm,
  1083.                                     text->twidth[style],
  1084.                                     text->theight[style]
  1085.                                 );
  1086.                             }
  1087. #endif
  1088. //                            if (!fEnglish && p) sz += p;
  1089.                             ModifyMenu(hmenu,i,MF_BYPOSITION|MF_STRING|stat,idm,sz);
  1090.                         }
  1091.                     }
  1092.                 }
  1093.             }
  1094.             break;
  1095.         }
  1096. #endif
  1097.         case WM_TXSB_SETUPTEXT: {
  1098.             switch(wParam) {
  1099.                 case HSL_CHARATR:
  1100.                 case HSL_PARAATR: {
  1101.                     statusbarSet(wParam);
  1102.                     return TRUE;
  1103.                 }
  1104.             }
  1105.             break;
  1106.         }
  1107.     }
  1108.     return HOOK_CONTINUE;
  1109. }
  1110.  
  1111. //##印刷設定
  1112.  
  1113. #define IDD_SPECFILENAME    1000
  1114. #define IDD_SPECFILENAMENO    1001
  1115. #define IDD_FILENAME        1005
  1116. #define IDD_REFERFILENAME    1006
  1117. #define IDD_SPECANCHOR        1010
  1118. #define IDD_SPECANCHORNO    1011
  1119. #define IDD_ANCHOR            1015
  1120. #define IDD_REFERANCHOR        1016
  1121. #define IDD_RELATIVE        1020
  1122. #define IDD_ABSOLUTE        1021
  1123. #define IDD_ABSOLUTEDRIVE    1022
  1124. #define IDD_RELATIVEBASED    1023    //2.99B 970321 
  1125. #define IDD_FLUSH            2000
  1126. #define IDD_STYLECLEAR        2001
  1127. #define IDD_SIZELIST        2002
  1128. #define IDD_USERPAPER        2003
  1129. #define IDD_USERPAPERX        2004
  1130. #define IDD_USERPAPERY        2005
  1131. #define IDD_WIDTH_ENABLE    2006
  1132. #define IDD_WIDTH            2007
  1133. #define IDD_HEIGHT_ENABLE    2008
  1134. #define IDD_HEIGHT            2009
  1135. #define IDD_LINEINT            2010
  1136. #define IDD_HEADER            2011
  1137. #define IDD_HEADERSTR        2012
  1138. #define IDD_FOOTER            2013
  1139. #define IDD_FOOTERSTR        2014
  1140. #define IDD_STYLE            2015
  1141. #define IDD_FSTYLECALC        2016
  1142. #define IDD_MARGIN_RIGHT    2017
  1143. #define IDD_MARGIN_BOTTOM    2018
  1144. #define IDD_DISP_WIDTH        2019
  1145. #define IDD_DISP_HEIGHT        2020
  1146. #define IDD_DISP_LINEINT    2021
  1147. #define IDD_DISP_CLM        2022
  1148. #define IDD_DISP_RIGHT        2023
  1149. #define IDD_DISP_BOTTOM        2024
  1150. //2.00E 
  1151. #define IDD_PRINTER_LIST    2025
  1152. #define IDD_RESLIST            2026
  1153. #define IDD_BINLIST            2027
  1154. #define IDD_DEFAULT_PRINTER    2030    // 2031も使用
  1155. #define IDD_PRINTAREAMODE    2040    // 2041,42も使用
  1156. #define IDD_SHEETLIST        2050
  1157. #define IDD_PRINTER            2051
  1158. #define IDD_STYLESET        2052
  1159. #define IDD_CALCPAGES        2053
  1160. #define IDD_NPAGETOP        2054
  1161. #define IDD_NPAGEEND        2055
  1162. #define IDD_PROMPT            2056
  1163. //2.96 970204 
  1164. #define IDD_LINEINT_ENABLE    2057
  1165. #define IDD_TEXTLXLY_ENABLE    2058
  1166. #define IDD_CLM                2059
  1167. #define IDD_ENABLE_NPAGENUM    2060
  1168. #define IDD_NPAGENUM        2061
  1169. #define IDD_HEADER2            2062
  1170. #define IDD_HEADER2STR        2063
  1171. #define IDD_FOOTER2            2064
  1172. #define IDD_FOOTER2STR        2065
  1173. #define IDD_HEADERPRINT        2066
  1174. #define IDD_FOOTERPRINT        2067
  1175. #define IDD_HEADER2SPECIFY    2068
  1176. #define IDD_HEADFONTAUTO    2069
  1177. //2.99D 970402 
  1178. #define IDD_MARGIN_LEFT        2070
  1179. #define IDD_MARGIN_UPPER    2071
  1180. // プロパティシートを使う時は、IDが100とかだとマズいようである。
  1181. #define IDD_DELETE            3000
  1182. #define IDD_SAVETO            3001
  1183. #define IDD_SAVETOTEMP        3002
  1184. #define IDD_LOAD            3003
  1185. #define IDD_USEPRINTFONT    3200    //2.00D 3200,3201を使用
  1186. //2.00D 
  1187. #define IDD_PREVIEW1        3210
  1188. #define IDD_PREVIEW2        3211
  1189. #define IDD_PREVIEW3        3212
  1190. #define IDD_PREVIEW4        3213
  1191. #define IDD_PREVIEW5        3214
  1192.  
  1193. #ifndef __FLAT__
  1194. extern "commdlg.dll" {
  1195.     #include <commdlg.h>
  1196.     #include <print.h>
  1197. }
  1198. #endif
  1199.  
  1200. permanent BOOL _fCalcStyle;
  1201.  
  1202. static void _FlushPreview(TX* textTarget,HWND hwnd,int id)
  1203. {
  1204.     if (!_fCalcStyle) return;
  1205.     HDIALOG hd = dialogFromHwnd(hwnd);
  1206.     HWND hctrl = GetDlgItem(hwnd,id);
  1207.     if (hctrl) {
  1208.         TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
  1209.         if (text) {
  1210.             LPRINT* lp = text->lp;
  1211.             //2.00E6 文書のスタイルを使用のとき、計算値がおかしかった
  1212.             txCopyConfig(text,textTarget);
  1213.             if (text->tFontstyle && textTarget->tFontstyle) {
  1214.                 memcpy(text->tFontstyle,textTarget->tFontstyle,SIZE_TFONTSTYLE);
  1215.             }
  1216.             EnableWindow(hctrl,FALSE);
  1217.             text->fVertical = textTarget->fVertical;
  1218.             text->flpCalc = TRUE;//2.00E6 
  1219.             //
  1220.             dialogRead(hd);
  1221.             memcpy(&lp->configTop,&textTarget->lp->configTop,&lp->configEnd - &lp->configTop);
  1222.             txLpOp(text,TXLPOP_FLUSHDEVMODE);
  1223.             //
  1224.             txFlush(text);
  1225.             txSetEditmode(text,2);
  1226.             //
  1227.             txLpOp(text,TXLPOP_CALC);
  1228.             SetDlgItemInt(hwnd,IDD_DISP_WIDTH,lp->clxPage,TRUE);
  1229.             SetDlgItemInt(hwnd,IDD_DISP_HEIGHT,lp->clyPage,TRUE);
  1230.             SetDlgItemInt(hwnd,IDD_DISP_LINEINT,lp->cmcmLineInt,TRUE);
  1231.             SetDlgItemInt(hwnd,IDD_DISP_CLM,lpGetClm(lp),TRUE);
  1232.             SetDlgItemInt(hwnd,IDD_DISP_RIGHT,lp->cmcmMarginRight/10,TRUE);
  1233.             SetDlgItemInt(hwnd,IDD_DISP_BOTTOM,lp->cmcmMarginBottom/10,TRUE);
  1234.         }
  1235.     }
  1236. }
  1237.  
  1238. static BOOL _fPreviewing;
  1239.  
  1240. static void FlushPreview(TX* text,HWND hwnd,int id)
  1241. {
  1242.     if (_fPreviewing) return;
  1243.     _fPreviewing = TRUE;
  1244.     _FlushPreview(text,hwnd,id);
  1245.     _fPreviewing = FALSE;
  1246. }
  1247.  
  1248. static BOOL _fInTxuser;    //2.96 970204 速度アップ
  1249.  
  1250. //2.00D 
  1251. static void myPostMessage(HWND hwnd,int message,WPARAM wParam,LPARAM lParam)
  1252. {
  1253.     if (_fPreviewing || _fInTxuser) return;
  1254.     MSG msg;
  1255.     if (PeekMessage(&msg,hwnd,message,message,PM_NOREMOVE)) {
  1256.         // 既にポストされている場合は、ポストしない
  1257.     } else {
  1258.         PostMessage(hwnd,message,wParam,lParam);
  1259.     }
  1260. }
  1261.  
  1262. //2.00E 
  1263. // sb==NULL: sbを作成
  1264. static HSTRBLK makeResolution(HDIALOG hd,LPRINT* lp,HSTRBLK sb)
  1265. {
  1266.     int n = lpCap(lp,DC_ENUMRESOLUTIONS,0);
  1267.     BOOL fDefault = (n <= 0);    // -1等の値になることがある。この時はデフォルト値をセット
  1268.     if (fDefault) {
  1269.         n = 4;
  1270.     }
  1271.     LONG* pData = memAlloc(n * sizeof(LONG) * 2);
  1272.     if (pData) {
  1273.         lpCap(lp,DC_ENUMRESOLUTIONS,(LPVOID)pData);
  1274.         int cch = 20;
  1275.         mchar* pName = memAlloc(n * cch);
  1276.         mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
  1277.         if (pName && tName) {
  1278.             int i;
  1279.             for (i = 0;i < n;i++) {
  1280.                 if (fDefault) {
  1281.                     static mchar* tsz[] = {"標準印刷(高品質)","簡易印刷(中品質)","簡易印刷(低品質)","ドラフト印刷",};
  1282.                     static int tres[] = {DMRES_HIGH,DMRES_MEDIUM,DMRES_LOW,DMRES_DRAFT};
  1283.                     pData[i] = tres[i];
  1284.                     //
  1285.                     tName[i] = &pName[i * cch];
  1286.                     strcpy(tName[i],tsz[i]);
  1287.                 } else {
  1288.                     // pDataには縦横入っているが片方のみ使用
  1289.                     pData[i] = pData[i * 2];
  1290.                     //
  1291.                     tName[i] = &pName[i * cch];
  1292.                     sprintf(tName[i],"%d dpi",pData[i]);
  1293.                 }
  1294.             }
  1295.             tName[n] = NULL;
  1296.             //
  1297.             if (sb) {
  1298.                 sbInitForDialogSelect(sb,tName,pData);
  1299.             } else {
  1300.                 sb = dialogSelectIDInit(hd,tName,pData);
  1301.             }
  1302.         }
  1303.         memFree(pName);
  1304.         memFree(tName);
  1305.     }
  1306.     memFree(pData);
  1307.     return sb;
  1308. }
  1309.  
  1310. //2.00E 
  1311. // sb==NULL: sbを作成
  1312. static HSTRBLK makePapersize(HDIALOG hd,LPRINT* lp,HSTRBLK sb)
  1313. {
  1314.     #ifndef CCHPAPERNAME
  1315.         #define CCHPAPERNAME    64
  1316.     #endif
  1317.     int n = lpCap(lp,DC_PAPERNAMES,0);
  1318.     mchar* pName = memAlloc(n * CCHPAPERNAME);
  1319.     mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
  1320.     WORD* pData = memAlloc(n * sizeof(WORD));
  1321.     DWORD* tData = memAlloc((n + 1) * sizeof(DWORD));
  1322.     
  1323.     if (tName && pName) {
  1324.         lpCap(lp,DC_PAPERNAMES,pName);
  1325.         lpCap(lp,DC_PAPERS,(LPSTR)pData);
  1326.         int i;
  1327.         for (i = 0;i < n;i++) {
  1328.             tName[i] = &pName[i*CCHPAPERNAME];
  1329.             tData[i] = pData[i];
  1330.         }
  1331.         tName[n] = NULL;
  1332.         //
  1333.         if (sb) {
  1334.             sbInitForDialogSelect(sb,tName,tData);
  1335.         } else {
  1336.             sb = dialogSelectIDInit(hd,tName,tData);
  1337.         }
  1338.     }
  1339.     memFree(pName);
  1340.     memFree(tName);
  1341.     memFree(pData);
  1342.     memFree(tData);
  1343.     return sb;
  1344. }
  1345.  
  1346. //2.00E 
  1347. // sb==NULL: sbを作成
  1348. static HSTRBLK makeBin(HDIALOG hd,LPRINT* lp,HSTRBLK sb)
  1349. {
  1350.     #ifndef CCHBINNAME
  1351.         #define CCHBINNAME    24
  1352.     #endif
  1353.     int n = lpCap(lp,DC_BINNAMES,0);
  1354.     mchar* pName = memAlloc(n * CCHBINNAME);
  1355.     mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
  1356.     WORD* pData = memAlloc(n * sizeof(WORD));
  1357.     DWORD* tData = memAlloc((n + 1) * sizeof(DWORD));
  1358.     
  1359.     if (tName && pName) {
  1360.         lpCap(lp,DC_BINNAMES,pName);
  1361.         lpCap(lp,DC_BINS,(LPSTR)pData);
  1362.         int i;
  1363.         for (i = 0;i < n;i++) {
  1364.             tName[i] = &pName[i*CCHBINNAME];
  1365.             tData[i] = pData[i];
  1366.         }
  1367.         tName[n] = NULL;
  1368.         //
  1369.         if (sb) {
  1370.             sbInitForDialogSelect(sb,tName,tData);
  1371.         } else {
  1372.             sb = dialogSelectIDInit(hd,tName,tData);
  1373.         }
  1374.     }
  1375.     memFree(pName);
  1376.     memFree(tName);
  1377.     memFree(pData);
  1378.     memFree(tData);
  1379.     return sb;
  1380. }
  1381.  
  1382. //2.00E 
  1383. static void lpTerm(LPRINT* lp)
  1384. {
  1385.     if (lp->hDevNames) {
  1386.         GlobalFree(lp->hDevNames);
  1387.         lp->hDevNames = 0;
  1388.     }
  1389.     if (lp->hDevMode) {
  1390.         GlobalFree(lp->hDevMode);
  1391.         lp->hDevMode = 0;
  1392.     }
  1393. }
  1394.  
  1395. // プリンタ名をlp->hDevNamesにセットし、そのDevModeをlp->hDevModeにセットする
  1396. //2.00E 
  1397. static void lpInit(LPRINT* lp)
  1398. {
  1399.     lpTerm(lp);
  1400.     txLpOp(text,TXLPOP_GET_DEVMODE);
  1401. }
  1402.  
  1403. //2.00E 
  1404. static mchar* captionGet(mchar* szCaption)
  1405. {
  1406.     static mchar buff[CCHPATHNAME];
  1407.     strcpy(buff,"印刷スタイルの設定 - ");
  1408.     strcat(buff,szCaption);
  1409.     return buff;
  1410. }
  1411.  
  1412. extern "config" void TXAPI txuiConfigStyleEx(TX* text);//2.00E2 
  1413.  
  1414. static void toTszlpstyle(TX* text)
  1415. {
  1416. //3.00A3 970508 new
  1417.     int mode = text->dispstylemode;
  1418.     if (text->tszlpstyle) strcpy(text->tszlpstyle + mode * CCHLPSTYLE,text->szlpstyle);
  1419. }
  1420.  
  1421. static void saveto(HWND hwnd,TX* text,mchar* szstyle)
  1422. {
  1423.     LPRINT* lp = text->lp;
  1424.     txConfigOp(text,TXCONFIGOP_PRINTWRITE,(LPVOID)szstyle);
  1425.     strcpymax(lp->szstyle,szstyle,CCHLPSTYLE);
  1426.     strcpy(text->szlpstyle,lp->szstyle);toTszlpstyle(text);
  1427.     SetWindowText(hwnd,captionGet(szstyle));
  1428. }
  1429.  
  1430. static int _ipageConfig;
  1431.  
  1432. static FONTSTYLE* fontstyleGet(TX* text,int ifonttx)
  1433. {
  1434. //2.96 970205 ifonttx:FONTTX_BODY - FONTTX_H6のみ対応
  1435.     LPRINT* lp = text->lp;
  1436.     if (txGetUsePrintFontstyle(text)) {
  1437.         return &lp->tFontstyle[ifonttx - FONTTX_BODY];
  1438.     } else {
  1439.         return &text->tFontstyle[ifonttx];
  1440.     }
  1441. }
  1442.  
  1443. static BBOOL *fHeadFontAutoGet(TX* text)
  1444. {
  1445.     LPRINT* lp = text->lp;
  1446.     if (txGetUsePrintFontstyle(text)) {
  1447.         return &lp->fHeadFontAuto;
  1448.     } else {
  1449.         return &text->fHeadFontAuto;
  1450.     }
  1451. }
  1452.  
  1453. static void FlushPropFont(TX* text,HDIALOG hd,int id,BOOL fProp)
  1454. {
  1455.     FONTNAMES* fontnames = fontnamesFromId(hd,id);
  1456.     if (fontnames) {
  1457.         LPRINT* lp = text->lp;
  1458.         // txLpOpでLPSTYLEがロードされないように
  1459.         lp->fNoLoadConfig++;
  1460.         {
  1461.             HDC hdcTmp = txLpOp(text,TXLPOP_GETIC);
  1462.             fontnames->lfPitch = fProp ? DEFAULT_PITCH : FIXED_PITCH;
  1463.             fontnames->hdcPrinter = hdcTmp;
  1464.             fontnamesFlush(fontnames);
  1465.             txLpOp(text,TXLPOP_RELEASEIC);    // release hdcTmp
  1466.             dialogWriteItem(hd,id);
  1467.         }
  1468.         lp->fNoLoadConfig--;
  1469.     }
  1470. }
  1471.  
  1472. #if 0//2.99C 970323 
  1473. static void EnableDlgItem(HWND hwnd,int id,BOOL fEnable)
  1474. {
  1475. #if 1//2.99B 970321 
  1476.     HWND hctrl = GetDlgItem(hwnd,id);
  1477.     if (hctrl) EnableWindow(hctrl,fEnable);
  1478. #else
  1479.     EnableWindow(GetDlgItem(hwnd,id),fEnable);
  1480. #endif
  1481. }
  1482. #endif
  1483.  
  1484. static void txFlushHeadFontAuto(TX* text)
  1485. {
  1486.     LPRINT* lp = text->lp;
  1487.     if (*fHeadFontAutoGet(text)) {
  1488.         FONTSTYLE *fsBody = fontstyleGet(text,FONTTX_BODY);
  1489.         FONTSTYLE *fsH1 = fontstyleGet(text,FONTTX_H1);
  1490.         for (int i = FONTTX_H2;i <= FONTTX_H6;i++) {
  1491.             FONTSTYLE* fs = fontstyleGet(text,i);
  1492.             *fs = *fsH1;
  1493.             for (int ifont = IFONT_STD;ifont <= IFONT_ANK;ifont++) {
  1494.                 int dh = fsH1->tlfHeight[ifont] - fsBody->tlfHeight[ifont];
  1495.                 int n = 5 - (i - FONTTX_H1);
  1496.                 fs->tlfHeight[ifont] = fsBody->tlfHeight[ifont] + (dh * n) / 5;
  1497.             }
  1498.         }
  1499.     }
  1500. }
  1501.  
  1502. static BOOL dialogaLpstyleDelete(mchar* szstyle)
  1503. {
  1504.     HDIALOG hd = dialog("印刷スタイルの削除");
  1505.     int mode = 0;
  1506.     dialogControlRadioV(hd);
  1507.     dialogRadioID(hd,&mode,
  1508.         "印刷スタイル("+szstyle+")を削除",
  1509.         "全ての印刷スタイルを削除して初期化"
  1510.     );
  1511.     //2.00B 印刷:印刷スタイルの削除が実装されていなかった
  1512.     if (dialogOpen(hd)) {
  1513.         switch(mode) {
  1514.             case 0: {
  1515.                 txConfigOp(text,TXCONFIGOP_PRINTDEL,(LPVOID)szstyle);
  1516.                 break;
  1517.             }
  1518.             case 1: {
  1519.                 txConfigOp(text,TXCONFIGOP_PRINTDELALL,NULL);
  1520.                 break;
  1521.             }
  1522.         }
  1523.         return TRUE;
  1524.     }
  1525.     return FALSE;
  1526. }
  1527.  
  1528. BOOL dlgprocConfigDetail(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  1529. {
  1530.     HDIALOG hd = dialogFromHwndPshpage(hwnd);
  1531.     HDIALOG hd0 = (LPVOID)dialogGetCustdata(hd);
  1532.     LPRINT* lp = (LPVOID)dialogGetCustdata(hd0);
  1533.     TX* text = lp ? lp->text : NULL;
  1534.     
  1535.     switch(message) {
  1536.         case WM_INITDIALOG: {
  1537.             HWND hctrl = GetDlgItem(hwnd,IDD_SHEETLIST);
  1538.             txConfigOp(text,TXCONFIGOP_PRINTENUMLB,(LPVOID)hctrl);
  1539.             SendMessage(hctrl,LB_SETCURSEL,
  1540.                 SendMessage(hctrl,LB_FINDSTRINGEXACT,-1,(LPARAM)lp->szstyle),0
  1541.             );
  1542.             break;
  1543.         }
  1544.         case WM_COMMAND: {
  1545.             int id = WM_COMMAND_GetId(wParam);
  1546.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  1547.             switch(id) {
  1548.                 case IDD_DELETE:
  1549.                 case IDOK: {
  1550.                     mchar szstyle[CCHLPSTYLE];
  1551.                     HWND hctrl = GetDlgItem(hwnd,IDD_SHEETLIST);
  1552.                     int isel = ListBox_GetCurSel(hctrl);
  1553.                     if (listboxGetItemText(hctrl,isel,szstyle,CCHLPSTYLE)) {
  1554.                         if (id == IDOK) {
  1555.                             if (stricmp(text->szlpstyle,szstyle)) {
  1556.                                 strcpy(text->szlpstyle,szstyle);toTszlpstyle(text);
  1557.                                 txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)szstyle);
  1558.                             }
  1559.                         } else {
  1560.                             if (dialogaLpstyleDelete(szstyle)) {
  1561.                                 txConfigOp(text,TXCONFIGOP_PRINTENUMLB,(LPVOID)hctrl);
  1562.                                 ListBox_SetCurSel(hctrl,isel);
  1563.                             }
  1564.                             return TRUE;
  1565.                         }
  1566.                     }
  1567.                     break;
  1568.                 }
  1569.             }
  1570.             break;
  1571.         }
  1572.     }
  1573.     return FALSE;
  1574. }
  1575.  
  1576. static void dlgConfigFlushPreview(TX* text,HDIALOG hd,int ipage)
  1577. {
  1578.     int idPreview = 0;
  1579.     switch(ipage) {
  1580.         case 0: idPreview = IDD_PREVIEW1;break;
  1581.         case 1: idPreview = IDD_PREVIEW2;break;
  1582.         case 3: idPreview = IDD_PREVIEW3;break;
  1583.     }
  1584.     if (idPreview) {
  1585.         HDIALOG h = dialogGetPshpageDialog(hd,ipage);
  1586.         if (h) {
  1587.             FlushPreview(text,dialogGetWindow(h),idPreview);
  1588.         }
  1589.     }
  1590. }
  1591.  
  1592. BOOL dlgprocConfig(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  1593. {
  1594.     HDIALOG hd0 = dialogFromHwndPshbase(hwnd);    // プロパティシートのベースのHDIALOG
  1595.     HDIALOG hd = dialogFromHwndPshpage(hwnd);    // 現在のページのHDIALOG
  1596.     LPRINT* lp = (LPVOID)dialogGetCustdata(hd0);
  1597.     TX* text = lp ? lp->text : NULL;
  1598.     //
  1599.     switch(message) {
  1600.         case WM_INITDIALOG: {
  1601.             myPostMessage(hwnd,WM_TXUSER,0,0);//2.00E
  1602.             break;
  1603.         }
  1604.         case WM_TXDIALOGPAGECHANGED: {
  1605.             PostMessage(hwnd,WM_TXUSER,0,1);//2.96 970204 
  1606.             break;
  1607.         }
  1608.         case WM_COMMAND: {
  1609.             int id = WM_COMMAND_GetId(wParam);
  1610.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  1611.             int iPage = dialogGetPage(hd0);
  1612.             
  1613.             myPostMessage(hwnd,WM_TXUSER,id,0);//2.00D 
  1614.             switch(id) {
  1615.                 case IDD_DEFAULT_PRINTER:
  1616.                 case IDD_DEFAULT_PRINTER + 1:
  1617.                 case IDD_PRINTER_LIST: {//2.00E 
  1618.                     myPostMessage(hwnd,WM_TXUSER+1,0,0);
  1619.                     break;
  1620.                 }
  1621.                 case IDD_FOOTERSTR:
  1622.                 case IDD_HEADERSTR:
  1623.                 case IDD_FOOTER2STR:
  1624.                 case IDD_HEADER2STR: {
  1625.                     HDIALOG hd = dialog("ヘッダ・フッタのマクロ記号の挿入");
  1626.                     static mchar *tsz[] = {
  1627.                         "ファイル名",\"\filename",
  1628.                         "フルパスファイル名",\"\fullname",
  1629.                         "印刷開始日付",\"\date",
  1630.                         "印刷開始時刻",\"\time",
  1631.                         "ページ数",\"\page",
  1632.                         "総ページ数",\"\allpages",
  1633.                         "ファイルの日付",\"\filedate",
  1634.                         "ファイルの時刻",\"\filetime",
  1635.                         "柱1",\"\title1",    //2.96A 970214 柱 追加
  1636.                         "柱2",\"\title2",
  1637.                         "柱3",\"\title3",
  1638.                     };
  1639.                     int iform = 0;
  1640.                     dialogSelectID(hd,"マクロ記号(&M):",&iform,16,20,
  1641.                         tsz[0],
  1642.                         tsz[2],
  1643.                         tsz[4],
  1644.                         tsz[6],
  1645.                         tsz[8],
  1646.                         tsz[10],
  1647.                         tsz[12],
  1648.                         tsz[14],
  1649.                         tsz[16],
  1650.                         tsz[18],
  1651.                         tsz[20]
  1652.                     );
  1653.                     if (dialogOpen(hd)) {
  1654.                         mchar* sz = tsz[iform * 2 + 1];
  1655.                         Edit_ReplaceSel(GetDlgItem(hwnd,id-1),sz);
  1656.                     }
  1657.                     return TRUE;
  1658.                 }
  1659.                 case IDD_DELETE: {
  1660.                     if (dialogaLpstyleDelete(lp->szstyle)) {
  1661.                         PostMessage(hwnd,WM_TXDIALOGCLOSE,0,0);//閉じる
  1662.                     }
  1663.                     return TRUE;
  1664.                 }
  1665.                 case IDD_SAVETOTEMP: {
  1666.                     //2.96 970204 印刷スタイルの設定:一時設定を追加
  1667. //information("%d %d %d %d",dialogGetBaseWindow(hd),dialogGetBaseWindow(hd0),hd,hd0);
  1668.                     dialogRead(hd0);//2.99D 970331 一時設定で、用紙の置き方を変えられなかった
  1669.                     saveto(dialogGetBaseWindow(hd0),text,"一時設定");
  1670.                     PostMessage(hwnd,WM_TXDIALOGCLOSE,IDOK,0);//閉じる
  1671.                     return TRUE;
  1672.                 }
  1673.                 case IDD_LOAD: {
  1674.                     HDIALOG hd = dialog("印刷スタイルの読み込み");
  1675.                     int lcx = 16;
  1676.                     int mode = 0;
  1677.                     DTRECT r;
  1678.                     
  1679.                     dialogSetHookEx(hd,"\m.dlgprocConfigDetail");
  1680.                     dialogSetCustdata(hd,(DWORD)hd0);
  1681.                     dialogSetContexthelp(hd,TRUE);
  1682.                     
  1683.                     dialogCaption(hd,"一覧:");
  1684.                     dialogGetPos(hd,&r);
  1685.                     r.cx = DTCX * 30;
  1686.                     r.cy = DTCY * 14;
  1687.                     dialogControlHelp(hd,357);
  1688.                     __dialogAddItem(hd,"LISTBOX",NULL,IDD_SHEETLIST,&r,LBS_NOTIFY|LBS_SORT|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP|WS_BORDER);
  1689.                     _dialogAddControlInfo(hd,IDD_SHEETLIST);
  1690.                     r.y += r.cy + DTCYINT;
  1691.                     dialogSetPos(hd,&r);
  1692.                     dialogLFV(hd);
  1693.                     
  1694.                     dialogOK(hd,lcx);
  1695.                     dialogCancel(hd,lcx);
  1696.                     dialogSpaceV(hd);
  1697.                     
  1698.                     dialogControlID(hd,IDD_DELETE);
  1699.                     dialogControlHelp(hd,354);
  1700.                     dialogCmd(hd,"削除(&D)...",lcx);
  1701.                     
  1702.                     if (dialogOpen(hd)) {
  1703.                         dialogWrite(hd0);
  1704.                         // 読み込むと画面に設定の一部が反映されるので、閉じてしまう
  1705.                         PostMessage(hwnd,WM_TXDIALOGCLOSE,IDOK,0);
  1706.                     }
  1707.                     // キャプションを更新する
  1708.                     SetWindowText(dialogGetBaseWindow(hd0),captionGet(lp->szstyle));
  1709.                     return TRUE;
  1710.                 }
  1711.                 case IDD_SAVETO: {
  1712. #if 1//2.00E 印刷スタイルの「名前を付けて保存」を改良
  1713.                     int ret = IDYES;
  1714.                     txstr szstyle = lp->szstyle;
  1715.                     do {
  1716.                         ret = IDYES;
  1717.                         HDIALOG hd = dialog("名前を付けて保存");
  1718.                         dialogStr(hd,"印刷スタイル名:",szstyle,14,30);
  1719.                         if (dialogOpen(hd)) {
  1720.                             dialogRead(hd0);
  1721.                             txFlushHeadFontAuto(text);
  1722.                             if (txConfigOp(text,TXCONFIGOP_PRINTEXIST,(LPVOID)szstyle)) {
  1723.                                 ret = question("印刷スタイル %s は存在します。上書きして良いですか?",szstyle);
  1724.                             }
  1725.                             if (ret == IDYES) {//2.96 970206 IDNO -> IDYES 上書きできなかった
  1726.                                 saveto(dialogGetBaseWindow(hd0),text,szstyle);
  1727.                             }
  1728.                         } else {
  1729.                             ret = IDCANCEL;
  1730.                         }
  1731.                     } while(ret == IDNO);
  1732.                     if (ret == IDYES) PostMessage(hwnd,WM_TXDIALOGCLOSE,IDOK,0);//閉じる
  1733.                     return TRUE;
  1734. #else
  1735.                     HDIALOG hd = dialog("名前を付けて保存");//2.00C 
  1736.                     txstr szstyle = lp->szstyle;
  1737.                     dialogStr(hd,"印刷スタイル名:",szstyle,14,30);
  1738.                     if (dialogOpen(hd)) {
  1739.                         dialogRead(hd0);
  1740.                         txFlushHeadFontAuto(text);
  1741.                         txConfigOp(text,TXCONFIGOP_PRINTWRITE,(LPVOID)szstyle);
  1742.                     }
  1743.                     return TRUE;
  1744. #endif
  1745.                 }
  1746.                 case IDD_STYLE: {//2.00C 
  1747.                     //2.00E2 
  1748.                     dialogRead(hd0);
  1749.                     txuiConfigStyleEx(text);
  1750.                     myPostMessage(hwnd,WM_TXUSER,0,0);
  1751.                     return TRUE;
  1752.                 }
  1753.             }
  1754.             break;
  1755.         }
  1756.         case WM_TXUSER: {
  1757.             _fInTxuser = TRUE;
  1758.             int id = wParam;
  1759.             BOOL fPageChanged = lParam;
  1760.             _ipageConfig = dialogGetPage(hd0);
  1761.             switch(_ipageConfig) {
  1762.                 case 0: {
  1763.                     BOOL fText = IsDlgButtonChecked(hwnd,IDD_TEXTLXLY_ENABLE);
  1764.                     BOOL fTextHeight = (fText && (text->height != 0));
  1765.                     // width
  1766.                     EnableWindow(GetDlgItem(hwnd,IDD_WIDTH_ENABLE),!fText);
  1767.                     EnableWindow(
  1768.                         GetDlgItem(hwnd,IDD_WIDTH),
  1769.                         !fText && IsDlgButtonChecked(hwnd,IDD_WIDTH_ENABLE)
  1770.                     );
  1771.                     // height
  1772.                     BOOL fEnableHeight = IsDlgButtonChecked(hwnd,IDD_HEIGHT_ENABLE);
  1773.                     EnableWindow(GetDlgItem(hwnd,IDD_HEIGHT_ENABLE),!fTextHeight);
  1774.                     EnableWindow(
  1775.                         GetDlgItem(hwnd,IDD_HEIGHT),
  1776.                         !fTextHeight && fEnableHeight
  1777.                     );
  1778.                     // 行間
  1779.                     BOOL fEnableLineint = IsDlgButtonChecked(hwnd,IDD_LINEINT_ENABLE);
  1780.                     if (!fTextHeight) {
  1781.                         if (!fEnableHeight) fEnableLineint = TRUE;
  1782.                     }
  1783.                     EnableWindow(
  1784.                         GetDlgItem(hwnd,IDD_LINEINT),
  1785.                         fEnableLineint
  1786.                     );
  1787.                     //
  1788.                     EnableWindow(GetDlgItem(hwnd,IDD_CLM),!fText);
  1789. #if 1//2.99D 970402 
  1790.     #if 1//2.99E 970403 
  1791.                     dialogRead(hd);
  1792.                     EnableDlgItem(hwnd,text->fVertical?IDD_MARGIN_BOTTOM:IDD_MARGIN_RIGHT,!fText&&!lp->fLxPage);
  1793.                     EnableDlgItem(hwnd,text->fVertical?IDD_MARGIN_LEFT:IDD_MARGIN_BOTTOM,((!fTextHeight&&!lp->fLyPage) || !fEnableLineint));
  1794.     #else
  1795.                     dialogRead(hd);
  1796.                     EnableDlgItem(hwnd,text->fVertical?IDD_MARGIN_BOTTOM:IDD_MARGIN_RIGHT,!lp->fLxPage);
  1797.                     EnableDlgItem(hwnd,text->fVertical?IDD_MARGIN_LEFT:IDD_MARGIN_BOTTOM,!lp->fLyPage || !fEnableLineint);
  1798.     #endif
  1799. #else
  1800.                     //2.96A 970214 Margin
  1801.                     dialogRead(hd);
  1802.                     EnableDlgItem(hwnd,IDD_MARGIN_RIGHT,!lp->fLxPage);
  1803.                     EnableDlgItem(hwnd,IDD_MARGIN_BOTTOM,!lp->fLyPage || !fEnableLineint);
  1804. #endif
  1805.                     break;
  1806.                 }
  1807.                 case 1: {
  1808.                     BOOL fTo = FALSE;    // プロポーショナルON/OFFでフォント名が変化する可能性が
  1809.                                         // あるときにTRUEにして、設定値を更新する
  1810.                     // [1]dialogReadする
  1811.                     dialogRead(hd);
  1812.                     // [2]プリンタの設定/textの設定切り替え
  1813.                     if (id == IDD_USEPRINTFONT || id == IDD_USEPRINTFONT + 1) {
  1814.                         lp->fHeadFontAutoTemp = *fHeadFontAutoGet(text);
  1815.                         {
  1816.                             for (int i = 0;i < 2;i++) {
  1817.                                 lp->fontstyleTemp[i] = *fontstyleGet(text,i == 0 ? FONTTX_BODY : FONTTX_H1);
  1818.                                 FlushPropFont(text,hd,lp->idTemp[i][IFONT_STD],text->lfProp);
  1819.                                 FlushPropFont(text,hd,lp->idTemp[i][IFONT_ANK],text->lfProp);
  1820.                             }
  1821.                         }
  1822. //information("%d",lp->fUsePrintFontstyle);
  1823.                         dialogWrite(hd);
  1824.                         fTo = TRUE;
  1825.                     }
  1826.                     // [3]fontstyle ([1],[2]の影響を受けることがある)
  1827.                     for (int i = 0;i < 2;i++) {
  1828.                         for (int ifont = IFONT_STD;ifont <= IFONT_ANK;ifont++) {
  1829.                             int id1 = lp->idTemp[i][ifont];
  1830.                             if (
  1831.                                 id == id1 ||        // fontname
  1832.                                 id == id1 + 1 ||    // fontsize
  1833.                                 fTo
  1834.                             ) {
  1835.                                 // 現在の設定値をtext or lpの設定にコピー
  1836.                                 *fontstyleGet(text,i == 0 ? FONTTX_BODY : FONTTX_H1) = lp->fontstyleTemp[i];
  1837.                             }
  1838.                         }
  1839.                     }
  1840.                     //
  1841.                     if (id == IDD_HEADFONTAUTO) {
  1842.                         BOOL f = IsDlgButtonChecked(hwnd,IDD_HEADFONTAUTO);
  1843.                         *fHeadFontAutoGet(text) = lp->fHeadFontAutoTemp = f;
  1844.                     }
  1845.                     //
  1846.                     if (text->fPlaintext) {
  1847.                         //3.00B1 970523 
  1848.                     } else {
  1849.                         BOOL f = IsDlgButtonChecked(hwnd,IDD_HEADFONTAUTO);
  1850.                         EnableDlgItem(hwnd,lp->idTemp[1][IFONT_STD],f);
  1851.                         EnableDlgItem(hwnd,lp->idTemp[1][IFONT_STD]+1,f);
  1852.                         EnableDlgItem(hwnd,lp->idTemp[1][IFONT_ANK],f);
  1853.                         EnableDlgItem(hwnd,lp->idTemp[1][IFONT_ANK]+1,f);
  1854.                         EnableDlgItem(hwnd,IDD_STYLE,!f);
  1855.                     }
  1856.                     break;
  1857.                 }
  1858.                 case 3: {
  1859.                     BOOL f = IsDlgButtonChecked(hwnd,IDD_USERPAPER);
  1860.                     EnableDlgItem(hwnd,IDD_USERPAPERX,f);
  1861.                     EnableDlgItem(hwnd,IDD_USERPAPERY,f);
  1862.                     EnableDlgItem(hwnd,IDD_SIZELIST,!f);
  1863.                     break;
  1864.                 }
  1865.                 case 4: {
  1866.                     BOOL f2 = IsDlgButtonChecked(hwnd,IDD_HEADER2SPECIFY);
  1867.                     BOOL f = IsDlgButtonChecked(hwnd,IDD_HEADERPRINT);
  1868.                     EnableDlgItem(hwnd,IDD_HEADER,f);
  1869.                     EnableDlgItem(hwnd,IDD_HEADER2,f && f2);
  1870.                     f = IsDlgButtonChecked(hwnd,IDD_FOOTERPRINT);
  1871.                     EnableDlgItem(hwnd,IDD_FOOTER,f);
  1872.                     EnableDlgItem(hwnd,IDD_FOOTER2,f && f2);
  1873.                     break;
  1874.                 }
  1875.             }
  1876.             if (id == IDD_FSTYLECALC) {
  1877.                 BOOL fCalcStyle = IsDlgButtonChecked(hwnd,id);
  1878.                 // 全てのページのプレビューチェックボックスに反映
  1879.                 dialogRead(hd0);
  1880.                 _fCalcStyle = fCalcStyle;
  1881.                 dialogWrite(hd0);
  1882.                 // プレビューを更新
  1883.                 for (int ipage = 0;ipage <= 4;ipage++) {
  1884.                     dlgConfigFlushPreview(text,hd,ipage);
  1885.                 }
  1886.             }
  1887.             if (fPageChanged) {
  1888.                 //2.96 970204 タブの切り替えではプレビューを更新しない。for 切り替え速度アップ
  1889.             } else {
  1890.                 dlgConfigFlushPreview(text,hd,_ipageConfig);
  1891.             }
  1892.             //2.00E 
  1893.             EnableDlgItem(hwnd,IDD_PRINTER_LIST,!IsDlgButtonChecked(hwnd,IDD_DEFAULT_PRINTER));
  1894.             //
  1895.             _fInTxuser = FALSE;
  1896.             break;
  1897.         }
  1898.         case WM_TXUSER+1: {
  1899.             //2.00E 
  1900.             dialogRead(hd0);
  1901.             {
  1902.                 // hDevModeを変更するとWZ16のCOMMDLGでアプリエラーになる
  1903.                 HANDLE hDevMode = lp->hDevMode;lp->hDevMode = NULL;
  1904.                 HANDLE hDevNames = lp->hDevNames;lp->hDevNames = NULL;
  1905.                 lpInit(lp);
  1906.                 {
  1907.                     HDIALOG hd = dialogSearchDialog(hd0,IDD_RESLIST);
  1908.                     if (hd) {
  1909.                         HSTRBLK sb = dialogGetSb(hd,IDD_RESLIST);
  1910.                         makeResolution(NULL,lp,sb);
  1911.                         dialogWriteItem(hd,IDD_RESLIST);
  1912.                     }
  1913.                     //
  1914.                     hd = dialogSearchDialog(hd0,IDD_SIZELIST);
  1915.                     if (hd) {
  1916.                         HSTRBLK sb = dialogGetSb(hd,IDD_SIZELIST);
  1917.                         makePapersize(NULL,lp,sb);
  1918.                         dialogWriteItem(hd,IDD_SIZELIST);
  1919.                     }
  1920.                     //
  1921.                     hd = dialogSearchDialog(hd0,IDD_BINLIST);
  1922.                     if (hd) {
  1923.                         HSTRBLK sb = dialogGetSb(hd,IDD_BINLIST);
  1924.                         makeBin(NULL,lp,sb);
  1925.                         dialogWriteItem(hd,IDD_BINLIST);
  1926.                     }
  1927.                 }
  1928.                 lpTerm(lp);
  1929.                 lp->hDevMode = hDevMode;
  1930.                 lp->hDevNames = hDevNames;
  1931.             }
  1932.             break;
  1933.         }
  1934.     }
  1935.     return FALSE;
  1936. }
  1937.  
  1938. static void dialogAddChooseFontHeader(HDIALOG hd,LPRINT*lp,FONTSTYLE* fs)
  1939. {
  1940.     SELFONTARG arg;
  1941.     structClear(arg);
  1942.     arg.lfPitch = DEFAULT_PITCH;
  1943.     dialogSetH(hd);
  1944.         arg.lfCharSet = SHIFTJIS_CHARSET;
  1945.         dialogSelectFont(
  1946.             hd,
  1947.             NULL,
  1948.             14,
  1949.             fs->tlfFaceName[IFONT_STD],
  1950.             &fs->tlfHeight[IFONT_STD],
  1951.             &arg
  1952.         );
  1953.         dialogLF(hd);
  1954.     dialogSetV(hd);
  1955. }
  1956.  
  1957. DWORD convprocMcm(DWORD data,int mode)
  1958. {
  1959.     if (mode == TXDIALOG_READ) {
  1960.         return data * 10;
  1961.     } else {
  1962.         return data / 10;
  1963.     }
  1964. }
  1965.  
  1966. static void dialogGroupEndCheck(HDIALOG hd,mchar *szcaption,BOOL *data)
  1967. {
  1968.     DTRECT r;
  1969.     dialogGroupEndGetRect(hd,&r);
  1970.     DTRECT r1 = r;
  1971.     r.x += DTCX;
  1972.     dialogSetPos(hd,&r);
  1973.     dialogCheck(hd,szcaption,data);
  1974.     r1.y += r1.cy;
  1975.     dialogSetPos(hd,&r1);
  1976. }
  1977.  
  1978. //2.00D 
  1979. static void dialogAddPreview(HDIALOG hd,int id,TX* text)
  1980. {
  1981. #ifndef __FLAT__
  1982.     //3.00A 970502 WZ16 stack over対策のため、印刷スタイルの"計算"機能は外した
  1983.     return;
  1984. #else
  1985.     int lxg = 14;
  1986.     dialogLFV(hd);
  1987.     dialogSetGroupRight(hd,0);
  1988.     dialogGroup(hd,"");
  1989.     //
  1990.     dialogControlID(hd,IDD_DISP_WIDTH);
  1991.     dialogControlHelp(hd,330);
  1992.     dialogControlEnable(hd,FALSE);
  1993.     dialogControlGuide(hd,"文字(半角)",10);
  1994.     dialogStrC(hd,"1行の文字数:","",lxg,1,5);
  1995.     //
  1996.     dialogControlID(hd,IDD_DISP_HEIGHT);
  1997.     dialogControlHelp(hd,332);
  1998.     dialogControlEnable(hd,FALSE);
  1999.     dialogControlGuide(hd,"行",6);
  2000.     dialogStrC(hd,"1ページの行数:","",lxg,1,5);
  2001.     //
  2002.     dialogControlID(hd,IDD_DISP_LINEINT);
  2003.     dialogControlHelp(hd,332);
  2004.     dialogControlEnable(hd,FALSE);
  2005.     dialogControlGuide(hd,"0.1mm",6);
  2006.     dialogStrC(hd,"行間:","",lxg,1,5);
  2007.     //
  2008.     dialogControlID(hd,IDD_DISP_CLM);
  2009.     dialogControlHelp(hd,332);
  2010.     dialogControlEnable(hd,FALSE);
  2011.     dialogControlGuide(hd,"段",6);
  2012.     dialogStrC(hd,"段組:","",lxg,1,5);
  2013.     //
  2014.     dialogControlID(hd,IDD_DISP_RIGHT);
  2015.     dialogControlHelp(hd,331);
  2016.     dialogControlEnable(hd,FALSE);
  2017.     dialogControlGuide(hd,"mm",6);
  2018. #if 1//2.99D 970402 
  2019.     dialogStrC(hd,text->fVertical ? "下余白" : "右余白:","",lxg,1,5);
  2020. #else
  2021.     dialogStrC(hd,text->fVertical ? "左マージン" : "右マージン:","",lxg,1,5);
  2022. #endif
  2023.     //
  2024.     dialogControlID(hd,IDD_DISP_BOTTOM);
  2025.     dialogControlHelp(hd,333);
  2026.     dialogControlEnable(hd,FALSE);
  2027.     dialogControlGuide(hd,"mm",6);
  2028. #if 1//2.99D 970402 
  2029.     dialogStrC(hd,text->fVertical ? "左余白" : "下余白:","",lxg,1,5);
  2030. #else
  2031.     dialogStrC(hd,"下マージン:","",lxg,1,5);
  2032. #endif
  2033.     //
  2034.     DTRECT r;
  2035.     dialogGetPos(hd,&r);
  2036.     r.cx = 0;
  2037.     r.cy = 0;
  2038.     __dialogAddItem(hd,TXWS_SZCLASS,"",id,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_CHILD|WS_VISIBLE|(_fwin40 ? WS_BORDER : 0));
  2039.     //
  2040.     dialogControlID(hd,IDD_FSTYLECALC);
  2041.     dialogControlHelp(hd,329);
  2042.     dialogGroupEndCheck(hd,"計算",&_fCalcStyle);
  2043. #endif
  2044. }
  2045.  
  2046. static BOOL uiConfigPrint(TX* text,BOOL fSimple)
  2047. {
  2048.     txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)text->szlpstyle);//2.96 970206 
  2049.     txLpOp(text,TXLPOP_FLUSHDEVMODE);// get hDevMode
  2050.     //
  2051.     HCURSOR hcursor = LoadCursor(NULL,IDC_WAIT);//2.00C 
  2052.     hcursor = SetCursor(hcursor);//2.00C 
  2053.     LPRINT* lp = text->lp;
  2054.     //2.96 970206 backup
  2055.     LPRINT lp0 = *lp;    //2.00D backup
  2056.     FONTSTYLE text_tfontstyle0[FONTTX_N];    // backup
  2057.     memcpy(text_tfontstyle0,text->tFontstyle,SIZE_TFONTSTYLE);
  2058.     BBOOL fHeadFontAuto0 = text->fHeadFontAuto;
  2059.     //
  2060.     int lcx = DTCX * 53;
  2061.     int lxval = 5 + _fwin40 * 2;//2.95 970127 数値入力ボックスの幅
  2062. #if 01
  2063.     //2.00E プリンタ名リストセットアップ
  2064.     mchar hpnbuff[4096];
  2065.     HSTRBLK hpn = sbNew(hpnbuff,sizeof(hpnbuff));
  2066.     {
  2067.         mchar buff[4096];
  2068.         GetProfileString("devices",NULL,"",buff,sizeof(buff));
  2069.         mchar*p = buff;
  2070.         while(*p) {
  2071.             sbAdd(hpn,p);
  2072.             p += strlen(p) + 1;
  2073.         }
  2074. //information("%d,%s",sbGetCount(hpn),buff);
  2075.     }
  2076. #endif
  2077.     //
  2078.     HDIALOG hd0 = dialogbig(captionGet(lp->szstyle));//2.99D 970330 dialogbig化
  2079.     dialogSetStartPage(hd0,_ipageConfig);
  2080.     dialogSetContexthelp(hd0,TRUE);
  2081.     dialogSetCustdata(hd0,(DWORD)lp);
  2082.     PMACROFUNC pfunc;
  2083.     macroGetFuncAddress("dlgprocConfig",&pfunc);
  2084.     dialogSetHook(hd0,&pfunc);
  2085.     
  2086.     PMACROFUNC pfuncconv;
  2087.     macroGetFuncAddress("convprocMcm",&pfuncconv);
  2088.     
  2089.     HDIALOG hd = dialog("文字数・行数・余白");
  2090.         int lx = 20;
  2091.         dialogSetGroupRight(hd,lcx);
  2092.         
  2093.         dialogGroup(hd,"文字数・行数");
  2094.             //2.96 970204 文書の設定の文字数などの設定で印刷できるようにした。
  2095.             dialogControlID(hd,IDD_TEXTLXLY_ENABLE);
  2096.             dialogControlHelp(hd,491);
  2097.             dialogCheckB(hd,"「文書の設定」の文字数・行数・段組を使用(&T)",&lp->fUseTextLxLyClm);
  2098.             dialogSpaceV(hd);
  2099.             //
  2100.             dialogSetH(hd);
  2101.                 dialogControlID(hd,IDD_WIDTH_ENABLE);
  2102.                 dialogControlHelp(hd,251);
  2103.                 dialogCheckB(hd,"1行の文字数(&C):",&lp->fLxPage);
  2104.                 dialogSetPosLX(hd,lx+1);
  2105.                 dialogControlID(hd,IDD_WIDTH);
  2106.                 dialogControlHelp(hd,252);
  2107.                 dialogControlGuide(hd,"文字(半角)",10);
  2108.                 dialogControlUpdown(hd,MINWIDTH,MAXWIDTH);
  2109.                 dialogIntW(hd,NULL,&lp->lxPage,12,lxval-1);
  2110.                 dialogLF(hd);
  2111.                 //
  2112.                 dialogControlID(hd,IDD_HEIGHT_ENABLE);
  2113.                 dialogControlHelp(hd,253);
  2114.                 dialogCheckB(hd,"1ページの行数(&L):",&lp->fLyPage);
  2115.                 dialogSetPosLX(hd,lx+1);
  2116.                 dialogControlID(hd,IDD_HEIGHT);
  2117.                 dialogControlHelp(hd,254);
  2118.                 dialogControlGuide(hd,"行",2);
  2119.                 dialogControlUpdown(hd,1,LINE_N);
  2120.                 dialogIntW(hd,NULL,&lp->lyPage,12,lxval-1);
  2121.                 dialogLF(hd);
  2122.                 //
  2123.                 dialogControlID(hd,IDD_LINEINT_ENABLE);
  2124.                 dialogControlHelp(hd,492);
  2125.                 dialogCheckB(hd,"行間(&I):",&lp->fLineInt);
  2126.                 dialogSetPosLX(hd,lx+1);
  2127.                 dialogControlGuide(hd,"0.1mm",6);
  2128.                 dialogControlID(hd,IDD_LINEINT);
  2129.                 dialogControlHelp(hd,273);
  2130.                 dialogControlUpdown(hd,0,999);
  2131.                 dialogIntW(hd,NULL,&lp->mcmLineInt,lx,lxval-1);
  2132.                 dialogLF(hd);
  2133.             dialogSetV(hd);
  2134.             
  2135.             dialogControlHelp(hd,256);
  2136.             dialogControlUpdown(hd,1,9);
  2137.             dialogControlGuide(hd,"段",3);
  2138.             dialogControlID(hd,IDD_CLM);
  2139.             dialogIntW(hd,"段組(&N):",&lp->nClm,lx,lxval-1);
  2140.             //
  2141.             dialogControlGuide(hd,"mm",3);
  2142.             dialogControlConvert(hd,&pfuncconv);
  2143.             dialogControlHelp(hd,257);
  2144.             dialogControlUpdown(hd,0,100);
  2145.             dialogIntW(hd,"段間(&J):",&lp->mcmClmInt,lx,lxval-1);//2.99F 970404 &I->&J
  2146.             
  2147.         dialogGroupEnd(hd);
  2148.         
  2149.         //2.96A 970214 "用紙"タブから移動
  2150.         dialogGroup(hd,"用紙の余白");
  2151.             dialogControlConvert(hd,&pfuncconv);
  2152.             dialogControlGuide(hd,"mm",3);
  2153.             dialogControlHelp(hd,265);
  2154.             dialogControlUpdown(hd,1,999);
  2155.             dialogControlID(hd,IDD_MARGIN_UPPER);//2.99D 970402 
  2156. #if 0//2.99D 970402 
  2157.             dialogIntW(hd,text->fVertical?"右(&R)":"上(&U):",&lp->mcmMarginTop,6,lxval);
  2158. #else
  2159.             dialogIntW(hd,"上(&U):",&lp->mcmMarginTop,6,lxval);
  2160. #endif
  2161.             //
  2162.             dialogControlConvert(hd,&pfuncconv);
  2163.             dialogControlGuide(hd,"mm",3);
  2164.             dialogControlHelp(hd,266);
  2165.             dialogControlID(hd,IDD_MARGIN_BOTTOM);
  2166.             dialogControlUpdown(hd,1,999);
  2167. #if 0//2.99D 970402 
  2168.             dialogIntW(hd,text->fVertical?"左(&L)":"下(&D):",&lp->mcmMarginBottom,6,lxval);
  2169. #else
  2170.             dialogIntW(hd,"下(&D):",&lp->mcmMarginBottom,6,lxval);
  2171. #endif
  2172.             
  2173.             dialogLFV(hd);
  2174.             dialogSpaceH(hd);
  2175.             
  2176.             dialogControlConvert(hd,&pfuncconv);
  2177.             dialogControlGuide(hd,"mm",3);
  2178.             dialogControlHelp(hd,267);
  2179.             dialogControlUpdown(hd,1,999);
  2180.             dialogControlID(hd,IDD_MARGIN_LEFT);//2.99D 970402 
  2181. #if 0//2.99D 970402 
  2182.             dialogIntW(hd,text->fVertical?"上(&U):":"左(&L):",&lp->mcmMarginLeft,6,lxval);
  2183. #else
  2184.             dialogIntW(hd,"左(&M):",&lp->mcmMarginLeft,6,lxval);//2.99F 970404 &L->&M
  2185. #endif
  2186.             //
  2187.             dialogControlConvert(hd,&pfuncconv);
  2188.             dialogControlGuide(hd,"mm",3);
  2189.             dialogControlHelp(hd,268);
  2190.             dialogControlID(hd,IDD_MARGIN_RIGHT);
  2191.             dialogControlUpdown(hd,1,999);
  2192. #if 0//2.99D 970402 
  2193.             dialogIntW(hd,text->fVertical?"下(&U)":"右(&R):",&lp->mcmMarginRight,6,lxval);
  2194. #else
  2195.             dialogIntW(hd,"右(&R):",&lp->mcmMarginRight,6,lxval);
  2196. #endif
  2197.             
  2198.             dialogLF(hd);
  2199.             dialogControlHelp(hd,326);
  2200.             dialogCheckB(hd,"左右ページ対称(&S)",&lp->fMarginSymmerty);//2.99F 970404 (&S) add
  2201.         dialogGroupEnd(hd);
  2202.         
  2203.         dialogAddPreview(hd,IDD_PREVIEW1,text);
  2204.     dialogAddPage(hd0,hd);
  2205.     
  2206.     //2.00C 
  2207.     HDIALOG hd = dialog("フォント");
  2208.         dialogSetGroupRight(hd,lcx);
  2209.         dialogGroup(hd,"本文フォントと見出しフォント");
  2210.             //2.00D 
  2211.             if (text->lfWestern) {//2.96 970209 
  2212.                 dialogCaption(hd,"欧文編集では、文書の設定が使用されます");
  2213.             } else {
  2214.                 dialogControlID(hd,IDD_USEPRINTFONT);
  2215.                 dialogControlHelp(hd,-320);
  2216.                 dialogControlRadioV(hd);
  2217.                 dialogSwitchB(hd,&lp->fUsePrintFontstyle,"印刷スタイルの設定を使用(&P)","文書の設定を使用(&T)");
  2218.             }
  2219.             //2.96 970205 印刷フォントの指定を簡易にした
  2220.                 dialogSpaceV(hd);
  2221.                 dialogSpaceV(hd);
  2222.             lp->fHeadFontAutoTemp = *fHeadFontAutoGet(text);
  2223.             FONTNAMES* fontnamesStd = fontnamesNew(hd);
  2224.             FONTNAMES* fontnamesAnk = fontnamesNew(hd);
  2225.             {
  2226.                 HDC hdcTmp = txLpOp(text,TXLPOP_GETIC);
  2227.                 
  2228.                 fontnamesStd->lfPitch = text->lfProp ? DEFAULT_PITCH : FIXED_PITCH;
  2229.                 fontnamesStd->lfCharSet = text->lfWestern ? DEFAULT_CHARSET : SHIFTJIS_CHARSET;
  2230.                 fontnamesStd->hdcPrinter = hdcTmp;
  2231.                 fontnamesFlush(fontnamesStd);
  2232.                 //
  2233.                 fontnamesAnk->lfPitch = text->lfProp ? DEFAULT_PITCH : FIXED_PITCH;
  2234.                 fontnamesAnk->lfCharSet = DEFAULT_CHARSET;
  2235.                 fontnamesAnk->hdcPrinter = hdcTmp;
  2236.                 fontnamesFlush(fontnamesAnk);
  2237.                 txLpOp(text,TXLPOP_RELEASEIC);    // release hdcTmp
  2238.             }
  2239.             dialogSetH(hd);
  2240.             int i;
  2241.             for (i = 0;i < 2;i++) {
  2242.                 int lx = 20;
  2243.                 lp->fontstyleTemp[i] = *fontstyleGet(text,i == 0 ? FONTTX_BODY : FONTTX_H1);
  2244.                 FONTSTYLE* fs = &lp->fontstyleTemp[i];
  2245.                 static mchar* tszStd[] = {"本文 全角フォント(&F):","見出 全角フォント(&H):"};
  2246.                 static mchar* tszAnk[] = {"本文 半角フォント(&G):","見出 半角フォント(&I):"};
  2247.                 SELFONTARG arg;
  2248.                 structClear(arg);
  2249.                 if (_fwin40) {
  2250.                     arg.lcxFaceName = 21;
  2251.                     arg.lcxFaceSize = 7;    //2.00C 6だとWin3.1で1桁しか出ない
  2252.                 } else {
  2253.                     //2.99D 970330 Win3.1でフォントサイズ指定の"標準"が見えなかった
  2254.                     arg.lcxFaceName = 19;
  2255.                     arg.lcxFaceSize = 9;
  2256.                 }
  2257.                 //
  2258.                 dialogCaptionDynamic(hd,tszStd[i],lx-1);
  2259.                 dialogSetPosLX(hd,lx);
  2260.                 arg.fontnames = fontnamesStd;
  2261.                 dialogControlHelp(hd,282);
  2262.                 lp->idTemp[i][IFONT_STD] = dialogSelectFont(hd,NULL,0,
  2263.                     fs->tlfFaceName[IFONT_STD],
  2264.                     &fs->tlfHeight[IFONT_STD],
  2265.                     &arg
  2266.                 );
  2267.                 dialogLF(hd);
  2268.                 dialogCaptionDynamic(hd,tszAnk[i],lx-1);
  2269.                 dialogSetPosLX(hd,lx);
  2270.                 arg.lfCharSet = DEFAULT_CHARSET;
  2271.                 arg.fontnames = fontnamesAnk;
  2272.                 arg.fEnableDefaultFaceName = TRUE;
  2273.                 arg.fEnableDefaultHeight = TRUE;
  2274.                 dialogControlHelp(hd,283);
  2275.                 lp->idTemp[i][IFONT_ANK] = dialogSelectFont(hd,NULL,0,
  2276.                     fs->tlfFaceName[IFONT_ANK],
  2277.                     &fs->tlfHeight[IFONT_ANK],
  2278.                     &arg
  2279.                 );
  2280.                 dialogLF(hd);
  2281.                 if (i == 0) {
  2282.                     if (text->fPlaintext) dialogSetEnable(hd,FALSE);//3.00B1 970523 
  2283.                     //
  2284.                     dialogSpaceV(hd);
  2285.                     dialogSpaceV(hd);
  2286.                     dialogControlHelp(hd,493);
  2287.                     dialogControlID(hd,IDD_HEADFONTAUTO);
  2288.                     dialogCheckB(hd,"見出しフォントの簡易設定(&S)",&lp->fHeadFontAutoTemp);
  2289.                     dialogLF(hd);
  2290.                 }
  2291.             }
  2292.             dialogSetV(hd);
  2293.             //
  2294.             dialogControlID(hd,IDD_STYLE);
  2295.             dialogControlHelp(hd,220);
  2296.             dialogButton(hd,"高度なフォントの指定(&K)...",NULL,24);
  2297.             //
  2298.             if (text->fPlaintext) dialogSetEnable(hd,TRUE);//3.00B1 970523 
  2299.             //
  2300.             dialogSpaceV(hd);
  2301.             dialogSetIntXY(hd,0,0);
  2302.                 dialogCaption(hd,"文字の倍率(&C):");
  2303.                 dialogControlHelp(hd,258);
  2304.                 dialogRadioIntW(hd,&lp->dmScaleFont,"50%","75%","100%","125%","150%");
  2305.             dialogResetInt(hd);
  2306.         dialogGroupEnd(hd);
  2307.         
  2308.         dialogAddPreview(hd,IDD_PREVIEW2,text);
  2309.     dialogAddPage(hd0,hd);
  2310.     
  2311.     //2.96A 970214 
  2312.     HDIALOG hd = dialog("印刷");
  2313.         dialogSetGroupRight(hd,lcx);
  2314.         dialogGroup(hd,"行番号と脚注");
  2315.             dialogControlHelp(hd,255);
  2316.             dialogCheckB(hd,"行番号(&N)",&lp->fDispLineNo);
  2317.             //
  2318.             dialogControlHelp(hd,494);
  2319.             dialogSelectIDB(hd,"脚注(&F):",&lp->modePrintFootnote,19,24,"印刷しない","改ページして印刷する","文末に続けて印刷する");
  2320. #if 0//2.97A 970227 
  2321.             dialogControlHelp(hd,399);
  2322.             dialogIntB(hd,"レターヘッダの行数(&L):",&text->nparaLetterHeader,19,4);
  2323. #endif
  2324.         //2.98 970305 印刷時にレターヘッダ/レターフッタテンプレートを文書頭/末尾に挿入できるようにした
  2325.         dialogGroupEnd(hd);
  2326.         dialogGroup(hd,"テンプレート");
  2327.             dialogControlRefer(hd,"-f "+text->szexedir+"template\\*.*");
  2328.             dialogControlHelp(hd,401);
  2329.             dialogStrC(hd,"レターヘッダ(&H):",lp->szTemplateHeader,16,cchof(lp->szTemplateHeader),23);
  2330.             dialogControlRefer(hd,"-f "+text->szexedir+"template\\*.*");
  2331.             dialogControlHelp(hd,402);
  2332.             dialogStrC(hd,"レターフッタ(&O):",lp->szTemplateFooter,16,cchof(lp->szTemplateFooter),23);
  2333.         dialogGroupEnd(hd);
  2334.     dialogAddPage(hd0,hd);
  2335.     
  2336.     HDIALOG hd = dialog("用紙");
  2337.         int lx = 0;
  2338.         dialogSetGroupRight(hd,lcx);
  2339.         dialogGroup(hd,"サイズ(&S)");
  2340. #if 1//2.00E 
  2341.             HSTRBLK sb = makePapersize(hd,lp,NULL);
  2342.             if (sb) {
  2343.                 dialogControlID(hd,IDD_SIZELIST);
  2344.                 dialogControlHelp(hd,261);
  2345.                 dialogSelectW(hd,NULL,&lp->dmPaperSize,lx,32,sb);
  2346.             }
  2347. #else
  2348.             {
  2349.                 #ifndef CCHPAPERNAME
  2350.                     #define CCHPAPERNAME    64
  2351.                 #endif
  2352.                 int n = lpCap(lp,DC_PAPERNAMES,0);
  2353.                 mchar* pName = memAlloc(n * CCHPAPERNAME);
  2354.                 mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
  2355.                 WORD* pData = memAlloc(n * sizeof(WORD));
  2356.                 DWORD* tData = memAlloc((n + 1) * sizeof(DWORD));
  2357.                 
  2358.                 if (tName && pName) {
  2359.                     lpCap(lp,DC_PAPERNAMES,pName);
  2360.                     lpCap(lp,DC_PAPERS,(LPSTR)pData);
  2361.                     int i;
  2362.                     for (i = 0;i < n;i++) {
  2363.                         tName[i] = &pName[i*CCHPAPERNAME];
  2364.                         tData[i] = pData[i];
  2365.                     }
  2366.                     tName[n] = NULL;
  2367.                     //
  2368.                     HSTRBLK sb = dialogSelectIDInit(hd,tName,tData);
  2369.                     dialogControlID(hd,IDD_SIZELIST);
  2370.                     dialogControlHelp(hd,261);
  2371.                     dialogSelectW(hd,NULL,&lp->dmPaperSize,lx,32,sb);
  2372.                 }
  2373.                 memFree(pName);
  2374.                 memFree(tName);
  2375.                 memFree(pData);
  2376.                 memFree(tData);
  2377.             }
  2378. #endif
  2379.             //
  2380.             dialogIndent(hd,1);
  2381.             dialogControlID(hd,IDD_USERPAPER);
  2382.             dialogControlHelp(hd,262);
  2383.             dialogCheckB(hd,"サイズをmm単位で指定(&P)",&lp->fUserPaperSize);
  2384.             dialogIndent(hd,-1);
  2385.             //
  2386.             dialogControlConvert(hd,&pfuncconv);
  2387.             dialogControlID(hd,IDD_USERPAPERX);
  2388.             dialogControlGuide(hd,"mm",3);
  2389.             dialogControlHelp(hd,263);
  2390.             dialogControlUpdown(hd,1,999);
  2391.             dialogIntW(hd,"幅(&W):",&lp->mcmPaperWidth,9,lxval);//2.99F 970404 (&W) add,6->9
  2392.             //
  2393.             dialogControlConvert(hd,&pfuncconv);
  2394.             dialogControlID(hd,IDD_USERPAPERY);
  2395.             dialogControlGuide(hd,"mm",3);
  2396.             dialogControlHelp(hd,264);
  2397.             dialogControlUpdown(hd,1,999);
  2398.             dialogIntW(hd,"高さ(&H):",&lp->mcmPaperHeight,9,lxval);//2.99F 970404 (&H) add,6->9
  2399.         dialogGroupEnd(hd);
  2400.         
  2401.         dialogGroup(hd,"用紙");
  2402.             lx = 16;
  2403.             dialogControlHelp(hd,495);
  2404.             dialogCheckB(hd,"袋とじ(&2)",&lp->f2pages);
  2405.             {
  2406.                 static mchar* tName[] = {
  2407.                     "縦方向","横方向",NULL,
  2408.                 };
  2409.                 static DWORD tData[] = {
  2410.                     DMORIENT_PORTRAIT,DMORIENT_LANDSCAPE,
  2411.                 };
  2412.                 HSTRBLK sb = dialogSelectIDInit(hd,tName,tData);
  2413.                 dialogControlHelp(hd,269);
  2414.                 dialogSelectW(hd,"印刷方向(&O):",&lp->dmOrientation,lx,16,sb);
  2415.             }
  2416.             //
  2417. #if 1//2.00E 
  2418.             HSTRBLK sb = makeBin(hd,lp,NULL);
  2419.             if (sb) {
  2420.                 dialogControlHelp(hd,270);
  2421.                 dialogControlID(hd,IDD_BINLIST);
  2422.                 dialogSelectW(hd,"給紙カセット(&C):",&lp->dmDefaultSource,lx,16,sb);
  2423.             }
  2424. #else
  2425.             {
  2426.                 #ifndef CCHBINNAME
  2427.                     #define CCHBINNAME    24
  2428.                 #endif
  2429.                 int n = lpCap(lp,DC_BINNAMES,0);
  2430.                 mchar* pName = memAlloc(n * CCHBINNAME);
  2431.                 mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
  2432.                 WORD* pData = memAlloc(n * sizeof(WORD));
  2433.                 DWORD* tData = memAlloc((n + 1) * sizeof(DWORD));
  2434.                 
  2435.                 if (tName && pName) {
  2436.                     lpCap(lp,DC_BINNAMES,pName);
  2437.                     lpCap(lp,DC_BINS,(LPSTR)pData);
  2438.                     int i;
  2439.                     for (i = 0;i < n;i++) {
  2440.                         tName[i] = &pName[i*CCHBINNAME];
  2441.                         tData[i] = pData[i];
  2442.                     }
  2443.                     tName[n] = NULL;
  2444.                     //
  2445.                     HSTRBLK sb = dialogSelectIDInit(hd,tName,tData);
  2446.                     dialogControlHelp(hd,270);
  2447.                     dialogSelectW(hd,"給紙カセット(&C):",&lp->dmDefaultSource,lx,16,sb);
  2448.                 }
  2449.                 memFree(pName);
  2450.                 memFree(tName);
  2451.                 memFree(pData);
  2452.                 memFree(tData);
  2453.             }
  2454. #endif
  2455.         dialogGroupEnd(hd);
  2456.         dialogAddPreview(hd,IDD_PREVIEW3,text);
  2457.     dialogAddPage(hd0,hd);
  2458.     
  2459.     HDIALOG hd = dialog("ヘッダ・フッタ");
  2460.     dialogSetGroupRight(hd,lcx);
  2461.     {
  2462.         int lxg = 14;
  2463.         int lcx = 25;
  2464.         dialogGroup(hd,"ヘッダ");
  2465.             dialogControlReverseBool(hd);
  2466.             dialogControlHelp(hd,323);
  2467.             dialogControlID(hd,IDD_HEADERPRINT);
  2468.             dialogCheckB(hd,"ヘッダを印刷(&H)",&lp->fNoHeaderPrint);
  2469.             //2.96A 970214 
  2470.             dialogControlConvert(hd,&pfuncconv);
  2471.             dialogControlGuide(hd,"mm",3);
  2472.             dialogControlHelp(hd,496);
  2473.             dialogControlUpdown(hd,1,40);
  2474.             dialogIntW(hd,"上余白(&T):",&lp->mcmMarginHeader,lxg,lxval);
  2475.             //
  2476.             dialogSetH(hd);
  2477.                 dialogControlHelp(hd,271);
  2478.                 dialogControlID(hd,IDD_HEADER);
  2479.                 dialogStrC(hd,"奇数ページ(&1):",lp->szHeader,lxg,CCHWORD,lcx);
  2480.                 dialogControlID(hd,IDD_HEADERSTR);
  2481.                 dialogButton(hd,"参照...",NULL,8);
  2482.                     dialogLF(hd);
  2483.                 dialogControlHelp(hd,271);
  2484.                 dialogControlID(hd,IDD_HEADER2);
  2485.                 dialogStrC(hd,"偶数ページ(&2):",lp->szHeader2,lxg,CCHWORD,lcx);
  2486.                 dialogControlID(hd,IDD_HEADER2STR);
  2487.                 dialogButton(hd,"参照...",NULL,8);
  2488.             dialogSetV(hd);
  2489.         dialogGroupEnd(hd);
  2490.         
  2491.         dialogGroup(hd,"フッタ");
  2492.             dialogControlReverseBool(hd);
  2493.             dialogControlHelp(hd,324);
  2494.             dialogControlID(hd,IDD_FOOTERPRINT);
  2495.             dialogCheckB(hd,"フッタを印刷(&F)",&lp->fNoFooterPrint);
  2496.             //2.96A 970214 
  2497.             dialogControlConvert(hd,&pfuncconv);
  2498.             dialogControlGuide(hd,"mm",3);
  2499.             dialogControlHelp(hd,497);
  2500.             dialogControlUpdown(hd,1,40);
  2501.             dialogIntW(hd,"下余白(&B):",&lp->mcmMarginFooter,lxg,lxval);
  2502.             //
  2503.             dialogSetH(hd);
  2504.                 dialogControlHelp(hd,271);
  2505.                 dialogControlID(hd,IDD_FOOTER);
  2506.                 dialogStrC(hd,"奇数ページ(&3)",lp->szFooter,lxg,CCHWORD,lcx);
  2507.                 dialogControlID(hd,IDD_FOOTERSTR);
  2508.                 dialogButton(hd,"参照...",NULL,8);
  2509.                     dialogLF(hd);
  2510.                 dialogControlHelp(hd,271);
  2511.                 dialogControlID(hd,IDD_FOOTER2);
  2512.                 dialogStrC(hd,"偶数ページ(&4):",lp->szFooter2,lxg,CCHWORD,lcx);
  2513.                 dialogControlID(hd,IDD_FOOTER2STR);
  2514.                 dialogButton(hd,"参照...",NULL,8);
  2515.             dialogSetV(hd);
  2516.         dialogGroupEnd(hd);
  2517.         
  2518.         dialogSpaceV(hd);
  2519.         
  2520.         dialogSetH(hd);
  2521.             dialogControlAddY(hd,DTCYBOX - DTCYKEY);
  2522.             dialogCaption(hd,"フォント(&O):");
  2523.             dialogControlHelp(hd,272);
  2524.             dialogAddChooseFontHeader(hd,lp,&lp->fontstyleMargin);
  2525.         dialogSetV(hd);
  2526.         dialogLF(hd);
  2527.         
  2528.         dialogControlHelp(hd,498);
  2529.         dialogControlID(hd,IDD_HEADER2SPECIFY);
  2530.         dialogCheckB(hd,"奇数ページと偶数ページで別指定(&M)",&lp->fSpecifyHeader2);
  2531.         dialogControlHelp(hd,325);
  2532.         dialogCheckB(hd,"奇数ページと偶数ページで対称に印刷(&S)",&lp->fHeaderSymmerty);
  2533.     }
  2534.     dialogAddPage(hd0,hd);
  2535.     
  2536. #if 01
  2537.     //2.00E 
  2538.     HDIALOG hd = dialog("プリンタ");
  2539.         dialogSetGroupRight(hd,lcx);
  2540.         dialogGroup(hd,"使用するプリンタ");
  2541.             dialogControlHelp(hd,-342);
  2542.             dialogControlRadioV(hd);
  2543.             dialogControlReverseBool(hd);
  2544. //information("%d",lp->fPrinterName);
  2545.             dialogControlID(hd,IDD_DEFAULT_PRINTER);
  2546.             dialogSwitchB(hd,&lp->fPrinterName,"通常使うプリンタを使用(&N)","プリンタを指定(&P)");
  2547.             //
  2548.             dialogControlID(hd,IDD_PRINTER_LIST);
  2549.             dialogControlHelp(hd,344);
  2550.             dialogSelectStrH(hd,NULL,lp->szPrinterName,sizeof(lp->szPrinterName),0,40,hpn);
  2551.         dialogGroupEnd(hd);
  2552.         dialogGroup(hd,"印刷品質");
  2553. #if 1
  2554.             HSTRBLK sb = makeResolution(hd,lp,NULL);
  2555.             if (sb) {
  2556.                 dialogControlID(hd,IDD_RESLIST);
  2557.                 dialogControlHelp(hd,270);
  2558.                 dialogControlHelp(hd,345);
  2559.                 dialogSelectW(hd,"解像度(&D):",&lp->dmPrintQuality,10,20,sb);
  2560.             }
  2561. #else
  2562.             {
  2563.                 int n = lpCap(lp,DC_ENUMRESOLUTIONS,0);
  2564.                 LONG* pData = memAlloc(n * sizeof(LONG) * 2);
  2565.                 if (pData) {
  2566.                     lpCap(lp,DC_ENUMRESOLUTIONS,(LPVOID)pData);
  2567.                     int cch = 20;
  2568.                     mchar* pName = memAlloc(n * cch);
  2569.                     mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
  2570.                     if (pName && tName) {
  2571.                         int i;
  2572.                         for (i = 0;i < n;i++) {
  2573.                             // pDataには縦横入っているが片方のみ使用
  2574.                             pData[i] = pData[i * 2];
  2575.                             //
  2576.                             tName[i] = &pName[i * cch];
  2577.                             sprintf(tName[i],"%d dpi",pData[i]);
  2578.                         }
  2579.                         tName[n] = NULL;
  2580.                         //
  2581.                         HSTRBLK sb = dialogSelectIDInit(hd,tName,pData);
  2582.                         dialogControlID(hd,IDD_RESLIST);
  2583.                         dialogControlHelp(hd,270);
  2584.                         dialogSelectW(hd,"解像度(&D):",&lp->dmPrintQuality,10,16,sb);
  2585.                     }
  2586.                     memFree(pName);
  2587.                     memFree(tName);
  2588.                 }
  2589.                 memFree(pData);
  2590.             }
  2591. #endif
  2592.         dialogGroupEnd(hd);
  2593.     dialogAddPage(hd0,hd);
  2594. #endif
  2595.     
  2596. #if 0    //1.99H プリンタフォントの選択ができたので、廃止
  2597.     HDIALOG hd = dialog("オプション");
  2598.         {
  2599.             static mchar* tName[] = {
  2600.                 "ビットマップで印刷","ダウンロードして印刷","プリンタフォントに置き換えて印刷",NULL
  2601.             };
  2602.             static DWORD tData[] = {
  2603.                 DMTT_BITMAP,DMTT_DOWNLOAD,DMTT_SUBDEV,
  2604.             };
  2605.             HSTRBLK sb = dialogSelectIDInit(hd,tName,tData);
  2606.             dialogSelectW(hd,"TrueTypeフォント:",&lp->dmTTOption,16,30,sb);
  2607.         }
  2608.     dialogAddPage(hd0,hd);
  2609. #endif
  2610.     
  2611.     dialogAddPageComplete(hd);//1.97 
  2612.     if (!fSimple) {
  2613.         dialogControlHelp(hd0,260);
  2614.         dialogAddPageButton(hd0,IDD_LOAD,"読み込み(&Q)...",16);//2.96 970210 「読み込み」新設
  2615.     }
  2616.     dialogControlHelp(hd0,260);
  2617.     dialogAddPageButton(hd0,IDD_SAVETOTEMP,"一時設定(&A)",14);//2.96 970204 「一時設定」新設
  2618.     dialogControlHelp(hd0,260);
  2619.     dialogAddPageButton(hd0,IDD_SAVETO,"名前を付けて保存(&Y)...",24);//2.00C 
  2620. #if 0//2.96 970210 「読み込み」を新設したので不要になった
  2621.     dialogControlHelp(hd0,259);
  2622.     dialogAddPageButton(hd0,IDD_DELETE,"消去(&X)...",14);
  2623. #endif
  2624.     
  2625.     SetCursor(hcursor);//2.00C 
  2626.     BOOL ret = dialogOpen(hd0);
  2627. #if 01//2.00E 
  2628.     sbDelete(hpn);
  2629. #endif
  2630.     
  2631.     // save
  2632.     if (ret) {
  2633.         txFlushHeadFontAuto(text);
  2634.         //2.99C 970324 //余白が印刷可能域に収まっているかチェック
  2635.         {
  2636. //lp->mcmMarginMinBottom++;
  2637. //information("%d,%d  %d,%d  %d,%d  %d,%d",lp->mcmMarginTop,lp->mcmMarginMinTop,lp->mcmMarginLeft,lp->mcmMarginMinLeft,lp->mcmMarginBottom,lp->mcmMarginMinBottom,lp->mcmMarginRight,lp->mcmMarginMinRight);
  2638.             if (
  2639.                 lp->mcmMarginTop < lp->mcmMarginMinTop ||
  2640.                 lp->mcmMarginLeft < lp->mcmMarginMinLeft ||
  2641.                 lp->mcmMarginBottom < lp->mcmMarginMinBottom ||
  2642.                 lp->mcmMarginRight < lp->mcmMarginMinRight
  2643.             ) {
  2644.                 int ret = MessageBox(
  2645.                     wndtxGetActive(textf->hwndbase),
  2646.                     "余白が少なすぎます\n余白を適切な値に修正しますか?",
  2647.                     "印刷",MB_ICONQUESTION|MB_YESNO
  2648.                 );
  2649.                 if (ret == IDYES) {
  2650.                     if (lp->mcmMarginTop < lp->mcmMarginMinTop) lp->mcmMarginTop = lp->mcmMarginMinTop;
  2651.                     if (lp->mcmMarginLeft < lp->mcmMarginMinLeft) lp->mcmMarginLeft = lp->mcmMarginMinLeft;
  2652.                     if (lp->mcmMarginBottom < lp->mcmMarginMinBottom) lp->mcmMarginBottom = lp->mcmMarginMinBottom;
  2653.                     if (lp->mcmMarginRight < lp->mcmMarginMinRight) lp->mcmMarginRight = lp->mcmMarginMinRight;
  2654.                     //2.99I 970406 マージンはmm単位で切り捨てなので、mm以下の部分は切り上げる
  2655.                     // そうしないといつまでも「余白が少なすぎます」と出てしまう
  2656.                     #define lpMcmKiriage10Mcm(val)    (val = val + (val % 10 != 0) * 10)
  2657.                     lpMcmKiriage10Mcm(lp->mcmMarginTop);
  2658.                     lpMcmKiriage10Mcm(lp->mcmMarginLeft);
  2659.                     lpMcmKiriage10Mcm(lp->mcmMarginBottom);
  2660.                     lpMcmKiriage10Mcm(lp->mcmMarginRight);
  2661.                 }
  2662.             }
  2663.         }
  2664.         txConfigOp(text,TXCONFIGOP_PRINTWRITE,(LPVOID)lp->szstyle);
  2665.         if (strcmp(lp->szstyle,"一時設定")) {
  2666.             //2.96 970206 一時設定でなければ、text->tFontstyleを登録
  2667.             txConfigOp(text,TXCONFIGOP_EXTSAVE_FONTSTYLE,0);
  2668.             txcfgSavePart(text,fHeadFontAuto);
  2669. #if 0//2.97A 970227 
  2670.             txcfgSavePart(text,nparaLetterHeader);
  2671. #endif
  2672.         }
  2673. //information("%d",lp->dmPrintQuality);
  2674.     } else {
  2675.         //2.00D restore(dialogReadするようになったため)
  2676.         memcpy(&text->lp->configTop,&lp0.configTop,&lp0.configEnd - &lp0.configTop);
  2677.         memcpy(text->tFontstyle,text_tfontstyle0,SIZE_TFONTSTYLE);
  2678.         text->fHeadFontAuto = fHeadFontAuto0;
  2679.     }
  2680.     // flush
  2681.     if (ret && text->editmode == 2) {
  2682. #if 1    //2.99D 970402 プレビュー中、設定ボタンで設定を変更してもプレビューに反映されなかった
  2683.         txLpOp(text,TXLPOP_FLUSHSTYLE);
  2684. #endif
  2685. #if 1//2.99E 970403 flpPreviewもテーブル幅を更新しないと段組数を変えたときに桁揃えがくちゃくちゃになる
  2686.         txSetUndisp(text);
  2687.         txFlush(text);
  2688.         txFlushTableAll(text);
  2689.         txSetDisp(text);
  2690. #else
  2691.         txFlush(text);
  2692.     #if 0//2.96 970210 flpPreview中は実行できない。
  2693.         txFlushTableAll(text);    // txFlushの後
  2694.     #endif
  2695. #endif
  2696.         lp->npageall = 0;//2.96 970210 for clear all page counter at preview.
  2697.     }
  2698.     
  2699.     return ret;
  2700. }
  2701.  
  2702. BOOL TXAPI TXCMDBASE txuiConfigPrint(TX* text)
  2703. {
  2704. // 印刷スタイルの設定
  2705.     return uiConfigPrint(text,FALSE);
  2706. }
  2707.  
  2708. //##印刷
  2709.  
  2710. #define PRINT_UI        0
  2711. #define PRINT_CONFIG    1
  2712. #define PRINT_EXEC        2
  2713.  
  2714. static int npageGetAll(tx *text)
  2715. {
  2716.     return txLpOp(text,TXLPOP_CALC_NPAGEALL);
  2717. }
  2718.  
  2719. static BOOL _fNoSaveLpstyleName;    // 印刷スタイル名を覚えない?
  2720.  
  2721. void TXAPI txLprintEx(TX* text)
  2722. {
  2723. // textを現在の印刷スタイルで印刷します。
  2724. // 現在の印刷スタイルは、txConfigOp(text,TXCONFIGOP_PRINTREAD,szlpstyle);でセットできます。
  2725. // text->lp->npagetopからtext->lp->npageendまで印刷します。
  2726. // f1pageがTRUEなら、text->lp->npagetopだけを印刷します。
  2727. // modePrintPageが0ならすべて、1なら奇数、2なら偶数ページを印刷します。
  2728. //2.96 970207 新API
  2729.     txLpOp(text,TXLPOP_PRINTENTER);
  2730.     {
  2731.         LPRINT* lp = text->lp;
  2732.         {
  2733.             static mchar sz[] = \"\allpages";
  2734.             if (
  2735.                 strstr(lp->szHeader,sz) ||
  2736.                 strstr(lp->szFooter,sz) ||
  2737.                 strstr(lp->szHeader2,sz) ||
  2738.                 strstr(lp->szFooter2,sz)
  2739.             ) {
  2740. #if 1//3.00B1 970610 \npageallが0になることがあった。また、ヘッダフッタに\npageallを使うと印刷ができないことがあった
  2741.                 lp->npageall = npageGetAll(text);
  2742. #else
  2743.                 txLpOp(text,TXLPOP_CALC_NPAGEALL);
  2744. #endif
  2745.                 if (lp->npageend == NPAGE_MAX) lp->npageend = lp->npageall;
  2746. //information("%d",lp->npageall);
  2747.             }
  2748.         }
  2749.         for (lp->icopy = 0;lp->icopy < lp->ncopy;lp->icopy++) {
  2750.             txLpOp(text,TXLPOP_PRINT);
  2751.         }
  2752.     }
  2753.     txLpOp(text,TXLPOP_PRINTEXIT);
  2754. }
  2755.  
  2756. void TXAPI txLprint(TX* text,mchar* szlpstyle)
  2757. {
  2758. // textを印刷スタイルszlpstyleで印刷します。
  2759. // szlpstyleがNULLなら、text->szlpstyle印刷スタイルで印刷します。
  2760. //2.96 970207 新API
  2761.     txConfigOp(text,TXCONFIGOP_PRINTREAD,szlpstyle ? (LPVOID)szlpstyle : (LPVOID)text->szlpstyle);
  2762.     text->lp->npagetop = 1;
  2763.     text->lp->npageend = NPAGE_MAX;
  2764.     txLprintEx(text);
  2765. }
  2766.  
  2767. static void lprint(TX* text)
  2768. {
  2769.     txLprintEx(text);
  2770.     if (!text->lp->fClip) {//2.00D 範囲印刷すると設定が変更された
  2771.         #if 1
  2772.         //2.00E 設定全部を保存するのではなく、印刷スタイル名のみを保存するようにした
  2773.         if (!_fNoSaveLpstyleName) {
  2774.             txConfigOp(text,TXCONFIGOP_EXTSAVE_LPSTYLE,0);
  2775.         }
  2776.         #else
  2777.         //1.99I 印刷OKしたら、印刷スタイルを記憶するため設定を保存する。
  2778.         txConfigOp(text,TXCONFIGOP_EXTSAVE,0);
  2779.         #endif
  2780.     }
  2781. }
  2782.  
  2783. //2.00E 印刷スタイルにプリンタ名を埋め込む為に全面変更
  2784. // WZ16では、PrintDlg中にhDevModeを変更するとアプリエラーになった為
  2785. // WZ32でも、PrintDlgとの整合性が悪いと思われる為
  2786.  
  2787. static void FlushSheetlist(HWND hwnd,int id)
  2788. {
  2789.     HWND hctrl = GetDlgItem(hwnd,id);
  2790.     if (hctrl) {
  2791.         txConfigOp(text,TXCONFIGOP_PRINTENUM,(LPVOID)hctrl);
  2792.         int i = SendDlgItemMessage(hwnd,id,CB_FINDSTRINGEXACT,-1,(LPARAM)text->szlpstyle);
  2793.         if (i == CB_ERR) {
  2794.             //2.00E スタイルを削除した時の処理を改良
  2795.             SendDlgItemMessage(hwnd,id,CB_SETCURSEL,0,0);
  2796.             SendDlgItemMessage(hwnd,id,CB_GETLBTEXT,0,(LPARAM)text->szlpstyle);
  2797.             txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)text->szlpstyle);
  2798.         } else {
  2799.             SendDlgItemMessage(hwnd,id,CB_SETCURSEL,i,0);
  2800.         }
  2801.         #if 0//駄目
  2802.         SendDlgItemMessage(hwnd,id,CB_SETEXTENDEDUI,TRUE,0);//1.98 キーボードで使いにくかった
  2803.         #endif
  2804.     }
  2805. }
  2806.  
  2807. static void FlushPrintDlg(HWND hwnd)
  2808. {
  2809.     lpInit(text->lp);
  2810.     txLpOp(text,TXLPOP_FLUSHDEVMODE);// hDevModeに印刷スタイル内容を反映する
  2811.     // プリンタ名を表示
  2812.     LPRINT* lp = text->lp;
  2813.     if (lp->hDevNames) {
  2814.         DEVNAMES *devnames = (LPVOID)GlobalLock(lp->hDevNames);
  2815.         SetDlgItemText(hwnd,IDD_PRINTER,(BYTE*)devnames + devnames->wDeviceOffset);
  2816.         GlobalUnlock(lp->hDevNames);
  2817.     }
  2818. }
  2819.  
  2820. // 印刷スタイルが変更されたら、それに合わせて詳細モードではテキストの表示を更新する
  2821. static void FlushPrintText(TX* text)
  2822. {
  2823.     if (text->editmode == EDITMODE_PRINT) {
  2824.         txLpOp(text,TXLPOP_FLUSH);
  2825.     }
  2826. }
  2827.  
  2828. static BOOL _fPrintExec;
  2829.  
  2830. BOOL dlgprocPrint(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  2831. {
  2832.     static BOOL s_fInit;//3.00B1 970610 
  2833.     switch(message) {
  2834.         case WM_INITDIALOG: {
  2835.             s_fInit = TRUE;
  2836.             //
  2837.             FlushSheetlist(hwnd,IDD_SHEETLIST);
  2838.             FlushPrintDlg(hwnd);
  2839.             EnableWindow(GetDlgItem(hwnd,IDD_PRINTAREAMODE+1),text->lp->fClip);
  2840.             PostMessage(hwnd,WM_TXUSER,0,0);
  2841.             if (_fPrintExec) {
  2842.                 PostMessage(hwnd,WM_COMMAND,IDOK,0);
  2843.             }
  2844.             break;
  2845.         }
  2846.         case WM_TXDIALOGINITEND: {//3.00B1 970610 
  2847.             s_fInit = FALSE;
  2848.             break;
  2849.         }
  2850.         case WM_COMMAND: {
  2851.             int id = WM_COMMAND_GetId(wParam);
  2852.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  2853.             myPostMessage(hwnd,WM_TXUSER,0,0);
  2854.             switch(id) {
  2855.                 case IDD_STYLESET: {
  2856.                     uiConfigPrint(text,TRUE);
  2857.                     // スタイルが追加/削除される場合がある
  2858.                     FlushSheetlist(hwnd,IDD_SHEETLIST);
  2859.                     FlushPrintDlg(hwnd);
  2860.                     FlushPrintText(text);
  2861.                     return TRUE;
  2862.                 }
  2863.                 case IDD_PROMPT: {//2.00E2 
  2864.                     txLpOp(text,TXLPOP_PROMPT);
  2865.                     return TRUE;
  2866.                 }
  2867.                 case IDD_SHEETLIST: {
  2868.                     if (notify == CBN_CLOSEUP ||
  2869.                         (
  2870.                             notify == CBN_SELCHANGE && 
  2871.                             !ComboBox_GetDroppedState(GetDlgItem(hwnd,id))
  2872.                         )
  2873.                     ) {
  2874.                         mchar szstyle[CCHLPSTYLE];
  2875.                         GetDlgItemText(hwnd,id,szstyle,CCHLPSTYLE);
  2876.                         if (stricmp(text->szlpstyle,szstyle)) {
  2877.                             strcpy(text->szlpstyle,szstyle);
  2878.                             txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)szstyle);
  2879.                             FlushPrintDlg(hwnd);
  2880.                             FlushPrintText(text);
  2881.                         }
  2882.                     }
  2883.                     break;
  2884.                 }
  2885.                 case IDD_CALCPAGES: {
  2886.                     HCURSOR hcursor = LoadCursor(NULL,IDC_WAIT);
  2887.                     hcursor = SetCursor(hcursor);
  2888.                     SetDlgItemInt(hwnd,IDD_NPAGETOP,1,FALSE);
  2889.                     SetDlgItemInt(hwnd,IDD_NPAGEEND,npageGetAll(text),FALSE);
  2890.                     SetCursor(hcursor);
  2891.                     break;
  2892.                 }
  2893.                 case IDD_NPAGETOP:
  2894.                 case IDD_NPAGEEND: {
  2895.                     if (!s_fInit && notify == EN_CHANGE) {//3.00B1 970610 選択して印刷ダイアログを出すと、「選択した部分」をデフォルトにするようにした
  2896.                         //2.93 ページ指定値を入力しても[ページ指定]モードにならず使いにくかった
  2897.                         CheckRadioButton(hwnd,IDD_PRINTAREAMODE,IDD_PRINTAREAMODE+2,IDD_PRINTAREAMODE+2);
  2898.                     }
  2899.                     break;
  2900.                 }
  2901.             }
  2902.             break;
  2903.         }
  2904.         case WM_TXUSER: {
  2905.             EnableWindow(GetDlgItem(hwnd,IDD_NPAGENUM),IsDlgButtonChecked(hwnd,IDD_ENABLE_NPAGENUM));
  2906.             break;
  2907.         }
  2908.     }
  2909.     return FALSE;
  2910. }
  2911.  
  2912. //3.00A 970427 _uiPrintのlocalから、表に出した
  2913. static BOOL _f1page;
  2914. static BYTE _modePrintPage;
  2915. static int npageTop = 1;
  2916. static int npageEnd = NPAGE_MAX;
  2917.  
  2918. static void uiPrintInit(void)
  2919. {
  2920. //3.00A 970427 new
  2921. // for "/p"で印刷するときの、印刷ページ数を初期化
  2922.     _f1page = FALSE;
  2923.     _modePrintPage = 0;
  2924.     npageTop = 1;
  2925.     npageEnd = NPAGE_MAX;
  2926. }
  2927.  
  2928. static BOOL _uiPrint(int printmode)
  2929. {
  2930.     _fPrintExec = (printmode == PRINT_EXEC);
  2931.     if (text->fGene) {
  2932.         //2.00B 世代テキストを印刷できないようにした
  2933.         information("世代テキストは印刷できません");
  2934.         return FALSE;
  2935.     }
  2936.     LPRINT* lp = text->lp;
  2937.     BOOL floop = FALSE;
  2938.     BOOL ret = FALSE;
  2939.     // 範囲が選択されていない時、検索文字列を選択表示中は、範囲内の印刷でなく
  2940.     // テキスト全体の印刷とする
  2941.     BOOL fClip = (text->fClip && !text->fClipSearch);
  2942.     if (fClip) {
  2943.         if (txGetAddressSelectTop(text) == txGetAddressSelectEnd(text)) {
  2944.             fClip = FALSE;
  2945.         }
  2946.     }
  2947.     //
  2948.     lp->npageend = NPAGE_MAX;
  2949. #if 0//2.99D 970402 プレビューから印刷するとeditmodeが詳細に変わった
  2950.     lp->editmode = text->editmode;
  2951. #endif
  2952.     lp->fClip = fClip;
  2953.     lpInit(lp);
  2954.     //
  2955.     HDIALOG hd = dialogbig("印刷");
  2956.     dialogSetHookEx(hd,"\m.dlgprocPrint");
  2957.     dialogSetGroupRight(hd,DTCX * 64);
  2958.     dialogSetContexthelp(hd,TRUE);
  2959.     int mode = 0;
  2960.     if (fClip) {
  2961.         mode = 1;
  2962.     }
  2963.     int ncopy = 1;
  2964.     //
  2965.     DTRECT r1,r2;
  2966.     dialogGetPos(hd,&r1);
  2967.     r1.cx = DTCX * 20;
  2968.     r1.cy = DTCY;
  2969.     dialogControlHelp(hd,334);
  2970.     _dialogAddLtext(hd,"使用する印刷スタイル(&S):",&r1);
  2971.     r2 = r1;
  2972.     r2.x += r1.cx + DTCX + 2;
  2973.     r2.cx = DTCX * 30;
  2974.     r2.cy = DTCY * 10;
  2975. #if 1
  2976.     // with CBS_SORT
  2977.     __dialogAddItem(hd,"COMBOBOX",NULL,IDD_SHEETLIST,&r2,CBS_SORT|CBS_AUTOHSCROLL|CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP);
  2978. #else
  2979.     _dialogAddCombobox(hd,IDD_SHEETLIST,&r2);
  2980. #endif
  2981.     _dialogAddControlInfo(hd,IDD_SHEETLIST);
  2982.     {
  2983.         DTRECT r = r2;
  2984.         r.x += r.cx + DTCX;
  2985.         r.cx = DTCX * 10;
  2986.         r.cy = DTCYBOX;
  2987.         dialogControlHelp(hd,335);
  2988.         _dialogAddButton(hd,"設定(&Y)...",IDD_STYLESET,&r);
  2989.         _dialogAddControlInfo(hd,IDD_STYLESET);
  2990.     }
  2991.     r1.y += DTCY * 2;
  2992.     r2.y += DTCY * 2;
  2993.     //
  2994.     dialogControlHelp(hd,59);
  2995.     _dialogAddLtext(hd,"使用するプリンタ:",&r1);
  2996.     r2.cx = DTCX * 30;
  2997.     r2.cy = DTCY;
  2998.     _dialogAddLtextID(hd,NULL,&r2,IDD_PRINTER);
  2999.     _dialogAddControlInfo(hd,IDD_PRINTER);
  3000. #if 1//2.96 970204 "設定"ボタンが縦に2つ並んでわかりにくかった
  3001.     r2.y += r2.cy + DTCYINT;
  3002.     dialogSetPosY(hd,r2.y);
  3003.     int x = dialogGetPosX(hd);
  3004.     dialogSetPosX(hd,r2.x);
  3005.     dialogControlHelp(hd,352);
  3006.     dialogControlID(hd,IDD_PROMPT);
  3007.     dialogButton(hd,"プリンタの設定(&R)...",NULL,20);
  3008.     dialogSetPosX(hd,x);
  3009. #else
  3010.     {
  3011.         DTRECT r = r2;
  3012.         r.x += r.cx + DTCX;
  3013.         r.cx = DTCX * 10;
  3014.         r.cy = DTCYBOX;
  3015.         dialogControlHelp(hd,352);
  3016.         _dialogAddButton(hd,"設定(&R)...",IDD_PROMPT,&r);
  3017.         _dialogAddControlInfo(hd,IDD_PROMPT);
  3018.     }
  3019.     r1.y += DTCY * 3;
  3020.     r2.y += DTCY * 3;
  3021.     dialogSetPos(hd,&r1);
  3022. #endif
  3023.     //
  3024.     dialogGroup(hd,"印刷範囲の選択");
  3025.         {
  3026.         //2.96 970204 "ページ指定"ラジオボタンの次が、ページ番号テキストボックス
  3027.         // でなくて、全ページ数計算ボタンだったので使いにくかった
  3028.             DTRECT r;
  3029.             dialogGetPos(hd,&r);
  3030.                 DTRECT r1 = r;
  3031.                 r1.x += DTCX * 20;
  3032.                 r1.cx = DTCX * 20;
  3033.                 r1.cy = DTCYBOX;
  3034.                 _dialogAddButton(hd,"全ページ数計算(&G)",IDD_CALCPAGES,&r1);
  3035.                 dialogControlHelp(hd,341);
  3036.                 _dialogAddControlInfo(hd,IDD_CALCPAGES);
  3037.             dialogSetPos(hd,&r);
  3038.         }
  3039.         dialogControlRadioV(hd);
  3040.         dialogControlHelp(hd,-336);
  3041.         dialogControlID(hd,IDD_PRINTAREAMODE);
  3042.         dialogRadioID(hd,&mode,
  3043.             "全ページ(&A)",
  3044.             "選択した部分(&E)",
  3045.             "ページ指定(&P):"
  3046.         );
  3047.         {
  3048.             DTRECT r;
  3049.             dialogGetPos(hd,&r);
  3050.             r.x += DTCX * 20;
  3051.             r.y -= DTCY + DTCY/2;
  3052.             dialogSetPos(hd,&r);
  3053.             dialogSetH(hd);
  3054.             DTRECT r1 = r;
  3055.             r1.x += DTCX * 6;r1.y += DTCYKEY - DTCY;
  3056.             r1.cx = DTCX * 14;r1.cy = DTCY;
  3057.             _dialogAddLtext(hd,"ページから(&F)",&r1);
  3058.             dialogControlHelp(hd,336);
  3059.             dialogControlID(hd,IDD_NPAGETOP);
  3060.             dialogInt(hd,NULL,&npageTop,0,5);
  3061.             r1.x += DTCX * 18;
  3062.             _dialogAddLtext(hd,"ページまで(&T)",&r1);
  3063.             r.x = r1.x - DTCX * 6;
  3064.             dialogSetPos(hd,&r);
  3065.             dialogControlHelp(hd,336);
  3066.             dialogControlID(hd,IDD_NPAGEEND);
  3067.             dialogInt(hd,NULL,&npageEnd,0,5);
  3068.             dialogSetV(hd);
  3069.             dialogLF(hd);
  3070.         }
  3071.         dialogControlHelp(hd,337);
  3072.         dialogCheck(hd,"先頭&1ページのみ",&_f1page);
  3073.         dialogSelectIDB(hd,"印刷するページ(&M):",&_modePrintPage,19,20,"全てのページ","奇数ページ","偶数ページ");
  3074.     dialogGroupEnd(hd);
  3075.     //
  3076.     dialogGroup(hd,"ページ番号の付け替え");
  3077.         dialogControlHelp(hd,338);
  3078.         dialogControlID(hd,IDD_ENABLE_NPAGENUM);
  3079.         dialogCheckB(hd,"ページ番号を付け替える(&O)",&lp->fNpagenum);
  3080.         dialogControlHelp(hd,339);
  3081.         if (lp->npagenum <= 0) lp->npagenum = 1;
  3082.         dialogControlID(hd,IDD_NPAGENUM);
  3083.         dialogIntW(hd,"先頭ページのページ番号(&N):",&lp->npagenum,24,5);
  3084.     dialogGroupEnd(hd);
  3085.     //
  3086.     dialogControlHelp(hd,340);
  3087.     dialogInt(hd,"部数(&C):",&ncopy,8,5);
  3088.     
  3089.     
  3090.     if (dialogOpen(hd)) {
  3091.         toTszlpstyle(text);//3.00A3 970508 
  3092.         lp->fClip = (mode == 1);
  3093.         if (mode == 0) {
  3094.             npageTop = 1;
  3095.             npageEnd = NPAGE_MAX;
  3096.         }
  3097.         lp->npagetop = npageTop;
  3098.         lp->npageend = npageEnd;
  3099.         lp->ncopy = ncopy;
  3100.         lp->modePrintPage = _modePrintPage;
  3101.         lp->f1page = _f1page;
  3102.         if (lp->fClip) {
  3103.             TX* text0 = text;
  3104.             DWORD ret;
  3105.             wzlock(LOCK_CLIPTS);
  3106.             txSelectTsPush(text);
  3107.             {
  3108.                 TX* text1 = txGetFrameNow();//2.99C 970324 
  3109.                 HWND hwndtext = CreateWindow(
  3110.                     TXWS_SZCLASS,NULL,
  3111.                     TXWS_TEXT|TXWS_OPENTEXT|WS_CHILDWINDOW|WS_VISIBLE,
  3112.                     0,0,
  3113.                     0,0,    // 640,400, // こうすると内容を表示できる
  3114.                     text1->hwndbase,NULL,text1->hInstance,NULL
  3115.                 );
  3116.                 if (hwndtext) {
  3117.                     TX* text = (LPVOID)SendMessage(hwndtext,TXWM_GETTX,0,0);
  3118.                     //
  3119.                     memcpy(&text->lp->configTop,&text0->lp->configTop,&lp->configEnd - &lp->configTop);
  3120.                     text->lp->npagetop = 1;
  3121.                     text->lp->npageend = NPAGE_MAX;
  3122.                     text->lp->ncopy = 1;
  3123.                     //2.00D 範囲内の印刷で先頭ページ番号の指定ができなかった
  3124.                     text->lp->fNpagenum = text0->lp->fNpagenum;
  3125.                     text->lp->npagenum = text0->lp->npagenum;
  3126.                     memcpy(text->tFontstyle,text0->tFontstyle,SIZE_TFONTSTYLE);
  3127.                     strcpy(text->szlpstyle,text0->szlpstyle);//1.99F 
  3128.                     text->fVertical = text0->fVertical;//1.99J 
  3129.                     text->fForm = text0->fForm;//2.00E 範囲内の印刷で見出しが印刷されなかった
  3130.                     text->fBinedit = text0->fBinedit;
  3131.                     text->fBinary = text0->fBinary;
  3132.                     //2.99D 970402 
  3133.                     text->lfProp = text0->lfProp;
  3134.                     text->fLineD = text0->fLineD;
  3135.                     text->fColoringURL = text0->fColoringURL;
  3136.                     text->fJkinsoku = text0->fJkinsoku;
  3137.                     text->tabsize = text0->tabsize;//3.00C 971013 範囲内のみの印刷でタブサイズが既定値になっていた
  3138.                     //
  3139.                     txFlush(text);
  3140.                     //
  3141.                     txSetEditmode(text,2);
  3142.                     txClipPaste(text,HCLIP_TS,TRUE,CLIP_CHAR);
  3143.                     clipDeleteTop(HCLIP_TS);
  3144. //wait(2000);
  3145. //txInsert(text,"ABC\n");
  3146. //txInsert(text,"漢字\n");
  3147.                     //
  3148.                     strcpy(text->szfilename,text0->szfilename);
  3149.                     text->timeFile = text0->timeFile;
  3150.                     lprint(text);
  3151.                     DestroyWindow(hwndtext);
  3152.                 }
  3153.             }
  3154.             wzunlock(LOCK_CLIPTS);
  3155.         } else {
  3156.             lprint(text);
  3157.         }
  3158.     }
  3159.     return ret;
  3160. }
  3161.  
  3162. BOOL TXAPI TXCMDBASE uiPrint(void)
  3163. {
  3164. // 印刷ダイアログを表示
  3165. //{#VZ} ^KP
  3166. //{#MS} ^P +^{F12}
  3167.     return _uiPrint(PRINT_UI);
  3168. }
  3169.  
  3170. BOOL uiPrinterConfig(void)
  3171. {
  3172.     return _uiPrint(PRINT_CONFIG);
  3173. }
  3174.  
  3175. BOOL TXAPI TXCMD uiPrintExec(void)
  3176. {
  3177. // 印刷ダイアログを表示して直ちに印刷実行
  3178. //1.97で追加
  3179.     uiPrintInit();//3.00A 970427 "/p"で印刷するとき、印刷ページ数を初期化するようにした
  3180.     return _uiPrint(PRINT_EXEC);
  3181. }
  3182.  
  3183. uiSendFax
  3184. {
  3185. // FAXを送信
  3186. // 予め"FAX"という名前でFAX送信用の印刷スタイルを作成しておくと、
  3187. // このコマンドを実行してOKするとFAXを送信できます。
  3188. //2.00E4で追加
  3189.     if (txConfigOp(text,TXCONFIGOP_PRINTEXIST,"fax")) {
  3190.         txstr szlpstyle = text->szlpstyle;
  3191.         strcpy(text->szlpstyle,"fax");
  3192.         _fNoSaveLpstyleName = TRUE;
  3193.         BOOL ret = _uiPrint(PRINT_UI);
  3194.         strcpy(text->szlpstyle,szlpstyle);
  3195.         return ret;
  3196.     } else {
  3197.         TX* text1 = txGetFrameNow();//2.99C 970324 
  3198.         MessageBox(
  3199.             wndtxGetActive(text1->hwndbase),
  3200.             "\"FAX\"という名前でFAX送信用の印刷スタイルを作成してください",
  3201.             "WZ - FAX送信",
  3202.             MB_ICONINFORMATION|MB_OK
  3203.         );
  3204.     }
  3205. }
  3206.  
  3207. //##印刷中止
  3208.  
  3209. static BOOL _fUserAbort;    // 中止が選択された
  3210. static HWND _hdlg;            // 印刷ダイアログボックス
  3211. static FARPROC _lpfnAbortProc;
  3212.  
  3213. BOOL TXCALLBACK AbortProc(HDC hdc,short nCode)
  3214. {
  3215.     MSG msg;
  3216.     while(!_fUserAbort && PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
  3217.         if (!_hdlg || !IsDialogMessage(_hdlg,&msg)) {
  3218.             TranslateMessage(&msg);
  3219.             DispatchMessage(&msg);
  3220.         }
  3221.     }
  3222.     return !_fUserAbort;
  3223. }
  3224.  
  3225. BOOL dialogAbortProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  3226. {
  3227.     switch(message) {
  3228.         case WM_COMMAND: {
  3229.             int id = LOWORD(wParam);
  3230.             if (id == IDCANCEL) {
  3231.                 _fUserAbort = TRUE;
  3232.                 EnableWindow(text->hwndbase,TRUE);//2.99C 970324 text1->text
  3233.                 dialogFree(_hdlg);_hdlg = NULL;
  3234.                 statprintf("印刷を中止しました");//1.00F
  3235.                 return TRUE;
  3236.             }
  3237.             break;
  3238.         }
  3239.         case WM_PAINT: {
  3240.             int id;
  3241.             for (id = 500;id <= 502;id++) {
  3242.                 HWND hctrl = GetDlgItem(hwnd,id);
  3243.                 HDC hdc = GetDC(hctrl);
  3244.                 HFONT hfont0 = NULL;
  3245.                 mchar buff[100];
  3246.                 
  3247.                 InvalidateRect(hctrl,NULL,TRUE);
  3248.                 UpdateWindow(hctrl);
  3249.                 if (text1->fCtl3d) {
  3250.                     SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
  3251.                     SetBkColor(hdc,GetSysColor(COLOR_BTNFACE));
  3252.                 } else {
  3253.                     SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
  3254.                     SetBkColor(hdc,GetSysColor(COLOR_WINDOW));
  3255.                 }
  3256.                 {
  3257.                     LPRINT* lp = text->lp;
  3258.                     NPAGE npage = txNpageFromNpageclm(text,text->npage);
  3259.                     if (id == 500) {
  3260.                         sprintf(buff,"%dページを印刷中",npage);
  3261.                     } else if (id == 501) {
  3262.                         if (lp->npageend == NPAGE_MAX) {
  3263.                             strcpy(buff,"残り???ページ");
  3264.                         } else {
  3265.                             sprintf(buff,"残り%dページ",lp->npageend - npage);
  3266.                         }
  3267.                     } else {
  3268.                         sprintf(buff,"%d部中 %d部を印刷中",lp->ncopy,lp->icopy + 1);
  3269.                     }
  3270.                     hfont0 = SelectObject(hdc,GetStockObject(GetSystemFontNo()));//1.00H6 
  3271.                     TextOut(hdc,0,0,buff,strlen(buff));
  3272.                     SelectObject(hdc,hfont0);//1.00H6 
  3273.                 }
  3274.                 ReleaseDC(hctrl,hdc);
  3275.             }
  3276.             break;
  3277.         }
  3278.     }
  3279.     return FALSE;
  3280. }
  3281.  
  3282. HWND dialogAbortOpen(void)
  3283. {
  3284. // 印刷中ダイアログ
  3285.     if (text->lp && text->lp->hdc) {
  3286.         EnableWindow(text->hwndbase,FALSE);    // 印刷メニューが再度選択されない様に
  3287.         _fUserAbort = FALSE;
  3288.         //
  3289.         HDIALOG hd = dialog("印刷中");
  3290.         {
  3291.             PMACROFUNC pfunc;
  3292.             if (macroGetFuncAddress("dialogAbortProc",&pfunc)) {
  3293.                 dialogSetHook(hd,&pfunc);
  3294.             }
  3295.         }
  3296.         dialogCaption(hd,text->szfilename);
  3297.         dialogControlID(hd,500);dialogCaption(hd,"                    ");
  3298.         dialogControlID(hd,501);dialogCaption(hd,"                    ");
  3299.         dialogControlID(hd,502);dialogCaption(hd,"                    ");
  3300.         dialogLFV(hd);
  3301.         dialogCancel(hd,10);
  3302.         _hdlg = dialogCreate(hd);
  3303.         //
  3304. #ifdef __FLAT__
  3305.         _lpfnAbortProc = macroMakeCallBackProc("AbortProc",8);
  3306. #else
  3307.         _lpfnAbortProc = macroMakeCallBackProc("AbortProc",4);
  3308. #endif
  3309.         SetAbortProc(text->lp->hdc,(ABORTPROC)_lpfnAbortProc);
  3310.     }
  3311.     return _hdlg;
  3312. }
  3313.  
  3314. void dialogAbortClose(void)
  3315. {
  3316.     EnableWindow(text->hwndbase,TRUE);
  3317.     if (text->lp) SetAbortProc(text->lp->hdc,NULL);
  3318.     if (_lpfnAbortProc) {
  3319.         macroFreeCallBackProc(_lpfnAbortProc);
  3320.         _lpfnAbortProc = NULL;
  3321.     }
  3322.     if (_hdlg) {
  3323.         dialogFree(_hdlg);
  3324.         _hdlg = NULL;
  3325.     }
  3326. }
  3327.  
  3328. BOOL TXCMDBASE txSetPreview(TX* text)
  3329. {
  3330. // 印刷プレビューと通常編集切り替え
  3331.     if (text->flpPreview) {
  3332.         txLpOp(text,TXLPOP_PREVIEWEXIT);
  3333.     } else {
  3334.         txLpOp(text,TXLPOP_PREVIEWENTER);
  3335.     }
  3336.     return TRUE;
  3337. }
  3338.  
  3339. #define IDD_PV_STYLELIST    100
  3340. #define IDD_PV_STYLESET        101
  3341. #define IDD_PV_LPRINT        102
  3342. #define IDD_PV_ZOOMIN        103
  3343. #define IDD_PV_ZOOMOUT        104
  3344. #define IDD_PV_NEXTPAGE        105    // _disp.cで即値参照
  3345. #define IDD_PV_PREVPAGE        106    // _disp.cで即値参照
  3346. #define IDD_PV_JUMPPAGE        107
  3347.  
  3348. static BOOL CheckRate(TX* text,int rate,BOOL fPrev)
  3349. {
  3350. //2.99D 970402 プレビューで倍率を上げると表示が乱れた
  3351. #if 1
  3352.     if (0 < rate && rate < 50) {
  3353.         statprintf(NULL);
  3354.         return TRUE;
  3355.     }
  3356.     statprintf(fPrev ? "これ以上倍率を下げられません" : "これ以上倍率を上げられません");
  3357.     return FALSE;
  3358. #else
  3359.     LPRINT* lp = text->lp;
  3360.     int x = ((long)lp->lpcxClient*150*rate)/15000;
  3361.     int y = ((long)lp->lpcyClient*150*rate)/15000;
  3362. statprintf("%d %d %d",rate,x,y);wait(100);
  3363.     if (x < 1637 && y < 1637) return TRUE;//これはだめだった
  3364.     return FALSE;
  3365. #endif
  3366. }
  3367.  
  3368. BOOL dlgprocPreviewCmd(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  3369. {
  3370.     HDIALOG hd = dialogFromHwnd(hwnd);
  3371.     TX* text = (TX*)dialogGetCustdata(hd);
  3372.     LPRINT* lp = text->lp;
  3373.     long dpage = 1 + lp->f2pages;
  3374.     switch(message) {
  3375.         case WM_INITDIALOG: {
  3376.             SetWindowPos(hwnd,NULL,-30000,-30000,0,0,SWP_NOSIZE);// ちらつき抑止
  3377.             PostMessage(text->hwndbase,WM_TXFLUSHWINDOWSIZE,0,0);
  3378.             FlushSheetlist(hwnd,IDD_PV_STYLELIST);
  3379.             break;
  3380.         }
  3381.         case WM_COMMAND: {
  3382.             int id = WM_COMMAND_GetId(wParam);
  3383.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  3384.             switch(id) {
  3385.                 case IDD_PV_STYLELIST: {
  3386.                     if (notify == CBN_SELCHANGE) {
  3387.                         mchar szstyle[CCHLPSTYLE];
  3388.                         GetDlgItemText(hwnd,id,szstyle,CCHLPSTYLE);
  3389.                         if (stricmp(text->szlpstyle,szstyle)) {
  3390.                             strcpy(text->szlpstyle,szstyle);toTszlpstyle(text);
  3391.                             txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)szstyle);
  3392.                             txLpOp(text,TXLPOP_FLUSHSTYLE);
  3393. //information("%d %d",lp->lpcxClient,lp->lpcyClient);
  3394. #if 1//2.99E 970403 プレビューで印刷スタイルを選んでも桁揃えと表の幅が更新されてなかった
  3395.                             txSetUndisp(text);
  3396.                             txFlush(text);
  3397.                             txFlushTableAll(text);
  3398.                             txSetDisp(text);
  3399. #else
  3400.                             txFlush(text);
  3401. #endif
  3402.                             SetFocus(GetDlgItem(hwnd,id));
  3403.                         }
  3404.                     }
  3405.                     return TRUE;
  3406.                 }
  3407.                 case IDD_PV_STYLESET: {
  3408.                     txuiConfigPrint(text);
  3409. #if 0//2.99D 970402 2回表示されて煩わしかった
  3410.     #if 1                //2.99D 970331 // プレビュー中、設定ボタンで設定を変更してもプレビューに反映されなかった
  3411.                     txLpOp(text,TXLPOP_FLUSHSTYLE);
  3412.                     txFlush(text);
  3413.     #endif
  3414. #endif
  3415.                     //
  3416.                     SetFocus(GetDlgItem(hwnd,id));
  3417.                     FlushSheetlist(hwnd,IDD_PV_STYLELIST);//2.98 970308 
  3418.                     return TRUE;
  3419.                 }
  3420.                 case IDD_PV_LPRINT: {
  3421.                     // 閉じられることがあるので、Postする必要がある
  3422.                     PostMessage(text->hwndbase,WM_COMMAND,IDM_TXLPRINT,0);
  3423.                     return TRUE;
  3424.                 }
  3425.                 case IDD_PV_JUMPPAGE: {
  3426.                     call("search.uiJumpPage");
  3427.                     SetFocus(GetDlgItem(hwnd,id));
  3428.                     return TRUE;
  3429.                 }
  3430.                 case IDCANCEL: {
  3431.                     // 閉じられるので、Postする必要がある
  3432. #if 1//2.99F 970403 プレビュー中に他のWZにウィンドウを切り替えて戻して、プレビューを閉じようとしても閉じることができなかった
  3433.                     PostMessage(text->hwndbase,WM_TXCOMMAND,IDM_TXPREVIEWEXIT,0);
  3434. #else
  3435.                     PostMessage(text->hwndbase,WM_COMMAND,IDM_TXPREVIEWEXIT,0);
  3436. #endif
  3437.                     return TRUE;
  3438.                 }
  3439.                 case IDD_PV_NEXTPAGE: {
  3440.                     long npageNow = txNpageFromNpageclm(text,text->npage);
  3441.                     long npageNew = npageNow + dpage;
  3442.                     if (lp->npageall && npageNew > lp->npageall) {
  3443.                         if (lp->f2pages) {
  3444.                             // 移動する必要なし
  3445.                             npageNew = npageNow;
  3446.                         } else {
  3447.                             npageNew = lp->npageall;
  3448.                         }
  3449.                     }
  3450.                     if (npageNew != npageNow) {
  3451.                         text->fUndisp++;
  3452.                         txJumpPage(text,npageNew);
  3453.                         txSetLy(text,0);
  3454.                         text->fUndisp--;
  3455.                         // 総ページ数も一緒に調べる
  3456.                         // 最初に総ページ数を調べると時間がかかるので
  3457.                         txDispTextAll(text);
  3458.                         txDispLocate(text);
  3459.                     }
  3460.                     return TRUE;
  3461.                 }
  3462.                 case IDD_PV_PREVPAGE: {
  3463.                     long npageNow = txNpageFromNpageclm(text,text->npage);
  3464.                     long npageNew = npageNow - dpage;
  3465.                     if (npageNew < 1) npageNew = 1;
  3466.                     if (npageNew != npageNow) {
  3467.                         text->fUndisp++;
  3468.                         txJumpPage(text,npageNew);
  3469.                         txSetLy(text,0);
  3470.                         text->fUndisp--;
  3471.                         txDispTextAll(text);
  3472.                         txDispLocate(text);
  3473.                     }
  3474.                     return TRUE;
  3475.                 }
  3476.                 case IDD_PV_ZOOMIN: {
  3477.                     int rate = (int)lp->pvRate + 2;
  3478.                     if (CheckRate(text,rate,FALSE)) {
  3479.                         lp->pvRate = rate;
  3480.                         txOp(text,TXOP_INITSCROLLBAR,0,0);//2.98 970308 
  3481.                         txDispTextAll(text);
  3482.                     }
  3483.                     return TRUE;
  3484.                 }
  3485.                 case IDD_PV_ZOOMOUT: {
  3486.                     int rate = (int)lp->pvRate - 2;
  3487.                     if (CheckRate(text,rate,TRUE)) {
  3488.                         lp->pvRate = rate;
  3489.                         txOp(text,TXOP_INITSCROLLBAR,0,0);//2.98 970308 
  3490.                         txDispTextAll(text);
  3491.                     }
  3492.                     return TRUE;
  3493.                 }
  3494.             }
  3495.             break;
  3496.         }
  3497.     }
  3498.     return FALSE;
  3499. }
  3500.  
  3501. pvOp(TX* text,int op)
  3502. {
  3503.     LPRINT* lp = text->lp;
  3504.     if (lp->hwndPreviewCmd) {
  3505.         SetFocus(text->hwndtext);
  3506.         dialogFree(lp->hwndPreviewCmd);
  3507.         lp->hwndPreviewCmd = NULL;
  3508.     }
  3509.     if (op == 0) return TRUE;
  3510.     HDIALOG hd = _dialog("PreView",EXDS_POSDEFAULT|(_fwin40 ? 0 : EXDS_BIGFORCE),NULL);//2.97 970215 
  3511.     DWORD style = dialogGetStyle(hd);
  3512.     dialogSetStyle(hd,WS_VISIBLE|WS_CHILD|(style & DS_SETFONT));
  3513.     dialogSetParent(hd,text->hwndbase);
  3514.     dialogSetHookEx(hd,"\m.dlgprocPreviewCmd");
  3515.     dialogSetCustdata(hd,(LPARAM)text);
  3516.     dialogSetNoButton(hd);
  3517.     dialogSetPosY(hd,2);
  3518.     //
  3519.     dialogSetH(hd);
  3520.     dialogControlID(hd,IDD_PV_LPRINT);
  3521.     dialogButtonCmd(hd,"印刷 &P..",NULL,9);
  3522.     //
  3523.     DTRECT r;
  3524.     dialogGetPos(hd,&r);
  3525.     r.cx = DTCX * 30;
  3526.     r.cy = DTCY * 10;
  3527.     dialogControlHelp(hd,334);
  3528.     __dialogAddItem(hd,"COMBOBOX",NULL,IDD_PV_STYLELIST,&r,CBS_SORT|CBS_AUTOHSCROLL|CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP);
  3529.     _dialogAddControlInfo(hd,IDD_PV_STYLELIST);
  3530.     dialogSetPosX(hd,r.x + r.cx + DTCX);
  3531.     //
  3532.     dialogControlID(hd,IDD_PV_STYLESET);
  3533.     dialogButtonCmd(hd,"設定 &S..",NULL,9);
  3534.     //
  3535.     dialogControlID(hd,IDD_PV_NEXTPAGE);
  3536.     dialogButtonCmd(hd,"↓ &N",NULL,5);//2.98 970308 
  3537. //    dialogButtonCmd(hd,"次頁 &N",NULL,7);
  3538.     dialogControlID(hd,IDD_PV_PREVPAGE);
  3539.     dialogButtonCmd(hd,"↑ &V",NULL,5);//2.98 970308 
  3540. //    dialogButtonCmd(hd,"前頁 &V",NULL,7);
  3541.     dialogControlID(hd,IDD_PV_JUMPPAGE);
  3542.     dialogButtonCmd(hd,"頁 &J..",NULL,7);//2.98 970308 
  3543. //    dialogButtonCmd(hd,"指定頁 &J..",NULL,11);
  3544.     dialogControlID(hd,IDD_PV_ZOOMIN);
  3545.     dialogButtonCmd(hd,"&+",NULL,4);
  3546.     dialogControlID(hd,IDD_PV_ZOOMOUT);
  3547.     dialogButtonCmd(hd,"&-",NULL,4);
  3548.     dialogControlID(hd,IDCANCEL);
  3549.     dialogButtonCmd(hd,"&X",NULL,4);//2.98 970308 
  3550. //    dialogButtonCmd(hd,"閉じる &C",NULL,9);
  3551.     dialogIndent(hd,1);
  3552.     DTRECT size;
  3553.     size.cx = dialogGetPosX(hd);
  3554.     dialogLF(hd);
  3555.     size.cy = dialogGetPosY(hd) + 1;
  3556.     dialogSetSize(hd,&size);
  3557.     lp->hwndPreviewCmd = dialogCreate(hd);
  3558.     return TRUE;
  3559. }
  3560.  
  3561. //## プロパティーシート
  3562. //2.95 970125 
  3563.  
  3564. //## 脚注
  3565.  
  3566. #define IDD_FOOTNOTE    1000
  3567. #define IDD_RETURN        1001
  3568.  
  3569. typedef struct {
  3570.     TX* text;
  3571.     PLUGFOOTNOTE* plug;
  3572. } FOOTNOTECONTEXT;
  3573.  
  3574. BOOL dlgprocFootnote(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  3575. {
  3576.     switch(message) {
  3577.         case WM_INITDIALOG: {
  3578.             HDIALOG hd = dialogFromHwnd(hwnd);
  3579.             HWND hctrl = GetDlgItem(hwnd,IDD_FOOTNOTE);
  3580.             TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
  3581.             if (text) {
  3582.                 FOOTNOTECONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  3583.                 if (context->plug) {
  3584.                     txInsert(text,context->plug->szFootnote);
  3585.                 }
  3586.                 txJumpFileTop(text);
  3587.                 text->fSetWidthByWindow = TRUE;
  3588.                 text->dlgcode = DLGC_WANTARROWS|DLGC_WANTCHARS;//|DLGC_WANTMESSAGE;
  3589.                 txUndoClear(text);//2.99 970316 
  3590.                 txFlush(text);
  3591.             }
  3592.             break;
  3593.         }
  3594.         case WM_COMMAND: {
  3595.             int id = WM_COMMAND_GetId(wParam);
  3596.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  3597.             HWND hctrl = GetDlgItem(hwnd,IDD_FOOTNOTE);
  3598.             TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
  3599.             if (id == IDOK) {
  3600.                 HDIALOG hd = dialogFromHwnd(hwnd);
  3601.                 FOOTNOTECONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  3602.                 if (text) {
  3603.                     txSetUndisp(text);
  3604.                     txSelectAll(text);
  3605.                     txPrivatePush(text);
  3606.                     int lch = memClipPaste(NULL,HCLIP_PRIVATE);
  3607.                     if (context->text->editmode == 0) {
  3608.                         //2.99C 970324 
  3609.                         TX* text = context->text;
  3610.                         txstr sz(lch+1);
  3611.                         memClipPaste((mchar*)sz,HCLIP_PRIVATE);
  3612.                         sz[lch] = 0;
  3613.                         txCharatrSet(text,TAG_PROOF,(mchar*)sz);
  3614.                     } else {
  3615.                         PLUGFOOTNOTE* plug = plugatrNewEx(context->text,PLUG_FOOTNOTE,lch + 1);
  3616.                         if (plug) {
  3617.                             TX* text = context->text;
  3618.                             txSetUndisp(text);
  3619.                                 plug->cchFootnoteAlloc = lch + 1;
  3620.                                 plug->lchFootnote = lch;
  3621.                                 memClipPaste(plug->szFootnote,HCLIP_PRIVATE);
  3622.                                 plug->szFootnote[lch] = 0;
  3623.                                 plug->number = context->plug ? context->plug->number : 1;
  3624.                                 txReplacePlug(text,plug,context->plug);
  3625.                             txSetDisp(text);
  3626.                         } else {
  3627.                             ////err
  3628.                         }
  3629.                     }
  3630.                     txPrivateDeleteTop(text);
  3631.                 }
  3632.             } else if (id == IDD_RETURN) {
  3633.                 txInsertReturn(text);
  3634.                 return TRUE;
  3635.             }
  3636.             break;
  3637.         }
  3638.     }
  3639.     return FALSE;
  3640. }
  3641.  
  3642. static BOOL dialogaFootnote(TX* text,PLUGFOOTNOTE* plug)
  3643. {
  3644. // plug=NULL:新規作成
  3645.     if (text->editmode == 0 && !plug) {
  3646.         //2.99C 970324 「脚注の挿入」テキストモード対応
  3647.     } else {
  3648.         if (!IsEditmode(text)) return FALSE;//2.98 970308 
  3649.     }
  3650.     HDIALOG hd;
  3651.     if (plug) {
  3652.         hd = dialog("脚注のプロパティ");
  3653.     } else {
  3654.         hd = dialog("脚注の挿入");
  3655.     }
  3656.     dialogSetHookEx(hd,"\m.dlgprocFootnote");
  3657.     DTRECT r;
  3658.     r.x = DTCX;
  3659.     r.y = DTCY;
  3660.     r.cx = DTCX * 70;
  3661.     r.cy = DTCY * 10;
  3662.     __dialogAddItem(hd,TXWS_SZCLASS,"",IDD_FOOTNOTE,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_VSCROLL|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE|TXWS_ENABLEUNDO|WS_TABSTOP);
  3663.     FOOTNOTECONTEXT context;
  3664.     context.text = text;
  3665.     context.plug = plug;
  3666.     dialogSetCustdata(hd,(DWORD)&context);
  3667.     dialogLFV(hd);
  3668.     int cx = 14;
  3669.     dialogOK(hd,cx);
  3670.     dialogCancel(hd,cx);
  3671.     dialogControlID(hd,IDD_RETURN);
  3672.     dialogButtonCmd(hd,"改行(&R)",NULL,cx);
  3673.     return dialogOpen(hd);
  3674. }
  3675.  
  3676. BOOL TXAPI TXCMDBASE txuiInsertFootnote(TX* text)
  3677. {
  3678.     return dialogaFootnote(text,NULL);
  3679. }
  3680.  
  3681. //## 特殊文字
  3682.  
  3683. #define IDD_FONTPREVIEW    100
  3684. #define IDD_FONTSTR        101
  3685. #define IDD_COPYRIGHT    102
  3686. #define IDD_REGISTERED    103
  3687. #define IDD_TRADEMARK    104
  3688. #define IDD_CODE        105
  3689. #define IDD_CODETABLE    106
  3690.  
  3691. typedef struct {
  3692.     TX* text;
  3693.     PLUGFONT* plug;
  3694.     //
  3695.     mchar lfFaceName[LF_FACESIZE];
  3696.     BYTE lfHeight;
  3697.     mchar* szStr;
  3698. } FONTCONTEXT;
  3699.  
  3700. static int _iddFontsel;
  3701.  
  3702. static void SetFont(HWND hwnd,int id)
  3703. {
  3704.     HWND hctrl = GetDlgItem(hwnd,id);
  3705.     if (hctrl) {
  3706.         HFONT hfont = (HFONT)SendMessage(hctrl,WM_GETFONT,0,0);
  3707.         LOGFONT lf;
  3708.         if (hfont == NULL) {
  3709.             hfont = GetStockObject(GetSystemFontNo());
  3710.         }
  3711. //information("%d",hfont);
  3712.         if (GetObject(hfont,sizeof(lf),&lf)) {
  3713.             strcpy(lf.lfFaceName,"Symbol");
  3714.             lf.lfWeight = FW_NORMAL;
  3715.             lf.lfPitchAndFamily = DEFAULT_PITCH;
  3716.             lf.lfCharSet = DEFAULT_CHARSET;
  3717.             if (hfont = CreateFontIndirect(&lf)) {
  3718.                 SendMessage(hctrl,WM_SETFONT,(WPARAM)hfont,0);
  3719.             }
  3720.         }
  3721.     }
  3722. }
  3723.  
  3724. static void ResetFont(HWND hwnd,int id)
  3725. {
  3726.     HWND hctrl = GetDlgItem(hwnd,id);
  3727.     if (hctrl) {
  3728.         HFONT hfont = (HFONT)SendMessage(hctrl,WM_GETFONT,0,0);
  3729.         if (hfont) {
  3730.             DeleteObject(hfont);
  3731.         }
  3732.     }
  3733. }
  3734.  
  3735. BOOL dlgprocFont(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  3736. {
  3737.     switch(message) {
  3738.         case WM_INITDIALOG: {
  3739.             HDIALOG hd = dialogFromHwnd(hwnd);
  3740.             HWND hctrl = GetDlgItem(hwnd,IDD_FONTPREVIEW);
  3741.             TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
  3742.             if (text) {
  3743.                 text->fDispLine = FALSE;
  3744.                 text->fSetWidthByWindow = TRUE;
  3745.                 text->lfProp = TRUE;
  3746.                 text->lfWestern = TRUE;
  3747.                 txFlush(text);
  3748.             }
  3749.             SetFont(hwnd,IDD_FONTSTR);
  3750.             //2.99D 970329 特殊文字のアラインを合わせるのは見送ったので、フォントサイズを選択不可にした
  3751.             EnableDlgItem(hwnd,_iddFontsel+1,FALSE);
  3752.             break;
  3753.         }
  3754.         case WM_DESTROY: {
  3755.             ResetFont(hwnd,IDD_FONTSTR);
  3756.             break;
  3757.         }
  3758.         case WM_COMMAND: {
  3759.             HDIALOG hd = dialogFromHwnd(hwnd);
  3760.             int id = WM_COMMAND_GetId(wParam);
  3761.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  3762.             FONTCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  3763.             if (
  3764.                 (id == _iddFontsel || id == _iddFontsel + 1) &&
  3765.                 notify == CBN_SELCHANGE
  3766.             ) {
  3767.                 PostMessage(hwnd,WM_TXUSER,0,0);
  3768.             } else {
  3769.                 switch(id) {
  3770.                     case IDD_FONTSTR: {
  3771.                         if (notify == EN_UPDATE) PostMessage(hwnd,WM_TXUSER,0,0);
  3772.                         break;
  3773.                     }
  3774.                     case IDD_COPYRIGHT:
  3775.                     case IDD_REGISTERED:
  3776.                     case IDD_TRADEMARK: {
  3777.                         HWND hctrl = GetDlgItem(hwnd,_iddFontsel);
  3778.                         int i = ComboBox_FindStringExact(hctrl,0,"Symbol");
  3779.                         ComboBox_SetCurSel(hctrl,i);
  3780.                         mchar szbuff[2] = {0,0};
  3781.                         switch(id) {
  3782.                             case IDD_COPYRIGHT: szbuff[0] = 227;break;
  3783.                             case IDD_REGISTERED: szbuff[0] = 226;break;
  3784.                             case IDD_TRADEMARK: szbuff[0] = 228;break;
  3785.                         }
  3786.                         SetDlgItemText(hwnd,IDD_FONTSTR,szbuff);
  3787.                         break;
  3788.                     }
  3789.                     case IDD_CODE: {
  3790.                         HDIALOG hd = dialog("文字コード");
  3791.                         static int code = 192;
  3792.                         dialogInt(hd,"コード(&O):",&code,10,5);
  3793.                         if (dialogOpen(hd)) {
  3794.                             mchar szbuff[CCHWORD+1];
  3795.                             GetDlgItemText(hwnd,IDD_FONTSTR,szbuff,CCHWORD);
  3796.                             int lch = strlen(szbuff);
  3797.                             szbuff[lch++] = code;
  3798.                             szbuff[lch] = 0;
  3799.                             SetDlgItemText(hwnd,IDD_FONTSTR,szbuff);
  3800.                         }
  3801.                         break;
  3802.                     }
  3803.                     case IDD_CODETABLE: {
  3804.                         if (WinExec("charmap.exe",SW_SHOW) < 32) {
  3805.                             information("charmap.exeが起動できないので、文字コード表は使えません");
  3806.                         }
  3807.                         break;
  3808.                     }
  3809.                 }
  3810.             }
  3811.             break;
  3812.         }
  3813.         case WM_TXUSER: {
  3814.             HDIALOG hd = dialogFromHwnd(hwnd);
  3815.             HWND hctrl = GetDlgItem(hwnd,IDD_FONTPREVIEW);
  3816.             TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
  3817.             FONTCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  3818.             if (text) {
  3819.                 dialogRead(hd);
  3820.                 //
  3821.                 txSetUndisp(text);
  3822.                 txDeleteText(text);
  3823.                 txInsert(text,context->szStr);
  3824. //statprintf("%d",strlen(context->szStr));
  3825.                 //
  3826.                 FONTSTYLE* fs = &text->tFontstyle[FONTTX_TEXT];
  3827.                 strcpy(fs->tlfFaceName[IFONT_STD],context->lfFaceName);
  3828.                 fs->tlfHeight[IFONT_STD] = context->lfHeight;
  3829.                 strcpy(fs->tlfFaceName[IFONT_ANK],context->lfFaceName);
  3830.                 fs->tlfHeight[IFONT_ANK] = context->lfHeight;
  3831.                 //
  3832.                 txFlush(text);
  3833.                 txSetDisp(text);
  3834.             }
  3835.             break;
  3836.         }
  3837.     }
  3838.     return FALSE;
  3839. }
  3840.  
  3841. permanent txstr p_lfFaceNamePlugFont = "Wingdings";//3.00A3 970508 
  3842.  
  3843. static BOOL dialogaFont(TX* text,PLUGFONT* plug)
  3844. {
  3845. // plug=NULL:新規作成
  3846.     if (text->editmode == 0 && !plug) {
  3847.         //2.99C 970324 「特殊文字の挿入」テキストモード対応
  3848.     } else {
  3849.         if (!IsEditmode(text)) return FALSE;//2.98 970308 
  3850.     }
  3851.     HDIALOG hd;
  3852.     int lxg = 16;
  3853.     if (plug) {
  3854.         hd = dialog("特殊文字のプロパティ");
  3855.     } else {
  3856.         hd = dialog("特殊文字の挿入");
  3857.     }
  3858.     dialogSetHookEx(hd,"\m.dlgprocFont");
  3859.     FONTCONTEXT context;
  3860.     structClear(context);
  3861.     context.text = text;
  3862.     context.plug = plug;
  3863.     dialogSetCustdata(hd,(DWORD)&context);
  3864.     //
  3865.     txstr szStr(CCHWORD);
  3866.     context.szStr = szStr;
  3867.     if (plug) {
  3868.         szStr = plug->szStr;
  3869.         strcpy(context.lfFaceName,plug->lfFaceName);
  3870.         context.lfHeight = plug->lfHeight;
  3871.     } else {
  3872.         // set default
  3873. #if 1//3.00A3 970508 「挿入|特殊文字」最後に指定したフォント名を覚える様にした
  3874.         strcpy(context.lfFaceName,p_lfFaceNamePlugFont);
  3875.         context.lfHeight = 0;//2.99D 970329 12->0
  3876. #else
  3877.         strcpy(context.lfFaceName,"Wingdings");
  3878.         context.lfHeight = 0;//2.99D 970329 12->0
  3879. #endif
  3880.     }
  3881.     //
  3882.     dialogControlID(hd,IDD_FONTSTR);
  3883.     dialogStr(hd,"文字列(&S):",szStr,lxg,30);
  3884.     //
  3885.     dialogSetH(hd);
  3886.         SELFONTARG arg;
  3887.         structClear(arg);
  3888.         arg.lfPitch = DEFAULT_PITCH;
  3889.         arg.lfCharSet = DEFAULT_CHARSET;
  3890.         arg.fEnableDefaultHeight = TRUE;//2.99D 970329 
  3891.         _iddFontsel = dialogSelectFont(hd,"フォント(&F):",lxg,context.lfFaceName,&context.lfHeight,&arg);
  3892.     dialogLF(hd);
  3893.         dialogSetPosLX(hd,lxg+1);
  3894.         dialogControlID(hd,IDD_COPYRIGHT);
  3895.         dialogButton(hd,"著作権(&C)",NULL,12);
  3896.         dialogControlID(hd,IDD_REGISTERED);
  3897.         dialogButton(hd,"登録商標(&R)",NULL,12);
  3898.         dialogControlID(hd,IDD_TRADEMARK);
  3899.         dialogButton(hd,"商標(&T)",NULL,11);
  3900.         dialogLF(hd);
  3901.         dialogSetPosLX(hd,lxg+1);
  3902.         dialogControlID(hd,IDD_CODE);
  3903.         dialogButton(hd,"コード入力(&O)...",NULL,18);
  3904.         dialogControlID(hd,IDD_CODETABLE);
  3905.         dialogButton(hd,"文字コード表(&M)...",NULL,18);
  3906.     dialogLF(hd);
  3907.     dialogSetV(hd);
  3908.     //
  3909.     dialogCaption(hd,"プレビュー:");
  3910.     DTRECT r;
  3911.     dialogGetPos(hd,&r);
  3912.     r.cx = DTCX * 70;
  3913.     r.cy = DTCY * 10;
  3914.     __dialogAddItem(hd,TXWS_SZCLASS,"",IDD_FONTPREVIEW,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_VSCROLL|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP);
  3915.     //
  3916.     if (dialogOpen(hd)) {
  3917.         p_lfFaceNamePlugFont = context.lfFaceName;//3.00A3 970508 
  3918.         if (text->editmode == 0) {
  3919.             //2.99C 970324 
  3920.             PLUGFONT plug;
  3921.             structClear(plug);
  3922.             strcpy(plug.lfFaceName,context.lfFaceName);
  3923.             plug.lfHeight = context.lfHeight;
  3924.             sstrcpy(plug.szStr,szStr);
  3925.             txCharatrSet(text,TAG_FONT,&plug);
  3926.         } else {
  3927.             PLUGFONT* plug = plugatrNew(text,PLUG_FONT);
  3928.             if (plug) {
  3929.                 strcpy(plug->lfFaceName,context.lfFaceName);
  3930.                 plug->lfHeight = context.lfHeight;
  3931.                 sstrcpy(plug->szStr,szStr);
  3932.                 txReplacePlug(text,plug,context.plug);
  3933.                 txDispAll(text);
  3934.                 return TRUE;
  3935.             }
  3936.             return FALSE;
  3937.         }
  3938.     }
  3939.     return FALSE;
  3940. }
  3941.  
  3942. BOOL TXAPI TXCMDBASE txuiInsertFont(TX* text)
  3943. {
  3944.     return dialogaFont(text,NULL);
  3945. }
  3946.  
  3947. //## 図,リンク
  3948.  
  3949. typedef struct {
  3950.     TX* text;
  3951.     BOOL fNew;
  3952.     int modePlug;
  3953.     mchar szfilename[CCHPATHNAME];//2.99B 970321 
  3954.     mchar* szmask;//3.00A3 970508 
  3955. } LINKCONTEXT;
  3956.  
  3957. static void dialogAddPathMode(HDIALOG hd,int* modeFilename,TX* text)
  3958. {
  3959. #if 1//2.99B 970321 
  3960.     dialogControlID(hd,IDD_RELATIVE);
  3961.     if (text->fHTML) {
  3962.         dialogRadioID(hd,modeFilename,"相対","ドライブ名なし","絶対","ベースディレクトリからの相対");
  3963.     } else {
  3964.         dialogRadioID(hd,modeFilename,"相対","ドライブ名なし","絶対");
  3965.     }
  3966. #else
  3967.     #if 1//1.99B URLは未完成
  3968.     dialogControlID(hd,IDD_RELATIVE);
  3969.     dialogRadioID(hd,modeFilename,"相対","ドライブ名なし","絶対");
  3970.     #else
  3971.     dialogControlID(hd,IDD_RELATIVE);
  3972.     dialogRadioID(hd,modeFilename,"相対","ドライブ名なし","絶対","URL");
  3973.     #endif
  3974. #endif
  3975. }
  3976.  
  3977. static void CheckDlgButtons(HWND hwnd,int idTop,int idEnd,int idCheck)
  3978. {
  3979.     int id;
  3980.     for (id = idTop;id <= idEnd;id++) {
  3981.         CheckDlgButton(hwnd,id,(id == idCheck));
  3982.     }
  3983. }
  3984.  
  3985. static BOOL referFilename(HWND hwnd,int id,mchar* szpath,mchar* szCaption,txstr _szfilename)
  3986. {
  3987.     mchar szfilename[CCHPATHNAME];
  3988.     strcpy(szfilename,szpath);
  3989.     if (txofnReferFileName(text,szfilename,szCaption)) {
  3990.         SendDlgItemMessage(hwnd,id,WM_SETTEXT,0,(LPARAM)szfilename);
  3991. #if 1//2.99B 970321 
  3992.         _szfilename = szfilename;
  3993.         return TRUE;
  3994. #else
  3995.         //1.99E 相対指定をデフォルトとする
  3996.         SendMessage(hwnd,WM_COMMAND,IDD_RELATIVE,0);
  3997. #endif
  3998.     }
  3999.     return FALSE;
  4000. }
  4001.  
  4002. static void flushFilename(HWND hwnd,LINKCONTEXT* context,TX* text)
  4003. {
  4004. //2.99B 970321 new
  4005.     int id = dialogGetCheckedRadio(hwnd,IDD_RELATIVE,IDD_RELATIVEBASED);
  4006.     mchar buff[CCHPATHNAME];
  4007.     sstrcpy(buff,context->szfilename);
  4008.     if (id == IDD_RELATIVEBASED) {
  4009.         //2.99B 970321 
  4010.         txstr szBase = text->share->config.szPathHtmlBase;
  4011.         pathSetDir(szBase);
  4012.         pathSetMode(buff,szBase,NULL,PATH_RELATIVE);
  4013.         #if 1    //2.99D 970401 「ベースディレクトリからの相対」頭に必ず / を付けるようにした
  4014.                 // 付けないと意味ない
  4015.         {
  4016.             txstr foo = "/";
  4017.             foo += buff;
  4018.             sstrcpy(buff,foo);
  4019.         }
  4020.         #endif
  4021.     } else {
  4022.         int mode = id - IDD_RELATIVE;
  4023.         pathSetMode(buff,text->szfilename,NULL,mode);
  4024.     }
  4025.     if (text->fHTML) {
  4026.         // HTMLでは図やリンクのパスセパレータを'/'にした
  4027.         pathFlushSepa(buff,'/');
  4028.         //2.99C 970323 
  4029.         switch(text->share->config.modeHtmlFilenameCase) {
  4030.             case FNC_TOLOWER: strlwr(buff);break;
  4031.             case FNC_TOUPPER: strupr(buff);break;
  4032.         }
  4033.     }
  4034.     SetDlgItemText(hwnd,IDD_FILENAME,buff);
  4035. }
  4036.  
  4037. static void EnableFilenameMode(HWND hwnd,BOOL fEnable)
  4038. {
  4039.     int id;
  4040.     for (id = IDD_RELATIVE;id <= IDD_RELATIVEBASED;id++) {
  4041.         EnableDlgItem(hwnd,id,fEnable);
  4042.     }
  4043. }
  4044.  
  4045. #define PLUG_SEMILINK            250    //2.99C 970324 
  4046. #define PLUG_REFERHTMLFILENAME    251    //3.00A3 970508 
  4047.  
  4048. //2.99B 970321 抜本改良
  4049. BOOL dlgprocBitmap(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  4050. {
  4051.     HDIALOG hd = dialogFromHwnd(hwnd);
  4052.     LINKCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  4053.     TX* text = context->text;
  4054.     switch(message) {
  4055.         case WM_INITDIALOG: {
  4056.             EnableFilenameMode(hwnd,FALSE);
  4057.             if (context->fNew) {
  4058.                 PostMessage(hwnd,WM_TXUSER,0,0);
  4059.             }
  4060.             break;
  4061.         }
  4062.         case WM_COMMAND: {
  4063.             int id = WM_COMMAND_GetId(wParam);
  4064.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  4065.             switch(id) {
  4066.                 case IDD_RELATIVE:
  4067.                 case IDD_ABSOLUTE:
  4068.                 case IDD_ABSOLUTEDRIVE:
  4069.                 case IDD_RELATIVEBASED: {
  4070.                     PostMessage(hwnd,WM_TXUSER,0,0);
  4071.                     break;
  4072.                 }
  4073.                 case IDD_REFERFILENAME: {
  4074.                     txstr szfilename = context->szfilename;
  4075.                     BOOL f = FALSE;
  4076.                     if (
  4077.                         context->modePlug == PLUG_LINK ||
  4078.                         context->modePlug == PLUG_SEMILINK    //3.00A 970502 簡易リンクの参照マスクを"*.*"にした
  4079.                     ) {
  4080.                         // .htm .txt 以外にも、
  4081.                         // .exe,.lzh,.gif,.jpg等へのリンクも多用するからマスクを*.*とする
  4082.                         f = referFilename(hwnd,IDD_FILENAME,"*.*","リンク先のファイル名",szfilename);
  4083.                     } else if (context->modePlug == PLUG_REFERHTMLFILENAME) {//3.00A3 970508 
  4084.                         f = referFilename(hwnd,IDD_FILENAME,context->szmask,"ファイルの参照",szfilename);
  4085.                     } else {
  4086.                         f = referFilename(hwnd,IDD_FILENAME,"*.bmp;*.gif","図のファイル名",szfilename);
  4087.                     }
  4088.                     if (f) {
  4089.                         sstrcpy(context->szfilename,szfilename);
  4090.                         flushFilename(hwnd,context,text);
  4091.                         EnableFilenameMode(hwnd,TRUE);
  4092.                     }
  4093.                     break;
  4094.                 }
  4095.             }
  4096.             break;
  4097.         }
  4098.         case WM_TXUSER: {
  4099.             flushFilename(hwnd,context,text);
  4100.             break;
  4101.         }
  4102.     }
  4103.     return FALSE;
  4104. }
  4105.  
  4106. BOOL TXAPI txReferFilenameHtml(TX* text,mchar szfilename[CCHPATHNAME],mchar* szmask)
  4107. {
  4108. //3.00A3 970508 new
  4109.     LINKCONTEXT context;
  4110.     structClear(context);
  4111.     context.text = text;
  4112.     context.modePlug = PLUG_REFERHTMLFILENAME;
  4113.     //
  4114.     if (szmask && *szmask) {
  4115.         context.szmask = szmask;
  4116.     } else {
  4117.         context.szmask = "*.*";
  4118.     }
  4119.     //
  4120.     int modeFilename = pathGetMode(szfilename);
  4121.     sstrcpy(context.szfilename,szfilename);
  4122.     HDIALOG hd = dialog("ファイル名の参照");
  4123.     dialogSetCustdata(hd,(DWORD)&context);
  4124.     dialogSetHookEx(hd,"\m.dlgprocBitmap");
  4125.     //
  4126.     dialogControlID(hd,IDD_FILENAME);
  4127.     dialogStrC(hd,"ファイル名(&N):",szfilename,20,CCHPATHNAME,33);
  4128.     //
  4129.     dialogControlID(hd,IDD_REFERFILENAME);
  4130.     dialogButton(hd,"参照(&F)...",NULL,10);
  4131.     //
  4132.     dialogAddPathMode(hd,&modeFilename,text);
  4133.     if (dialogOpen(hd)) {
  4134.         return TRUE;
  4135.     }
  4136.     return FALSE;
  4137. }
  4138.  
  4139. BOOL txGetWordCaption(TX* text,txstr szCaption)
  4140. {
  4141. //2.99 970313 new
  4142.     if (txIsClipInPara(text)) {
  4143.         txGetWord(text,szCaption);
  4144.         if (strchr(szCaption,CHAR_PLUG)) {
  4145.             information("キャプションには文字だけが指定できます。");
  4146.             szCaption = "";
  4147.             return FALSE;
  4148.         }
  4149.         return TRUE;
  4150.     }
  4151.     return FALSE;
  4152. }
  4153.  
  4154. static BOOL _dialogaLink(TX* text,LPVOID* plug,int modePlug)
  4155. {
  4156.     BOOL ret = FALSE;
  4157.     HSTRBLK sbTarget = NULL;
  4158.     if (text->editmode == 0 && !plug) {
  4159.         //2.99C 970324 「図の挿入」、「リンク」テキストモード対応
  4160.     } else {
  4161.         if (!IsEditmode(text)) return FALSE;//2.98 970308 
  4162.     }
  4163.     PLUGIMG* plugimg = plug;
  4164.     PLUGLINK* pluglink = plug;
  4165.     BOOL fClip = FALSE;
  4166.     LINKCONTEXT context;
  4167.     structClear(context);
  4168.     context.text = text;
  4169.     context.fNew = (plug == NULL);
  4170.     context.modePlug = modePlug;
  4171.     HDIALOG hd;
  4172.     if (modePlug == PLUG_IMG) {
  4173.         hd = dialog(plug ? "図のプロパティ" : "図の挿入");
  4174.     } else if (modePlug == PLUG_SEMILINK) {
  4175.         hd = dialog("簡易リンクの挿入");
  4176.     } else {
  4177.         hd = dialog(plug ? "ハイパーリンクのプロパティ" : "ハイパーリンクの挿入");
  4178.     }
  4179.     dialogSetCustdata(hd,(DWORD)&context);
  4180.     dialogSetHookEx(hd,"\m.dlgprocBitmap");
  4181.     //
  4182.     txstr szCaption;
  4183.     txstr szTarget;//2.99C 970325 
  4184.     if (modePlug == PLUG_LINK) {
  4185. #if 1//2.99 970313 
  4186.         if (plug) {
  4187.             szCaption = pluglink->szCaption;
  4188.         } else if (txGetWordCaption(text,szCaption)) {
  4189.             fClip = TRUE;
  4190.         }
  4191. #else
  4192.         if (plug) {
  4193.             szCaption = pluglink->szCaption;
  4194.         } else if (txIsClipInPara(text)) {
  4195.             fClip = TRUE;
  4196.             txGetWord(text,szCaption);
  4197.             if (strchr(szCaption,CHAR_PLUG)) {
  4198.                 information("リンクのキャプションには文字だけが指定できます。");
  4199.                 dialogTerm(hd);//2.99 970313 
  4200.                 return FALSE;
  4201.             }
  4202.         }
  4203. #endif
  4204.         dialogStr(hd,"キャプション(&C):",szCaption,20,33);
  4205.         if (text->fHTML) {
  4206.             //2.99C 970325 
  4207.             sbTarget = sbNewAlloc(100);
  4208.             sbAdd(sbTarget,"_self");
  4209.             sbAdd(sbTarget,"_blank");
  4210.             sbAdd(sbTarget,"_parent");
  4211.             sbAdd(sbTarget,"_top");
  4212.             sbAdd(sbTarget,"title");
  4213.             sbAdd(sbTarget,"main");
  4214.             sbAdd(sbTarget,"contents");
  4215.             dialogControlHist(hd,sbTarget);
  4216.             dialogStr(hd,"TARGET(&T):",szTarget,20,33);
  4217.         }
  4218.     }
  4219.     mchar szfilename[CCHPATHNAME] = {0};
  4220.     if (plug) {
  4221.         if (modePlug == PLUG_IMG) sstrcpy(szfilename,plugimg->szfilename);
  4222.         if (modePlug == PLUG_LINK) sstrcpy(szfilename,pluglink->szfilename);
  4223.     }
  4224.     dialogControlID(hd,IDD_FILENAME);
  4225.     dialogStrC(
  4226.         hd,
  4227.         ((modePlug == PLUG_IMG) ? "図のファイル名(&N):" : "リンク先のファイル名(&N):"),
  4228.         szfilename,20,CCHPATHNAME,33
  4229.     );
  4230.     //
  4231.     dialogControlID(hd,IDD_REFERFILENAME);
  4232.     dialogButton(hd,"参照(&F)...",NULL,10);
  4233.     //
  4234.     sstrcpy(context.szfilename,szfilename);//2.99B 970321 
  4235.     int modeFilename = pathGetMode(szfilename);
  4236.     dialogAddPathMode(hd,&modeFilename,text);
  4237.     //
  4238.     int width = 0;
  4239.     int modeWidth = 0;
  4240.     if (!text->fHTML && modePlug == PLUG_IMG) {
  4241.         if (plugimg) {
  4242.             width = plugimg->atr.width;
  4243.             if (width != 0) {
  4244.                 modeWidth = 2;
  4245.                 if (width < 0) {
  4246.                     modeWidth = 1;
  4247.                     width = -width;
  4248.                 }
  4249.             }
  4250.             if (plugimg->atr.fWidthOriginal) modeWidth = 3;
  4251.         }
  4252.         dialogHeadline(hd,"図の表示幅",55);//2.99C 970326 40->55
  4253.         if (text->editmode == 0) dialogSetEnable(hd,FALSE);//2.99C 970324 
  4254.         dialogSelectID(hd,"幅の指定方法(&A):",&modeWidth,16,30,"標準","折り返し幅に対する%指定","ドット数で指定","指定しない");
  4255.         dialogInt(hd,"幅(&W):",&width,16,4);
  4256.         if (text->editmode == 0) dialogSetEnable(hd,TRUE);//2.99C 970324 
  4257.     }
  4258.     if (dialogOpen(hd)) {
  4259.         txSetUndisp(text);
  4260.         if (modePlug == PLUG_SEMILINK) {//2.99C 970324 
  4261.             txInsertChar(text,'"');
  4262.             txInsert(text,szfilename);
  4263.             txInsertChar(text,'"');
  4264. #if 1//2.99D 970331 HTMLではリンクをPLUGLINKで挿入するのはやめた
  4265.         } else if (
  4266.             text->fHTML && modePlug == PLUG_LINK
  4267.         )
  4268. #else
  4269.         } else if (
  4270.             text->fHTML && (
  4271.                 (szTarget[0] && modePlug == PLUG_LINK) ||
  4272.                 text->editmode == 0
  4273.             )
  4274.         )
  4275. #endif
  4276.          {
  4277.             //2.99C 970325 ハイパーリンクのプロパティでTARGETアトリビュートを指定できるようにした
  4278.             if (text->editmode) txSetUndisp(text);//2.99G 970405 
  4279.             if (text->fClip) {
  4280.                 //2.99F 970404 HTMLのリンク挿入でキャプションを選択してから実行しても、選択したキャプションがテキストから削除されなかった
  4281.                 txSelectDelete(text);
  4282.             } else if (plug) {
  4283.                 txDeleteChar(text);
  4284.             }
  4285.             //
  4286.             txstr szTag = "<A";
  4287.             if (szfilename[0]) {
  4288.                 szTag += " HREF=\"";
  4289.                 szTag += szfilename;
  4290.                 szTag += "\"";
  4291.             }
  4292.             if (szTarget[0]) {
  4293.                 szTag += " TARGET=\"";
  4294.                 szTag += szTarget;
  4295.                 szTag += "\"";
  4296.             }
  4297.             szTag += ">";
  4298.             txInsertHtmlSzTag(text,szTag,TAG_LINK);
  4299.             if (text->editmode) {//2.99G 970405 
  4300.                 IFILE adrTop = txGetAddress(text);
  4301.                 text->charatr.fHottext = TRUE;
  4302.                 txInsert(text,szCaption);
  4303.                 IFILE adrTail = txGetAddress(text);
  4304.                 for (IFILE adr = adrTop;adr < adrTail;adr++) {
  4305.                     CHARATR charatr;
  4306.                     charatrRead(text,adr,&charatr);
  4307.                     charatr.fHottext = TRUE;
  4308.                     charatr.fUnderline = TRUE;
  4309.                     charatrWrite(text,adr,&charatr);
  4310.                 }
  4311.             } else {
  4312.                 txInsert(text,szCaption);
  4313.             }
  4314.             //
  4315.             txInsertHtmlSzTag(text,"</A>",TAG_LINK);
  4316.             if (text->editmode) txSetDisp(text);//2.99G 970405 for fHottext change to Display
  4317.         } else if (text->editmode == 0) {//2.99C 970324 
  4318.             if (modePlug == PLUG_IMG) {
  4319.                 txCharatrSet(text,TAG_IMG,szfilename);
  4320.             }
  4321.             if (modePlug == PLUG_LINK) {//2.99C 970324 
  4322.                 PLUGLINK plug;
  4323.                 structClear(plug);
  4324.                 sstrcpy(plug.szfilename,szfilename);
  4325.                 sstrcpy(plug.szCaption,szCaption);
  4326.                 txSelectDelete(text);
  4327.                 txCharatrSet(text,TAG_LINK,&plug);
  4328.             }
  4329.         } else {
  4330.             if (plug) {
  4331.                 if (modePlug == PLUG_IMG) {
  4332.                     sstrcpy(plugimg->szfilename,szfilename);
  4333.                 }
  4334.                 if (modePlug == PLUG_LINK) {
  4335.                     sstrcpy(pluglink->szfilename,szfilename);
  4336.                     sstrcpy(pluglink->szCaption,szCaption);
  4337.                 }
  4338.             } else {
  4339.                 if (modePlug == PLUG_IMG) txCharatrSet(text,TAG_IMG,szfilename);
  4340.                 if (modePlug == PLUG_LINK) {
  4341.                     PLUGLINK* plug = plugatrNew(text,PLUG_LINK);
  4342.                     if (plug) {
  4343.                         sstrcpy(plug->szfilename,szfilename);
  4344.                         sstrcpy(plug->szCaption,szCaption);
  4345. #if 1//2.99 970313 
  4346.                         txSelectDelete(text);
  4347. #else
  4348.                         if (fClip) txSelectDelete(text);
  4349. #endif
  4350.                         txInsertPlug(text,plug);
  4351.                         txLeft(text);
  4352.                     }
  4353.                 }
  4354.             }
  4355.             if (!text->fHTML && modePlug == PLUG_IMG) {
  4356.                 PLUGIMG* plug = txGetCurPlug(text);
  4357.                 PLUGIMGATR* atr = &plug->atr;
  4358.                 atr->fWidthOriginal = FALSE;
  4359.                 atr->width = 0;
  4360.                 switch(modeWidth) {
  4361.                     case 3:atr->fWidthOriginal = TRUE;break;
  4362.                     case 2:atr->width = width;break;
  4363.                     case 1:atr->width = -width;break;
  4364.                 }
  4365.             }
  4366.         }
  4367.         tyFlush(text);//2.99I 970406 
  4368.         txSetDisp(text);
  4369.         ret = TRUE;
  4370.     }
  4371.     if (sbTarget) sbDelete(sbTarget);
  4372.     return ret;
  4373. }
  4374.  
  4375. static BOOL dialogaBitmap(TX* text,PLUGIMG* plug)
  4376. {
  4377.     return _dialogaLink(text,plug,PLUG_IMG);
  4378. }
  4379.  
  4380. BOOL TXAPI TXCMDBASE txuiInsertBitmap(TX* text)
  4381. {
  4382.     return dialogaBitmap(text,NULL);
  4383. }
  4384.  
  4385. static BOOL dialogaLink(TX* text,PLUGLINK* plug)
  4386. {
  4387.     return _dialogaLink(text,plug,PLUG_LINK);
  4388. }
  4389.  
  4390. BOOL TXAPI TXCMDBASE txuiLink(TX* text)
  4391. {
  4392. // リンクの挿入、プロパティ
  4393.     if (txGetCurPlugmode(text) == PLUG_LINK) {
  4394.         return dialogaLink(text,txGetCurPlug(text));
  4395.     } else {
  4396.         return dialogaLink(text,NULL);
  4397.     }
  4398. }
  4399.  
  4400. BOOL TXAPI TXCMDBASE txuiInsertSemiLink(TX* text)
  4401. {
  4402. // 簡易リンクの挿入
  4403. //2.99C 970324 new
  4404.     return _dialogaLink(text,NULL,PLUG_SEMILINK);
  4405. }
  4406.  
  4407. //## table convert
  4408. //2.99C 970324 new
  4409.  
  4410. static BOOL txInsertPlugTable(TX* text)
  4411. {
  4412.     if (text->editmode) {
  4413.         mchar* szTag = "<TD>";
  4414.         int lch = text->fHTML ? strlen(szTag) : 0;
  4415.         PLUGTAB* plug = plugatrNewEx(text,PLUG_TAB,lch + 1);
  4416.         if (plug) {
  4417.             plug->cchTagAlloc = lch + 1;
  4418.             if (text->fHTML) strcpylen(plug->szTag,szTag,lch);
  4419.             plug->modeTab = MODETAB_TABLE;
  4420.             plug->modeSepaLeft = MODESEPA_STD;
  4421.             plug->modeSepaBottom = MODESEPA_STD;
  4422.             txInsertPlug(text,plug);
  4423.             return TRUE;
  4424.         }
  4425.     } else if (text->fHTML) {
  4426.         txInsert(text,"<TD>");
  4427.         return TRUE;
  4428.     } else {
  4429.         return txInsertChar(text,'|');
  4430.     }
  4431.     return FALSE;
  4432. }
  4433.  
  4434. static BOOL txIsCurParaTableMode(TX* text,int mode)
  4435. {
  4436.     if (mode >= 2 && text->editmode) {
  4437.         PLUGTAB* plug = txIsCurParaIncludeTable(text);
  4438.         if (plug && plug->modeTab == MODETAB_TABLE) return TRUE;
  4439.     } else {
  4440.         mchar ch = (mode == 0) ? '\t' : ',';
  4441.         if (mode >= 2) ch = '|';
  4442.         txstr szline;
  4443.         txGetPara(text,szline);
  4444.         if (strchr(szline,ch)) return TRUE;
  4445.     }
  4446.     return FALSE;
  4447. }
  4448.  
  4449. BOOL TXCMDBASE txuiConvertTable(TX* text)
  4450. {
  4451. // 表の変換
  4452. //2.99C 970324 new
  4453.     HDIALOG hd = dialog("表の変換");
  4454.     int mode = 0;
  4455.     
  4456.     PLUGTAB* plug = txIsCurParaIncludeTable(text);
  4457.     if (plug && plug->modeTab == MODETAB_TABLE) {
  4458.         mode = 2;
  4459.     } else {
  4460.         txstr szline;
  4461.         txGetPara(text,szline);
  4462.         if (strchr(szline,'\t')) {
  4463.             mode = 0;
  4464.         } else if (strchr(szline,',')) {
  4465.             mode = 1;
  4466.         } else if (strchr(szline,'|')) {
  4467.             mode = 2;
  4468.         }
  4469.     }
  4470.     dialogControlRadioV(hd);
  4471.     dialogRadioID(hd,&mode,
  4472.         "タブ区切りの表 → WZの表",
  4473.         "カンマ区切りの表 → WZの表",
  4474.         "WZの表 → タブ区切りの表",
  4475.         "WZの表 → カンマ区切りの表"
  4476.     );
  4477.     if (dialogOpen(hd)) {
  4478.         BOOL fHtmlInsert = (text->fHTML && mode < 2);
  4479.         txSetUndisp(text);
  4480.         NPARA nparaTop;
  4481.         NPARA nparaEnd;
  4482.         if (text->fClip) {
  4483.             txJumpSelectTop(text);
  4484.             nparaTop = text->npara;
  4485.             txJumpSelectEnd(text);
  4486.             nparaEnd = text->npara;
  4487.             if (txIsCurParaTop(text)) nparaEnd--;
  4488.         } else {
  4489.             while(1) {
  4490.                 if (!txIsCurParaTableMode(text,mode)) {
  4491.                     nparaTop = text->npara + 1;
  4492.                     break;
  4493.                 }
  4494.                 if (!txPrevPara(text)) {
  4495.                     nparaTop = text->npara;
  4496.                     break;
  4497.                 }
  4498.             }
  4499.             txJumpNpara(text,nparaTop);
  4500.             while(1) {
  4501.                 if (!txIsCurParaTableMode(text,mode)) {
  4502.                     nparaEnd = text->npara - 1;
  4503.                     break;
  4504.                 }
  4505.                 if (!txNextPara(text)) {
  4506.                     nparaTop = text->npara;
  4507.                     break;
  4508.                 }
  4509.             }
  4510.         }
  4511.         if (nparaEnd < nparaTop) {
  4512.             // err
  4513.         } else {
  4514.             for (NPARA npara = nparaTop;npara <= nparaEnd;npara++) {
  4515.                 IFILE adrLast = TXRECORD_ERROR;
  4516.                 int iTab = 0;
  4517.                 txJumpNpara(text,npara);
  4518.                 if (fHtmlInsert) {
  4519.                     txInsertHtmlSzTag(text,"<TR>",TAG_TR);
  4520.                 }
  4521.                 if (mode < 2) {
  4522.                     txInsertPlugTable(text);
  4523.                 }
  4524.                 while(1) {
  4525.                     TXCHAR ch = txGetChar(text);
  4526.                     if (txIsCurReturn(text)) break;
  4527.                     if (
  4528.                         (mode == 0 && ch == CHAR_TAB) ||
  4529.                         (mode == 1 && ch == ',')
  4530.                     ) {
  4531.                         txDeleteChar(text);
  4532.                         txInsertPlugTable(text);
  4533.                     } else if (
  4534.                         mode >= 2 && (
  4535.                             (text->editmode == 0 && ch == '|') ||
  4536.                             (text->editmode && txGetCurPlugmode(text) == PLUG_TAB)
  4537.                         )
  4538.                     ) {
  4539.                         txDeleteChar(text);
  4540.                         if (iTab) {
  4541.                             adrLast = txGetAddress(text);
  4542.                             txInsertChar(text,(mode == 2) ? '\t' : ',');
  4543.                         }
  4544.                         iTab++;
  4545.                     } else if (mode >= 2 && text->fHTML && text->editmode && txGetCurPlugmode(text) == PLUG_HTML_TAG) {
  4546.                         // <TR>などを削除
  4547.                         txDeleteChar(text);
  4548.                     } else {
  4549.                         if (!txRight(text)) break;
  4550.                     }
  4551.                 }
  4552.                 if (mode >= 2) {
  4553.                     if (adrLast != TXRECORD_ERROR) {
  4554.                         // 末尾のよけいな部分を削除
  4555.                         txJumpAddress(text,adrLast);
  4556.                         txDeleteChar(text);
  4557.                     }
  4558.                 } else {
  4559.                     if (text->fHTML && text->editmode == 0) {
  4560.                         // 不要
  4561.                     } else {
  4562.                         txInsertPlugTable(text);
  4563.                     }
  4564.                 }
  4565.             }
  4566.             txFlushTable(text);
  4567.             txJumpNpara(text,nparaEnd);
  4568.             txJumpParaEnd(text);
  4569.             if (fHtmlInsert) {
  4570.                 txInsertHtmlSzTag(text,"</TABLE>",TAG_TABLE);
  4571.             }
  4572.             txSelectEx(text,CLIP_MOUSE);
  4573.             txJumpNpara(text,nparaTop);
  4574.             if (fHtmlInsert) {
  4575.                 txInsertHtmlSzTag(text,"<TABLE>",TAG_TABLE);
  4576.                 txJumpNpara(text,nparaTop);
  4577.             }
  4578.         }
  4579.         txSetDisp(text);
  4580.     }
  4581.     return TRUE;
  4582. }
  4583.  
  4584. //## ruby
  4585.  
  4586. static BOOL dialogaRuby(TX* text,PLUGRUBY* plug0)
  4587. {
  4588.     PLUGRUBY bodyRuby;//2.99C 970324 
  4589.     PLUGRUBY* plug;
  4590.     if (text->editmode == 0) {
  4591.         //2.99C 970324 「ルビ」テキストモード対応
  4592.         plug = &bodyRuby;
  4593.         structClear(*plug);
  4594.     } else {
  4595.         plug = plugatrNew(text,PLUG_RUBY);//2.99D 970328 ルビが変だった
  4596.     }
  4597.     if (!plug) return FALSE;
  4598.     if (plug0) *plug = *plug0;
  4599.     BOOL fClip = FALSE;
  4600.     if (!plug0) {
  4601.         if (txIsClipInPara(text)) {
  4602.             fClip = TRUE;
  4603.             txstr sz;
  4604.             txGetWord(text,sz);
  4605.             sstrcpy(plug->szTarget,sz);
  4606.         }
  4607.     }
  4608.     HDIALOG hd = dialog(plug0 ? "ルビのプロパティ" : "ルビの挿入");
  4609.     //
  4610.     dialogStrC(hd,"ふりがな(&R):",plug->szRuby,16,cchof(plug->szRuby),20);
  4611.     dialogStrC(hd,"漢字(&T):",plug->szTarget,16,cchof(plug->szTarget),20);
  4612.     if (dialogOpen(hd)) {
  4613.         txSetUndisp(text);
  4614.         #if 1//2.99 970313 
  4615.         txSelectDelete(text);
  4616.         #else
  4617.         if (fClip) txSelectDelete(text);
  4618.         #endif
  4619.         if (text->editmode == 0) {
  4620.             //2.99C 970324 
  4621.             txCharatrSet(text,TAG_RUBY,plug);
  4622.         } else {
  4623.             txReplacePlug(text,plug,plug0);
  4624.         }
  4625.         txSetDisp(text);
  4626.         return TRUE;
  4627.     } else {
  4628.         if (text->editmode == 0) {
  4629.             //2.99C 970324 
  4630.         } else {
  4631.             plugatrDelete(text,plugatrGetTyp(text,plug));//2.99 970312 freeしてなかった
  4632.         }
  4633.     }
  4634.     return FALSE;
  4635. }
  4636.  
  4637. BOOL TXAPI TXCMDBASE txuiRuby(TX* text)
  4638. {
  4639. // ルビの挿入、プロパティ
  4640.     if (text->editmode && txGetCurPlugmode(text) == PLUG_RUBY) {
  4641.         return dialogaRuby(text,txGetCurPlug(text));
  4642.     } else {
  4643.         return dialogaRuby(text,NULL);
  4644.     }
  4645. }
  4646.  
  4647. //3.00B1 970609 txuiRubi:スペルミス txuiRubyを新設
  4648. BOOL TXAPI TXCMD txuiRubi(TX* text)
  4649. {
  4650.     return txuiRuby(text);
  4651. }
  4652.  
  4653. //## 校正
  4654. //2.98 970305 
  4655.  
  4656. permanent txstr szProofReader;
  4657. #define IDD_PROOF_TARGET    500
  4658. #define IDD_PROOF_PROOF        501
  4659. #define IDD_PROOF_EXCHANGE    502
  4660.  
  4661. static TX* txGetForProof(HWND hwnd,int idd)
  4662. {
  4663. //2.99 970312 new
  4664.     HWND hctrl = GetDlgItem(hwnd,idd);
  4665.     TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
  4666.     if (text) {
  4667.         text->dlgcode = DLGC_WANTARROWS|DLGC_WANTCHARS;
  4668.         text->fDispUnder = FALSE;
  4669.         text->fDispLine = FALSE;
  4670.         text->fSpaceLeft = FALSE;
  4671.         text->nSpaceTopH = 0;
  4672.         text->fSetWidthByWindow = TRUE;
  4673.         text->fScrollBarV = TRUE;
  4674.         text->fScrollBarH = FALSE;
  4675.         txFlush(text);
  4676.         text->lcySmupper = 0;
  4677.         text->lcySmlower = 0;
  4678.         return text;
  4679.     }
  4680.     return NULL;
  4681. }
  4682.  
  4683. typedef struct {
  4684.     TX* text;
  4685.     PLUGPROOF* plug0;
  4686.     PLUGPROOF* plug1;
  4687.     BOOL fClip;
  4688.     mchar szReader[CCHSWORD];
  4689. } PROOFCONTEXT;
  4690.  
  4691. BOOL dlgprocProof(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  4692. {
  4693.     HDIALOG hd = dialogFromHwnd(hwnd);
  4694.     PROOFCONTEXT* context = dialogGetCustdata(hd);
  4695.     switch(message) {
  4696.         case WM_INITDIALOG: {
  4697.             TX* text = txGetForProof(hwnd,IDD_PROOF_TARGET);
  4698.             PLUGPROOF* plug0 = context->plug0;
  4699.             if (text) {
  4700.                 if (plug0) {
  4701.                     txInsert(text,plug0->szTarget_szProof);
  4702.                 } else {
  4703.                     if (txIsClipInPara(context->text)) {
  4704.                         context->fClip = TRUE;
  4705.                         txstr sz;
  4706.                         txGetWord(context->text,sz);
  4707.                         txInsert(text,sz);
  4708.                     }
  4709.                 }
  4710.                 txUndoClear(text);//2.99 970316 
  4711.             }
  4712.             //
  4713.             TX* text = txGetForProof(hwnd,IDD_PROOF_PROOF);
  4714.             if (text && plug0) {
  4715.                 txInsert(text,plug0->szTarget_szProof + plug0->ichProof);
  4716.                 txUndoClear(text);//2.99 970316 
  4717.             }
  4718.             break;
  4719.         }
  4720.         case WM_COMMAND: {
  4721.             int id = WM_COMMAND_GetId(wParam);
  4722.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  4723.             if (id == IDD_PROOF_EXCHANGE) {
  4724.                 //2.99 970317 
  4725.                 TX* text1 = txGetForProof(hwnd,IDD_PROOF_TARGET);
  4726.                 TX* text2 = txGetForProof(hwnd,IDD_PROOF_PROOF);
  4727.                 if (text1 && text2) {
  4728.                     TX* text0 = txAllocText(0);
  4729.                     if (text0) {
  4730.                         if (txOpenText(text0)) {
  4731.                             txInsertText(text0,text1);
  4732.                             txDeleteText(text1);
  4733.                             txInsertText(text1,text2);
  4734.                             txDeleteText(text2);
  4735.                             txInsertText(text2,text0);
  4736.                         }
  4737.                         txFreeText(text0);
  4738.                     }
  4739.                 }
  4740.             } else if (id == IDOK) {
  4741. #if 1//2.99 970313 
  4742.                 txSelectDelete(context->text);
  4743. #else
  4744.                 if (context->fClip) txSelectDelete(context->text);
  4745. #endif
  4746.                 TX* text1 = txGetForProof(hwnd,IDD_PROOF_TARGET);
  4747.                 TX* text2 = txGetForProof(hwnd,IDD_PROOF_PROOF);
  4748.                 if (text1 && text2) {
  4749.                     int lch1 = txGetTextSize(text1);
  4750.                     int lch2 = txGetTextSize(text2);
  4751.                     int cch = (lch1 + 1) + (lch2 + 1);
  4752.                     if (context->text->editmode == 0) {
  4753.                         //2.99C 970324 「校正」テキストモード対応
  4754.                         TX* text = context->text;
  4755.                         txInsert(text,text->tszformat[SZFORMAT_PROOF_TOP]);
  4756.                         txInsertText(text,text1);
  4757.                         txInsert(text,text->tszformat[SZFORMAT_SEPARATOR]);
  4758.                         txInsertText(text,text2);
  4759.                         txInsert(text,text->tszformat[SZFORMAT_SEPARATOR]);
  4760.                     } else {
  4761.                         PLUGPROOF* plug = plugatrNewEx(context->text,PLUG_PROOF,cch);
  4762.                         if (plug) {
  4763.                             plug->cchProofAlloc = cch;
  4764. //information("%d %d",lch1,lch2);
  4765.                             //
  4766.                             txSelectAll(text1);
  4767.                             txPrivatePush(text1);
  4768.                             memClipPaste(plug->szTarget_szProof,HCLIP_PRIVATE);
  4769.                             plug->szTarget_szProof[lch1] = 0;
  4770.                             txPrivateDeleteTop(text1);
  4771.                             plug->ichProof = lch1 + 1;
  4772.                             //
  4773.                             txSelectAll(text2);
  4774.                             txPrivatePush(text2);
  4775.                             memClipPaste(plug->szTarget_szProof + plug->ichProof,HCLIP_PRIVATE);
  4776.                             plug->szTarget_szProof[plug->ichProof + lch2] = 0;
  4777.                             txPrivateDeleteTop(text2);
  4778.                             context->plug1 = plug;
  4779.                         }
  4780.                     }
  4781.                 }
  4782.             }
  4783.         }
  4784.     }
  4785.     return FALSE;
  4786. }
  4787.  
  4788. static BOOL dialogaProof(TX* text,PLUGPROOF* plug0)
  4789. {
  4790. #if 1//2.99 970312 校正改良。文字数の長さの制限をなくした
  4791.     PROOFCONTEXT context;
  4792.     structClear(context);
  4793.     context.text = text;
  4794.     context.plug0 = plug0;
  4795.     sstrcpy(context.szReader,plug0 ? plug0->szReader : szProofReader);
  4796.     //
  4797.     HDIALOG hd = dialog(plug0 ? "校正のプロパティ" : "校正の挿入");
  4798.     dialogSetHookEx(hd,"\m.dlgprocProof");
  4799.     dialogSetCustdata(hd,&context);
  4800.     DTRECT r;
  4801.     dialogSetH(hd);
  4802.     DWORD ws = TXWS_TEXT|TXWS_OPENTEXT|TXWS_ENABLEUNDO|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP;
  4803.     ws |= TXWS_FONTINHERIT;//2.99D 970328 
  4804.         dialogCaption(hd,"校正対象(&T):");dialogSetPosLX(hd,13);
  4805.         dialogGetPos(hd,&r);
  4806.         r.cx = DTCX * 40;r.cy = DTCY * 3;
  4807.         __dialogAddItem(hd,TXWS_SZCLASS,"",IDD_PROOF_TARGET,&r,ws);
  4808.         dialogSetPosY(hd,r.y + r.cy);dialogLF(hd);
  4809.         //
  4810.         dialogCaption(hd,"校正内容(&P):");dialogSetPosLX(hd,13);
  4811.         dialogGetPos(hd,&r);
  4812.         r.cx = DTCX * 40;r.cy = DTCY * 3;
  4813.         __dialogAddItem(hd,TXWS_SZCLASS,"",IDD_PROOF_PROOF,&r,ws);
  4814.         dialogSetPosY(hd,r.y + r.cy);dialogLF(hd);
  4815.     dialogSetV(hd);
  4816.     //2.99 970317 
  4817.     dialogControlID(hd,IDD_PROOF_EXCHANGE);
  4818.     dialogSetPosLX(hd,13);
  4819.     dialogButton(hd,"校正対象と校正内容の入れ替え(&X)",NULL,34);
  4820.     dialogSetPosLX(hd,0);
  4821.     //
  4822.     dialogStrC(hd,"校正者(&R):",context.szReader,12,cchof(context.szReader),20);
  4823.     int iddCommit = 0;
  4824.     int iddCancel = 0;
  4825.     
  4826.     if (plug0) {
  4827.         int lx = 18;
  4828.         dialogLFV(hd);
  4829.         dialogOK(hd,lx);
  4830.         dialogCancel(hd,lx);
  4831.         iddCancel = dialogCmd(hd,"校正の取り消し(&E)",lx);
  4832.         iddCommit = dialogCmd(hd,"校正の承認(&C)",lx);
  4833.     }
  4834.     
  4835.     int ret;
  4836.     text->fNoImeControl++;//2.99D 970401 校正ダイアログではIMEの制御をしないようにした。使いにくかった
  4837.     ret = dialogOpen(hd);
  4838.     text->fNoImeControl--;//2.99D 970401 
  4839.     if (ret) {
  4840.         szProofReader = context.szReader;
  4841.         if (text->editmode == 0) {//2.99C 970324 
  4842.             txInsert(text,szProofReader);
  4843.             txInsert(text,text->tszformat[SZFORMAT_PROOF_END]);
  4844.         } else {
  4845.             txSetUndisp(text);
  4846.                 if (ret == iddCommit) {
  4847.                     txInsert(text,plug0->szTarget_szProof + plug0->ichProof);
  4848.                     txDeleteChar(text);
  4849.                 } else if (ret == iddCancel) {
  4850.                     txInsert(text,plug0->szTarget_szProof);
  4851.                     txDeleteChar(text);
  4852.                 } else {
  4853.                     if (context.plug1) {
  4854.                         sstrcpy(context.plug1->szReader,context.szReader);
  4855.                         txReplacePlug(text,context.plug1,plug0);
  4856.                     }
  4857.                 }
  4858.             txSetDisp(text);
  4859.         }
  4860.         return TRUE;
  4861.     }
  4862.     return FALSE;
  4863. #else
  4864.     PLUGPROOF* plug = plugatrNew(text,PLUG_PROOF);
  4865.     if (!plug) return FALSE;
  4866.     if (plug0) *plug = *plug0;
  4867.     BOOL fClip = FALSE;
  4868.     if (!plug0) {
  4869.         if (txIsClipInPara(text)) {
  4870.             fClip = TRUE;
  4871.             txstr sz;
  4872.             txGetWord(text,sz);
  4873.             sstrcpy(plug->szTarget,sz);
  4874.         }
  4875.     }
  4876.     HDIALOG hd = dialog(plug0 ? "校正のプロパティ" : "校正の挿入");
  4877.     dialogSetHookEx(hd,"\m.dlgprocProof");
  4878.     dialogSetCustdata(hd,plug);
  4879.     if (!plug0) sstrcpy(plug->szReader,szProofReader);
  4880.     dialogStrC(hd,"校正対象(&T):",plug->szTarget,12,cchof(plug->szTarget),40);
  4881.     dialogStrC(hd,"校正内容(&P):",plug->szProof,12,cchof(plug->szProof),40);
  4882.     dialogStrC(hd,"校正者(&R):",plug->szReader,12,cchof(plug->szReader),20);
  4883.     int iddCommit = 0;
  4884.     int iddCancel = 0;
  4885.     
  4886.     if (plug0) {
  4887.         int lx = 18;
  4888.         dialogLFV(hd);
  4889.         dialogOK(hd,lx);
  4890.         dialogCancel(hd,lx);
  4891.         iddCancel = dialogCmd(hd,"校正の取り消し(&E)",lx);
  4892.         iddCommit = dialogCmd(hd,"校正の承認(&C)",lx);
  4893.     }
  4894.     
  4895.     int ret;
  4896.     if (ret = dialogOpen(hd)) {
  4897.         szProofReader = plug->szReader;
  4898.         txSetUndisp(text);
  4899.             if (ret == iddCommit) {
  4900.                 txInsert(text,plug->szProof);
  4901.                 txDeleteChar(text);
  4902.             } else if (ret == iddCancel) {
  4903.                 txInsert(text,plug->szTarget);
  4904.                 txDeleteChar(text);
  4905.             } else {
  4906.                 if (fClip) txSelectDelete(text);
  4907.                 txReplacePlug(text,plug,plug0);
  4908.             }
  4909.         txSetDisp(text);
  4910.         return TRUE;
  4911.     } else {
  4912.         plugatrDelete(text,plugatrGetTyp(text,plug));//2.99 970312 freeしてなかった
  4913.     }
  4914.     return FALSE;
  4915. #endif
  4916. }
  4917.  
  4918. BOOL TXAPI TXCMDBASE txuiProof(TX* text)
  4919. {
  4920. // 校正の挿入、プロパティ
  4921.     if (text->editmode && txGetCurPlugmode(text) == PLUG_PROOF) {
  4922.         return dialogaProof(text,txGetCurPlug(text));
  4923.     } else {
  4924.         return dialogaProof(text,NULL);
  4925.     }
  4926. }
  4927.  
  4928. //## charatr
  4929.  
  4930. BOOL TXAPI TXCMDBASE txuiCharProperty(TX* text)
  4931. {
  4932.     if (!IsEditmode(text)) return FALSE;//2.98 970308 
  4933.     int plugmode = txGetCurPlugmode(text);
  4934.     if (
  4935.         text->editmode &&
  4936.         (plugmode == 0 || plugmode == PLUG_TAB) && //2.99D 970329 桁揃え中の校正などの属性が変更できなかった
  4937.         txIsCurParaIncludeTable(text)
  4938.     ) {//2.99C 970325 
  4939.         return txuiTable(text);
  4940.     }
  4941.     if (text->buff[text->cur] == CHAR_PLUG) {
  4942.         if (text->editmode) {
  4943.             CHARATR charatr;
  4944.             charatrRead(text,txGetAddress(text),&charatr);
  4945.             if (charatr.fLink) {
  4946.                 LPVOID plughead = plugatrRead(text,charatrGetPlug(charatr));
  4947.                 switch(((PLUGHEAD*)plughead)->modePlug) {
  4948.                     case PLUG_FOOTNOTE: {
  4949.                         dialogaFootnote(text,(PLUGFOOTNOTE*)plughead);
  4950.                         break;
  4951.                     }
  4952.                     case PLUG_FONT: {
  4953.                         dialogaFont(text,(PLUGFONT*)plughead);
  4954.                         break;
  4955.                     }
  4956.                     case PLUG_IMG: {
  4957.                         dialogaBitmap(text,(PLUGIMG*)plughead);
  4958.                         break;
  4959.                     }
  4960.                     case PLUG_LINK: {
  4961.                         dialogaLink(text,(PLUGLINK*)plughead);
  4962.                         break;
  4963.                     }
  4964.                     case PLUG_RUBY: {
  4965.                         dialogaRuby(text,(PLUGRUBY*)plughead);
  4966.                         break;
  4967.                     }
  4968.                     case PLUG_PROOF: {//2.98 970305 
  4969.                         dialogaProof(text,(PLUGPROOF*)plughead);
  4970.                         break;
  4971.                     }
  4972.                     case PLUG_OLE: {//2.99D 970329 Alt+EnterでOLEオブジェクトアクティベートするようにした
  4973. //PLUGOLE* plug = plughead;information(plug->szname);
  4974.                         txJumpLink(text);
  4975.                         break;
  4976.                     }
  4977.                 }
  4978.             }
  4979.         }
  4980.         return TRUE;
  4981.     }
  4982.     return FALSE;
  4983. }
  4984.  
  4985. BOOL TXAPI TXCMDBASE txuiCharatr(TX* text)
  4986. {
  4987. // 文字装飾ダイアログ
  4988.     HDIALOG hd = dialog("文字装飾");
  4989.     BOOL fBold = text->charatr.fBold;
  4990.     BOOL fUnderline = text->charatr.fUnderline;
  4991.     BOOL fItalic = text->charatr.fItalic;
  4992.     dialogCheck(hd,"太字(&B)",&fBold);
  4993.     dialogCheck(hd,"下線(&U)",&fUnderline);
  4994.     dialogCheck(hd,"斜体(&I)",&fItalic);
  4995.     dialogLFV(hd);
  4996.     dialogOK(hd,10);
  4997.     dialogCancel(hd,10);
  4998.     int idClear = dialogCmd(hd,"クリア(&C)",10);
  4999.     int ret = dialogOpen(hd);
  5000.     if (ret) {
  5001.         if (ret == idClear) {
  5002.             txCharNormal(text);
  5003.         } else {
  5004.             txSetUndisp(text);
  5005.             txCharNormal(text);
  5006.             if (fBold) txCharBold(text);
  5007.             if (fItalic) txCharItalic(text);
  5008.             if (fUnderline) txCharUnderline(text);
  5009.             txSetDisp(text);
  5010.         }
  5011.         text->charatr.fBold = fBold;
  5012.         text->charatr.fUnderline = fUnderline;
  5013.         text->charatr.fItalic = fItalic;
  5014.         return TRUE;
  5015.     }
  5016.     return FALSE;
  5017. }
  5018.  
  5019. static NPARA txGetNparaMy(TX* text)
  5020. {
  5021. // 範囲選択時は範囲内のnparaを返す
  5022.     if (text->fClip && txFlushSelectNow(text)) {
  5023.         if (text->cliptopnow <= text->clipendnow) {
  5024.             if (txGetAddress(text) == txGetParaTop(text)) return text->npara-1;
  5025.         }
  5026.     }
  5027.     return text->npara;
  5028. }
  5029.  
  5030. #define IDD_INDENTTOP_DEFAULT    100
  5031. #define IDD_INDENTTOP            101
  5032.  
  5033. BOOL dlgprocParaatr(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  5034. {
  5035.     switch(message) {
  5036.         case WM_INITDIALOG: {
  5037.             PostMessage(hwnd,WM_TXUSER,0,0);
  5038.             break;
  5039.         }
  5040.         case WM_COMMAND: {
  5041.             int id = WM_COMMAND_GetId(wParam);
  5042.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  5043.             if (id == IDD_INDENTTOP_DEFAULT) {
  5044.                 PostMessage(hwnd,WM_TXUSER,0,0);
  5045.             }
  5046.             break;
  5047.         }
  5048.         case WM_TXUSER: {
  5049.             EnableDlgItem(hwnd,IDD_INDENTTOP,!IsDlgButtonChecked(hwnd,IDD_INDENTTOP_DEFAULT));
  5050.         }
  5051.     }
  5052.     return FALSE;
  5053. }
  5054.  
  5055. BOOL TXAPI TXCMDBASE txuiParaatr(TX* text)
  5056. {
  5057. // 段落体裁ダイアログ
  5058.     if (text->filekind == TEXT_MAIL) {
  5059.         return call("paraform.configParaatr");
  5060.     }
  5061.     int lcxWidth = 40;
  5062.     HDIALOG hd = dialog("段落体裁");
  5063.     dialogSetHookEx(hd,"\m.dlgprocParaatr");
  5064.     PARAATR paraatr;
  5065.     paraatrRead(text,txGetNparaMy(text),¶atr);
  5066.     int lcxIndent = paraatr.lcxIndent;
  5067.     int lcxIndentTop = paraatr.lcxIndentTop;
  5068.     int lcxIndentRight = paraatr.lcxIndentRight;
  5069.     int modeAlign = paraatr.modeAlign;
  5070.     BOOL fIndenTopDefault = (lcxIndent == lcxIndentTop);
  5071.     
  5072.     dialogControlConvertEx(hd,"\m.convprocAlign");
  5073.     dialogSelectID(hd,"配置(&A):",&modeAlign,20,15,"左揃え","中央揃え","右揃え");
  5074.         dialogHeadline(hd,"左インデント",lcxWidth);
  5075.     if (text->editmode == 0) dialogSetEnable(hd,FALSE);//2.99C 970324 
  5076.     dialogControlGuide(hd,"文字",6);
  5077.     dialogInt(hd,"左(&L):",&lcxIndent,10,4);
  5078.         dialogSetH(hd);
  5079.     dialogControlGuide(hd,"文字",6);
  5080.     dialogControlID(hd,IDD_INDENTTOP);
  5081.     dialogInt(hd,"先頭行(&F):",&lcxIndentTop,10,4);
  5082.     dialogControlID(hd,IDD_INDENTTOP_DEFAULT);
  5083.     dialogCheck(hd,"標準値を使用(&D)",&fIndenTopDefault);
  5084.         dialogSetV(hd);
  5085.         dialogLF(hd);
  5086.         dialogHeadline(hd,"右インデント",lcxWidth);
  5087.     dialogControlGuide(hd,"文字",6);
  5088.     dialogInt(hd,"右(&R):",&lcxIndentRight,10,4);
  5089.     if (text->editmode == 0) dialogSetEnable(hd,TRUE);//2.99C 970324 
  5090.     
  5091.     dialogLFV(hd);
  5092.     dialogOK(hd,10);
  5093.     dialogCancel(hd,10);
  5094.     int iddClear = dialogCmd(hd,"クリア(&C)",10);
  5095.     int ret = dialogOpen(hd);
  5096.     if (ret) {
  5097.         if (ret == iddClear) {
  5098.             lcxIndent = 0;
  5099.             lcxIndentTop = 0;
  5100.             lcxIndentRight = 0;
  5101.             modeAlign = ALIGN_LEFT;
  5102.         }
  5103.         if (fIndenTopDefault) lcxIndentTop = lcxIndent;
  5104.         txSetUndisp(text);
  5105.         switch(modeAlign) {
  5106.             case ALIGN_LEFT: txFormLeft(text);break;
  5107.             case ALIGN_CENTER: txFormCenter(text);break;
  5108.             case ALIGN_RIGHT: txFormRight(text);break;
  5109.         }
  5110.         paraatr.lcxIndent = lcxIndent;
  5111.         paraatr.lcxIndentTop = lcxIndentTop;
  5112.         paraatr.lcxIndentRight = lcxIndentRight;
  5113.         mytxParaatrSet(text,TAG_INDENT,¶atr);
  5114.         txSetDisp(text);
  5115.         return TRUE;
  5116.     }
  5117.     return FALSE;
  5118. }
  5119.  
  5120. DWORD convprocArticle(DWORD data,int mode)
  5121. {
  5122.     static int t[] = {
  5123.         ARTICLE_NONE,ARTICLE_DISC,ARTICLE_NUMBER,ARTICLE_NOTICE,ARTICLE_CIRCLE,ARTICLE_SQUARE,
  5124.     };
  5125.     int n = sizeof(t) / sizeof(int);
  5126.     if (mode == TXDIALOG_READ) {
  5127.         if (data < n) return t[data];
  5128.         return 0;
  5129.     } else {
  5130.         int i;
  5131.         for (i = 0;i < n;i++) {
  5132.             if (t[i] == data) return i;
  5133.         }
  5134.         return 0;
  5135.     }
  5136. }
  5137.  
  5138. BOOL TXAPI TXCMDBASE txuiArticle(TX* text)
  5139. {
  5140. // 見出しと箇条書きダイアログ
  5141.     if (text->filekind == TEXT_MAIL) {
  5142.         return call("paraform.configArticle");
  5143.     }
  5144.     if (text->editmode == 0) {//2.99C 970324 「見出しと箇条書き」テキストモード対応
  5145.         HDIALOG hd = dialog("見出しと箇条書き");
  5146.         static int mode = 0;
  5147.         dialogControlRadioV(hd);
  5148.         dialogRadioID(hd,&mode,
  5149.             "見出し(&H)...",
  5150.             "箇条書き(&L)",
  5151.             "番号付き箇条書き(&N)",
  5152.             "※箇条書き(&O)",
  5153.             "箇条書きのクリア(&0)"
  5154.         );
  5155.         if (dialogOpen(hd)) {
  5156.             switch(mode) {
  5157.                 case 0: call("menu.見出し");break;
  5158.                 case 1: txFormArticleDisc(text);break;
  5159.                 case 2: txFormArticleNum(text);break;
  5160.                 case 3: txFormArticleNotice(text);break;
  5161.                 case 4: txFormArticleClear(text);break;
  5162.             }
  5163.             return TRUE;
  5164.         }
  5165.         return FALSE;//2.99C 970324 
  5166.     }
  5167.     int lcxWidth = 40;
  5168.     HDIALOG hd = dialog("見出しと箇条書き");
  5169.     PARAATR paraatr;
  5170.     paraatrRead(text,txGetNparaMy(text),¶atr);
  5171.     int modeHead = paraatr.modeTitle;
  5172.     int modeArticle = paraatr.modeArticle;
  5173.     txstr szSubHeadline(CCHWORD);
  5174.     dialogSelectID(hd,"見出し(&H):",&modeHead,20,15,"本文","章(H1)","節(H2)","項(H3)","中見出し(H4)","小見出し(H5)","表題(H6)");
  5175.     dialogControlConvertEx(hd,"\m.convprocArticle");
  5176.     dialogSelectID(hd,"箇条書き(&A):",&modeArticle,20,15,"なし","・","1.","※","○","□");
  5177.     {
  5178.         txSetUndispEx(text);
  5179.         txJumpParaTop(text);
  5180.         PLUGTAB* plug = (LPVOID)txOp(text,TXOP_PLUGTAB_CURPARA,0,0);
  5181.         if (plug && plug->modeTab == MODETAB_BEAMTAB) {
  5182.             IFILE adr = txGetAddress(text);
  5183.             if (txOp(text,TXOP_PLUGTAB_RIGHT,0,0)) {
  5184.                 int i = txGetAddress(text) - adr;
  5185.                 txGetPara(text,szSubHeadline);
  5186.                 if (i < CCHWORD) szSubHeadline[i] = 0;
  5187.             }
  5188.         }
  5189.         txSetDispEx(text);
  5190.     }
  5191.     dialogStr(hd,"小見出し(&S):",szSubHeadline,20,20);
  5192.     //
  5193.     dialogLFV(hd);
  5194.     dialogOK(hd,10);
  5195.     dialogCancel(hd,10);
  5196.     int iddClear = dialogCmd(hd,"クリア(&C)",10);
  5197.     int ret = dialogOpen(hd);
  5198.     if (ret) {
  5199.         if (ret == iddClear) {
  5200.             modeHead = 0;
  5201.             modeArticle = 0;
  5202.         }
  5203.         txSetUndisp(text);
  5204.         if (modeArticle == 0) {
  5205.             txFormArticleClear(text);
  5206.         } else {
  5207.             paraatr.fArticle = TRUE;
  5208.             paraatr.modeArticle = modeArticle;
  5209.             mytxParaatrSet(text,TAG_OL,¶atr);
  5210.         }
  5211.         paraatr.modeTitle = modeHead;
  5212.         mytxParaatrSet(text,TAG_H,¶atr);
  5213.         //
  5214.         mytxParaatrSet(text,TAG_SUBHEAD,(LPVOID)szSubHeadline);
  5215.         //
  5216.         txSetDisp(text);
  5217.         return TRUE;
  5218.     }
  5219.     return FALSE;
  5220. }
  5221.  
  5222. //## template
  5223. //2.97 970226 start
  5224.  
  5225. #define TE_WZSTR            1
  5226. #define TE_WZINT            2
  5227. #define TE_WZCHECKBOX        3
  5228. #define TE_WZADDRESSBOOK    4
  5229.  
  5230. #define TEMPLATE_INSERT        0    // 挿入
  5231. #define TEMPLATE_NEW        1    // 新規作成
  5232. #define TEMPLATE_LP            2    // 印刷時(カーソル位置は必ず先頭。移動しない。元のテキストを変化させない)
  5233.  
  5234. typedef struct {
  5235.     BYTE mode;
  5236.     mchar szCaption[CCHWORD];    // キャプション
  5237.     mchar szContent[CCHWORD];    // 内容
  5238.     mchar szArg[20];
  5239.     WORD lchTag;                // タグの長さ
  5240.     IFILE adr;                    // タグのアドレス
  5241.     WORD id;                    // dialog control id
  5242. } TECONTEXT;
  5243.  
  5244. #define MAX_TECONTEXT    100
  5245.  
  5246. static int my_strGetWordLen(mchar *szStr)
  5247. {
  5248. // 文字列szStrのスペース・タブまでの文字列のバイト数を返します
  5249. // ""内、0x0C-0x0C内のデリミタは無視する
  5250. //2.00Eから、()内,[]内のデリミタは無視しない
  5251.     mchar *p = szStr;
  5252.     BOOL fdq = FALSE;
  5253.     int len = 0;
  5254.     
  5255.     while(1) {
  5256.         mchar c = p[len];
  5257.         
  5258.         if (iskanji(c)) {//1.00B '['や']'が漢字2バイト目にマッチすることがある
  5259.             if (p[len + 1]) {
  5260.                 len += 2;
  5261.             } else {
  5262.                 break;
  5263.             }
  5264.         } else if (c == '"') {
  5265.             fdq ^= 1;
  5266.             len++;
  5267.         } else if (c == '\t' || c == ' ') {
  5268.             if (fdq) {
  5269.                 len++;
  5270.             } else {
  5271.                 break;
  5272.             }
  5273.         } else if (c == '>') {
  5274.             if (fdq) {
  5275.                 len++;
  5276.             } else {
  5277.                 if (len == 0) len++;
  5278.                 break;
  5279.             }
  5280.         } else if (c < ' ') {
  5281.             break;
  5282.         } else {
  5283.             len++;
  5284.         }
  5285.     }
  5286.     return len;
  5287. }
  5288.  
  5289. static BOOL templageGetSentence(TX* text,txstr szbuff)
  5290. {
  5291. // タグの終わりならFALSEを返す
  5292.     mchar* p0 = text->buff + text->cur;
  5293.     mchar* p = strGetWordTop(p0);
  5294.     int len = my_strGetWordLen(p);
  5295.     txRightBytes(text,len + p - p0);
  5296.     if (len) {
  5297.         if (len == 1 && p[0] == '>') return FALSE;
  5298.         if (szbuff) txstrcpylen(szbuff,p,len);
  5299.         return TRUE;
  5300.     }
  5301.     return FALSE;
  5302. }
  5303.  
  5304. static BOOL tamplateAnalyzeTag(TX* text,TECONTEXT* te,int mode)
  5305. {
  5306.     int istat = 0;
  5307.     txstr sztag;
  5308.     txstr szbuff;
  5309.     te->mode = mode;
  5310.     te->adr = txGetAddress(text);
  5311.     templageGetSentence(text,sztag);
  5312.     while(1) {
  5313.         if (!templageGetSentence(text,szbuff)) break;
  5314.         if (istat == 0) {
  5315.             mchar* p = strchr(szbuff,'=');
  5316.             if (p) {
  5317.                 *p = 0;
  5318.                 sstrcpy(te->szCaption,szbuff);
  5319.                 p++;
  5320.                 switch(mode) {
  5321.                     case TE_WZSTR: sstrcpy(te->szContent,p);break;
  5322.                     case TE_WZINT: *(int*)te->szContent = atoi(p);break;
  5323.                     case TE_WZCHECKBOX: *(BYTE*)te->szContent = atoi(p);break;
  5324.                 }
  5325.             } else {
  5326.                 sstrcpy(te->szCaption,szbuff);
  5327.             }
  5328.             if (mode == TE_WZADDRESSBOOK) {
  5329.                 sstrcpy(te->szArg,&sztag[strlen("<WzAb")]);
  5330.             }
  5331.         }
  5332.         istat++;
  5333.     }
  5334.     te->lchTag = txGetAddress(text) - te->adr;
  5335.     return TRUE;
  5336. }
  5337.  
  5338. static int getaccesskey(int ic)
  5339. {
  5340.     int ret = ic + 'A';
  5341.     if (ret <= 'Z') return ret;
  5342.     ret = ret - ('Z'+1) + '0';
  5343.     if (ret <= '9') return ret;
  5344.     return ' ';
  5345. }
  5346.  
  5347. static mchar* getcaption(mchar* _szcaption,int ic)
  5348. {
  5349.     txstr szcaption(CCHWORD - 10,_szcaption);
  5350.     static mchar buff[CCHWORD];
  5351.     sprintf(buff,"%s(&%c)",szcaption,getaccesskey(ic));
  5352.     return buff;
  5353. }
  5354.  
  5355. #define IDD_ADDRESSBOOK    100
  5356.  
  5357. typedef struct {
  5358.     TECONTEXT* tte;
  5359.     int nte;
  5360. } TEDLGCONTEXT;
  5361.  
  5362. BOOL dlgprocTemplate(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  5363. {
  5364.     HDIALOG hd = dialogFromHwnd(hwnd);
  5365.     switch(message) {
  5366.         case WM_INITDIALOG: {
  5367.             break;
  5368.         }
  5369.         case WM_COMMAND: {
  5370.             int id = WM_COMMAND_GetId(wParam);
  5371.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  5372.             TEDLGCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  5373.             switch(id) {
  5374.                 case IDD_ADDRESSBOOK: {
  5375. #if 1//2.99 970315 
  5376.                     TX* text = txuiAbNew();
  5377.                     if (text) {
  5378.                         txstr szcontent;
  5379.                         for (int i = 0;i < context->nte;i++) {
  5380.                             TECONTEXT* pte = context->tte + i;
  5381.                             if (pte->mode == TE_WZADDRESSBOOK) {
  5382.                                 szcontent = "";
  5383.                                 txAbSearchItem(text,pte->szArg,szcontent);
  5384.                                 SetDlgItemText(hwnd,pte->id,szcontent);
  5385.                             }
  5386.                         }
  5387.                         txAbDelete(text);
  5388.                     }
  5389. #else
  5390.                     addressbookUI();
  5391.                     TX _textBody;
  5392.                     TX* text = &_textBody;
  5393.                     if (txInit(text,NULL)) {
  5394.                         txClipPaste(text,HCLIP_WIN,FALSE,0);
  5395.                         txstr szcontent;
  5396.                         for (int i = 0;i < context->nte;i++) {
  5397.                             TECONTEXT* pte = context->tte + i;
  5398.                             if (pte->mode == TE_WZADDRESSBOOK) {
  5399.                                 szcontent = "";
  5400.                                 txAbSearchItem(text,pte->szArg,szcontent);
  5401.                                 SetDlgItemText(hwnd,pte->id,szcontent);
  5402.                             }
  5403.                         }
  5404.                         txClose(text);
  5405.                     }
  5406. #endif
  5407.                     break;
  5408.                 }
  5409.             }
  5410.             break;
  5411.         }
  5412.     }
  5413.     return FALSE;
  5414. }
  5415.  
  5416. static void templateExec(TX* textTarget,TX* text,int mode)
  5417. {
  5418.     SEARCHMODE searchmode = SEARCH_CUR|SEARCH_NOSENSECASE;
  5419.     BOOL fClip = ((mode != TEMPLATE_LP) && textTarget->fClip);
  5420.     txSetUndisp(textTarget);
  5421.     txJumpFileTop(text);
  5422.     TECONTEXT* tte = memAllocZeroinit(sizeof(TECONTEXT) * MAX_TECONTEXT);
  5423.     BOOL fDialogCanceled = FALSE;
  5424.     if (tte) {
  5425.         TECONTEXT* pte = tte;
  5426.         txstr szbuff;
  5427.         BOOL fAddressbook = FALSE;
  5428.         while(1) {
  5429.             if (pte - tte == MAX_TECONTEXT) {
  5430.                 information("Full");
  5431.                 break;
  5432.             }
  5433.             if (txSearchEx(text,"<WZ",searchmode)) {
  5434.                 int len;
  5435.                 if (len = txCmpCurI(text,"<WZSTR")) {
  5436.                     tamplateAnalyzeTag(text,pte++,TE_WZSTR);
  5437.                 } else if (len = txCmpCurI(text,"<WZINT")) {
  5438.                     tamplateAnalyzeTag(text,pte++,TE_WZINT);
  5439.                 } else if (len = txCmpCurI(text,"<WZCHECKBOX")) {
  5440.                     tamplateAnalyzeTag(text,pte++,TE_WZCHECKBOX);
  5441.                 } else if (txCmpCurI(text,"<WzAb")) {
  5442.                     tamplateAnalyzeTag(text,pte++,TE_WZADDRESSBOOK);
  5443.                     fAddressbook = TRUE;
  5444.                 } else {
  5445.                     if (!txRight(text)) break;
  5446.                 }
  5447.             } else {
  5448.                 break;
  5449.             }
  5450.         }
  5451.         int n = pte - tte;
  5452.         if (n) {//2.98 970304 0個の時は実行しない
  5453.             TEDLGCONTEXT context;
  5454.             context.tte = tte;
  5455.             context.nte = n;
  5456.             HDIALOG hd = dialog(pathGetFileName(text->szfilename));
  5457.             dialogSetHookEx(hd,"\m.dlgprocTemplate");
  5458.             dialogSetCustdata(hd,&context);
  5459.             int i;
  5460.             int ic = fAddressbook ? 1 : 0;
  5461.             for (i = 0;i < n;i++) {
  5462.                 pte = tte + i;
  5463.                 switch(pte->mode) {
  5464.                     case TE_WZADDRESSBOOK:
  5465.                     case TE_WZSTR: {
  5466.                         pte->id = dialogStrC(hd,getcaption(pte->szCaption,ic++),pte->szContent,20,cchof(pte->szContent),40);
  5467.                         break;
  5468.                     }
  5469.                     case TE_WZINT: {
  5470.                         pte->id = dialogInt(hd,getcaption(pte->szCaption,ic++),(int*)pte->szContent,20,5);
  5471.                         break;
  5472.                     }
  5473.                     case TE_WZCHECKBOX: {
  5474.                         pte->id = dialogCheckB(hd,getcaption(pte->szCaption,ic++),(LPBYTE)pte->szContent);
  5475.                         break;
  5476.                     }
  5477.                     default: {
  5478.                         dialogCaption(hd,pte->szCaption);
  5479.                         break;
  5480.                     }
  5481.                 }
  5482.             }
  5483.             if (fAddressbook) {
  5484.                 dialogControlID(hd,IDD_ADDRESSBOOK);
  5485.                 dialogButton(hd,"住所録(&A)...",NULL,14);
  5486.             }
  5487.             if (dialogOpen(hd)) {
  5488.                 long d = 0;
  5489.                 int i;
  5490.                 for (i = 0;i < n;i++) {
  5491.                     pte = tte + i;
  5492.                     txJumpAddress(text,pte->adr - d);
  5493.                     txDeleteBytes(text,pte->lchTag);d += pte->lchTag;
  5494.                     switch(pte->mode) {
  5495.                         case TE_WZADDRESSBOOK:
  5496.                         case TE_WZSTR: {
  5497.                             txInsert(text,pte->szContent);
  5498.                             d -= strlen(pte->szContent);
  5499.                             break;
  5500.                         }
  5501.                         case TE_WZINT: {
  5502.                             sprintf(pte->szContent,"%d",*(int*)pte->szContent);
  5503.                             txInsert(text,pte->szContent);
  5504.                             d -= strlen(pte->szContent);
  5505.                             break;
  5506.                         }
  5507.                         case TE_WZCHECKBOX: {
  5508.                             if (pte->szContent[0]) {
  5509.                                 txInsert(text,"■");d -= 2;
  5510.                             } else {
  5511.                                 txInsert(text,"□");d -= 2;
  5512.                             }
  5513.                             txInsert(text,pte->szCaption);
  5514.                             d -= strlen(pte->szCaption);
  5515.                             break;
  5516.                         }
  5517.                     }
  5518.                 }
  5519.             } else {
  5520.                 fDialogCanceled = TRUE;
  5521.             }
  5522.         }
  5523.         memFree(tte);
  5524.         if (!fDialogCanceled) {
  5525.             // WZMACROの実行
  5526.             TX* textTemplate = text;
  5527.             txJumpFileTop(text);
  5528.             while(1) {
  5529.                 if (txSearchEx(text,"<WZMACRO",searchmode)) {
  5530.                     IFILE adr = txGetAddress(text);
  5531.                     txstr szbuff;
  5532.                     txstr szcall;
  5533.                     templageGetSentence(text,NULL);
  5534.                     int istat = 0;
  5535.                     while(1) {
  5536.                         if (!templageGetSentence(text,szbuff)) break;
  5537.                         if (istat == 0) {
  5538.                             szcall = szbuff;
  5539.                         }
  5540.                         istat++;
  5541.                     }
  5542.                     int lchTag = txGetAddress(text) - adr;
  5543.                     txJumpAddress(text,adr);
  5544.                     txDeleteBytes(text,lchTag);
  5545.                     {
  5546.                         TX _textBody;
  5547.                         TX* text = &_textBody;
  5548.                         if (txInit(text,NULL)) {
  5549.                             DWORD ret;
  5550.                             // モジュール名が省略されていたら、"template"をモジュール名とする
  5551.                             {
  5552.                                 mchar* p = strchr(szcall,'(');
  5553.                                 if (p) *p = 0;
  5554.                                 BOOL fNoDot = (strchr(szcall,'.') == NULL);
  5555.                                 if (p) *p = '(';
  5556.                                 if (fNoDot) {
  5557.                                     szcall = "template." + szcall;
  5558.                                 }
  5559.                             }
  5560.                             // macroCallStrでコンパイル実行しないように。
  5561.                             // macroCallStrでコンパイル実行されると、
  5562.                             // textが切り替わって別のtextにマクロ実行内容が出力されてしまう。
  5563.                             macroGetKind(szcall);
  5564.                             {
  5565.                                 TX* textf0 = textf;
  5566.                                 textf = text;
  5567.                                 macroCallStr(szcall,&ret);
  5568.                                 textf = textf0;
  5569.                             }
  5570.                             txInsertText(textTemplate,text);
  5571.                             txClose(text);
  5572.                         }
  5573.                     }
  5574.                 } else {
  5575.                     break;
  5576.                 }
  5577.             }
  5578.             // WzTxXXXの実行
  5579.             txJumpFileTop(text);
  5580.             while(1) {
  5581.                 if (txSearchEx(text,"<WZTX",searchmode)) {
  5582.                     IFILE adr = txGetAddress(text);
  5583.                     templageGetSentence(text,NULL);
  5584.                     txstr szcall;
  5585.                     txstr szbuff;
  5586.                     int istat = 0;
  5587.                     while(1) {
  5588.                         if (!templageGetSentence(text,szbuff)) break;
  5589.                         if (istat == 0) szcall = szbuff;
  5590.                         istat++;
  5591.                     }
  5592.                     int lch = txGetAddress(text) - adr;
  5593.                     txJumpAddress(text,adr);
  5594.                     txDeleteBytes(text,lch);
  5595.                     // <WZTX xxx>に続く改行は削除
  5596.                     if (txIsCurReturn(text)) txDeleteChar(text);
  5597.                     if (mode == TEMPLATE_LP) {
  5598.                         // 印刷時は無視。
  5599.                     } else {
  5600. //information("[%s]",szcall);
  5601.                         txCall(textTarget,szcall);
  5602.                     }
  5603.                 } else {
  5604.                     break;
  5605.                 }
  5606.             }
  5607.             // <WZSELTEXT>の実行
  5608.             if (fClip) {
  5609.                 txPrivatePush(textTarget);
  5610.                 txSelectDelete(textTarget);
  5611.             }
  5612.             txJumpFileTop(text);
  5613.             while(1) {
  5614.                 if (txSearchEx(text,"<WZSELTEXT>",searchmode)) {
  5615.                     txDeleteBytes(text,strlen("<WZSELTEXT>"));
  5616.                     if (fClip) {
  5617.                         txPrivatePaste(text);
  5618.                     }
  5619.                 } else {
  5620.                     break;
  5621.                 }
  5622.             }
  5623.             if (fClip) {
  5624.                 txPrivateDeleteTop(textTarget);
  5625.             }
  5626.             // <WZCUR>の実行
  5627.             IFILE adrAdd = 0;
  5628.             txJumpFileTop(text);
  5629.             if (txSearchEx(text,"<WZCUR>",searchmode)) {
  5630.                 adrAdd = txGetAddress(text);
  5631.                 txDeleteBytes(text,strlen("<WZCUR>"));
  5632.             }
  5633.             // Insert & JUMP
  5634.             IFILE adr = txGetAddress(textTarget);
  5635.             int ly = textTarget->ly;
  5636.             txInsertText(textTarget,text);
  5637.             IFILE adrEnd = txGetAddress(textTarget);
  5638.             txFlushTableAll(textTarget);
  5639.             if (mode == TEMPLATE_LP) {
  5640.                 txJumpAddress(textTarget,adrEnd);
  5641.             } else {
  5642.                 if (fClip) {
  5643.                     txJumpAddress(textTarget,adrEnd);
  5644.                     ly == 0 ? txSetLyCenter(textTarget) : txSetLy(textTarget,ly);
  5645.                     txSelectEx(textTarget,CLIP_CHAR);
  5646.                     txJumpAddress(textTarget,adr);
  5647.                     textTarget->fClipMouse = TRUE;
  5648.                 } else {
  5649.                     txJumpAddress(textTarget,adr + adrAdd);
  5650.                     ly == 0 ? txSetLyCenter(textTarget) : txSetLy(textTarget,ly);
  5651.                 }
  5652.             }
  5653.         }
  5654.     }
  5655.     txSetDisp(textTarget);
  5656. }
  5657.  
  5658. // HTMLでタグ内で<WZSTR>etcが使えないのは仕様
  5659. // 将来、可能なら改善する。
  5660. // HTML用には、[WZSTR]等とする。
  5661. BOOL _template(TX* textTarget,mchar* szfilename,int mode)
  5662. {
  5663.     BOOL fNew = (mode == TEMPLATE_NEW);
  5664.     TX _textBody;
  5665.     TX* text = &_textBody;
  5666.     txInitText(text);
  5667.     text->fTxbackInitTxForm = TRUE;
  5668.     text->fTxsemHtmlAtTemplate = TRUE;
  5669.     txSetFileName(text,szfilename);
  5670.     if (txOpenText(text)) {
  5671. //information("%d %d",text->fForm,text->fHTML);
  5672. //        text->fForm = (txCmpCurI(text,"<TX>") != 0);
  5673.         txSetUndisp(textTarget);
  5674.         if (text->fHTML) {
  5675.             if (!txSearchEx(text,"<HTML>",SEARCH_CUR|SEARCH_NOSENSECASE)) {
  5676.                 // <HTML>がない場合、<HTML>を追加しないように
  5677.                 text->fTxsemHtmlInside = TRUE;
  5678.             }
  5679.             if (fNew) {
  5680.                 txDeleteText(textTarget);
  5681.             }
  5682.             if (textTarget->editmode) {
  5683.                 txSetEditmode(text,1);
  5684.             }
  5685.         } else if (text->fForm) {
  5686.             if (textTarget->editmode) {
  5687.                 txSetEditmode(text,1);
  5688.             } else if (fNew) {
  5689.                 textTarget->fForm = TRUE;
  5690.                 txSetEditmode(textTarget,1);
  5691.                 txSetEditmode(text,1);
  5692.             }
  5693.         }
  5694.         templateExec(textTarget,text,mode);
  5695.         if (mode == TEMPLATE_NEW) {
  5696.             //2.99C 970326 新規作成-テンプレートでは、テンプレートファイルの拡張子の設定を読み込む様にした
  5697.             mchar szname[CCHNAME];
  5698.             txConfigOp(text,TXCONFIGOP_EXTGETNAME,szname);
  5699.             txConfigOp(textTarget,TXCONFIGOP_EXTNAME_LOAD,szname);
  5700.             txFlush(textTarget);   
  5701.             //2.99C 970326 デフォルト拡張子も設定
  5702.             CMDLINECONTEXT* cc = textTarget->pcc;
  5703.             if (cc) sstrcpy(cc->szOpenExt,pathGetExt(text->szfilename));
  5704.         }
  5705.         txSetDisp(textTarget);
  5706.         txClose(text);
  5707.     }
  5708.     return TRUE;
  5709. }
  5710.  
  5711. BOOL TXCMDBASE uiInsertTamplate(TX* text)
  5712. {
  5713.     txstr szfilename;
  5714.     strcpy(szfilename,text->szexedir);
  5715.     szfilename += "template\\*.*";
  5716.     if (text->fHTML) {
  5717.         pathSetFileName(szfilename,SZHTMLMASK);
  5718.     }
  5719. //information("%s",szfilename);
  5720.     if (txofnGetOpenFileNameEx(text,szfilename,"テンプレートの挿入",TXOFN_FOCUSFILE) == TXOFN_OK) {
  5721.         return _template(text,szfilename,TEMPLATE_INSERT);
  5722.     }
  5723.     return FALSE;
  5724. }
  5725.  
  5726. BOOL template(TX* textTarget,mchar* szfilename)
  5727. {
  5728. // 新規作成時用 for wz.exe
  5729.     return _template(textTarget,szfilename,TEMPLATE_NEW);
  5730. }
  5731.  
  5732. BOOL templateLp(TX* textTarget,mchar* szfilename)
  5733. {
  5734. // 印刷時用 for wz.exe
  5735.     txstr szfull = text->szexedir + "template\\";
  5736.     pathSetFileName(szfull,szfilename);
  5737.     return _template(textTarget,szfull,TEMPLATE_LP);
  5738. }
  5739.  
  5740. //## html for wz.exe
  5741.  
  5742. int htmlQ(void)
  5743. {
  5744.     HDIALOG hd = dialog("HTMLファイルの体裁モードへ移行");//2.99D 970328 htmlQ「詳細モード」は表示しない
  5745.     int mode = 0;
  5746.     
  5747.     dialogCaption(hd,"体裁モードへ移行すると、折り返しなどのテキストの体裁が変化します。");
  5748.     dialogCaption(hd,"どのようにしますか?");
  5749.     
  5750.     dialogIndent(hd,4);
  5751.     dialogControlRadioV(hd);
  5752.     dialogRadioID(hd,&mode,
  5753.         "体裁モードへ移行する",
  5754.         "移行しない"
  5755.     );
  5756.     
  5757.     if (dialogOpen(hd)) {
  5758.         if (mode == 0) return IDYES;
  5759.         return IDNO;
  5760.     }
  5761.     return IDCANCEL;
  5762. }
  5763.  
  5764. //## rtf for wz.exe
  5765.  
  5766. #ifdef __FLAT__
  5767.  
  5768. permanent BOOL p_rtfEditToWordQ = TRUE;
  5769.  
  5770. int rtfQ(void)
  5771. {
  5772.     if (!p_rtfEditToWordQ) return IDYES;
  5773.     HDIALOG hd = dialog("RTFファイルの体裁/詳細モードへ移行");
  5774.     int mode = 0;
  5775.     
  5776.     dialogCaption(hd,"体裁/詳細モードへ移行すると、段落体裁や文字属性が変化します。");
  5777.     dialogCaption(hd,"また、OLEオブジェクトが失われます。");
  5778.     dialogCaption(hd,"どのようにしますか?");
  5779.     
  5780.     dialogIndent(hd,4);
  5781.     dialogControlRadioV(hd);
  5782.     dialogRadioID(hd,&mode,
  5783.         "体裁モードへ移行する",
  5784.         "移行しない"
  5785.     );
  5786.     dialogIndent(hd,-4);
  5787.     
  5788.     dialogControlReverseBool(hd);
  5789.     dialogCheck(hd,"今後、このメッセージを表示しない(&Q)",&p_rtfEditToWordQ);
  5790.     
  5791.     if (dialogOpen(hd)) {
  5792.         if (mode == 0) return IDYES;
  5793.         return IDNO;
  5794.     }
  5795.     return IDCANCEL;
  5796. }
  5797.  
  5798. permanent BOOL p_rtfWordToEditQ = TRUE;
  5799.  
  5800. int rtfQ2(void)
  5801. {
  5802.     if (!p_rtfWordToEditQ) return IDYES;
  5803.     HDIALOG hd = dialog("RTFファイルのテキストモードへ移行");
  5804.     int mode = 0;
  5805.     
  5806.     dialogCaption(hd,"テキストモードへ移行すると、段落体裁や文字属性が変化します。");
  5807.     dialogCaption(hd,"また、OLEオブジェクトが失われます。");
  5808.     dialogCaption(hd,"どのようにしますか?");
  5809.     
  5810.     dialogIndent(hd,4);
  5811.     dialogControlRadioV(hd);
  5812.     dialogRadioID(hd,&mode,
  5813.         "テキストモードへ移行する",
  5814.         "移行しない"
  5815.     );
  5816.     dialogIndent(hd,-4);
  5817.     
  5818.     dialogControlReverseBool(hd);
  5819.     dialogCheck(hd,"今後、このメッセージを表示しない(&Q)",&p_rtfWordToEditQ);
  5820.     
  5821.     if (dialogOpen(hd)) {
  5822.         if (mode == 0) return IDYES;
  5823.         return IDNO;
  5824.     }
  5825.     return IDCANCEL;
  5826. }
  5827.  
  5828. permanent BOOL p_rtfSaveQ = TRUE;
  5829.  
  5830. int rtfQ3(void)
  5831. {
  5832.     if (!p_rtfSaveQ) return IDYES;
  5833.     HDIALOG hd = dialog("RTFファイルの保存");
  5834.     int mode = 0;
  5835.     
  5836.     dialogCaption(hd,"保存すると、段落体裁や文字属性が変化します。");
  5837.     dialogCaption(hd,"また、OLEオブジェクトが失われます。");
  5838.     dialogCaption(hd,"どのようにしますか?");
  5839.     
  5840.     dialogIndent(hd,4);
  5841.     dialogControlRadioV(hd);
  5842.     dialogRadioID(hd,&mode,
  5843.         "保存する",
  5844.         "保存しない"
  5845.     );
  5846.     dialogIndent(hd,-4);
  5847.     
  5848.     dialogControlReverseBool(hd);
  5849.     dialogCheck(hd,"今後、このメッセージを表示しない(&Q)",&p_rtfSaveQ);
  5850.     
  5851.     if (dialogOpen(hd)) {
  5852.         if (mode == 0) return IDYES;
  5853.         return IDNO;
  5854.     }
  5855.     return IDCANCEL;
  5856. }
  5857.  
  5858. #endif
  5859.  
  5860. //##
  5861.  
  5862. __delete
  5863. {
  5864.     macroHookWndBaseFree();
  5865. }
  5866.  
  5867. #if 0//2.99C 970325 不要になった
  5868. // 強制的にロードする。
  5869. // これをしないと書式メニュー内のコマンドのチェック機能が働かない
  5870. load
  5871. {
  5872. }
  5873. #endif
  5874.  
  5875.