home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1999 March
/
VPR9903A.BIN
/
APUPDATE
/
VC
/
Tx300d
/
TX300D.LZH
/
WORD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-10-13
|
163KB
|
5,875 lines
// WZ EDITOR 標準機能 書式
// Copyright 1995-96 TY
//2.97 970223 HTML関連のコマンドは廃止
//2.99 970320 印刷時のプロポーショナルON/OFFは画面表示に合わせる
//2.99D 970331 TXCMDBASE対応
//{###ワープロ機能}
#include <windows.h>
#include <windowsx.h>
#include "dialog.h"
#include "edit.h"
#include <windowsx.h>
#include "dialog.h"
#include "adrbook.h"
extern "html" {
BOOL txHtmlSet(TX* text,int tag,int arg);
BOOL TXAPI txInsertHtmlSzTag(TX* text,mchar* szTag,int tag);
}
static CHARATR charatrNull;
//## base function
//1.98 文字装飾や段落書式を変更したらtextの編集フラグを立てる
#define mySetEdit(text) {text->fEdit = TRUE;text->nEdit++;txDispLocate(text);}
static BOOL IsEditmode(TX* text)
{
if (!text->editmode) {
information(
"テキストモードでは実行できません。\n"
"体裁、詳細モードで実行してください。\n"
);
return FALSE;
}
return TRUE;
}
static BOOL IsWP(TX* text)
{
// プレーンテキストをいきなり詳細モードにして脚注を挿入し、テキストモードに戻すと
// 挿入した脚注が失われた。このような場合は挿入する時点で関数を使って
// エラーメッセージを出す様にする。
//// 後で余裕があるときに行う
//3.00A2 970507 new
if (text->editmode) {
if (!txIsWP(text)) {
information(
"この文書は、プレーンなテキストファイルです。\n"
"詳細モードでの段落体裁や文字装飾機能は利用できません。\n"
"この機能を利用するには、一旦テキストモードにしてから体裁モードにしてください\n"
);
return FALSE;
}
}
return TRUE;
}
static BOOL IsParaatrFF(TX* text)
{
//2.98 970308 テキストモードで改ページが含まれる段落の体裁を変更するときは、警告を出す様にした。
if (!text->editmode) {
BOOL f = FALSE;
// 範囲指定されているときに、範囲全体を調べるのは大変なので調べず、
// カーソル行のみを調べる。
txstr szline;
txGetPara(text,szline);
if (strchr(szline,CHAR_FF)) f = TRUE;
if (f) {
int ret = question(
"この段落には改ページコードが含まれています。\n"
"テキストモードでは、このような段落に正しく段落体裁を設定することができません。\n"
"体裁/詳細モードをご利用ください。\n"
"\n"
"構わず段落体裁を設定しますか?"
);
if (ret == IDYES) return TRUE;
return FALSE;
}
return TRUE;
}
return TRUE;
}
static BOOL mytxParaatrSet(tx *text,int tag,PARAATR* arg)
{
if (!IsParaatrFF(text)) return FALSE;
return txParaatrSet(text,tag,arg);
}
static void txReplacePlug(TX* text,LPVOID plug,LPVOID plug0)
{
// plug0 != NULL : カーソル位置のplug0をplugに置き換える //2.99 970312 カーソル位置は移動しない
// plug0 == NULL : plugをCHAR_PLUGとして挿入する。
#if 1//2.98 970305 undo対応
if (plug0) txDeleteChar(text);
txInsertPlug(text,plug);
if (plug0) txLeft(text);
#else
CHARATR_LINK charatr;
charatrRead(text,txGetAddress(text),(LPVOID)&charatr);
if (plug0) {
if (charatr.fLink && charatr.ibitmap) {
plugatrDelete(text,charatr.ibitmap);
}
}
charatr.fLink = TRUE;
charatr.ibitmap = plugatrGetTyp(text,plug);
if (!plug0) txCurInsertChar(text,CHAR_PLUG);
charatrWrite(text,txGetAddress(text),(LPVOID)&charatr);
#endif
}
DWORD convprocAlign(DWORD data,int mode)
{
static int t[] = {
ALIGN_LEFT,ALIGN_CENTER,ALIGN_RIGHT,
};
int n = sizeof(t) / sizeof(int);
if (mode == TXDIALOG_READ) {
if (data < n) return t[data];
return 0;
} else {
int i;
for (i = 0;i < n;i++) {
if (t[i] == data) return i;
}
return 0;
}
}
//{###ワープロ機能}
BOOL TXAPI TXCMDBASE txCharBold(tx *text)
{
// 選択文字列を太字に設定
//2.99A 970321 {#MS} ^B new
//{#MS} ^B
if (text->fHTML) return txHtmlSet(text,TAG_B,0);
return txCharatrSet(text,TAG_B,0);
}
BOOL TXAPI TXCMDBASE txCharItalic(tx *text)
{
// 選択文字列を斜体に設定
//2.99A 970321 {#MS} ^I new
//{#MS} ^I
if (text->fHTML) return txHtmlSet(text,TAG_I,0);
return txCharatrSet(text,TAG_I,0);
}
BOOL TXAPI TXCMDBASE txCharUnderline(tx *text)
{
// 選択文字列を下線に設定
//2.99A 970321 {#MS} ^U new
//{#MS} ^U
if (text->fHTML) return txHtmlSet(text,TAG_U,0);
return txCharatrSet(text,TAG_U,0);
}
BOOL TXAPI TXCMD txCharNormal(tx *text)
{
// 選択文字列の文字装飾をクリア
if (text->fHTML) {
//2.99C 970327 HTMLでword.txCharNormalすると範囲内のタグを消去するようにした
return call("html.clearTag");
} else {
return txCharatrSet(text,0,0);
}
}
//##論理行一般
//2.99 970320 キー割り当て{#MS} +{Enter}、{#MI} +{Enter}を外した
//1.93
int TXAPI TXCMD txInsertBR(tx* text)
{
// 段落内改行
//{#RET}実行できたか返す
//1.93で追加
return txOp(text,TXOP_WRITERETURNEX,1,0);//2.97 970224 WZ.EXEへ移行
}
BOOL TXAPI TXCMD txFormClear(tx *text)
{
// 段落書式をクリア
mytxParaatrSet(text,TAG_CLEAR,0);
return TRUE;
}
BOOL TXAPI TXCMD txFormArticleClear(tx *text)
{
// 箇条書きをクリア
PARAATR paraatr = text->paraatr;
paraatr.fArticle = FALSE;
paraatr.modeArticle = 0;
mytxParaatrSet(text,TAG_OL,¶atr);
return TRUE;
}
BOOL TXAPI TXCMD txFormArticleDisc(tx *text)
{
// ・箇条書き
if (text->fHTML) {
//2.99C 970325 「ツールバー|箇条書き」改良
return txHtmlSet(text,TAG_LI,0);
} else {
return mytxParaatrSet(text,TAG_LI,0);
}
}
BOOL TXAPI TXCMD txFormArticleNotice(tx *text)
{
// ※箇条書き
//[HTML不可]
return mytxParaatrSet(text,TAG_LINOTICE,0);
}
BOOL TXAPI TXCMD txFormArticleNum(tx *text)
{
// 番号付き箇条書き
if (text->fHTML) {
//2.99C 970325 「ツールバー|番号付き箇条書き」改良
return txHtmlSet(text,TAG_LINUM,0);
} else {
return mytxParaatrSet(text,TAG_LINUM,0);
}
}
BOOL TXAPI TXCMD txFormFeed(tx *text)
{
// 改ページ
//[HTML不可]
return txCharatrSet(text,TAG_FORMFEED,0);//2.98 970309 txParaatrSet->txCharatrSet
}
//2.99 970320 キー割り当て{#MS} ^{Enter}、{#VZ} ^{Enter}、{#MI} ^{Enter}を外した
BOOL TXAPI TXCMD txFormFeedModal(tx *text)
{
// HTMLファイルでは改段、その他のファイルでは改ページ
if (text->fHTML) {
call("html.insertP");
} else {
return txCharatrSet(text,TAG_FORMFEED,0);//2.98 970309 txParaatrSet->txCharatrSet
}
}
BOOL TXAPI TXCMDBASE txFormLeft(tx *text)
{
// 左揃え
if (text->fHTML) {
if (text->editmode == 0) {
return txCharatrSet(text,TAG_LEFT,0);
}
return txHtmlSet(text,TAG_LEFT,0);
} else {
return mytxParaatrSet(text,TAG_LEFT,0);
}
}
BOOL TXAPI TXCMDBASE txFormCenter(tx *text)
{
// 中央揃え
if (text->fHTML) {
if (text->editmode == 0) {
return txCharatrSet(text,TAG_CENTER,0);
}
return txHtmlSet(text,TAG_CENTER,0);
} else {
return mytxParaatrSet(text,TAG_CENTER,0);
}
}
BOOL TXAPI TXCMDBASE txFormRight(tx *text)
{
// 右揃え
if (text->fHTML) {
return txHtmlSet(text,TAG_RIGHT,0);
} else {
return mytxParaatrSet(text,TAG_RIGHT,0);
}
}
BOOL TXAPI txFormIndentAdd(tx *text,int d)
{
// インデント増
return mytxParaatrSet(text,TAG_INDENTADD,(LPVOID)d);
}
BOOL TXAPI TXCMD txFormIndentInc(tx *text)
{
// インデント増
// 常にタブサイズで増やす
if (text->fHTML) {
#if 1//2.97A 970301
return txHtmlSet(text,TAG_UL,LCXINDENT_STD);
#else
return txFormIndentAdd(text,LCXINDENT_STD);
#endif
} else {
if (text->indentsize) {//2.91
return txFormIndentAdd(text,text->indentsize);
} else {
return txFormIndentAdd(text,text->tabsize);
}
}
}
BOOL TXAPI TXCMD txFormIndentDec(tx *text)
{
// インデント減
// 常にタブサイズで減らす
if (text->fHTML) {
#if 1//2.97A 970301
return txHtmlSet(text,TAG_UL,-LCXINDENT_STD);
#else
return txFormIndentAdd(text,-LCXINDENT_STD);
#endif
} else {
if (text->indentsize) {//2.91
return txFormIndentAdd(text,-text->indentsize);
} else {
return txFormIndentAdd(text,-text->tabsize);
}
}
}
BOOL TXAPI txFormTitle(tx *text,int ititle)
{
// 見出し
if (text->fHTML) {
return txHtmlSet(text,TAG_H,ititle);
} else {
PARAATR paraatr;
paraatr.modeTitle = ititle;
return mytxParaatrSet(text,TAG_H,¶atr);
}
}
BOOL TXAPI TXCMDBASE txFormTitle0(tx* text)
{
// 本文(見出しをクリア)
return txFormTitle(text,0);
}
BOOL TXAPI TXCMDBASE txFormTitle1(tx* text)
{
// 見出し1
return txFormTitle(text,1);
}
BOOL TXAPI TXCMDBASE txFormTitle2(tx* text)
{
// 見出し2
return txFormTitle(text,2);
}
BOOL TXAPI TXCMDBASE txFormTitle3(tx* text)
{
// 見出し3
return txFormTitle(text,3);
}
BOOL TXAPI TXCMDBASE txFormTitle4(tx* text)
{
// 見出し4
return txFormTitle(text,4);
}
BOOL TXAPI TXCMDBASE txFormTitle5(tx* text)
{
// 見出し5
return txFormTitle(text,5);
}
BOOL TXAPI TXCMDBASE txFormTitle6(tx* text)
{
// 見出し6
return txFormTitle(text,6);
}
//##モード
//2.00B
static BOOL CheckGene(TX* text)
{
if (text->fGene) {
information("世代テキストは画面表示モードを切り替えられません");
return FALSE;
}
return TRUE;
}
BOOL TXAPI TXCMDBASE txSetEditmodeText(tx* text)
{
// 画面表示モードを「テキストモード」に設定
if (!CheckGene(text)) return FALSE;
if (text->flpPreview) txLpOp(text,TXLPOP_PREVIEWEXIT);
return txSetEditmode(text,0);
}
//2.00B ヒント追加
static BOOL CheckForm(TX* text)
{
if (text->fForm || text->editmode) {
return TRUE;
} else if (text->fBinedit) {
return FALSE;
#ifdef __FLAT__
//2.99 970316
} else if (pathIsExt(text->szfilename,".rtf")) {
return TRUE;
#endif
} else {
int ret = question(
"書式文字列を処理しますか?\n"
"\n"
"[はい]を押すとテキストの書式文字列を読み取って、文字装飾や段落体裁を整えます。\n"
"テキスト中の全ての書式文字列は削除されます。注意してください。\n"
"\n"
"[ヒント] 書式文字列の設定は、「ファイル|文書の設定」の[ファイル]タブにあります。\n"
);
if (ret == IDYES) {
text->fForm = TRUE;
text->fEdit = TRUE;//1.99G 編集フラグを立てる
return TRUE;
}
return FALSE;
}
}
BOOL TXAPI TXCMDBASE txSetEditmodeForm(tx* text)
{
// 画面表示モードを「体裁モード」に設定
if (!CheckGene(text)) return FALSE;
if (!CheckForm(text)) return FALSE;
if (text->flpPreview) txLpOp(text,TXLPOP_PREVIEWEXIT);
return txSetEditmode(text,1);
}
//1.99D 詳細モードにはプレーンテキストでも無条件で移行できる
BOOL TXAPI TXCMDBASE txSetEditmodePrint(tx* text)
{
// 画面表示モードを「詳細モード」に設定
if (!CheckGene(text)) return FALSE;
if (text->flpPreview) txLpOp(text,TXLPOP_PREVIEWEXIT);
return txSetEditmode(text,2);
}
void TXAPI txSetDispstylemode(TX* text,int dispmode)
{
// 画面表示スタイルを設定
text->dispstylemode = dispmode;
txConfigOp(text,TXCONFIGOP_EXTSETUPDISPSTYLE,0);
txFlushEx(text,TXFLUSHEX_TXFLUSHALL);
}
void TXAPI TXCMDBASE txSetDispstyle1(TX* text)
{
// 画面表示スタイルをスタイル1に設定
txSetDispstylemode(text,0);
}
void TXAPI TXCMDBASE txSetDispstyle2(TX* text)
{
// 画面表示スタイルをスタイル2に設定
txSetDispstylemode(text,1);
}
void TXAPI TXCMDBASE txSetDispstyle3(TX* text)
{
// 画面表示スタイルをスタイル3に設定
txSetDispstylemode(text,2);
}
void TXAPI TXCMDBASE txSetDispstyle4(TX* text)
{
// 画面表示スタイルをスタイル4に設定
//2.98A 970311 new
txSetDispstylemode(text,3);
}
//## 表
BOOL TXAPI TXCMDBASE txuiInsertTable(TX* text)
{
// 表を挿入
HDIALOG hd = dialog("表の挿入");
static int xTable = 5;
static int yTable = 3;
dialogIntXY(hd,"表の桁数 x 行数(&S):",&xTable,&yTable,20,4);
dialogIndent(hd,4);
dialogCaption(hd,NULL);
dialogCaption(hd,"桁数と行数は、文書ウィンドウで簡単に変更できます。");
dialogCaption(hd,"桁数や行数を縮めるには、縮めたい部分の文字を削除します。");
dialogCaption(hd,"桁数を増やすには、{Tab}を押します。");
dialogCaption(hd,"行数を増やすには、{Enter}を押します。");
if (dialogOpen(hd)) {
txJumpParaTop(text);
if (text->fHTML) {
return txHtmlSet(text,TAG_TABLE,MAKELONG(xTable,yTable));
} else {
if (txCharatrSet(text,TAG_TABLE,(LPVOID)MAKELONG(xTable,yTable))) {
if (text->fConfigInlineform && !text->fParaforming && text->editmode == 0) {
call("paraform.form");
}
return TRUE;
}
}
}
return FALSE;
}
BOOL TXAPI TXCMDBASE txuiTable(TX* text)
{
// テーブルのプロパティ
PLUGTAB* plug = (LPVOID)txOp(text,TXOP_PLUGTAB_CURPARA,0,0);
if (plug) {
if (plug->modeTab == MODETAB_BEAMTAB) {
information("桁揃えのプロパティはありません。");
return FALSE;
} else {
if (txGetCurPlugmode(text) == PLUG_TAB) {//2.99C 970327
information("表のセルのプロパティを開くには、プロパティを開きたいセルの中の文字にカーソルを合わせて「書式|プロパティ」を実行してください。");
return FALSE;// カーソルが縦線上なら何もしない。
}
HDIALOG hd = dialog("セルのプロパティ");
dialogControlConvertEx(hd,"\m.convprocAlign");
dialogSelectIDB(hd,"配置(&A):",&plug->modeAlign,20,15,"左揃え","中央揃え","右揃え");
dialogHeadline(hd,"境界線",50);
dialogSelectIDB(hd,"左側(&L):",&plug->modeSepaLeft,20,15,"なし","細線","太線");
dialogSelectIDB(hd,"下側(&L):",&plug->modeSepaBottom,20,15,"なし","細線","太線");
if (dialogOpen(hd)) {
txOp(text,TXOP_PLUGTAB_FLUSHCUR,0,0);
return TRUE;
}
return FALSE;
}
} else {
return txuiInsertTable(text);
}
}
BOOL TXAPI TXCMDBASE txInsertBeamtab(TX* text)
{
// 桁揃えを挿入
//2.97 970224 new
//{#VZ} +^I
//{#MS} +^I
//{#MI} +^I
if (text->editmode == 0) {
//2.99C 970324 桁揃えの挿入:テキストモード対応
txCharatrSet(text,TAG_TAB,0);
return TRUE;
}
{
PLUGTAB* plug = plugatrNew(text,PLUG_TAB);
if (plug) {
plug->modeTab = MODETAB_BEAMTAB;
txSetUndisp(text);
txInsertPlug(text,plug);
txOp(text,TXOP_PLUGTAB_FLUSHCUR,0,0);
txSetDisp(text);
return TRUE;
}
}
return FALSE;
}
BOOL TXAPI TXCMDBASE txInsertHR(tx* text)
{
// 水平線を挿入
if (text->fClip) {
txSelectCopyDelete(text);
}
if (text->filekind == TEXT_MAIL) {
return call("paraform.sepa");
}
if (text->fHTML) {
if (!txIsCurParaTop(text)) txInsertReturn(text);
txCharatrSet(text,TAG_HR,NULL);
} else {
txJumpParaTop(text);//1.99C
txCharatrSet(text,TAG_HR,NULL);
}
return TRUE;
}
BOOL TXAPI TXCMD txuiLetterHeader(TX* text)
{
// レターヘッダのプロパティ
if (text->fHTML) {
return FALSE;
} else {
if (text->npara > MAX_NPARALETTERHEADER) {
information(
"レターヘッダは、文書先頭段落から%d段落までの間にしか設定することができません\n"
"(カーソル位置の段落は%d行です。)\n",MAX_NPARALETTERHEADER,text->npara
);
return FALSE;
}
HDIALOG hd = dialog("レターヘッダ");
dialogCaption(hd,"カーソル位置までをレターヘッダとして設定し、");
dialogCaption(hd,"印刷時の段組の設定に拘わらず、一段組で印刷します。");
dialogLFV(hd);
dialogOK(hd,12);
dialogCancel(hd,12);
int iddClear = dialogCmd(hd,"解除(&C)",12);
int ret;
if (ret = dialogOpen(hd)) {
if (ret == iddClear) {
txCharatrSet(text,TAG_BODY,1);
} else {
txCharatrSet(text,TAG_BODY,NULL);
}
}
return ret;
}
}
//##メニューやステータスバーへの表示
static int idmHorizon;
static int idmVertical;
static int idmVertical2;
static int idmEdit;
static int idmDraft;
static int idmPrint;
static int idmPreview;
static int idmNormal;
static int idmBold;
static int idmUnderline;
static int idmItalic;
static int idmArticleDisc;
static int idmArticleNum;
static int idmLeft;
static int idmCenter;
static int idmRight;
static int idmTab;
static int idmTable;
static int idmH1;
static int idmH2;
static int idmH3;
static int idmH4;
static int idmH5;
static int idmH6;
static int idmDispstyle1;
static int idmDispstyle2;
static int idmDispstyle3;
static int idmDispstyle4;
//3.00B1 970522 ベタテキストやCの挿入メニューの文字装飾系コマンドを灰色表示
static int idmInsertBitmap;
static int idmInsertTable;
static int idmInsertBeamtab;
static int idmInsertFootnote;
static int idmInsertFont;
static int idmInsertHR;
__new
{
macroHookWndBase();
idmEdit = IDM_WZCMDTOP + wzcmdRegister("\m.txSetEditmodeText");
idmDraft = IDM_WZCMDTOP + wzcmdRegister("\m.txSetEditmodeForm");
idmPrint = IDM_WZCMDTOP + wzcmdRegister("\m.txSetEditmodePrint");
idmPreview = IDM_WZCMDTOP + wzcmdRegister("\m.txSetPreview");
idmDispstyle1 = IDM_WZCMDTOP + wzcmdRegister("\m.txSetDispstyle1");
idmDispstyle2 = IDM_WZCMDTOP + wzcmdRegister("\m.txSetDispstyle2");
idmDispstyle3 = IDM_WZCMDTOP + wzcmdRegister("\m.txSetDispstyle3");
idmDispstyle4 = IDM_WZCMDTOP + wzcmdRegister("\m.txSetDispstyle4");
idmNormal = IDM_WZCMDTOP + wzcmdRegister("\m.txCharNormal");
idmBold = IDM_WZCMDTOP + wzcmdRegister("\m.txCharBold");
idmUnderline = IDM_WZCMDTOP + wzcmdRegister("\m.txCharUnderline");
idmItalic = IDM_WZCMDTOP + wzcmdRegister("\m.txCharItalic");
idmArticleDisc = IDM_WZCMDTOP + wzcmdRegister("\m.txFormArticleDisc");
idmArticleNum = IDM_WZCMDTOP + wzcmdRegister("\m.txFormArticleNum");
idmLeft = IDM_WZCMDTOP + wzcmdRegister("\m.txFormLeft");
idmCenter = IDM_WZCMDTOP + wzcmdRegister("\m.txFormCenter");
idmRight = IDM_WZCMDTOP + wzcmdRegister("\m.txFormRight");
idmTab = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTab");
idmTable = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTable");
idmH1 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle1");
idmH2 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle2");
idmH3 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle3");
idmH4 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle4");
idmH5 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle5");
idmH6 = IDM_WZCMDTOP + wzcmdRegister("\m.txFormTitle6");
//3.00B1 970522
idmInsertBitmap = IDM_WZCMDTOP + wzcmdRegister("\m.txuiInsertBitmap");
idmInsertTable = IDM_WZCMDTOP + wzcmdRegister("\m.txuiInsertTable");
idmInsertBeamtab = IDM_WZCMDTOP + wzcmdRegister("\m.txInsertBeamtab");
idmInsertFootnote = IDM_WZCMDTOP + wzcmdRegister("\m.txuiInsertFootnote");
idmInsertFont = IDM_WZCMDTOP + wzcmdRegister("\m.txuiInsertFont");
idmInsertHR = IDM_WZCMDTOP + wzcmdRegister("\m.txInsertHR");
}
BOOL TXCMDBASE flushpage(TX* text)
{
// ページ番号表示をリフレッシュ
// 詳細モードで、ページ番号の表示が実際とズレる場合があります。
// このコマンドを実行すると正確な番号を計算して表示します。
statprintf("ページ番号リフレッシュ中");
txSetUndispEx(text);
txJumpFileTop(text);
txOp(text,TXOP_FLUSH_NPARALETTERHEADER,0,0);
txSetDispEx(text);
statprintf("ページ番号リフレッシュ完了");
return TRUE;
}
BOOL TXAPI txIsCurTable(TX* text)
{
// カーソル行が表かどうか返す
//2.00B
PLUGTAB* plug = (LPVOID)txOp(text,TXOP_PLUGTAB_CURPARA,0,0);
if (plug && plug->modeTab == MODETAB_TABLE) return TRUE;
return FALSE;
}
BOOL TXAPI txIsCurTab(TX* text)
{
// カーソル行が桁揃えかどうか返す
//2.00B
PLUGTAB* plug = (LPVOID)txOp(text,TXOP_PLUGTAB_CURPARA,0,0);
if (plug && plug->modeTab == MODETAB_BEAMTAB) return TRUE;
return FALSE;
}
// -1:不明
static int checked(WZCMD wzcmd)
{
int idm = IDM_WZCMDTOP + wzcmd;
//statprintf("%d %d",idm,idmBold);
if (idm == idmNormal) {
return !memcmp(&text->charatr,&charatrNull,sizeof(CHARATR));
} else if (idm == idmBold) {
return text->charatr.fBold;
} else if (idm == idmUnderline) {
return text->charatr.fUnderline;
} else if (idm == idmItalic) {
return text->charatr.fItalic;
} else if (idm == idmArticleDisc) {
return (text->paraatr.fArticle && text->paraatr.modeArticle < ARTICLE_NUMBER);
} else if (idm == idmArticleNum) {
return (text->paraatr.fArticle && text->paraatr.modeArticle >= ARTICLE_NUMBER);
} else if (idm == idmEdit) {
return (text->editmode == 0);
#if 0//3.00B1 970523
} else if (idm == idmDraft) {
return (text->editmode == 1);
#endif
} else if (idm == idmPrint) {
return (text->editmode == 2 && !text->flpPreview);
} else if (idm == idmPreview) {
return text->flpPreview;
} else if (idm == idmDispstyle1) {
return (text->dispstylemode == 0);
} else if (idm == idmDispstyle2) {
return (text->dispstylemode == 1);
} else if (idm == idmDispstyle3) {
return (text->dispstylemode == 2);
} else if (idm == idmDispstyle4) {//2.98A 970311
return (text->dispstylemode == 3);
} else if (idm == idmLeft) {
return (paraatrGetAlign(text,&text->paraatr) == ALIGN_LEFT);
} else if (idm == idmCenter) {
return (paraatrGetAlign(text,&text->paraatr) == ALIGN_CENTER);
} else if (idm == idmRight) {
return (paraatrGetAlign(text,&text->paraatr) == ALIGN_RIGHT);
} else if (idm == idmTable) {
return txIsCurTable(text);
} else if (idm == idmTab) {
return txIsCurTab(text);
} else if (idm == idmH1) {
return (text->paraatr.modeTitle == 1);
} else if (idm == idmH2) {
return (text->paraatr.modeTitle == 2);
} else if (idm == idmH3) {
return (text->paraatr.modeTitle == 3);
} else if (idm == idmH4) {
return (text->paraatr.modeTitle == 4);
} else if (idm == idmH5) {
return (text->paraatr.modeTitle == 5);
} else if (idm == idmH6) {
return (text->paraatr.modeTitle == 6);
}
return -1;
}
static WORD formatable(int iformat)
{
//3.00B1 970522 new
if (text->fWztext) return 0;
if (text->fPlaintext) return MF_GRAYED;
if (text->tszformat[iformat][0] == 0) {
// 書式文字列が設定されてない
return MF_GRAYED;
}
return 0;
}
WORD at_cmdcheck(WZCMD wzcmd,HMENU hmenu)
{
#if 1//2.99C 970325 ファイルを開いた直後の表示メニューに、画面表示スタイルの内容が表示されてなかった
int idm = IDM_WZCMDTOP + wzcmd;
if (
idm == idmDispstyle1 ||
idm == idmDispstyle2 ||
idm == idmDispstyle3 ||
idm == idmDispstyle4 //2.98A 970311
) {
int style = 0;
if (idm == idmDispstyle2) style = 1;
if (idm == idmDispstyle3) style = 2;
if (idm == idmDispstyle4) style = 3;//2.98A 970311
{
int n = GetMenuItemCount(hmenu);
int i;
for (i = 0;i < n;i++) {
if (GetMenuItemID(hmenu,i) == idm) {
UINT stat = GetMenuState(hmenu,i,MF_BYPOSITION);
mchar szstr[CCHWORD];
GetMenuString(hmenu,i,szstr,CCHWORD,MF_BYPOSITION);
BOOL fEnglish = text->share->config.fEnglish;
txstr sz;
int nClm = text->tnClm[style];//2.93
int modeWidth = text->tmodeWidth[style];//2.99A 970321
if (nClm == 0) nClm = 1;
//
BOOL fVertical = text->tfVertical[style];
mchar buff[CCHWORD];
sprintf(buff,"&%d",style + 1);
sz += buff;
////2.98A 970311 txstr += (f ? "str1" : "str2");はアプリエラーになる
if (fVertical) {
strcpy(buff,fEnglish ? " Vertical" : " 縦書き");
} else {
strcpy(buff,fEnglish ? " Horizontal " : " 横書き");
}
sz += buff;
sprintf(buff,fEnglish ? " %dclms" : " %d段組",nClm);
sz += buff;
if (modeWidth == MODEWIDTH_AUTO) {//2.99A 970321
if (fEnglish) {//2.99F 970404 表示スタイル 英語メニュー対応
sz += " Auto-Chars";
} else {
sz += " 自動折り返し幅";
}
} else if (modeWidth == MODEWIDTH_LPRINT) {//2.99A 970321
if (fEnglish) {//2.99F 970404 表示スタイル 英語メニュー対応
sz += " Print-Chars";
} else {
sz += " 印刷折り返し幅";
}
} else {
if (fVertical) {
sprintf(buff,fEnglish ? " %dJapanese-chars" : " 全角%d文字",text->twidth[style] / 2);
sz += buff;
} else {
sprintf(buff,fEnglish ? " %dEnglish-chars" : " 半角%d文字",text->twidth[style]);
sz += buff;
}
}
if (text->theight[style]) {
sprintf(buff,fEnglish ? " %dlines" : " %d行",text->theight[style]);
sz += buff;
}
if (text->tlfWestern[style]) {//2.99 970320
sprintf(buff,fEnglish ? " Western" : " 欧文");
sz += buff;
}
if (text->tlfProp[style]) {//2.99 970320
sprintf(buff,fEnglish ? " Prop" : " プロポーショナル");
sz += buff;
}
ModifyMenu(hmenu,i,MF_BYPOSITION|MF_STRING|stat,idm,sz);
}
}
}
return (text->dispstylemode == style) ? MF_CHECKED : 0;
} else if (idm == idmInsertBitmap) {//3.00B1 970523
return formatable(SZFORMAT_BITMAP);
} else if (idm == idmInsertTable) {//3.00B1 970523
return formatable(SZFORMAT_TABLE);
} else if (idm == idmInsertBeamtab) {//3.00B1 970523
return formatable(SZFORMAT_TAB);
} else if (idm == idmInsertFootnote) {//3.00B1 970523
return formatable(SZFORMAT_FOOTNOTE_TOP);
} else if (idm == idmInsertFont) {//3.00B1 970523
return formatable(SZFORMAT_FONT_TOP);
} else if (idm == idmInsertHR) {//3.00B1 970523
return formatable(SZFORMAT_HR);
} else if (idm == idmDraft) {//3.00B1 970523
if (!text->fWztext && !text->fHTML) {
if (text->tszformat[SZFORMAT_BOLD_TOP][0] == 0) return MF_GRAYED;
}
if (text->fPlaintext) return MF_GRAYED;
if (text->editmode == 1) return MF_CHECKED;
return 0;
} else {
int f = checked(wzcmd);
if (f >= 1) return MF_CHECKED;
return 0;
}
#else
//2.99 970319
int f = checked(wzcmd);
if (f >= 1) return MF_CHECKED;
return 0;
#endif
}
static void statusbarSet(int hsl)
{
TX* text1 = txGetFrameNow();//2.99C 970324
mchar sz[CCHLINE];
mchar*p = sz;
//
if (hsl == HSL_PARAATR) {// 段落書式
if (text->paraatr.modeTitle) {
sprintf(p,"見出%d ",text->paraatr.modeTitle);
p += strlen(p);
}
if (text->paraatr.modeArticle) {
strcpy(p,"箇条 ");
p += strlen(p);
}
if (text->paraatr.lcxIndent) {
strcpy(p,"字下 ");
p += strlen(p);
}
switch(paraatrGetAlign(text,&text->paraatr)) {
case ALIGN_CENTER: {
strcpy(p,"中央 ");
p += strlen(p);
break;
}
case ALIGN_RIGHT: {
strcpy(p,"右 ");
p += strlen(p);
break;
}
}
if (txIsCurTable(text)) {
strcpy(p,"表 ");
p += strlen(p);
} else if (txIsCurTab(text)) {
strcpy(p,"桁揃 ");
p += strlen(p);
}
*p = 0;
SendMessage(text1->hwndbase,WM_TXSB_SETTEXT,hsl,(LPARAM)sz);
} else if (hsl == HSL_CHARATR) {// 文字装飾
//2.00B ステータスバーのカーソル位置の文字装飾の表示が一文字ずれていた。
CHARATR charatr;
charatrRead(text,txGetAddress(text),&charatr);
if (charatr.fBold) {
strcpy(p,"太 ");
p += strlen(p);
}
if (charatr.fUnderline) {
strcpy(p,"線 ");
p += strlen(p);
}
if (charatr.fItalic) {
strcpy(p,"斜 ");
p += strlen(p);
}
*p = 0;
SendMessage(text1->hwndbase,WM_TXSB_SETTEXT,hsl,(LPARAM)sz);
}
}
HOOKRESULT __wndprocbase(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
TX* text = textTarget;//2.95 970129
switch(message) {
#if 0//2.99C 970325
case WM_INITMENUPOPUP: {
HMENU hmenu = (HMENU)wParam;
// サブメニューを生成させるため、先にWZオリジナルの処理をする
SendMessage(text->hwndbase,WM_TXINITMENU,(WPARAM)hmenu,0);//2.95 970129 text1->textTarget
{
int n = GetMenuItemCount(hmenu);
int i;
for (i = 0;i < n;i++) {
int idm = GetMenuItemID(hmenu,i);
int fCheck = checked(idm - IDM_WZCMDTOP);
if (fCheck != -1) {
CheckMenuItem(hmenu,idm,MF_BYCOMMAND|(fCheck ? MF_CHECKED : MF_UNCHECKED));
}
if (idm == idmEdit) {
//1.98
if (text->fWztext) {
EnableMenuItem(hmenu,idm,MF_BYCOMMAND|MF_GRAYED);
} else {
EnableMenuItem(hmenu,idm,MF_BYCOMMAND|MF_ENABLED);
}
}
if (
idm == idmDispstyle1 ||
idm == idmDispstyle2 ||
idm == idmDispstyle3 ||
idm == idmDispstyle4 //2.98A 970311
) {
int style = 0;
if (idm == idmDispstyle2) style = 1;
if (idm == idmDispstyle3) style = 2;
if (idm == idmDispstyle4) style = 3;//2.98A 970311
{
UINT stat = GetMenuState(hmenu,i,MF_BYPOSITION);
mchar szstr[CCHWORD];
GetMenuString(hmenu,i,szstr,CCHWORD,MF_BYPOSITION);
// mchar*p = strchrs(szstr,"\t(");
BOOL fEnglish = text->share->config.fEnglish;
txstr sz;
int nClm = text->tnClm[style];//2.93
int modeWidth = text->tmodeWidth[style];//2.99A 970321
if (nClm == 0) nClm = 1;
//
#if 1//2.98A 970311 "0行"は表示しないようにした
BOOL fVertical = text->tfVertical[style];
mchar buff[CCHWORD];
sprintf(buff,"&%d",style + 1);
sz += buff;
////2.98A 970311 txstr += (f ? "str1" : "str2");はアプリエラーになる
if (fVertical) {
strcpy(buff,fEnglish ? " Vertical" : " 縦書き");
} else {
strcpy(buff,fEnglish ? " Horizontal " : " 横書き");
}
sz += buff;
sprintf(buff,fEnglish ? " %dclms" : " %d段組",nClm);
sz += buff;
if (modeWidth == MODEWIDTH_AUTO) {//2.99A 970321
sz += " 自動折り返し幅";
} else if (modeWidth == MODEWIDTH_LPRINT) {//2.99A 970321
sz += " 印刷折り返し幅";
} else {
if (fVertical) {
sprintf(buff,fEnglish ? " %dJapanese-chars" : " 全角%d文字",text->twidth[style] / 2);
sz += buff;
} else {
sprintf(buff,fEnglish ? " %dEnglish-chars" : " 半角%d文字",text->twidth[style]);
sz += buff;
}
}
if (text->theight[style]) {
sprintf(buff,fEnglish ? " %dlines" : " %d行",text->theight[style]);
sz += buff;
}
if (text->tlfWestern[style]) {//2.99 970320
sprintf(buff,fEnglish ? " Western" : " 欧文");
sz += buff;
}
if (text->tlfProp[style]) {//2.99 970320
sprintf(buff,fEnglish ? " Prop" : " プロポーショナル");
sz += buff;
}
#else
if (text->tfVertical[style]) {
sprintf(sz,
fEnglish ?
"DisplayStyle&%d Vertical %dJapanese-chars * %dlines" :
"&%d 縦書き %d段組 全角%d文字 * %d行",
style + 1,
nClm,
text->twidth[style] / 2,
text->theight[style]
);
} else {
sprintf(sz,
fEnglish ?
"DisplayStyle&%d Horizontal %dEnglish-chars * %dlines" :
"&%d 横書き %d段組 半角%d文字 * %d行",
style + 1,
nClm,
text->twidth[style],
text->theight[style]
);
}
#endif
// if (!fEnglish && p) sz += p;
ModifyMenu(hmenu,i,MF_BYPOSITION|MF_STRING|stat,idm,sz);
}
}
}
}
break;
}
#endif
case WM_TXSB_SETUPTEXT: {
switch(wParam) {
case HSL_CHARATR:
case HSL_PARAATR: {
statusbarSet(wParam);
return TRUE;
}
}
break;
}
}
return HOOK_CONTINUE;
}
//##印刷設定
#define IDD_SPECFILENAME 1000
#define IDD_SPECFILENAMENO 1001
#define IDD_FILENAME 1005
#define IDD_REFERFILENAME 1006
#define IDD_SPECANCHOR 1010
#define IDD_SPECANCHORNO 1011
#define IDD_ANCHOR 1015
#define IDD_REFERANCHOR 1016
#define IDD_RELATIVE 1020
#define IDD_ABSOLUTE 1021
#define IDD_ABSOLUTEDRIVE 1022
#define IDD_RELATIVEBASED 1023 //2.99B 970321
#define IDD_FLUSH 2000
#define IDD_STYLECLEAR 2001
#define IDD_SIZELIST 2002
#define IDD_USERPAPER 2003
#define IDD_USERPAPERX 2004
#define IDD_USERPAPERY 2005
#define IDD_WIDTH_ENABLE 2006
#define IDD_WIDTH 2007
#define IDD_HEIGHT_ENABLE 2008
#define IDD_HEIGHT 2009
#define IDD_LINEINT 2010
#define IDD_HEADER 2011
#define IDD_HEADERSTR 2012
#define IDD_FOOTER 2013
#define IDD_FOOTERSTR 2014
#define IDD_STYLE 2015
#define IDD_FSTYLECALC 2016
#define IDD_MARGIN_RIGHT 2017
#define IDD_MARGIN_BOTTOM 2018
#define IDD_DISP_WIDTH 2019
#define IDD_DISP_HEIGHT 2020
#define IDD_DISP_LINEINT 2021
#define IDD_DISP_CLM 2022
#define IDD_DISP_RIGHT 2023
#define IDD_DISP_BOTTOM 2024
//2.00E
#define IDD_PRINTER_LIST 2025
#define IDD_RESLIST 2026
#define IDD_BINLIST 2027
#define IDD_DEFAULT_PRINTER 2030 // 2031も使用
#define IDD_PRINTAREAMODE 2040 // 2041,42も使用
#define IDD_SHEETLIST 2050
#define IDD_PRINTER 2051
#define IDD_STYLESET 2052
#define IDD_CALCPAGES 2053
#define IDD_NPAGETOP 2054
#define IDD_NPAGEEND 2055
#define IDD_PROMPT 2056
//2.96 970204
#define IDD_LINEINT_ENABLE 2057
#define IDD_TEXTLXLY_ENABLE 2058
#define IDD_CLM 2059
#define IDD_ENABLE_NPAGENUM 2060
#define IDD_NPAGENUM 2061
#define IDD_HEADER2 2062
#define IDD_HEADER2STR 2063
#define IDD_FOOTER2 2064
#define IDD_FOOTER2STR 2065
#define IDD_HEADERPRINT 2066
#define IDD_FOOTERPRINT 2067
#define IDD_HEADER2SPECIFY 2068
#define IDD_HEADFONTAUTO 2069
//2.99D 970402
#define IDD_MARGIN_LEFT 2070
#define IDD_MARGIN_UPPER 2071
// プロパティシートを使う時は、IDが100とかだとマズいようである。
#define IDD_DELETE 3000
#define IDD_SAVETO 3001
#define IDD_SAVETOTEMP 3002
#define IDD_LOAD 3003
#define IDD_USEPRINTFONT 3200 //2.00D 3200,3201を使用
//2.00D
#define IDD_PREVIEW1 3210
#define IDD_PREVIEW2 3211
#define IDD_PREVIEW3 3212
#define IDD_PREVIEW4 3213
#define IDD_PREVIEW5 3214
#ifndef __FLAT__
extern "commdlg.dll" {
#include <commdlg.h>
#include <print.h>
}
#endif
permanent BOOL _fCalcStyle;
static void _FlushPreview(TX* textTarget,HWND hwnd,int id)
{
if (!_fCalcStyle) return;
HDIALOG hd = dialogFromHwnd(hwnd);
HWND hctrl = GetDlgItem(hwnd,id);
if (hctrl) {
TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
if (text) {
LPRINT* lp = text->lp;
//2.00E6 文書のスタイルを使用のとき、計算値がおかしかった
txCopyConfig(text,textTarget);
if (text->tFontstyle && textTarget->tFontstyle) {
memcpy(text->tFontstyle,textTarget->tFontstyle,SIZE_TFONTSTYLE);
}
EnableWindow(hctrl,FALSE);
text->fVertical = textTarget->fVertical;
text->flpCalc = TRUE;//2.00E6
//
dialogRead(hd);
memcpy(&lp->configTop,&textTarget->lp->configTop,&lp->configEnd - &lp->configTop);
txLpOp(text,TXLPOP_FLUSHDEVMODE);
//
txFlush(text);
txSetEditmode(text,2);
//
txLpOp(text,TXLPOP_CALC);
SetDlgItemInt(hwnd,IDD_DISP_WIDTH,lp->clxPage,TRUE);
SetDlgItemInt(hwnd,IDD_DISP_HEIGHT,lp->clyPage,TRUE);
SetDlgItemInt(hwnd,IDD_DISP_LINEINT,lp->cmcmLineInt,TRUE);
SetDlgItemInt(hwnd,IDD_DISP_CLM,lpGetClm(lp),TRUE);
SetDlgItemInt(hwnd,IDD_DISP_RIGHT,lp->cmcmMarginRight/10,TRUE);
SetDlgItemInt(hwnd,IDD_DISP_BOTTOM,lp->cmcmMarginBottom/10,TRUE);
}
}
}
static BOOL _fPreviewing;
static void FlushPreview(TX* text,HWND hwnd,int id)
{
if (_fPreviewing) return;
_fPreviewing = TRUE;
_FlushPreview(text,hwnd,id);
_fPreviewing = FALSE;
}
static BOOL _fInTxuser; //2.96 970204 速度アップ
//2.00D
static void myPostMessage(HWND hwnd,int message,WPARAM wParam,LPARAM lParam)
{
if (_fPreviewing || _fInTxuser) return;
MSG msg;
if (PeekMessage(&msg,hwnd,message,message,PM_NOREMOVE)) {
// 既にポストされている場合は、ポストしない
} else {
PostMessage(hwnd,message,wParam,lParam);
}
}
//2.00E
// sb==NULL: sbを作成
static HSTRBLK makeResolution(HDIALOG hd,LPRINT* lp,HSTRBLK sb)
{
int n = lpCap(lp,DC_ENUMRESOLUTIONS,0);
BOOL fDefault = (n <= 0); // -1等の値になることがある。この時はデフォルト値をセット
if (fDefault) {
n = 4;
}
LONG* pData = memAlloc(n * sizeof(LONG) * 2);
if (pData) {
lpCap(lp,DC_ENUMRESOLUTIONS,(LPVOID)pData);
int cch = 20;
mchar* pName = memAlloc(n * cch);
mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
if (pName && tName) {
int i;
for (i = 0;i < n;i++) {
if (fDefault) {
static mchar* tsz[] = {"標準印刷(高品質)","簡易印刷(中品質)","簡易印刷(低品質)","ドラフト印刷",};
static int tres[] = {DMRES_HIGH,DMRES_MEDIUM,DMRES_LOW,DMRES_DRAFT};
pData[i] = tres[i];
//
tName[i] = &pName[i * cch];
strcpy(tName[i],tsz[i]);
} else {
// pDataには縦横入っているが片方のみ使用
pData[i] = pData[i * 2];
//
tName[i] = &pName[i * cch];
sprintf(tName[i],"%d dpi",pData[i]);
}
}
tName[n] = NULL;
//
if (sb) {
sbInitForDialogSelect(sb,tName,pData);
} else {
sb = dialogSelectIDInit(hd,tName,pData);
}
}
memFree(pName);
memFree(tName);
}
memFree(pData);
return sb;
}
//2.00E
// sb==NULL: sbを作成
static HSTRBLK makePapersize(HDIALOG hd,LPRINT* lp,HSTRBLK sb)
{
#ifndef CCHPAPERNAME
#define CCHPAPERNAME 64
#endif
int n = lpCap(lp,DC_PAPERNAMES,0);
mchar* pName = memAlloc(n * CCHPAPERNAME);
mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
WORD* pData = memAlloc(n * sizeof(WORD));
DWORD* tData = memAlloc((n + 1) * sizeof(DWORD));
if (tName && pName) {
lpCap(lp,DC_PAPERNAMES,pName);
lpCap(lp,DC_PAPERS,(LPSTR)pData);
int i;
for (i = 0;i < n;i++) {
tName[i] = &pName[i*CCHPAPERNAME];
tData[i] = pData[i];
}
tName[n] = NULL;
//
if (sb) {
sbInitForDialogSelect(sb,tName,tData);
} else {
sb = dialogSelectIDInit(hd,tName,tData);
}
}
memFree(pName);
memFree(tName);
memFree(pData);
memFree(tData);
return sb;
}
//2.00E
// sb==NULL: sbを作成
static HSTRBLK makeBin(HDIALOG hd,LPRINT* lp,HSTRBLK sb)
{
#ifndef CCHBINNAME
#define CCHBINNAME 24
#endif
int n = lpCap(lp,DC_BINNAMES,0);
mchar* pName = memAlloc(n * CCHBINNAME);
mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
WORD* pData = memAlloc(n * sizeof(WORD));
DWORD* tData = memAlloc((n + 1) * sizeof(DWORD));
if (tName && pName) {
lpCap(lp,DC_BINNAMES,pName);
lpCap(lp,DC_BINS,(LPSTR)pData);
int i;
for (i = 0;i < n;i++) {
tName[i] = &pName[i*CCHBINNAME];
tData[i] = pData[i];
}
tName[n] = NULL;
//
if (sb) {
sbInitForDialogSelect(sb,tName,tData);
} else {
sb = dialogSelectIDInit(hd,tName,tData);
}
}
memFree(pName);
memFree(tName);
memFree(pData);
memFree(tData);
return sb;
}
//2.00E
static void lpTerm(LPRINT* lp)
{
if (lp->hDevNames) {
GlobalFree(lp->hDevNames);
lp->hDevNames = 0;
}
if (lp->hDevMode) {
GlobalFree(lp->hDevMode);
lp->hDevMode = 0;
}
}
// プリンタ名をlp->hDevNamesにセットし、そのDevModeをlp->hDevModeにセットする
//2.00E
static void lpInit(LPRINT* lp)
{
lpTerm(lp);
txLpOp(text,TXLPOP_GET_DEVMODE);
}
//2.00E
static mchar* captionGet(mchar* szCaption)
{
static mchar buff[CCHPATHNAME];
strcpy(buff,"印刷スタイルの設定 - ");
strcat(buff,szCaption);
return buff;
}
extern "config" void TXAPI txuiConfigStyleEx(TX* text);//2.00E2
static void toTszlpstyle(TX* text)
{
//3.00A3 970508 new
int mode = text->dispstylemode;
if (text->tszlpstyle) strcpy(text->tszlpstyle + mode * CCHLPSTYLE,text->szlpstyle);
}
static void saveto(HWND hwnd,TX* text,mchar* szstyle)
{
LPRINT* lp = text->lp;
txConfigOp(text,TXCONFIGOP_PRINTWRITE,(LPVOID)szstyle);
strcpymax(lp->szstyle,szstyle,CCHLPSTYLE);
strcpy(text->szlpstyle,lp->szstyle);toTszlpstyle(text);
SetWindowText(hwnd,captionGet(szstyle));
}
static int _ipageConfig;
static FONTSTYLE* fontstyleGet(TX* text,int ifonttx)
{
//2.96 970205 ifonttx:FONTTX_BODY - FONTTX_H6のみ対応
LPRINT* lp = text->lp;
if (txGetUsePrintFontstyle(text)) {
return &lp->tFontstyle[ifonttx - FONTTX_BODY];
} else {
return &text->tFontstyle[ifonttx];
}
}
static BBOOL *fHeadFontAutoGet(TX* text)
{
LPRINT* lp = text->lp;
if (txGetUsePrintFontstyle(text)) {
return &lp->fHeadFontAuto;
} else {
return &text->fHeadFontAuto;
}
}
static void FlushPropFont(TX* text,HDIALOG hd,int id,BOOL fProp)
{
FONTNAMES* fontnames = fontnamesFromId(hd,id);
if (fontnames) {
LPRINT* lp = text->lp;
// txLpOpでLPSTYLEがロードされないように
lp->fNoLoadConfig++;
{
HDC hdcTmp = txLpOp(text,TXLPOP_GETIC);
fontnames->lfPitch = fProp ? DEFAULT_PITCH : FIXED_PITCH;
fontnames->hdcPrinter = hdcTmp;
fontnamesFlush(fontnames);
txLpOp(text,TXLPOP_RELEASEIC); // release hdcTmp
dialogWriteItem(hd,id);
}
lp->fNoLoadConfig--;
}
}
#if 0//2.99C 970323
static void EnableDlgItem(HWND hwnd,int id,BOOL fEnable)
{
#if 1//2.99B 970321
HWND hctrl = GetDlgItem(hwnd,id);
if (hctrl) EnableWindow(hctrl,fEnable);
#else
EnableWindow(GetDlgItem(hwnd,id),fEnable);
#endif
}
#endif
static void txFlushHeadFontAuto(TX* text)
{
LPRINT* lp = text->lp;
if (*fHeadFontAutoGet(text)) {
FONTSTYLE *fsBody = fontstyleGet(text,FONTTX_BODY);
FONTSTYLE *fsH1 = fontstyleGet(text,FONTTX_H1);
for (int i = FONTTX_H2;i <= FONTTX_H6;i++) {
FONTSTYLE* fs = fontstyleGet(text,i);
*fs = *fsH1;
for (int ifont = IFONT_STD;ifont <= IFONT_ANK;ifont++) {
int dh = fsH1->tlfHeight[ifont] - fsBody->tlfHeight[ifont];
int n = 5 - (i - FONTTX_H1);
fs->tlfHeight[ifont] = fsBody->tlfHeight[ifont] + (dh * n) / 5;
}
}
}
}
static BOOL dialogaLpstyleDelete(mchar* szstyle)
{
HDIALOG hd = dialog("印刷スタイルの削除");
int mode = 0;
dialogControlRadioV(hd);
dialogRadioID(hd,&mode,
"印刷スタイル("+szstyle+")を削除",
"全ての印刷スタイルを削除して初期化"
);
//2.00B 印刷:印刷スタイルの削除が実装されていなかった
if (dialogOpen(hd)) {
switch(mode) {
case 0: {
txConfigOp(text,TXCONFIGOP_PRINTDEL,(LPVOID)szstyle);
break;
}
case 1: {
txConfigOp(text,TXCONFIGOP_PRINTDELALL,NULL);
break;
}
}
return TRUE;
}
return FALSE;
}
BOOL dlgprocConfigDetail(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwndPshpage(hwnd);
HDIALOG hd0 = (LPVOID)dialogGetCustdata(hd);
LPRINT* lp = (LPVOID)dialogGetCustdata(hd0);
TX* text = lp ? lp->text : NULL;
switch(message) {
case WM_INITDIALOG: {
HWND hctrl = GetDlgItem(hwnd,IDD_SHEETLIST);
txConfigOp(text,TXCONFIGOP_PRINTENUMLB,(LPVOID)hctrl);
SendMessage(hctrl,LB_SETCURSEL,
SendMessage(hctrl,LB_FINDSTRINGEXACT,-1,(LPARAM)lp->szstyle),0
);
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case IDD_DELETE:
case IDOK: {
mchar szstyle[CCHLPSTYLE];
HWND hctrl = GetDlgItem(hwnd,IDD_SHEETLIST);
int isel = ListBox_GetCurSel(hctrl);
if (listboxGetItemText(hctrl,isel,szstyle,CCHLPSTYLE)) {
if (id == IDOK) {
if (stricmp(text->szlpstyle,szstyle)) {
strcpy(text->szlpstyle,szstyle);toTszlpstyle(text);
txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)szstyle);
}
} else {
if (dialogaLpstyleDelete(szstyle)) {
txConfigOp(text,TXCONFIGOP_PRINTENUMLB,(LPVOID)hctrl);
ListBox_SetCurSel(hctrl,isel);
}
return TRUE;
}
}
break;
}
}
break;
}
}
return FALSE;
}
static void dlgConfigFlushPreview(TX* text,HDIALOG hd,int ipage)
{
int idPreview = 0;
switch(ipage) {
case 0: idPreview = IDD_PREVIEW1;break;
case 1: idPreview = IDD_PREVIEW2;break;
case 3: idPreview = IDD_PREVIEW3;break;
}
if (idPreview) {
HDIALOG h = dialogGetPshpageDialog(hd,ipage);
if (h) {
FlushPreview(text,dialogGetWindow(h),idPreview);
}
}
}
BOOL dlgprocConfig(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd0 = dialogFromHwndPshbase(hwnd); // プロパティシートのベースのHDIALOG
HDIALOG hd = dialogFromHwndPshpage(hwnd); // 現在のページのHDIALOG
LPRINT* lp = (LPVOID)dialogGetCustdata(hd0);
TX* text = lp ? lp->text : NULL;
//
switch(message) {
case WM_INITDIALOG: {
myPostMessage(hwnd,WM_TXUSER,0,0);//2.00E
break;
}
case WM_TXDIALOGPAGECHANGED: {
PostMessage(hwnd,WM_TXUSER,0,1);//2.96 970204
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
int iPage = dialogGetPage(hd0);
myPostMessage(hwnd,WM_TXUSER,id,0);//2.00D
switch(id) {
case IDD_DEFAULT_PRINTER:
case IDD_DEFAULT_PRINTER + 1:
case IDD_PRINTER_LIST: {//2.00E
myPostMessage(hwnd,WM_TXUSER+1,0,0);
break;
}
case IDD_FOOTERSTR:
case IDD_HEADERSTR:
case IDD_FOOTER2STR:
case IDD_HEADER2STR: {
HDIALOG hd = dialog("ヘッダ・フッタのマクロ記号の挿入");
static mchar *tsz[] = {
"ファイル名",\"\filename",
"フルパスファイル名",\"\fullname",
"印刷開始日付",\"\date",
"印刷開始時刻",\"\time",
"ページ数",\"\page",
"総ページ数",\"\allpages",
"ファイルの日付",\"\filedate",
"ファイルの時刻",\"\filetime",
"柱1",\"\title1", //2.96A 970214 柱 追加
"柱2",\"\title2",
"柱3",\"\title3",
};
int iform = 0;
dialogSelectID(hd,"マクロ記号(&M):",&iform,16,20,
tsz[0],
tsz[2],
tsz[4],
tsz[6],
tsz[8],
tsz[10],
tsz[12],
tsz[14],
tsz[16],
tsz[18],
tsz[20]
);
if (dialogOpen(hd)) {
mchar* sz = tsz[iform * 2 + 1];
Edit_ReplaceSel(GetDlgItem(hwnd,id-1),sz);
}
return TRUE;
}
case IDD_DELETE: {
if (dialogaLpstyleDelete(lp->szstyle)) {
PostMessage(hwnd,WM_TXDIALOGCLOSE,0,0);//閉じる
}
return TRUE;
}
case IDD_SAVETOTEMP: {
//2.96 970204 印刷スタイルの設定:一時設定を追加
//information("%d %d %d %d",dialogGetBaseWindow(hd),dialogGetBaseWindow(hd0),hd,hd0);
dialogRead(hd0);//2.99D 970331 一時設定で、用紙の置き方を変えられなかった
saveto(dialogGetBaseWindow(hd0),text,"一時設定");
PostMessage(hwnd,WM_TXDIALOGCLOSE,IDOK,0);//閉じる
return TRUE;
}
case IDD_LOAD: {
HDIALOG hd = dialog("印刷スタイルの読み込み");
int lcx = 16;
int mode = 0;
DTRECT r;
dialogSetHookEx(hd,"\m.dlgprocConfigDetail");
dialogSetCustdata(hd,(DWORD)hd0);
dialogSetContexthelp(hd,TRUE);
dialogCaption(hd,"一覧:");
dialogGetPos(hd,&r);
r.cx = DTCX * 30;
r.cy = DTCY * 14;
dialogControlHelp(hd,357);
__dialogAddItem(hd,"LISTBOX",NULL,IDD_SHEETLIST,&r,LBS_NOTIFY|LBS_SORT|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP|WS_BORDER);
_dialogAddControlInfo(hd,IDD_SHEETLIST);
r.y += r.cy + DTCYINT;
dialogSetPos(hd,&r);
dialogLFV(hd);
dialogOK(hd,lcx);
dialogCancel(hd,lcx);
dialogSpaceV(hd);
dialogControlID(hd,IDD_DELETE);
dialogControlHelp(hd,354);
dialogCmd(hd,"削除(&D)...",lcx);
if (dialogOpen(hd)) {
dialogWrite(hd0);
// 読み込むと画面に設定の一部が反映されるので、閉じてしまう
PostMessage(hwnd,WM_TXDIALOGCLOSE,IDOK,0);
}
// キャプションを更新する
SetWindowText(dialogGetBaseWindow(hd0),captionGet(lp->szstyle));
return TRUE;
}
case IDD_SAVETO: {
#if 1//2.00E 印刷スタイルの「名前を付けて保存」を改良
int ret = IDYES;
txstr szstyle = lp->szstyle;
do {
ret = IDYES;
HDIALOG hd = dialog("名前を付けて保存");
dialogStr(hd,"印刷スタイル名:",szstyle,14,30);
if (dialogOpen(hd)) {
dialogRead(hd0);
txFlushHeadFontAuto(text);
if (txConfigOp(text,TXCONFIGOP_PRINTEXIST,(LPVOID)szstyle)) {
ret = question("印刷スタイル %s は存在します。上書きして良いですか?",szstyle);
}
if (ret == IDYES) {//2.96 970206 IDNO -> IDYES 上書きできなかった
saveto(dialogGetBaseWindow(hd0),text,szstyle);
}
} else {
ret = IDCANCEL;
}
} while(ret == IDNO);
if (ret == IDYES) PostMessage(hwnd,WM_TXDIALOGCLOSE,IDOK,0);//閉じる
return TRUE;
#else
HDIALOG hd = dialog("名前を付けて保存");//2.00C
txstr szstyle = lp->szstyle;
dialogStr(hd,"印刷スタイル名:",szstyle,14,30);
if (dialogOpen(hd)) {
dialogRead(hd0);
txFlushHeadFontAuto(text);
txConfigOp(text,TXCONFIGOP_PRINTWRITE,(LPVOID)szstyle);
}
return TRUE;
#endif
}
case IDD_STYLE: {//2.00C
//2.00E2
dialogRead(hd0);
txuiConfigStyleEx(text);
myPostMessage(hwnd,WM_TXUSER,0,0);
return TRUE;
}
}
break;
}
case WM_TXUSER: {
_fInTxuser = TRUE;
int id = wParam;
BOOL fPageChanged = lParam;
_ipageConfig = dialogGetPage(hd0);
switch(_ipageConfig) {
case 0: {
BOOL fText = IsDlgButtonChecked(hwnd,IDD_TEXTLXLY_ENABLE);
BOOL fTextHeight = (fText && (text->height != 0));
// width
EnableWindow(GetDlgItem(hwnd,IDD_WIDTH_ENABLE),!fText);
EnableWindow(
GetDlgItem(hwnd,IDD_WIDTH),
!fText && IsDlgButtonChecked(hwnd,IDD_WIDTH_ENABLE)
);
// height
BOOL fEnableHeight = IsDlgButtonChecked(hwnd,IDD_HEIGHT_ENABLE);
EnableWindow(GetDlgItem(hwnd,IDD_HEIGHT_ENABLE),!fTextHeight);
EnableWindow(
GetDlgItem(hwnd,IDD_HEIGHT),
!fTextHeight && fEnableHeight
);
// 行間
BOOL fEnableLineint = IsDlgButtonChecked(hwnd,IDD_LINEINT_ENABLE);
if (!fTextHeight) {
if (!fEnableHeight) fEnableLineint = TRUE;
}
EnableWindow(
GetDlgItem(hwnd,IDD_LINEINT),
fEnableLineint
);
//
EnableWindow(GetDlgItem(hwnd,IDD_CLM),!fText);
#if 1//2.99D 970402
#if 1//2.99E 970403
dialogRead(hd);
EnableDlgItem(hwnd,text->fVertical?IDD_MARGIN_BOTTOM:IDD_MARGIN_RIGHT,!fText&&!lp->fLxPage);
EnableDlgItem(hwnd,text->fVertical?IDD_MARGIN_LEFT:IDD_MARGIN_BOTTOM,((!fTextHeight&&!lp->fLyPage) || !fEnableLineint));
#else
dialogRead(hd);
EnableDlgItem(hwnd,text->fVertical?IDD_MARGIN_BOTTOM:IDD_MARGIN_RIGHT,!lp->fLxPage);
EnableDlgItem(hwnd,text->fVertical?IDD_MARGIN_LEFT:IDD_MARGIN_BOTTOM,!lp->fLyPage || !fEnableLineint);
#endif
#else
//2.96A 970214 Margin
dialogRead(hd);
EnableDlgItem(hwnd,IDD_MARGIN_RIGHT,!lp->fLxPage);
EnableDlgItem(hwnd,IDD_MARGIN_BOTTOM,!lp->fLyPage || !fEnableLineint);
#endif
break;
}
case 1: {
BOOL fTo = FALSE; // プロポーショナルON/OFFでフォント名が変化する可能性が
// あるときにTRUEにして、設定値を更新する
// [1]dialogReadする
dialogRead(hd);
// [2]プリンタの設定/textの設定切り替え
if (id == IDD_USEPRINTFONT || id == IDD_USEPRINTFONT + 1) {
lp->fHeadFontAutoTemp = *fHeadFontAutoGet(text);
{
for (int i = 0;i < 2;i++) {
lp->fontstyleTemp[i] = *fontstyleGet(text,i == 0 ? FONTTX_BODY : FONTTX_H1);
FlushPropFont(text,hd,lp->idTemp[i][IFONT_STD],text->lfProp);
FlushPropFont(text,hd,lp->idTemp[i][IFONT_ANK],text->lfProp);
}
}
//information("%d",lp->fUsePrintFontstyle);
dialogWrite(hd);
fTo = TRUE;
}
// [3]fontstyle ([1],[2]の影響を受けることがある)
for (int i = 0;i < 2;i++) {
for (int ifont = IFONT_STD;ifont <= IFONT_ANK;ifont++) {
int id1 = lp->idTemp[i][ifont];
if (
id == id1 || // fontname
id == id1 + 1 || // fontsize
fTo
) {
// 現在の設定値をtext or lpの設定にコピー
*fontstyleGet(text,i == 0 ? FONTTX_BODY : FONTTX_H1) = lp->fontstyleTemp[i];
}
}
}
//
if (id == IDD_HEADFONTAUTO) {
BOOL f = IsDlgButtonChecked(hwnd,IDD_HEADFONTAUTO);
*fHeadFontAutoGet(text) = lp->fHeadFontAutoTemp = f;
}
//
if (text->fPlaintext) {
//3.00B1 970523
} else {
BOOL f = IsDlgButtonChecked(hwnd,IDD_HEADFONTAUTO);
EnableDlgItem(hwnd,lp->idTemp[1][IFONT_STD],f);
EnableDlgItem(hwnd,lp->idTemp[1][IFONT_STD]+1,f);
EnableDlgItem(hwnd,lp->idTemp[1][IFONT_ANK],f);
EnableDlgItem(hwnd,lp->idTemp[1][IFONT_ANK]+1,f);
EnableDlgItem(hwnd,IDD_STYLE,!f);
}
break;
}
case 3: {
BOOL f = IsDlgButtonChecked(hwnd,IDD_USERPAPER);
EnableDlgItem(hwnd,IDD_USERPAPERX,f);
EnableDlgItem(hwnd,IDD_USERPAPERY,f);
EnableDlgItem(hwnd,IDD_SIZELIST,!f);
break;
}
case 4: {
BOOL f2 = IsDlgButtonChecked(hwnd,IDD_HEADER2SPECIFY);
BOOL f = IsDlgButtonChecked(hwnd,IDD_HEADERPRINT);
EnableDlgItem(hwnd,IDD_HEADER,f);
EnableDlgItem(hwnd,IDD_HEADER2,f && f2);
f = IsDlgButtonChecked(hwnd,IDD_FOOTERPRINT);
EnableDlgItem(hwnd,IDD_FOOTER,f);
EnableDlgItem(hwnd,IDD_FOOTER2,f && f2);
break;
}
}
if (id == IDD_FSTYLECALC) {
BOOL fCalcStyle = IsDlgButtonChecked(hwnd,id);
// 全てのページのプレビューチェックボックスに反映
dialogRead(hd0);
_fCalcStyle = fCalcStyle;
dialogWrite(hd0);
// プレビューを更新
for (int ipage = 0;ipage <= 4;ipage++) {
dlgConfigFlushPreview(text,hd,ipage);
}
}
if (fPageChanged) {
//2.96 970204 タブの切り替えではプレビューを更新しない。for 切り替え速度アップ
} else {
dlgConfigFlushPreview(text,hd,_ipageConfig);
}
//2.00E
EnableDlgItem(hwnd,IDD_PRINTER_LIST,!IsDlgButtonChecked(hwnd,IDD_DEFAULT_PRINTER));
//
_fInTxuser = FALSE;
break;
}
case WM_TXUSER+1: {
//2.00E
dialogRead(hd0);
{
// hDevModeを変更するとWZ16のCOMMDLGでアプリエラーになる
HANDLE hDevMode = lp->hDevMode;lp->hDevMode = NULL;
HANDLE hDevNames = lp->hDevNames;lp->hDevNames = NULL;
lpInit(lp);
{
HDIALOG hd = dialogSearchDialog(hd0,IDD_RESLIST);
if (hd) {
HSTRBLK sb = dialogGetSb(hd,IDD_RESLIST);
makeResolution(NULL,lp,sb);
dialogWriteItem(hd,IDD_RESLIST);
}
//
hd = dialogSearchDialog(hd0,IDD_SIZELIST);
if (hd) {
HSTRBLK sb = dialogGetSb(hd,IDD_SIZELIST);
makePapersize(NULL,lp,sb);
dialogWriteItem(hd,IDD_SIZELIST);
}
//
hd = dialogSearchDialog(hd0,IDD_BINLIST);
if (hd) {
HSTRBLK sb = dialogGetSb(hd,IDD_BINLIST);
makeBin(NULL,lp,sb);
dialogWriteItem(hd,IDD_BINLIST);
}
}
lpTerm(lp);
lp->hDevMode = hDevMode;
lp->hDevNames = hDevNames;
}
break;
}
}
return FALSE;
}
static void dialogAddChooseFontHeader(HDIALOG hd,LPRINT*lp,FONTSTYLE* fs)
{
SELFONTARG arg;
structClear(arg);
arg.lfPitch = DEFAULT_PITCH;
dialogSetH(hd);
arg.lfCharSet = SHIFTJIS_CHARSET;
dialogSelectFont(
hd,
NULL,
14,
fs->tlfFaceName[IFONT_STD],
&fs->tlfHeight[IFONT_STD],
&arg
);
dialogLF(hd);
dialogSetV(hd);
}
DWORD convprocMcm(DWORD data,int mode)
{
if (mode == TXDIALOG_READ) {
return data * 10;
} else {
return data / 10;
}
}
static void dialogGroupEndCheck(HDIALOG hd,mchar *szcaption,BOOL *data)
{
DTRECT r;
dialogGroupEndGetRect(hd,&r);
DTRECT r1 = r;
r.x += DTCX;
dialogSetPos(hd,&r);
dialogCheck(hd,szcaption,data);
r1.y += r1.cy;
dialogSetPos(hd,&r1);
}
//2.00D
static void dialogAddPreview(HDIALOG hd,int id,TX* text)
{
#ifndef __FLAT__
//3.00A 970502 WZ16 stack over対策のため、印刷スタイルの"計算"機能は外した
return;
#else
int lxg = 14;
dialogLFV(hd);
dialogSetGroupRight(hd,0);
dialogGroup(hd,"");
//
dialogControlID(hd,IDD_DISP_WIDTH);
dialogControlHelp(hd,330);
dialogControlEnable(hd,FALSE);
dialogControlGuide(hd,"文字(半角)",10);
dialogStrC(hd,"1行の文字数:","",lxg,1,5);
//
dialogControlID(hd,IDD_DISP_HEIGHT);
dialogControlHelp(hd,332);
dialogControlEnable(hd,FALSE);
dialogControlGuide(hd,"行",6);
dialogStrC(hd,"1ページの行数:","",lxg,1,5);
//
dialogControlID(hd,IDD_DISP_LINEINT);
dialogControlHelp(hd,332);
dialogControlEnable(hd,FALSE);
dialogControlGuide(hd,"0.1mm",6);
dialogStrC(hd,"行間:","",lxg,1,5);
//
dialogControlID(hd,IDD_DISP_CLM);
dialogControlHelp(hd,332);
dialogControlEnable(hd,FALSE);
dialogControlGuide(hd,"段",6);
dialogStrC(hd,"段組:","",lxg,1,5);
//
dialogControlID(hd,IDD_DISP_RIGHT);
dialogControlHelp(hd,331);
dialogControlEnable(hd,FALSE);
dialogControlGuide(hd,"mm",6);
#if 1//2.99D 970402
dialogStrC(hd,text->fVertical ? "下余白" : "右余白:","",lxg,1,5);
#else
dialogStrC(hd,text->fVertical ? "左マージン" : "右マージン:","",lxg,1,5);
#endif
//
dialogControlID(hd,IDD_DISP_BOTTOM);
dialogControlHelp(hd,333);
dialogControlEnable(hd,FALSE);
dialogControlGuide(hd,"mm",6);
#if 1//2.99D 970402
dialogStrC(hd,text->fVertical ? "左余白" : "下余白:","",lxg,1,5);
#else
dialogStrC(hd,"下マージン:","",lxg,1,5);
#endif
//
DTRECT r;
dialogGetPos(hd,&r);
r.cx = 0;
r.cy = 0;
__dialogAddItem(hd,TXWS_SZCLASS,"",id,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_CHILD|WS_VISIBLE|(_fwin40 ? WS_BORDER : 0));
//
dialogControlID(hd,IDD_FSTYLECALC);
dialogControlHelp(hd,329);
dialogGroupEndCheck(hd,"計算",&_fCalcStyle);
#endif
}
static BOOL uiConfigPrint(TX* text,BOOL fSimple)
{
txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)text->szlpstyle);//2.96 970206
txLpOp(text,TXLPOP_FLUSHDEVMODE);// get hDevMode
//
HCURSOR hcursor = LoadCursor(NULL,IDC_WAIT);//2.00C
hcursor = SetCursor(hcursor);//2.00C
LPRINT* lp = text->lp;
//2.96 970206 backup
LPRINT lp0 = *lp; //2.00D backup
FONTSTYLE text_tfontstyle0[FONTTX_N]; // backup
memcpy(text_tfontstyle0,text->tFontstyle,SIZE_TFONTSTYLE);
BBOOL fHeadFontAuto0 = text->fHeadFontAuto;
//
int lcx = DTCX * 53;
int lxval = 5 + _fwin40 * 2;//2.95 970127 数値入力ボックスの幅
#if 01
//2.00E プリンタ名リストセットアップ
mchar hpnbuff[4096];
HSTRBLK hpn = sbNew(hpnbuff,sizeof(hpnbuff));
{
mchar buff[4096];
GetProfileString("devices",NULL,"",buff,sizeof(buff));
mchar*p = buff;
while(*p) {
sbAdd(hpn,p);
p += strlen(p) + 1;
}
//information("%d,%s",sbGetCount(hpn),buff);
}
#endif
//
HDIALOG hd0 = dialogbig(captionGet(lp->szstyle));//2.99D 970330 dialogbig化
dialogSetStartPage(hd0,_ipageConfig);
dialogSetContexthelp(hd0,TRUE);
dialogSetCustdata(hd0,(DWORD)lp);
PMACROFUNC pfunc;
macroGetFuncAddress("dlgprocConfig",&pfunc);
dialogSetHook(hd0,&pfunc);
PMACROFUNC pfuncconv;
macroGetFuncAddress("convprocMcm",&pfuncconv);
HDIALOG hd = dialog("文字数・行数・余白");
int lx = 20;
dialogSetGroupRight(hd,lcx);
dialogGroup(hd,"文字数・行数");
//2.96 970204 文書の設定の文字数などの設定で印刷できるようにした。
dialogControlID(hd,IDD_TEXTLXLY_ENABLE);
dialogControlHelp(hd,491);
dialogCheckB(hd,"「文書の設定」の文字数・行数・段組を使用(&T)",&lp->fUseTextLxLyClm);
dialogSpaceV(hd);
//
dialogSetH(hd);
dialogControlID(hd,IDD_WIDTH_ENABLE);
dialogControlHelp(hd,251);
dialogCheckB(hd,"1行の文字数(&C):",&lp->fLxPage);
dialogSetPosLX(hd,lx+1);
dialogControlID(hd,IDD_WIDTH);
dialogControlHelp(hd,252);
dialogControlGuide(hd,"文字(半角)",10);
dialogControlUpdown(hd,MINWIDTH,MAXWIDTH);
dialogIntW(hd,NULL,&lp->lxPage,12,lxval-1);
dialogLF(hd);
//
dialogControlID(hd,IDD_HEIGHT_ENABLE);
dialogControlHelp(hd,253);
dialogCheckB(hd,"1ページの行数(&L):",&lp->fLyPage);
dialogSetPosLX(hd,lx+1);
dialogControlID(hd,IDD_HEIGHT);
dialogControlHelp(hd,254);
dialogControlGuide(hd,"行",2);
dialogControlUpdown(hd,1,LINE_N);
dialogIntW(hd,NULL,&lp->lyPage,12,lxval-1);
dialogLF(hd);
//
dialogControlID(hd,IDD_LINEINT_ENABLE);
dialogControlHelp(hd,492);
dialogCheckB(hd,"行間(&I):",&lp->fLineInt);
dialogSetPosLX(hd,lx+1);
dialogControlGuide(hd,"0.1mm",6);
dialogControlID(hd,IDD_LINEINT);
dialogControlHelp(hd,273);
dialogControlUpdown(hd,0,999);
dialogIntW(hd,NULL,&lp->mcmLineInt,lx,lxval-1);
dialogLF(hd);
dialogSetV(hd);
dialogControlHelp(hd,256);
dialogControlUpdown(hd,1,9);
dialogControlGuide(hd,"段",3);
dialogControlID(hd,IDD_CLM);
dialogIntW(hd,"段組(&N):",&lp->nClm,lx,lxval-1);
//
dialogControlGuide(hd,"mm",3);
dialogControlConvert(hd,&pfuncconv);
dialogControlHelp(hd,257);
dialogControlUpdown(hd,0,100);
dialogIntW(hd,"段間(&J):",&lp->mcmClmInt,lx,lxval-1);//2.99F 970404 &I->&J
dialogGroupEnd(hd);
//2.96A 970214 "用紙"タブから移動
dialogGroup(hd,"用紙の余白");
dialogControlConvert(hd,&pfuncconv);
dialogControlGuide(hd,"mm",3);
dialogControlHelp(hd,265);
dialogControlUpdown(hd,1,999);
dialogControlID(hd,IDD_MARGIN_UPPER);//2.99D 970402
#if 0//2.99D 970402
dialogIntW(hd,text->fVertical?"右(&R)":"上(&U):",&lp->mcmMarginTop,6,lxval);
#else
dialogIntW(hd,"上(&U):",&lp->mcmMarginTop,6,lxval);
#endif
//
dialogControlConvert(hd,&pfuncconv);
dialogControlGuide(hd,"mm",3);
dialogControlHelp(hd,266);
dialogControlID(hd,IDD_MARGIN_BOTTOM);
dialogControlUpdown(hd,1,999);
#if 0//2.99D 970402
dialogIntW(hd,text->fVertical?"左(&L)":"下(&D):",&lp->mcmMarginBottom,6,lxval);
#else
dialogIntW(hd,"下(&D):",&lp->mcmMarginBottom,6,lxval);
#endif
dialogLFV(hd);
dialogSpaceH(hd);
dialogControlConvert(hd,&pfuncconv);
dialogControlGuide(hd,"mm",3);
dialogControlHelp(hd,267);
dialogControlUpdown(hd,1,999);
dialogControlID(hd,IDD_MARGIN_LEFT);//2.99D 970402
#if 0//2.99D 970402
dialogIntW(hd,text->fVertical?"上(&U):":"左(&L):",&lp->mcmMarginLeft,6,lxval);
#else
dialogIntW(hd,"左(&M):",&lp->mcmMarginLeft,6,lxval);//2.99F 970404 &L->&M
#endif
//
dialogControlConvert(hd,&pfuncconv);
dialogControlGuide(hd,"mm",3);
dialogControlHelp(hd,268);
dialogControlID(hd,IDD_MARGIN_RIGHT);
dialogControlUpdown(hd,1,999);
#if 0//2.99D 970402
dialogIntW(hd,text->fVertical?"下(&U)":"右(&R):",&lp->mcmMarginRight,6,lxval);
#else
dialogIntW(hd,"右(&R):",&lp->mcmMarginRight,6,lxval);
#endif
dialogLF(hd);
dialogControlHelp(hd,326);
dialogCheckB(hd,"左右ページ対称(&S)",&lp->fMarginSymmerty);//2.99F 970404 (&S) add
dialogGroupEnd(hd);
dialogAddPreview(hd,IDD_PREVIEW1,text);
dialogAddPage(hd0,hd);
//2.00C
HDIALOG hd = dialog("フォント");
dialogSetGroupRight(hd,lcx);
dialogGroup(hd,"本文フォントと見出しフォント");
//2.00D
if (text->lfWestern) {//2.96 970209
dialogCaption(hd,"欧文編集では、文書の設定が使用されます");
} else {
dialogControlID(hd,IDD_USEPRINTFONT);
dialogControlHelp(hd,-320);
dialogControlRadioV(hd);
dialogSwitchB(hd,&lp->fUsePrintFontstyle,"印刷スタイルの設定を使用(&P)","文書の設定を使用(&T)");
}
//2.96 970205 印刷フォントの指定を簡易にした
dialogSpaceV(hd);
dialogSpaceV(hd);
lp->fHeadFontAutoTemp = *fHeadFontAutoGet(text);
FONTNAMES* fontnamesStd = fontnamesNew(hd);
FONTNAMES* fontnamesAnk = fontnamesNew(hd);
{
HDC hdcTmp = txLpOp(text,TXLPOP_GETIC);
fontnamesStd->lfPitch = text->lfProp ? DEFAULT_PITCH : FIXED_PITCH;
fontnamesStd->lfCharSet = text->lfWestern ? DEFAULT_CHARSET : SHIFTJIS_CHARSET;
fontnamesStd->hdcPrinter = hdcTmp;
fontnamesFlush(fontnamesStd);
//
fontnamesAnk->lfPitch = text->lfProp ? DEFAULT_PITCH : FIXED_PITCH;
fontnamesAnk->lfCharSet = DEFAULT_CHARSET;
fontnamesAnk->hdcPrinter = hdcTmp;
fontnamesFlush(fontnamesAnk);
txLpOp(text,TXLPOP_RELEASEIC); // release hdcTmp
}
dialogSetH(hd);
int i;
for (i = 0;i < 2;i++) {
int lx = 20;
lp->fontstyleTemp[i] = *fontstyleGet(text,i == 0 ? FONTTX_BODY : FONTTX_H1);
FONTSTYLE* fs = &lp->fontstyleTemp[i];
static mchar* tszStd[] = {"本文 全角フォント(&F):","見出 全角フォント(&H):"};
static mchar* tszAnk[] = {"本文 半角フォント(&G):","見出 半角フォント(&I):"};
SELFONTARG arg;
structClear(arg);
if (_fwin40) {
arg.lcxFaceName = 21;
arg.lcxFaceSize = 7; //2.00C 6だとWin3.1で1桁しか出ない
} else {
//2.99D 970330 Win3.1でフォントサイズ指定の"標準"が見えなかった
arg.lcxFaceName = 19;
arg.lcxFaceSize = 9;
}
//
dialogCaptionDynamic(hd,tszStd[i],lx-1);
dialogSetPosLX(hd,lx);
arg.fontnames = fontnamesStd;
dialogControlHelp(hd,282);
lp->idTemp[i][IFONT_STD] = dialogSelectFont(hd,NULL,0,
fs->tlfFaceName[IFONT_STD],
&fs->tlfHeight[IFONT_STD],
&arg
);
dialogLF(hd);
dialogCaptionDynamic(hd,tszAnk[i],lx-1);
dialogSetPosLX(hd,lx);
arg.lfCharSet = DEFAULT_CHARSET;
arg.fontnames = fontnamesAnk;
arg.fEnableDefaultFaceName = TRUE;
arg.fEnableDefaultHeight = TRUE;
dialogControlHelp(hd,283);
lp->idTemp[i][IFONT_ANK] = dialogSelectFont(hd,NULL,0,
fs->tlfFaceName[IFONT_ANK],
&fs->tlfHeight[IFONT_ANK],
&arg
);
dialogLF(hd);
if (i == 0) {
if (text->fPlaintext) dialogSetEnable(hd,FALSE);//3.00B1 970523
//
dialogSpaceV(hd);
dialogSpaceV(hd);
dialogControlHelp(hd,493);
dialogControlID(hd,IDD_HEADFONTAUTO);
dialogCheckB(hd,"見出しフォントの簡易設定(&S)",&lp->fHeadFontAutoTemp);
dialogLF(hd);
}
}
dialogSetV(hd);
//
dialogControlID(hd,IDD_STYLE);
dialogControlHelp(hd,220);
dialogButton(hd,"高度なフォントの指定(&K)...",NULL,24);
//
if (text->fPlaintext) dialogSetEnable(hd,TRUE);//3.00B1 970523
//
dialogSpaceV(hd);
dialogSetIntXY(hd,0,0);
dialogCaption(hd,"文字の倍率(&C):");
dialogControlHelp(hd,258);
dialogRadioIntW(hd,&lp->dmScaleFont,"50%","75%","100%","125%","150%");
dialogResetInt(hd);
dialogGroupEnd(hd);
dialogAddPreview(hd,IDD_PREVIEW2,text);
dialogAddPage(hd0,hd);
//2.96A 970214
HDIALOG hd = dialog("印刷");
dialogSetGroupRight(hd,lcx);
dialogGroup(hd,"行番号と脚注");
dialogControlHelp(hd,255);
dialogCheckB(hd,"行番号(&N)",&lp->fDispLineNo);
//
dialogControlHelp(hd,494);
dialogSelectIDB(hd,"脚注(&F):",&lp->modePrintFootnote,19,24,"印刷しない","改ページして印刷する","文末に続けて印刷する");
#if 0//2.97A 970227
dialogControlHelp(hd,399);
dialogIntB(hd,"レターヘッダの行数(&L):",&text->nparaLetterHeader,19,4);
#endif
//2.98 970305 印刷時にレターヘッダ/レターフッタテンプレートを文書頭/末尾に挿入できるようにした
dialogGroupEnd(hd);
dialogGroup(hd,"テンプレート");
dialogControlRefer(hd,"-f "+text->szexedir+"template\\*.*");
dialogControlHelp(hd,401);
dialogStrC(hd,"レターヘッダ(&H):",lp->szTemplateHeader,16,cchof(lp->szTemplateHeader),23);
dialogControlRefer(hd,"-f "+text->szexedir+"template\\*.*");
dialogControlHelp(hd,402);
dialogStrC(hd,"レターフッタ(&O):",lp->szTemplateFooter,16,cchof(lp->szTemplateFooter),23);
dialogGroupEnd(hd);
dialogAddPage(hd0,hd);
HDIALOG hd = dialog("用紙");
int lx = 0;
dialogSetGroupRight(hd,lcx);
dialogGroup(hd,"サイズ(&S)");
#if 1//2.00E
HSTRBLK sb = makePapersize(hd,lp,NULL);
if (sb) {
dialogControlID(hd,IDD_SIZELIST);
dialogControlHelp(hd,261);
dialogSelectW(hd,NULL,&lp->dmPaperSize,lx,32,sb);
}
#else
{
#ifndef CCHPAPERNAME
#define CCHPAPERNAME 64
#endif
int n = lpCap(lp,DC_PAPERNAMES,0);
mchar* pName = memAlloc(n * CCHPAPERNAME);
mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
WORD* pData = memAlloc(n * sizeof(WORD));
DWORD* tData = memAlloc((n + 1) * sizeof(DWORD));
if (tName && pName) {
lpCap(lp,DC_PAPERNAMES,pName);
lpCap(lp,DC_PAPERS,(LPSTR)pData);
int i;
for (i = 0;i < n;i++) {
tName[i] = &pName[i*CCHPAPERNAME];
tData[i] = pData[i];
}
tName[n] = NULL;
//
HSTRBLK sb = dialogSelectIDInit(hd,tName,tData);
dialogControlID(hd,IDD_SIZELIST);
dialogControlHelp(hd,261);
dialogSelectW(hd,NULL,&lp->dmPaperSize,lx,32,sb);
}
memFree(pName);
memFree(tName);
memFree(pData);
memFree(tData);
}
#endif
//
dialogIndent(hd,1);
dialogControlID(hd,IDD_USERPAPER);
dialogControlHelp(hd,262);
dialogCheckB(hd,"サイズをmm単位で指定(&P)",&lp->fUserPaperSize);
dialogIndent(hd,-1);
//
dialogControlConvert(hd,&pfuncconv);
dialogControlID(hd,IDD_USERPAPERX);
dialogControlGuide(hd,"mm",3);
dialogControlHelp(hd,263);
dialogControlUpdown(hd,1,999);
dialogIntW(hd,"幅(&W):",&lp->mcmPaperWidth,9,lxval);//2.99F 970404 (&W) add,6->9
//
dialogControlConvert(hd,&pfuncconv);
dialogControlID(hd,IDD_USERPAPERY);
dialogControlGuide(hd,"mm",3);
dialogControlHelp(hd,264);
dialogControlUpdown(hd,1,999);
dialogIntW(hd,"高さ(&H):",&lp->mcmPaperHeight,9,lxval);//2.99F 970404 (&H) add,6->9
dialogGroupEnd(hd);
dialogGroup(hd,"用紙");
lx = 16;
dialogControlHelp(hd,495);
dialogCheckB(hd,"袋とじ(&2)",&lp->f2pages);
{
static mchar* tName[] = {
"縦方向","横方向",NULL,
};
static DWORD tData[] = {
DMORIENT_PORTRAIT,DMORIENT_LANDSCAPE,
};
HSTRBLK sb = dialogSelectIDInit(hd,tName,tData);
dialogControlHelp(hd,269);
dialogSelectW(hd,"印刷方向(&O):",&lp->dmOrientation,lx,16,sb);
}
//
#if 1//2.00E
HSTRBLK sb = makeBin(hd,lp,NULL);
if (sb) {
dialogControlHelp(hd,270);
dialogControlID(hd,IDD_BINLIST);
dialogSelectW(hd,"給紙カセット(&C):",&lp->dmDefaultSource,lx,16,sb);
}
#else
{
#ifndef CCHBINNAME
#define CCHBINNAME 24
#endif
int n = lpCap(lp,DC_BINNAMES,0);
mchar* pName = memAlloc(n * CCHBINNAME);
mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
WORD* pData = memAlloc(n * sizeof(WORD));
DWORD* tData = memAlloc((n + 1) * sizeof(DWORD));
if (tName && pName) {
lpCap(lp,DC_BINNAMES,pName);
lpCap(lp,DC_BINS,(LPSTR)pData);
int i;
for (i = 0;i < n;i++) {
tName[i] = &pName[i*CCHBINNAME];
tData[i] = pData[i];
}
tName[n] = NULL;
//
HSTRBLK sb = dialogSelectIDInit(hd,tName,tData);
dialogControlHelp(hd,270);
dialogSelectW(hd,"給紙カセット(&C):",&lp->dmDefaultSource,lx,16,sb);
}
memFree(pName);
memFree(tName);
memFree(pData);
memFree(tData);
}
#endif
dialogGroupEnd(hd);
dialogAddPreview(hd,IDD_PREVIEW3,text);
dialogAddPage(hd0,hd);
HDIALOG hd = dialog("ヘッダ・フッタ");
dialogSetGroupRight(hd,lcx);
{
int lxg = 14;
int lcx = 25;
dialogGroup(hd,"ヘッダ");
dialogControlReverseBool(hd);
dialogControlHelp(hd,323);
dialogControlID(hd,IDD_HEADERPRINT);
dialogCheckB(hd,"ヘッダを印刷(&H)",&lp->fNoHeaderPrint);
//2.96A 970214
dialogControlConvert(hd,&pfuncconv);
dialogControlGuide(hd,"mm",3);
dialogControlHelp(hd,496);
dialogControlUpdown(hd,1,40);
dialogIntW(hd,"上余白(&T):",&lp->mcmMarginHeader,lxg,lxval);
//
dialogSetH(hd);
dialogControlHelp(hd,271);
dialogControlID(hd,IDD_HEADER);
dialogStrC(hd,"奇数ページ(&1):",lp->szHeader,lxg,CCHWORD,lcx);
dialogControlID(hd,IDD_HEADERSTR);
dialogButton(hd,"参照...",NULL,8);
dialogLF(hd);
dialogControlHelp(hd,271);
dialogControlID(hd,IDD_HEADER2);
dialogStrC(hd,"偶数ページ(&2):",lp->szHeader2,lxg,CCHWORD,lcx);
dialogControlID(hd,IDD_HEADER2STR);
dialogButton(hd,"参照...",NULL,8);
dialogSetV(hd);
dialogGroupEnd(hd);
dialogGroup(hd,"フッタ");
dialogControlReverseBool(hd);
dialogControlHelp(hd,324);
dialogControlID(hd,IDD_FOOTERPRINT);
dialogCheckB(hd,"フッタを印刷(&F)",&lp->fNoFooterPrint);
//2.96A 970214
dialogControlConvert(hd,&pfuncconv);
dialogControlGuide(hd,"mm",3);
dialogControlHelp(hd,497);
dialogControlUpdown(hd,1,40);
dialogIntW(hd,"下余白(&B):",&lp->mcmMarginFooter,lxg,lxval);
//
dialogSetH(hd);
dialogControlHelp(hd,271);
dialogControlID(hd,IDD_FOOTER);
dialogStrC(hd,"奇数ページ(&3)",lp->szFooter,lxg,CCHWORD,lcx);
dialogControlID(hd,IDD_FOOTERSTR);
dialogButton(hd,"参照...",NULL,8);
dialogLF(hd);
dialogControlHelp(hd,271);
dialogControlID(hd,IDD_FOOTER2);
dialogStrC(hd,"偶数ページ(&4):",lp->szFooter2,lxg,CCHWORD,lcx);
dialogControlID(hd,IDD_FOOTER2STR);
dialogButton(hd,"参照...",NULL,8);
dialogSetV(hd);
dialogGroupEnd(hd);
dialogSpaceV(hd);
dialogSetH(hd);
dialogControlAddY(hd,DTCYBOX - DTCYKEY);
dialogCaption(hd,"フォント(&O):");
dialogControlHelp(hd,272);
dialogAddChooseFontHeader(hd,lp,&lp->fontstyleMargin);
dialogSetV(hd);
dialogLF(hd);
dialogControlHelp(hd,498);
dialogControlID(hd,IDD_HEADER2SPECIFY);
dialogCheckB(hd,"奇数ページと偶数ページで別指定(&M)",&lp->fSpecifyHeader2);
dialogControlHelp(hd,325);
dialogCheckB(hd,"奇数ページと偶数ページで対称に印刷(&S)",&lp->fHeaderSymmerty);
}
dialogAddPage(hd0,hd);
#if 01
//2.00E
HDIALOG hd = dialog("プリンタ");
dialogSetGroupRight(hd,lcx);
dialogGroup(hd,"使用するプリンタ");
dialogControlHelp(hd,-342);
dialogControlRadioV(hd);
dialogControlReverseBool(hd);
//information("%d",lp->fPrinterName);
dialogControlID(hd,IDD_DEFAULT_PRINTER);
dialogSwitchB(hd,&lp->fPrinterName,"通常使うプリンタを使用(&N)","プリンタを指定(&P)");
//
dialogControlID(hd,IDD_PRINTER_LIST);
dialogControlHelp(hd,344);
dialogSelectStrH(hd,NULL,lp->szPrinterName,sizeof(lp->szPrinterName),0,40,hpn);
dialogGroupEnd(hd);
dialogGroup(hd,"印刷品質");
#if 1
HSTRBLK sb = makeResolution(hd,lp,NULL);
if (sb) {
dialogControlID(hd,IDD_RESLIST);
dialogControlHelp(hd,270);
dialogControlHelp(hd,345);
dialogSelectW(hd,"解像度(&D):",&lp->dmPrintQuality,10,20,sb);
}
#else
{
int n = lpCap(lp,DC_ENUMRESOLUTIONS,0);
LONG* pData = memAlloc(n * sizeof(LONG) * 2);
if (pData) {
lpCap(lp,DC_ENUMRESOLUTIONS,(LPVOID)pData);
int cch = 20;
mchar* pName = memAlloc(n * cch);
mchar** tName = memAlloc((n + 1) * sizeof(mchar*));
if (pName && tName) {
int i;
for (i = 0;i < n;i++) {
// pDataには縦横入っているが片方のみ使用
pData[i] = pData[i * 2];
//
tName[i] = &pName[i * cch];
sprintf(tName[i],"%d dpi",pData[i]);
}
tName[n] = NULL;
//
HSTRBLK sb = dialogSelectIDInit(hd,tName,pData);
dialogControlID(hd,IDD_RESLIST);
dialogControlHelp(hd,270);
dialogSelectW(hd,"解像度(&D):",&lp->dmPrintQuality,10,16,sb);
}
memFree(pName);
memFree(tName);
}
memFree(pData);
}
#endif
dialogGroupEnd(hd);
dialogAddPage(hd0,hd);
#endif
#if 0 //1.99H プリンタフォントの選択ができたので、廃止
HDIALOG hd = dialog("オプション");
{
static mchar* tName[] = {
"ビットマップで印刷","ダウンロードして印刷","プリンタフォントに置き換えて印刷",NULL
};
static DWORD tData[] = {
DMTT_BITMAP,DMTT_DOWNLOAD,DMTT_SUBDEV,
};
HSTRBLK sb = dialogSelectIDInit(hd,tName,tData);
dialogSelectW(hd,"TrueTypeフォント:",&lp->dmTTOption,16,30,sb);
}
dialogAddPage(hd0,hd);
#endif
dialogAddPageComplete(hd);//1.97
if (!fSimple) {
dialogControlHelp(hd0,260);
dialogAddPageButton(hd0,IDD_LOAD,"読み込み(&Q)...",16);//2.96 970210 「読み込み」新設
}
dialogControlHelp(hd0,260);
dialogAddPageButton(hd0,IDD_SAVETOTEMP,"一時設定(&A)",14);//2.96 970204 「一時設定」新設
dialogControlHelp(hd0,260);
dialogAddPageButton(hd0,IDD_SAVETO,"名前を付けて保存(&Y)...",24);//2.00C
#if 0//2.96 970210 「読み込み」を新設したので不要になった
dialogControlHelp(hd0,259);
dialogAddPageButton(hd0,IDD_DELETE,"消去(&X)...",14);
#endif
SetCursor(hcursor);//2.00C
BOOL ret = dialogOpen(hd0);
#if 01//2.00E
sbDelete(hpn);
#endif
// save
if (ret) {
txFlushHeadFontAuto(text);
//2.99C 970324 //余白が印刷可能域に収まっているかチェック
{
//lp->mcmMarginMinBottom++;
//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);
if (
lp->mcmMarginTop < lp->mcmMarginMinTop ||
lp->mcmMarginLeft < lp->mcmMarginMinLeft ||
lp->mcmMarginBottom < lp->mcmMarginMinBottom ||
lp->mcmMarginRight < lp->mcmMarginMinRight
) {
int ret = MessageBox(
wndtxGetActive(textf->hwndbase),
"余白が少なすぎます\n余白を適切な値に修正しますか?",
"印刷",MB_ICONQUESTION|MB_YESNO
);
if (ret == IDYES) {
if (lp->mcmMarginTop < lp->mcmMarginMinTop) lp->mcmMarginTop = lp->mcmMarginMinTop;
if (lp->mcmMarginLeft < lp->mcmMarginMinLeft) lp->mcmMarginLeft = lp->mcmMarginMinLeft;
if (lp->mcmMarginBottom < lp->mcmMarginMinBottom) lp->mcmMarginBottom = lp->mcmMarginMinBottom;
if (lp->mcmMarginRight < lp->mcmMarginMinRight) lp->mcmMarginRight = lp->mcmMarginMinRight;
//2.99I 970406 マージンはmm単位で切り捨てなので、mm以下の部分は切り上げる
// そうしないといつまでも「余白が少なすぎます」と出てしまう
#define lpMcmKiriage10Mcm(val) (val = val + (val % 10 != 0) * 10)
lpMcmKiriage10Mcm(lp->mcmMarginTop);
lpMcmKiriage10Mcm(lp->mcmMarginLeft);
lpMcmKiriage10Mcm(lp->mcmMarginBottom);
lpMcmKiriage10Mcm(lp->mcmMarginRight);
}
}
}
txConfigOp(text,TXCONFIGOP_PRINTWRITE,(LPVOID)lp->szstyle);
if (strcmp(lp->szstyle,"一時設定")) {
//2.96 970206 一時設定でなければ、text->tFontstyleを登録
txConfigOp(text,TXCONFIGOP_EXTSAVE_FONTSTYLE,0);
txcfgSavePart(text,fHeadFontAuto);
#if 0//2.97A 970227
txcfgSavePart(text,nparaLetterHeader);
#endif
}
//information("%d",lp->dmPrintQuality);
} else {
//2.00D restore(dialogReadするようになったため)
memcpy(&text->lp->configTop,&lp0.configTop,&lp0.configEnd - &lp0.configTop);
memcpy(text->tFontstyle,text_tfontstyle0,SIZE_TFONTSTYLE);
text->fHeadFontAuto = fHeadFontAuto0;
}
// flush
if (ret && text->editmode == 2) {
#if 1 //2.99D 970402 プレビュー中、設定ボタンで設定を変更してもプレビューに反映されなかった
txLpOp(text,TXLPOP_FLUSHSTYLE);
#endif
#if 1//2.99E 970403 flpPreviewもテーブル幅を更新しないと段組数を変えたときに桁揃えがくちゃくちゃになる
txSetUndisp(text);
txFlush(text);
txFlushTableAll(text);
txSetDisp(text);
#else
txFlush(text);
#if 0//2.96 970210 flpPreview中は実行できない。
txFlushTableAll(text); // txFlushの後
#endif
#endif
lp->npageall = 0;//2.96 970210 for clear all page counter at preview.
}
return ret;
}
BOOL TXAPI TXCMDBASE txuiConfigPrint(TX* text)
{
// 印刷スタイルの設定
return uiConfigPrint(text,FALSE);
}
//##印刷
#define PRINT_UI 0
#define PRINT_CONFIG 1
#define PRINT_EXEC 2
static int npageGetAll(tx *text)
{
return txLpOp(text,TXLPOP_CALC_NPAGEALL);
}
static BOOL _fNoSaveLpstyleName; // 印刷スタイル名を覚えない?
void TXAPI txLprintEx(TX* text)
{
// textを現在の印刷スタイルで印刷します。
// 現在の印刷スタイルは、txConfigOp(text,TXCONFIGOP_PRINTREAD,szlpstyle);でセットできます。
// text->lp->npagetopからtext->lp->npageendまで印刷します。
// f1pageがTRUEなら、text->lp->npagetopだけを印刷します。
// modePrintPageが0ならすべて、1なら奇数、2なら偶数ページを印刷します。
//2.96 970207 新API
txLpOp(text,TXLPOP_PRINTENTER);
{
LPRINT* lp = text->lp;
{
static mchar sz[] = \"\allpages";
if (
strstr(lp->szHeader,sz) ||
strstr(lp->szFooter,sz) ||
strstr(lp->szHeader2,sz) ||
strstr(lp->szFooter2,sz)
) {
#if 1//3.00B1 970610 \npageallが0になることがあった。また、ヘッダフッタに\npageallを使うと印刷ができないことがあった
lp->npageall = npageGetAll(text);
#else
txLpOp(text,TXLPOP_CALC_NPAGEALL);
#endif
if (lp->npageend == NPAGE_MAX) lp->npageend = lp->npageall;
//information("%d",lp->npageall);
}
}
for (lp->icopy = 0;lp->icopy < lp->ncopy;lp->icopy++) {
txLpOp(text,TXLPOP_PRINT);
}
}
txLpOp(text,TXLPOP_PRINTEXIT);
}
void TXAPI txLprint(TX* text,mchar* szlpstyle)
{
// textを印刷スタイルszlpstyleで印刷します。
// szlpstyleがNULLなら、text->szlpstyle印刷スタイルで印刷します。
//2.96 970207 新API
txConfigOp(text,TXCONFIGOP_PRINTREAD,szlpstyle ? (LPVOID)szlpstyle : (LPVOID)text->szlpstyle);
text->lp->npagetop = 1;
text->lp->npageend = NPAGE_MAX;
txLprintEx(text);
}
static void lprint(TX* text)
{
txLprintEx(text);
if (!text->lp->fClip) {//2.00D 範囲印刷すると設定が変更された
#if 1
//2.00E 設定全部を保存するのではなく、印刷スタイル名のみを保存するようにした
if (!_fNoSaveLpstyleName) {
txConfigOp(text,TXCONFIGOP_EXTSAVE_LPSTYLE,0);
}
#else
//1.99I 印刷OKしたら、印刷スタイルを記憶するため設定を保存する。
txConfigOp(text,TXCONFIGOP_EXTSAVE,0);
#endif
}
}
//2.00E 印刷スタイルにプリンタ名を埋め込む為に全面変更
// WZ16では、PrintDlg中にhDevModeを変更するとアプリエラーになった為
// WZ32でも、PrintDlgとの整合性が悪いと思われる為
static void FlushSheetlist(HWND hwnd,int id)
{
HWND hctrl = GetDlgItem(hwnd,id);
if (hctrl) {
txConfigOp(text,TXCONFIGOP_PRINTENUM,(LPVOID)hctrl);
int i = SendDlgItemMessage(hwnd,id,CB_FINDSTRINGEXACT,-1,(LPARAM)text->szlpstyle);
if (i == CB_ERR) {
//2.00E スタイルを削除した時の処理を改良
SendDlgItemMessage(hwnd,id,CB_SETCURSEL,0,0);
SendDlgItemMessage(hwnd,id,CB_GETLBTEXT,0,(LPARAM)text->szlpstyle);
txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)text->szlpstyle);
} else {
SendDlgItemMessage(hwnd,id,CB_SETCURSEL,i,0);
}
#if 0//駄目
SendDlgItemMessage(hwnd,id,CB_SETEXTENDEDUI,TRUE,0);//1.98 キーボードで使いにくかった
#endif
}
}
static void FlushPrintDlg(HWND hwnd)
{
lpInit(text->lp);
txLpOp(text,TXLPOP_FLUSHDEVMODE);// hDevModeに印刷スタイル内容を反映する
// プリンタ名を表示
LPRINT* lp = text->lp;
if (lp->hDevNames) {
DEVNAMES *devnames = (LPVOID)GlobalLock(lp->hDevNames);
SetDlgItemText(hwnd,IDD_PRINTER,(BYTE*)devnames + devnames->wDeviceOffset);
GlobalUnlock(lp->hDevNames);
}
}
// 印刷スタイルが変更されたら、それに合わせて詳細モードではテキストの表示を更新する
static void FlushPrintText(TX* text)
{
if (text->editmode == EDITMODE_PRINT) {
txLpOp(text,TXLPOP_FLUSH);
}
}
static BOOL _fPrintExec;
BOOL dlgprocPrint(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static BOOL s_fInit;//3.00B1 970610
switch(message) {
case WM_INITDIALOG: {
s_fInit = TRUE;
//
FlushSheetlist(hwnd,IDD_SHEETLIST);
FlushPrintDlg(hwnd);
EnableWindow(GetDlgItem(hwnd,IDD_PRINTAREAMODE+1),text->lp->fClip);
PostMessage(hwnd,WM_TXUSER,0,0);
if (_fPrintExec) {
PostMessage(hwnd,WM_COMMAND,IDOK,0);
}
break;
}
case WM_TXDIALOGINITEND: {//3.00B1 970610
s_fInit = FALSE;
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
myPostMessage(hwnd,WM_TXUSER,0,0);
switch(id) {
case IDD_STYLESET: {
uiConfigPrint(text,TRUE);
// スタイルが追加/削除される場合がある
FlushSheetlist(hwnd,IDD_SHEETLIST);
FlushPrintDlg(hwnd);
FlushPrintText(text);
return TRUE;
}
case IDD_PROMPT: {//2.00E2
txLpOp(text,TXLPOP_PROMPT);
return TRUE;
}
case IDD_SHEETLIST: {
if (notify == CBN_CLOSEUP ||
(
notify == CBN_SELCHANGE &&
!ComboBox_GetDroppedState(GetDlgItem(hwnd,id))
)
) {
mchar szstyle[CCHLPSTYLE];
GetDlgItemText(hwnd,id,szstyle,CCHLPSTYLE);
if (stricmp(text->szlpstyle,szstyle)) {
strcpy(text->szlpstyle,szstyle);
txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)szstyle);
FlushPrintDlg(hwnd);
FlushPrintText(text);
}
}
break;
}
case IDD_CALCPAGES: {
HCURSOR hcursor = LoadCursor(NULL,IDC_WAIT);
hcursor = SetCursor(hcursor);
SetDlgItemInt(hwnd,IDD_NPAGETOP,1,FALSE);
SetDlgItemInt(hwnd,IDD_NPAGEEND,npageGetAll(text),FALSE);
SetCursor(hcursor);
break;
}
case IDD_NPAGETOP:
case IDD_NPAGEEND: {
if (!s_fInit && notify == EN_CHANGE) {//3.00B1 970610 選択して印刷ダイアログを出すと、「選択した部分」をデフォルトにするようにした
//2.93 ページ指定値を入力しても[ページ指定]モードにならず使いにくかった
CheckRadioButton(hwnd,IDD_PRINTAREAMODE,IDD_PRINTAREAMODE+2,IDD_PRINTAREAMODE+2);
}
break;
}
}
break;
}
case WM_TXUSER: {
EnableWindow(GetDlgItem(hwnd,IDD_NPAGENUM),IsDlgButtonChecked(hwnd,IDD_ENABLE_NPAGENUM));
break;
}
}
return FALSE;
}
//3.00A 970427 _uiPrintのlocalから、表に出した
static BOOL _f1page;
static BYTE _modePrintPage;
static int npageTop = 1;
static int npageEnd = NPAGE_MAX;
static void uiPrintInit(void)
{
//3.00A 970427 new
// for "/p"で印刷するときの、印刷ページ数を初期化
_f1page = FALSE;
_modePrintPage = 0;
npageTop = 1;
npageEnd = NPAGE_MAX;
}
static BOOL _uiPrint(int printmode)
{
_fPrintExec = (printmode == PRINT_EXEC);
if (text->fGene) {
//2.00B 世代テキストを印刷できないようにした
information("世代テキストは印刷できません");
return FALSE;
}
LPRINT* lp = text->lp;
BOOL floop = FALSE;
BOOL ret = FALSE;
// 範囲が選択されていない時、検索文字列を選択表示中は、範囲内の印刷でなく
// テキスト全体の印刷とする
BOOL fClip = (text->fClip && !text->fClipSearch);
if (fClip) {
if (txGetAddressSelectTop(text) == txGetAddressSelectEnd(text)) {
fClip = FALSE;
}
}
//
lp->npageend = NPAGE_MAX;
#if 0//2.99D 970402 プレビューから印刷するとeditmodeが詳細に変わった
lp->editmode = text->editmode;
#endif
lp->fClip = fClip;
lpInit(lp);
//
HDIALOG hd = dialogbig("印刷");
dialogSetHookEx(hd,"\m.dlgprocPrint");
dialogSetGroupRight(hd,DTCX * 64);
dialogSetContexthelp(hd,TRUE);
int mode = 0;
if (fClip) {
mode = 1;
}
int ncopy = 1;
//
DTRECT r1,r2;
dialogGetPos(hd,&r1);
r1.cx = DTCX * 20;
r1.cy = DTCY;
dialogControlHelp(hd,334);
_dialogAddLtext(hd,"使用する印刷スタイル(&S):",&r1);
r2 = r1;
r2.x += r1.cx + DTCX + 2;
r2.cx = DTCX * 30;
r2.cy = DTCY * 10;
#if 1
// with CBS_SORT
__dialogAddItem(hd,"COMBOBOX",NULL,IDD_SHEETLIST,&r2,CBS_SORT|CBS_AUTOHSCROLL|CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP);
#else
_dialogAddCombobox(hd,IDD_SHEETLIST,&r2);
#endif
_dialogAddControlInfo(hd,IDD_SHEETLIST);
{
DTRECT r = r2;
r.x += r.cx + DTCX;
r.cx = DTCX * 10;
r.cy = DTCYBOX;
dialogControlHelp(hd,335);
_dialogAddButton(hd,"設定(&Y)...",IDD_STYLESET,&r);
_dialogAddControlInfo(hd,IDD_STYLESET);
}
r1.y += DTCY * 2;
r2.y += DTCY * 2;
//
dialogControlHelp(hd,59);
_dialogAddLtext(hd,"使用するプリンタ:",&r1);
r2.cx = DTCX * 30;
r2.cy = DTCY;
_dialogAddLtextID(hd,NULL,&r2,IDD_PRINTER);
_dialogAddControlInfo(hd,IDD_PRINTER);
#if 1//2.96 970204 "設定"ボタンが縦に2つ並んでわかりにくかった
r2.y += r2.cy + DTCYINT;
dialogSetPosY(hd,r2.y);
int x = dialogGetPosX(hd);
dialogSetPosX(hd,r2.x);
dialogControlHelp(hd,352);
dialogControlID(hd,IDD_PROMPT);
dialogButton(hd,"プリンタの設定(&R)...",NULL,20);
dialogSetPosX(hd,x);
#else
{
DTRECT r = r2;
r.x += r.cx + DTCX;
r.cx = DTCX * 10;
r.cy = DTCYBOX;
dialogControlHelp(hd,352);
_dialogAddButton(hd,"設定(&R)...",IDD_PROMPT,&r);
_dialogAddControlInfo(hd,IDD_PROMPT);
}
r1.y += DTCY * 3;
r2.y += DTCY * 3;
dialogSetPos(hd,&r1);
#endif
//
dialogGroup(hd,"印刷範囲の選択");
{
//2.96 970204 "ページ指定"ラジオボタンの次が、ページ番号テキストボックス
// でなくて、全ページ数計算ボタンだったので使いにくかった
DTRECT r;
dialogGetPos(hd,&r);
DTRECT r1 = r;
r1.x += DTCX * 20;
r1.cx = DTCX * 20;
r1.cy = DTCYBOX;
_dialogAddButton(hd,"全ページ数計算(&G)",IDD_CALCPAGES,&r1);
dialogControlHelp(hd,341);
_dialogAddControlInfo(hd,IDD_CALCPAGES);
dialogSetPos(hd,&r);
}
dialogControlRadioV(hd);
dialogControlHelp(hd,-336);
dialogControlID(hd,IDD_PRINTAREAMODE);
dialogRadioID(hd,&mode,
"全ページ(&A)",
"選択した部分(&E)",
"ページ指定(&P):"
);
{
DTRECT r;
dialogGetPos(hd,&r);
r.x += DTCX * 20;
r.y -= DTCY + DTCY/2;
dialogSetPos(hd,&r);
dialogSetH(hd);
DTRECT r1 = r;
r1.x += DTCX * 6;r1.y += DTCYKEY - DTCY;
r1.cx = DTCX * 14;r1.cy = DTCY;
_dialogAddLtext(hd,"ページから(&F)",&r1);
dialogControlHelp(hd,336);
dialogControlID(hd,IDD_NPAGETOP);
dialogInt(hd,NULL,&npageTop,0,5);
r1.x += DTCX * 18;
_dialogAddLtext(hd,"ページまで(&T)",&r1);
r.x = r1.x - DTCX * 6;
dialogSetPos(hd,&r);
dialogControlHelp(hd,336);
dialogControlID(hd,IDD_NPAGEEND);
dialogInt(hd,NULL,&npageEnd,0,5);
dialogSetV(hd);
dialogLF(hd);
}
dialogControlHelp(hd,337);
dialogCheck(hd,"先頭&1ページのみ",&_f1page);
dialogSelectIDB(hd,"印刷するページ(&M):",&_modePrintPage,19,20,"全てのページ","奇数ページ","偶数ページ");
dialogGroupEnd(hd);
//
dialogGroup(hd,"ページ番号の付け替え");
dialogControlHelp(hd,338);
dialogControlID(hd,IDD_ENABLE_NPAGENUM);
dialogCheckB(hd,"ページ番号を付け替える(&O)",&lp->fNpagenum);
dialogControlHelp(hd,339);
if (lp->npagenum <= 0) lp->npagenum = 1;
dialogControlID(hd,IDD_NPAGENUM);
dialogIntW(hd,"先頭ページのページ番号(&N):",&lp->npagenum,24,5);
dialogGroupEnd(hd);
//
dialogControlHelp(hd,340);
dialogInt(hd,"部数(&C):",&ncopy,8,5);
if (dialogOpen(hd)) {
toTszlpstyle(text);//3.00A3 970508
lp->fClip = (mode == 1);
if (mode == 0) {
npageTop = 1;
npageEnd = NPAGE_MAX;
}
lp->npagetop = npageTop;
lp->npageend = npageEnd;
lp->ncopy = ncopy;
lp->modePrintPage = _modePrintPage;
lp->f1page = _f1page;
if (lp->fClip) {
TX* text0 = text;
DWORD ret;
wzlock(LOCK_CLIPTS);
txSelectTsPush(text);
{
TX* text1 = txGetFrameNow();//2.99C 970324
HWND hwndtext = CreateWindow(
TXWS_SZCLASS,NULL,
TXWS_TEXT|TXWS_OPENTEXT|WS_CHILDWINDOW|WS_VISIBLE,
0,0,
0,0, // 640,400, // こうすると内容を表示できる
text1->hwndbase,NULL,text1->hInstance,NULL
);
if (hwndtext) {
TX* text = (LPVOID)SendMessage(hwndtext,TXWM_GETTX,0,0);
//
memcpy(&text->lp->configTop,&text0->lp->configTop,&lp->configEnd - &lp->configTop);
text->lp->npagetop = 1;
text->lp->npageend = NPAGE_MAX;
text->lp->ncopy = 1;
//2.00D 範囲内の印刷で先頭ページ番号の指定ができなかった
text->lp->fNpagenum = text0->lp->fNpagenum;
text->lp->npagenum = text0->lp->npagenum;
memcpy(text->tFontstyle,text0->tFontstyle,SIZE_TFONTSTYLE);
strcpy(text->szlpstyle,text0->szlpstyle);//1.99F
text->fVertical = text0->fVertical;//1.99J
text->fForm = text0->fForm;//2.00E 範囲内の印刷で見出しが印刷されなかった
text->fBinedit = text0->fBinedit;
text->fBinary = text0->fBinary;
//2.99D 970402
text->lfProp = text0->lfProp;
text->fLineD = text0->fLineD;
text->fColoringURL = text0->fColoringURL;
text->fJkinsoku = text0->fJkinsoku;
text->tabsize = text0->tabsize;//3.00C 971013 範囲内のみの印刷でタブサイズが既定値になっていた
//
txFlush(text);
//
txSetEditmode(text,2);
txClipPaste(text,HCLIP_TS,TRUE,CLIP_CHAR);
clipDeleteTop(HCLIP_TS);
//wait(2000);
//txInsert(text,"ABC\n");
//txInsert(text,"漢字\n");
//
strcpy(text->szfilename,text0->szfilename);
text->timeFile = text0->timeFile;
lprint(text);
DestroyWindow(hwndtext);
}
}
wzunlock(LOCK_CLIPTS);
} else {
lprint(text);
}
}
return ret;
}
BOOL TXAPI TXCMDBASE uiPrint(void)
{
// 印刷ダイアログを表示
//{#VZ} ^KP
//{#MS} ^P +^{F12}
return _uiPrint(PRINT_UI);
}
BOOL uiPrinterConfig(void)
{
return _uiPrint(PRINT_CONFIG);
}
BOOL TXAPI TXCMD uiPrintExec(void)
{
// 印刷ダイアログを表示して直ちに印刷実行
//1.97で追加
uiPrintInit();//3.00A 970427 "/p"で印刷するとき、印刷ページ数を初期化するようにした
return _uiPrint(PRINT_EXEC);
}
uiSendFax
{
// FAXを送信
// 予め"FAX"という名前でFAX送信用の印刷スタイルを作成しておくと、
// このコマンドを実行してOKするとFAXを送信できます。
//2.00E4で追加
if (txConfigOp(text,TXCONFIGOP_PRINTEXIST,"fax")) {
txstr szlpstyle = text->szlpstyle;
strcpy(text->szlpstyle,"fax");
_fNoSaveLpstyleName = TRUE;
BOOL ret = _uiPrint(PRINT_UI);
strcpy(text->szlpstyle,szlpstyle);
return ret;
} else {
TX* text1 = txGetFrameNow();//2.99C 970324
MessageBox(
wndtxGetActive(text1->hwndbase),
"\"FAX\"という名前でFAX送信用の印刷スタイルを作成してください",
"WZ - FAX送信",
MB_ICONINFORMATION|MB_OK
);
}
}
//##印刷中止
static BOOL _fUserAbort; // 中止が選択された
static HWND _hdlg; // 印刷ダイアログボックス
static FARPROC _lpfnAbortProc;
BOOL TXCALLBACK AbortProc(HDC hdc,short nCode)
{
MSG msg;
while(!_fUserAbort && PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if (!_hdlg || !IsDialogMessage(_hdlg,&msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return !_fUserAbort;
}
BOOL dialogAbortProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_COMMAND: {
int id = LOWORD(wParam);
if (id == IDCANCEL) {
_fUserAbort = TRUE;
EnableWindow(text->hwndbase,TRUE);//2.99C 970324 text1->text
dialogFree(_hdlg);_hdlg = NULL;
statprintf("印刷を中止しました");//1.00F
return TRUE;
}
break;
}
case WM_PAINT: {
int id;
for (id = 500;id <= 502;id++) {
HWND hctrl = GetDlgItem(hwnd,id);
HDC hdc = GetDC(hctrl);
HFONT hfont0 = NULL;
mchar buff[100];
InvalidateRect(hctrl,NULL,TRUE);
UpdateWindow(hctrl);
if (text1->fCtl3d) {
SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
SetBkColor(hdc,GetSysColor(COLOR_BTNFACE));
} else {
SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
SetBkColor(hdc,GetSysColor(COLOR_WINDOW));
}
{
LPRINT* lp = text->lp;
NPAGE npage = txNpageFromNpageclm(text,text->npage);
if (id == 500) {
sprintf(buff,"%dページを印刷中",npage);
} else if (id == 501) {
if (lp->npageend == NPAGE_MAX) {
strcpy(buff,"残り???ページ");
} else {
sprintf(buff,"残り%dページ",lp->npageend - npage);
}
} else {
sprintf(buff,"%d部中 %d部を印刷中",lp->ncopy,lp->icopy + 1);
}
hfont0 = SelectObject(hdc,GetStockObject(GetSystemFontNo()));//1.00H6
TextOut(hdc,0,0,buff,strlen(buff));
SelectObject(hdc,hfont0);//1.00H6
}
ReleaseDC(hctrl,hdc);
}
break;
}
}
return FALSE;
}
HWND dialogAbortOpen(void)
{
// 印刷中ダイアログ
if (text->lp && text->lp->hdc) {
EnableWindow(text->hwndbase,FALSE); // 印刷メニューが再度選択されない様に
_fUserAbort = FALSE;
//
HDIALOG hd = dialog("印刷中");
{
PMACROFUNC pfunc;
if (macroGetFuncAddress("dialogAbortProc",&pfunc)) {
dialogSetHook(hd,&pfunc);
}
}
dialogCaption(hd,text->szfilename);
dialogControlID(hd,500);dialogCaption(hd," ");
dialogControlID(hd,501);dialogCaption(hd," ");
dialogControlID(hd,502);dialogCaption(hd," ");
dialogLFV(hd);
dialogCancel(hd,10);
_hdlg = dialogCreate(hd);
//
#ifdef __FLAT__
_lpfnAbortProc = macroMakeCallBackProc("AbortProc",8);
#else
_lpfnAbortProc = macroMakeCallBackProc("AbortProc",4);
#endif
SetAbortProc(text->lp->hdc,(ABORTPROC)_lpfnAbortProc);
}
return _hdlg;
}
void dialogAbortClose(void)
{
EnableWindow(text->hwndbase,TRUE);
if (text->lp) SetAbortProc(text->lp->hdc,NULL);
if (_lpfnAbortProc) {
macroFreeCallBackProc(_lpfnAbortProc);
_lpfnAbortProc = NULL;
}
if (_hdlg) {
dialogFree(_hdlg);
_hdlg = NULL;
}
}
BOOL TXCMDBASE txSetPreview(TX* text)
{
// 印刷プレビューと通常編集切り替え
if (text->flpPreview) {
txLpOp(text,TXLPOP_PREVIEWEXIT);
} else {
txLpOp(text,TXLPOP_PREVIEWENTER);
}
return TRUE;
}
#define IDD_PV_STYLELIST 100
#define IDD_PV_STYLESET 101
#define IDD_PV_LPRINT 102
#define IDD_PV_ZOOMIN 103
#define IDD_PV_ZOOMOUT 104
#define IDD_PV_NEXTPAGE 105 // _disp.cで即値参照
#define IDD_PV_PREVPAGE 106 // _disp.cで即値参照
#define IDD_PV_JUMPPAGE 107
static BOOL CheckRate(TX* text,int rate,BOOL fPrev)
{
//2.99D 970402 プレビューで倍率を上げると表示が乱れた
#if 1
if (0 < rate && rate < 50) {
statprintf(NULL);
return TRUE;
}
statprintf(fPrev ? "これ以上倍率を下げられません" : "これ以上倍率を上げられません");
return FALSE;
#else
LPRINT* lp = text->lp;
int x = ((long)lp->lpcxClient*150*rate)/15000;
int y = ((long)lp->lpcyClient*150*rate)/15000;
statprintf("%d %d %d",rate,x,y);wait(100);
if (x < 1637 && y < 1637) return TRUE;//これはだめだった
return FALSE;
#endif
}
BOOL dlgprocPreviewCmd(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
TX* text = (TX*)dialogGetCustdata(hd);
LPRINT* lp = text->lp;
long dpage = 1 + lp->f2pages;
switch(message) {
case WM_INITDIALOG: {
SetWindowPos(hwnd,NULL,-30000,-30000,0,0,SWP_NOSIZE);// ちらつき抑止
PostMessage(text->hwndbase,WM_TXFLUSHWINDOWSIZE,0,0);
FlushSheetlist(hwnd,IDD_PV_STYLELIST);
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case IDD_PV_STYLELIST: {
if (notify == CBN_SELCHANGE) {
mchar szstyle[CCHLPSTYLE];
GetDlgItemText(hwnd,id,szstyle,CCHLPSTYLE);
if (stricmp(text->szlpstyle,szstyle)) {
strcpy(text->szlpstyle,szstyle);toTszlpstyle(text);
txConfigOp(text,TXCONFIGOP_PRINTREAD,(LPVOID)szstyle);
txLpOp(text,TXLPOP_FLUSHSTYLE);
//information("%d %d",lp->lpcxClient,lp->lpcyClient);
#if 1//2.99E 970403 プレビューで印刷スタイルを選んでも桁揃えと表の幅が更新されてなかった
txSetUndisp(text);
txFlush(text);
txFlushTableAll(text);
txSetDisp(text);
#else
txFlush(text);
#endif
SetFocus(GetDlgItem(hwnd,id));
}
}
return TRUE;
}
case IDD_PV_STYLESET: {
txuiConfigPrint(text);
#if 0//2.99D 970402 2回表示されて煩わしかった
#if 1 //2.99D 970331 // プレビュー中、設定ボタンで設定を変更してもプレビューに反映されなかった
txLpOp(text,TXLPOP_FLUSHSTYLE);
txFlush(text);
#endif
#endif
//
SetFocus(GetDlgItem(hwnd,id));
FlushSheetlist(hwnd,IDD_PV_STYLELIST);//2.98 970308
return TRUE;
}
case IDD_PV_LPRINT: {
// 閉じられることがあるので、Postする必要がある
PostMessage(text->hwndbase,WM_COMMAND,IDM_TXLPRINT,0);
return TRUE;
}
case IDD_PV_JUMPPAGE: {
call("search.uiJumpPage");
SetFocus(GetDlgItem(hwnd,id));
return TRUE;
}
case IDCANCEL: {
// 閉じられるので、Postする必要がある
#if 1//2.99F 970403 プレビュー中に他のWZにウィンドウを切り替えて戻して、プレビューを閉じようとしても閉じることができなかった
PostMessage(text->hwndbase,WM_TXCOMMAND,IDM_TXPREVIEWEXIT,0);
#else
PostMessage(text->hwndbase,WM_COMMAND,IDM_TXPREVIEWEXIT,0);
#endif
return TRUE;
}
case IDD_PV_NEXTPAGE: {
long npageNow = txNpageFromNpageclm(text,text->npage);
long npageNew = npageNow + dpage;
if (lp->npageall && npageNew > lp->npageall) {
if (lp->f2pages) {
// 移動する必要なし
npageNew = npageNow;
} else {
npageNew = lp->npageall;
}
}
if (npageNew != npageNow) {
text->fUndisp++;
txJumpPage(text,npageNew);
txSetLy(text,0);
text->fUndisp--;
// 総ページ数も一緒に調べる
// 最初に総ページ数を調べると時間がかかるので
txDispTextAll(text);
txDispLocate(text);
}
return TRUE;
}
case IDD_PV_PREVPAGE: {
long npageNow = txNpageFromNpageclm(text,text->npage);
long npageNew = npageNow - dpage;
if (npageNew < 1) npageNew = 1;
if (npageNew != npageNow) {
text->fUndisp++;
txJumpPage(text,npageNew);
txSetLy(text,0);
text->fUndisp--;
txDispTextAll(text);
txDispLocate(text);
}
return TRUE;
}
case IDD_PV_ZOOMIN: {
int rate = (int)lp->pvRate + 2;
if (CheckRate(text,rate,FALSE)) {
lp->pvRate = rate;
txOp(text,TXOP_INITSCROLLBAR,0,0);//2.98 970308
txDispTextAll(text);
}
return TRUE;
}
case IDD_PV_ZOOMOUT: {
int rate = (int)lp->pvRate - 2;
if (CheckRate(text,rate,TRUE)) {
lp->pvRate = rate;
txOp(text,TXOP_INITSCROLLBAR,0,0);//2.98 970308
txDispTextAll(text);
}
return TRUE;
}
}
break;
}
}
return FALSE;
}
pvOp(TX* text,int op)
{
LPRINT* lp = text->lp;
if (lp->hwndPreviewCmd) {
SetFocus(text->hwndtext);
dialogFree(lp->hwndPreviewCmd);
lp->hwndPreviewCmd = NULL;
}
if (op == 0) return TRUE;
HDIALOG hd = _dialog("PreView",EXDS_POSDEFAULT|(_fwin40 ? 0 : EXDS_BIGFORCE),NULL);//2.97 970215
DWORD style = dialogGetStyle(hd);
dialogSetStyle(hd,WS_VISIBLE|WS_CHILD|(style & DS_SETFONT));
dialogSetParent(hd,text->hwndbase);
dialogSetHookEx(hd,"\m.dlgprocPreviewCmd");
dialogSetCustdata(hd,(LPARAM)text);
dialogSetNoButton(hd);
dialogSetPosY(hd,2);
//
dialogSetH(hd);
dialogControlID(hd,IDD_PV_LPRINT);
dialogButtonCmd(hd,"印刷 &P..",NULL,9);
//
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 30;
r.cy = DTCY * 10;
dialogControlHelp(hd,334);
__dialogAddItem(hd,"COMBOBOX",NULL,IDD_PV_STYLELIST,&r,CBS_SORT|CBS_AUTOHSCROLL|CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP);
_dialogAddControlInfo(hd,IDD_PV_STYLELIST);
dialogSetPosX(hd,r.x + r.cx + DTCX);
//
dialogControlID(hd,IDD_PV_STYLESET);
dialogButtonCmd(hd,"設定 &S..",NULL,9);
//
dialogControlID(hd,IDD_PV_NEXTPAGE);
dialogButtonCmd(hd,"↓ &N",NULL,5);//2.98 970308
// dialogButtonCmd(hd,"次頁 &N",NULL,7);
dialogControlID(hd,IDD_PV_PREVPAGE);
dialogButtonCmd(hd,"↑ &V",NULL,5);//2.98 970308
// dialogButtonCmd(hd,"前頁 &V",NULL,7);
dialogControlID(hd,IDD_PV_JUMPPAGE);
dialogButtonCmd(hd,"頁 &J..",NULL,7);//2.98 970308
// dialogButtonCmd(hd,"指定頁 &J..",NULL,11);
dialogControlID(hd,IDD_PV_ZOOMIN);
dialogButtonCmd(hd,"&+",NULL,4);
dialogControlID(hd,IDD_PV_ZOOMOUT);
dialogButtonCmd(hd,"&-",NULL,4);
dialogControlID(hd,IDCANCEL);
dialogButtonCmd(hd,"&X",NULL,4);//2.98 970308
// dialogButtonCmd(hd,"閉じる &C",NULL,9);
dialogIndent(hd,1);
DTRECT size;
size.cx = dialogGetPosX(hd);
dialogLF(hd);
size.cy = dialogGetPosY(hd) + 1;
dialogSetSize(hd,&size);
lp->hwndPreviewCmd = dialogCreate(hd);
return TRUE;
}
//## プロパティーシート
//2.95 970125
//## 脚注
#define IDD_FOOTNOTE 1000
#define IDD_RETURN 1001
typedef struct {
TX* text;
PLUGFOOTNOTE* plug;
} FOOTNOTECONTEXT;
BOOL dlgprocFootnote(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
HDIALOG hd = dialogFromHwnd(hwnd);
HWND hctrl = GetDlgItem(hwnd,IDD_FOOTNOTE);
TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
if (text) {
FOOTNOTECONTEXT* context = (LPVOID)dialogGetCustdata(hd);
if (context->plug) {
txInsert(text,context->plug->szFootnote);
}
txJumpFileTop(text);
text->fSetWidthByWindow = TRUE;
text->dlgcode = DLGC_WANTARROWS|DLGC_WANTCHARS;//|DLGC_WANTMESSAGE;
txUndoClear(text);//2.99 970316
txFlush(text);
}
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
HWND hctrl = GetDlgItem(hwnd,IDD_FOOTNOTE);
TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
if (id == IDOK) {
HDIALOG hd = dialogFromHwnd(hwnd);
FOOTNOTECONTEXT* context = (LPVOID)dialogGetCustdata(hd);
if (text) {
txSetUndisp(text);
txSelectAll(text);
txPrivatePush(text);
int lch = memClipPaste(NULL,HCLIP_PRIVATE);
if (context->text->editmode == 0) {
//2.99C 970324
TX* text = context->text;
txstr sz(lch+1);
memClipPaste((mchar*)sz,HCLIP_PRIVATE);
sz[lch] = 0;
txCharatrSet(text,TAG_PROOF,(mchar*)sz);
} else {
PLUGFOOTNOTE* plug = plugatrNewEx(context->text,PLUG_FOOTNOTE,lch + 1);
if (plug) {
TX* text = context->text;
txSetUndisp(text);
plug->cchFootnoteAlloc = lch + 1;
plug->lchFootnote = lch;
memClipPaste(plug->szFootnote,HCLIP_PRIVATE);
plug->szFootnote[lch] = 0;
plug->number = context->plug ? context->plug->number : 1;
txReplacePlug(text,plug,context->plug);
txSetDisp(text);
} else {
////err
}
}
txPrivateDeleteTop(text);
}
} else if (id == IDD_RETURN) {
txInsertReturn(text);
return TRUE;
}
break;
}
}
return FALSE;
}
static BOOL dialogaFootnote(TX* text,PLUGFOOTNOTE* plug)
{
// plug=NULL:新規作成
if (text->editmode == 0 && !plug) {
//2.99C 970324 「脚注の挿入」テキストモード対応
} else {
if (!IsEditmode(text)) return FALSE;//2.98 970308
}
HDIALOG hd;
if (plug) {
hd = dialog("脚注のプロパティ");
} else {
hd = dialog("脚注の挿入");
}
dialogSetHookEx(hd,"\m.dlgprocFootnote");
DTRECT r;
r.x = DTCX;
r.y = DTCY;
r.cx = DTCX * 70;
r.cy = DTCY * 10;
__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);
FOOTNOTECONTEXT context;
context.text = text;
context.plug = plug;
dialogSetCustdata(hd,(DWORD)&context);
dialogLFV(hd);
int cx = 14;
dialogOK(hd,cx);
dialogCancel(hd,cx);
dialogControlID(hd,IDD_RETURN);
dialogButtonCmd(hd,"改行(&R)",NULL,cx);
return dialogOpen(hd);
}
BOOL TXAPI TXCMDBASE txuiInsertFootnote(TX* text)
{
return dialogaFootnote(text,NULL);
}
//## 特殊文字
#define IDD_FONTPREVIEW 100
#define IDD_FONTSTR 101
#define IDD_COPYRIGHT 102
#define IDD_REGISTERED 103
#define IDD_TRADEMARK 104
#define IDD_CODE 105
#define IDD_CODETABLE 106
typedef struct {
TX* text;
PLUGFONT* plug;
//
mchar lfFaceName[LF_FACESIZE];
BYTE lfHeight;
mchar* szStr;
} FONTCONTEXT;
static int _iddFontsel;
static void SetFont(HWND hwnd,int id)
{
HWND hctrl = GetDlgItem(hwnd,id);
if (hctrl) {
HFONT hfont = (HFONT)SendMessage(hctrl,WM_GETFONT,0,0);
LOGFONT lf;
if (hfont == NULL) {
hfont = GetStockObject(GetSystemFontNo());
}
//information("%d",hfont);
if (GetObject(hfont,sizeof(lf),&lf)) {
strcpy(lf.lfFaceName,"Symbol");
lf.lfWeight = FW_NORMAL;
lf.lfPitchAndFamily = DEFAULT_PITCH;
lf.lfCharSet = DEFAULT_CHARSET;
if (hfont = CreateFontIndirect(&lf)) {
SendMessage(hctrl,WM_SETFONT,(WPARAM)hfont,0);
}
}
}
}
static void ResetFont(HWND hwnd,int id)
{
HWND hctrl = GetDlgItem(hwnd,id);
if (hctrl) {
HFONT hfont = (HFONT)SendMessage(hctrl,WM_GETFONT,0,0);
if (hfont) {
DeleteObject(hfont);
}
}
}
BOOL dlgprocFont(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
HDIALOG hd = dialogFromHwnd(hwnd);
HWND hctrl = GetDlgItem(hwnd,IDD_FONTPREVIEW);
TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
if (text) {
text->fDispLine = FALSE;
text->fSetWidthByWindow = TRUE;
text->lfProp = TRUE;
text->lfWestern = TRUE;
txFlush(text);
}
SetFont(hwnd,IDD_FONTSTR);
//2.99D 970329 特殊文字のアラインを合わせるのは見送ったので、フォントサイズを選択不可にした
EnableDlgItem(hwnd,_iddFontsel+1,FALSE);
break;
}
case WM_DESTROY: {
ResetFont(hwnd,IDD_FONTSTR);
break;
}
case WM_COMMAND: {
HDIALOG hd = dialogFromHwnd(hwnd);
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
FONTCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
if (
(id == _iddFontsel || id == _iddFontsel + 1) &&
notify == CBN_SELCHANGE
) {
PostMessage(hwnd,WM_TXUSER,0,0);
} else {
switch(id) {
case IDD_FONTSTR: {
if (notify == EN_UPDATE) PostMessage(hwnd,WM_TXUSER,0,0);
break;
}
case IDD_COPYRIGHT:
case IDD_REGISTERED:
case IDD_TRADEMARK: {
HWND hctrl = GetDlgItem(hwnd,_iddFontsel);
int i = ComboBox_FindStringExact(hctrl,0,"Symbol");
ComboBox_SetCurSel(hctrl,i);
mchar szbuff[2] = {0,0};
switch(id) {
case IDD_COPYRIGHT: szbuff[0] = 227;break;
case IDD_REGISTERED: szbuff[0] = 226;break;
case IDD_TRADEMARK: szbuff[0] = 228;break;
}
SetDlgItemText(hwnd,IDD_FONTSTR,szbuff);
break;
}
case IDD_CODE: {
HDIALOG hd = dialog("文字コード");
static int code = 192;
dialogInt(hd,"コード(&O):",&code,10,5);
if (dialogOpen(hd)) {
mchar szbuff[CCHWORD+1];
GetDlgItemText(hwnd,IDD_FONTSTR,szbuff,CCHWORD);
int lch = strlen(szbuff);
szbuff[lch++] = code;
szbuff[lch] = 0;
SetDlgItemText(hwnd,IDD_FONTSTR,szbuff);
}
break;
}
case IDD_CODETABLE: {
if (WinExec("charmap.exe",SW_SHOW) < 32) {
information("charmap.exeが起動できないので、文字コード表は使えません");
}
break;
}
}
}
break;
}
case WM_TXUSER: {
HDIALOG hd = dialogFromHwnd(hwnd);
HWND hctrl = GetDlgItem(hwnd,IDD_FONTPREVIEW);
TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
FONTCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
if (text) {
dialogRead(hd);
//
txSetUndisp(text);
txDeleteText(text);
txInsert(text,context->szStr);
//statprintf("%d",strlen(context->szStr));
//
FONTSTYLE* fs = &text->tFontstyle[FONTTX_TEXT];
strcpy(fs->tlfFaceName[IFONT_STD],context->lfFaceName);
fs->tlfHeight[IFONT_STD] = context->lfHeight;
strcpy(fs->tlfFaceName[IFONT_ANK],context->lfFaceName);
fs->tlfHeight[IFONT_ANK] = context->lfHeight;
//
txFlush(text);
txSetDisp(text);
}
break;
}
}
return FALSE;
}
permanent txstr p_lfFaceNamePlugFont = "Wingdings";//3.00A3 970508
static BOOL dialogaFont(TX* text,PLUGFONT* plug)
{
// plug=NULL:新規作成
if (text->editmode == 0 && !plug) {
//2.99C 970324 「特殊文字の挿入」テキストモード対応
} else {
if (!IsEditmode(text)) return FALSE;//2.98 970308
}
HDIALOG hd;
int lxg = 16;
if (plug) {
hd = dialog("特殊文字のプロパティ");
} else {
hd = dialog("特殊文字の挿入");
}
dialogSetHookEx(hd,"\m.dlgprocFont");
FONTCONTEXT context;
structClear(context);
context.text = text;
context.plug = plug;
dialogSetCustdata(hd,(DWORD)&context);
//
txstr szStr(CCHWORD);
context.szStr = szStr;
if (plug) {
szStr = plug->szStr;
strcpy(context.lfFaceName,plug->lfFaceName);
context.lfHeight = plug->lfHeight;
} else {
// set default
#if 1//3.00A3 970508 「挿入|特殊文字」最後に指定したフォント名を覚える様にした
strcpy(context.lfFaceName,p_lfFaceNamePlugFont);
context.lfHeight = 0;//2.99D 970329 12->0
#else
strcpy(context.lfFaceName,"Wingdings");
context.lfHeight = 0;//2.99D 970329 12->0
#endif
}
//
dialogControlID(hd,IDD_FONTSTR);
dialogStr(hd,"文字列(&S):",szStr,lxg,30);
//
dialogSetH(hd);
SELFONTARG arg;
structClear(arg);
arg.lfPitch = DEFAULT_PITCH;
arg.lfCharSet = DEFAULT_CHARSET;
arg.fEnableDefaultHeight = TRUE;//2.99D 970329
_iddFontsel = dialogSelectFont(hd,"フォント(&F):",lxg,context.lfFaceName,&context.lfHeight,&arg);
dialogLF(hd);
dialogSetPosLX(hd,lxg+1);
dialogControlID(hd,IDD_COPYRIGHT);
dialogButton(hd,"著作権(&C)",NULL,12);
dialogControlID(hd,IDD_REGISTERED);
dialogButton(hd,"登録商標(&R)",NULL,12);
dialogControlID(hd,IDD_TRADEMARK);
dialogButton(hd,"商標(&T)",NULL,11);
dialogLF(hd);
dialogSetPosLX(hd,lxg+1);
dialogControlID(hd,IDD_CODE);
dialogButton(hd,"コード入力(&O)...",NULL,18);
dialogControlID(hd,IDD_CODETABLE);
dialogButton(hd,"文字コード表(&M)...",NULL,18);
dialogLF(hd);
dialogSetV(hd);
//
dialogCaption(hd,"プレビュー:");
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 70;
r.cy = DTCY * 10;
__dialogAddItem(hd,TXWS_SZCLASS,"",IDD_FONTPREVIEW,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_VSCROLL|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP);
//
if (dialogOpen(hd)) {
p_lfFaceNamePlugFont = context.lfFaceName;//3.00A3 970508
if (text->editmode == 0) {
//2.99C 970324
PLUGFONT plug;
structClear(plug);
strcpy(plug.lfFaceName,context.lfFaceName);
plug.lfHeight = context.lfHeight;
sstrcpy(plug.szStr,szStr);
txCharatrSet(text,TAG_FONT,&plug);
} else {
PLUGFONT* plug = plugatrNew(text,PLUG_FONT);
if (plug) {
strcpy(plug->lfFaceName,context.lfFaceName);
plug->lfHeight = context.lfHeight;
sstrcpy(plug->szStr,szStr);
txReplacePlug(text,plug,context.plug);
txDispAll(text);
return TRUE;
}
return FALSE;
}
}
return FALSE;
}
BOOL TXAPI TXCMDBASE txuiInsertFont(TX* text)
{
return dialogaFont(text,NULL);
}
//## 図,リンク
typedef struct {
TX* text;
BOOL fNew;
int modePlug;
mchar szfilename[CCHPATHNAME];//2.99B 970321
mchar* szmask;//3.00A3 970508
} LINKCONTEXT;
static void dialogAddPathMode(HDIALOG hd,int* modeFilename,TX* text)
{
#if 1//2.99B 970321
dialogControlID(hd,IDD_RELATIVE);
if (text->fHTML) {
dialogRadioID(hd,modeFilename,"相対","ドライブ名なし","絶対","ベースディレクトリからの相対");
} else {
dialogRadioID(hd,modeFilename,"相対","ドライブ名なし","絶対");
}
#else
#if 1//1.99B URLは未完成
dialogControlID(hd,IDD_RELATIVE);
dialogRadioID(hd,modeFilename,"相対","ドライブ名なし","絶対");
#else
dialogControlID(hd,IDD_RELATIVE);
dialogRadioID(hd,modeFilename,"相対","ドライブ名なし","絶対","URL");
#endif
#endif
}
static void CheckDlgButtons(HWND hwnd,int idTop,int idEnd,int idCheck)
{
int id;
for (id = idTop;id <= idEnd;id++) {
CheckDlgButton(hwnd,id,(id == idCheck));
}
}
static BOOL referFilename(HWND hwnd,int id,mchar* szpath,mchar* szCaption,txstr _szfilename)
{
mchar szfilename[CCHPATHNAME];
strcpy(szfilename,szpath);
if (txofnReferFileName(text,szfilename,szCaption)) {
SendDlgItemMessage(hwnd,id,WM_SETTEXT,0,(LPARAM)szfilename);
#if 1//2.99B 970321
_szfilename = szfilename;
return TRUE;
#else
//1.99E 相対指定をデフォルトとする
SendMessage(hwnd,WM_COMMAND,IDD_RELATIVE,0);
#endif
}
return FALSE;
}
static void flushFilename(HWND hwnd,LINKCONTEXT* context,TX* text)
{
//2.99B 970321 new
int id = dialogGetCheckedRadio(hwnd,IDD_RELATIVE,IDD_RELATIVEBASED);
mchar buff[CCHPATHNAME];
sstrcpy(buff,context->szfilename);
if (id == IDD_RELATIVEBASED) {
//2.99B 970321
txstr szBase = text->share->config.szPathHtmlBase;
pathSetDir(szBase);
pathSetMode(buff,szBase,NULL,PATH_RELATIVE);
#if 1 //2.99D 970401 「ベースディレクトリからの相対」頭に必ず / を付けるようにした
// 付けないと意味ない
{
txstr foo = "/";
foo += buff;
sstrcpy(buff,foo);
}
#endif
} else {
int mode = id - IDD_RELATIVE;
pathSetMode(buff,text->szfilename,NULL,mode);
}
if (text->fHTML) {
// HTMLでは図やリンクのパスセパレータを'/'にした
pathFlushSepa(buff,'/');
//2.99C 970323
switch(text->share->config.modeHtmlFilenameCase) {
case FNC_TOLOWER: strlwr(buff);break;
case FNC_TOUPPER: strupr(buff);break;
}
}
SetDlgItemText(hwnd,IDD_FILENAME,buff);
}
static void EnableFilenameMode(HWND hwnd,BOOL fEnable)
{
int id;
for (id = IDD_RELATIVE;id <= IDD_RELATIVEBASED;id++) {
EnableDlgItem(hwnd,id,fEnable);
}
}
#define PLUG_SEMILINK 250 //2.99C 970324
#define PLUG_REFERHTMLFILENAME 251 //3.00A3 970508
//2.99B 970321 抜本改良
BOOL dlgprocBitmap(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
LINKCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
TX* text = context->text;
switch(message) {
case WM_INITDIALOG: {
EnableFilenameMode(hwnd,FALSE);
if (context->fNew) {
PostMessage(hwnd,WM_TXUSER,0,0);
}
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case IDD_RELATIVE:
case IDD_ABSOLUTE:
case IDD_ABSOLUTEDRIVE:
case IDD_RELATIVEBASED: {
PostMessage(hwnd,WM_TXUSER,0,0);
break;
}
case IDD_REFERFILENAME: {
txstr szfilename = context->szfilename;
BOOL f = FALSE;
if (
context->modePlug == PLUG_LINK ||
context->modePlug == PLUG_SEMILINK //3.00A 970502 簡易リンクの参照マスクを"*.*"にした
) {
// .htm .txt 以外にも、
// .exe,.lzh,.gif,.jpg等へのリンクも多用するからマスクを*.*とする
f = referFilename(hwnd,IDD_FILENAME,"*.*","リンク先のファイル名",szfilename);
} else if (context->modePlug == PLUG_REFERHTMLFILENAME) {//3.00A3 970508
f = referFilename(hwnd,IDD_FILENAME,context->szmask,"ファイルの参照",szfilename);
} else {
f = referFilename(hwnd,IDD_FILENAME,"*.bmp;*.gif","図のファイル名",szfilename);
}
if (f) {
sstrcpy(context->szfilename,szfilename);
flushFilename(hwnd,context,text);
EnableFilenameMode(hwnd,TRUE);
}
break;
}
}
break;
}
case WM_TXUSER: {
flushFilename(hwnd,context,text);
break;
}
}
return FALSE;
}
BOOL TXAPI txReferFilenameHtml(TX* text,mchar szfilename[CCHPATHNAME],mchar* szmask)
{
//3.00A3 970508 new
LINKCONTEXT context;
structClear(context);
context.text = text;
context.modePlug = PLUG_REFERHTMLFILENAME;
//
if (szmask && *szmask) {
context.szmask = szmask;
} else {
context.szmask = "*.*";
}
//
int modeFilename = pathGetMode(szfilename);
sstrcpy(context.szfilename,szfilename);
HDIALOG hd = dialog("ファイル名の参照");
dialogSetCustdata(hd,(DWORD)&context);
dialogSetHookEx(hd,"\m.dlgprocBitmap");
//
dialogControlID(hd,IDD_FILENAME);
dialogStrC(hd,"ファイル名(&N):",szfilename,20,CCHPATHNAME,33);
//
dialogControlID(hd,IDD_REFERFILENAME);
dialogButton(hd,"参照(&F)...",NULL,10);
//
dialogAddPathMode(hd,&modeFilename,text);
if (dialogOpen(hd)) {
return TRUE;
}
return FALSE;
}
BOOL txGetWordCaption(TX* text,txstr szCaption)
{
//2.99 970313 new
if (txIsClipInPara(text)) {
txGetWord(text,szCaption);
if (strchr(szCaption,CHAR_PLUG)) {
information("キャプションには文字だけが指定できます。");
szCaption = "";
return FALSE;
}
return TRUE;
}
return FALSE;
}
static BOOL _dialogaLink(TX* text,LPVOID* plug,int modePlug)
{
BOOL ret = FALSE;
HSTRBLK sbTarget = NULL;
if (text->editmode == 0 && !plug) {
//2.99C 970324 「図の挿入」、「リンク」テキストモード対応
} else {
if (!IsEditmode(text)) return FALSE;//2.98 970308
}
PLUGIMG* plugimg = plug;
PLUGLINK* pluglink = plug;
BOOL fClip = FALSE;
LINKCONTEXT context;
structClear(context);
context.text = text;
context.fNew = (plug == NULL);
context.modePlug = modePlug;
HDIALOG hd;
if (modePlug == PLUG_IMG) {
hd = dialog(plug ? "図のプロパティ" : "図の挿入");
} else if (modePlug == PLUG_SEMILINK) {
hd = dialog("簡易リンクの挿入");
} else {
hd = dialog(plug ? "ハイパーリンクのプロパティ" : "ハイパーリンクの挿入");
}
dialogSetCustdata(hd,(DWORD)&context);
dialogSetHookEx(hd,"\m.dlgprocBitmap");
//
txstr szCaption;
txstr szTarget;//2.99C 970325
if (modePlug == PLUG_LINK) {
#if 1//2.99 970313
if (plug) {
szCaption = pluglink->szCaption;
} else if (txGetWordCaption(text,szCaption)) {
fClip = TRUE;
}
#else
if (plug) {
szCaption = pluglink->szCaption;
} else if (txIsClipInPara(text)) {
fClip = TRUE;
txGetWord(text,szCaption);
if (strchr(szCaption,CHAR_PLUG)) {
information("リンクのキャプションには文字だけが指定できます。");
dialogTerm(hd);//2.99 970313
return FALSE;
}
}
#endif
dialogStr(hd,"キャプション(&C):",szCaption,20,33);
if (text->fHTML) {
//2.99C 970325
sbTarget = sbNewAlloc(100);
sbAdd(sbTarget,"_self");
sbAdd(sbTarget,"_blank");
sbAdd(sbTarget,"_parent");
sbAdd(sbTarget,"_top");
sbAdd(sbTarget,"title");
sbAdd(sbTarget,"main");
sbAdd(sbTarget,"contents");
dialogControlHist(hd,sbTarget);
dialogStr(hd,"TARGET(&T):",szTarget,20,33);
}
}
mchar szfilename[CCHPATHNAME] = {0};
if (plug) {
if (modePlug == PLUG_IMG) sstrcpy(szfilename,plugimg->szfilename);
if (modePlug == PLUG_LINK) sstrcpy(szfilename,pluglink->szfilename);
}
dialogControlID(hd,IDD_FILENAME);
dialogStrC(
hd,
((modePlug == PLUG_IMG) ? "図のファイル名(&N):" : "リンク先のファイル名(&N):"),
szfilename,20,CCHPATHNAME,33
);
//
dialogControlID(hd,IDD_REFERFILENAME);
dialogButton(hd,"参照(&F)...",NULL,10);
//
sstrcpy(context.szfilename,szfilename);//2.99B 970321
int modeFilename = pathGetMode(szfilename);
dialogAddPathMode(hd,&modeFilename,text);
//
int width = 0;
int modeWidth = 0;
if (!text->fHTML && modePlug == PLUG_IMG) {
if (plugimg) {
width = plugimg->atr.width;
if (width != 0) {
modeWidth = 2;
if (width < 0) {
modeWidth = 1;
width = -width;
}
}
if (plugimg->atr.fWidthOriginal) modeWidth = 3;
}
dialogHeadline(hd,"図の表示幅",55);//2.99C 970326 40->55
if (text->editmode == 0) dialogSetEnable(hd,FALSE);//2.99C 970324
dialogSelectID(hd,"幅の指定方法(&A):",&modeWidth,16,30,"標準","折り返し幅に対する%指定","ドット数で指定","指定しない");
dialogInt(hd,"幅(&W):",&width,16,4);
if (text->editmode == 0) dialogSetEnable(hd,TRUE);//2.99C 970324
}
if (dialogOpen(hd)) {
txSetUndisp(text);
if (modePlug == PLUG_SEMILINK) {//2.99C 970324
txInsertChar(text,'"');
txInsert(text,szfilename);
txInsertChar(text,'"');
#if 1//2.99D 970331 HTMLではリンクをPLUGLINKで挿入するのはやめた
} else if (
text->fHTML && modePlug == PLUG_LINK
)
#else
} else if (
text->fHTML && (
(szTarget[0] && modePlug == PLUG_LINK) ||
text->editmode == 0
)
)
#endif
{
//2.99C 970325 ハイパーリンクのプロパティでTARGETアトリビュートを指定できるようにした
if (text->editmode) txSetUndisp(text);//2.99G 970405
if (text->fClip) {
//2.99F 970404 HTMLのリンク挿入でキャプションを選択してから実行しても、選択したキャプションがテキストから削除されなかった
txSelectDelete(text);
} else if (plug) {
txDeleteChar(text);
}
//
txstr szTag = "<A";
if (szfilename[0]) {
szTag += " HREF=\"";
szTag += szfilename;
szTag += "\"";
}
if (szTarget[0]) {
szTag += " TARGET=\"";
szTag += szTarget;
szTag += "\"";
}
szTag += ">";
txInsertHtmlSzTag(text,szTag,TAG_LINK);
if (text->editmode) {//2.99G 970405
IFILE adrTop = txGetAddress(text);
text->charatr.fHottext = TRUE;
txInsert(text,szCaption);
IFILE adrTail = txGetAddress(text);
for (IFILE adr = adrTop;adr < adrTail;adr++) {
CHARATR charatr;
charatrRead(text,adr,&charatr);
charatr.fHottext = TRUE;
charatr.fUnderline = TRUE;
charatrWrite(text,adr,&charatr);
}
} else {
txInsert(text,szCaption);
}
//
txInsertHtmlSzTag(text,"</A>",TAG_LINK);
if (text->editmode) txSetDisp(text);//2.99G 970405 for fHottext change to Display
} else if (text->editmode == 0) {//2.99C 970324
if (modePlug == PLUG_IMG) {
txCharatrSet(text,TAG_IMG,szfilename);
}
if (modePlug == PLUG_LINK) {//2.99C 970324
PLUGLINK plug;
structClear(plug);
sstrcpy(plug.szfilename,szfilename);
sstrcpy(plug.szCaption,szCaption);
txSelectDelete(text);
txCharatrSet(text,TAG_LINK,&plug);
}
} else {
if (plug) {
if (modePlug == PLUG_IMG) {
sstrcpy(plugimg->szfilename,szfilename);
}
if (modePlug == PLUG_LINK) {
sstrcpy(pluglink->szfilename,szfilename);
sstrcpy(pluglink->szCaption,szCaption);
}
} else {
if (modePlug == PLUG_IMG) txCharatrSet(text,TAG_IMG,szfilename);
if (modePlug == PLUG_LINK) {
PLUGLINK* plug = plugatrNew(text,PLUG_LINK);
if (plug) {
sstrcpy(plug->szfilename,szfilename);
sstrcpy(plug->szCaption,szCaption);
#if 1//2.99 970313
txSelectDelete(text);
#else
if (fClip) txSelectDelete(text);
#endif
txInsertPlug(text,plug);
txLeft(text);
}
}
}
if (!text->fHTML && modePlug == PLUG_IMG) {
PLUGIMG* plug = txGetCurPlug(text);
PLUGIMGATR* atr = &plug->atr;
atr->fWidthOriginal = FALSE;
atr->width = 0;
switch(modeWidth) {
case 3:atr->fWidthOriginal = TRUE;break;
case 2:atr->width = width;break;
case 1:atr->width = -width;break;
}
}
}
tyFlush(text);//2.99I 970406
txSetDisp(text);
ret = TRUE;
}
if (sbTarget) sbDelete(sbTarget);
return ret;
}
static BOOL dialogaBitmap(TX* text,PLUGIMG* plug)
{
return _dialogaLink(text,plug,PLUG_IMG);
}
BOOL TXAPI TXCMDBASE txuiInsertBitmap(TX* text)
{
return dialogaBitmap(text,NULL);
}
static BOOL dialogaLink(TX* text,PLUGLINK* plug)
{
return _dialogaLink(text,plug,PLUG_LINK);
}
BOOL TXAPI TXCMDBASE txuiLink(TX* text)
{
// リンクの挿入、プロパティ
if (txGetCurPlugmode(text) == PLUG_LINK) {
return dialogaLink(text,txGetCurPlug(text));
} else {
return dialogaLink(text,NULL);
}
}
BOOL TXAPI TXCMDBASE txuiInsertSemiLink(TX* text)
{
// 簡易リンクの挿入
//2.99C 970324 new
return _dialogaLink(text,NULL,PLUG_SEMILINK);
}
//## table convert
//2.99C 970324 new
static BOOL txInsertPlugTable(TX* text)
{
if (text->editmode) {
mchar* szTag = "<TD>";
int lch = text->fHTML ? strlen(szTag) : 0;
PLUGTAB* plug = plugatrNewEx(text,PLUG_TAB,lch + 1);
if (plug) {
plug->cchTagAlloc = lch + 1;
if (text->fHTML) strcpylen(plug->szTag,szTag,lch);
plug->modeTab = MODETAB_TABLE;
plug->modeSepaLeft = MODESEPA_STD;
plug->modeSepaBottom = MODESEPA_STD;
txInsertPlug(text,plug);
return TRUE;
}
} else if (text->fHTML) {
txInsert(text,"<TD>");
return TRUE;
} else {
return txInsertChar(text,'|');
}
return FALSE;
}
static BOOL txIsCurParaTableMode(TX* text,int mode)
{
if (mode >= 2 && text->editmode) {
PLUGTAB* plug = txIsCurParaIncludeTable(text);
if (plug && plug->modeTab == MODETAB_TABLE) return TRUE;
} else {
mchar ch = (mode == 0) ? '\t' : ',';
if (mode >= 2) ch = '|';
txstr szline;
txGetPara(text,szline);
if (strchr(szline,ch)) return TRUE;
}
return FALSE;
}
BOOL TXCMDBASE txuiConvertTable(TX* text)
{
// 表の変換
//2.99C 970324 new
HDIALOG hd = dialog("表の変換");
int mode = 0;
PLUGTAB* plug = txIsCurParaIncludeTable(text);
if (plug && plug->modeTab == MODETAB_TABLE) {
mode = 2;
} else {
txstr szline;
txGetPara(text,szline);
if (strchr(szline,'\t')) {
mode = 0;
} else if (strchr(szline,',')) {
mode = 1;
} else if (strchr(szline,'|')) {
mode = 2;
}
}
dialogControlRadioV(hd);
dialogRadioID(hd,&mode,
"タブ区切りの表 → WZの表",
"カンマ区切りの表 → WZの表",
"WZの表 → タブ区切りの表",
"WZの表 → カンマ区切りの表"
);
if (dialogOpen(hd)) {
BOOL fHtmlInsert = (text->fHTML && mode < 2);
txSetUndisp(text);
NPARA nparaTop;
NPARA nparaEnd;
if (text->fClip) {
txJumpSelectTop(text);
nparaTop = text->npara;
txJumpSelectEnd(text);
nparaEnd = text->npara;
if (txIsCurParaTop(text)) nparaEnd--;
} else {
while(1) {
if (!txIsCurParaTableMode(text,mode)) {
nparaTop = text->npara + 1;
break;
}
if (!txPrevPara(text)) {
nparaTop = text->npara;
break;
}
}
txJumpNpara(text,nparaTop);
while(1) {
if (!txIsCurParaTableMode(text,mode)) {
nparaEnd = text->npara - 1;
break;
}
if (!txNextPara(text)) {
nparaTop = text->npara;
break;
}
}
}
if (nparaEnd < nparaTop) {
// err
} else {
for (NPARA npara = nparaTop;npara <= nparaEnd;npara++) {
IFILE adrLast = TXRECORD_ERROR;
int iTab = 0;
txJumpNpara(text,npara);
if (fHtmlInsert) {
txInsertHtmlSzTag(text,"<TR>",TAG_TR);
}
if (mode < 2) {
txInsertPlugTable(text);
}
while(1) {
TXCHAR ch = txGetChar(text);
if (txIsCurReturn(text)) break;
if (
(mode == 0 && ch == CHAR_TAB) ||
(mode == 1 && ch == ',')
) {
txDeleteChar(text);
txInsertPlugTable(text);
} else if (
mode >= 2 && (
(text->editmode == 0 && ch == '|') ||
(text->editmode && txGetCurPlugmode(text) == PLUG_TAB)
)
) {
txDeleteChar(text);
if (iTab) {
adrLast = txGetAddress(text);
txInsertChar(text,(mode == 2) ? '\t' : ',');
}
iTab++;
} else if (mode >= 2 && text->fHTML && text->editmode && txGetCurPlugmode(text) == PLUG_HTML_TAG) {
// <TR>などを削除
txDeleteChar(text);
} else {
if (!txRight(text)) break;
}
}
if (mode >= 2) {
if (adrLast != TXRECORD_ERROR) {
// 末尾のよけいな部分を削除
txJumpAddress(text,adrLast);
txDeleteChar(text);
}
} else {
if (text->fHTML && text->editmode == 0) {
// 不要
} else {
txInsertPlugTable(text);
}
}
}
txFlushTable(text);
txJumpNpara(text,nparaEnd);
txJumpParaEnd(text);
if (fHtmlInsert) {
txInsertHtmlSzTag(text,"</TABLE>",TAG_TABLE);
}
txSelectEx(text,CLIP_MOUSE);
txJumpNpara(text,nparaTop);
if (fHtmlInsert) {
txInsertHtmlSzTag(text,"<TABLE>",TAG_TABLE);
txJumpNpara(text,nparaTop);
}
}
txSetDisp(text);
}
return TRUE;
}
//## ruby
static BOOL dialogaRuby(TX* text,PLUGRUBY* plug0)
{
PLUGRUBY bodyRuby;//2.99C 970324
PLUGRUBY* plug;
if (text->editmode == 0) {
//2.99C 970324 「ルビ」テキストモード対応
plug = &bodyRuby;
structClear(*plug);
} else {
plug = plugatrNew(text,PLUG_RUBY);//2.99D 970328 ルビが変だった
}
if (!plug) return FALSE;
if (plug0) *plug = *plug0;
BOOL fClip = FALSE;
if (!plug0) {
if (txIsClipInPara(text)) {
fClip = TRUE;
txstr sz;
txGetWord(text,sz);
sstrcpy(plug->szTarget,sz);
}
}
HDIALOG hd = dialog(plug0 ? "ルビのプロパティ" : "ルビの挿入");
//
dialogStrC(hd,"ふりがな(&R):",plug->szRuby,16,cchof(plug->szRuby),20);
dialogStrC(hd,"漢字(&T):",plug->szTarget,16,cchof(plug->szTarget),20);
if (dialogOpen(hd)) {
txSetUndisp(text);
#if 1//2.99 970313
txSelectDelete(text);
#else
if (fClip) txSelectDelete(text);
#endif
if (text->editmode == 0) {
//2.99C 970324
txCharatrSet(text,TAG_RUBY,plug);
} else {
txReplacePlug(text,plug,plug0);
}
txSetDisp(text);
return TRUE;
} else {
if (text->editmode == 0) {
//2.99C 970324
} else {
plugatrDelete(text,plugatrGetTyp(text,plug));//2.99 970312 freeしてなかった
}
}
return FALSE;
}
BOOL TXAPI TXCMDBASE txuiRuby(TX* text)
{
// ルビの挿入、プロパティ
if (text->editmode && txGetCurPlugmode(text) == PLUG_RUBY) {
return dialogaRuby(text,txGetCurPlug(text));
} else {
return dialogaRuby(text,NULL);
}
}
//3.00B1 970609 txuiRubi:スペルミス txuiRubyを新設
BOOL TXAPI TXCMD txuiRubi(TX* text)
{
return txuiRuby(text);
}
//## 校正
//2.98 970305
permanent txstr szProofReader;
#define IDD_PROOF_TARGET 500
#define IDD_PROOF_PROOF 501
#define IDD_PROOF_EXCHANGE 502
static TX* txGetForProof(HWND hwnd,int idd)
{
//2.99 970312 new
HWND hctrl = GetDlgItem(hwnd,idd);
TX* text = (LPVOID)SendMessage(hctrl,TXWM_GETTX,0,0);
if (text) {
text->dlgcode = DLGC_WANTARROWS|DLGC_WANTCHARS;
text->fDispUnder = FALSE;
text->fDispLine = FALSE;
text->fSpaceLeft = FALSE;
text->nSpaceTopH = 0;
text->fSetWidthByWindow = TRUE;
text->fScrollBarV = TRUE;
text->fScrollBarH = FALSE;
txFlush(text);
text->lcySmupper = 0;
text->lcySmlower = 0;
return text;
}
return NULL;
}
typedef struct {
TX* text;
PLUGPROOF* plug0;
PLUGPROOF* plug1;
BOOL fClip;
mchar szReader[CCHSWORD];
} PROOFCONTEXT;
BOOL dlgprocProof(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
PROOFCONTEXT* context = dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
TX* text = txGetForProof(hwnd,IDD_PROOF_TARGET);
PLUGPROOF* plug0 = context->plug0;
if (text) {
if (plug0) {
txInsert(text,plug0->szTarget_szProof);
} else {
if (txIsClipInPara(context->text)) {
context->fClip = TRUE;
txstr sz;
txGetWord(context->text,sz);
txInsert(text,sz);
}
}
txUndoClear(text);//2.99 970316
}
//
TX* text = txGetForProof(hwnd,IDD_PROOF_PROOF);
if (text && plug0) {
txInsert(text,plug0->szTarget_szProof + plug0->ichProof);
txUndoClear(text);//2.99 970316
}
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
if (id == IDD_PROOF_EXCHANGE) {
//2.99 970317
TX* text1 = txGetForProof(hwnd,IDD_PROOF_TARGET);
TX* text2 = txGetForProof(hwnd,IDD_PROOF_PROOF);
if (text1 && text2) {
TX* text0 = txAllocText(0);
if (text0) {
if (txOpenText(text0)) {
txInsertText(text0,text1);
txDeleteText(text1);
txInsertText(text1,text2);
txDeleteText(text2);
txInsertText(text2,text0);
}
txFreeText(text0);
}
}
} else if (id == IDOK) {
#if 1//2.99 970313
txSelectDelete(context->text);
#else
if (context->fClip) txSelectDelete(context->text);
#endif
TX* text1 = txGetForProof(hwnd,IDD_PROOF_TARGET);
TX* text2 = txGetForProof(hwnd,IDD_PROOF_PROOF);
if (text1 && text2) {
int lch1 = txGetTextSize(text1);
int lch2 = txGetTextSize(text2);
int cch = (lch1 + 1) + (lch2 + 1);
if (context->text->editmode == 0) {
//2.99C 970324 「校正」テキストモード対応
TX* text = context->text;
txInsert(text,text->tszformat[SZFORMAT_PROOF_TOP]);
txInsertText(text,text1);
txInsert(text,text->tszformat[SZFORMAT_SEPARATOR]);
txInsertText(text,text2);
txInsert(text,text->tszformat[SZFORMAT_SEPARATOR]);
} else {
PLUGPROOF* plug = plugatrNewEx(context->text,PLUG_PROOF,cch);
if (plug) {
plug->cchProofAlloc = cch;
//information("%d %d",lch1,lch2);
//
txSelectAll(text1);
txPrivatePush(text1);
memClipPaste(plug->szTarget_szProof,HCLIP_PRIVATE);
plug->szTarget_szProof[lch1] = 0;
txPrivateDeleteTop(text1);
plug->ichProof = lch1 + 1;
//
txSelectAll(text2);
txPrivatePush(text2);
memClipPaste(plug->szTarget_szProof + plug->ichProof,HCLIP_PRIVATE);
plug->szTarget_szProof[plug->ichProof + lch2] = 0;
txPrivateDeleteTop(text2);
context->plug1 = plug;
}
}
}
}
}
}
return FALSE;
}
static BOOL dialogaProof(TX* text,PLUGPROOF* plug0)
{
#if 1//2.99 970312 校正改良。文字数の長さの制限をなくした
PROOFCONTEXT context;
structClear(context);
context.text = text;
context.plug0 = plug0;
sstrcpy(context.szReader,plug0 ? plug0->szReader : szProofReader);
//
HDIALOG hd = dialog(plug0 ? "校正のプロパティ" : "校正の挿入");
dialogSetHookEx(hd,"\m.dlgprocProof");
dialogSetCustdata(hd,&context);
DTRECT r;
dialogSetH(hd);
DWORD ws = TXWS_TEXT|TXWS_OPENTEXT|TXWS_ENABLEUNDO|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP;
ws |= TXWS_FONTINHERIT;//2.99D 970328
dialogCaption(hd,"校正対象(&T):");dialogSetPosLX(hd,13);
dialogGetPos(hd,&r);
r.cx = DTCX * 40;r.cy = DTCY * 3;
__dialogAddItem(hd,TXWS_SZCLASS,"",IDD_PROOF_TARGET,&r,ws);
dialogSetPosY(hd,r.y + r.cy);dialogLF(hd);
//
dialogCaption(hd,"校正内容(&P):");dialogSetPosLX(hd,13);
dialogGetPos(hd,&r);
r.cx = DTCX * 40;r.cy = DTCY * 3;
__dialogAddItem(hd,TXWS_SZCLASS,"",IDD_PROOF_PROOF,&r,ws);
dialogSetPosY(hd,r.y + r.cy);dialogLF(hd);
dialogSetV(hd);
//2.99 970317
dialogControlID(hd,IDD_PROOF_EXCHANGE);
dialogSetPosLX(hd,13);
dialogButton(hd,"校正対象と校正内容の入れ替え(&X)",NULL,34);
dialogSetPosLX(hd,0);
//
dialogStrC(hd,"校正者(&R):",context.szReader,12,cchof(context.szReader),20);
int iddCommit = 0;
int iddCancel = 0;
if (plug0) {
int lx = 18;
dialogLFV(hd);
dialogOK(hd,lx);
dialogCancel(hd,lx);
iddCancel = dialogCmd(hd,"校正の取り消し(&E)",lx);
iddCommit = dialogCmd(hd,"校正の承認(&C)",lx);
}
int ret;
text->fNoImeControl++;//2.99D 970401 校正ダイアログではIMEの制御をしないようにした。使いにくかった
ret = dialogOpen(hd);
text->fNoImeControl--;//2.99D 970401
if (ret) {
szProofReader = context.szReader;
if (text->editmode == 0) {//2.99C 970324
txInsert(text,szProofReader);
txInsert(text,text->tszformat[SZFORMAT_PROOF_END]);
} else {
txSetUndisp(text);
if (ret == iddCommit) {
txInsert(text,plug0->szTarget_szProof + plug0->ichProof);
txDeleteChar(text);
} else if (ret == iddCancel) {
txInsert(text,plug0->szTarget_szProof);
txDeleteChar(text);
} else {
if (context.plug1) {
sstrcpy(context.plug1->szReader,context.szReader);
txReplacePlug(text,context.plug1,plug0);
}
}
txSetDisp(text);
}
return TRUE;
}
return FALSE;
#else
PLUGPROOF* plug = plugatrNew(text,PLUG_PROOF);
if (!plug) return FALSE;
if (plug0) *plug = *plug0;
BOOL fClip = FALSE;
if (!plug0) {
if (txIsClipInPara(text)) {
fClip = TRUE;
txstr sz;
txGetWord(text,sz);
sstrcpy(plug->szTarget,sz);
}
}
HDIALOG hd = dialog(plug0 ? "校正のプロパティ" : "校正の挿入");
dialogSetHookEx(hd,"\m.dlgprocProof");
dialogSetCustdata(hd,plug);
if (!plug0) sstrcpy(plug->szReader,szProofReader);
dialogStrC(hd,"校正対象(&T):",plug->szTarget,12,cchof(plug->szTarget),40);
dialogStrC(hd,"校正内容(&P):",plug->szProof,12,cchof(plug->szProof),40);
dialogStrC(hd,"校正者(&R):",plug->szReader,12,cchof(plug->szReader),20);
int iddCommit = 0;
int iddCancel = 0;
if (plug0) {
int lx = 18;
dialogLFV(hd);
dialogOK(hd,lx);
dialogCancel(hd,lx);
iddCancel = dialogCmd(hd,"校正の取り消し(&E)",lx);
iddCommit = dialogCmd(hd,"校正の承認(&C)",lx);
}
int ret;
if (ret = dialogOpen(hd)) {
szProofReader = plug->szReader;
txSetUndisp(text);
if (ret == iddCommit) {
txInsert(text,plug->szProof);
txDeleteChar(text);
} else if (ret == iddCancel) {
txInsert(text,plug->szTarget);
txDeleteChar(text);
} else {
if (fClip) txSelectDelete(text);
txReplacePlug(text,plug,plug0);
}
txSetDisp(text);
return TRUE;
} else {
plugatrDelete(text,plugatrGetTyp(text,plug));//2.99 970312 freeしてなかった
}
return FALSE;
#endif
}
BOOL TXAPI TXCMDBASE txuiProof(TX* text)
{
// 校正の挿入、プロパティ
if (text->editmode && txGetCurPlugmode(text) == PLUG_PROOF) {
return dialogaProof(text,txGetCurPlug(text));
} else {
return dialogaProof(text,NULL);
}
}
//## charatr
BOOL TXAPI TXCMDBASE txuiCharProperty(TX* text)
{
if (!IsEditmode(text)) return FALSE;//2.98 970308
int plugmode = txGetCurPlugmode(text);
if (
text->editmode &&
(plugmode == 0 || plugmode == PLUG_TAB) && //2.99D 970329 桁揃え中の校正などの属性が変更できなかった
txIsCurParaIncludeTable(text)
) {//2.99C 970325
return txuiTable(text);
}
if (text->buff[text->cur] == CHAR_PLUG) {
if (text->editmode) {
CHARATR charatr;
charatrRead(text,txGetAddress(text),&charatr);
if (charatr.fLink) {
LPVOID plughead = plugatrRead(text,charatrGetPlug(charatr));
switch(((PLUGHEAD*)plughead)->modePlug) {
case PLUG_FOOTNOTE: {
dialogaFootnote(text,(PLUGFOOTNOTE*)plughead);
break;
}
case PLUG_FONT: {
dialogaFont(text,(PLUGFONT*)plughead);
break;
}
case PLUG_IMG: {
dialogaBitmap(text,(PLUGIMG*)plughead);
break;
}
case PLUG_LINK: {
dialogaLink(text,(PLUGLINK*)plughead);
break;
}
case PLUG_RUBY: {
dialogaRuby(text,(PLUGRUBY*)plughead);
break;
}
case PLUG_PROOF: {//2.98 970305
dialogaProof(text,(PLUGPROOF*)plughead);
break;
}
case PLUG_OLE: {//2.99D 970329 Alt+EnterでOLEオブジェクトアクティベートするようにした
//PLUGOLE* plug = plughead;information(plug->szname);
txJumpLink(text);
break;
}
}
}
}
return TRUE;
}
return FALSE;
}
BOOL TXAPI TXCMDBASE txuiCharatr(TX* text)
{
// 文字装飾ダイアログ
HDIALOG hd = dialog("文字装飾");
BOOL fBold = text->charatr.fBold;
BOOL fUnderline = text->charatr.fUnderline;
BOOL fItalic = text->charatr.fItalic;
dialogCheck(hd,"太字(&B)",&fBold);
dialogCheck(hd,"下線(&U)",&fUnderline);
dialogCheck(hd,"斜体(&I)",&fItalic);
dialogLFV(hd);
dialogOK(hd,10);
dialogCancel(hd,10);
int idClear = dialogCmd(hd,"クリア(&C)",10);
int ret = dialogOpen(hd);
if (ret) {
if (ret == idClear) {
txCharNormal(text);
} else {
txSetUndisp(text);
txCharNormal(text);
if (fBold) txCharBold(text);
if (fItalic) txCharItalic(text);
if (fUnderline) txCharUnderline(text);
txSetDisp(text);
}
text->charatr.fBold = fBold;
text->charatr.fUnderline = fUnderline;
text->charatr.fItalic = fItalic;
return TRUE;
}
return FALSE;
}
static NPARA txGetNparaMy(TX* text)
{
// 範囲選択時は範囲内のnparaを返す
if (text->fClip && txFlushSelectNow(text)) {
if (text->cliptopnow <= text->clipendnow) {
if (txGetAddress(text) == txGetParaTop(text)) return text->npara-1;
}
}
return text->npara;
}
#define IDD_INDENTTOP_DEFAULT 100
#define IDD_INDENTTOP 101
BOOL dlgprocParaatr(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
PostMessage(hwnd,WM_TXUSER,0,0);
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
if (id == IDD_INDENTTOP_DEFAULT) {
PostMessage(hwnd,WM_TXUSER,0,0);
}
break;
}
case WM_TXUSER: {
EnableDlgItem(hwnd,IDD_INDENTTOP,!IsDlgButtonChecked(hwnd,IDD_INDENTTOP_DEFAULT));
}
}
return FALSE;
}
BOOL TXAPI TXCMDBASE txuiParaatr(TX* text)
{
// 段落体裁ダイアログ
if (text->filekind == TEXT_MAIL) {
return call("paraform.configParaatr");
}
int lcxWidth = 40;
HDIALOG hd = dialog("段落体裁");
dialogSetHookEx(hd,"\m.dlgprocParaatr");
PARAATR paraatr;
paraatrRead(text,txGetNparaMy(text),¶atr);
int lcxIndent = paraatr.lcxIndent;
int lcxIndentTop = paraatr.lcxIndentTop;
int lcxIndentRight = paraatr.lcxIndentRight;
int modeAlign = paraatr.modeAlign;
BOOL fIndenTopDefault = (lcxIndent == lcxIndentTop);
dialogControlConvertEx(hd,"\m.convprocAlign");
dialogSelectID(hd,"配置(&A):",&modeAlign,20,15,"左揃え","中央揃え","右揃え");
dialogHeadline(hd,"左インデント",lcxWidth);
if (text->editmode == 0) dialogSetEnable(hd,FALSE);//2.99C 970324
dialogControlGuide(hd,"文字",6);
dialogInt(hd,"左(&L):",&lcxIndent,10,4);
dialogSetH(hd);
dialogControlGuide(hd,"文字",6);
dialogControlID(hd,IDD_INDENTTOP);
dialogInt(hd,"先頭行(&F):",&lcxIndentTop,10,4);
dialogControlID(hd,IDD_INDENTTOP_DEFAULT);
dialogCheck(hd,"標準値を使用(&D)",&fIndenTopDefault);
dialogSetV(hd);
dialogLF(hd);
dialogHeadline(hd,"右インデント",lcxWidth);
dialogControlGuide(hd,"文字",6);
dialogInt(hd,"右(&R):",&lcxIndentRight,10,4);
if (text->editmode == 0) dialogSetEnable(hd,TRUE);//2.99C 970324
dialogLFV(hd);
dialogOK(hd,10);
dialogCancel(hd,10);
int iddClear = dialogCmd(hd,"クリア(&C)",10);
int ret = dialogOpen(hd);
if (ret) {
if (ret == iddClear) {
lcxIndent = 0;
lcxIndentTop = 0;
lcxIndentRight = 0;
modeAlign = ALIGN_LEFT;
}
if (fIndenTopDefault) lcxIndentTop = lcxIndent;
txSetUndisp(text);
switch(modeAlign) {
case ALIGN_LEFT: txFormLeft(text);break;
case ALIGN_CENTER: txFormCenter(text);break;
case ALIGN_RIGHT: txFormRight(text);break;
}
paraatr.lcxIndent = lcxIndent;
paraatr.lcxIndentTop = lcxIndentTop;
paraatr.lcxIndentRight = lcxIndentRight;
mytxParaatrSet(text,TAG_INDENT,¶atr);
txSetDisp(text);
return TRUE;
}
return FALSE;
}
DWORD convprocArticle(DWORD data,int mode)
{
static int t[] = {
ARTICLE_NONE,ARTICLE_DISC,ARTICLE_NUMBER,ARTICLE_NOTICE,ARTICLE_CIRCLE,ARTICLE_SQUARE,
};
int n = sizeof(t) / sizeof(int);
if (mode == TXDIALOG_READ) {
if (data < n) return t[data];
return 0;
} else {
int i;
for (i = 0;i < n;i++) {
if (t[i] == data) return i;
}
return 0;
}
}
BOOL TXAPI TXCMDBASE txuiArticle(TX* text)
{
// 見出しと箇条書きダイアログ
if (text->filekind == TEXT_MAIL) {
return call("paraform.configArticle");
}
if (text->editmode == 0) {//2.99C 970324 「見出しと箇条書き」テキストモード対応
HDIALOG hd = dialog("見出しと箇条書き");
static int mode = 0;
dialogControlRadioV(hd);
dialogRadioID(hd,&mode,
"見出し(&H)...",
"箇条書き(&L)",
"番号付き箇条書き(&N)",
"※箇条書き(&O)",
"箇条書きのクリア(&0)"
);
if (dialogOpen(hd)) {
switch(mode) {
case 0: call("menu.見出し");break;
case 1: txFormArticleDisc(text);break;
case 2: txFormArticleNum(text);break;
case 3: txFormArticleNotice(text);break;
case 4: txFormArticleClear(text);break;
}
return TRUE;
}
return FALSE;//2.99C 970324
}
int lcxWidth = 40;
HDIALOG hd = dialog("見出しと箇条書き");
PARAATR paraatr;
paraatrRead(text,txGetNparaMy(text),¶atr);
int modeHead = paraatr.modeTitle;
int modeArticle = paraatr.modeArticle;
txstr szSubHeadline(CCHWORD);
dialogSelectID(hd,"見出し(&H):",&modeHead,20,15,"本文","章(H1)","節(H2)","項(H3)","中見出し(H4)","小見出し(H5)","表題(H6)");
dialogControlConvertEx(hd,"\m.convprocArticle");
dialogSelectID(hd,"箇条書き(&A):",&modeArticle,20,15,"なし","・","1.","※","○","□");
{
txSetUndispEx(text);
txJumpParaTop(text);
PLUGTAB* plug = (LPVOID)txOp(text,TXOP_PLUGTAB_CURPARA,0,0);
if (plug && plug->modeTab == MODETAB_BEAMTAB) {
IFILE adr = txGetAddress(text);
if (txOp(text,TXOP_PLUGTAB_RIGHT,0,0)) {
int i = txGetAddress(text) - adr;
txGetPara(text,szSubHeadline);
if (i < CCHWORD) szSubHeadline[i] = 0;
}
}
txSetDispEx(text);
}
dialogStr(hd,"小見出し(&S):",szSubHeadline,20,20);
//
dialogLFV(hd);
dialogOK(hd,10);
dialogCancel(hd,10);
int iddClear = dialogCmd(hd,"クリア(&C)",10);
int ret = dialogOpen(hd);
if (ret) {
if (ret == iddClear) {
modeHead = 0;
modeArticle = 0;
}
txSetUndisp(text);
if (modeArticle == 0) {
txFormArticleClear(text);
} else {
paraatr.fArticle = TRUE;
paraatr.modeArticle = modeArticle;
mytxParaatrSet(text,TAG_OL,¶atr);
}
paraatr.modeTitle = modeHead;
mytxParaatrSet(text,TAG_H,¶atr);
//
mytxParaatrSet(text,TAG_SUBHEAD,(LPVOID)szSubHeadline);
//
txSetDisp(text);
return TRUE;
}
return FALSE;
}
//## template
//2.97 970226 start
#define TE_WZSTR 1
#define TE_WZINT 2
#define TE_WZCHECKBOX 3
#define TE_WZADDRESSBOOK 4
#define TEMPLATE_INSERT 0 // 挿入
#define TEMPLATE_NEW 1 // 新規作成
#define TEMPLATE_LP 2 // 印刷時(カーソル位置は必ず先頭。移動しない。元のテキストを変化させない)
typedef struct {
BYTE mode;
mchar szCaption[CCHWORD]; // キャプション
mchar szContent[CCHWORD]; // 内容
mchar szArg[20];
WORD lchTag; // タグの長さ
IFILE adr; // タグのアドレス
WORD id; // dialog control id
} TECONTEXT;
#define MAX_TECONTEXT 100
static int my_strGetWordLen(mchar *szStr)
{
// 文字列szStrのスペース・タブまでの文字列のバイト数を返します
// ""内、0x0C-0x0C内のデリミタは無視する
//2.00Eから、()内,[]内のデリミタは無視しない
mchar *p = szStr;
BOOL fdq = FALSE;
int len = 0;
while(1) {
mchar c = p[len];
if (iskanji(c)) {//1.00B '['や']'が漢字2バイト目にマッチすることがある
if (p[len + 1]) {
len += 2;
} else {
break;
}
} else if (c == '"') {
fdq ^= 1;
len++;
} else if (c == '\t' || c == ' ') {
if (fdq) {
len++;
} else {
break;
}
} else if (c == '>') {
if (fdq) {
len++;
} else {
if (len == 0) len++;
break;
}
} else if (c < ' ') {
break;
} else {
len++;
}
}
return len;
}
static BOOL templageGetSentence(TX* text,txstr szbuff)
{
// タグの終わりならFALSEを返す
mchar* p0 = text->buff + text->cur;
mchar* p = strGetWordTop(p0);
int len = my_strGetWordLen(p);
txRightBytes(text,len + p - p0);
if (len) {
if (len == 1 && p[0] == '>') return FALSE;
if (szbuff) txstrcpylen(szbuff,p,len);
return TRUE;
}
return FALSE;
}
static BOOL tamplateAnalyzeTag(TX* text,TECONTEXT* te,int mode)
{
int istat = 0;
txstr sztag;
txstr szbuff;
te->mode = mode;
te->adr = txGetAddress(text);
templageGetSentence(text,sztag);
while(1) {
if (!templageGetSentence(text,szbuff)) break;
if (istat == 0) {
mchar* p = strchr(szbuff,'=');
if (p) {
*p = 0;
sstrcpy(te->szCaption,szbuff);
p++;
switch(mode) {
case TE_WZSTR: sstrcpy(te->szContent,p);break;
case TE_WZINT: *(int*)te->szContent = atoi(p);break;
case TE_WZCHECKBOX: *(BYTE*)te->szContent = atoi(p);break;
}
} else {
sstrcpy(te->szCaption,szbuff);
}
if (mode == TE_WZADDRESSBOOK) {
sstrcpy(te->szArg,&sztag[strlen("<WzAb")]);
}
}
istat++;
}
te->lchTag = txGetAddress(text) - te->adr;
return TRUE;
}
static int getaccesskey(int ic)
{
int ret = ic + 'A';
if (ret <= 'Z') return ret;
ret = ret - ('Z'+1) + '0';
if (ret <= '9') return ret;
return ' ';
}
static mchar* getcaption(mchar* _szcaption,int ic)
{
txstr szcaption(CCHWORD - 10,_szcaption);
static mchar buff[CCHWORD];
sprintf(buff,"%s(&%c)",szcaption,getaccesskey(ic));
return buff;
}
#define IDD_ADDRESSBOOK 100
typedef struct {
TECONTEXT* tte;
int nte;
} TEDLGCONTEXT;
BOOL dlgprocTemplate(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
switch(message) {
case WM_INITDIALOG: {
break;
}
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
TEDLGCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
switch(id) {
case IDD_ADDRESSBOOK: {
#if 1//2.99 970315
TX* text = txuiAbNew();
if (text) {
txstr szcontent;
for (int i = 0;i < context->nte;i++) {
TECONTEXT* pte = context->tte + i;
if (pte->mode == TE_WZADDRESSBOOK) {
szcontent = "";
txAbSearchItem(text,pte->szArg,szcontent);
SetDlgItemText(hwnd,pte->id,szcontent);
}
}
txAbDelete(text);
}
#else
addressbookUI();
TX _textBody;
TX* text = &_textBody;
if (txInit(text,NULL)) {
txClipPaste(text,HCLIP_WIN,FALSE,0);
txstr szcontent;
for (int i = 0;i < context->nte;i++) {
TECONTEXT* pte = context->tte + i;
if (pte->mode == TE_WZADDRESSBOOK) {
szcontent = "";
txAbSearchItem(text,pte->szArg,szcontent);
SetDlgItemText(hwnd,pte->id,szcontent);
}
}
txClose(text);
}
#endif
break;
}
}
break;
}
}
return FALSE;
}
static void templateExec(TX* textTarget,TX* text,int mode)
{
SEARCHMODE searchmode = SEARCH_CUR|SEARCH_NOSENSECASE;
BOOL fClip = ((mode != TEMPLATE_LP) && textTarget->fClip);
txSetUndisp(textTarget);
txJumpFileTop(text);
TECONTEXT* tte = memAllocZeroinit(sizeof(TECONTEXT) * MAX_TECONTEXT);
BOOL fDialogCanceled = FALSE;
if (tte) {
TECONTEXT* pte = tte;
txstr szbuff;
BOOL fAddressbook = FALSE;
while(1) {
if (pte - tte == MAX_TECONTEXT) {
information("Full");
break;
}
if (txSearchEx(text,"<WZ",searchmode)) {
int len;
if (len = txCmpCurI(text,"<WZSTR")) {
tamplateAnalyzeTag(text,pte++,TE_WZSTR);
} else if (len = txCmpCurI(text,"<WZINT")) {
tamplateAnalyzeTag(text,pte++,TE_WZINT);
} else if (len = txCmpCurI(text,"<WZCHECKBOX")) {
tamplateAnalyzeTag(text,pte++,TE_WZCHECKBOX);
} else if (txCmpCurI(text,"<WzAb")) {
tamplateAnalyzeTag(text,pte++,TE_WZADDRESSBOOK);
fAddressbook = TRUE;
} else {
if (!txRight(text)) break;
}
} else {
break;
}
}
int n = pte - tte;
if (n) {//2.98 970304 0個の時は実行しない
TEDLGCONTEXT context;
context.tte = tte;
context.nte = n;
HDIALOG hd = dialog(pathGetFileName(text->szfilename));
dialogSetHookEx(hd,"\m.dlgprocTemplate");
dialogSetCustdata(hd,&context);
int i;
int ic = fAddressbook ? 1 : 0;
for (i = 0;i < n;i++) {
pte = tte + i;
switch(pte->mode) {
case TE_WZADDRESSBOOK:
case TE_WZSTR: {
pte->id = dialogStrC(hd,getcaption(pte->szCaption,ic++),pte->szContent,20,cchof(pte->szContent),40);
break;
}
case TE_WZINT: {
pte->id = dialogInt(hd,getcaption(pte->szCaption,ic++),(int*)pte->szContent,20,5);
break;
}
case TE_WZCHECKBOX: {
pte->id = dialogCheckB(hd,getcaption(pte->szCaption,ic++),(LPBYTE)pte->szContent);
break;
}
default: {
dialogCaption(hd,pte->szCaption);
break;
}
}
}
if (fAddressbook) {
dialogControlID(hd,IDD_ADDRESSBOOK);
dialogButton(hd,"住所録(&A)...",NULL,14);
}
if (dialogOpen(hd)) {
long d = 0;
int i;
for (i = 0;i < n;i++) {
pte = tte + i;
txJumpAddress(text,pte->adr - d);
txDeleteBytes(text,pte->lchTag);d += pte->lchTag;
switch(pte->mode) {
case TE_WZADDRESSBOOK:
case TE_WZSTR: {
txInsert(text,pte->szContent);
d -= strlen(pte->szContent);
break;
}
case TE_WZINT: {
sprintf(pte->szContent,"%d",*(int*)pte->szContent);
txInsert(text,pte->szContent);
d -= strlen(pte->szContent);
break;
}
case TE_WZCHECKBOX: {
if (pte->szContent[0]) {
txInsert(text,"■");d -= 2;
} else {
txInsert(text,"□");d -= 2;
}
txInsert(text,pte->szCaption);
d -= strlen(pte->szCaption);
break;
}
}
}
} else {
fDialogCanceled = TRUE;
}
}
memFree(tte);
if (!fDialogCanceled) {
// WZMACROの実行
TX* textTemplate = text;
txJumpFileTop(text);
while(1) {
if (txSearchEx(text,"<WZMACRO",searchmode)) {
IFILE adr = txGetAddress(text);
txstr szbuff;
txstr szcall;
templageGetSentence(text,NULL);
int istat = 0;
while(1) {
if (!templageGetSentence(text,szbuff)) break;
if (istat == 0) {
szcall = szbuff;
}
istat++;
}
int lchTag = txGetAddress(text) - adr;
txJumpAddress(text,adr);
txDeleteBytes(text,lchTag);
{
TX _textBody;
TX* text = &_textBody;
if (txInit(text,NULL)) {
DWORD ret;
// モジュール名が省略されていたら、"template"をモジュール名とする
{
mchar* p = strchr(szcall,'(');
if (p) *p = 0;
BOOL fNoDot = (strchr(szcall,'.') == NULL);
if (p) *p = '(';
if (fNoDot) {
szcall = "template." + szcall;
}
}
// macroCallStrでコンパイル実行しないように。
// macroCallStrでコンパイル実行されると、
// textが切り替わって別のtextにマクロ実行内容が出力されてしまう。
macroGetKind(szcall);
{
TX* textf0 = textf;
textf = text;
macroCallStr(szcall,&ret);
textf = textf0;
}
txInsertText(textTemplate,text);
txClose(text);
}
}
} else {
break;
}
}
// WzTxXXXの実行
txJumpFileTop(text);
while(1) {
if (txSearchEx(text,"<WZTX",searchmode)) {
IFILE adr = txGetAddress(text);
templageGetSentence(text,NULL);
txstr szcall;
txstr szbuff;
int istat = 0;
while(1) {
if (!templageGetSentence(text,szbuff)) break;
if (istat == 0) szcall = szbuff;
istat++;
}
int lch = txGetAddress(text) - adr;
txJumpAddress(text,adr);
txDeleteBytes(text,lch);
// <WZTX xxx>に続く改行は削除
if (txIsCurReturn(text)) txDeleteChar(text);
if (mode == TEMPLATE_LP) {
// 印刷時は無視。
} else {
//information("[%s]",szcall);
txCall(textTarget,szcall);
}
} else {
break;
}
}
// <WZSELTEXT>の実行
if (fClip) {
txPrivatePush(textTarget);
txSelectDelete(textTarget);
}
txJumpFileTop(text);
while(1) {
if (txSearchEx(text,"<WZSELTEXT>",searchmode)) {
txDeleteBytes(text,strlen("<WZSELTEXT>"));
if (fClip) {
txPrivatePaste(text);
}
} else {
break;
}
}
if (fClip) {
txPrivateDeleteTop(textTarget);
}
// <WZCUR>の実行
IFILE adrAdd = 0;
txJumpFileTop(text);
if (txSearchEx(text,"<WZCUR>",searchmode)) {
adrAdd = txGetAddress(text);
txDeleteBytes(text,strlen("<WZCUR>"));
}
// Insert & JUMP
IFILE adr = txGetAddress(textTarget);
int ly = textTarget->ly;
txInsertText(textTarget,text);
IFILE adrEnd = txGetAddress(textTarget);
txFlushTableAll(textTarget);
if (mode == TEMPLATE_LP) {
txJumpAddress(textTarget,adrEnd);
} else {
if (fClip) {
txJumpAddress(textTarget,adrEnd);
ly == 0 ? txSetLyCenter(textTarget) : txSetLy(textTarget,ly);
txSelectEx(textTarget,CLIP_CHAR);
txJumpAddress(textTarget,adr);
textTarget->fClipMouse = TRUE;
} else {
txJumpAddress(textTarget,adr + adrAdd);
ly == 0 ? txSetLyCenter(textTarget) : txSetLy(textTarget,ly);
}
}
}
}
txSetDisp(textTarget);
}
// HTMLでタグ内で<WZSTR>etcが使えないのは仕様
// 将来、可能なら改善する。
// HTML用には、[WZSTR]等とする。
BOOL _template(TX* textTarget,mchar* szfilename,int mode)
{
BOOL fNew = (mode == TEMPLATE_NEW);
TX _textBody;
TX* text = &_textBody;
txInitText(text);
text->fTxbackInitTxForm = TRUE;
text->fTxsemHtmlAtTemplate = TRUE;
txSetFileName(text,szfilename);
if (txOpenText(text)) {
//information("%d %d",text->fForm,text->fHTML);
// text->fForm = (txCmpCurI(text,"<TX>") != 0);
txSetUndisp(textTarget);
if (text->fHTML) {
if (!txSearchEx(text,"<HTML>",SEARCH_CUR|SEARCH_NOSENSECASE)) {
// <HTML>がない場合、<HTML>を追加しないように
text->fTxsemHtmlInside = TRUE;
}
if (fNew) {
txDeleteText(textTarget);
}
if (textTarget->editmode) {
txSetEditmode(text,1);
}
} else if (text->fForm) {
if (textTarget->editmode) {
txSetEditmode(text,1);
} else if (fNew) {
textTarget->fForm = TRUE;
txSetEditmode(textTarget,1);
txSetEditmode(text,1);
}
}
templateExec(textTarget,text,mode);
if (mode == TEMPLATE_NEW) {
//2.99C 970326 新規作成-テンプレートでは、テンプレートファイルの拡張子の設定を読み込む様にした
mchar szname[CCHNAME];
txConfigOp(text,TXCONFIGOP_EXTGETNAME,szname);
txConfigOp(textTarget,TXCONFIGOP_EXTNAME_LOAD,szname);
txFlush(textTarget);
//2.99C 970326 デフォルト拡張子も設定
CMDLINECONTEXT* cc = textTarget->pcc;
if (cc) sstrcpy(cc->szOpenExt,pathGetExt(text->szfilename));
}
txSetDisp(textTarget);
txClose(text);
}
return TRUE;
}
BOOL TXCMDBASE uiInsertTamplate(TX* text)
{
txstr szfilename;
strcpy(szfilename,text->szexedir);
szfilename += "template\\*.*";
if (text->fHTML) {
pathSetFileName(szfilename,SZHTMLMASK);
}
//information("%s",szfilename);
if (txofnGetOpenFileNameEx(text,szfilename,"テンプレートの挿入",TXOFN_FOCUSFILE) == TXOFN_OK) {
return _template(text,szfilename,TEMPLATE_INSERT);
}
return FALSE;
}
BOOL template(TX* textTarget,mchar* szfilename)
{
// 新規作成時用 for wz.exe
return _template(textTarget,szfilename,TEMPLATE_NEW);
}
BOOL templateLp(TX* textTarget,mchar* szfilename)
{
// 印刷時用 for wz.exe
txstr szfull = text->szexedir + "template\\";
pathSetFileName(szfull,szfilename);
return _template(textTarget,szfull,TEMPLATE_LP);
}
//## html for wz.exe
int htmlQ(void)
{
HDIALOG hd = dialog("HTMLファイルの体裁モードへ移行");//2.99D 970328 htmlQ「詳細モード」は表示しない
int mode = 0;
dialogCaption(hd,"体裁モードへ移行すると、折り返しなどのテキストの体裁が変化します。");
dialogCaption(hd,"どのようにしますか?");
dialogIndent(hd,4);
dialogControlRadioV(hd);
dialogRadioID(hd,&mode,
"体裁モードへ移行する",
"移行しない"
);
if (dialogOpen(hd)) {
if (mode == 0) return IDYES;
return IDNO;
}
return IDCANCEL;
}
//## rtf for wz.exe
#ifdef __FLAT__
permanent BOOL p_rtfEditToWordQ = TRUE;
int rtfQ(void)
{
if (!p_rtfEditToWordQ) return IDYES;
HDIALOG hd = dialog("RTFファイルの体裁/詳細モードへ移行");
int mode = 0;
dialogCaption(hd,"体裁/詳細モードへ移行すると、段落体裁や文字属性が変化します。");
dialogCaption(hd,"また、OLEオブジェクトが失われます。");
dialogCaption(hd,"どのようにしますか?");
dialogIndent(hd,4);
dialogControlRadioV(hd);
dialogRadioID(hd,&mode,
"体裁モードへ移行する",
"移行しない"
);
dialogIndent(hd,-4);
dialogControlReverseBool(hd);
dialogCheck(hd,"今後、このメッセージを表示しない(&Q)",&p_rtfEditToWordQ);
if (dialogOpen(hd)) {
if (mode == 0) return IDYES;
return IDNO;
}
return IDCANCEL;
}
permanent BOOL p_rtfWordToEditQ = TRUE;
int rtfQ2(void)
{
if (!p_rtfWordToEditQ) return IDYES;
HDIALOG hd = dialog("RTFファイルのテキストモードへ移行");
int mode = 0;
dialogCaption(hd,"テキストモードへ移行すると、段落体裁や文字属性が変化します。");
dialogCaption(hd,"また、OLEオブジェクトが失われます。");
dialogCaption(hd,"どのようにしますか?");
dialogIndent(hd,4);
dialogControlRadioV(hd);
dialogRadioID(hd,&mode,
"テキストモードへ移行する",
"移行しない"
);
dialogIndent(hd,-4);
dialogControlReverseBool(hd);
dialogCheck(hd,"今後、このメッセージを表示しない(&Q)",&p_rtfWordToEditQ);
if (dialogOpen(hd)) {
if (mode == 0) return IDYES;
return IDNO;
}
return IDCANCEL;
}
permanent BOOL p_rtfSaveQ = TRUE;
int rtfQ3(void)
{
if (!p_rtfSaveQ) return IDYES;
HDIALOG hd = dialog("RTFファイルの保存");
int mode = 0;
dialogCaption(hd,"保存すると、段落体裁や文字属性が変化します。");
dialogCaption(hd,"また、OLEオブジェクトが失われます。");
dialogCaption(hd,"どのようにしますか?");
dialogIndent(hd,4);
dialogControlRadioV(hd);
dialogRadioID(hd,&mode,
"保存する",
"保存しない"
);
dialogIndent(hd,-4);
dialogControlReverseBool(hd);
dialogCheck(hd,"今後、このメッセージを表示しない(&Q)",&p_rtfSaveQ);
if (dialogOpen(hd)) {
if (mode == 0) return IDYES;
return IDNO;
}
return IDCANCEL;
}
#endif
//##
__delete
{
macroHookWndBaseFree();
}
#if 0//2.99C 970325 不要になった
// 強制的にロードする。
// これをしないと書式メニュー内のコマンドのチェック機能が働かない
load
{
}
#endif