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