home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1999 February
/
VPR9902A.BIN
/
APUPDATE
/
VC
/
Tx300d
/
TX300D.LZH
/
WINDOW.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-09
|
28KB
|
1,274 lines
// WZ EDITOR 標準機能 ウィンドウ
// Copyright 1995-96 TY
//{###ウィンドウ}
//1.01A WZ.EXEとソースプログラム統合。WZ.EXE側でこのソースプログラムを#includeするようにした
#ifdef __TXC__
#include <windows.h>
#include <windowsx.h>
#include "dialog.h"
#include "_filer.h"
#ifndef __FLAT__
extern "user.exe" BOOL WINAPI IsIconic(HWND);
#endif
#endif //__TXC__
static mchar szAppName[] = "WZ Editor";
#if 0//2.99 970312 szAppName2廃止
#ifdef __FLAT__
static mchar szAppName2[] = " - WZ Editor";
#endif
#endif
int TXAPI txIsFocusSub(TX* text)
{
//2.99C 970325 new
// サブウィンドウがなければ-1,
// サブウィンドウにフォーカスがあればTRUE,なければFALSEを返す
if (text->hwndtext2) {
if (text->fFocus2) return TRUE;
return FALSE;
} else if (text->text2) {
if (text->fMultiChild) return TRUE;
return FALSE;
}
return -1;
}
void TXAPI txSetFocusSub(TX* text,BOOL fSub)
{
switch(fSub) {
case 0: {
if (text->hwndtext2) {
#if 1//2.99D 970402 ちらつきを抑えた
text->fUndraw++;
text->fUndispCursor++;
SetFocus(text->hwndtext);
text->fUndispCursor--;
text->fUndraw--;
txDispAll(text);
#else
SetFocus(text->hwndtext);
#endif
} else if (text->text2 && text->fMultiChild) {
SetFocus(text->text2->hwndtext);
} else {
SetFocus(text->hwndtext);
}
break;
}
case 1: {
if (text->hwndtext2) {
SetFocus(text->hwndtext2);
} else if (text->text2 && !text->fMultiChild) {
SetFocus(text->text2->hwndtext);
} else {
SetFocus(text->hwndtext);
}
break;
}
}
}
//##次のウィンドウを返す
BOOL TXAPI wndtxIsEditor(HWND hwnd)
{
// hwndがWZ Editorかどうか返す
//1.01Aで追加
mchar szcaption[128];
GetWindowText(hwnd,szcaption,sizeof(szcaption));
if (_fwin40) {//1.00H4 "ファイル名 - WZ"キャプションに対応
#ifdef __FLAT__
#if 1//2.99 970312
int lchAppName = sizeof(szAppName) - 1;
int lch = strlen(szcaption);
if (lch >= lchAppName) {
if (!strnicmp(szcaption + lch - lchAppName,szAppName,lchAppName)) {
return TRUE;
}
}
return FALSE;
#else
if (strstr(szcaption,szAppName2)) return TRUE;
#endif
#endif
} else {
if (!strnicmp(szcaption,szAppName,sizeof(szAppName)-1)) return TRUE;
}
return FALSE;
}
HWND _wndtxGetNext(BOOL fquery,BOOL fEditorOnly)
{
HWND ret = NULL;
HWND cur = GetWindow(GetDesktopWindow(),GW_CHILD);
//1.00H5 再利用窓にはマッチしないようにした
wzlock(LOCK_WZPROCESS);
for (;cur;cur = GetNextWindow(cur,GW_HWNDNEXT)) {
int i = textSearch(cur);
//statprintf("%d",i);beep();wait(100);
if (i != -1) {
if (
cur != textf->hwndbase &&//2.93 text1->textf
(
(fEditorOnly == 0) ||
(fEditorOnly == 1 && wndtxIsEditor(cur)) ||
(
fEditorOnly == 2 && (
wndtxIsEditor(cur) ||
(text1->share->tWzprocess[i].modeProcess & WZPROCESS_EDITORLIKE)
)
)
) &&
!GetWindow(cur,GW_OWNER) &&
(!fquery || SendMessage(cur,WM_TXQUERYCLOSE,0,0) == TRUE)
) {
//statprintf("found",i);beep();wait(100);
#if 0
{
mchar szcaption[128];
GetWindowText(cur,szcaption,sizeof(szcaption));
information(szcaption);
}
#endif
ret = cur;
break;
}
}
}
wzunlock(LOCK_WZPROCESS);
return ret;
}
HWND TXAPI wndtxGetNext(void)
{
// 次画面のWZのウィンドウハンドルを返します。
// なければNULLを返します。
// WZ EditorだけでなくWZ FilerやGrepなどにもマッチします
//1.00Cで追加
return _wndtxGetNext(FALSE,FALSE);
}
HWND TXAPI wndtxGetNextEditor(void)
{
// 次画面のWZ Editorのウィンドウハンドルを返します。
// なければNULLを返します。
// WZ FilerやGrepなどにはマッチしません
//1.01Aで追加
return _wndtxGetNext(FALSE,TRUE);
}
// WM_TXQUERYCLOSEを送ってはねられるウィンドウは除く
HWND wndtxGetNext2(void)
{
return _wndtxGetNext(TRUE,FALSE);
}
//##オリジナルウィンドウ位置、サイズ
// Win32では他インスタンスのウィンドウの補足ウィンドウメモリにアクセスはできるが、
// ポインタとしてはアクセスできない。
void TXAPI wndtxSetOriginalRect(HWND hwnd,RECT *r)
{
//2.99C 970325 TXAPI
int i;
wzlock(LOCK_WZPROCESS);
i = textSearch(hwnd);
if (i != -1) {
#ifdef __TXC__
SHARE *sh = text->share;
#endif
sh->tWzprocess[i].rectOriginal = *r;
}
//statprintf("%d %d %d %d",r->left,r->top,r->right,r->bottom);wait(100);
wzunlock(LOCK_WZPROCESS);
}
void TXAPI wndtxGetOriginalRect(HWND hwnd,RECT *r)
{
//2.99C 970325 TXAPI
int i;
wzlock(LOCK_WZPROCESS);
i = textSearch(hwnd);
if (i != -1) {
#ifdef __TXC__
SHARE *sh = text->share;
#endif
*r = sh->tWzprocess[i].rectOriginal;
}
wzunlock(LOCK_WZPROCESS);
}
void TXAPI wndtxSetOriginalSize(HWND hwnd,SIZE *s)
{
//2.99C 970325 TXAPI
#if 1///3.00A 970502 別プロセスのWZがあるとき「ウィンドウ|重ねて表示」でアプリエラーが起きることがあった
SetWindowWord(hwnd,4,s->cx);
SetWindowWord(hwnd,6,s->cy);
#else
TXBASE_CONTEXT* p = hwndbaseGetContext(hwnd);
p->sizeOriginal = *s;
#endif
}
void TXAPI wndtxGetOriginalSize(HWND hwnd,SIZE *s)
{
//2.99C 970325 TXAPI
#if 1///3.00A 970502 別プロセスのWZがあるとき「ウィンドウ|重ねて表示」でアプリエラーが起きることがあった
s->cx = GetWindowWord(hwnd,4);
s->cy = GetWindowWord(hwnd,6);
#else
TXBASE_CONTEXT* p = hwndbaseGetContext(hwnd);
*s = p->sizeOriginal;
#endif
}
//##メッセージ送信
LRESULT TXAPI SendMessageOther(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
// 他のWZにメッセージを送信し、処理を待ち、結果を返します。
// 送信先のWZがビジー状態またはハングしているときは5秒待っても
// 送信できなければ処理は中止し、0を返します。
// WZ16ではSendMessageをそのまま実行します。
//2.00Bで追加
#ifdef __FLAT__
DWORD result;
if (SendMessageTimeout(hwnd,uMsg,wParam,lParam,SMTO_NORMAL,5000,&result)) {
return result;
}
return 0;
#else
return SendMessage(hwnd,uMsg,wParam,lParam);
#endif
}
#ifdef __TXC__
//##ウィンドウの切り換え
static void _next(int d)
{
int nMax = text->share->nOpen;
if (
IsIconic(text->hwndbase) ||
!IsWindowVisible(text->hwndbase) ||
nMax <= 1
) {
return;
}
int idx;
for (idx = 0; idx < nMax; idx ++) {
if (text->hwndbase == textRead(idx)) {
break;
}
}
do {
idx += d;
if (idx < 0) idx = nMax - 1;
idx %= nMax;
HWND cur = textRead(idx);
if (
cur &&
!IsIconic(cur) &&
IsWindowVisible(cur) //1.01A WZ32+Win95でwindow.Nextでwziconが居るとウィンドウが切り替わらなかった
) {
break;
}
} while (text->hwndbase != textRead(idx));
HWND cur = textRead(idx);
if (cur) wndtxSetActive(cur);
}
Next
{
// WZの次のウィンドウへ切り替え
// アイコン化されたウィンドウは除外して切り替える
// Thanks dieさん
//2.99A 970321 {#MS} ^{F6} %{F6} -> ^{F6}
//{#MS} ^{F6}
_next(1);
}
Prev
{
// WZの手前のウィンドウへ切り替え
// アイコン化されたウィンドウは除外して切り替える
// Thanks dieさん
//1.01A で追加
//2.99A 970321 {#MS} +^{F6} new
//{#MS} +^{F6}
_next(-1);
}
//##ウィンドウを一覧表示して切り換え
#define IDD_LIST 100
// hwndがトップレベルウィンドウとして存在するか返す
BOOL wndGetExistToplevel(HWND hwnd)
{
HWND cur = GetWindow(GetDesktopWindow(),GW_CHILD);
while(cur) {
if (cur == hwnd) return TRUE;
cur = GetWindow(cur,GW_HWNDNEXT);
}
return FALSE;
}
// textのOpenの順番で作る
static int WindowList(HANDLE handle,BOOL fMenu,int iMenu)
{
int lchAppName = sizeof(szAppName)-1;
int number = 1;
int i;
int j;
for (i = 0;i < text->share->nOpen;i++) {
#if 1
HWND cur = textRead(i);
if (!cur) continue;
#else
// for TEST
HWND cur = text->share->tWzprocess[i].hwnd;
#endif
BOOL fexist = wndGetExistToplevel(cur);
if (fexist && GetWindow(cur,GW_OWNER)) {
// オーナが居る場合は無視
} else {
#define CAPTIONSIZE (CCHAPPNAME + CCHPATHNAME)
mchar szcaption[3 + CAPTIONSIZE];// 3:for "&1 "
mchar *p = szcaption;
// menu command key
if (fMenu) {
*p++ = '&';
if (number <= 9) {
*p++ = '0' + number;
} else {
*p++ = ' ';
}
*p++ = ' ';
}
number++;
#if 0000
// edited ?
if (wndtxCall(cur,"txGetEdit")) {
*p++ = '*';
} else {
*p++ = ' ';
}
#endif
*p++ = ' ';
// get caption
if (fexist) {
GetWindowText(cur,p,CAPTIONSIZE);
// Editorなら、アプリ名を取り除く
if (!_fwin40) {
if (!strnicmp(p,szAppName,lchAppName)) {
strcpy(p,p+lchAppName+3);//+3:" - "
}
}
} else {
// アプリエラーなどで落ちた
strcpy(p,"(無効ウィンドウ)");
}
// add
if (fMenu) {
UINT fCheck = (cur == text->hwndbase) * MF_CHECKED;
if (iMenu == -1) {
#if 1//2.95 970129
AppendMenu(handle,MF_STRING|fCheck,IDM_TXWINDOWTOP + i,szcaption);
#else
menuStr(handle,szcaption,IDM_TXWINDOWTOP + i);
#endif
} else {
InsertMenu(handle,iMenu,MF_BYPOSITION|MF_STRING|fCheck,IDM_TXWINDOWTOP + i,szcaption);
iMenu++;
}
} else {
SendMessage(handle,LB_ADDSTRING,0,(LPARAM)szcaption);
}
// search
if (text->hwndbase == cur) j = i;
}
}
return j;
}
//1.90
int menuWindowList(HMENU hmenu,int i)
{
WindowList(hmenu,TRUE,i);
return TRUE;
}
//1.90
BOOL TXCMDBASE stdout(TX* text)
{
// 標準出力ウィンドウを開く
// TX-Cのコンパイル経過や結果が表示されます。
PostMessage(text->hwndbase,WM_COMMAND,IDM_TXSTDOUTOPEN,0);
return TRUE;
}
BOOL dlgprocSelectWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
HWND hwndList = GetDlgItem(hwnd,IDD_LIST);
SendMessage(hwndList,LB_SETCURSEL,WindowList(hwndList,FALSE,0),0L);
SetFocus(hwndList);
return FALSE;
}
case WM_COMMAND: {
int id = LOWORD(wParam);
if (id == IDOK) {
HWND hwndList = GetDlgItem(hwnd,IDD_LIST);
int nSel;
nSel = SendMessage(hwndList,LB_GETCURSEL,0,0);
if (nSel != LB_ERR) {
EndDialog(hwnd,TRUE);
HWND cur = textRead(nSel);
if (cur) {
wndtxSetActive(cur);
}
} else {
EndDialog(hwnd,FALSE);
}
return TRUE;
}
return FALSE;
}
case WM_WKKEYDOWN: {
switch(LOWORD(lParam)) {
case VK_ESCAPE:
case VK_DOWN:
case VK_UP:
case VK_LEFT:
case VK_RIGHT:
case VK_RETURN: {
return FALSE;
}
default: {
HWND hwndList = GetDlgItem(hwnd,IDD_LIST);
HWND next = 0;
int iSel;
iSel = SendMessage(hwndList,LB_GETCURSEL,0,0);
if (iSel != LB_ERR) {
//1.00H4 次のウィンドウを調べる
int i;
for (i = iSel + 1;i < text->share->nOpen;i++) {
next = textRead(i);
if (!next) break;
}
for (i = 0;i <= iSel;i++) {
next = textRead(i);
if (!next) break;
}
}
EndDialog(hwnd,FALSE);
if (next) wndtxSetActive(next);
return TRUE;
}
}
return FALSE;
}
}
return FALSE;
}
uiSelect
{
// ウィンドウ選択ダイアログを表示して、切り換えます。
HDIALOG hd = dialog("編集テキスト");
{
PMACROFUNC pfunc;
if (macroGetFuncAddress("dlgprocSelectWindow",&pfunc)) {
dialogSetHook(hd,&pfunc);
}
}
dialogControlHookKey(hd);
dialogControlID(hd,IDD_LIST);
_dialogList(hd,NULL,60,12); //3.00A 970429 45->60 window.uiSelectのファイル名表示のウィンドウの横幅を拡大
dialogOpen(hd);
}
//##ウィンドウ汎用API
static BOOL hwndIsText(HWND hwnd)
{
int i;
for (i = 0;i < text->share->nOpen;i++) {
if (hwnd == textRead(i)) {
return TRUE;
}
}
return FALSE;
}
// curの次のWZ窓を返す
static HWND textGetNext(HWND cur)
{
while(1) {
cur = GetNextWindow(cur,GW_HWNDNEXT);
if (!cur) return NULL;
if (hwndIsText(cur) && !GetWindow(cur,GW_OWNER)) return cur;
}
}
// curの以前のTX windowを返す
static HWND textGetPrev(HWND cur)
{
while(1) {
cur = GetNextWindow(cur,GW_HWNDPREV);
if (!cur) return NULL;
if (hwndIsText(cur) && !GetWindow(cur,GW_OWNER)) return cur;
}
}
// 画面の一番奥にあるWZ窓を返す
static HWND textGetLast(void)
{
HWND hwnd = GetWindow(GetDesktopWindow(),GW_CHILD);
// get last window
while(1) {
HWND hwndnext = GetWindow(hwnd,GW_HWNDNEXT);
if (!hwndnext) break;
hwnd = hwndnext;
}
// hwnd is TX?
if (hwndIsText(hwnd) && !GetWindow(hwnd,GW_OWNER)) {
// OK
} else {
hwnd = textGetPrev(hwnd);
}
return hwnd;
}
// 画面の一番手前にあるWZ窓を返す
static HWND textGetTop(void)
{
HWND hwnd = GetWindow(GetDesktopWindow(),GW_CHILD);
while(hwnd) {
hwnd = GetWindow(hwnd,GW_HWNDNEXT);
if (hwndIsText(hwnd) && !GetWindow(hwnd,GW_OWNER)) break;
}
return hwnd;
}
BOOL TXAPI wndtxMove(HWND hwndbase,int x,int y,int cx,int cy,BOOL bRepaint)
{
// ウィンドウを移動します。
// WindowsAPIのMoveWindowと同じですが、WZの[ウィンドウ]-[並べて表示]が実行されたとき、
// hwndbaseのサイズがcx,cyで表示されるように設定作業をします
//1.01A で追加
SIZE s;
s.cx = cx;
s.cy = cy;
wndtxSetOriginalSize(hwndbase,&s);
return MoveWindow(hwndbase,x,y,cx,cy,bRepaint);
}
DWORD TXAPI wndtxCallUi(HWND hwndbase,mchar *szapi)
{
// WZ16ではwndtxCallを使って、ダイアログを開くマクロを呼びだすと
// キーやマウスが反応しなくなることがあるという問題があります。
// このAPIを使ってこの問題を回避できます。
// WZ32ではこのAPIはwndtxCallと全く同じです。
// ●制限事項
// ・wz.exe内部のAPIは呼び出せません。マクロの呼び出しに使ってください
// ・返り値は取れません。いつもTRUEを返します。
//1.01Aで追加
#ifdef __FLAT__
return wndtxCall(hwndbase,szapi);
#else
wndtxSetActive(hwndbase);
PostMessage(hwndbase,WM_TXCALL,0,(LPARAM)szapi);
return TRUE;
#endif
}
DWORD TXAPI wndtxCallNext(mchar *szapi)
{
// wndtxCallを使って次画面のWZのszapiを呼び出します
// 次画面のウィンドウがあればwndtxCallの返り値、なければ0を返します。
//1.00Cで追加
HWND hwnd = wndtxGetNext();
if (hwnd) {
return wndtxCall(hwnd,szapi);
}
return 0;
}
DWORD TXAPI wndtxCallBoth(mchar *szapi)
{
// wndtxCallを使って現在画面と次画面のWZのszapiを呼び出します
// 次画面のウィンドウがあれば現在画面のwndtxCallの返り値、なければ0を返します。
//1.00Cで追加
HWND hwnd = wndtxGetNext();
if (hwnd) {
DWORD ret = wndtxCall(textf->hwndbase,szapi);//2.96A 970214 text1->textf
wndtxCall(hwnd,szapi);
return ret;
}
return 0;
}
static int GetModeFocus(void);
static void SetModeFocus(TX* textFrame,int modeFocus);
static BOOL txSwitchSub(void)
{
//2.99C 970324 new
int modeFocus = GetModeFocus();
//statprintf("%d",modeFocus);wait(500);
if (modeFocus < 0) return FALSE;
TX* textFrame = txGetFrame(text);
BOOL fText2 = (text->hwndtext2 || text->text2); // 分割中?
if (fText2) {
modeFocus++;
if (modeFocus == 2) modeFocus = 0;
SetModeFocus(textFrame,modeFocus);
return TRUE;
}
return FALSE;
}
DWORD TXAPI wndtxCallNextEx(mchar *szapi)
{
// ウィンドウ分割中は分割された他方、分割中でなければ次画面の
// WZのszapiを呼び出します
// 呼び出した返り値を返します。
//2.99C 970324 new
if (txSwitchSub()) {
DWORD ret = txCall(textf,szapi);
txSwitchSub();
return ret;
} else {
return wndtxCallNext(szapi);
}
}
DWORD TXAPI wndtxCallBothEx(mchar *szapi)
{
// ウィンドウ分割中は分割された他方、分割中でなければ次画面のWZのszapiと、
// 現在画面のszapiを呼び出します
// 次画面のウィンドウがあれば現在画面のwndtxCallの返り値、なければ0を返します。
//2.99C 970324 new
if (txSwitchSub()) {
txCall(textf,szapi);
txSwitchSub();
return txCall(textf,szapi);
} else {
return wndtxCallBoth(szapi);
}
}
void TXAPI txWindowMove(tx *text,int x,int y)
{
// ウィンドウ位置を移動します
RECT r;
GetWindowRect(text->hwndbase,&r);
MoveWindow(text->hwndbase,x,y,r.right - r.left,r.bottom - r.top,TRUE);
}
void TXAPI txWindowResize(tx *text,int cx,int cy)
{
// ウィンドウサイズを変更します
RECT r;
GetWindowRect(text->hwndbase,&r);
MoveWindow(text->hwndbase,r.left,r.top,cx,cy,TRUE);
}
void TXAPI txWindowSetPos(tx *text,int x,int y,int cx,int cy)
{
// ウィンドウ位置とサイズを変更します
MoveWindow(text->hwndbase,x,y,cx,cy,TRUE);
}
static int GetEditorWindowCount(void)
{
int ret = 0;
int i;
for (i = 0;i < text->share->nOpen;i++) {
HWND cur = textRead(i);
if (cur && wndtxIsEditor(cur)) ret++;
}
return ret;
}
//##ウィンドウの分割表示
//1.00H
//2.00B TXAPI
void TXAPI GetWorkRect(RECT *r)
{
#ifdef __FLAT__
if (SystemParametersInfo(SPI_GETWORKAREA,sizeof(RECT),r,0)) return;
#endif
r->left = r->top = 0;
r->right = GetSystemMetrics(SM_CXSCREEN);
r->bottom = GetSystemMetrics(SM_CYSCREEN);
}
BOOL TXAPI wndtxMoveWindowTemp(HWND hwnd,int x,int y,int cx,int cy,BOOL fredraw)
{
// オリジナル位置の変更をしないでウィンドウをMoveWindowする
//2.00E5で追加
int i;
wzlock(LOCK_WZPROCESS);
i = textSearch(hwnd);
if (i != -1) {
text1->share->tWzprocess[i].fWndMoving = TRUE;
}
wzunlock(LOCK_WZPROCESS);
//
BOOL ret = MoveWindow(hwnd,x,y,cx,cy,fredraw);
//
wzlock(LOCK_WZPROCESS);
i = textSearch(hwnd);
if (i != -1) {
text1->share->tWzprocess[i].fWndMoving = FALSE;
}
wzunlock(LOCK_WZPROCESS);
return ret;
}
// アイコン化されてる時はMoveWindowしない
// 実行するとアイコンも変に移動してしまう
//1.01A オリジナル位置の変更もしない
static void myMoveWindow(HWND hwnd,int x,int y,int cx,int cy,BOOL fredraw,RECT* rBase)
{
if (!IsIconic(hwnd)) {
#if 1//2.00E txGetWideの改良に伴う変更
#if 1//2.00E5
if (rBase) {
x += rBase->left;
y += rBase->top;
}
wndtxMoveWindowTemp(hwnd,x,y,cx,cy,fredraw);
#else
int i;
wzlock(LOCK_WZPROCESS);
i = textSearch(hwnd);
if (i != -1) {
text1->share->tWzprocess[i].fWndMoving = TRUE;
}
wzunlock(LOCK_WZPROCESS);
{
if (rBase) {
x += rBase->left;
y += rBase->top;
}
MoveWindow(hwnd,x,y,cx,cy,fredraw);
}
wzlock(LOCK_WZPROCESS);
i = textSearch(hwnd);
if (i != -1) {
text1->share->tWzprocess[i].fWndMoving = FALSE;
}
wzunlock(LOCK_WZPROCESS);
#endif
#else
RECT r;
wndtxGetOriginalRect(hwnd,&r);
if (rBase) {
x += rBase->left;
y += rBase->top;
}
MoveWindow(hwnd,x,y,cx,cy,fredraw);
wndtxSetOriginalRect(hwnd,&r);
#endif
}
}
void TXAPI wndtxMoveOriginal(HWND hwnd)
{
//2.95 970128 hwndをオリジナル位置に戻す
RECT r;
wndtxGetOriginalRect(hwnd,&r);
if (IsZoomed(hwnd)) ShowWindow(hwnd,SW_SHOWNORMAL);
MoveWindow(hwnd,r.left,r.top,r.right - r.left,r.bottom - r.top,TRUE);
}
static HWND mytextGetNext(HWND hwnd)
{
//2.99D 970401 NT3.51でWZ Icon常駐で「ウィンドウ|左右に並べる」でWZ Iconのオープンダイアログでた
while(1) {
hwnd = textGetNext(hwnd);
if (!hwnd) break;
if (!IsIconic(hwnd)) break;// アイコン化されてるのは無視(WZ Icon etc)
}
return hwnd;
}
// 'D','d'はtxDup用
void settile(int mode)
{
if (toupper(mode) == 'D') {
text->share->modeSplit = 'V';
} else {
text->share->modeSplit = mode;
}
if (toupper(mode) == 'C') {
//1.00F 「重ねて表示」改良
HWND hwnd = textGetLast();
HWND thwnd[MAXOPEN];
int n = 0;
for (;hwnd;hwnd = textGetPrev(hwnd)) {
if (IsIconic(hwnd)) {
// アイコン化されているものは無視
} else {
if (n == MAXOPEN) break;
thwnd[n++] = hwnd;
}
}
if (mode == 'c') {//1.01A 画面分割前の状態にウィンドウの位置を戻す[ウィンドウ]-[元に戻す]コマンドを追加
int i;
for (i = 0;i < n;i++) {
HWND hwnd = thwnd[i];
wndtxMoveOriginal(hwnd);
}
} else {
int cxd = LOWORD(GetDialogBaseUnits()) * 4;
int cyd = HIWORD(GetDialogBaseUnits()) * 3 / 2;
int x = 0;
int y = 0;
int i;
for (i = 0;i < n;i++) {
HWND hwnd = thwnd[i];
//1.00F2 [ウィンドウ]-[重ねて表示]でウィンドウサイズが全部同じになっていた
SIZE s;
wndtxGetOriginalSize(hwnd,&s);
if (IsZoomed(hwnd)) ShowWindow(hwnd,SW_SHOWNORMAL);
{
RECT r;
GetWorkRect(&r);
if (s.cx == CW_USEDEFAULT) s.cx = r.right - r.left;
if (s.cy == CW_USEDEFAULT) s.cy = r.bottom - r.top;
}
//
myMoveWindow(hwnd,x,y,s.cx,s.cy,TRUE,NULL);
x += cxd;
y += cyd;
}
}
} else {
HWND hwnd = GetDesktopWindow();
HWND thwnd[4] = {0,0,0,0};
int cx,cy;
int i;
int imax = (mode == 'T')? 4:2;
int ncount = text->share->nOpen;
if (imax > ncount) imax = ncount;
// get screen size
RECT rWork;
GetWorkRect(&rWork);
cx = rWork.right - rWork.left;
cy = rWork.bottom - rWork.top;
// for txDup
if (mode == 'D') {
myMoveWindow(text->hwndbase,0,0,cx,cy/2,TRUE,&rWork);
return;
} else if (mode == 'd') {
myMoveWindow(text->hwndbase,0,cy/2,cx,cy/2,FALSE,&rWork);
return;
}
// get screen top wndtx
hwnd = GetWindow(hwnd,GW_CHILD);
// hwnd is TX ?
if (hwndIsText(hwnd) && !GetWindow(hwnd,GW_OWNER)) {
// OK
} else {
hwnd = textGetNext(hwnd);
}
//
for (i = 0;hwnd && i < imax;i++,hwnd = mytextGetNext(hwnd)) {
int x = 0;
int y = 0;
#if 0
//TEST WZ FilerなどがWindow分割されないように
while(1) {
if (wndtxIsEditor(hwnd)) break;
hwnd = textGetNext(hwnd);
if (!hwnd) break;
}
if (!hwnd) break;
#endif
thwnd[i] = hwnd;
//
if (i & 1) x = cx/2;
if (i >= 2) y = cy/2;
if (IsZoomed(hwnd)) ShowWindow(hwnd,SW_SHOWNORMAL);//1.00C
if (imax == 1) {
myMoveWindow(hwnd,x,y,cx,cy,TRUE,&rWork);
} else if (imax == 2) {
if (mode == 'V') {
if (i == 0) {
myMoveWindow(hwnd,0,0,cx,cy/2,TRUE,&rWork);
} else {
myMoveWindow(hwnd,0,cy/2,cx,cy/2,TRUE,&rWork);
}
} else {
myMoveWindow(hwnd,x,y,cx/2,cy,TRUE,&rWork);
}
} else {
myMoveWindow(hwnd,x,y,cx/2,cy/2,TRUE,&rWork);
}
}
#if 1 // 全て前面に出す
for (i = imax;i--;) {
#ifdef __FLAT__//1.97 ウィンドウの順番がおかしかった
HWND hwndbase = thwnd[i];
if (hwndbase) {
if (!SendMessage(hwndbase,WM_TXGETFMESSAGELOOP,0,0)) return;
hwndbase = wndtxGetActive(hwndbase);
if (hwndbase) {
SetActiveWindow(hwndbase);
if (IsIconic(hwndbase)) ShowWindow(hwndbase,SW_RESTORE);//1.00F アイコン化されてるのを戻す様にした
}
}
#else
wndtxSetActive(thwnd[i]);
#endif
}
#endif
}
}
BOOL TXCMDBASE TileH(TX* text)
{
// 横に分割
settile('H');
return TRUE;
}
BOOL TXCMDBASE TileV(TX* text)
{
// 縦に分割
settile('V');
return TRUE;
}
BOOL TXCMDBASE TileOverlap(TX* text)
{
// 重ねて表示
settile('C');
return TRUE;
}
BOOL TXCMDBASE TileUndo(TX* text)
{
// 元に戻す
//1.01A で追加
settile('c');
return TRUE;
}
BOOL TXCMDBASE Tile(TX* text)
{
// 並べて表示
settile('T');
return TRUE;
}
//##ウィンドウコマンド
static void fully(BOOL fMax,BOOL fSetOriginalPos)
{
RECT rWork;
GetWorkRect(&rWork);
RECT r;
GetWindowRect(text->hwndbase,&r);
if (fMax) {// タイトルバーとメニューバーのサイズを引く
RECT rc;
GetClientRect(text->hwndbase,&rc);
ClientToScreen(text->hwndbase,(POINT*)&rc);
int d = (rc.top - r.top) - 2;
rWork.top -= d;
//information("%d %d %d %d",r.left,rWork.top,rectCx(&r),rectCy(&rWork));
}
#if 1//3.00A2 970507
if (fSetOriginalPos) {
txWindowSetPos(text,r.left,rWork.top,rectCx(&r),rectCy(&rWork));
} else {
wndtxMoveWindowTemp(
text->hwndbase,
r.left,rWork.top,rectCx(&r),rectCy(&rWork),
TRUE
);
}
#else
#if 1//2.95 970128 オリジナル位置を変更しない
wndtxMoveWindowTemp(
text->hwndbase,
r.left,rWork.top,rectCx(&r),rectCy(&rWork),
TRUE
);
#else
txWindowSetPos(text,r.left,rWork.top,rectCx(&r),rectCy(&rWork));
#endif
#endif
}
BOOL TXCMDBASE FullY(TX* text)
{
// ウィンドウの高さをフルに
//3.00A2 970507 3.00ではオリジナル位置を変更しなかったが、変更するようにした(WZ2の仕様に戻した)。
fully(FALSE,TRUE);
return TRUE;
}
FullY1
{
// ウィンドウの高さをフルに
// オリジナル位置を変更しない
//3.00A2 970507 new WZ3.00のwindow.FullYと同じ機能を提供
fully(TRUE,FALSE);
}
FullY2
{
// タイトルバーとメニューを消して高さをフルに
fully(TRUE,FALSE);
}
Minimize
{
// アイコン化
//1.00Fで追加
PostMessage(text->hwndbase,WM_SYSCOMMAND,SC_MINIMIZE,0);
}
Maximize
{
// 最大化
//1.00Fで追加
PostMessage(text->hwndbase,WM_SYSCOMMAND,SC_MAXIMIZE,0);
}
Restore
{
// 元のサイズに戻す
//1.00Fで追加
PostMessage(text->hwndbase,WM_SYSCOMMAND,SC_RESTORE,0);
}
TaskList
{
// アプリケーションの切り替え
//1.00Fで追加
PostMessage(text->hwndbase,WM_SYSCOMMAND,SC_TASKLIST,0);
}
Resize
{
// リサイズ開始
//1.00Fで追加
PostMessage(text->hwndbase,WM_SYSCOMMAND,SC_SIZE,0);
}
Move
{
// 移動開始
//1.00Fで追加
PostMessage(text->hwndbase,WM_SYSCOMMAND,SC_MOVE,0);
}
ScreenSave
{
// スクリーンセーバがコントロールパネルで設定してあれば起動
//1.00Fで追加
PostMessage(text->hwndbase,WM_SYSCOMMAND,SC_SCREENSAVE,0);
}
Close
{
// 閉じる
//1.00Fで追加
PostMessage(text->hwndbase,WM_SYSCOMMAND,SC_CLOSE,0);
}
BOOL TXCMDBASE uiQuitAllForce(TX* text)
{
// 全てのWZ窓を強制終了
// マクロを開発していてハングしたときにできる、
// 「ファイル|全てのWZ Editorを閉じる」を実行しても消えない幽霊ウィンドウを
// 閉じるためのコマンドです。
if (question("全てのWZ窓を終了します。保存していないテキストは失われます。よろしいですか?") == IDYES) {
wzlock(LOCK_WZPROCESS);//1.00H5
int i;
for (i = 0;i < text->share->nOpen;i++) {
PostMessage(text->share->tWzprocess[i].hwnd,WM_TXQUIT,0,0);
}
wzunlock(LOCK_WZPROCESS);//1.00H5
return TRUE;
}
return FALSE;
}
//2.90
DoCaption
{
wndtxDoCaption();
}
extern "outline" BOOL tlSetActive(TX* text);
static int GetModeFocus(void)
{
// -1:err 0:本文 1:サブ 2:アウトライン
HWND hwndFocus = GetFocus();
if (!hwndFocus) return -1;
int modeFocus = 0;
TX* textFrame = txGetFrame(text);
if (textFrame->fOutline && GetParent(hwndFocus) == textFrame->hwndOutline) {
modeFocus = 2;
#if 1//2.99C 970325
} else if (txIsFocusSub(text) == TRUE) {
modeFocus = 1;
} else {
modeFocus = 0;
}
#else
} else if (text->hwndtext2) {
modeFocus = text->fFocus2 ? 1 : 0;
} else if (text->text2) {
modeFocus = text->fMultiChild ? 1 : 0;
}
#endif
return modeFocus;
}
static void SetModeFocus(TX* textFrame,int modeFocus)
{
switch(modeFocus) {
case 0: {
#if 1//2.99C 970325
txSetFocusSub(text,FALSE);
#else
if (text->hwndtext2) {
SetFocus(text->hwndtext);
} else if (text->text2 && text->fMultiChild) {
SetFocus(text->text2->hwndtext);
} else {
SetFocus(text->hwndtext);
}
#endif
break;
}
case 1: {
#if 1//2.99C 970325
txSetFocusSub(text,TRUE);
#else
if (text->hwndtext2) {
SetFocus(text->hwndtext2);
} else if (text->text2 && !text->fMultiChild) {
SetFocus(text->text2->hwndtext);
} else {
SetFocus(text->hwndtext);
}
#endif
break;
}
case 2: {
tlSetActive(text);
break;
}
}
}
//2.93
//3.00A4 970509 フォーカスを移動したかどうか返す
switchSub
{
// 本文/サブウィンドウ行き来
int modeFocus = GetModeFocus();
int modeFocus0 = modeFocus;//3.00A4 970509
//statprintf("%d",modeFocus);wait(500);
if (modeFocus < 0) return FALSE;
BOOL fText2 = (text->hwndtext2 || text->text2); // 分割中?
TX* textFrame = txGetFrame(text);
//
modeFocus++;
if (modeFocus == 3) modeFocus = 0;
if (modeFocus == 1 && !fText2) {
// text2がない場合
modeFocus++;
}
if (modeFocus == 2 && !textFrame->fOutline) {
modeFocus = 0;
}
//
if (modeFocus == modeFocus0) {
//3.00A4 970509
return FALSE;
} else {
SetModeFocus(textFrame,modeFocus);
txDispLocate(textf);//2.96 970210 多重化時のウィンドウ切り替えで、スクロールバーのエレベータがフラッシュされなかった
return TRUE;
}
}
BOOL TXCMD biggerSub(TX* text)
{
// 本文/サブウィンドウ拡大
TXBASE_CONTEXT* context = hwndbaseGetContext(text->hwndbase);
BOOL fFocusSub = FALSE;
if (text->hwndtext2) {
if (GetFocus() == text->hwndtext2) {
fFocusSub = TRUE;
}
} else if (text->text2) {
if (text->fMultiChild) {
fFocusSub = TRUE;
}
} else {
return FALSE;
}
int rate = SendMessage(context->hwndPartition,WMPB_GETRATE,0,0);
fFocusSub ? (rate -= 10) : (rate += 10);
if (10 <= rate && rate <= 90) {
//statprintf("%d",rate);
SendMessage(context->hwndPartition,WMPB_SETRATE,rate,0);
}
return TRUE;
}
closeSub
{
// サブウィンドウ閉じる
int modeFocus = GetModeFocus();
if (modeFocus == 2) {
call("outline.sw");
return TRUE;
}
if (txOp(text,TXOP_TXCLOSESUB,0,0)) {
return TRUE;
}
if (text->fOutline) {
call("outline.sw");
return TRUE;
}
return FALSE;
}
#endif