home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
status.zip
/
UFSTAT.C
< prev
next >
Wrap
Text File
|
1995-04-20
|
15KB
|
528 lines
#define INCL_PM
#define INCL_GPI
#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "status.ext"
#include "status.ids"
#include "status.h"
#include "clr_bits.h"
PFNWP OldFrameProc;
STATPARMS stparms={
26, 3, TRUE, TRUE, TRUE, CLR_PALEGRAY, CLR_BLUE,
CLR_BLACK, CLR_DARKGRAY, CLR_WHITE, DT_CENTER, "Hi"};
VOID PaintFancy(HWND, HPS, PSTATPARMS);
/**************************************************************/
/* this window proc is for a window created during UfMainCreate */
/* It has a pre-defined global handle 'hwndStatus' in status.h */
MRESULT EXPENTRY StatusProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
{
PSTATPARMS pStat= NULL;
/* avoid getting a NULL pointer. OS/2 doesn't like them! */
if(msg != WM_CREATE)
pStat=(PSTATPARMS)WinQueryWindowULong(hwnd,QWL_USER);
else
pStat= &stparms;
if(!pStat)
pStat= &stparms;
switch(msg){
case WM_USER_SETVAL:
switch((SHORT)mp1){
case ST_SIZESHADOW:
pStat->usShadow= (SHORT)mp2;
pStat->height=
pStat->usTextAreaHeight + 2*pStat->usShadow;
WinSendMsg(
WinQueryWindow(hwnd, QW_PARENT),
WM_UPDATEFRAME,0L,0L);
break;
case ST_BORDER:
pStat->fBorder= (BOOL)mp2;
break;
case ST_INOUT:
pStat->f3DOut= (BOOL)mp2;
break;
case ST_TEXTCOLOR:
pStat->TextColor= (LONG)mp2;
break;
case ST_BORDERCOLOR:
pStat->BorderColor= (LONG)mp2;
break;
case ST_BACKCOLOR:
pStat->BackColor= (LONG)mp2;
break;
case ST_SHADOWDARKCOLOR:
pStat->ShadowDark= (LONG)mp2;
break;
case ST_SHADOWLIGHTCOLOR:
pStat->ShadowLight= (LONG)mp2;
break;
case ST_TEXTALIGN:
pStat->usAlign= (USHORT)mp2;
break;
case ST_POSITION:
pStat->fTop= (BOOL)mp2;
WinSendMsg(
WinQueryWindow(hwnd, QW_PARENT),
WM_UPDATEFRAME,0L,0L);
break;
}
WinInvalidateRect(hwnd, NULL, FALSE);
break;
case WM_USER_SETTEXT:
{
HPS hps;
RECTL rcl;
if( strlen((PSZ)mp1) >= STAT_TEXT_LEN )
*(((PSZ)mp1)+STAT_TEXT_LEN -1) = 0;
strcpy(pStat->achText, (PSZ)mp1);
WinQueryWindowRect(hwnd, &rcl);
/* shrink 'rcl' so as not to paint the shadow/border */
rcl.yBottom += pStat->usShadow;
rcl.yTop -= pStat->usShadow;
rcl.xLeft += (pStat->usShadow+5);
rcl.xRight -= (pStat->usShadow+5);
hps= WinGetPS(hwnd);
WinDrawText(
hps, -1, pStat->achText, &rcl,pStat->TextColor,
pStat->BackColor,pStat->usAlign | DT_VCENTER | DT_ERASERECT);
WinReleasePS(hps);
}
break;
case WM_CONTEXTMENU:
ShowStatParms((PVOID)NULL);
break;
case WM_PAINT:
{
RECTL rcl;
HPS hps;
WinQueryWindowRect(hwnd, &rcl);
/* shrink 'rcl' so as not to paint the shadow/border */
rcl.yBottom += pStat->usShadow;
rcl.yTop -= pStat->usShadow;
/* keep the text away from the edges */
rcl.xLeft += (pStat->usShadow+5);
rcl.xRight -= (pStat->usShadow+5);
hps= WinBeginPaint(hwnd, NULLHANDLE, NULL);
GpiErase(hps);
PaintFancy(hwnd,hps,pStat);
WinDrawText(
hps, -1, pStat->achText, &rcl,pStat->TextColor,CLR_NEUTRAL,
pStat->usAlign | DT_VCENTER );
WinEndPaint(hps);
}
break;
case WM_SETWINDOWPARAMS:
{PWNDPARAMS pwp;
pwp= (PWNDPARAMS)mp1;
if(pwp->fsStatus != WPM_TEXT)
break;
if(pwp->cchText >= STAT_TEXT_LEN)
return (MRESULT) 2;
strcpy(pStat->achText, pwp->pszText);
WinInvalidateRect(hwnd, NULL, FALSE);
}
break;
case WM_ERASEBACKGROUND:
return (MRESULT) TRUE;
default:
return WinDefWindowProc(hwnd,msg,mp1,mp2);
}
return (MRESULT) FALSE;
}
/**************************************************************/
MRESULT EXPENTRY NewFrameProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
{
switch(msg){
case WM_QUERYFRAMECTLCOUNT:
return (MRESULT)((LONG)(OldFrameProc(hwnd,msg,mp1,mp2))+1);
case WM_FORMATFRAME:{
PSWP aswp;
SWP swp;
LONG clSwps;
PSTATPARMS pStat;
pStat=(PSTATPARMS)WinQueryWindowULong(hwndStatus,QWL_USER);
clSwps= (LONG)OldFrameProc(hwnd,msg,mp1,mp2);
aswp= mp1;
clSwps--; /* index to FID_CLIENT, always last in list */
swp= aswp[clSwps]; /* make copy of CLIENT data */
aswp[clSwps].fl= SWP_MOVE | SWP_SIZE | SWP_SHOW;
aswp[clSwps].cx= swp.cx;
aswp[clSwps].cy= pStat->height;
aswp[clSwps].x= swp.x;
switch(pStat->fTop){
case FALSE:
aswp[clSwps].y= swp.y;
swp.y += pStat->height; /* raise the CLIENT */
break;
default:
case TRUE:
aswp[clSwps].y= (swp.y+swp.cy) - pStat->height;
break;
/* may add other stuff, like on the left/right side? */
}
aswp[clSwps].hwnd= hwndStatus;
aswp[clSwps].hwndInsertBehind= NULLHANDLE;
aswp[clSwps].ulReserved1= 0;
aswp[clSwps].ulReserved2= 0;
clSwps++;
swp.cy -= pStat->height; /* shrink the CLIENT area */
aswp[clSwps]= swp; /* copy client to list end */
clSwps++;
return (MRESULT) clSwps;
}
default:
return OldFrameProc(hwnd,msg,mp1,mp2);
}
}
/**************************************************************/
VOID UfMainCreate(PGPFPARMS pGpf)
{
HWND hwndFrame;
PSTATPARMS pStat;
FONTMETRICS fm;
HPS hps;
hwndFrame= GpfGetHwndFrame(pGpf->hwnd);
WinRegisterClass(
habMainTask,
"StatusLine",
(PFNWP)StatusProc,
CS_SIZEREDRAW,
4);
hwndStatus= WinCreateWindow(
hwndFrame,
"StatusLine",
NULL,
0L,
0,0,0,0,
hwndFrame,
HWND_BOTTOM,
STATUS_FID,
(PVOID)NULL,
(PVOID)NULL);
pStat= (PSTATPARMS) malloc(LEN_STATPARMS);
*pStat= stparms;
hps= WinGetPS(hwndFrame);
GpiQueryFontMetrics(hps, (LONG)sizeof fm, &fm);
WinReleasePS(hps);
pStat->usTextAreaHeight= (4*fm.lMaxBaselineExt)/3;
pStat->height= pStat->usTextAreaHeight + 2*pStat->usShadow;
strcpy(pStat->achText,"Default Message");
WinSetWindowULong(hwndStatus, QWL_USER, (ULONG)pStat);
OldFrameProc= WinSubclassWindow(hwndFrame, NewFrameProc);
}
/**************************************************************/
/**************************************************************/
VOID PaintFancy(HWND hwnd, HPS hps, PSTATPARMS pStat)
{
POINTL pt;
RECTL rcl;
SHORT i;
SHORT Pixel;
LONG TopLeftColor, BotRightColor;
LONG MarkHiColor, MarkLoColor;
/*********************************************************************/
/* Set Default BackGroundColor and ForeGroundColor */
/*********************************************************************/
WinQueryWindowRect(hwnd, &rcl);
WinFillRect(hps,&rcl,pStat->BackColor); /* Fill Rect */
GpiSetBackMix( hps, BM_LEAVEALONE);
GpiSetBackColor( hps, pStat->BackColor );
GpiSetLineType(hps,LINETYPE_DEFAULT);
Pixel= pStat->usShadow;
if (!pStat->f3DOut)
{
TopLeftColor = pStat->ShadowDark;
BotRightColor = pStat->ShadowLight;
MarkHiColor = CLR_BLACK;
MarkLoColor = CLR_DARKGRAY;
}
else
{
TopLeftColor = pStat->ShadowLight;
BotRightColor = pStat->ShadowDark;
MarkHiColor = CLR_DARKGRAY;
MarkLoColor = CLR_BLACK;
}
/* Top */
GpiSetColor( hps, TopLeftColor );
for (i=0;i<Pixel;i++){
pt.x = rcl.xLeft;
pt.y = rcl.yTop-i-1;
GpiMove(hps,&pt);
pt.x = rcl.xRight-i-1;
GpiLine(hps,&pt);
}
/* Bot */
GpiSetColor( hps, BotRightColor );
for (i=0;i<Pixel;i++){
pt.x = rcl.xLeft+i;
pt.y = rcl.yBottom+i;
GpiMove(hps,&pt);
pt.x = rcl.xRight;
GpiLine(hps,&pt);
}
/* Left */
GpiSetColor( hps, TopLeftColor );
for (i=0;i<Pixel;i++){
pt.x = rcl.xLeft+i;
pt.y = rcl.yBottom+i;
GpiMove(hps,&pt);
pt.y = rcl.yTop;
GpiLine(hps,&pt);
}
/* Right */
GpiSetColor( hps, BotRightColor );
for (i=0;i<Pixel;i++){
pt.x = rcl.xRight-i-1;
pt.y = rcl.yTop-i-1;
GpiMove(hps,&pt);
pt.y = rcl.xLeft;
GpiLine(hps,&pt);
}
if (Pixel > 1){
/* Top */
GpiSetColor( hps, MarkHiColor );
pt.x = rcl.xLeft+1;
pt.y = rcl.yTop-2;
GpiMove(hps,&pt);
pt.x = rcl.xLeft+(Pixel-1);
pt.y = rcl.yTop-(Pixel);
GpiLine(hps,&pt);
/* Bot */
GpiSetColor( hps, MarkLoColor );
pt.x = rcl.xRight-2;
pt.y = rcl.yBottom+1;
GpiMove(hps,&pt);
pt.x = rcl.xRight-(Pixel);
pt.y = rcl.yBottom+(Pixel-1);
GpiLine(hps,&pt);
}
/* Border */
if (pStat->fBorder)
WinDrawBorder( hps,&rcl,1L,1L,
pStat->BorderColor,
pStat->BorderColor,
DB_STANDARD );
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatParmsEndSpin(PGPFPARMS pGpf)
{
ULONG ulTmp=0;
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_SB_SIZE,SPBM_QUERYVALUE,
MPFROMP(&ulTmp),MPFROM2SHORT(0,SPBQ_ALWAYSUPDATE));
WinSendMsg(
hwndStatus,WM_USER_SETVAL,MPFROMSHORT(ST_SIZESHADOW),MPFROMLONG(ulTmp));
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatParmsFonts(PGPFPARMS pGpf)
{
PFONTDLG pfdlg;
HWND hwndFont;
CHAR szFontName[FACESIZE];
PSTATPARMS pStat;
pStat= (PSTATPARMS) WinQueryWindowULong(hwndStatus, QWL_USER);
pfdlg= &pStat->fdlg;
memset(pfdlg, 0, sizeof(FONTDLG));
pfdlg->cbSize= sizeof(FONTDLG);
pfdlg->hpsScreen= WinGetPS(pGpf->hwnd);
szFontName[0]=0;
pfdlg->pszFamilyname= szFontName;
pfdlg->usFamilyBufLen= FACESIZE;
pfdlg->fxPointSize= MAKEFIXED(10,0);
pfdlg->fl= FNTS_CENTER | FNTS_INITFROMFATTRS;
pfdlg->clrFore= CLR_BLACK;
pfdlg->clrBack= CLR_WHITE;
pfdlg->fAttrs.usCodePage= 437;
pfdlg->fAttrs.usRecordLength= sizeof(FATTRS);
hwndFont= WinFontDlg(HWND_DESKTOP, pGpf->hwnd, pfdlg);
if(hwndFont && (pfdlg->lReturn == DID_OK)){
DosBeep(3000,300);
}
WinReleasePS(pfdlg->hpsScreen);
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatParmsCbx(PGPFPARMS pGpf)
{
SHORT sVal;
SHORT sIndex;
SHORT sId;
LONG lColor;
sId= SHORT1FROMMP(pGpf->mp1);
switch( sId ){
case ID_STAT_CBX_TEXTCOLOR:
sVal= ST_TEXTCOLOR;
break;
case ID_STAT_CBX_BORDERCOLOR:
sVal= ST_BORDERCOLOR;
break;
case ID_STAT_CBX_BACKCOLOR:
sVal= ST_BACKCOLOR;
break;
case ID_STAT_CBX_DARKSHADOW:
sVal= ST_SHADOWDARKCOLOR;
break;
case ID_STAT_CBX_LITESHADOW:
sVal= ST_SHADOWLIGHTCOLOR;
break;
default:
return;
}
sIndex= (SHORT)WinSendDlgItemMsg(
hwndStatParms,sId,LM_QUERYSELECTION,MPFROMSHORT(0),0L);
lColor= aSysClr[sIndex].lSysVal;
WinSendMsg(
hwndStatus,WM_USER_SETVAL,MPFROMSHORT(sVal),MPFROMLONG(lColor));
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatParmsInit(PGPFPARMS pGpf)
{
SHORT i=0;
while( aSysClr[i].lSysVal != 0xfff0L){
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_TEXTCOLOR,LM_INSERTITEM,
MPFROMSHORT(LIT_END), MPFROMP(aSysClr[i].pszSysVal));
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_BORDERCOLOR,LM_INSERTITEM,
MPFROMSHORT(LIT_END), MPFROMP(aSysClr[i].pszSysVal));
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_BACKCOLOR,LM_INSERTITEM,
MPFROMSHORT(LIT_END), MPFROMP(aSysClr[i].pszSysVal));
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_DARKSHADOW,LM_INSERTITEM,
MPFROMSHORT(LIT_END), MPFROMP(aSysClr[i].pszSysVal));
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_LITESHADOW,LM_INSERTITEM,
MPFROMSHORT(LIT_END), MPFROMP(aSysClr[i].pszSysVal));
i++;
}
/* display default values in COMBO entry field */
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_TEXTCOLOR,LM_SELECTITEM,
MPFROMSHORT(6), MPFROMSHORT(TRUE)); /* CLR_BLUE */
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_BORDERCOLOR,LM_SELECTITEM,
MPFROMSHORT(4), MPFROMSHORT(TRUE)); /* CLR_BLACK */
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_BACKCOLOR,LM_SELECTITEM,
MPFROMSHORT(20), MPFROMSHORT(TRUE)); /* CLR_PALEGRAY */
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_DARKSHADOW,LM_SELECTITEM,
MPFROMSHORT(13), MPFROMSHORT(TRUE)); /* CLR_DARKGRAY */
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_CBX_LITESHADOW,LM_SELECTITEM,
MPFROMSHORT(3), MPFROMSHORT(TRUE)); /* CLR_WHITE */
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_SB_SIZE,SPBM_SETLIMITS,
MPFROMLONG(10L),MPFROMLONG(0L));
WinSendDlgItemMsg(
pGpf->hwnd,ID_STAT_SB_SIZE,SPBM_SETCURRENTVALUE,
MPFROMLONG(3L),MPFROMLONG(0L));
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatParmsPBOut(PGPFPARMS pGpf)
{
pGpf= pGpf;
WinSendMsg(
hwndStatus,WM_USER_SETVAL,MPFROMSHORT(ST_INOUT),MPFROMSHORT(TRUE));
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatParmsPBIn(PGPFPARMS pGpf)
{
pGpf= pGpf;
WinSendMsg(
hwndStatus,WM_USER_SETVAL,MPFROMSHORT(ST_INOUT),MPFROMSHORT(FALSE));
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatParmsCBBorder(PGPFPARMS pGpf)
{
WinSendMsg(
hwndStatus,WM_USER_SETVAL,MPFROMSHORT(ST_BORDER),
(MPARAM)WinQueryButtonCheckstate(pGpf->hwnd,ID_STAT_CB_BORDER));
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatParmsCBTop(PGPFPARMS pGpf)
{
WinSendMsg(
hwndStatus,WM_USER_SETVAL,MPFROMSHORT(ST_POSITION),
(MPARAM)WinQueryButtonCheckstate(pGpf->hwnd,ID_STAT_CB_TOP));
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatTextAlign(USHORT AlignFlag)
{
WinSendMsg(
hwndStatus,WM_USER_SETVAL,
MPFROMSHORT(ST_TEXTALIGN),MPFROMSHORT(AlignFlag));
}
/*********************************************************************/
/*********************************************************************/
VOID UfStatPBSend(PGPFPARMS pGpf)
{
CHAR achTemp[STAT_TEXT_LEN];
WinQueryDlgItemText(pGpf->hwnd,ID_MAIN_EF_MSG,STAT_TEXT_LEN,achTemp);
WinSetWindowText(hwndStatus, achTemp);
}