home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
math
/
plotter
/
src
/
maus.c
< prev
next >
Wrap
Text File
|
1990-10-10
|
10KB
|
392 lines
/********************************************************************/
/**** ****/
/**** ****/
/**** Program : Maus.c ****/
/**** ****/
/**** Version : 03.71 ****/
/**** ****/
/**** Erstversion : 14.08.1988 ****/
/**** ****/
/**** Letzte Änderung : 05.08.1990 ****/
/**** ****/
/**** Compiliert mit : siehe MAKEFILE ****/
/**** ****/
/**** Gelinkt mit : siehe MAKEFILE ****/
/**** ****/
/********************************************************************/
/**** ****/
/**** ****/
/**** Copyright by Rüdiger Dreier ****/
/**** ****/
/**** ****/
/********************************************************************/
/* Einbinden der Includes */
#ifdef DEBUG
#include "Plotter.h"
#include <proto/tool.h>
#endif
#include <string.h>
#include <intuition/intuitionbase.h>
#include <proto/mathieeedoubbas.h>
#include <proto/mathieeedoubtrans.h>
/* Variablendeklaration für Abfragefenster */
struct RastPort *RastPort2;
struct Window *Window2;
UBYTE MinXText[8],MaxXText[8],MinYText[8],MaxYText[8];
/* Definition der Umrandungen */
SHORT paare1[]=
{
-2,-2,122,-2,122,10,-2,10,-2,-2
};
SHORT paare2[]=
{
-2,-2,222,-2,222,10,-2,10,-2,-2
};
SHORT paare3[]=
{
0,0,0,9,33,9,33,0,0,0
};
struct Border Rand2=
{
0,0,FARBE2,FARBE3,JAM2,5,(SHORT *)&paare2,NULL
};
struct Border Rand=
{
0,0,FARBE2,FARBE3,JAM2,5,(SHORT *)&paare1,NULL
};
struct Border Rand1 =
{
-1,-1,FARBE2,FARBE3,JAM2,5,paare3,0
};
/* Definition der benötigten Texte */
struct IntuiText Bedeutung4=
{
FARBE1,FARBE0,JAM1,-65,0,NULL,MinXText,NULL
};
struct IntuiText Bedeutung3=
{
FARBE1,FARBE0,JAM1,-65,0,NULL,MaxXText,NULL
};
struct IntuiText Bedeutung2=
{
FARBE1,FARBE0,JAM1,-65,0,NULL,MinYText,NULL
};
struct IntuiText Bedeutung1=
{
FARBE1,FARBE0,JAM1,-65,0,NULL,MaxYText,NULL
};
struct IntuiText BedeutungFormel=
{
FARBE1,FARBE0,JAM1,6,-20,NULL,MAUS_ENTERFUNC,NULL
};
/* Definitionen für TextGadgets */
struct StringInfo TextStringFormel=
{
Abgeleitet[0],undoFormel,0,MAXCHARS,0,0,5,0,0,0,NULL,0,NULL
};
struct StringInfo TextString1=
{
NULL,undo1,0,20,0,0,5,0,0,0,NULL,0,NULL
};
struct StringInfo TextString2=
{
NULL,undo1,0,20,0,0,5,0,0,0,NULL,0,NULL
};
struct StringInfo TextString3=
{
NULL,undo1,0,20,0,0,5,0,0,0,NULL,0,NULL
};
struct StringInfo TextString4=
{
NULL,undo1,0,20,0,0,5,0,0,0,NULL,0,NULL
};
struct IntuiText Texte=
{
FARBE2,FARBE3,JAM2,0,0,0," OK ",0
};
/* Definitionen für Gadgets */
struct Gadget OKgadget=
{
NULL ,100,100,32,8,GADGHCOMP,RELVERIFY|GADGIMMEDIATE,BOOLGADGET,(APTR)&Rand1,0,&Texte,NULL,NULL,4,0
};
struct Gadget FormelGadget=
{
&OKgadget ,10,50,220,10,GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET,(APTR)&Rand2,0,&BedeutungFormel,0,(APTR)&TextStringFormel,NULL,0
};
struct Gadget gadget4=
{
&OKgadget ,70,20,120,10,GADGHCOMP,GADGIMMEDIATE|RELVERIFY|STRINGCENTER,STRGADGET,(APTR)&Rand,0,&Bedeutung4,0,(APTR)&TextString4,3,0
};
struct Gadget gadget3=
{
&gadget4,70,35,120,10,GADGHCOMP,GADGIMMEDIATE|RELVERIFY|STRINGCENTER,STRGADGET,(APTR)&Rand,0,&Bedeutung3,0,(APTR)&TextString3,2,0
};
struct Gadget gadget2=
{
&gadget3,70,50,120,10,GADGHCOMP,GADGIMMEDIATE|RELVERIFY|STRINGCENTER,STRGADGET,(APTR)&Rand,0,&Bedeutung2,0,(APTR)&TextString2,1,0
};
struct Gadget gadget1=
{
&gadget2,70,65,120,10,GADGHCOMP,GADGIMMEDIATE|RELVERIFY|STRINGCENTER,STRGADGET,(APTR)&Rand,0,&Bedeutung1,0,(APTR)&TextString1,0,0
};
/* Definition des allg. Fensters */
struct NewWindow Fenster2=
{
100,10,200,115,FARBE0,FARBE1,GADGETUP,ACTIVATE|WINDOWDRAG,
&gadget1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
CUSTOMSCREEN
};
/* Routine bestimmt Ausschnitt per Maus */
VOID AusSchnitt(DOUBLE *x1,
DOUBLE *y1,
DOUBLE *x2,
DOUBLE *y2)
{
long x,y,xs=0,ys=0,xe=0,ye=0;
char click=0;
SetDrMd(RastPort,COMPLEMENT); /* DrawMode verändern */
while(click<=1)
{
/* Wartet bis 2 mal geklickt */
Wait(1L<<Window->UserPort->mp_SigBit);
while(EventAbfrage(Window,&msgInfo))
{
/* X/YOffset gibt linke/obere Ecke des View-Ports an */
x=msgInfo.MouseX+XOffset;
y=msgInfo.MouseY+YOffset;
if(x<Abstand+1)
{
x=Abstand+1;
}
if(x>Abstand+xx)
{
x=Abstand+xx;
}
if(y<Abstand+1)
{
y=Abstand+1;
}
if(y>Abstand+yy)
{
y=Abstand+yy;
}
switch(msgInfo.NachrichtenArt)
{
case MOUSEBUTTONS:
{
if(msgInfo.code==SELECTDOWN)
{
/* Erster Klick : Box neu zeichnen */
click=1;
xs=xe=x;
ys=ye=y;
Box(RastPort,ys,ys,xe,ye);
}
else
{
/* Zweiter Klick : Box löschen */
click=2;
Box(RastPort,xs,ys,xe,ye);
xe=x;
ye=y;
};
break;
}
case RAWKEY:
{
if(Groesse==GROSS)
{
TastaturAbfrage();
}
}
case MOUSEMOVE:
{
if (click==1)
{
/* Box löschen und an neuer Position neu zeichnen */
Box(RastPort,xs,ys,xe,ye);
xe=x;
ye=y;
Box(RastPort,xs,ys,xe,ye);
}
}
}
}
}
SetDrMd(RastPort,JAM1);
/* Bestimmung von xmp/n und ymp/n */
if (xe>xs)
{
*x2=Flt(xe-Abstand);
*x1=Flt(xs-Abstand);
}
else
{
*x1=Flt(xe-Abstand);
*x2=Flt(xs-Abstand);
}
if (ye<ys)
{
*y2=Flt(ye-Abstand);
*y1=Flt(ys-Abstand);
}
else
{
*y1=Flt(ye-Abstand);
*y2=Flt(ys-Abstand);
}
*x1=Div(Sub(*x1,x0),xm);
*x2=Div(Sub(*x2,x0),xm);
*y1=Div(Add(Neg(*y1),y0),ym);
*y2=Div(Add(Neg(*y2),y0),ym);
/* Gleiche Grenzen werden nicht angenommen */
if(!(Cmp(*x1,*x2)) || !(Cmp(*y1,*y2)))
{
UmwandlungInIntervall();
}
/* Zahlenwerte auch in Strings speichern */
UmwFtoS(xmnstring,x1,5);
UmwFtoS(xmpstring,x2,5);
UmwFtoS(ymnstring,y1,5);
UmwFtoS(ympstring,y2,5);
}
/* Ermittelt neues Intervall für Funktion */
/* bzw. ermitteln neue Konstanten */
VOID Grenzen(char *xn,
char *yn,
char *xp,
char *yp)
{
struct Gadget *GadgetPtr;
USHORT GadgetID;
/* Strings kopieren */
TextString4.Buffer=xn;
TextString3.Buffer=xp;
TextString2.Buffer=yn;
TextString1.Buffer=yp;
/* Zwei Routinen benutzen gleiches Fenster mit Gadgets */
Fenster2.FirstGadget=&gadget1;
Fenster2.Width =200;
if(!(Window2=(struct Window *)OpenWindow(&Fenster2)))return;
RastPort2=Window2->RPort;
ActivateGadget(&gadget4,Window2,NULL); /* Direkte Eingabe ermöglichen */
/* Endlosschleife */
FOREVER
{
Wait(1L<<Window2->UserPort->mp_SigBit);
while(EventAbfrage(Window2,&msgInfo))
{
/* Es gibt nur das Ereignis GADGETDOWN */
GadgetID=((struct Gadget *)msgInfo.IAddress)->GadgetID;
switch(GadgetID)
{
case 4:
{
CloseWindow(Window2);
return;
}
case 3:
{
GadgetPtr=&gadget3;
goto Einsprung2;
}
case 2:
{
GadgetPtr=&gadget2;
goto Einsprung2;
}
case 1:
{
GadgetPtr=&gadget1;
Einsprung2:
ActivateGadget(GadgetPtr,Window2,NULL);
break;
}
case 0:
{
CloseWindow(Window2);
return;
}
}
}
}
}
/* Eingabe der neuen Funktion, alter Wert wird übergeben */
VOID __asm Funktionseingabe(register __a0 UBYTE *string)
{
/* Siehe Grenzen */
Fenster2.FirstGadget=&FormelGadget;
Fenster2.Width=240;
strcpy(Abgeleitet[0],string); /* Wird zum Anzeigen des Strings benutzt */
if(!(Window2=(struct Window *)OpenWindow(&Fenster2)))return;
ActivateGadget(&FormelGadget,Window2,NULL);
Wait(1L<<Window2->UserPort->mp_SigBit);
EventAbfrage(Window2,&msgInfo);
/* Wenn <RETURN> oder Mausklich auf <OK> -> Beenden */
CloseWindow(Window2);
strcpy(string,Abgeleitet[0]);
}
/* Kopiert Text in die passenden Variablen, die */
/* im Fenster dann angezeigt werden. */
/* Für Intervalleingabe */
VOID TextFuerIntervall()
{
strcpy(MinXText,"X-Min :");
strcpy(MinYText,"Y-Min :");
strcpy(MaxXText,"X-Max :");
strcpy(MaxYText,"Y-Max :");
}
/* Für Konstanteneingabe */
VOID TextFuerKonstanten()
{
strcpy(MinXText," A :");
strcpy(MinYText," C :");
strcpy(MaxXText," B :");
strcpy(MaxYText," D :");
}