Fix for a crash which happened when a document couldn't be opened.
[AROS-Contrib.git] / fish / memomaster / display.c
blobcae63df9b6f88e35d03d126b8cae53918adaf0f7
1 #include <aros/oldprograms.h>
3 /* Display.c
4 * Contains functions for displaying text, eg help, messages, errors
5 * and choices (returning 1 for Yes or 2 for No)
6 */
7 #include <intuition/intuition.h>
8 #include <exec/memory.h>
9 #include "mm2.h"
11 #include <stdio.h>
13 #define MINWINWIDTH 170
15 extern struct IntuitionBase *IntuitionBase;
17 static SHORT gbp_tl[]=
18 { 0, 10, 0, 0, 70, 0 };
20 static SHORT gbp_br[]=
21 { 70, 0, 70, 10, 0, 10, };
23 static struct Border gbu_tl=
25 0, 0, 0, 0, JAM1, 3, gbp_tl, NULL,
28 static struct Border gbu_br=
30 0, 0, 0, 0, JAM1, 3, gbp_br, &gbu_tl,
33 static struct Border gbs_tl=
35 0, 0, 0, 0, JAM1, 3, gbp_tl, NULL,
38 static struct Border gbs_br=
40 0, 0, 0, 0, JAM1, 3, gbp_br, &gbs_tl,
43 static struct IntuiText req_g_txt_2=
45 1, /* FrontPen */
46 0, /* BackPen */
47 JAM1, /* DrawMode */
48 4, 2, /* LeftEdge, TopEdge */
49 NULL, /* ITextFont */
50 NULL, /* IText */
51 NULL, /* NextText */
54 static struct IntuiText req_g_txt_1=
56 1, /* FrontPen */
57 0, /* BackPen */
58 JAM1, /* DrawMode */
59 4, 2, /* LeftEdge, TopEdge */
60 NULL, /* ITextFont */
61 NULL, /* IText */
62 NULL, /* NextText */
65 static struct Gadget req_g_2=
67 NULL, /* NextGadget */
68 40, /* LeftEdge */
69 20, /* TopEdge */
70 71, /* Width */
71 11, /* Height */
72 GADGHIMAGE, /* Flags */
73 GADGIMMEDIATE| /* Activation */
74 RELVERIFY|
75 ENDGADGET,
76 BOOLGADGET| /* GadgetType, */
77 REQGADGET,
78 (APTR) &gbu_br, /* GadgetRender */
79 (APTR) &gbs_br, /* SelectRender */
80 &req_g_txt_2, /* GadgetText */
81 0L, /* MutualExclude */
82 NULL, /* SpecialInfo */
83 2, /* GadgetID */
84 NULL /* UserData */
87 static struct Gadget req_g_1=
89 NULL, /* NextGadget */
90 40, /* LeftEdge */
91 20, /* TopEdge */
92 71, /* Width */
93 11, /* Height */
94 GADGHIMAGE, /* Flags */
95 GADGIMMEDIATE| /* Activation */
96 RELVERIFY|
97 ENDGADGET,
98 BOOLGADGET| /* GadgetType, */
99 REQGADGET,
100 (APTR) &gbu_br, /* GadgetRender */
101 (APTR) &gbs_br, /* SelectRender */
102 &req_g_txt_1, /* GadgetText */
103 0L, /* MutualExclude */
104 NULL, /* SpecialInfo */
105 1, /* GadgetID */
106 NULL /* UserData */
109 static struct Requester my_requester=
111 NULL, /* OlderRequester */
112 3, 11, /* LeftEdge, TopEdge */
113 0, 0, /* Width, Height */
114 0, 0, /* RelLeft, RelTop */
115 &req_g_1, /* ReqGadget */
118 static struct NewWindow my_new_window=
120 0, /* LeftEdge */
121 0, /* TopEdge */
122 0, /* Width */
123 0, /* Height */
124 0, /* DetailPen*/
125 1, /* BlockPen */
126 GADGETUP, /* IDCMP */
127 SMART_REFRESH| /* Flags */
128 WINDOWDRAG|
129 WINDOWDEPTH|
130 ACTIVATE,
131 NULL, /* FirstGadget */
132 NULL, /* CheckMark */
133 NULL, /* Title */
134 NULL, /* Screen */
135 NULL, /* BitMap */
136 0, 0, 0, 0,
137 WBENCHSCREEN /* Type */
141 int Display(char **txt, int Mode, int FColour, int BColour)
143 extern int Colour[4];
144 BOOL close_me,failed;
145 struct IntuiMessage *my_message;
146 BOOL result;
147 int linelen,maxlen,txtline,choice = 0;
148 struct Window *my_window=NULL;
149 struct IntuiText *IT1,*IT2;
150 struct Remember *txt_RK=NULL;
151 struct Border rb1;
152 struct Gadget *gp;
153 SHORT rbp1[10];
155 maxlen=0;
156 IT2=NULL;
157 txtline=0;
158 failed=FALSE;
159 while((*(txt+txtline)) && (!failed) )
161 IT1=(struct IntuiText *)
162 AllocRemember(&txt_RK,sizeof(struct IntuiText),MEMF_PUBLIC);
163 if(IT1)
165 IT1->FrontPen=Colour[FColour];
166 IT1->DrawMode=JAM1;
167 IT1->BackPen=0;
168 IT1->LeftEdge=10;
169 IT1->TopEdge=4+10*txtline;
170 IT1->ITextFont=NULL;
171 IT1->IText=(UBYTE *)*(txt+txtline);
172 IT1->NextText=NULL;
173 if(IT2==NULL)
175 my_requester.ReqText=IT1;
176 IT2=IT1;
178 else
180 IT2->NextText=IT1;
181 IT2=IT1;
183 linelen=IntuiTextLength(IT1);
184 if(linelen>maxlen)maxlen=linelen;
185 txtline++;
187 else
189 failed=TRUE;
192 if(!failed)
194 if(maxlen<MINWINWIDTH)maxlen=MINWINWIDTH;
195 my_requester.Width=maxlen+20;
196 my_requester.Height=10*txtline+20;
197 my_requester.BackFill=Colour[BColour];
198 req_g_txt_1.FrontPen = Colour[FColour];
199 req_g_txt_2.FrontPen = Colour[FColour];
200 my_new_window.Width=my_requester.Width;
201 my_new_window.Height=my_requester.Height+10;
202 my_new_window.LeftEdge=((640-my_requester.Width)/2)-1;
203 my_new_window.TopEdge=((200-my_requester.Height)/2)-1;
204 my_new_window.Title="Amigaholics!!";
205 if (Mode == 0) /*Choice*/
207 req_g_1.NextGadget = &req_g_2;
208 req_g_1.TopEdge = req_g_2.TopEdge = my_requester.Height - 15;
209 req_g_1.LeftEdge = 10;
210 req_g_2.LeftEdge = my_requester.Width - 80;
211 req_g_txt_1.FrontPen=Colour[FColour];
212 req_g_txt_2.FrontPen=Colour[FColour];
213 req_g_txt_1.IText = " YES ";
214 req_g_txt_2.IText = " NO ";
216 else
218 req_g_1.NextGadget = NULL;
219 req_g_1.TopEdge = my_requester.Height - 15;
220 req_g_1.LeftEdge = (my_requester.Width - 70) / 2;
221 req_g_txt_1.FrontPen=Colour[FColour];
222 req_g_txt_1.IText = " OK ";
224 rb1.LeftEdge=0;
225 rb1.TopEdge =0;
226 rb1.FrontPen=Colour[FColour];
227 rb1.DrawMode=JAM1;
228 rb1.Count=5;
229 rb1.XY=rbp1;
230 rb1.NextBorder=NULL;
231 rbp1[0]=1; rbp1[1]=1;
232 rbp1[2]=1; rbp1[3]=my_requester.Height-4;
233 rbp1[4]=my_requester.Width-4; rbp1[5]=my_requester.Height-4;
234 rbp1[6]=my_requester.Width-4; rbp1[7]=1;
235 rbp1[8]=1; rbp1[9]=1;
236 gbu_tl.FrontPen=Colour[1];
237 gbu_br.FrontPen=Colour[2];
238 gbs_tl.FrontPen=Colour[2];
239 gbs_br.FrontPen=Colour[1];
240 my_requester.ReqBorder=&rb1;
242 my_window = (struct Window *) OpenWindow( &my_new_window );
243 if(my_window == NULL)
245 if(txt_RK)FreeRemember(&txt_RK,TRUE);
246 return 0;
249 result=Request( &my_requester, my_window );
250 if( !result )
252 printf("Could not activate the requester!\n");
253 if(my_window)CloseWindow(my_window);
254 if(txt_RK)FreeRemember(&txt_RK,TRUE);
255 return 0;
258 if (Mode == 2) /*Error*/
260 DisplayBeep(my_window->WScreen);
262 close_me = FALSE;
263 while( !close_me )
265 Wait( 1 << my_window->UserPort->mp_SigBit );
266 while((my_message=(struct IntuiMessage *) GetMsg(my_window->UserPort)))
268 gp = (struct Gadget *)my_message->IAddress;
269 ReplyMsg( (struct Message *)my_message );
270 choice = gp->GadgetID;
271 close_me=TRUE;
275 if(txt_RK)FreeRemember(&txt_RK,TRUE);
276 if(my_window)CloseWindow( my_window );
277 return choice;
281 /*====================================================================*/
282 void DisplayE(char **txt)
284 Display(txt, 2, 0, 3);
286 /*====================================================================*/
287 void DisplayT(char **txt)
289 Display(txt, 1, 1, 0);
291 /*====================================================================*/
292 void DisplayH(char **txt)
294 Display(txt, 1, 2, 3);
296 /*====================================================================*/
297 int DisplayC(char **txt)
299 return Display(txt, 0, 2, 3);
301 /*====================================================================*/