home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
art2
/
src.lzh
/
SCRLWIN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-17
|
31KB
|
1,022 lines
/*
スクロールウィンドウ型の実現部
*/
#define MODULE_SCRLWIN
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <mos.h>
#include "newmsg.h"
#include "scrlwin.h"
int MJ_SCRLWIN = -1;
/* WINDOW型の定数 */
#define CLOSEWX 12
#define CLOSEWY 12
#define RESIZEWX 16
#define RESIZEWY 16
#define TITLEHIGHT (CLOSEWY + 2)
#define FFONTSIZE 12
#define HFONTSIZE (FFONTSIZE/2)
extern int MC_checkMoveFrame40(int, FRAME *) ;
/* SCRLWIN型の定数 */
#define TitleHeight 16
#define SbarWidth 16
#define EraseboxSize 12
/* 部品の新規生成 (id=メタクラス部品の ID) */
#define CREATE(id) MMI_SendMessage((id), MM_NEW, 0)
#define OBJPTR(objId) TL_getObjectPtr(objId)
#define OBJHYP(objId) (*(HYPER *)TL_getObjectPtr(objId)->data)
#define OBJDATA(type,objId) (*(type *)TL_getObjectPtr(objId)->data)
/*--------------------------------------------------------*/
/* ウィンドウ上の各部品の位置・大きさを計算 */
/*--------------------------------------------------------*/
static void getframe_user(FRAME *back, FRAME *org)
{
org->lupx = 1;
org->lupy = 1 + TitleHeight;
/* 大きさ */
org->rdwx = (back->rdwx - back->lupx + 1) - (SbarWidth + 1);
org->rdwy = (back->rdwy - back->lupy + 1) - (SbarWidth + TitleHeight);
}
static void GetFrame_TitleBar(FRAME *back, FRAME *titleFr)
{
titleFr->lupx = back->lupx + 1;
titleFr->lupy = back->lupy + 1;
titleFr->rdwx = back->rdwx - 1;
titleFr->rdwy = back->lupy + 1 + TitleHeight - 1;
}
static void GetFrame_ScrlBarVert(FRAME *back, FRAME *scrlFr)
{
scrlFr->lupx = back->rdwx + 1 - SbarWidth;
scrlFr->lupy = back->lupy + 1 + TitleHeight - 1;
scrlFr->rdwx = back->rdwx;
scrlFr->rdwy = back->rdwy + 1 - SbarWidth;
}
static void GetFrame_ScrlBarHori(FRAME *back, FRAME *scrlFr)
{
scrlFr->lupx = back->lupx;
scrlFr->lupy = back->rdwy + 1 - SbarWidth;
scrlFr->rdwx = back->rdwx + 1 - SbarWidth;
scrlFr->rdwy = back->rdwy;
}
static void GetFrame_TitleMsg(FRAME *back, FRAME *msgFr)
{
msgFr->lupx = back->lupx + TitleHeight + 6;
msgFr->lupy = back->lupy + 1;
msgFr->rdwx = back->rdwx - 1;
msgFr->rdwy = back->lupy + 1 + TitleHeight - 1;
}
static void getframe_resize(FRAME *back, FRAME *resizeFr)
{
resizeFr->lupx = back->rdwx-16+1;
resizeFr->lupy = back->rdwy-16+1;
resizeFr->rdwx = back->rdwx;
resizeFr->rdwy = back->rdwy;
}
static void GetFrame_EraseBox(FRAME *back, FRAME *ersboxFr)
{
ersboxFr->lupx = back->lupx + 1 + 2;
ersboxFr->lupy = back->lupy + 1 + 2;
ersboxFr->rdwx = ersboxFr->lupx + EraseboxSize - 1;
ersboxFr->rdwy = ersboxFr->lupy + EraseboxSize - 1;
}
/*--------------------------------------------------------*/
/* イレーズボタン、スクロールバーの実行関数 */
/*--------------------------------------------------------*/
static int eraseboxFunc(int idObj)
{
int idWin;
idWin = OBJPTR(idObj)->base;
if (idWin >= 0)
{
MMI_SendMessage(idWin, MM_ERASE, 0) ;
MMI_SendMessage(idWin, MM_DETACH, 0) ;
}
else
printf("Warn(<imagewin>eraseboxFunc): 親が見つかりません\n");
return NOERR;
}
static int sbarFunc(int idObj,int idMsg,int nArg,EVENT *pev,int trig)
{
int nWin;
int (*ufunc)();
nWin = OBJPTR(idObj)->base;
if (nWin >= 0)
{
SCRLWIN *pWinData = &OBJDATA(SCRLWIN, nWin);
int nMsg;
ufunc = pWinData->ufunc;
if (idObj == pWinData->idScrlBarHori)
nMsg = MM_HSCROLL;
else
nMsg = MM_VSCROLL;
if (ufunc != 0)
(*ufunc)(nWin, nMsg, nArg, pev, trig);
}
else
printf("Warn(<imagewin>sbarFunc): 親が見つかりません\n");
return NOERR;
}
/*--------------------------------------------------------*/
/* (local) ウィンドウの呼び出し関数の起動 */
/*--------------------------------------------------------*/
/* ウィンドウの呼び出し関数の起動 */
static int ExecCallback(int idObj, int idMsg, int nArg,
EVENT *pEv, int trigger)
{
SCRLWIN *pWin ;
int ret = ILLIGAL_FUNCTION ;
pWin = &OBJDATA(SCRLWIN, idObj);
if (pWin->ufunc != 0)
{
/* トリガ情報を作成する */
if (nArg < 0)
{
trigger = 0 ;
if (pEv != NULL)
{
if (pEv->what == EVMESSAGE) trigger |= MS_EVMSGL40 ;
if (pEv->what == EVTIMER) trigger |= MS_EVTIMERL40 ;
if (pEv->what == EVKEY) trigger |= MS_EVKEYONL40 ;
if (pEv->what == EVMOSMOVE) trigger |= MS_EVMOVEL40 ;
if (pEv->what == EVMOSDRAG) trigger |= MS_EVDRAGL40 ;
}
nArg = 2 ;
}
ret = (*(pWin->ufunc))(idObj, idMsg, nArg, pEv, trigger ) ;
}
return ret ;
}
/* ユーザー領域内での、ウィンドウの呼び出し関数の起動 */
static int WinUser_ExecCallback(int idWin, int idMsg, int nArg,
EVENT *pEv, int flgTrigger)
{
int ret = ILLIGAL_FUNCTION ;
SCRLWIN *pWin ;
pWin = (SCRLWIN *)(TL_getObjectPtr(idWin)->data) ;
if (pWin->org.rdwx && pWin->org.rdwy)
{
FRAME frUser ;
WINCLIP *pWinClip ;
WINCTRL *pWinCtrl ;
/* ユーザ領域の可視範囲と現在のクリップ領域の AND を求める */
frUser.lupx = pWin->fr.lupx + pWin->org.lupx ;
frUser.lupy = pWin->fr.lupy + pWin->org.lupy ;
frUser.rdwx = frUser.lupx + pWin->org.rdwx - 1 ;
frUser.rdwy = frUser.lupy + pWin->org.rdwy - 1 ;
pWinClip = WIN_getClipMemory(&frUser, NULL) ;
pWinClip = WIN_clipWindow( idWin, pWinClip, FALSE ) ;
MMI_GetControl(&pWinCtrl) ; /* 現在のクリップとの and をとる */
pWinClip = WIN_andClip(pWinClip, pWinCtrl->clip);
/* 求めたクリップ領域が空でないなら、
ユーザー領域内でウィンドウの呼び出し関数を起動 */
if (pWinClip != NULL)
{
WINCLIP *pWinClipStack, *pVisibleStack ;
POINT ptUserOrig, ptOriginStack ;
/* 表示枠を設定する */
WIN_pushVisible(WIN_copyClip(pWinClip), &pVisibleStack) ;
WIN_pushClip(pWinClip, &pWinClipStack) ;
/* ユーザ描画領域の左上に描画原点を設定 */
MMI_GetOrigin(&ptUserOrig) ;
AddPt((Point *)&ptUserOrig, (Point *)&(pWin->fr)) ;
AddPt((Point *)&ptUserOrig, (Point *)&(pWin->org)) ;
MG_PushOrigin(&ptUserOrig, &ptOriginStack) ;
/* 呼び出し関数を起動 */
ret = ExecCallback(idWin, idMsg, nArg, pEv, flgTrigger) ;
/* 描画原点、クリップ領域、ビジブル領域を復帰 */
MG_PopOrigin(&ptOriginStack) ;
WIN_popClip(pWinClipStack) ;
WIN_popVisible(pVisibleStack) ;
}
}
return ret ;
}
/* イベントの起こった座標がユーザ領域内なら、呼び出し関数を起動 */
static int WinUser_CheckExecCallback(int idWin, int idMsg, EVENT *pEv)
{
SCRLWIN *pWin ;
FRAME frUser ;
pWin = (SCRLWIN *)(TL_getObjectPtr(idWin)->data) ;
if (pWin->org.rdwx && pWin->org.rdwy)
{
frUser.lupx = pWin->fr.lupx + pWin->org.lupx ;
frUser.lupy = pWin->fr.lupy + pWin->org.lupy ;
frUser.rdwx = frUser.lupx + pWin->org.rdwx - 1 ;
frUser.rdwy = frUser.lupy + pWin->org.rdwy - 1 ;
if (PtInRect((Rect *)&frUser, (Point *)&(pEv->info)))
return WinUser_ExecCallback(idWin, idMsg, UNUSED, pEv, 0) ;
}
return OUTSIDE ;
}
/*---------------------------------------------------------*/
/* (local) 兄弟ウィンドウのアクティブ化/非アクティブ化 */
/*---------------------------------------------------------*/
/* ウィンドウのアクティブ/非アクティブの設定 */
static void SetWinActiveness(int idWin, int bActive)
{
OBJECT *pObj ;
SCRLWIN *pWin ;
WINCLIP *pWinClip;
pWin = (SCRLWIN *)((pObj = TL_getObjectPtr(idWin))->data) ;
if (bActive)
{
pObj->flag |= MS_ACTOBJ ;
OBJDATA(DBUTTONL40, pWin->idTitleBar).clr.back = 0;
}
else
{
pObj->flag &= (~MS_ACTOBJ) ;
OBJDATA(DBUTTONL40, pWin->idTitleBar).clr.back = 7;
}
if (pObj->flag & MS_DSP)
{
MG_mosDisp(2) ;
WIN_beginUpDateObj(pWin->idTitleBar, &pWinClip);
MMI_SendMessage(pWin->idTitleBar, MM_SHOW, 0);
MMI_SendMessage(pWin->idTitleMsg, MM_SHOW, 0);
MMI_SendMessage(pWin->idEraseBox, MM_SHOW, 0);
WIN_endUpDateObj(pWinClip);
MG_mosDisp(3) ;
}
}
/* 指定されたウィンドウ以外を非アクティブにする */
static void SetBrotherWins_NoActive(int idWin)
{
int idObj1, idObj2 ;
for (idObj1 = idWin ;
(idObj2 = TL_getObjectPtr(idObj1)->llevel) != idWin ;
idObj1 = idObj2 )
{
if (MTL_isMetaClass(idObj2, MJ_SCRLWIN))
if (MTL_checkFlagObj(idObj2, (MS_ACTOBJ|MS_DSP)) ==
(MS_ACTOBJ|MS_DSP))
{
SetWinActiveness(idObj2, FALSE) ;
ExecCallback(idObj2, MM_SLEEP, UNUSED, NULL, 0) ;
}
}
}
/* 指定されたウィンドウを非アクティブにする */
static int SetWin_NoActive(int idObj)
/* ウィンドウの呼び出し関数を呼ぶ前に呼び出すこと */
/* 返り値・次にアクティブにするべきウィンドウの ID */
{
int idObj1, idObj2 ;
OBJECT *pObj ;
pObj = TL_getObjectPtr(idObj) ;
if (pObj->flag & MS_ACTOBJ)
{
if (TL_checkMmiModeFlag(MS_WINMOVE) == 0)
{
pObj->flag &= (~MS_ACTOBJ) ;
for (idObj1 = idObj;
(idObj2 = TL_getObjectPtr(idObj1)->rlevel) != idObj;
idObj1 = idObj2)
{
if (MTL_isMetaClass(idObj2, MJ_SCRLWIN))
if (MTL_checkFlagObj(idObj2, MS_DSP))
return idObj2;
}
}
}
return -1;
}
/*--------------------------------------------------------*/
/* ウィンドウの生成 */
/*--------------------------------------------------------*/
int SCRLWIN_NEW_func(int mobj, int idMsg, int nArg)
{
static DBUTTONL40 data_TitleBar =
{ MS_DSPONLYL40,{0,0,0,0},{0,7,0}, MS_FRAMEL40 | MS_UFRAMEL40,
0, 0 };
static MSGL40 data_TitleMsg =
{ MS_LEFTL40| MS_DSPONLYL40, {0,0,0,0}, {0,0,15},
MS_NONEL40, "", 1, 12,12, MS_NONEL40, 0, 0 } ;
static DBUTTONL40 data_EraseBox =
{ MS_BTLEFTL40 | MS_EVMOSOFFL40 | MS_EVKEYONL40,
{0,0,0,0},{0,7,0}, MS_PANELL40,
eraseboxFunc, 0 };
static SCRLL40 data_ScrlBarVert =
{ MS_BTLEFTL40| MS_REPEATL40| MS_EVMOSONL40,
{0,0,0,0}, {0,7,7}, MS_FRAMEL40|MS_PANELL40,
sbarFunc, 0,0,100,10,1, IUPARROW, IDOWNARROW };
static SCRLL40 data_ScrlBarHori =
{ MS_BTLEFTL40| MS_REPEATL40| MS_EVMOSONL40| MS_HORIL40,
{0,0,0,0}, {0,7,7}, MS_FRAMEL40|MS_PANELL40,
sbarFunc, 0,0,100,10,1, ILEFTARROW, IRIGHTARROW };
int id, idScrlWin;
SCRLWIN *pScrlWin;
DBUTTONL40 *pDBUTTONL40;
SCRLL40 *pSCRLL40;
MSGL40 *pMSGL40;
extern int ML_NewHyper(int, int, int);
if ((idScrlWin = ML_NewHyper(mobj, idMsg, nArg)) < 0)
return idScrlWin;
pScrlWin = &OBJDATA(SCRLWIN, idScrlWin);
#define WIN (*pScrlWin)
/* ユーザー領域の設定 */
getframe_user(&WIN.fr, &WIN.org);
/* 部品生成・アタッチのためのマクロ定義 */
#define CREATE_AND_ATTACH(NAME, TYPE) \
{ if ((id = CREATE(MJ_##TYPE)) < 0) \
return id; \
p##TYPE = & OBJDATA(TYPE, id); \
*p##TYPE = data_##NAME; \
GetFrame_##NAME(&WIN.fr, &p##TYPE->fr); \
MMI_SendMessage(id, MM_ATTACH, 1, idScrlWin); \
WIN.id##NAME = id; }
/* 各部品の生成・アタッチ */
CREATE_AND_ATTACH(TitleBar, DBUTTONL40)
CREATE_AND_ATTACH(TitleMsg, MSGL40)
CREATE_AND_ATTACH(EraseBox, DBUTTONL40)
CREATE_AND_ATTACH(ScrlBarVert, SCRLL40)
CREATE_AND_ATTACH(ScrlBarHori, SCRLL40)
/* おわり */
#undef WIN
return idScrlWin;
}
/*--------------------------------------------------------*/
/* ウィンドウのERASE */
/*--------------------------------------------------------*/
/* 処理内容は WINDOWL40 型と同じだが、
呼び出し関数内で自身を DESTROY してもよいようにした */
static int SCRLWIN_ERASE_func(int idObj, int idMsg, int nArg)
{
int ret ;
int wakeId ;
ret = MMI_SuperSendMessage(MJ_DIALOGL40, idObj, idMsg, nArg) ;
if (TL_checkMmiModeFlag(MS_WINMOVE) == 0)
/* ウィンドウの移動/リサイズによって消去したのでなければ */
{
wakeId = SetWin_NoActive(idObj);
ExecCallback(idObj, MM_ERASE, UNUSED, NULL, 0) ;
if (wakeId >= 0)
{
SetWinActiveness(wakeId, TRUE);
ExecCallback(wakeId, MM_WAKE, UNUSED, NULL, 0) ;
}
}
return ret ;
}
/*--------------------------------------------------------*/
/* ウィンドウの WAKE / SLEEP */
/*--------------------------------------------------------*/
static void SetWinWakeness(int idWin, int flag)
{
OBJECT *pWinObj ;
SCRLWIN *pWin ;
int wakeId ;
int base ;
WINCLIP *pwclps ;
WINCLIP *pwclpd ;
pWin = (SCRLWIN *)((pWinObj = TL_getObjectPtr(idWin))->data) ;
wakeId = UNUSED ;
if (flag)
{
if ((pWinObj->flag & MS_ACTOBJ) == 0)
{
wakeId = idWin;
SetBrotherWins_NoActive(wakeId) ;
SetWinActiveness(wakeId, TRUE) ;
}
}
else
{
if (pWinObj->flag & MS_ACTOBJ)
{
wakeId = SetWin_NoActive(idWin) ;
SetWinActiveness(idWin, FALSE) ;
ExecCallback(idWin, MM_SLEEP, UNUSED, NULL, 0) ;
}
}
/* ライズ前の表示範囲を求める */
pwclps = WIN_getClipMemory(&(pWin->fr), NULL) ;
pwclpd = WIN_copyClip(pwclps) ;
pwclps = WIN_clipWindow(idWin, pwclps, FALSE) ;
/* ウィンドウをライズ(最前面に移動)する */
base = pWinObj->base ;
MMI_SendMessage(idWin, MM_DETACH, 0) ;
MMI_SendMessage(idWin, MM_ATTACH, 2, base, (flag) ? -1 : 0) ;
/* ライズ後の表示範囲から、再表示の必要のある領域を得る */
pwclpd = WIN_clipWindow(idWin, pwclpd, FALSE) ;
/* 再描画 */
MMI_SendMessage(idWin, MM_UPDATE, 1, (flag) ?
(pwclpd = WIN_removeClip(pwclpd, pwclps)) :
(pwclps = WIN_removeClip(pwclps, pwclpd)));
/* クリップ領域を開放 */
WIN_freeClipMemory(pwclpd) ;
WIN_freeClipMemory(pwclps) ;
/* 呼び出し関数を起動 */
if (wakeId > 0)
ExecCallback(wakeId, MM_WAKE, UNUSED, NULL, 0) ;
}
static int SCRLWIN_WAKE_func(int idObj)
{
SetWinWakeness(idObj, TRUE);
return NOERR;
}
static int SCRLWIN_SLEEP_func(int idObj)
{
SetWinWakeness(idObj, FALSE);
return NOERR;
}
/*--------------------------------------------------------*/
/* マウスがクリックされた場合 (MOSON) */
/*--------------------------------------------------------*/
/* リサイズ処理 */
static int resize(int idScrlWin, EVENT *pev)
/* リサイズ処理が行われたなら 1 を返す */
{
SCRLWIN *pScrlWin;
HYPER hypWin;
WINCLIP *pWinClip ;
/* 各種情報を取得 */
pScrlWin = &OBJDATA(SCRLWIN, idScrlWin);
hypWin = *((HYPER *)pScrlWin);
MG_SizeBoxL40( &hypWin, TRUE ) ; /* ウインドウの内枠を求める */
/* ウィンドウにリサイズボックスがないなら何もせず終了 */
if ((pScrlWin->atr & MS_RESIZEL40) == 0)
return 0;
/* リサイズボックスの描画のためのハイパ構造体を作成 */
static HYPER hypResize =
{ MS_NONEL40,{0},{0}, MS_PANELL40| MS_FRAMEL40| MS_INVERTL40 };
hypResize.clr = pScrlWin->clr ;
/* リサイズボックスの表示範囲を求める */
int nFrWid;
nFrWid = (pScrlWin->atrm & MS_FRAMEL40) ? 1 : 0 ;
#define WIN_FR hypWin.fr
hypResize.fr.lupx = WIN_FR.rdwx - RESIZEWX + 1 + nFrWid ;
hypResize.fr.lupy = WIN_FR.rdwy - RESIZEWY + 1 + nFrWid ;
hypResize.fr.rdwx = WIN_FR.rdwx + nFrWid ;
hypResize.fr.rdwy = WIN_FR.rdwy + nFrWid ;
#undef WIN_FR
/* リサイズボックスの中でないならなにもせず終了 */
if (PtInRect((Rect *)&(hypResize.fr), (Point *)&(pev->info)) == 0)
return 0;
/* リサイズボックスの押下状態を描画 */
#define DRAW_RESIZEBTN(bPush) \
{ MG_mosDisp(2) ; \
WIN_beginUpDateObj(idScrlWin, &pWinClip) ; \
MG_DspBoxL40((HYPER *)&hypResize, TRUE, bPush) ; \
WIN_endUpDateObj(pWinClip) ; \
MG_mosDisp(3) ; }
DRAW_RESIZEBTN(TRUE);
/* ウィンドウ枠をXOR で表示しながらリサイズ入力 */
FRAME frOrig;
FRAME frResult;
frResult = frOrig = pScrlWin->fr ;
MG_ReSizeFrame(&frResult, pev, FRIGHTDOWN, &(pScrlWin->size)) ;
/* リサイズボックスの非押下状態を描画 */
DRAW_RESIZEBTN(FALSE);
/* サイズが変わっていなかったら、なにもせず正常終了 */
if (MC_checkMoveFrame40(idScrlWin, &frResult) == 0)
return 1;
/* 再描画の準備 */
char *pSave ;
TL_setWinMoveFlag() ; /* SHOW時の V.E.を無効にする */
if ((pSave = pScrlWin->save) != NULL)
MMI_SendMessage(idScrlWin, MM_ERASE, 0) ;
/* ウィンドウの大きさを再設定 */
MMI_SendMessage(idScrlWin, MM_SETFRAME, 1, &frResult);
/* 再描画のためのクリップ領域を設定 */
FRAME saveFr ;
saveFr = pScrlWin->fr ;
UnionRect((Rect *)&frOrig, (Rect *)&frResult) ;
pScrlWin->fr = frOrig ;
WIN_beginUpDateObj(idScrlWin, &pWinClip) ;
pScrlWin->fr = saveFr ;
/* 再描画 */
ExecCallback(idScrlWin, MM_UPDATE, UNUSED, pev, 0) ;
if (pSave == NULL)
{
WINCTRL *pctrl ;
MMI_GetControl(&pctrl) ;
MMI_SendMessage(idScrlWin,MM_UPDATE,1,pctrl->clip) ;
}
/* 再描画の終了 */
WIN_endUpDateObj(pWinClip) ;
if (pSave)
MMI_SendMessage(idScrlWin, MM_SHOW, 0) ;
TL_resetWinMoveFlag() ;
return 1;
}
int SCRLWIN_MOSON_func(int idScrlWin, int idMsg, int nArg, EVENT *pev)
{
int ret ;
register OBJECT *pObj ;
register SCRLWIN *pScrlWin ;
pScrlWin = (SCRLWIN *)((pObj = TL_getObjectPtr(idScrlWin))->data) ;
if (((pScrlWin->atr &(MS_BTLEFTL40|MS_BTRIGHTL40)) &
((pev->shift) << 22)) == 0)
return NOERR ;
if (pObj->flag & MS_ACTOBJ)
/* WAKE 状態のウィンドウの場合 */
{
if (resize(idScrlWin, pev))
return NOERR; /* リサイズ処理が正常終了した */
if (WinUser_CheckExecCallback(idScrlWin, idMsg, pev) < NOERR)
{
/* ユーザ領域外なので、ダイアログクラスとして移動チェック */
TL_setWinMoveFlag() ; /* SHOW時の V.E.無効化 */
POINT orgDisp ;
orgDisp = *(POINT *)&(pScrlWin->fr) ;
ret = MMI_SuperSendMessage(MJ_DIALOGL40,
idScrlWin, idMsg, nArg, pev) ;
/* 移動したなら、MOVE 処理 */
if (*(int *)&(pScrlWin->fr) != *(int *)&(orgDisp))
ExecCallback(idScrlWin, MM_MOVE, UNUSED, NULL, 0) ;
TL_resetWinMoveFlag() ;
return ret ;
}
}
else
/* SLEEP状態のウィンドウの場合 */
{
register int mosTime ;
EVENT *pnev ;
mosTime = MOS_getTime() ;
/* アクティブなウインドウを設定し画面の上に持ってくる. */
MMI_SendMessage(idScrlWin, MM_WAKE, 0) ;
/* ディレイ */
do
{
MMI_iosense() ;
if (MMI_SnsEvnt(EVALL, &pnev) == 0)
{
if ((pnev->what != EVMOSUP)||
(((pnev->shift & (SRIGHTBTN|SLEFTBTN)) &
(pev->shift & (SRIGHTBTN|SLEFTBTN))) == 0))
break ;
return NOERR ;
}
} while ((MOS_getTime() - mosTime) <= REPEAT_TIME2) ;
/* イベントの再実行はしない */
// MMI_ExecEvnt(pev) ;
}
return NOERR ;
}
/*--------------------------------------------------------*/
/* ウィンドウの属性の設定・取得 */
/*--------------------------------------------------------*/
int SCRLWIN_SETHYPER_func(int idObj, int idMsg, int nArg, HYPER *hyp)
{
SCRLWIN *data;
data = &OBJDATA(SCRLWIN, idObj);
OBJHYP(idObj) = *hyp;
getframe_user(&hyp->fr, &data->org);
GetFrame_TitleBar(&hyp->fr, &OBJHYP(data->idTitleBar).fr);
GetFrame_TitleMsg(&hyp->fr, &OBJHYP(data->idTitleMsg).fr);
GetFrame_EraseBox(&hyp->fr, &OBJHYP(data->idEraseBox).fr);
GetFrame_ScrlBarVert(&hyp->fr, &OBJHYP(data->idScrlBarVert).fr);
GetFrame_ScrlBarHori(&hyp->fr, &OBJHYP(data->idScrlBarHori).fr);
return NOERR ;
}
static int SCRLWIN_SETUSER_func(kobj, messId, argc, org, size)
int kobj ;
int messId ;
int argc ;
FRAME *org ;
FRAME *size ;
{
register WINDOWL40 *pwin ;
pwin = (WINDOWL40 *)(TL_getObjectPtr(kobj)->data) ;
pwin->org = *org ;
pwin->size = *size ;
return NOERR ;
}
static int SCRLWIN_GETUSER_func(kobj, messId, argc, org, size)
int kobj ;
int messId ;
int argc ;
FRAME *org ;
FRAME *size ;
{
register WINDOWL40 *pwin ;
pwin = (WINDOWL40 *)(TL_getObjectPtr(kobj)->data) ;
*org = pwin->org ;
*size = pwin->size ;
return NOERR ;
}
int SCRLWIN_SETEXEC_func(int idObj, int idMsg,int nArg, int (*f)())
{
OBJDATA(SCRLWIN, idObj).ufunc = f;
return NOERR;
}
int SCRLWIN_SETATR_func(int idObj, int idMsg, int nArg, int atr)
{
((HYPER*)(TL_getObjectPtr(idObj)->data))->atr = atr;
return NOERR;
}
int SCRLWIN_GETATR_func(int idObj, int idMsg, int nArg, int *atr)
{
*atr = ((HYPER*)(TL_getObjectPtr(idObj)->data))->atr;
return NOERR;
}
int SCRLWIN_SETFRAME_func(int idObj, int idMsg, int nArg, FRAME *fr)
{
HYPER hyp;
MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
hyp.fr = *fr;
MMI_SendMessage(idObj, MM_SETHYPER, 1, &hyp);
return NOERR;
}
int SCRLWIN_GETFRAME_func(int idObj, int idMsg, int nArg, FRAME *fr)
{
HYPER hyp;
MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
*fr = hyp.fr;
return NOERR;
}
int SCRLWIN_dummy_func()
{
return NOERR;
}
int SCRLWIN_SETMSG_func(int kobj, int messId, int argc, char *string)
{
int id;
id = OBJDATA(SCRLWIN, kobj).idTitleMsg;
MMI_SendMessage(id, messId, argc, string);
return NOERR ;
}
/*--------------------------------------------------------*/
/* スクロールバーの設定・状態取得 */
/*--------------------------------------------------------*/
int SCRLWIN_SETHSCROLL_func(int idObj, int idMsg, int nArg,
int bRedraw,int nPos,int nMin,int nMax,int nLen,int nPageSkip)
/*
nArg:
1 (bRedraw のみ) 再描画だけを行う場合
2 (nPos まで) 位置の設定だけ
4 (nMax まで) 範囲の設定
6 全部設定
*/
{
int nPos2, nMin2, nMax2, nLen2, nPageSkip2;
int idSbar;
idSbar = OBJDATA(SCRLWIN, idObj).idScrlBarHori;
MMI_SendMessage(idSbar, MM_GETSCROLL, 5,
&nPos2, &nMin2, &nMax2, &nLen2, &nPageSkip2);
if (nArg >= 2) nPos2 = nPos;
if (nArg >= 3) nMin2 = nMin;
if (nArg >= 4) nMax2 = nMax;
if (nArg >= 5) nLen2 = nLen;
if (nArg >= 6) nPageSkip2 = nPageSkip;
MMI_SendMessage(idSbar, MM_SETSCROLL, 5,
nPos2, nMin2, nMax2, nLen2, nPageSkip2);
if (bRedraw)
MMI_SendMessage(idSbar, MM_SHOW, 0);
return NOERR;
}
int SCRLWIN_SETVSCROLL_func(int idObj, int idMsg, int nArg,
int bRedraw,int nPos,int nMin,int nMax,int nLen,int nPageSkip)
{
int nPos2, nMin2, nMax2, nLen2, nPageSkip2;
int idSbar;
idSbar = OBJDATA(SCRLWIN, idObj).idScrlBarVert;
MMI_SendMessage(idSbar, MM_GETSCROLL, 5,
&nPos2, &nMin2, &nMax2, &nLen2, &nPageSkip2);
if (nArg >= 2) nPos2 = nPos;
if (nArg >= 3) nMin2 = nMin;
if (nArg >= 4) nMax2 = nMax;
if (nArg >= 5) nLen2 = nLen;
if (nArg >= 6) nPageSkip2 = nPageSkip;
MMI_SendMessage(idSbar, MM_SETSCROLL, 5,
nPos2, nMin2, nMax2, nLen2, nPageSkip2);
if (bRedraw)
MMI_SendMessage(idSbar, MM_SHOW, 0);
return NOERR;
}
int SCRLWIN_GETHSCROLL_func(int idObj, int idMsg, int nArg,
int *pnPos, int *pnMin, int *pnMax, int *pnLen, int *pnPageSkip)
{
int nPos2, nMin2, nMax2, nLen2, nPageSkip2;
int idSbar;
idSbar = OBJDATA(SCRLWIN, idObj).idScrlBarHori;
MMI_SendMessage(idSbar, MM_GETSCROLL, 5,
&nPos2,&nMin2,&nMax2,&nLen2,&nPageSkip2);
if (nArg >= 1 && pnPos != NULL)
*pnPos = nPos2;
if (nArg >= 2 && pnMin != NULL)
*pnMin = nMin2;
if (nArg >= 3 && pnMax != NULL)
*pnMax = nMax2;
if (nArg >= 4 && pnLen != NULL)
*pnLen = nLen2;
if (nArg >= 5 && pnPageSkip != NULL)
*pnPageSkip = nPageSkip2;
return NOERR;
}
int SCRLWIN_GETVSCROLL_func(int idObj, int idMsg, int nArg,
int *pnPos, int *pnMin, int *pnMax, int *pnLen, int *pnPageSkip)
{
int nPos2, nMin2, nMax2, nLen2, nPageSkip2;
int idSbar;
idSbar = OBJDATA(SCRLWIN, idObj).idScrlBarVert;
MMI_SendMessage(idSbar, MM_GETSCROLL, 5,
&nPos2,&nMin2,&nMax2,&nLen2,&nPageSkip2);
if (nArg >= 1 && pnPos != NULL)
*pnPos = nPos2;
if (nArg >= 2 && pnMin != NULL)
*pnMin = nMin2;
if (nArg >= 3 && pnMax != NULL)
*pnMax = nMax2;
if (nArg >= 4 && pnLen != NULL)
*pnLen = nLen2;
if (nArg >= 5 && pnPageSkip != NULL)
*pnPageSkip = nPageSkip2;
return NOERR;
}
int SCRLWIN_SETHSCROLLRANGE_func(int idObj, int idMsg, int nArg,
int dispLen, int containLen, int bRedraw)
{
int nPos, nMin, nMax, nLen, nPageSkip;
MMI_SendMessage(idObj, MM_GETHSCROLL, 5,
&nPos, &nMin, &nMax, &nLen, &nPageSkip);
nPos -= nMin;
nMin = dispLen-1;
nMax = (dispLen > containLen ? dispLen-1 : containLen-1);
nLen = dispLen;
nPos = _min(nMin + nPos, nMax);
MMI_SendMessage(idObj, MM_SETHSCROLL, 6, bRedraw,
nPos, nMin, nMax, nLen, nPageSkip);
return NOERR;
}
int SCRLWIN_SETVSCROLLRANGE_func(int idObj, int idMsg, int nArg,
int dispLen, int containLen, int bRedraw)
{
int nPos, nMin, nMax, nLen, nPageSkip;
MMI_SendMessage(idObj, MM_GETVSCROLL, 5,
&nPos, &nMin, &nMax, &nLen, &nPageSkip);
nPos -= nMin;
nMin = dispLen-1;
nMax = (dispLen > containLen ? dispLen-1 : containLen-1);
nLen = dispLen;
nPos = _min(nMin + nPos, nMax);
MMI_SendMessage(idObj, MM_SETVSCROLL, 6, bRedraw,
nPos, nMin, nMax, nLen, nPageSkip);
return NOERR;
}
/*--------------------------------------------------------*/
/* ウィンドウ上かどうかを調べる */
/*--------------------------------------------------------*/
static int SCRLWIN_ONWIN_func(int idWin, int idMsg, int nArg, EVENT *pEv)
{
OBJECT *pWinObj ;
HYPER hyp ;
pWinObj = TL_getObjectPtr(idWin) ;
/* 選択不能な部品は検索できない */
if ((pWinObj->flag & MS_UNSELECT)||
(((SCRLWIN *)(pWinObj->data))->atr & MS_INACTIVEL40))
return OBJECT_NOT_FOUND ;
/* アクティブになっているものはスレーブ検索をする */
if (pWinObj->flag & MS_ACTOBJ)
return MMI_SuperSendMessage(MJ_HYPER, idWin, idMsg, nArg, pEv) ;
/* オブジェクト内ならばIDを返す */
hyp = *((HYPER *)(pWinObj->data)) ;
MG_SizeBoxL40(&hyp, ENABLE) ;
if (MMI_CheckInsideFrame(&(hyp.fr), (POINT *)(&(pEv->info))) < NOERR)
return OUTSIDE ;
return idWin ;
}
/*--------------------------------------------------------*/
/* ウィンドウの UPDATE */
/*--------------------------------------------------------*/
int SCRLWIN_UPDATE_func(int idObj, int idMsg, int nArg,
WINCLIP *pWinclip, int arg2)
{
if (nArg == 0)
{
WINCLIP *pWinclip2;
FRAME frWin, frUser;
frWin = OBJDATA(SCRLWIN, idObj).fr;
getframe_user(&frWin, &frUser);
frUser.lupx += frWin.lupx;
frUser.lupy += frWin.lupy;
frUser.rdwx = frUser.lupx + frUser.rdwx - 1;
frUser.rdwy = frUser.lupy + frUser.rdwy - 1;
pWinclip2 = WIN_getClipMemory(&frUser, NULL);
MMI_SuperSendMessage(MJ_WINDOWL40, idObj, idMsg, 1, pWinclip2);
WIN_freeClipMemory(pWinclip2);
}
else
{
MMI_SuperSendMessage(MJ_WINDOWL40, idObj, idMsg, nArg,
pWinclip, arg2);
}
return NOERR;
}
/*--------------------------------------------------------*/
/* 任意のデータの登録 */
/*--------------------------------------------------------*/
int SCRLWIN_SETDATA_func(int idObj, int idMsg, int nArg, void *data)
{
OBJDATA(SCRLWIN, idObj).data = data;
return NOERR;
}
int SCRLWIN_GETDATA_func(int idObj, int idMsg, int nArg, void **data)
{
*data = OBJDATA(SCRLWIN, idObj).data;
return NOERR;
}
/*--------------------------------------------------------*/
/* クラスの初期化 */
/*--------------------------------------------------------*/
#define METHODNUM 26
int (*SCRLWINmethods[METHODNUM])() = {
SCRLWIN_NEW_func,
SCRLWIN_SETHYPER_func,
SCRLWIN_SETUSER_func,
SCRLWIN_GETUSER_func,
SCRLWIN_ERASE_func,
SCRLWIN_WAKE_func,
SCRLWIN_SLEEP_func,
SCRLWIN_MOSON_func,
SCRLWIN_SETEXEC_func,
SCRLWIN_SETATR_func,
SCRLWIN_GETATR_func,
SCRLWIN_SETFRAME_func,
SCRLWIN_GETFRAME_func,
SCRLWIN_SETMSG_func,
SCRLWIN_dummy_func,
SCRLWIN_dummy_func,
SCRLWIN_SETHSCROLL_func,
SCRLWIN_SETVSCROLL_func,
SCRLWIN_GETHSCROLL_func,
SCRLWIN_GETVSCROLL_func,
SCRLWIN_SETHSCROLLRANGE_func,
SCRLWIN_SETVSCROLLRANGE_func,
SCRLWIN_ONWIN_func,
SCRLWIN_SETDATA_func,
SCRLWIN_GETDATA_func,
SCRLWIN_UPDATE_func
};
char *SCRLWINmsgs[METHODNUM] = {
MT_NEW,
MT_SETHYPER,
MT_SETUSER,
MT_GETUSER,
MT_ERASE,
MT_WAKE,
MT_SLEEP,
MT_MOUSEON,
MT_SETEXEC,
MT_SETATR,
MT_GETATR,
MT_SETFRAME,
MT_GETFRAME,
MT_SETMSG,
MT_HSCROLL,
MT_VSCROLL,
MT_SETHSCROLL,
MT_SETVSCROLL,
MT_GETHSCROLL,
MT_GETVSCROLL,
MT_SETHSCROLLRANGE,
MT_SETVSCROLLRANGE,
MT_ONPARTS,
MT_SETDATA,
MT_GETDATA,
MT_UPDATE
};
int MMI_initScrollWindow()
{
MJ_SCRLWIN = MMI_AddType(MJ_WINDOWL40, METHODNUM, sizeof(SCRLWIN),
SCRLWINmethods, SCRLWINmsgs);
if (MJ_SCRLWIN < NOERR)
return MJ_SCRLWIN;
MM_SETUSER = TL_teachHash(MT_SETUSER) ;
MM_GETUSER = TL_teachHash(MT_GETUSER) ;
MM_SETEXEC = TL_teachHash(MT_SETEXEC) ;
MM_SETMSG = TL_teachHash(MT_SETMSG) ;
MM_SETATR = TL_teachHash(MT_SETATR);
MM_GETATR = TL_teachHash(MT_GETATR);
MM_SETFRAME = TL_teachHash(MT_SETFRAME);
MM_GETFRAME = TL_teachHash(MT_GETFRAME);
MM_VSCROLL = TL_teachHash(MT_VSCROLL);
MM_HSCROLL = TL_teachHash(MT_HSCROLL);
MM_SETHSCROLL = TL_teachHash(MT_SETHSCROLL);
MM_SETVSCROLL = TL_teachHash(MT_SETVSCROLL);
MM_GETHSCROLL = TL_teachHash(MT_GETHSCROLL);
MM_GETVSCROLL = TL_teachHash(MT_GETVSCROLL);
MM_SETHSCROLLRANGE = TL_teachHash(MT_SETHSCROLLRANGE);
MM_SETVSCROLLRANGE = TL_teachHash(MT_SETVSCROLLRANGE);
MM_SETDATA = TL_teachHash(MT_SETDATA);
MM_GETDATA = TL_teachHash(MT_GETDATA);
SCRLWIN *skel;
skel = (SCRLWIN *) ( TL_getObjectPtr(MJ_SCRLWIN)->data );
skel->atr = MS_BTLEFTL40 | MS_EVMOSONL40 | MS_RESIZEL40;
skel->fr.lupx = 0;
skel->fr.lupy = 0;
skel->fr.rdwx = 127;
skel->fr.rdwy = 95;
skel->clr.fr = 0;
skel->clr.back = 7;
skel->clr.ch = 0;
skel->atrm = MS_FRAMEL40 | MS_BFRAMEL40;
skel->save = NULL;
skel->ve = 0;
skel->se = 0;
static FRAME org = { 0,0,0,0 };
skel->org = org;
static FRAME size = { 0,0,9999,9999 };
skel->size = size;
skel->ufunc = 0;
skel->tmsg = NULL;
return NOERR;
}
/* [end] */