00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <extgraph.h>
00025
00026 #include "AdvDialogs.h"
00027 #include "Internal.h"
00028
00029
00030
00031 void *tscr = NULL;
00032
00033
00034 uchar tabcounter;
00035 short elcounter;
00036
00037
00038 BOOL AD_CHECKED[6][6];
00039
00040
00041 const char *bttext[4] = {"OK", "ESC", "YES", "NO"};
00042
00043
00044
00045 #define CENTER_XL(x) ((LCD_WIDTH-x)/2)
00046 #define CENTER_YT(y) ((LCD_HEIGHT-y)/2)
00047 #define CENTER_XR(x) ((LCD_WIDTH+x)/2)
00048 #define CENTER_YB(y) ((LCD_HEIGHT+y)/2)
00049
00050
00051 const unsigned short gbutton[18] =
00052 {
00053 0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002
00054 ,0x7FFE,0x0003,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF
00055 ,0x7FFF,0x7FFF
00056 };
00057
00058
00059
00060
00061 ADVDIALOG *AdvDlgNew(short width, short height, const char *title, BOOL savescreen)
00062 {
00063 uchar i, s;
00064 ADVDIALOG *_dialog = malloc(sizeof(ADVDIALOG));
00065
00066 if (_dialog == NULL)
00067 {
00068 return NULL;
00069 }
00070
00071 memset(_dialog, 0x00, sizeof(ADVDIALOG));
00072
00073
00074 _dialog->left_x = CENTER_XL(width);
00075 _dialog->top_y = CENTER_YT(height);
00076 _dialog->right_x = CENTER_XR(width);
00077 _dialog->bottom_y = CENTER_YB(height);
00078
00079
00080 for (i = 6; i--; )
00081 {
00082 for (s = 6; s--; )
00083 {
00084 _dialog->tabs[i].elements[s].element = AD_NONE;
00085 }
00086 _dialog->tabs[i].numelements = 6;
00087 }
00088
00089
00090 strcpy(_dialog->title, title);
00091
00092
00093 _dialog->savescreen = savescreen;
00094
00095 return _dialog;
00096 }
00097
00098
00099
00100 void AdvDlgFree(ADVDIALOG *dialog)
00101 {
00102 short i, j;
00103
00104
00105 for (i = 6; i--; )
00106 {
00107 for (j = dialog->tabs[i].numbitmaps; j--; )
00108 {
00109 FreeBitmap(dialog->tabs[i].bitmaps[j]);
00110 }
00111 }
00112
00113 free(dialog);
00114 }
00115
00116
00117
00118 void AdvDlgAddTab(ADVDIALOG *dialog, uchar tab, const char *title)
00119 {
00120 strcpy(dialog->tabs[tab].title, title);
00121
00122 dialog->numtabs++;
00123 }
00124
00125
00126
00127 void AdvDlgAddButton(ADVDIALOG *dialog, uchar pos, uchar button)
00128 {
00129 dialog->buttons[pos] = button;
00130 }
00131
00132
00133
00134 void AdvDlgAddText(ADVDIALOG *dialog, uchar tab, uchar line,
00135 const char *text, uchar attr, uchar color)
00136 {
00137 dialog->tabs[tab].elements[line].element = AD_TEXT;
00138 strcpy(dialog->tabs[tab].elements[line].text, text);
00139 dialog->tabs[tab].elements[line].flag = attr;
00140 dialog->tabs[tab].elements[line].color = color;
00141 }
00142
00143
00144
00145 void AdvDlgAddInputBox(ADVDIALOG *dialog, uchar tab, uchar line, const char *text,
00146 char *buffer, short maxsize, uchar mode, uchar color)
00147 {
00148 dialog->tabs[tab].elements[line].element = AD_INPUT;
00149 strcpy(dialog->tabs[tab].elements[line].text, text);
00150 dialog->tabs[tab].elements[line].inputbuffer = buffer;
00151 dialog->tabs[tab].elements[line].inputsize = maxsize;
00152 dialog->tabs[tab].elements[line].flag = mode;
00153 dialog->tabs[tab].elements[line].color = color;
00154 }
00155
00156
00157
00158 void AdvDlgAddCheckBox(ADVDIALOG *dialog, uchar tab, uchar line, const char *text,
00159 BOOL checked, uchar color)
00160 {
00161 dialog->tabs[tab].elements[line].element = AD_CHECKBOX;
00162 strcpy(dialog->tabs[tab].elements[line].text, text);
00163 dialog->tabs[tab].elements[line].flag = checked;
00164 dialog->tabs[tab].elements[line].color = color;
00165 }
00166
00167
00168
00169 void AdvDlgAddDropDown(ADVDIALOG *dialog, uchar tab, uchar line, const char *text,
00170 const char **itemlist, short numitems, short *selected, uchar color)
00171 {
00172 dialog->tabs[tab].elements[line].element = AD_DROPDOWN;
00173 strcpy(dialog->tabs[tab].elements[line].text, text);
00174 dialog->tabs[tab].elements[line].itemlist = itemlist;
00175 dialog->tabs[tab].elements[line].flag = numitems;
00176 dialog->tabs[tab].elements[line].selected = selected;
00177 dialog->tabs[tab].elements[line].color = color;
00178 }
00179
00180
00181
00182 char AdvDlgAddBitmap(ADVDIALOG *dialog, uchar tab, short x, short y, ADVBITMAP *bitmap)
00183 {
00184 if (dialog->tabs[tab].numbitmaps > 5)
00185 {
00186 return -1;
00187 }
00188 dialog->tabs[tab].bitmaps[dialog->tabs[tab].numbitmaps] = bitmap;
00189 bitmap->x = x;
00190 bitmap->y = y;
00191 return ++dialog->tabs[tab].numbitmaps;
00192 }
00193
00194
00195
00196 void AdvDlgDrawBasic(ADVDIALOG *dialog)
00197 {
00198
00199 GrayDrawRect(dialog->left_x, dialog->top_y, dialog->right_x, dialog->bottom_y, COLOR_LIGHTGRAY, RECT_FILLED);
00200 GrayDrawRect(dialog->left_x, dialog->top_y, dialog->right_x, dialog->top_y+7, COLOR_BLACK, RECT_FILLED);
00201 GrayFastDrawLine(dialog->left_x+1, dialog->bottom_y+1, dialog->right_x+1, dialog->bottom_y+1, COLOR_BLACK);
00202 GrayFastDrawLine(dialog->right_x+1, dialog->top_y+1, dialog->right_x+1, dialog->bottom_y+1, COLOR_BLACK);
00203
00204
00205 GrayDrawStrExt(0, dialog->top_y+1, dialog->title, A_XOR | A_CENTERED, F_4x6);
00206
00207
00208 if (dialog->buttons[0] != B_NONE)
00209 {
00210
00211 GraySprite16_RPLC_R(dialog->left_x+10, dialog->bottom_y-9, 9, &gbutton[0], &gbutton[9],
00212 GRAYPLANES);
00213 GrayDrawStrExt(dialog->left_x+17-2*strlen(bttext[dialog->buttons[0]-1]), dialog->bottom_y-7, bttext[dialog->buttons[0]-1], A_NORMAL, F_4x6);
00214 }
00215 if (dialog->buttons[1] != B_NONE)
00216 {
00217 GraySprite16_RPLC_R(dialog->right_x-24, dialog->bottom_y-9, 9, &gbutton[0], &gbutton[9],
00218 GRAYPLANES);
00219 GrayDrawStrExt(dialog->right_x-17-2*strlen(bttext[dialog->buttons[1]-1]), dialog->bottom_y-7, bttext[dialog->buttons[1]-1], A_NORMAL, F_4x6);
00220 }
00221 }
00222
00223
00224
00225 void AdvDlgDrawTab(ADVDIALOG *dialog, uchar tab)
00226 {
00227 short i;
00228 BOOL drawastab = (dialog->numtabs > 0);
00229
00230 AdvDlgDrawBasic(dialog);
00231
00232 if (drawastab)
00233 {
00234 GrayDrawRect(dialog->left_x+2, dialog->top_y+17, dialog->right_x-2, dialog->bottom_y-11, COLOR_BLACK, RECT_EMPTY);
00235 GrayFastDrawLine(dialog->left_x+2, dialog->top_y+17, dialog->left_x+2, dialog->bottom_y-11, COLOR_WHITE);
00236 GrayFastDrawLine(dialog->left_x+2, dialog->top_y+17, dialog->right_x-3, dialog->top_y+17, COLOR_WHITE);
00237
00238 short xp = 0;
00239
00240 for (i = 0; i < dialog->numtabs; i++)
00241 {
00242 short drwidth = DrawStrWidth(dialog->tabs[i].title, F_4x6);
00243
00244
00245 if (i == tab)
00246 {
00247 GrayDrawRect(dialog->left_x+3+xp, dialog->top_y+9, dialog->left_x+5+xp+drwidth,
00248 dialog->top_y+17, COLOR_WHITE, RECT_EMPTY);
00249 GrayFastDrawLine(dialog->left_x+4+xp, dialog->top_y+17, dialog->left_x+4+xp+drwidth, dialog->top_y+17, COLOR_LIGHTGRAY);
00250 GrayFastDrawLine(dialog->left_x+5+xp+drwidth, dialog->top_y+9, dialog->left_x+5+xp+drwidth, dialog->top_y+16, COLOR_BLACK);
00251 GrayDrawStrExt(dialog->left_x+4+xp, dialog->top_y+11, dialog->tabs[i].title, A_NORMAL, F_4x6);
00252 }
00253
00254 else
00255 {
00256 GrayDrawRect(dialog->left_x+3+xp, dialog->top_y+10, dialog->left_x+6+xp+drwidth,
00257 dialog->top_y+17, COLOR_WHITE, RECT_EMPTY);
00258 GrayDrawStrExt(dialog->left_x+4+xp, dialog->top_y+11, dialog->tabs[i].title, A_NORMAL, F_4x6);
00259 }
00260
00261 xp += DrawStrWidth(dialog->tabs[i].title, F_4x6)+3;
00262 }
00263 }
00264
00265 for (i = 0; i < dialog->tabs[tab].numelements; i++)
00266 {
00267 switch (dialog->tabs[tab].elements[i].element)
00268 {
00269
00270 case AD_TEXT:
00271 {
00272 short tx = dialog->left_x+2+(drawastab*3);
00273
00274 if (dialog->tabs[tab].elements[i].flag == TXT_ALIGNRIGHT)
00275 {
00276 tx = dialog->right_x-5-(drawastab*3) - DrawStrWidth(dialog->tabs[tab].elements[i].text, F_4x6);
00277 }
00278
00279 GrayDrawColorString(tx, dialog->top_y+9+2+(drawastab*10)+(i*8), dialog->tabs[tab].elements[i].text,
00280 dialog->tabs[tab].elements[i].color, dialog->tabs[tab].elements[i].flag);
00281 }
00282 break;
00283
00284
00285 case AD_INPUT:
00286 {
00287 GrayDrawColorString(dialog->left_x+2+(drawastab*3), dialog->top_y+9+2+(drawastab*10)+8*i, dialog->tabs[tab].elements[i].text,
00288 dialog->tabs[tab].elements[i].color, TXT_STANDARD);
00289 GrayDrawRect(dialog->left_x+2+(drawastab*3)+DrawStrWidth(dialog->tabs[tab].elements[i].text, F_4x6) + 4, dialog->top_y+8+2+(drawastab*10)+(i*8), dialog->right_x-5-(drawastab*3), dialog->top_y+14+2+(drawastab*10)+(i*8), COLOR_WHITE, RECT_FILLED);
00290
00291 short show = 0;
00292
00293 while ((unsigned short)DrawStrWidth(&dialog->tabs[tab].elements[i].inputbuffer[show], F_4x6)
00294 > (dialog->right_x-10-(drawastab*3) - 4 -(dialog->left_x+5+DrawStrWidth(dialog->tabs[tab].elements[i].text, F_4x6))))
00295 {
00296 show++;
00297 }
00298
00299 GrayDrawStrExt(dialog->left_x+3+(drawastab*2)+DrawStrWidth(dialog->tabs[tab].elements[i].text, F_4x6) + 4, dialog->top_y+9+2+(drawastab*10)+(i*8), &dialog->tabs[tab].elements[i].inputbuffer[show], A_NORMAL, F_4x6);
00300 }
00301 break;
00302
00303
00304 case AD_CHECKBOX:
00305 {
00306 GrayDrawColorString(dialog->left_x+2+(drawastab*3), dialog->top_y+9+2+(drawastab*10)+8*i, dialog->tabs[tab].elements[i].text,
00307 dialog->tabs[tab].elements[i].color, TXT_STANDARD);
00308 GrayDrawRect(dialog->right_x-11-(drawastab*3), dialog->top_y+8+2+(drawastab*10)+(i*8), dialog->right_x-5-(drawastab*3), dialog->top_y+14+2+(drawastab*10)+(i*8), COLOR_WHITE, RECT_FILLED);
00309
00310 if (dialog->tabs[tab].elements[i].flag)
00311 {
00312 GrayFastDrawLine(dialog->right_x-11-(drawastab*3), dialog->top_y+11+2+(drawastab*10)+(i*8), dialog->right_x-9-(drawastab*3), dialog->top_y+14+2+(drawastab*10)+(i*8), COLOR_BLACK);
00313 GrayFastDrawLine(dialog->right_x-9-(drawastab*3), dialog->top_y+14+2+(drawastab*10)+(i*8), dialog->right_x-5-(drawastab*3), dialog->top_y+8+2+(drawastab*10)+(i*8), COLOR_BLACK);
00314 }
00315 }
00316 break;
00317
00318
00319 case AD_DROPDOWN:
00320 {
00321 char tstr[60];
00322
00323 GrayDrawColorString(dialog->left_x+2+(drawastab*3), dialog->top_y+9+2+(drawastab*10)+8*i, dialog->tabs[tab].elements[i].text,
00324 dialog->tabs[tab].elements[i].color, TXT_STANDARD);
00325 GrayDrawRect(dialog->left_x+10+(drawastab*3)+DrawStrWidth(dialog->tabs[tab].elements[i].text, F_4x6), dialog->top_y+8+2+(drawastab*10)+(i*8), dialog->right_x-5-(drawastab*3), dialog->top_y+14+2+(drawastab*10)+(i*8), COLOR_WHITE, RECT_FILLED);
00326 GrayDrawChar(dialog->right_x-10-(drawastab*3), dialog->top_y+9+2+(drawastab*10)+8*i, 22, A_XOR);
00327
00328 strncpy(tstr, dialog->tabs[tab].elements[i].itemlist[*dialog->tabs[tab].elements[i].selected], 59);
00329
00330 while ((unsigned short)DrawStrWidth(tstr, F_4x6)
00331 > ((dialog->right_x-5-(drawastab*3)) - (dialog->left_x+10+(drawastab*3)+DrawStrWidth(dialog->tabs[tab].elements[i].text, F_4x6)) - 5))
00332 {
00333 tstr[strlen(tstr)-1] = 0;
00334 }
00335
00336 GrayDrawStrExt(dialog->left_x+10+(drawastab*3)+DrawStrWidth(dialog->tabs[tab].elements[i].text, F_4x6), dialog->top_y+9+2+(drawastab*10)+(i*8), tstr, A_XOR, F_4x6);
00337 }
00338 break;
00339
00340 default: break;
00341 }
00342 }
00343
00344
00345 for (i = 0; i < dialog->tabs[tab].numbitmaps; i++)
00346 {
00347 DrawBitmap(dialog, dialog->tabs[tab].bitmaps[i]);
00348 }
00349 }
00350
00351
00352
00353 BOOL AdvDlgDo(ADVDIALOG *dialog, INT_HANDLER tempint1)
00354 {
00355 short key;
00356 uchar i, ccheck = 0;
00357 BOOL returnvalue = TRUE;
00358 BOOL nexttab;
00359 void *kbq = kbd_queue();
00360
00361 dialog->inthandler = tempint1;
00362
00363
00364 if (dialog->inthandler != DUMMY_HANDLER)
00365 {
00366 GraySetInt1Handler(dialog->inthandler);
00367 }
00368
00369
00370 if (dialog->savescreen)
00371 {
00372 SaveScreen();
00373 }
00374
00375
00376 char oldfont = FontSetSys(F_4x6);
00377
00378
00379 tabcounter = elcounter = 0;
00380
00381
00382 do
00383 {
00384 BOOL interactive = FALSE;
00385 nexttab = FALSE;
00386 elcounter = ccheck = 0;
00387
00388 AdvDlgDrawTab(dialog, tabcounter);
00389
00390
00391 do
00392 {
00393 interactive = dialog->tabs[tabcounter].elements[elcounter].element > AD_TEXT;
00394
00395
00396 switch (dialog->tabs[tabcounter].elements[elcounter].element)
00397 {
00398 case AD_INPUT:
00399 elcounter = AdvDlgInputBox(dialog, tabcounter, elcounter);
00400 break;
00401
00402 case AD_CHECKBOX:
00403 elcounter = AdvDlgCheckBox(dialog, tabcounter, elcounter);
00404 break;
00405
00406 case AD_DROPDOWN:
00407 elcounter = AdvDlgDropDown(dialog, tabcounter, elcounter);
00408 break;
00409
00410 default:
00411 ++elcounter;
00412 break;
00413 }
00414
00415
00416 if (elcounter == NEXTTAB)
00417 {
00418 nexttab = TRUE;
00419 tabcounter = (tabcounter+1) % dialog->numtabs;
00420 break;
00421 }
00422
00423
00424 if (elcounter < 0)
00425 {
00426 returnvalue = FALSE;
00427 break;
00428 }
00429
00430 } while (elcounter < dialog->tabs[tabcounter].numelements);
00431
00432
00433 for (i = 0; i < dialog->tabs[tabcounter].numelements; i++)
00434 {
00435 if (dialog->tabs[tabcounter].elements[i].element == AD_CHECKBOX)
00436 {
00437 AD_CHECKED[tabcounter][ccheck++] = dialog->tabs[tabcounter].elements[i].flag;
00438 }
00439 }
00440
00441
00442 if (!interactive)
00443 {
00444
00445 do
00446 {
00447 GetKey(kbq, &key);
00448
00449 if (key == KEY_ESC)
00450 {
00451 returnvalue = FALSE;
00452 break;
00453 }
00454 else if (key == KEY_ENTER)
00455 {
00456 returnvalue = TRUE;
00457 break;
00458 }
00459
00460 else if (key == KEY_APPS)
00461 {
00462 tabcounter = (tabcounter+1) % dialog->numtabs;
00463 nexttab = TRUE;
00464 break;
00465 }
00466 } while (TRUE);
00467 }
00468 } while (nexttab);
00469
00470
00471 if (dialog->inthandler != DUMMY_HANDLER)
00472 {
00473 GraySetInt1Handler(DUMMY_HANDLER);
00474 }
00475
00476 RestoreScreen();
00477
00478
00479 FontSetSys(oldfont);
00480
00481 return returnvalue;
00482 }
00483