home *** CD-ROM | disk | FTP | other *** search
- /* DiscIndex 1.00
- * Main code - Main.c
- * By Neil A Carson 1994 A.D.
- */
-
- #include <stdlib.h>
- #include <string.h>
-
- #
- #include "baricon.h"
- #include "coords.h"
- #include "dbox.h"
- #include "discindex.h"
- #include "event.h"
- #include "flex.h"
- #include "heap.h"
- #include "kernel.h"
- #include "myswis.h"
- #include "res.h"
- #include "resspr.h"
- #include "template.h"
- #include "visdelay.h"
- #include "werr.h"
- #include "wimp.h"
- #include "wimpt.h"
- #include "win.h"
- #include "xferrecv.h"
- #include "xfersend.h"
- #
-
- menu icon_menu;
- menu win_menu;
- dbox find_dbox, matches_dbox, scan_dbox, info_dbox, save_dbox;
- BOOL find_open = 0, matches_open = 0, scan_open = 0, info_open = 0;
- search_win_type search_win_info;
- match_win_type match_win_info;
- scan_win_type scan_win_info;
- char std_save_name[256]; /* For quick save */
- char s_filename[256]; /* For saveas handler */
-
- int current_line = 0, current_disc = 0, current_i = -1;
-
- void bar_click_handler(wimp_i);
- void icon_menu_handler(void *handle, char *hit);
- void win_menu_handler(void *handle, char *hit);
- void info_event_handler(dbox d, void *handle);
- BOOL save_handler(wimp_eventstr *, void *);
-
- extern void fill_in_discinfo(BOOL scroll, dbox, int, int, int);
- extern void mem_man_init(void);
- extern void do_scan(disc_type *);
- extern void search(void);
-
- extern BOOL save_records(char *, void *);
- extern BOOL load_records(char *, void *);
-
- int main(int argc, char *argv[])
- {
- wimpt_init("Disc Index");
- visdelay_init();
- visdelay_begin();
- flex_init();
- heap_init(TRUE);
- mem_man_init();
- res_init("DiscIndex");
- resspr_init();
- template_init();
- dbox_init();
- baricon("!DiscIndex", (int) resspr_area(), bar_click_handler);
- if ((icon_menu = menu_new("Disc Index", ">Info, Help, >Save, Clear all, Quit")) == 0)
- werr(1, "Unable to initialise menu (1)");
- if ((win_menu = menu_new("Disc Index", ">Info|Go to start,Go to end,>Go to disc|Search...|>Save")) == 0)
- werr(1, "Unable to initialise menu (2)");
- event_attachmenu(win_ICONBAR, icon_menu, icon_menu_handler, 0);
- memset(&search_win_info, sizeof(search_win_type), 0);
- memset(&scan_win_info, sizeof(scan_win_type), 0);
- memset(&match_win_info, sizeof(match_win_type), 0);
- visdelay_end();
-
- if (argc > 1) load_records(argv[1], 0);
-
- for (;;)
- {
- char *filename;
- event_process();
- if (xferrecv_checkinsert(&filename) == 0x345)
- load_records(filename, 0);
- }
- }
-
- BOOL save_handler(wimp_eventstr *e, void *handle)
- {
- wimp_mousestr m;
-
- handle = handle;
-
- if (e->e != wimp_EUSERDRAG) return FALSE; /* Only want a User Drag end */
-
- wimpt_noerr(wimp_get_point_info(&m));
- dbox_dispose(&save_dbox);
- if (m.w != dbox_syshandle(save_dbox))
- xfersend(0x345, s_filename, 300, save_records, 0, 0, e, 0);
- /* Remove itself! */
- win_remove_unknown_event_processor(save_handler, (void *) 116140);
- return TRUE;
- }
-
- void set_current_disc(int no)
- {
- if ((no < 0) || (no >= records.no)) return;
- current_disc = no;
- current_line = 0;
- current_i = -1;
- if (info_open)
- fill_in_discinfo(0, info_dbox, current_disc, current_i, current_line);
- }
-
- void do_save(void)
- {
- save_dbox = dbox_new("xfer_send");
- dbox_setfield(save_dbox, 1, "Records");
- dbox_show(save_dbox);
- switch(dbox_fillin(save_dbox))
- {
- case 0:
- dbox_getfield(save_dbox, 1, s_filename,192);
- dbox_dispose(&save_dbox);
- if (strchr(s_filename, '.') == 0)
- werr(0, "To save, drag the icon to a filer window!");
- else save_records(s_filename, 0);
- break;
-
- case 2:
- {
- wimp_wstate state;
- coords_cvtstr c;
- wimp_icon icon;
- wimp_box ibox;
- _kernel_swi_regs r;
-
- dbox_getfield(save_dbox, 1, s_filename, 64);
- wimpt_noerr(wimp_get_wind_state(dbox_syshandle(save_dbox), &state));
- wimpt_noerr(wimp_get_icon_info(dbox_syshandle(save_dbox), 2, &icon));
- c.box = state.o.box;
- c.scx = state.o.x;
- c.scy = state.o.y;
- ibox = icon.box;
- coords_box_toscreen(&ibox, &c);
- c.box = state.o.box;
- c.scx = state.o.x;
- c.scy = state.o.y;
- r.r[0] = 0x85;
- r.r[1] = 1;
- r.r[2] = (int) "file_345";
- r.r[3] = (int) &ibox;
- r.r[4] = 0;
- _kernel_swi(DragASprite_Start, &r, &r);
- win_add_unknown_event_processor(save_handler, (void *) 116140);
- }
- break;
-
- default: break;
- }
- }
-
- void bar_click_handler(wimp_i i)
- {
- i = i;
-
- if (!info_open)
- {
- info_dbox = dbox_new("DiscInfo");
- dbox_showstatic(info_dbox);
- dbox_eventhandler(info_dbox, info_event_handler, 0);
- event_attachmenu(dbox_syshandle(info_dbox),win_menu,win_menu_handler,0);
- fill_in_discinfo(0, info_dbox, current_disc, -1, current_line);
- info_open = 1;
- }
- }
-
- void icon_menu_handler(void *handle, char *hit)
- {
- handle = handle;
-
- switch(hit[0])
- {
- case 1:
- {
- dbox d = dbox_new("Info");
- dbox_showstatic(d);
- dbox_fillin(d);
- dbox_dispose(&d);
- }
- break;
-
- case 2:
- system("Filer_OpenDir <DiscIndex$Dir>.Help");
- break;
-
- case 3:
- do_save();
- break;
-
- case 4:
- {
- os_error e;
- _kernel_swi_regs r;
-
- e.errnum = 0;
- strcpy(e.errmess, "Are you sure you want to delete all (no undo!)");
- r.r[0] = (int) &e;
- r.r[1] = 3;
- r.r[2] = (int) "Disc Index";
- _kernel_swi(0x400DF, &r, &r);
-
- if (r.r[1] == 1) mem_free();
- }
- break;
-
- case 5:
- exit(0);
- break;
-
- default: break;
- }
- }
-
- int locate(void)
- {
- int f;
-
- f = current_i - 15;
- f += (current_line << 1);
-
- return f;
- }
-
- void info_event_handler(dbox d, void *handle)
- {
- dbox_field f;
-
- handle = handle;
-
- f = dbox_get(d);
-
- if ((f >= 15) && (f <= 30))
- {
- current_i = f;
- fill_in_discinfo(0, info_dbox, current_disc, current_i, current_line);
- return;
- }
-
- switch(f)
- {
- case dbox_CLOSE:
- dbox_dispose(&d);
- dbox_eventhandler(d, 0, 0);
- info_open = 0;
- break;
-
- case 1:
- dbox_getfield(d, 11, disc_locate(current_disc)->disc_desc, 32);
- break;
-
- case 6:
- if (current_disc == 0)
- {
- printf("%c", 7); /* Beep an error! */
- return;
- }
- current_disc --;
- current_line = 0;
- current_i = -1;
- fill_in_discinfo(0, info_dbox, current_disc, current_i, current_line);
- break;
-
- case 7:
- if (current_disc >= (records.no - 1))
- {
- printf("%c", 7); /* Beep an error! */
- return;
- }
- current_disc ++;
- current_line = 0;
- current_i = -1;
- fill_in_discinfo(0, info_dbox, current_disc, current_i, current_line);
- break;
-
- case 31:
- if (current_line == 0)
- {
- printf("%c", 7);
- return;
- }
- current_line --;
- current_i = -1;
- fill_in_discinfo(1, info_dbox, current_disc, current_i, current_line);
- break;
-
- case 32:
- if (current_line > (disc_locate(current_disc)->no >> 1))
- {
- printf("%c", 7);
- return;
- }
- current_line ++;
- current_i = -1;
- fill_in_discinfo(1, info_dbox, current_disc, current_i, current_line);
- break;
-
- case 49:
- dbox_getfield(d, 48,
- disc_locate(current_disc)->files[locate()].desc, 32);
- break;
-
- case 35:
- do_scan(disc_locate(current_disc));
- current_i = -1;
- current_line = 0;
- fill_in_discinfo(0, info_dbox, current_disc, current_i, current_line);
- break;
-
- case 36:
- if (disc_create() == 0) break;
- current_disc = records.no - 1;
- current_line = 0;
- current_i = -1;
- do_scan(disc_locate(current_disc));
- fill_in_discinfo(0, info_dbox, current_disc, current_i, current_line);
- break;
-
- case 37:
- if (disc_create() == 0) break;
- current_disc = records.no - 1;
- current_line = 0;
- current_i = -1;
- fill_in_discinfo(0, info_dbox, current_disc, current_i, current_line);
- break;
-
- case 38:
- if (current_disc == 0)
- {
- werr(0, "Can't delete disc 0!");
- break;
- }
- if (disc_destroy(current_disc) != 1) break;
- current_disc --;
- current_line = 0;
- current_i = -1;
- fill_in_discinfo(0, info_dbox, current_disc, current_i, current_line);
- break;
-
- case 39:
- save_records(std_save_name, 0);
- break;
-
- case 52:
- if (disc_insert(current_disc))
- {
- current_line = 0;
- current_i = -1;
- fill_in_discinfo(0, info_dbox, current_disc, current_i,
- current_line);
- }
- break;
-
- default: break;
- }
- }
-
- void win_menu_handler(void *handle, char *hit)
- {
- handle = handle;
-
- switch(hit[0])
- {
- case 1:
- {
- dbox d = dbox_new("Info");
- dbox_show(d);
- dbox_fillin(d);
- dbox_dispose(&d);
- }
- break;
-
- case 2:
- set_current_disc(0);
- break;
-
- case 3:
- set_current_disc(records.no - 1);
- break;
-
- case 4:
- {
- dbox d = dbox_new("Goto");
- dbox_setnumeric(d, 0, current_disc + 1);
- dbox_show(d);
- if (dbox_fillin(d) == 2)
- set_current_disc(dbox_getnumeric(d, 0) - 1);
- dbox_dispose(&d);
- }
- break;
-
- case 5:
- search();
- break;
-
- case 6:
- do_save();
- break;
- }
- }
-