|
|
1.1 root 1: /*
2: * Hatari - dlgAlert.c - AES-like AlertBox
3: *
4: * Based on dlgAlert.cpp from the emulator ARAnyM,
5: * Copyright (c) 2004 Petr Stehlik of ARAnyM dev team
6: *
7: * Adaptation to Hatari by Thomas Huth.
8: *
9: * This file is free software; you can redistribute it and/or modify
10: * it under the terms of the GNU General Public License as published by
11: * the Free Software Foundation; either version 2 of the License, or
12: * (at your option) any later version.
13: *
14: * This file is distributed in the hope that it will be useful,
15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: * GNU General Public License for more details.
18: *
19: * You should have received a copy of the GNU General Public License
20: * along with ARAnyM; if not, write to the Free Software
21: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22: */
23: char DlgAlert_rcsid[] = "Hatari $Id: dlgAlert.c,v 1.1 2004/10/31 17:32:50 thothy Exp $";
24:
25: #include <string.h>
26:
27: #include "main.h"
28: #include "dialog.h"
29: #include "sdlgui.h"
30:
31:
32: #define MAX_LINES 4
33:
34: static char dlglines[MAX_LINES][50+1];
35:
36:
37: #define DLGALERT_OK 5
38: #define DLGALERT_CANCEL 6
39:
40: /* The "Alert"-dialog: */
41: static SGOBJ alertdlg[] =
42: {
43: { SGBOX, 0, 0, 0,0, 52,7, NULL },
44: { SGTEXT, 0, 0, 1,1, 50,1, dlglines[0] },
45: { SGTEXT, 0, 0, 1,2, 50,1, dlglines[1] },
46: { SGTEXT, 0, 0, 1,3, 50,1, dlglines[2] },
47: { SGTEXT, 0, 0, 1,4, 50,1, dlglines[3] },
48: { SGBUTTON, 0, 0, 5,5, 8,1, "OK" },
49: { SGBUTTON, 0, 0, 24,5, 8,1, "Cancel" },
50: { -1, 0, 0, 0,0, 0,0, NULL }
51: };
52:
53:
54: /*-----------------------------------------------------------------------*/
55: /*
56: Breaks long string to several strings of max_width, divided by '\0'
57: and returns the number of lines you need to display the strings.
58: */
59: static int DlgAlert_FormatTextToBox(char *text, int max_width)
60: {
61: int lines = 1;
62: int txtlen;
63: char *p; /* pointer to begin of actual line */
64: char *q; /* pointer to start of next search */
65: char *llb; /* pointer to last place suitable for breaking the line */
66: char *txtend; /* pointer to end of the text */
67:
68: txtlen = strlen(text);
69:
70: q = p = text;
71: llb = text-1; /* pointer to last line break */
72: txtend = text + txtlen;
73:
74: if (txtlen > max_width)
75: {
76: while(q < txtend) /* q was last place suitable for breaking */
77: {
78: char *r = strpbrk(q, " \t/\\\n"); /* find next suitable place for the break */
79: if (r == NULL)
80: r = txtend; /* if there's no place then point to the end */
81:
82: if ((r-p) < max_width && *r != '\n') /* '\n' is always used for breaking */
83: {
84: llb = r; /* remember new place suitable for breaking */
85: q++;
86: continue; /* search again */
87: }
88:
89: if ((r-p) > max_width) /* too long line already? */
90: {
91: if (p > llb) /* bad luck - no place for the delimiter. Let's do it the strong way */
92: llb = p + max_width; /* we loose one character */
93: }
94: else
95: llb = r; /* break in this place */
96:
97: *llb = '\0'; /* BREAK */
98: p = q = llb + 1; /* next line begins here */
99: lines++; /* increment line counter */
100: }
101: }
102:
103: return lines; /* return line counter */
104: }
105:
106:
107:
108: /*-----------------------------------------------------------------------*/
109: /*
110: Show the "alert" dialog. Return TRUE if user pressed "OK".
111: */
112: static int DlgAlert_ShowDlg(const char *text)
113: {
114: char *t = (char *)malloc(strlen(text)+1);
115: char *orig_t = t;
116: static int maxlen = sizeof(dlglines[0])-1;
117: int lines;
118: int i;
119: BOOL bOldMouseVisibility;
120:
121: strcpy(t, text);
122: lines = DlgAlert_FormatTextToBox(t, maxlen);
123:
124: for(i=0; i<MAX_LINES; i++)
125: {
126: if (i < lines)
127: {
128: strcpy(dlglines[i], t);
129: t += strlen(t)+1;
130: }
131: else
132: {
133: dlglines[i][0] = '\0';
134: }
135: }
136:
137: free(orig_t);
138:
139: SDLGui_PrepareFont();
140: SDLGui_CenterDlg(alertdlg);
141:
142: bOldMouseVisibility = SDL_ShowCursor(SDL_QUERY);
143: SDL_ShowCursor(SDL_ENABLE);
144:
145: i = SDLGui_DoDialog(alertdlg);
146:
147: SDL_ShowCursor(bOldMouseVisibility);
148:
149: return (i == DLGALERT_OK);
150: }
151:
152:
153: /*-----------------------------------------------------------------------*/
154: /*
155: Show a "notice" dialog: (only one button)
156: */
157: int DlgAlert_Notice(const char *text)
158: {
159: /* Hide "cancel" button: */
160: alertdlg[DLGALERT_CANCEL].type = SGTEXT;
161: alertdlg[DLGALERT_CANCEL].txt = "";
162: alertdlg[DLGALERT_CANCEL].w = alertdlg[DLGALERT_CANCEL].w = 0;
163:
164: /* Adjust button position: */
165: alertdlg[DLGALERT_OK].x = (alertdlg[0].w - alertdlg[DLGALERT_OK].w) / 2;
166:
167: return DlgAlert_ShowDlg(text);
168: }
169:
170:
171: /*-----------------------------------------------------------------------*/
172: /*
173: Show a "query" dialog: (two buttons)
174: */
175: int DlgAlert_Query(const char *text)
176: {
177: /* Show "cancel" button: */
178: alertdlg[DLGALERT_CANCEL].type = SGBUTTON;
179: alertdlg[DLGALERT_CANCEL].txt = "Cancel";
180: alertdlg[DLGALERT_CANCEL].w = 8;
181: alertdlg[DLGALERT_CANCEL].h = 1;
182:
183: /* Adjust buttons positions: */
184: alertdlg[DLGALERT_OK].x = (alertdlg[0].w - alertdlg[DLGALERT_OK].w - alertdlg[DLGALERT_CANCEL].w) / 3;
185: alertdlg[DLGALERT_CANCEL].x = alertdlg[DLGALERT_OK].x * 2 + alertdlg[DLGALERT_OK].w;
186:
187: return DlgAlert_ShowDlg(text);
188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.