Пример #1
0
/**************************************************************************
  Do default Widget action when pressed, and then call widget callback
  function.

  example for Button:
    set flags FW_Pressed
    redraw button ( pressed )
    refresh screen ( to see result )
    wait 300 ms	( to see result :)
    If exist (button callback function) then
      call (button callback function)

    Function normal return Widget ID.
    NOTE: NOZERO return of this function deterninate exit of
        MAIN_SDL_GAME_LOOP
    if ( pWidget->action )
      if ( pWidget->action(pWidget)  ) ID = 0;
    if widget callback function return = 0 then return NOZERO
    I default return (-1) from Widget callback functions.
**************************************************************************/
Uint16 widget_pressed_action(struct widget * pWidget)
{
  Uint16 ID = 0;

  if (!pWidget) {
    return 0;
  }
  
  widget_info_counter = 0;
  if (pInfo_Area) {
    sdl_dirty_rect(*pInfo_Area);
    FC_FREE(pInfo_Area);
    FREESURFACE(pInfo_Label);
  }

  switch (get_wtype(pWidget)) {
    case WT_TI_BUTTON:
    case WT_I_BUTTON:    
    case WT_ICON:
    case WT_ICON2:
      if (Main.event.button.button == SDL_BUTTON_LEFT) {
        set_wstate(pWidget, FC_WS_PRESSED);
        widget_redraw(pWidget);
        widget_mark_dirty(pWidget);
        flush_dirty();
        set_wstate(pWidget, FC_WS_SELLECTED);
        SDL_Delay(300);
      }
      ID = pWidget->ID;
      if (pWidget->action) {
        if (pWidget->action(pWidget)) {
          ID = 0;
        }
      }
      break;

    case WT_EDIT:
    {
      if (Main.event.button.button == SDL_BUTTON_LEFT) {
        bool ret, loop = ((get_wflags(pWidget) & WF_EDIT_LOOP) == WF_EDIT_LOOP);
        enum Edit_Return_Codes change;
        do {
          ret = FALSE;
          change = edit_field(pWidget);
          if (change != ED_FORCE_EXIT && (!loop || change != ED_RETURN)) {
            widget_redraw(pWidget);
            widget_mark_dirty(pWidget);
            flush_dirty();
          }
          if (change != ED_FORCE_EXIT && change != ED_ESC && pWidget->action) {
            if (pWidget->action(pWidget)) {
              ID = 0;
            }
          }
          if (loop && change == ED_RETURN) {
            ret = TRUE;
          }
        } while(ret);
        ID = 0;
      }
      break;
    }
    case WT_VSCROLLBAR:
    case WT_HSCROLLBAR:
      if (Main.event.button.button == SDL_BUTTON_LEFT) {
        set_wstate(pWidget, FC_WS_PRESSED);
        widget_redraw(pWidget);
        widget_mark_dirty(pWidget);
        flush_dirty();
      }
      ID = pWidget->ID;
      if (pWidget->action) {
        if (pWidget->action(pWidget)) {
          ID = 0;
        }
      }
      break;
    case WT_CHECKBOX:
    case WT_TCHECKBOX:
      if (Main.event.button.button == SDL_BUTTON_LEFT) {
        set_wstate(pWidget, FC_WS_PRESSED);
        widget_redraw(pWidget);
        widget_mark_dirty(pWidget);
        flush_dirty();
        set_wstate(pWidget, FC_WS_SELLECTED);
        togle_checkbox(pWidget);
        SDL_Delay(300);
      }
      ID = pWidget->ID;  
      if (pWidget->action) {
        if (pWidget->action(pWidget)) {
          ID = 0;
        }
      }
      break;
    case WT_COMBO:
      if (Main.event.button.button == SDL_BUTTON_LEFT) {
        set_wstate(pWidget, FC_WS_PRESSED);
        combo_popup(pWidget);
      } else {
        combo_popdown(pWidget);
      }
      break;
    default:
      ID = pWidget->ID;
      if (pWidget->action) {
        if (pWidget->action(pWidget) != 0) {
          ID = 0;
        }
      }
      break;
  }

  return ID;
}
Пример #2
0
static void
demo_forms(void)
{
    WINDOW *w;
    FORM *form;
    FIELD *f[100];		/* FIXME memset to zero */
    int finished = 0, c;
    unsigned n = 0;
    int pg;
    WINDOW *also;

#ifdef NCURSES_MOUSE_VERSION
    mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0);
#endif

    help_edit_field();

    MvAddStr(4, 57, "Forms Entry Test");
    show_insert_mode(TRUE);

    refresh();

    /* describe the form */
    memset(f, 0, sizeof(f));
    for (pg = 0; pg < 4; ++pg) {
	char label[80];
	sprintf(label, "Sample Form Page %d", pg + 1);
	f[n++] = make_label(0, 15, label);
	set_new_page(f[n - 1], TRUE);

	switch (pg) {
	default:
	    f[n++] = make_label(2, 0, "Last Name");
	    f[n++] = make_field(3, 0, 1, 18);
	    set_field_type(f[n - 1], TYPE_ALPHA, 1);

	    f[n++] = make_label(2, 20, "First Name");
	    f[n++] = make_field(3, 20, 1, 12);
	    set_field_type(f[n - 1], TYPE_ALPHA, 1);

	    f[n++] = make_label(2, 34, "Middle Name");
	    f[n++] = make_field(3, 34, 1, 12);
	    set_field_type(f[n - 1], TYPE_ALPHA, 1);
	    break;
	case 1:
	    f[n++] = make_label(2, 0, "Last Name");
	    f[n++] = make_field(3, 0, 1, 18);
	    set_field_type(f[n - 1], TYPE_ALPHA, 1);

	    f[n++] = make_label(2, 20, "First Name");
	    f[n++] = make_field(3, 20, 1, 12);
	    set_field_type(f[n - 1], TYPE_ALPHA, 1);

	    f[n++] = make_label(2, 34, "MI");
	    f[n++] = make_field(3, 34, 1, 1);
	    set_field_pad(f[n - 1], '?');
	    set_field_type(f[n - 1], TYPE_ALPHA, 1);
	    break;
	case 2:
	    f[n++] = make_label(2, 0, "Host Name");
	    f[n++] = make_field(3, 0, 1, 18);
	    set_field_type(f[n - 1], TYPE_ALNUM, 1);

#ifdef NCURSES_VERSION
	    f[n++] = make_label(2, 20, "IP Address");
	    f[n++] = make_field(3, 20, 1, 12);
	    set_field_type(f[n - 1], TYPE_IPV4, 1);
#endif

	    break;

	case 3:
	    f[n++] = make_label(2, 0, "Four digits");
	    f[n++] = make_field(3, 0, 1, 18);
	    set_field_type(f[n - 1], TYPE_INTEGER, 4, 0, 0);

	    f[n++] = make_label(2, 20, "Numeric");
	    f[n++] = make_field(3, 20, 1, 12);
	    set_field_type(f[n - 1], TYPE_NUMERIC, 3, -10000.0, 100000000.0);

	    break;
	}

	f[n++] = make_label(5, 0, "Comments");
	f[n++] = make_field(6, 0, 4, 46);
	set_field_buffer(f[n - 1], 0, "HELLO\nWORLD!");
	set_field_buffer(f[n - 1], 1, "Hello\nWorld!");
    }

    f[n] = (FIELD *) 0;

    if ((form = new_form(f)) != 0) {

	display_form(form);

	w = form_win(form);
	also = newwin(getmaxy(stdscr) - getmaxy(w), COLS, getmaxy(w), 0);
	show_current_field(also, form);

	while (!finished) {
	    switch (edit_field(form, &c)) {
	    case E_OK:
		break;
	    case E_UNKNOWN_COMMAND:
		finished = my_form_driver(form, c);
		break;
	    default:
		beep();
		break;
	    }
	    show_current_field(also, form);
	}

	erase_form(form);

	free_form(form);
    }
    for (c = 0; f[c] != 0; c++) {
	void *ptr = field_userptr(f[c]);
	free(ptr);
	free_field(f[c]);
    }
    noraw();
    nl();

#ifdef NCURSES_MOUSE_VERSION
    mousemask(0, (mmask_t *) 0);
#endif
}
Пример #3
0
void E_F(int areanr)
{
    FILE	    *fil;
    char	    temp[PATH_MAX], help[81];
    int		    i, y, o, records, Ondisk;
    static char	    *menu = (char *)"0";
    int		    offset;
    time_t	    Time;
    struct stat	    statfile;
    unsigned int    crc, crc1;

    clr_index();

    snprintf(temp, PATH_MAX, "%s/var/fdb/file%d.data", getenv("MBSE_ROOT"), areanr);
    if ((fil = fopen(temp, "r+")) == NULL) {
	working(2, 0, 0);
	return;
    }
    if (! check_free())
	return;

    fread(&fdbhdr, sizeof(fdbhdr), 1, fil);
    fseek(fil, 0, SEEK_END);
    records = ((ftell(fil) - fdbhdr.hdrsize) / fdbhdr.recsize);
    o = 0;

    for (;;) {

	clr_index();
	set_color(WHITE, BLACK);
	mbse_mvprintw(5, 4, "14.  EDIT FILES DATABASE");

	y = 8;
	working(1, 0, 0);

	set_color(YELLOW, BLUE);
	mbse_mvprintw(7, 1, "  Nr   Filename           Size Date       Time  Description                   ");
/*                      1234   12345678901234 12345678 12-34-1998 12:45 123456789012345678901234567890*/
	set_color(CYAN, BLACK);

	for (i = 1; i <= 10; i++) {
	    if ((o + i) <= records) {
		offset = (((o + i) - 1) * fdbhdr.recsize) + fdbhdr.hdrsize;
		fseek(fil, offset, SEEK_SET);
		fread(&fdb, fdbhdr.recsize, 1, fil);

		set_color(WHITE, BLACK);
		mbse_mvprintw(y, 1, (char *)"%4d.", o + i);

		snprintf(temp, PATH_MAX, "%s/%s", area.Path, fdb.LName);
		Ondisk = ((stat(temp, &statfile)) != -1);

		if (fdb.Deleted)
		    set_color(LIGHTBLUE, BLACK);
		else if (Ondisk)
		    set_color(CYAN, BLACK);
		else
		    set_color(LIGHTRED, BLACK);
		mbse_mvprintw(y, 8, (char *)"%-14s", fdb.Name);

		if (Ondisk) {
		    if (fdb.Size == statfile.st_size)
			set_color(CYAN, BLACK);
		    else
			set_color(LIGHTRED, BLACK);
		    mbse_mvprintw(y,23, (char *)"%8ld", fdb.Size);

		    if (fdb.FileDate == statfile.st_mtime)
			set_color(CYAN, BLACK);
		    else
			set_color(LIGHTRED, BLACK);
		    Time = fdb.FileDate;
		    mbse_mvprintw(y,32, (char *)"%s %s", StrDateDMY(Time), StrTimeHM(Time));
		}

		set_color(CYAN, BLACK);
		snprintf(temp, 81, "%s", fdb.Desc[0]);
		temp[30] = '\0';
		mbse_mvprintw(y,49, (char *)"%s", temp);
		y++;
	    }
	}

	if (records)
	    if (records > 10)
		snprintf(help, 81, "^1..%d^ Edit, ^-^ Return, ^N^/^P^ Page", records);
	    else
		snprintf(help, 81, "^1..%d^ Edit, ^-^ Return", records); 
	else
	    snprintf(help, 81, "^-^ Return");

	showhelp(help);

	while(TRUE) {
	    mbse_mvprintw(LINES - 4, 6, "Enter your choice >");
	    menu = (char *)"-";
	    menu = edit_field(LINES - 4, 26, 6, '!', menu);
	    mbse_locate(LINES - 4, 6);
	    clrtoeol();

	    if (strncmp(menu, "-", 1) == 0) {
		fclose(fil);
		open_bbs();
		return;
	    }

	    if (records > 10) {
		if (strncmp(menu, "N", 1) == 0)
		    if ((o + 10) < records) {
			o += 10;
			break;
		    }

		if (strncmp(menu, "P", 1) == 0)
		    if ((o - 10) >= 0) {
			o -= 10;
			break;
		    }
	    }

	    if ((atoi(menu) > 0) && (atoi(menu) <= records)) {
		working(1, 0, 0);
		offset = ((atoi(menu) - 1) * fdbhdr.recsize) + fdbhdr.hdrsize;
		fseek(fil, offset, SEEK_SET);
		fread(&fdb, fdbhdr.recsize, 1, fil);
		crc = 0xffffffff;
		crc = upd_crc32((char *)&fdb, crc, fdbhdr.recsize);
		o = ((atoi(menu) - 1) / 10) * 10;
				
		snprintf(temp, PATH_MAX, "%s/%s", area.Path, fdb.LName);
		EditFile();

		crc1 = 0xffffffff;
		crc1 = upd_crc32((char *)&fdb, crc1, fdbhdr.recsize);

		if (crc != crc1) {
		    if (yes_no((char *)"Record is changed, save") == 1) {
			working(1, 0, 0);
			fseek(fil, offset, SEEK_SET);
			fwrite(&fdb, fdbhdr.recsize, 1, fil);
			working(6, 0, 0);
		    }
		}
		break;
	    }
	}
    }
}