home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of A1200
/
World_Of_A1200.iso
/
programs
/
monitors
/
rsys
/
rsyssrc.lha
/
RSysIntuiCtrl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-09-24
|
19KB
|
815 lines
/*
***************************************************************************
*
* Datei:
* RSysIntuiCtrl.c
*
* Inhalt:
*
* --- Globale Routinen ---
*
* APTR LockWindow ( struct Window *win );
* char *gadgetbuff ( struct Gadget *gad );
* int OpenASysWindow ( int (*func )(void ), int kill );
* long SetupScreen ( void );
* struct Screen *FindFrontPubScr ( struct Screen *activescr );
* void AdjustWindowDimensions ( struct Screen *Scr , UWORD WinLeftEdge , UWORD WinTopEdge , UWORD WinWidth , UWORD WinHeight , UWORD *NewWinLeftEdge , UWORD *NewWinTopEdge , UWORD *NewWinWidth , UWORD *NewWinHeight );
* void CenterWindow ( struct Screen *scr , UWORD *top , UWORD *left , UWORD width , UWORD height );
* void ClearIntuiMsgPort ( struct Window *wnd );
* void CloseASysWindow ( struct Window **wind , struct Gadget **windgadlist , struct Menu **windmenus );
* void CloseDownScreen ( void );
* void DisableSysRequest ( int disable );
* void EmptyListView ( void );
* void EnableGadget ( struct Window *Wnd , struct Gadget *gad , int on_off );
* void InitListView ( struct Window *wind , struct Gadget *gad , struct List *list , int top );
* void LockMainWindow ( int on );
* void makelabelvisible ( struct Gadget *gad );
* void MakePattern ( struct Window *wind );
* void MakeWindowRefresh ( struct Window *window );
* void OpenMainWindow ( void );
* void PrintHeader ( enum ListTypes type , char *text );
* void PrintInfo ( char *text , int speakit , int waitit );
* void PrintStatistics ( void );
* void RefreshListView ( void );
* void RefreshMainWindowPattern ( void );
* void RefreshRastPort ( struct Window *wind , struct Gadget **gads , int *gadnum , int cnt , int SaveGad , struct Gadget *GadgetList );
* void RefreshWindowAndGadgets ( struct Window *wind );
* void UnlockWindow ( APTR req );
* WORD MyEasyRequest ( struct Window *wind , UBYTE *title , UBYTE *Gadgets , UBYTE *Body , ...);
*
* --- Lokale Routinen ---
*
* static void FillGadget ( struct Window *wind , struct Gadget *gad , BYTE SaveGad );
*
* Bemerkungen:
* Intuition Supportroutinen für die Verwaltung der Intuitionobjekte
* des Hauptwindows von RSys.
* (Aus RSysUtils.c ausgelagert)
*
* Erstellungsdatum:
* 25-Jun-93 Rolf Böhme
*
* Änderungen:
* 25-Jun-93 Rolf Böhme Erstellung
* 25-Jun-93 Rolf Böhme makelabelvisible() hinzugefügt
*
***************************************************************************
*/
#include "RSys.h"
/********************************************************************
* *
* ***************** Gadget Routinen ***************** *
* *
********************************************************************/
/*
* EnableGadget() schaltet ein Gadget auf einem Window ein oder
* aus
*/
void
EnableGadget(struct Window *Wnd, struct Gadget *gad, int on_off)
{
DPOS;
GT_SetGadgetAttrs(gad, Wnd, NULL, GA_Disabled, NOT(on_off), TAG_DONE);
return;
}
void
makelabelvisible(struct Gadget *gad)
{
extern int bgc, bpc;
if(gad->GadgetText)
{
gad->GadgetText->DrawMode |= JAM2;
gad->GadgetText->BackPen = 0;
gad->GadgetText->FrontPen = 1;
}
return;
}
/*
* gadgetbuff() ermittelt den String, der in einem Stringgadget
* steht
*/
char *
gadgetbuff(struct Gadget *gad)
{
DPOS;
return ((char *)(((struct StringInfo *) (gad->SpecialInfo))->Buffer));
}
/*
* FillGadget() löscht den Hintergrund eines Boolean-Gadgets
*/
static void
FillGadget( struct Window *wind, struct Gadget *gad, BYTE SaveGad )
{
BYTE GadType = (BYTE)gad->GadgetType;
UWORD pos;
if(SaveGad) pos = RemoveGadget(wind,gad);
if(GadType == GTYP_STRGADGET)
EraseRect( wind->RPort,(long)gad->LeftEdge - 2,
(long)gad->TopEdge - 1,
(long)(gad->LeftEdge + gad->Width + 1),
(long)(gad->TopEdge + gad->Height) );
else EraseRect( wind->RPort,(long)gad->LeftEdge,
(long)gad->TopEdge,
(long)(gad->LeftEdge + gad->Width - 1),
(long)(gad->TopEdge + gad->Height - 1) );
if(SaveGad) AddGadget(wind,gad,(ULONG)pos);
return;
}
/*
* InitListView() initialisiert ein ListView in einem Fenster
* mit einer anzugebenden Liste. Ist die Liste NULL, wird das
* ListView systemgemäß mit ~0 initialisiert
*/
void
InitListView(struct Window *wind, struct Gadget *gad, struct List *list, int top)
{
struct List *lvlist = (list != NULL) ? list : (struct List *)(~0);
DPOS;
if(list != NULL) GT_SetGadgetAttrs(gad, wind,NULL,GTLV_Labels, (~0), TAG_DONE);
if(top == UNSETLVPOS) GT_SetGadgetAttrs(gad, wind, NULL, GTLV_Labels, lvlist, TAG_DONE);
else
GT_SetGadgetAttrs(gad, wind,
NULL,
GTLV_Labels, lvlist,
GTLV_Top, top,
GTLV_Selected, (~0),
TAG_DONE);
}
/*
* RefreshListView() erneuert das ListView auf dem Hauptwindow
*/
void
RefreshListView(void)
{
DPOS;
InitListView(SysWnd,SysGadgets[GD_ListeLV],&ListeLVList,UNSETLVPOS);
return;
}
/*
* EmptyListView() löscht die Einträge des Haupt-ListViews
*/
void
EmptyListView(void)
{
DPOS;
InitListView(SysWnd,SysGadgets[GD_ListeLV],NULL,0);
NewList(&ListeLVList);
RefreshListView();
GT_RefreshWindow(SysWnd, NULL);
return;
}
/********************************************************************
* *
* ***************** Window Routinen ***************** *
* *
********************************************************************/
/*
* LockWindow() öffnet einen Requester der Größe 1x1 und sperrt
* das Window damit gegen Eingaben
*/
APTR
LockWindow(struct Window * win)
{
struct Requester *req = NULL;
DPOS;
if(!win) return NULL;
req = (struct Requester *) MyAllocVec(sizeof(struct Requester),MEMF_ANY | MEMF_CLEAR, NO_KILL);
if (req)
{
req->LeftEdge = 1;
req->TopEdge = 1;
req->Width = 1;
req->Height = 1;
req->Flags = SIMPLEREQ | NOREQBACKFILL;
Request(req, win);
}
return ((APTR) req);
}
/*
* UnlockWindow() gibt ein mit LockWindow() gesperrtes Window
* wieder frei. Es ist dann wieder für Benutzereingaben
* zugänglich
*/
void
UnlockWindow(APTR req)
{
DPOS;
if (req)
{
EndRequest((struct Requester *) req, ((struct Requester *) req)->RWindow);
MyFreeVec(req);
req = NULL;
}
return;
}
void
LockMainWindow(int on)
{
static APTR req = NULL;
if (on) req = LockWindow(SysWnd);
else
{
UnlockWindow(req);
RefreshMainWindowPattern();
PrintStatistics();
/* RefreshList(LastID);*/
}
return;
}
/*
* MakeWindowRefresh() führt die Standard-System-Routinen zur
* Erneuerung eines Windows aus
*/
void
MakeWindowRefresh(struct Window *window)
{
GT_BeginRefresh(window);
GT_EndRefresh(window, TRUE);
return;
}
void
MakePattern(struct Window *wind)
{
struct RastPort *RP = wind->RPort;
if(wind != SysWnd && (wind->Flags & WFLG_ZOOMED)) return;
if(bgc || bpc)
{
SetAfPt(RP,(USHORT *)&bpp,1L);
SetAPen(RP,bpc);
SetBPen(RP,bgc);
SetDrMd(RP,JAM2);
RectFill(RP,(long)OffX,(long)OffY,
(long)wind->Width - Scr->WBorRight,
(long)wind->Height - Scr->WBorBottom + 1 - wind->BorderBottom);
SetAfPt(RP,NULL,NULL);
}
else
{
SetAPen(RP,0);
SetBPen(RP,0);
RectFill(RP,(long)OffX,(long)OffY,
(long)wind->Width - Scr->WBorRight,
(long)wind->Height - Scr->WBorBottom + 1 - wind->BorderBottom);
}
return;
}
void
RefreshWindowAndGadgets(struct Window *wind)
{
RefreshGadgets(wind->FirstGadget, wind,NULL);
RefreshWindowFrame(wind);
GT_RefreshWindow( wind, NULL );
return;
}
/*
* RefreshRastPort() malt das Hintergrundmuster und erneuert
* die Gadgets und deren Hintergrund
*/
void
RefreshRastPort(struct Window *wind, struct Gadget **gads,
int *gadnum, int cnt, int SaveGad,
struct Gadget *GadgetList)
{
struct RastPort *RP = wind->RPort;
struct Gadget *gad;
register int i;
if(wind != SysWnd && (wind->Flags & WFLG_ZOOMED)) return;
MakePattern(wind);
if(bgc || bpc)
{
for(i = 0; i < cnt; i++) FillGadget( wind,gads[gadnum[i]], (BYTE)SaveGad );
for(gad = gads[0]; gad; gad = gad->NextGadget)
if(gad->GadgetText)
{
int pixlen = IntuiTextLength(gad->GadgetText);
int x = gad->LeftEdge + gad->GadgetText->LeftEdge - 3,
y = gad->TopEdge + gad->GadgetText->TopEdge - 2,
w = pixlen + 6,
h = gad->GadgetText->ITextFont->ta_YSize + 4;
EraseRect( wind->RPort,(long)x, (long)y, (long)(x + w - 1), (long)(y + h - 1));
DrawBevelBox( wind->RPort, x, y, w, h,
GTBB_Recessed, TRUE,
GT_VisualInfo, VisualInfo,
TAG_DONE );
}
}
if(GadgetList) AddGList(wind, GadgetList, -1, -1, NULL);
RefreshWindowAndGadgets(wind);
if(Flags.autofront)
{
WindowToFront(wind);
ActivateWindow(wind);
}
return;
}
/*
* RefreshMainWindowPattern() erneuert das Patternmuster
* des Hauptfensters von RSys
*/
void
RefreshMainWindowPattern(void)
{
int gl[] = {GD_ListeLV, GD_TextHeader, GD_InfoMsgGad};
if(SysWnd) RefreshRastPort(SysWnd, SysGadgets, gl, 3, TRUE, NULL);
return;
}
/*
* ClearIntuiMsgPort() beantwortet alle anliegenden Messages
* eines Windows
*/
void
ClearIntuiMsgPort(struct Window *wnd)
{
struct IntuiMessage *message;
DPOS;
while (message = (struct IntuiMessage *) GT_GetIMsg(wnd->UserPort)) GT_ReplyIMsg(message);
return;
}
/*
* OpenMainWindow() öffnet das Hauptffenster
*/
void
OpenMainWindow(void)
{
int err;
DPOS;
if (!(err = SetupScreen()))
{
OpenASysWindow(OpenSysWindow, KILL);
return;
}
if(err == 1) ErrorHandle((char *)namebuffer, SCREEN_ERR, LOCK_FAIL, KILL);
else
ErrorHandle((char *)"Visual info", SCREEN_ERR, INFO_FAIL, KILL);
return;
}
/*
* CloseASysWindow() schließt ein von RSys verwaltetes Window
*/
void
CloseASysWindow(struct Window **wind, struct Gadget **windgadlist, struct Menu **windmenus)
{
DPOS;
if(!(*wind)) return;
if (windmenus && *windmenus)
{
ClearMenuStrip(*wind);
FreeMenus(*windmenus);
*windmenus = NULL;
}
if (wind && *wind)
{
CloseWindow(*wind);
*wind = NULL;
}
if (windgadlist && *windgadlist)
{
FreeGadgets(*windgadlist);
*windgadlist = NULL;
}
return;
}
/*
* OpenASysWindow() öffnet ein Window mit einer
* vorzugebenden Funktion und mit einer allgemeinen
* Fehlerbehandlung
*/
int
OpenASysWindow(int (*func) (void), int kill)
{
ULONG failed = (*func) ();
DPOS;
switch (failed)
{
case 1L:
ErrorHandle("GadTools-Context", OBJECT_CONTEXT_ERR, CREATE_FAIL, kill);
break;
case 2L:
ErrorHandle("CreateGadget()", GADGET_ERR, CREATE_FAIL, kill);
break;
case 3L:
ErrorHandle("LayoutMenu()", MENU_ERR, CREATE_FAIL, kill);
break;
case 4L:
ErrorHandle("OpenWindowTags()", WINDOW_ERR, OPEN_FAIL, kill);
break;
}
return (failed ? FALSE : TRUE);
}
/*
* CenterWindow() ermittelt die Fensterposition, um das
* Fenster zentriert auf einem Screen erscheinen zu lassen
*/
void
CenterWindow(struct Screen *scr, UWORD * top, UWORD * left,
UWORD width, UWORD height)
{
WORD LE, TE;
WORD restwidth = scr->Width - width, restheight = scr->Height - height;
DPOS;
if (scr)
{
LE = (Flags.mousewindow ? scr->MouseX : (scr->Width >> 1)) - (width >> 1);
TE = (Flags.mousewindow ? scr->MouseY : (scr->Height >> 1)) - (height >> 1);
*left = (LE < 0) ? (UWORD)0 : ((LE > restwidth ) ? restwidth : LE);
*top = (TE < 0) ? (UWORD)0 : ((TE > restheight) ? restheight : TE);
}
return;
}
void
AdjustWindowDimensions(struct Screen *Scr,
UWORD WinLeftEdge, UWORD WinTopEdge,
UWORD WinWidth, UWORD WinHeight,
UWORD *NewWinLeftEdge, UWORD *NewWinTopEdge,
UWORD *NewWinWidth, UWORD *NewWinHeight)
{
DPOS;
ComputeFont(Scr, WinWidth, WinHeight);
*NewWinWidth = compute((UWORD) 0, FontX, (int)WinWidth);
*NewWinHeight = compute((UWORD) 0, FontY, (int)WinHeight);
if ((WinLeftEdge + *NewWinWidth + OffX + Scr->WBorRight) > Scr->Width)
*NewWinLeftEdge = Scr->Width - *NewWinWidth;
if ((WinTopEdge + *NewWinHeight + OffY + Scr->WBorBottom) > Scr->Height)
*NewWinTopEdge = Scr->Height - *NewWinHeight;
*NewWinWidth = compute((UWORD) (OffX + Scr->WBorRight), FontX, (int)WinWidth);
*NewWinHeight = compute((UWORD) (OffY + Scr->WBorBottom), FontY, (int)WinHeight);
CenterWindow(Scr, NewWinTopEdge, NewWinLeftEdge, *NewWinWidth, *NewWinHeight);
return;
}
/********************************************************************
* *
* ***************** Screen Routinen ***************** *
* *
********************************************************************/
/*
* Die Funktion FindFrontPubScr() ermittelt
* bezüglich des aktuellen Screens, auf dem das
* Hauptfenster geöffnet wurde, den nächsten Public
* screen und gibt den Zeiger auf diesen zurück,
* falls dieser ungleich dem aktuellen und zugleich
* der vorderste Screen auf dem Bildschirm ist.
*/
struct Screen *
FindFrontPubScr(struct Screen *activescr)
{
char newnamebuffer[MAXPUBSCREENNAME + 1];
UBYTE *test;
struct Screen *NewScr;
DPOS;
/*
* Der Name des aktuellen Screens, auf dem RSys
* geöffnet wurde, wird gemerkt.
*/
strncpy(newnamebuffer, (char *)namebuffer,MAXPUBSCREENNAME);
/*
* Der Zeiger des neuen Screens wird initialisiert
* und der nächst Public screen ermittelt.
*/
NewScr = NULL;
test = NextPubScreen(activescr, namebuffer);
/*
* Solange der neue Screen nicht der vorderste
* Screen und nicht der aktuelle ist, und der neue
* Screen erfolgreich ermittelt werden konnte, wird
* dieser neue getestet. Im Erfolgsfall wird ein
* Zeiger auf diesen neuen Screen zurückgegeben.
*/
while ((NewScr != IntuitionBase->FirstScreen) && (NewScr != activescr) && test)
{
NewScr = LockPubScreen(namebuffer);
if ((NewScr == IntuitionBase->FirstScreen) && (NewScr != activescr))
{
UnlockPubScreen(NULL, NewScr);
return (NewScr);
}
UnlockPubScreen(NULL, NewScr);
test = NextPubScreen(NewScr, namebuffer);
}
/*
* Wenn das Unterprogramm bis hierher kommt, konnte
* kein weiterer Public screen erkannt werden. Der
* gemerkte Screen name wird zurückkopiert und der
* Zeiger auf den aktiven Screen zurückgegeben.
*/
strncpy((char *)namebuffer, newnamebuffer,MAXPUBSCREENNAME);
return (activescr);
}
/*
* SetupScreen() ermittelt eine Zeiger auf den vordersten
* Screen. Ist der vorderste Screen kein PublicScreen,
* wird der WorkBench-Screen als Default-Screen genommen.
*/
long
SetupScreen(void)
{
extern struct Screen *lastpubscreen;
DPOS;
(void)FindFrontPubScr(lastpubscreen);
if (NOT(Scr = LockPubScreen(namebuffer)))
{
strcpy((char *)namebuffer,"Workbench");
if (NOT(Scr = LockPubScreen(namebuffer))) return (1L);
}
ComputeFont(Scr,(UWORD) 0, (UWORD) 0);
if (NOT(VisualInfo = GetVisualInfo(Scr, TAG_DONE))) return (2L);
lastpubscreen = Scr;
return NULL;
}
/*
* CloseDownScreen() gibt den Screen frei, auf den ein
* RSys-Window geöffnet wurde.
*/
void
CloseDownScreen(void)
{
DPOS;
if (VisualInfo)
{
FreeVisualInfo(VisualInfo);
VisualInfo = NULL;
}
if (Scr)
{
UnlockPubScreen(NULL, Scr);
Scr = NULL;
}
return;
}
/********************************************************************
* *
* ***************** Informations Routinen ***************** *
* *
********************************************************************/
/*
* DisableSysRequest() unterdrückt die Anzeige von
* Systemrequestern, die beispielsweise nach einem Zugriff auf
* einen nicht existierenden Datenträger erscheinen
*/
void
DisableSysRequest(int disable)
{
static APTR wind;
struct Process *p = (struct Process *) FindTask(NULL);
DPOS;
if (disable)
{
wind = (APTR) p->pr_WindowPtr;
p->pr_WindowPtr = (APTR) (-1);
}
else p->pr_WindowPtr = wind;
return;
}
/*
* PrintHeader() gibt einen Text im Titelfeld über dem
* Haupt-ListView aus
*/
void
PrintHeader(enum ListTypes type, char *text)
{
DPOS;
LastID = type;
GT_SetGadgetAttrs(SysGadgets[GD_TextHeader], SysWnd,
NULL,
GTTX_Text, (UBYTE *) (NOT(text) ? EntryAttr[type].ea_header : text),
TAG_DONE);
return;
}
/*
* PrintInfo() gibt einen Text im Messagefeld vom Hauptfenster
* aus. Falls der Sprachmodus aktiviert ist und der Text
* gesprochen werden soll, wird er zusätzlich auf dem
* Narrator-Device ausgegeben
*/
void
PrintInfo(char *text, int speakit,int waitit)
{
static char help[BUFSIZE];
int i,
len = strlen(text),
fill = ((BUFSIZE - len) >> 1);
DPOS;
if(!SysWnd || SysWnd->FirstRequest) return;
for (i = 0; i < fill; i++) help[i] = ' ';
help[fill] = STRINGEND;
strcat(help, text);
GT_SetGadgetAttrs(SysGadgets[GD_InfoMsgGad], SysWnd,
NULL,
GTTX_Text, (UBYTE *) help,
TAG_DONE);
if (NOT(Flags.fastmode)) WaitTOF();
if (Flags.speakmode && speakit) Speak(help);
if (waitit != 0) Delay(waitit);
return;
}
/*
* PrintStatistics() gibt für bestimmte Listen eine
* Zusammenfasung (Anzahl der ermittelten Einträge) aus
*/
void
PrintStatistics(void)
{
char help[BUFSIZE], *type = EntryAttr[LastID].ea_type;
DPOS;
if (!SysWnd || SysWnd->FirstRequest) return;
if (countentries == 0) sprintf(help, "No %s entries read", type);
else
if (EntryAttr[LastID].ea_counted) sprintf(help, "%ld %s entries read", countentries,type);
else
sprintf(help, "%s entries read", type);
PrintInfo(help, SPEAK, 0);
RefreshListView();
return;
}
/*
* MyEasyRequest() erzeugt nach Vorgaben einen
* System-Standard-Requester
*/
WORD
MyEasyRequest(struct Window * wind, UBYTE * title,
UBYTE * Gadgets, UBYTE * Body,...)
{
struct EasyStruct Easy;
WORD Result;
va_list VarArgs;
APTR req;
DPOS;
Easy.es_StructSize = sizeof(struct EasyStruct);
Easy.es_Flags = NULL;
Easy.es_Title = title;
Easy.es_TextFormat = Body;
Easy.es_GadgetFormat = Gadgets;
req = LockWindow(wind);
va_start(VarArgs, Body);
Result = EasyRequestArgs(wind, &Easy, NULL, VarArgs);
va_end(VarArgs);
UnlockWindow(req);
return Result;
}