home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 2
/
DATAFILE_PDCD2.iso
/
utilities3
/
discindex
/
DiscIndex
/
Source
/
C
/
Main
< prev
next >
Wrap
Text File
|
1994-08-04
|
10KB
|
414 lines
/* 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