/**************************************************************************/ /* FILE: MENU.C PROGRAM TITLE: DeskSET II Alpha Version */ /* Date Created: 01/08/88 */ /* Last Modified: 06/30/89 */ /* */ /* Description: MENU ROUTINES */ /* Routines: o do_view_size() - change viewing scale handler */ /* o genesis_region() - Create a new region */ /* o graphic_region() - Create Graphic Region */ /* o close_region() - Close a regions */ /* o draw_item() - Chooses function to draw with */ /* o erase_all() - Deletes regions */ /* o do_flip_page() - Previous and Next Page Handler */ /* o make_article() - Create Article */ /* o close_article() - Close Article */ /* o do_hot_link() - perform linking of regions */ /* o check_top_window() - is preview window on top? */ /* o display_toggle() - toggle to show/noshow images */ /* o do_artdelete() - Delete selected article */ /* o do_artopen() - Open selected article for link */ /* o reopen_region() - reopen a region - add primitive*/ /* o del_prim() - delete currect active primitive*/ /* o router_selected() - draw outline arnd active region*/ /* o post_edit_prim() - conclusion of prim edit fnctns */ /* o outline_primman() - Draw outline arnd active prim */ /**************************************************************************/ /**************************************************************************/ /* INCLUDE FILES */ /**************************************************************************/ #include "define.h" #include "deskset2.h" #include #include "gemdefs.h" #include #include "alert.h" #include "dbase.h" /**************************************************************************/ /* DEFINES */ /**************************************************************************/ #define MINSIZE 5000L /**************************************************************************/ /* EXTERNALS */ /**************************************************************************/ extern int view_size; /* Current scaling size */ extern OBJECT *ad_menu; /* Address of menu tree */ extern OBJECT *ad_set_size; /* Address of dialog box */ extern OBJECT *ad_point_size; /* address of dialog box */ extern OBJECT *ad_go_page; /* Current Page dialog */ extern OBJECT *ad_get_image; extern OBJECT *adoutput; extern OBJECT *ad_bkgrnd; extern OBJECT *ad_filebuf; extern char rscerr2[]; extern char linkerr[]; extern int prev_handle; /* Preview window handle */ extern int msg_buff[]; /* evnt multi buffer */ extern int dummy; /* well, dummy... */ extern int curr_page; /* current page */ extern int ptsarray[]; /* Interface to structures*/ extern int mhandle; /* Preview buffer handle */ extern int mxres,myres; extern int shandle; extern int phandle; extern int pxy[]; extern int prev_size; extern int (*funcs)(); /* drawing function */ extern int poly_draw(); /* polygon drawing... */ extern int ellipse_draw(); /* ellipse drawing... */ extern int circle_draw(); /* circle drawing... */ extern int box_draw(); /* box drawing... */ extern int nada(); /* null function */ extern char *winfo[][4]; /* preview text info line */ extern GRECT dpwork; /* work area of window */ extern GRECT pwork; /* Preview work area */ extern int scale_set; /* User defined scale fact*/ extern GRECT page_area; /* GRECT area Preview area*/ extern long getf_article(); extern long get_fpage(); extern long get_npage(); extern long get_fregion(); /* Get first region */ extern long get_nregion(); /* Get next region */ extern unsigned long region_ptr; /* Pointer to curr region */ extern unsigned long page_ptr; /* Ptr to Preview Buffer */ extern unsigned long pagesc; extern unsigned long prev_bytes; extern int SH; /* Point Size... */ extern int mode_change; /* text/mask changed? */ extern int zdevice; /* index into xdpi/ydpi */ extern long find_region(); extern long create_region(); extern char fbuffer[]; extern int cur_point_size; /* Current Point Size */ extern int graph_flag; extern int image_status; extern struct txtattr gltxtattr; /* Global text attributes */ extern int glgrattr[]; /* Global graphic attrib */ extern char pathbuf[]; extern int pagew,pageh; extern int blit_flag; extern int force_draw_flag; extern long do_artobj(); extern long get_regart(); extern char *get_lmem(); extern int intout[]; typedef struct dta { char res[21]; char attr; int time; int date; long fsize; char str[14]; } DTA; extern DTA thedta; extern char not_found[]; extern char dprint[]; extern long get_curreg(); extern int deferhj; extern int pxres; extern int pyres; extern int alt_offset; extern int active_prim; extern int xor_handle; extern int hpage_size; extern char *dpath1; extern char *dpath2; extern char *dpath3; extern char *dpath4; extern long lcalloc(); extern int BSTATE; extern int BREAL; extern long prim_ptr; extern int active_prim; extern int *icdata; extern int *primicons; extern BITBLK *bgicptr; extern int show_grids; extern int snap_to_grids; extern PAGE *tpagehd; extern PAGE *tcurpage; extern int temp_page; extern PAGE *pagehd; extern PAGE *curpage; extern PAGE *left_tmplate; extern PAGE *right_tmplate; extern int displ_tmpl_flag; extern ARTICLE *rtarthd; extern ARTICLE *ltarthd; extern ARTICLE *tarthd; extern ARTICLE *arthd; extern int multi_mode; extern FDB page_MFDB; extern int unit_type; extern int TYF_handle; extern REGION *curregion; extern FDB laser_MFDB; extern int pagetype; extern int vpage_size; extern long lmalloc(); extern long laser_bytes; /**************************************************************************/ /* GLOBAL VARIABLES */ /**************************************************************************/ char *ruler_mode[] = { " Show Ruler ^R", " Hide Ruler ^R" }; char *mode_text[] = { /* Menu text for modes */ " Show Text ^T", " Show Mask ^T" }; char *write_mode[] = { /* writing mode... */ " Add Object ", " Subtract Obj " }; char *template_mode[] = { " Edit Base Page ", " Edit Preview " }; char *disp_tmpl[] = { " Display Base Page ", " Hide Base Page " }; int tmplate_flag; int mode_flag; /* current fill mode... */ int write_flag; /* current writing mode */ int print_flag; /* Printing to Laser? */ int article_flag; /* 0 - no article, 1 - */ /* then in create article */ int cur_scale; /* current scale in % */ #define linkSIZE 37 /* Link mouse form */ short mlink[linkSIZE] = { 0x0000,0x0000,0x0001,0x0000,0x0001, 0x7FE0,0xFFF0,0xFFF0,0xFFF0,0xFFFE,0xFFFF,0xFFFF,0xFFFF, 0xFFFF,0xFFFF,0xFFFF,0x7FFF,0x0FFF,0x0FFF,0x0FFF,0x07FE, 0x0000,0x3FC0,0x7FE0,0x6060,0x6060,0x636C,0x676E,0x6666, 0x6666,0x76E6,0x36C6,0x0606,0x0606,0x07FE,0x03FC,0x0000 }; extern short mlink1[]; int cur_primitive; /* current primitive */ /* according to RCS index */ int cur_pic_type; /* Neo, IMG, Meta file */ unsigned long gl_region_ptr; /* current OPEN/SELECTED */ /* pointer to region */ unsigned long gl_grregion_ptr; /* pointer to region */ int gl_lstyle; /* Global line attributes */ int gl_lwidth; int gl_fstyle; /* Global fill attributes */ int gl_findex; int gl_repel; int gl_repbounds; int gl_repoffset; int art_append; /* Append region to article */ /* or insert in middle if 0 */ long insert_artptr; /* Article to insert to */ long insert_regptr; /* Region to insert after */ int reopen_prim; /* flag if reopen_region() */ long daveptr; /* daves's 4800 xxx buffer */ /**************************************************************************/ /* Function: do_view_size() */ /* Description: Handler for menu to switch scales - Actual size etc.. */ /* checks the chosen item. */ /* Institutes a redraw of the preview window. */ /* IN: item - menu item */ /* OUT: none */ /* GLOBAL: page_area - resets GRECT for the MFDB */ /**************************************************************************/ do_view_size(item) int item; { register int i; int prev_item; int titem; prev_item = view_size; if(view_size != item) { view_size = item; for(i=PSIZE;i<= PADJCNT;i++) menu_icheck(ad_menu,i,FALSE); menu_icheck(ad_menu,item,TRUE); if((item == PADJCNT) || (prev_size == PADJCNT)) recalc_alt_text(); prev_item = item; if(view_size != PADJCNT) titem = item; else { titem = ((curr_page % 2) ? (item + 1) : (item)); } wind_set(prev_handle,WF_INFO,winfo[titem - PSIZE][unit_type]); wind_set(prev_handle,WF_TOP,&dummy,&dummy,&dummy,&dummy); page_area.g_x = page_area.g_y = 0L; active_prim = 0; /* reset primitives */ gsx_moff(); vsf_interior(shandle,0); /* Set to Solid */ alt_offset = FALSE; if( (view_size == PSIZE) || (view_size == PADJCNT)) pdraw_fit(view_size); else pdraw_scale(); prev_size = view_size; zoom_setup(); cur_scale = get_scale_num(view_size); get_work(prev_handle); update_preview_blit(); set_clip(TRUE,&pwork); vr_recfl(shandle,pxy); clear_window(prev_handle,2,1); init_rulers(); graf_mouse(BUSY_BEE,&dummy); force_preview(); slider_chk(); set_clip(TRUE,&dpwork); graf_mouse(ARROW,&dummy); gsx_mon(); } } /**************************************************************************/ /* Function: genesis_region() */ /* Description: Creates a NEW region */ /* Disables close region. */ /* enables the drawing primitives. */ /**************************************************************************/ genesis_region() { register int i; long msize; if( (msize = Malloc(-1L)) <= MINSIZE) { alert_cntre(ALERT23); return; } menu_ienable(ad_menu,RCREATE,FALSE); menu_ienable(ad_menu,ROPENGR,FALSE); menu_ienable(ad_menu,RCLOSE,TRUE); menu_ienable(ad_menu,RTOGGLE,FALSE); menu_ienable(ad_menu,OADDPRIM,FALSE); menu_ienable(ad_menu,OPCOORD,FALSE); menu_ienable(ad_menu,OMOVEFNT,FALSE); menu_ienable(ad_menu,OMOVEBAK,FALSE); menu_ienable(ad_menu,ODELPRIM,FALSE); menu_ienable(ad_menu,RCOORD,FALSE); menu_ienable(ad_menu,RMOVEFNT,FALSE); menu_ienable(ad_menu,RMOVEBAK,FALSE); active_prim =FALSE; prim_ptr = 0L; for(i=OPOLYGON;i<=OBOX;i++) menu_ienable(ad_menu,i,TRUE); check_region_ptr(); gl_region_ptr = create_region(curr_page,FALSE); /* init_tattr(); Remove? This would setup each region with its Defaults. Not what is in the font dialog box */ funcs = &box_draw; put_txtattr(gl_region_ptr,&gltxtattr); /* and store in region */ check_top_window(); graf_mouse(OUTLN_CROSS,&dummy); } /**************************************************************************/ /* Function: graphic_region() */ /* Description: Creates a NEW graphic region */ /* Disables close region. */ /* enables the drawing primitives. */ /**************************************************************************/ graphic_region() { register int i; long msize; if( (msize = Malloc(-1L)) <= MINSIZE ) { alert_cntre(ALERT23); return; } change_icstate(NORMAL,ICBOX1,1); menu_ienable(ad_menu,RCREATE,FALSE); menu_ienable(ad_menu,ROPENGR,FALSE); menu_ienable(ad_menu,RCLOSE,TRUE); menu_ienable(ad_menu,RTOGGLE,FALSE); menu_ienable(ad_menu,OADDPRIM,FALSE); menu_ienable(ad_menu,OPCOORD,FALSE); menu_ienable(ad_menu,OMOVEFNT,FALSE); menu_ienable(ad_menu,OMOVEBAK,FALSE); menu_ienable(ad_menu,ODELPRIM,FALSE); menu_ienable(ad_menu,RCOORD,FALSE); menu_ienable(ad_menu,RMOVEFNT,FALSE); menu_ienable(ad_menu,RMOVEBAK,FALSE); active_prim = FALSE; prim_ptr = 0L; for(i=OPOLYGON;i<=OIMAGE;i++) menu_ienable(ad_menu,i,TRUE); write_flag = TRUE; menu_text(ad_menu,RWRITE,write_mode[write_flag]); check_region_ptr(); gl_grregion_ptr = create_region(curr_page,TRUE); graph_flag = TRUE; glgrattr[0] = gl_lstyle; glgrattr[1] = gl_lwidth; glgrattr[2] = gl_fstyle; glgrattr[3] = gl_findex; glgrattr[4] = gl_repel; glgrattr[5] = gl_repoffset; glgrattr[6] = gl_repbounds; glgrattr[7] = glgrattr[8] = 0; put_grattr(gl_grregion_ptr,glgrattr); /* and store in region */ funcs = &box_draw; check_top_window(); graf_mouse(OUTLN_CROSS,&dummy); } /**************************************************************************/ /* Function: close_region() */ /* Description: Closes a region */ /* IN: none */ /* OUT: none */ /* GLOBAL: funcs - current drawing function set to null */ /* Disables close_region/enables create region */ /* Disables drawing primitives. */ /**************************************************************************/ close_region() { int grtype; long tmpreg; register int i; int x,y; int opcode,count,wmode; tmpreg = get_curreg(&grtype); if(reopen_prim) { reopen_prim = FALSE; page_redraw(tmpreg); open_region(tmpreg); } if(grtype) { gl_grregion_ptr = tmpreg; update_repel(1,0L); gl_grregion_ptr = 0L; } if(!mode_flag) /* Don't enable if we're displaying text */ menu_ienable(ad_menu,RCREATE,TRUE); menu_ienable(ad_menu,ROPENGR,TRUE); menu_ienable(ad_menu,RCLOSE,FALSE); menu_ienable(ad_menu,RTOGGLE,TRUE); menu_ienable(ad_menu,RWRITE,TRUE); menu_ienable(ad_menu,OADDPRIM,FALSE); active_prim = FALSE; for(i=OPOLYGON;i<=OIMAGE;i++) menu_ienable(ad_menu,i,FALSE); funcs = &nada; gl_region_ptr = gl_grregion_ptr = region_ptr = 0L; if(multi_mode) { clr_multi_flags(curr_page); multi_mode = 0; } graph_flag = cur_primitive = FALSE; if(!article_flag) { write_flag = 1; /* image_status = FALSE;*/ menu_text(ad_menu,RTOGGLE,mode_text[mode_flag]); menu_text(ad_menu,RWRITE,write_mode[write_flag]); /* menu_icheck(ad_menu,RDIMAGES,FALSE);*/ menu_ienable(ad_menu,ACREATE,TRUE); graf_mouse(ARROW,&dummy); } rmenu_fix(0); if(bgicptr->bi_pdata == primicons) { bgicptr->bi_pdata = icdata; objc_offset(ad_bkgrnd,BGICBOX,&x,&y); ad_bkgrnd[ICBOX6].ob_state = NORMAL; ad_bkgrnd[ICBOX7].ob_state = NORMAL; ad_bkgrnd[ICBOX8].ob_state = NORMAL; clr_bgicons(0); if(mode_flag) { change_icstate(DISABLED,ICBOX1,0); change_icstate(SELECTED,ICBOX3,0); } if(image_status) change_icstate(SELECTED,ICBOX4,0); if(show_grids) change_icstate(SELECTED,ICBOX7,0); if(snap_to_grids) change_icstate(SELECTED,ICBOX8,0); form_dial(3,0,0,0,0,x,y, ad_bkgrnd[BGICBOX].ob_width, ad_bkgrnd[BGICBOX].ob_height); } opcode = get_fprimitive(tmpreg,&count,&wmode); if(opcode == -1 || !count) /* If empty region */ delete_region(tmpreg); } /**************************************************************************/ /* Function: draw_items() */ /* Description: Draws objects into the region */ /* Selects the function to draw with. */ /* IN: item - menu item selected. */ /* GLOBAL: funcs - function points to function to draw with. */ /**************************************************************************/ draw_items(item) int item; { cur_primitive = item; switch(item) { case OPOLYGON: funcs = &poly_draw; break; case OCIRCLE: funcs = &circle_draw; break; case OELLIPSE: funcs = &ellipse_draw; break; case OBOX: funcs = &box_draw; break; case OLINE: funcs = &poly_draw; break; case ORBOX: funcs = &box_draw; break; case OIMAGE: funcs = &box_draw; if(!get_image()) return; break; } graf_mouse(OUTLN_CROSS,&dummy); evnt_button(1,1,0,&dummy,&dummy,&dummy,&dummy); } /**************************************************************************/ /* Function: erase_all() */ /* Description: Deletes all regions in data structure */ /* Unless the Alert Box button == CANCEL */ /* Deletes all pages */ /* Deletes all articles */ /**************************************************************************/ erase_all(flag) int flag; /* Clean up more stuff if not quitting */ { int dummy; long art; if(tmplate_flag && flag) { pagehd = tpagehd; curpage = tcurpage; arthd = tarthd; tmplate_flag = FALSE; wind_set(prev_handle,WF_NAME,"Preview Window",0,0); menu_text(ad_menu,OEDITTMP,template_mode[tmplate_flag]); menu_ienable(ad_menu,OERASETP,FALSE); menu_ienable(ad_menu,PGOTO,TRUE); menu_ienable(ad_menu,PDELETE,TRUE); menu_ienable(ad_menu,PINSERT,TRUE); } clear_tags(); get_fpage(&dummy); while(delete_page()); art = getf_article(); while(delete_article()); if(flag) { IF_close(); IF_open(0); /* Free cache memory */ gl_grregion_ptr = gl_region_ptr = 0L; multi_mode = 0; temp_page = curr_page = 1; page_area.g_x = page_area.g_y = 0L; slider_chk(); force_preview(); do_pagenum(curr_page,(curr_page%2)?1:0); } } /**************************************************************************/ /* Function: do_flip_page() */ /* Description: Handles Previous and Next Page Menu Calls */ /**************************************************************************/ do_flip_page(item) int item; { register int tmp; int titem; int flag; tmp = curr_page; titem = view_size; tmp = ((item == PPREV) ? (--tmp) :(++tmp)); if(tmplate_flag) { if(tmp < -2) tmp = -2; if(tmp > -1) tmp = -1; if(tmp == -2) { curpage = pagehd = left_tmplate; rtarthd = arthd; /* cjg */ arthd = ltarthd; } else { curpage = pagehd = right_tmplate; ltarthd = arthd; /* cjg */ arthd = rtarthd; } } else { if(tmp < 0) tmp = 0; if(tmp > 999) tmp = 999; } curr_page = tmp; set_int(ad_go_page,GOTOPAGE,curr_page); flag = TRUE; if(view_size == PADJCNT) { titem = ((curr_page % 2) ? (titem + 1) : (titem)); wind_set(prev_handle,WF_INFO,winfo[titem - PSIZE][unit_type]); if(item == PPREV) flag = (( !(curr_page % 2)) ? (FALSE):(TRUE)); else flag = ((curr_page % 2) ? (FALSE):(TRUE)); } if(flag) { mode_change = TRUE; force_preview(); } else do_blit(); } /**************************************************************************/ /* Function: make_article() */ /* Description: Creates Article */ /**************************************************************************/ make_article() { long msize; int dummy; int button; int x,y,w,h; long num; if( (msize = Malloc(-1L)) <= MINSIZE) { alert_cntre(ALERT23); return; } strcpy(pathbuf,dpath1); strcat(pathbuf,"*.TXT"); if(!get_fs(fbuffer,&dummy)) { graf_mouse(ARROW,&dummy); return; } extender(fbuffer,".TXT"); Fsetdta(&thedta.res[0]); if(Fsfirst(fbuffer,0) <= -1) { /* if((alert_cntre(ALERT24)==1))*/ set_int(ad_filebuf,FBUFSIZE,10); form_center(ad_filebuf,&x,&y,&w,&h); form_dial(0,0,0,36,36,x,y,w,h); objc_draw(ad_filebuf,0,MAX_DEPTH,x,y,w,h); err: button = form_do(ad_filebuf,FBUFSIZE); ad_filebuf[button].ob_state = NORMAL; if(button == FBUFOK) { num = get_int(ad_filebuf,FBUFSIZE); if(num < 10) { objc_draw(ad_filebuf,FBUFOK,MAX_DEPTH,x,y,w,h); goto err; } form_dial(3,0,0,3,36,x,y,w,h); num *= 1024L; if( (msize = Malloc(-1L)) <= num) { alert_cntre(ALERT23); graf_mouse(ARROW,&dummy); /* Abort */ return; } ed_new_article(num); /* Create new file with editor */ } else { graf_mouse(ARROW,&dummy); /* Abort */ form_dial(3,0,0,3,36,x,y,w,h); return; } } else loadfile(fbuffer); amenu_fix(1); graf_mouse(2,&dummy); create_article(); remove_path(fbuffer); update_article(fbuffer); graf_mouse(ARROW,&dummy); art_append = TRUE; menu_ienable(ad_menu,ASAVEART,FALSE); menu_ienable(ad_menu,AAUTOFL,TRUE); menu_ienable(ad_menu,ACLOSE,TRUE); menu_ienable(ad_menu,ACREATE,FALSE); menu_ienable(ad_menu,OADDPRIM,FALSE); graf_mouse(255,mlink); article_flag = TRUE; check_top_window(); } /**********************************************************************/ /* Function: ed_new_article() */ /* Description: Setup buffers to edit a new article */ /**********************************************************************/ ed_new_article(msize) long msize; { long chbuff; if(chbuff = lcalloc(1L,msize)) /* Allocate initial buffer */ { init_buffer(chbuff,chbuff+msize); set_buffer(0L); return(1); } return(0); } /**************************************************************************/ /* Function: close_article() */ /* Description: Closes Article */ /**************************************************************************/ close_article() { menu_ienable(ad_menu,ASAVEART,TRUE); menu_ienable(ad_menu,AAUTOFL,FALSE); menu_ienable(ad_menu,ACREATE,TRUE); menu_ienable(ad_menu,ACLOSE,FALSE); graf_mouse(2,&dummy); if(tmplate_flag) { if(curr_page == -2) ltarthd = arthd; else rtarthd = arthd; } article_flag = FALSE; do_update_text(); if(mode_flag) force_preview(); graf_mouse(0,&dummy); amenu_fix(0); region_ptr = gl_region_ptr = gl_grregion_ptr = 0L; } /**************************************************************************/ /* Function: do_hot_link() */ /* Description: Link regions togethor for articles */ /**************************************************************************/ do_hot_link(mx,my) int mx,my; { int nmx,nmy; int g_flag; int tpage; int dummy; tpage = curr_page; scrntomu(mx,my,&nmx,&nmy,0); if(view_size == PADJCNT) { if(alt_offset) { if(!(curr_page % 2)) curr_page++; } else { if( curr_page % 2) curr_page--; } } region_ptr = find_region(nmx,nmy,curr_page, &dummy,&dummy,&dummy,&dummy,&g_flag); if(region_ptr) { if(get_regart(region_ptr)) { alert_cntre(ALERT5); return; } if((region_ptr != 0x0L) && !g_flag) { if(art_append) add_to_article(region_ptr); else insert_to_article(insert_artptr,insert_regptr,region_ptr); if(mode_flag) { mlink1[3] = 0; mlink1[4] = 1; } else { mlink1[3] = 1; mlink1[4] = 0; } graf_mouse(255,mlink1); } } curr_page = tpage; graf_mkstate(&nmx,&nmy,&dummy,&dummy); evnt_mouse(1,nmx - 4,nmy - 4,8,8,&dummy,&dummy,&dummy,&dummy); graf_mouse(255,mlink); BSTATE = 0; } /**************************************************************************/ /* Function: check_top_window */ /* Description: checks if preview window is on top, and forces it to be */ /**************************************************************************/ check_top_window() { int thandle; wind_get(0,WF_TOP,&thandle,&dummy,&dummy,&dummy); if(thandle != prev_handle) wind_set(prev_handle,WF_TOP,0,0,0,0); } /**************************************************************************/ /* Function: display_toggle() */ /* Description: */ /**************************************************************************/ display_toggle() { int x,y; menu_ienable(ad_menu,RCREATE,mode_flag); menu_ienable(ad_menu,RWRITE,mode_flag); menu_ienable(ad_menu,ADEFER,mode_flag); mode_flag ^= TRUE; if(mode_flag && deferhj) { deferhj = 0; menu_icheck(ad_menu,ADEFER,0); recalc_txtptrs(); } if(mode_flag) { ad_bkgrnd[ICBOX1].ob_state = DISABLED; menu_ienable(ad_menu,OADDPRIM,FALSE); } else { ad_bkgrnd[ICBOX1].ob_state = NORMAL; } objc_offset(ad_bkgrnd,ICBOX1,&x,&y); form_dial(3,0,0,0,0,x,y, ad_bkgrnd[ICBOX1].ob_width, 2*ad_bkgrnd[ICBOX1].ob_height); menu_text(ad_menu,RTOGGLE,mode_text[mode_flag]); mode_change = TRUE; force_preview(); /* send_redraw(prev_handle);*/ } /**************************************************************************/ /* Function: do_artdelete() */ /* Description: Delete the selected article. */ /**************************************************************************/ do_artdelete() { long artptr; artptr = do_artobj(); if(artptr) { open_article(artptr); delete_article(); force_draw_flag = 1; force_preview(); } } /**************************************************************************/ /* Function: do_artopen() */ /* Description: Open the selected article and link regions to it. */ /**************************************************************************/ do_artopen() { int dolink; long artptr; dolink = 0; if(gl_region_ptr) { if((insert_artptr = get_regart(gl_region_ptr))) { open_article(insert_artptr); insert_regptr = gl_region_ptr; art_append = FALSE; dolink = TRUE; } } else { artptr = do_artobj(); if(artptr) { open_article(artptr); dolink = TRUE; art_append = TRUE; } } if(dolink) { amenu_fix(1); menu_ienable(ad_menu,ASAVEART,FALSE); menu_ienable(ad_menu,ACLOSE,TRUE); menu_ienable(ad_menu,ACREATE,FALSE); graf_mouse(255,mlink); article_flag = TRUE; } } do_saveart() { long artptr; artptr = do_artobj(); if(artptr) { save_article(artptr); } } /**************************************************************************/ /* Handle autoflow of regions into the article */ /**************************************************************************/ do_autoflow() { int minpage,maxpage; int page; register long pptr,rptr; int gflag; int x; if(!get_range(&minpage,&maxpage)) return; pptr = get_fpage(&page); if(!pptr) return; while(pptr) { if(page >= minpage && page <= maxpage) { rptr = get_fregion(page,&x,&x,&x,&x,&gflag); while(rptr) { if((!get_regart(rptr)) && (!gflag)) { add_to_article(rptr); } rptr = get_nregion(&x,&x,&x,&x,&gflag); } } pptr = get_npage(&page); } close_article(); } /**************************************************************************/ /* Function: reopen_region() */ /* Description: opens an existing region for adding more primitives */ /**************************************************************************/ reopen_region() { int type; register int i; int j; unsigned long tregion; tregion = get_curreg(&type); menu_ienable(ad_menu,RCLOSE,TRUE); menu_ienable(ad_menu,RCREATE,FALSE); menu_ienable(ad_menu,OADDPRIM,FALSE); menu_ienable(ad_menu,RTOGGLE,FALSE); menu_ienable(ad_menu,ROPENGR,FALSE); write_flag = TRUE; menu_text(ad_menu,RWRITE,write_mode[write_flag]); if(type) { graph_flag = TRUE; j = OIMAGE; } else j = OBOX; for(i=OPOLYGON;i<=j;i++) menu_ienable(ad_menu,i,TRUE); check_top_window(); reopen_prim = TRUE; funcs = &box_draw; graf_mouse(OUTLN_CROSS,&dummy); } /**************************************************************************/ /* Function: del_prim() */ /* Description: Delete the current active primitive */ /**************************************************************************/ del_prim() { unsigned long tregion; int oldrect[4]; int dummy; REGION *tptr; int type; if(!region_ptr) /* Well, if no active region...*/ { /* how can we have an active */ clear_regprim_flags(); /* primitive?...:-) */ return; } if((alert_cntre(ALERT40) == 1)) { find_boundary(region_ptr,&oldrect[0],&oldrect[1],&oldrect[2], &oldrect[3],&type,&dummy); delete_primitive(); menu_ienable(ad_menu,ODELPRIM,FALSE); menu_ienable(ad_menu,OPCOORD,FALSE); menu_ienable(ad_menu,OMOVEFNT,FALSE); menu_ienable(ad_menu,OMOVEBAK,FALSE); active_prim = FALSE; tptr = tregion = region_ptr; open_region(tregion); recalc_region(); if(tptr->primlist == 0L) /* if last primitive, delete region also */ { tregion = 0L; do_delregion(); clear_regprim_flags(); return; } if(!type) { page_redraw(region_ptr); redraw_area(region_ptr,oldrect,1); /* Cleanup old area */ } else update_repel(1,oldrect); region_ptr = tregion; if(region_ptr) router_selected(); } } /**************************************************************************/ /* Function: router_selected() */ /* Description: Draws outline on current active region */ /**************************************************************************/ router_selected() { int page; int minx,miny,maxx,maxy; int type; find_boundary(region_ptr,&minx,&miny,&maxx,&maxy,&type,&page); outline_primman(minx,miny,maxx,maxy,type,page); } /**************************************************************************/ /* Function: post_edit_prim() */ /* Description: Conclusion of prim editing functions */ /**************************************************************************/ post_edit_prim(opcode,pcount,wmode,prim_ptr) int opcode; int pcount; int wmode; long prim_ptr; { unsigned long tregion_ptr; int mx,my,mbutton; int minx,miny,maxx,maxy; int type; int page; int oldrect[4]; int dummy; find_boundary(region_ptr,&oldrect[0],&oldrect[1],&oldrect[2], &oldrect[3],&dummy,&dummy); update_primitive(opcode,pcount,wmode,0); recalc_region(); tregion_ptr = region_ptr; graf_mkstate(&mx,&my,&mbutton,&dummy); if(gl_region_ptr) { if(view_size != PADJCNT) { tregion_ptr = region_ptr; redraw_area(region_ptr,oldrect,1); /* Cleanup old area */ region_ptr = gl_region_ptr = tregion_ptr; } page_redraw(gl_region_ptr); gl_region_ptr = tregion_ptr; } else { update_repel(1,oldrect); gl_grregion_ptr = tregion_ptr; } region_ptr = tregion_ptr; active_prim = TRUE; open_region(region_ptr); set_cur_prim(prim_ptr); calc_prim(opcode,&minx,&miny,&maxx,&maxy,pcount); find_page(region_ptr,&page); region_ptr = get_curreg(&type); outline_primman(minx,miny,maxx,maxy,type,page); } /**************************************************************************/ /* Function: outline_primman() */ /* Description: Draws outline arnd active primitive */ /* Works in unison with post_edit_prim() */ /**************************************************************************/ outline_primman(minx,miny,maxx,maxy,type,page) int minx,miny,maxx,maxy; int type,page; { if(type) gl_grregion_ptr = region_ptr; else gl_region_ptr = region_ptr; if((page % 2) && (view_size == PADJCNT)) { alt_offset = TRUE; minx += hpage_size; maxx += hpage_size; } mutoscrn(minx,miny,&pxy[0],&pxy[1],0); mutoscrn(maxx,maxy,&pxy[2],&pxy[3],0); gsx_moff(); do_outline(xor_handle,pxy); gsx_mon(); } region_front() { if(!region_ptr) /* if none selected, return */ { clear_regprim_flags(); return; /* Just in case */ } do_reg_front(region_ptr); redr_regarea(region_ptr,1); clear_regprim_flags(); } region_back() { if(!region_ptr) /* if none selected, return */ { clear_regprim_flags(); return; /* Just in case */ } do_reg_back(region_ptr); redr_regarea(region_ptr,1); clear_regprim_flags(); } prim_front() { unsigned long pptr; int wrmode; int count; if(!region_ptr) /* if none selected, return */ { clear_regprim_flags(); return; /* Just in case */ } get_cur_prim(&count,&wrmode,&pptr); if(!pptr) { clear_regprim_flags(); return; } do_prim_front(pptr); redr_regarea(region_ptr,1); clear_regprim_flags(); } prim_back() { unsigned long pptr; int wrmode; int count; if(!region_ptr) /* if none selected, return */ { clear_regprim_flags(); return; /* Just in case */ } get_cur_prim(&count,&wrmode,&pptr); if(!pptr) { clear_regprim_flags(); return; } do_prim_back(pptr); redr_regarea(region_ptr,1); clear_regprim_flags(); } clear_regprim_flags() { curregion = prim_ptr = gl_grregion_ptr = gl_region_ptr = region_ptr = 0L; if(multi_mode) { clr_multi_flags(curr_page); multi_mode = 0; } active_prim = FALSE; menu_ienable(ad_menu,OADDPRIM,FALSE); menu_ienable(ad_menu,ODELPRIM,FALSE); menu_ienable(ad_menu,OPCOORD,FALSE); menu_ienable(ad_menu,OMOVEFNT,FALSE); menu_ienable(ad_menu,OMOVEBAK,FALSE); menu_ienable(ad_menu,RUNLINK,FALSE); menu_ienable(ad_menu,RDELETE,FALSE); menu_ienable(ad_menu,RCOORD,FALSE); menu_ienable(ad_menu,RMOVEFNT,FALSE); menu_ienable(ad_menu,RMOVEBAK,FALSE); } recalc_alt_text() { PAGE *rpagehd; PAGE *rcurpage; int rcurr_page; ARTICLE *rarthd; recalc_txtptrs(); /* recalc current page */ rpagehd = pagehd; /* save the settings */ rcurpage = curpage; rcurr_page = curr_page; rarthd = arthd; if(tmplate_flag) /* take care of preview window */ { /* and other tmplate page */ arthd = ((curr_page % 2)?(ltarthd):(rtarthd)); pagehd = curpage = ((curr_page%2)?(left_tmplate):(right_tmplate)); curr_page = pagehd->pagenum; recalc_txtptrs(); arthd = tarthd; /* recalc preview text */ pagehd = tpagehd; curpage = tcurpage; curr_page = temp_page; recalc_txtptrs(); } else /* recalc left and right tmplates*/ { arthd = ltarthd; pagehd = curpage = left_tmplate; curr_page = pagehd->pagenum; recalc_txtptrs(); /* recalc left tmplate page */ arthd = rtarthd; /* and recalc right tmplate */ pagehd = curpage = right_tmplate; curr_page = pagehd->pagenum; recalc_txtptrs(); } pagehd = rpagehd; /* restore previous settings */ curpage = rcurpage; curr_page = rcurr_page; arthd = rarthd; } /**************************************************************************/ /* Function: output_doc() */ /* Description: kicks out a file to either the printer or a TDO file... */ /**************************************************************************/ output_doc() { int pagenum; int button; int copies; int lastpage; int firstp; int lastp; int firstpage; PAGE *rpagehd; PAGE *rcurpage; int rtemp_page; int tdisp_flag; int rtmplate_flag; int timage_status; ARTICLE *rarthd; long freemem; int mem_needed; int device; int tview; int dxres,dyres; long *landptr,*landesc; int pxy[4]; long membytes; rtmplate_flag = tmplate_flag; rtemp_page = curr_page; timage_status = image_status; image_status = TRUE; if(tmplate_flag) { rpagehd = pagehd; rcurpage = curpage; rarthd = arthd; pagehd = tpagehd; curpage = tcurpage; arthd = tarthd; tmplate_flag = FALSE; } tdisp_flag = displ_tmpl_flag; displ_tmpl_flag = TRUE; graf_mouse(ARROW,&dummy); mem_needed = 0; device = OTDO; if(get_fpage(&pagenum)) { set_int(adoutput,OFROMPAG,pagenum); firstpage = pagenum; do { lastpage = pagenum; }while(get_npage(&pagenum)); set_int(adoutput,OTOPAGE,lastpage); set_int(adoutput,OCOPIES,1); adoutput[OPRINTER].ob_state = SELECTED; adoutput[OTDO].ob_state = NORMAL; button = execform(adoutput,OCOPIES); graf_mouse(BUSY_BEE,&dummy); /* busy bee */ adoutput[button].ob_state = NORMAL; /* reset button */ if(button == OPRINT) { copies = get_int(adoutput,OCOPIES); firstp = max(get_int(adoutput,OFROMPAG),firstpage); lastp = min(get_int(adoutput,OTOPAGE),lastpage); if(lastp < firstp) lastp = 9999; if(deferhj) /* if H&J deferred, recalc text)*/ { menu_icheck(ad_menu,ADEFER,0); deferhj = 0; tview = view_size; view_size = PACTUAL; recalc_alt_text(); view_size = tview; } if(!deferhj && view_size == PADJCNT) { tview = view_size; view_size = PACTUAL; recalc_alt_text(); view_size = tview; } if(adoutput[OPRINTER].ob_state == SELECTED) { device = OPRINTER; freemem = Malloc(-1L); if(freemem < 1230000L) { mem_needed = 1; Mfree(page_ptr); /* Free page buffer */ } if(pagetype > PLEGAL) { mutolas(hpage_size,vpage_size,&dxres,&dyres); membytes = (long)(((((long)dxres + 15L)/16L)*16L)*((((long)dyres + 15L)/16L) * 16L)); membytes /= 8L; membytes += 1; membytes &= 0xFFFFFFFEL; landptr = landesc = Malloc(membytes); daveptr = Malloc(20000L); if(!landptr || !daveptr) { alert_cntre(ALERT3); goto leave; } GDvq_extnd(mhandle,0,intout,dxres,dyres,&landesc); dxres -= 1; dyres -= 1; } else { landptr = 0L; dxres = dyres = 0; } if(!laser_open(landptr,dyres,dxres)) { switch(intout[0]) { case 1: /* No Printer Attached */ alert_cntre(ALERT41); break; case 2: /* Not Enough Memory */ alert_cntre(ALERT42); break; case 3: /* Wrong Paper Size with Landscape */ alert_cntre(ALERT43); break; default: /* Catch All Phrase...*/ alert_cntre(ALERT3); break; } } else { if(pagetype > PLEGAL) { mutolas(hpage_size,vpage_size,&dxres,&dyres); GDvq_extnd(mhandle,0,intout,dxres,dyres,&landesc); laser_MFDB.fd_w = dxres; laser_MFDB.fd_h = dyres; laser_MFDB.fd_wdwidth = (dxres + 15)/16; laser_bytes = membytes; pxy[0] = pxy[1] = 0; pxy[2] = dxres-1; pxy[3] = dyres-1; vs_clip(mhandle,1,pxy); } laser_out(firstp,lastpage,mem_needed,copies,lastp); laser_close(); IF_close(); /* clear the font cache*/ IF_open(0); } leave: print_flag = FALSE; if(pagetype > PLEGAL) { if(landesc) Mfree(landesc); if(daveptr) Mfree(daveptr); landesc = daveptr = 0L; } if(mem_needed) { page_ptr = pagesc = (unsigned long) Malloc(prev_bytes); page_MFDB.fd_addr = page_ptr; GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr); } if((pagetype > PLEGAL) && !mem_needed) /* reset ptrs...*/ GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr); mclip(); } else /* TDO */ { device = OTDO; force_blit_redraw(0); tdo_out(firstp,lastpage,lastp,copies); } } /* End of Ok BUTTON TO PRINT */ } /* end of no pages to print in the first place */ tmplate_flag = rtmplate_flag; curr_page = rtemp_page; image_status = timage_status; if(tmplate_flag) { pagehd = rpagehd; curpage = rcurpage; arthd = rarthd; } if(device == OPRINTER) { if(view_size == PADJCNT) recalc_alt_text(); } displ_tmpl_flag = tdisp_flag; /* if(mem_needed) */ force_preview(); /* After printing, the slave is gone... */ /* and we'll have to recreate the slave then */ graf_mouse(ARROW,&dummy); } laser_out(firstp,lastpage,mem_needed,copies,lastp) int firstp; int lastpage; int mem_needed; int copies; int lastp; { int event; int key; int pagenum; int pxy[4]; int dummy; int tmp_buff[8]; int rmu[4]; int gflag; long rptr; int dxres,dyres; if(copies > 1) v_pgcount(phandle,--copies); if(phandle) init_text(phandle); print_flag = TRUE; force_blit_redraw(mem_needed); /* SLM 804 */ if(pagetype > PLEGAL) { mutolas(hpage_size,vpage_size,&dxres,&dyres); pxy[0] = pxy[1] = 0; pxy[2] = dxres-1; pxy[3] = dyres-1; vs_clip(mhandle,1,pxy); } if((get_fpage(&pagenum)) && (firstp <= lastpage) ) { while(pagenum < firstp) get_npage(&pagenum); do { graf_mouse(BUSY_BEE,&dummy); /* busy bee */ if(view_size == PADJCNT) { if(pagenum % 2) { rptr = get_fregion(pagenum,&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag); while(rptr) { if(!gflag) free_regslv(rptr); rptr = get_nregion(&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag); } } } curr_page = pagenum; redraw_laser(pagenum); pxy[2] = pxres; pxy[3] = pyres; pxy[0] = pxy[1] = 0; vs_clip(phandle,1,pxy); rptr = get_fregion(pagenum,&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag); while(rptr) { if(!gflag) free_regslv(rptr); rptr = get_nregion(&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag); } event = evnt_multi((MU_KEYBD|MU_TIMER), 0,0,0, 0,0,0,0,0, 0,0,0,0,0, tmp_buff, 0,0, /* timer == 0 */ &dummy,&dummy, &dummy,&dummy, &key,&dummy); if(event != MU_TIMER) break; }while((get_npage(&pagenum)) && (pagenum <= lastp)); } } tdo_out(firstp,lastpage,lastp,copies) int firstp; int lastpage; int lastp; int copies; { int dummy; int pagenum; int count; int i; strcpy(pathbuf,dpath4); strcat(pathbuf,"*.TYF"); if(!get_fs(fbuffer,&dummy)) return; extender(fbuffer,".TYF"); Fsetdta(&thedta.res[0]); if(Fsfirst(fbuffer,0)==0) { if(alert_cntre(ALERT37)==2) { return; } } if((TYF_handle=Fcreate(fbuffer,0)) <= 0) { alert_cntre(ALERT19); return; } Start_TYF(); if((get_fpage(&pagenum)) && (firstp <= lastpage)) { while(pagenum < firstp) get_npage(&pagenum); if(copies == 0) copies = 1; count = copies; do { curr_page = pagenum; for(i=1;i<=count;i++) redraw_tdo(pagenum,lastp); }while((get_npage(&pagenum)) && (pagenum <= lastp)); } End_TYF(); Fclose(TYF_handle); }