home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / DSHJ2 / MENU.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  44.8 KB  |  1,800 lines

  1. /**************************************************************************/
  2. /*  FILE:  MENU.C        PROGRAM TITLE: DeskSET II Alpha Version   */
  3. /*  Date Created: 01/08/88                          */ 
  4. /*  Last Modified: 06/30/89                          */
  5. /*                                      */
  6. /*  Description: MENU ROUTINES                          */
  7. /*  Routines:    o do_view_size()    -  change viewing scale handler   */
  8. /*         o genesis_region()    -  Create a new region           */
  9. /*        o graphic_region()    -  Create Graphic Region      */
  10. /*        o close_region()    -  Close a regions          */
  11. /*        o draw_item()        -  Chooses function to draw with  */
  12. /*        o erase_all()        -  Deletes regions          */
  13. /*        o do_flip_page()    -  Previous and Next Page Handler */
  14. /*        o make_article()    -  Create Article          */
  15. /*        o close_article()    -  Close Article          */
  16. /*        o do_hot_link()        -  perform linking of regions      */
  17. /*        o check_top_window()    -  is preview window on top?      */
  18. /*        o display_toggle()      -  toggle to show/noshow images   */
  19. /*        o do_artdelete()    -  Delete selected article      */
  20. /*        o do_artopen()        -  Open selected article for link */
  21. /*        o reopen_region()    -  reopen a region - add primitive*/
  22. /*        o del_prim()        -  delete currect active primitive*/
  23. /*        o router_selected()    -  draw outline arnd active region*/
  24. /*        o post_edit_prim()    -  conclusion of prim edit fnctns */
  25. /*        o outline_primman()    -  Draw outline arnd active prim  */
  26. /**************************************************************************/
  27.  
  28.  
  29. /**************************************************************************/
  30. /* INCLUDE FILES                              */
  31. /**************************************************************************/
  32. #include "define.h"
  33. #include "deskset2.h"
  34. #include <obdefs.h>
  35. #include "gemdefs.h"
  36. #include <osbind.h>
  37. #include "alert.h"
  38. #include "dbase.h"
  39.  
  40. /**************************************************************************/
  41. /* DEFINES                                  */
  42. /**************************************************************************/
  43. #define MINSIZE  5000L
  44.  
  45. /**************************************************************************/
  46. /* EXTERNALS                                  */
  47. /**************************************************************************/
  48. extern int view_size;                /* Current scaling size   */
  49. extern OBJECT *ad_menu;                /* Address of menu tree   */
  50. extern OBJECT *ad_set_size;            /* Address of dialog box  */
  51. extern OBJECT *ad_point_size;            /* address of dialog box  */
  52. extern OBJECT *ad_go_page;            /* Current Page dialog      */
  53. extern OBJECT *ad_get_image;
  54. extern OBJECT *adoutput;
  55. extern OBJECT *ad_bkgrnd;
  56. extern OBJECT *ad_filebuf;
  57.  
  58. extern char rscerr2[];
  59. extern char linkerr[];
  60. extern int prev_handle;                /* Preview window handle  */
  61. extern int msg_buff[];                /* evnt multi buffer      */
  62. extern int dummy;                /* well, dummy...      */
  63. extern int curr_page;                /* current page          */
  64.  
  65. extern int ptsarray[];                /* Interface to structures*/
  66.  
  67. extern int mhandle;                /* Preview buffer handle  */
  68. extern int mxres,myres;
  69. extern int shandle;
  70. extern int phandle;
  71. extern int pxy[];
  72. extern int prev_size;
  73.  
  74. extern int (*funcs)();                /* drawing function       */
  75. extern int poly_draw();                /* polygon drawing...     */
  76. extern int ellipse_draw();            /* ellipse drawing...     */
  77. extern int circle_draw();            /* circle drawing...      */
  78. extern int box_draw();                /* box drawing...         */
  79. extern int nada();                /* null function      */
  80. extern char *winfo[][4];            /* preview text info line */
  81.  
  82. extern GRECT dpwork;                /* work area of window    */
  83. extern GRECT pwork;                /* Preview work area      */
  84.  
  85. extern int scale_set;                /* User defined scale fact*/
  86. extern GRECT page_area;             /* GRECT area Preview area*/
  87. extern long getf_article();
  88. extern long get_fpage();
  89. extern long get_npage();
  90. extern long get_fregion();            /* Get first region      */
  91. extern long get_nregion();            /* Get next region      */
  92. extern unsigned long region_ptr;        /* Pointer to curr region */
  93. extern unsigned long page_ptr;            /* Ptr to Preview Buffer  */
  94. extern unsigned long pagesc;
  95.  
  96. extern unsigned long prev_bytes;
  97.  
  98. extern int SH;                    /* Point Size...      */
  99. extern int mode_change;                /* text/mask changed?     */
  100. extern int zdevice;                /* index into xdpi/ydpi   */
  101.  
  102. extern long find_region();
  103. extern long create_region();
  104.  
  105. extern char fbuffer[];
  106. extern int cur_point_size;            /* Current Point Size      */
  107.  
  108. extern int graph_flag;
  109. extern int image_status;
  110.  
  111. extern struct txtattr gltxtattr;        /* Global text attributes */
  112. extern int glgrattr[];                /* Global graphic attrib  */
  113. extern char pathbuf[];
  114. extern int pagew,pageh;
  115. extern int blit_flag;
  116. extern int force_draw_flag;
  117. extern long do_artobj();
  118. extern long get_regart();
  119. extern char *get_lmem();
  120. extern int intout[];
  121. typedef struct dta
  122. {
  123.          char res[21];
  124.     char attr;
  125.     int  time;
  126.     int  date;
  127.     long fsize;
  128.     char str[14];
  129. } DTA;
  130.  
  131. extern DTA thedta;
  132. extern char not_found[];
  133. extern char dprint[];
  134. extern long get_curreg();
  135. extern int deferhj;
  136. extern int pxres;
  137. extern int pyres;
  138. extern int alt_offset;
  139. extern int active_prim;
  140. extern int xor_handle;
  141. extern int hpage_size;
  142.  
  143. extern char *dpath1;
  144. extern char *dpath2;
  145. extern char *dpath3;
  146. extern char *dpath4;
  147.  
  148. extern long lcalloc();
  149.  
  150. extern int BSTATE;
  151. extern int BREAL;
  152.  
  153. extern long prim_ptr;
  154. extern int active_prim;
  155.  
  156. extern int *icdata;
  157. extern int *primicons;
  158. extern BITBLK *bgicptr;
  159. extern int show_grids;
  160. extern int snap_to_grids;
  161.  
  162. extern PAGE *tpagehd;
  163. extern PAGE *tcurpage;
  164. extern int  temp_page;
  165. extern PAGE *pagehd;
  166. extern PAGE *curpage;
  167. extern PAGE *left_tmplate;
  168. extern PAGE *right_tmplate;
  169. extern int  displ_tmpl_flag;
  170.  
  171.  
  172. extern ARTICLE *rtarthd;
  173. extern ARTICLE *ltarthd;
  174. extern ARTICLE *tarthd;
  175. extern ARTICLE *arthd;
  176.  
  177. extern int multi_mode;
  178. extern FDB page_MFDB;
  179. extern int unit_type;
  180. extern int TYF_handle;
  181. extern REGION *curregion;
  182. extern FDB laser_MFDB;
  183. extern int pagetype;
  184. extern int vpage_size;
  185. extern long lmalloc();
  186. extern long laser_bytes;
  187.  
  188. /**************************************************************************/
  189. /* GLOBAL VARIABLES                              */
  190. /**************************************************************************/
  191. char *ruler_mode[] =  {
  192.             "  Show Ruler     ^R",
  193.             "  Hide Ruler     ^R"
  194.               };
  195.  
  196.  
  197. char *mode_text[] = {                /* Menu text for modes    */
  198.             "  Show Text          ^T",
  199.             "  Show Mask          ^T"
  200.             };
  201.  
  202.  
  203. char *write_mode[] = {                /* writing mode...        */
  204.             "  Add Object   ",
  205.             "  Subtract Obj "
  206.  
  207.                      };
  208.  
  209. char *template_mode[] = {
  210.               "  Edit Base Page    ",
  211.               "  Edit Preview      "
  212.             };
  213.  
  214. char *disp_tmpl[] = {
  215.              "  Display Base Page ",     
  216.              "  Hide Base Page    "
  217.             };
  218.  
  219. int tmplate_flag;
  220. int  mode_flag;                    /* current fill mode...   */
  221. int  write_flag;                /* current writing mode   */
  222. int  print_flag;                /* Printing to Laser?      */
  223. int  article_flag;                /* 0 - no article, 1 -    */
  224.                         /* then in create article */
  225.  
  226. int  cur_scale;                    /* current scale in %     */
  227.  
  228.  
  229. #define linkSIZE 37                /* Link mouse form        */
  230. short mlink[linkSIZE] = 
  231. {
  232.     0x0000,0x0000,0x0001,0x0000,0x0001,
  233.     0x7FE0,0xFFF0,0xFFF0,0xFFF0,0xFFFE,0xFFFF,0xFFFF,0xFFFF,
  234.     0xFFFF,0xFFFF,0xFFFF,0x7FFF,0x0FFF,0x0FFF,0x0FFF,0x07FE,
  235.     0x0000,0x3FC0,0x7FE0,0x6060,0x6060,0x636C,0x676E,0x6666,
  236.     0x6666,0x76E6,0x36C6,0x0606,0x0606,0x07FE,0x03FC,0x0000
  237.  
  238. };
  239. extern short mlink1[];
  240.  
  241. int cur_primitive;                /* current primitive   */
  242.                         /* according to RCS index */
  243. int cur_pic_type;                /* Neo, IMG, Meta file    */
  244. unsigned long gl_region_ptr;            /* current OPEN/SELECTED  */
  245.                         /* pointer to region      */
  246. unsigned long gl_grregion_ptr;
  247.                         /* pointer to region      */
  248. int gl_lstyle;                    /* Global line attributes */
  249. int gl_lwidth;
  250. int gl_fstyle;                    /* Global fill attributes */
  251. int gl_findex;
  252. int gl_repel;
  253. int gl_repbounds;
  254. int gl_repoffset;
  255.  
  256. int art_append;                    /* Append region to article */
  257.                         /* or insert in middle if 0 */
  258. long    insert_artptr;                /* Article to insert to     */
  259. long    insert_regptr;                /* Region to insert after   */
  260.  
  261. int      reopen_prim;                /* flag if reopen_region()  */
  262. long    daveptr;                /* daves's 4800 xxx buffer  */
  263.  
  264. /**************************************************************************/
  265. /* Function:    do_view_size()                          */
  266. /* Description: Handler for menu to switch scales - Actual size etc..      */
  267. /*        checks the chosen item.                      */
  268. /*        Institutes a redraw of the preview window.          */
  269. /* IN:  item  - menu item                          */
  270. /* OUT: none                                   */
  271. /* GLOBAL: page_area  - resets GRECT for the MFDB              */
  272. /**************************************************************************/
  273. do_view_size(item)
  274. int item;
  275. {
  276.    register int i;
  277.    int prev_item;
  278.    int titem;
  279.  
  280.  
  281.       
  282.    prev_item = view_size;
  283.    if(view_size != item)
  284.    {
  285.       view_size = item;
  286.       for(i=PSIZE;i<= PADJCNT;i++)
  287.          menu_icheck(ad_menu,i,FALSE);
  288.       menu_icheck(ad_menu,item,TRUE);
  289.     
  290.       if((item == PADJCNT) || (prev_size == PADJCNT))
  291.                     recalc_alt_text();
  292.       
  293.       prev_item = item;
  294.       if(view_size != PADJCNT)
  295.      titem = item;
  296.       else
  297.       {
  298.         titem = ((curr_page % 2) ? (item + 1) : (item));        
  299.       }
  300.  
  301.       wind_set(prev_handle,WF_INFO,winfo[titem - PSIZE][unit_type]);
  302.       wind_set(prev_handle,WF_TOP,&dummy,&dummy,&dummy,&dummy);
  303.       page_area.g_x = page_area.g_y = 0L;
  304.       active_prim = 0;    /* reset primitives */
  305.  
  306.       gsx_moff();
  307.       vsf_interior(shandle,0);            /* Set to Solid   */
  308.       alt_offset = FALSE;
  309.       if( (view_size == PSIZE) ||
  310.       (view_size == PADJCNT))
  311.          pdraw_fit(view_size);
  312.       else
  313.          pdraw_scale();
  314.  
  315.  
  316.       prev_size = view_size;
  317.       zoom_setup();
  318.       cur_scale = get_scale_num(view_size);
  319.       get_work(prev_handle);
  320.       update_preview_blit();
  321.       set_clip(TRUE,&pwork);
  322.       vr_recfl(shandle,pxy);
  323.       clear_window(prev_handle,2,1);
  324.       init_rulers();
  325.       graf_mouse(BUSY_BEE,&dummy);
  326.       force_preview();
  327.       slider_chk();
  328.       set_clip(TRUE,&dpwork);
  329.       graf_mouse(ARROW,&dummy);
  330.       gsx_mon();
  331.    }
  332. }
  333.  
  334.  
  335.  
  336.  
  337. /**************************************************************************/
  338. /* Function: genesis_region()                          */
  339. /* Description: Creates a NEW region                      */
  340. /*         Disables close region.                      */
  341. /*        enables the drawing primitives.                  */
  342. /**************************************************************************/
  343. genesis_region()
  344. {
  345.      register int i;
  346.      long msize;
  347.  
  348.      if( (msize = Malloc(-1L)) <= MINSIZE)     
  349.      {
  350.         alert_cntre(ALERT23);
  351.         return;
  352.      }
  353.  
  354.      menu_ienable(ad_menu,RCREATE,FALSE);
  355.      menu_ienable(ad_menu,ROPENGR,FALSE);
  356.      menu_ienable(ad_menu,RCLOSE,TRUE);
  357.      menu_ienable(ad_menu,RTOGGLE,FALSE);
  358.      menu_ienable(ad_menu,OADDPRIM,FALSE);
  359.      menu_ienable(ad_menu,OPCOORD,FALSE);
  360.      menu_ienable(ad_menu,OMOVEFNT,FALSE);
  361.      menu_ienable(ad_menu,OMOVEBAK,FALSE);
  362.      menu_ienable(ad_menu,ODELPRIM,FALSE);     
  363.      menu_ienable(ad_menu,RCOORD,FALSE);
  364.      menu_ienable(ad_menu,RMOVEFNT,FALSE);
  365.      menu_ienable(ad_menu,RMOVEBAK,FALSE);
  366.      active_prim =FALSE;
  367.      prim_ptr = 0L;      
  368.      
  369.      for(i=OPOLYGON;i<=OBOX;i++)
  370.                  menu_ienable(ad_menu,i,TRUE);
  371.      check_region_ptr();
  372.      gl_region_ptr = create_region(curr_page,FALSE);     
  373. /*     init_tattr();    Remove? This would setup each region with its
  374.             Defaults. Not what is in the font dialog box */
  375.      funcs = &box_draw;
  376.      put_txtattr(gl_region_ptr,&gltxtattr);     /* and store in region   */
  377.      check_top_window();     
  378.      graf_mouse(OUTLN_CROSS,&dummy);
  379. }
  380.  
  381.  
  382.  
  383.  
  384. /**************************************************************************/
  385. /* Function: graphic_region()                          */
  386. /* Description: Creates a NEW graphic region                  */
  387. /*         Disables close region.                      */
  388. /*        enables the drawing primitives.                  */
  389. /**************************************************************************/
  390. graphic_region()
  391. {
  392.      register int i;
  393.      long msize;
  394.  
  395.      if( (msize = Malloc(-1L)) <= MINSIZE  )     
  396.      {
  397.         alert_cntre(ALERT23);
  398.         return;
  399.      }
  400.  
  401.      change_icstate(NORMAL,ICBOX1,1);
  402.      menu_ienable(ad_menu,RCREATE,FALSE);
  403.      menu_ienable(ad_menu,ROPENGR,FALSE);
  404.      menu_ienable(ad_menu,RCLOSE,TRUE);
  405.      menu_ienable(ad_menu,RTOGGLE,FALSE);
  406.      menu_ienable(ad_menu,OADDPRIM,FALSE);
  407.      menu_ienable(ad_menu,OPCOORD,FALSE);
  408.      menu_ienable(ad_menu,OMOVEFNT,FALSE);
  409.      menu_ienable(ad_menu,OMOVEBAK,FALSE);
  410.      menu_ienable(ad_menu,ODELPRIM,FALSE);     
  411.      menu_ienable(ad_menu,RCOORD,FALSE);
  412.      menu_ienable(ad_menu,RMOVEFNT,FALSE);
  413.      menu_ienable(ad_menu,RMOVEBAK,FALSE);
  414.      active_prim = FALSE;     
  415.      prim_ptr = 0L;
  416.  
  417.      for(i=OPOLYGON;i<=OIMAGE;i++)
  418.                  menu_ienable(ad_menu,i,TRUE);
  419.  
  420.      write_flag = TRUE;
  421.      menu_text(ad_menu,RWRITE,write_mode[write_flag]);
  422.      check_region_ptr();
  423.      gl_grregion_ptr = create_region(curr_page,TRUE);
  424.      graph_flag = TRUE;
  425.  
  426.      glgrattr[0] = gl_lstyle;
  427.      glgrattr[1] = gl_lwidth;
  428.      glgrattr[2] = gl_fstyle;
  429.      glgrattr[3] = gl_findex;
  430.      glgrattr[4] = gl_repel;
  431.      glgrattr[5] = gl_repoffset;
  432.      glgrattr[6] = gl_repbounds;
  433.      glgrattr[7] = glgrattr[8] = 0;
  434.      put_grattr(gl_grregion_ptr,glgrattr);     /* and store in region   */
  435.      funcs = &box_draw;
  436.      check_top_window();
  437.      graf_mouse(OUTLN_CROSS,&dummy);
  438. }
  439.  
  440.  
  441.  
  442.  
  443. /**************************************************************************/
  444. /* Function: close_region()                          */
  445. /* Description: Closes a region                          */
  446. /* IN: none                                  */
  447. /* OUT: none                                  */
  448. /* GLOBAL:   funcs - current drawing function set to null          */
  449. /*         Disables close_region/enables create region          */
  450. /*         Disables drawing primitives.                  */
  451. /**************************************************************************/
  452. close_region()
  453. {
  454.    int grtype;
  455.    long tmpreg;
  456.    register int i;
  457.    int x,y;
  458.    int opcode,count,wmode;
  459.  
  460.    tmpreg = get_curreg(&grtype);
  461.  
  462.    if(reopen_prim)
  463.    {
  464.     reopen_prim = FALSE;
  465.     page_redraw(tmpreg);
  466.     open_region(tmpreg);
  467.     
  468.    }
  469.  
  470.    if(grtype)
  471.    {
  472.     gl_grregion_ptr = tmpreg;
  473.     update_repel(1,0L);
  474.         gl_grregion_ptr = 0L;
  475.    }
  476.    if(!mode_flag)    /* Don't enable if we're displaying text */
  477.        menu_ienable(ad_menu,RCREATE,TRUE);
  478.  
  479.    menu_ienable(ad_menu,ROPENGR,TRUE);
  480.    menu_ienable(ad_menu,RCLOSE,FALSE);
  481.    menu_ienable(ad_menu,RTOGGLE,TRUE);
  482.    menu_ienable(ad_menu,RWRITE,TRUE);
  483.    menu_ienable(ad_menu,OADDPRIM,FALSE);
  484.    active_prim = FALSE;
  485.  
  486.    for(i=OPOLYGON;i<=OIMAGE;i++)
  487.                 menu_ienable(ad_menu,i,FALSE);     
  488.    funcs = &nada;
  489.    gl_region_ptr = gl_grregion_ptr = region_ptr = 0L;
  490.    if(multi_mode)
  491.    {
  492.       clr_multi_flags(curr_page);
  493.       multi_mode = 0;
  494.    }
  495.    graph_flag = cur_primitive = FALSE;
  496.  
  497.    if(!article_flag)
  498.    {
  499.      write_flag = 1;
  500. /*      image_status = FALSE;*/
  501.      menu_text(ad_menu,RTOGGLE,mode_text[mode_flag]);
  502.      menu_text(ad_menu,RWRITE,write_mode[write_flag]);
  503. /*     menu_icheck(ad_menu,RDIMAGES,FALSE);*/
  504.      menu_ienable(ad_menu,ACREATE,TRUE);
  505.      graf_mouse(ARROW,&dummy);
  506.    }
  507.    rmenu_fix(0);
  508.  
  509.    if(bgicptr->bi_pdata == primicons)
  510.    {
  511.        bgicptr->bi_pdata = icdata;
  512.        objc_offset(ad_bkgrnd,BGICBOX,&x,&y);
  513.        ad_bkgrnd[ICBOX6].ob_state = NORMAL;
  514.        ad_bkgrnd[ICBOX7].ob_state = NORMAL;
  515.        ad_bkgrnd[ICBOX8].ob_state = NORMAL;
  516.        clr_bgicons(0);
  517.        if(mode_flag)
  518.        {
  519.         change_icstate(DISABLED,ICBOX1,0);
  520.         change_icstate(SELECTED,ICBOX3,0);
  521.        }
  522.        if(image_status)
  523.         change_icstate(SELECTED,ICBOX4,0);
  524.        if(show_grids)
  525.         change_icstate(SELECTED,ICBOX7,0);
  526.        if(snap_to_grids)
  527.         change_icstate(SELECTED,ICBOX8,0);
  528.        form_dial(3,0,0,0,0,x,y,
  529.         ad_bkgrnd[BGICBOX].ob_width,
  530.         ad_bkgrnd[BGICBOX].ob_height);
  531.    }
  532.    opcode = get_fprimitive(tmpreg,&count,&wmode);
  533.    if(opcode == -1 || !count)        /* If empty region */
  534.     delete_region(tmpreg);   
  535. }
  536.  
  537.  
  538.  
  539.  
  540.  
  541. /**************************************************************************/
  542. /* Function: draw_items()                          */
  543. /* Description: Draws objects into the region                  */
  544. /*        Selects the function to draw with.              */
  545. /* IN:      item  - menu item selected.                      */
  546. /* GLOBAL:  funcs - function points to function to draw with.          */
  547. /**************************************************************************/
  548. draw_items(item)
  549. int item;
  550. {
  551.     cur_primitive = item;
  552.     switch(item)
  553.     {
  554.        case OPOLYGON:   funcs = &poly_draw;
  555.             break;
  556.     
  557.        case OCIRCLE:    funcs = &circle_draw;
  558.             break;
  559.  
  560.        case OELLIPSE:   funcs = &ellipse_draw;
  561.             break;
  562.  
  563.        case OBOX:    funcs = &box_draw;
  564.             break;
  565.  
  566.        case OLINE:    funcs = &poly_draw;
  567.             break;
  568.  
  569.        case ORBOX:      funcs = &box_draw;
  570.             break;
  571.  
  572.        case OIMAGE:     funcs = &box_draw;
  573.             if(!get_image())
  574.                 return;
  575.             break;
  576.     }
  577.     graf_mouse(OUTLN_CROSS,&dummy);
  578.     evnt_button(1,1,0,&dummy,&dummy,&dummy,&dummy);
  579. }
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588. /**************************************************************************/
  589. /* Function: erase_all()                          */
  590. /* Description: Deletes all regions in data structure              */
  591. /*        Unless the Alert Box button == CANCEL              */
  592. /*        Deletes all pages                       */
  593. /*        Deletes all articles                      */
  594. /**************************************************************************/
  595. erase_all(flag)
  596. int flag;        /* Clean up more stuff if not quitting          */
  597. {
  598.      int dummy;
  599.      long art;
  600.  
  601.      if(tmplate_flag && flag)
  602.      {
  603.        pagehd = tpagehd;
  604.        curpage = tcurpage;
  605.        arthd   = tarthd;
  606.        tmplate_flag = FALSE;
  607.        wind_set(prev_handle,WF_NAME,"Preview Window",0,0);
  608.        menu_text(ad_menu,OEDITTMP,template_mode[tmplate_flag]);
  609.        menu_ienable(ad_menu,OERASETP,FALSE);
  610.        menu_ienable(ad_menu,PGOTO,TRUE);
  611.        menu_ienable(ad_menu,PDELETE,TRUE);
  612.        menu_ienable(ad_menu,PINSERT,TRUE);
  613.      }
  614.  
  615.      clear_tags();
  616.      get_fpage(&dummy);
  617.      while(delete_page());
  618.      art = getf_article();
  619.      while(delete_article());
  620.      if(flag)
  621.      {
  622.         IF_close();
  623.     IF_open(0);            /* Free cache memory */
  624.         gl_grregion_ptr = gl_region_ptr = 0L;
  625.         multi_mode = 0;
  626.         temp_page = curr_page = 1;
  627.         page_area.g_x = page_area.g_y = 0L;
  628.         slider_chk();     
  629.         force_preview();
  630.         do_pagenum(curr_page,(curr_page%2)?1:0);
  631.      }
  632. }
  633.  
  634.  
  635.  
  636.  
  637. /**************************************************************************/
  638. /* Function:    do_flip_page()                          */
  639. /* Description: Handles Previous and Next Page Menu Calls          */
  640. /**************************************************************************/
  641. do_flip_page(item)
  642. int item;
  643. {
  644.      register int tmp;
  645.      int titem;
  646.      int flag;
  647.  
  648.      tmp = curr_page;
  649.      titem = view_size;
  650.  
  651.      tmp = ((item == PPREV) ? (--tmp) :(++tmp));
  652.      if(tmplate_flag)
  653.      {
  654.        if(tmp < -2) tmp = -2;
  655.        if(tmp > -1) tmp = -1;
  656.  
  657.        if(tmp == -2)
  658.        {       
  659.       curpage = pagehd = left_tmplate;
  660.       rtarthd = arthd;    /* cjg */      
  661.       arthd   = ltarthd;
  662.        }
  663.        else
  664.        {
  665.       curpage = pagehd = right_tmplate;
  666.       ltarthd = arthd;    /* cjg */
  667.       arthd   = rtarthd;
  668.        }
  669.      }
  670.      else
  671.      {
  672.        if(tmp < 0) tmp = 0;
  673.        if(tmp > 999) tmp = 999;
  674.      }
  675.      curr_page = tmp;
  676.  
  677.      set_int(ad_go_page,GOTOPAGE,curr_page);
  678.      flag = TRUE;
  679.  
  680.      if(view_size == PADJCNT)
  681.      {
  682.         titem = ((curr_page % 2) ? (titem + 1) : (titem));
  683.         wind_set(prev_handle,WF_INFO,winfo[titem - PSIZE][unit_type]);        
  684.  
  685.         if(item == PPREV)
  686.        flag = (( !(curr_page % 2)) ? (FALSE):(TRUE));
  687.         else
  688.        flag = ((curr_page % 2) ? (FALSE):(TRUE));
  689.      }
  690.  
  691.      if(flag)     
  692.      {
  693.          mode_change = TRUE;
  694.          force_preview();
  695.      }
  696.      else
  697.      do_blit();
  698. }
  699.  
  700.  
  701. /**************************************************************************/
  702. /* Function:    make_article()                          */
  703. /* Description: Creates Article                          */
  704. /**************************************************************************/
  705. make_article()
  706. {
  707.    long msize;
  708.    int dummy;
  709.    int button;
  710.    int x,y,w,h;
  711.    long num;
  712.  
  713.    if( (msize = Malloc(-1L)) <= MINSIZE)     
  714.    {
  715.         alert_cntre(ALERT23);
  716.         return;
  717.    }
  718.  
  719.    strcpy(pathbuf,dpath1);
  720.    strcat(pathbuf,"*.TXT");
  721.    if(!get_fs(fbuffer,&dummy))
  722.    {
  723.     graf_mouse(ARROW,&dummy);
  724.     return;
  725.    }
  726.    extender(fbuffer,".TXT");
  727.    Fsetdta(&thedta.res[0]);
  728.    if(Fsfirst(fbuffer,0) <= -1)
  729.    {
  730. /*        if((alert_cntre(ALERT24)==1))*/
  731.  
  732.     set_int(ad_filebuf,FBUFSIZE,10);
  733.  
  734.         form_center(ad_filebuf,&x,&y,&w,&h);
  735.         form_dial(0,0,0,36,36,x,y,w,h);
  736.         objc_draw(ad_filebuf,0,MAX_DEPTH,x,y,w,h);
  737.    err:
  738.         button = form_do(ad_filebuf,FBUFSIZE);
  739.         ad_filebuf[button].ob_state = NORMAL;
  740.         if(button == FBUFOK)
  741.         {
  742.        num = get_int(ad_filebuf,FBUFSIZE);
  743.        if(num < 10)
  744.            {
  745.                 objc_draw(ad_filebuf,FBUFOK,MAX_DEPTH,x,y,w,h);
  746.         goto err;
  747.            }
  748.            form_dial(3,0,0,3,36,x,y,w,h);    
  749.        num *= 1024L;
  750.            if( (msize = Malloc(-1L)) <= num)     
  751.            {
  752.         alert_cntre(ALERT23);
  753.             graf_mouse(ARROW,&dummy);    /* Abort    */
  754.         return;
  755.            }
  756.        ed_new_article(num);        /* Create new file with editor */
  757.         }
  758.     else
  759.     {
  760.        graf_mouse(ARROW,&dummy);    /* Abort    */
  761.        form_dial(3,0,0,3,36,x,y,w,h);
  762.        return;
  763.     }
  764.    }
  765.    else
  766.     loadfile(fbuffer);
  767.    amenu_fix(1);
  768.    graf_mouse(2,&dummy);
  769.    create_article();
  770.    remove_path(fbuffer);
  771.    update_article(fbuffer);
  772.    graf_mouse(ARROW,&dummy);
  773.    art_append = TRUE;
  774.    menu_ienable(ad_menu,ASAVEART,FALSE);
  775.    menu_ienable(ad_menu,AAUTOFL,TRUE);
  776.    menu_ienable(ad_menu,ACLOSE,TRUE);
  777.    menu_ienable(ad_menu,ACREATE,FALSE);
  778.    menu_ienable(ad_menu,OADDPRIM,FALSE);
  779.    graf_mouse(255,mlink);
  780.    article_flag = TRUE;
  781.    check_top_window();
  782. }
  783.  
  784.  
  785.  
  786. /**********************************************************************/
  787. /* Function: ed_new_article()                          */
  788. /* Description: Setup buffers to edit a new article              */
  789. /**********************************************************************/
  790. ed_new_article(msize)
  791. long msize;
  792. {
  793.    long chbuff;
  794.  
  795.    if(chbuff = lcalloc(1L,msize))    /* Allocate initial buffer */
  796.    {
  797.      init_buffer(chbuff,chbuff+msize);
  798.      set_buffer(0L);
  799.      return(1);
  800.    }
  801.    return(0);
  802. }
  803.  
  804.  
  805. /**************************************************************************/
  806. /* Function:    close_article()                          */
  807. /* Description: Closes Article                          */
  808. /**************************************************************************/
  809. close_article()
  810. {
  811.    menu_ienable(ad_menu,ASAVEART,TRUE);
  812.    menu_ienable(ad_menu,AAUTOFL,FALSE);
  813.    menu_ienable(ad_menu,ACREATE,TRUE);
  814.    menu_ienable(ad_menu,ACLOSE,FALSE);
  815.    graf_mouse(2,&dummy);
  816.    if(tmplate_flag)
  817.    {
  818.      if(curr_page == -2)
  819.     ltarthd = arthd;
  820.      else
  821.     rtarthd = arthd;
  822.    }
  823.  
  824.    article_flag = FALSE;
  825.    do_update_text();
  826.    if(mode_flag)
  827.     force_preview();
  828.    graf_mouse(0,&dummy);
  829.    amenu_fix(0);
  830.    region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  831. }
  832.  
  833.  
  834.  
  835.  
  836. /**************************************************************************/
  837. /* Function:    do_hot_link()                          */
  838. /* Description: Link regions togethor for articles              */
  839. /**************************************************************************/
  840. do_hot_link(mx,my)
  841. int mx,my;
  842. {
  843.    int nmx,nmy;
  844.    int g_flag;
  845.    int tpage;
  846.    int dummy;
  847.  
  848.    tpage = curr_page;
  849.    scrntomu(mx,my,&nmx,&nmy,0);
  850.    if(view_size == PADJCNT)
  851.    {
  852.     if(alt_offset)
  853.     {
  854.          if(!(curr_page % 2))
  855.             curr_page++;
  856.         }
  857.     else
  858.     {
  859.            if( curr_page % 2)
  860.             curr_page--;
  861.     }
  862.    }
  863.  
  864.    region_ptr = find_region(nmx,nmy,curr_page,
  865.         &dummy,&dummy,&dummy,&dummy,&g_flag);
  866.    if(region_ptr)
  867.    {
  868.      if(get_regart(region_ptr))
  869.      {
  870.     alert_cntre(ALERT5);
  871.     return;
  872.      }
  873.      if((region_ptr != 0x0L) && !g_flag)
  874.      {
  875.     if(art_append)
  876.        add_to_article(region_ptr);
  877.     else
  878.        insert_to_article(insert_artptr,insert_regptr,region_ptr);
  879.     if(mode_flag)
  880.     {
  881.        mlink1[3] = 0;
  882.        mlink1[4] = 1;
  883.     }
  884.     else
  885.     {
  886.        mlink1[3] = 1;
  887.        mlink1[4] = 0;
  888.     }
  889.        graf_mouse(255,mlink1);
  890.      }
  891.    }
  892.    curr_page = tpage;
  893.    
  894.    graf_mkstate(&nmx,&nmy,&dummy,&dummy);
  895.    evnt_mouse(1,nmx - 4,nmy - 4,8,8,&dummy,&dummy,&dummy,&dummy);
  896.    graf_mouse(255,mlink);
  897.    BSTATE = 0;
  898. }
  899.  
  900.  
  901.  
  902.  
  903. /**************************************************************************/
  904. /* Function:    check_top_window                      */
  905. /* Description: checks if preview window is on top, and forces it to be   */
  906. /**************************************************************************/
  907. check_top_window()
  908. {
  909.    int thandle;
  910.  
  911.      wind_get(0,WF_TOP,&thandle,&dummy,&dummy,&dummy);
  912.      if(thandle != prev_handle)
  913.            wind_set(prev_handle,WF_TOP,0,0,0,0);
  914. }
  915.  
  916.  
  917.  
  918. /**************************************************************************/
  919. /* Function:    display_toggle()                      */
  920. /* Description:                               */
  921. /**************************************************************************/
  922. display_toggle()
  923. {
  924.     int x,y;
  925.  
  926.         menu_ienable(ad_menu,RCREATE,mode_flag);
  927.     menu_ienable(ad_menu,RWRITE,mode_flag);
  928.     menu_ienable(ad_menu,ADEFER,mode_flag);
  929.     mode_flag ^= TRUE;
  930.     if(mode_flag && deferhj)
  931.     {
  932.        deferhj = 0;
  933.        menu_icheck(ad_menu,ADEFER,0);
  934.        recalc_txtptrs();
  935.     }
  936.     if(mode_flag)
  937.     {
  938.         ad_bkgrnd[ICBOX1].ob_state = DISABLED;
  939.         menu_ienable(ad_menu,OADDPRIM,FALSE);
  940.     }
  941.     else
  942.     {
  943.         ad_bkgrnd[ICBOX1].ob_state = NORMAL;
  944.     }
  945.     objc_offset(ad_bkgrnd,ICBOX1,&x,&y);
  946.     form_dial(3,0,0,0,0,x,y,
  947.             ad_bkgrnd[ICBOX1].ob_width,
  948.             2*ad_bkgrnd[ICBOX1].ob_height);
  949.  
  950.     menu_text(ad_menu,RTOGGLE,mode_text[mode_flag]);
  951.     mode_change = TRUE;
  952.         force_preview();
  953. /*    send_redraw(prev_handle);*/
  954. }
  955.  
  956.  
  957.  
  958. /**************************************************************************/
  959. /* Function:    do_artdelete()                          */
  960. /* Description:  Delete the selected article.                  */
  961. /**************************************************************************/    
  962.  
  963. do_artdelete()
  964. {
  965. long artptr;
  966.  
  967.    artptr = do_artobj();
  968.    if(artptr)
  969.    {
  970.     open_article(artptr);
  971.     delete_article();
  972.     force_draw_flag = 1;
  973.     force_preview();
  974.    }
  975. }
  976.  
  977.  
  978.  
  979. /**************************************************************************/
  980. /* Function:    do_artopen()                          */
  981. /* Description:  Open the selected article and link regions to it.      */
  982. /**************************************************************************/
  983. do_artopen()
  984. {
  985. int dolink;
  986. long artptr;
  987.    
  988.    dolink = 0;
  989.    if(gl_region_ptr)
  990.    {
  991.     if((insert_artptr = get_regart(gl_region_ptr)))
  992.     {
  993.          open_article(insert_artptr);
  994.        insert_regptr = gl_region_ptr;
  995.        art_append = FALSE;
  996.        dolink = TRUE;
  997.        }
  998.    }
  999.    else
  1000.    {
  1001.     artptr = do_artobj();
  1002.     if(artptr)
  1003.     {
  1004.        open_article(artptr);
  1005.        dolink = TRUE;
  1006.        art_append = TRUE;
  1007.     }
  1008.    }
  1009.    if(dolink)
  1010.    {
  1011.        amenu_fix(1);
  1012.        menu_ienable(ad_menu,ASAVEART,FALSE);
  1013.        menu_ienable(ad_menu,ACLOSE,TRUE);
  1014.        menu_ienable(ad_menu,ACREATE,FALSE);
  1015.        graf_mouse(255,mlink);
  1016.        article_flag = TRUE;
  1017.    }
  1018. }
  1019.  
  1020. do_saveart()
  1021. {
  1022. long artptr;
  1023.  
  1024.    artptr = do_artobj();
  1025.    if(artptr)
  1026.    {
  1027.     save_article(artptr);
  1028.    }
  1029. }
  1030.  
  1031.  
  1032.  
  1033.  
  1034. /**************************************************************************/
  1035. /*     Handle autoflow of regions into the article              */
  1036. /**************************************************************************/
  1037. do_autoflow()
  1038. {
  1039. int minpage,maxpage;
  1040. int page;
  1041. register long pptr,rptr;
  1042. int gflag;
  1043. int x;
  1044.  
  1045.    if(!get_range(&minpage,&maxpage))
  1046.     return;
  1047.    pptr = get_fpage(&page);
  1048.    if(!pptr)
  1049.     return;
  1050.    while(pptr)
  1051.    {
  1052.     if(page >= minpage && page <= maxpage)
  1053.     {
  1054.        rptr = get_fregion(page,&x,&x,&x,&x,&gflag);
  1055.            while(rptr)
  1056.        {
  1057.          if((!get_regart(rptr)) && (!gflag))
  1058.         {
  1059.                add_to_article(rptr);
  1060.         }
  1061.             rptr = get_nregion(&x,&x,&x,&x,&gflag);
  1062.        }
  1063.      }
  1064.         pptr = get_npage(&page);
  1065.    }
  1066.    close_article();
  1067. }
  1068.  
  1069.  
  1070. /**************************************************************************/
  1071. /*  Function: reopen_region()                          */
  1072. /*  Description: opens an existing region for adding more primitives      */
  1073. /**************************************************************************/
  1074. reopen_region()
  1075. {
  1076.     int type;
  1077.     register int i;
  1078.     int j;
  1079.     unsigned long tregion;
  1080.  
  1081.     tregion = get_curreg(&type);
  1082.     menu_ienable(ad_menu,RCLOSE,TRUE);
  1083.     menu_ienable(ad_menu,RCREATE,FALSE);
  1084.     menu_ienable(ad_menu,OADDPRIM,FALSE);
  1085.     menu_ienable(ad_menu,RTOGGLE,FALSE);
  1086.     menu_ienable(ad_menu,ROPENGR,FALSE);
  1087.     write_flag = TRUE;
  1088.  
  1089.     menu_text(ad_menu,RWRITE,write_mode[write_flag]);
  1090.  
  1091.     if(type)
  1092.     {
  1093.     graph_flag = TRUE;
  1094.         j = OIMAGE;
  1095.     }
  1096.     else
  1097.     j = OBOX;
  1098.     for(i=OPOLYGON;i<=j;i++)
  1099.         menu_ienable(ad_menu,i,TRUE);
  1100.     check_top_window();
  1101.     reopen_prim = TRUE;
  1102.     funcs = &box_draw;
  1103.     graf_mouse(OUTLN_CROSS,&dummy);
  1104. }
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110. /**************************************************************************/
  1111. /*  Function: del_prim()                          */
  1112. /*  Description: Delete the current active primitive              */
  1113. /**************************************************************************/
  1114. del_prim()
  1115. {
  1116.      unsigned long tregion;
  1117.      int oldrect[4];
  1118.      int dummy;
  1119.      REGION *tptr;
  1120.      int type;
  1121.  
  1122.      if(!region_ptr)            /* Well, if no active region...*/
  1123.      {                    /* how can we have an active   */
  1124.       clear_regprim_flags();    /* primitive?...:-)           */
  1125.       return;
  1126.      }
  1127.  
  1128.      if((alert_cntre(ALERT40) == 1))
  1129.      {
  1130.        find_boundary(region_ptr,&oldrect[0],&oldrect[1],&oldrect[2],
  1131.             &oldrect[3],&type,&dummy);
  1132.        delete_primitive();
  1133.        menu_ienable(ad_menu,ODELPRIM,FALSE);
  1134.        menu_ienable(ad_menu,OPCOORD,FALSE);
  1135.        menu_ienable(ad_menu,OMOVEFNT,FALSE);
  1136.        menu_ienable(ad_menu,OMOVEBAK,FALSE);
  1137.        active_prim = FALSE;
  1138.        tptr = tregion = region_ptr;
  1139.        open_region(tregion);
  1140.        recalc_region();
  1141.        if(tptr->primlist == 0L)    /* if last primitive, delete region also */
  1142.        {
  1143.       tregion = 0L;
  1144.       do_delregion();
  1145.       clear_regprim_flags();
  1146.       return;
  1147.        }
  1148.        
  1149.        if(!type)
  1150.        {        
  1151.        page_redraw(region_ptr);
  1152.            redraw_area(region_ptr,oldrect,1);   /* Cleanup old area */        
  1153.        }
  1154.        else
  1155.          update_repel(1,oldrect);
  1156.  
  1157.    
  1158.        region_ptr = tregion;
  1159.        if(region_ptr)
  1160.                router_selected();
  1161.     }
  1162. }
  1163.  
  1164.  
  1165.  
  1166. /**************************************************************************/
  1167. /* Function: router_selected()                          */
  1168. /* Description: Draws outline on current active region              */
  1169. /**************************************************************************/
  1170. router_selected()
  1171. {
  1172.      int page;
  1173.      int minx,miny,maxx,maxy;
  1174.      int type;
  1175.  
  1176.      find_boundary(region_ptr,&minx,&miny,&maxx,&maxy,&type,&page);
  1177.      outline_primman(minx,miny,maxx,maxy,type,page);
  1178. }
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184. /**************************************************************************/
  1185. /* Function: post_edit_prim()                          */
  1186. /* Description: Conclusion of prim editing functions              */
  1187. /**************************************************************************/
  1188. post_edit_prim(opcode,pcount,wmode,prim_ptr)
  1189. int opcode;
  1190. int pcount;
  1191. int wmode;
  1192. long prim_ptr;
  1193. {
  1194.      unsigned long tregion_ptr;
  1195.      int mx,my,mbutton;
  1196.      int minx,miny,maxx,maxy;
  1197.      int type;
  1198.      int page;
  1199.      int oldrect[4];
  1200.      int dummy;
  1201.  
  1202.      find_boundary(region_ptr,&oldrect[0],&oldrect[1],&oldrect[2],
  1203.             &oldrect[3],&dummy,&dummy);
  1204.      update_primitive(opcode,pcount,wmode,0);
  1205.      recalc_region();
  1206.  
  1207.      tregion_ptr = region_ptr;
  1208.      graf_mkstate(&mx,&my,&mbutton,&dummy);
  1209.      if(gl_region_ptr)
  1210.      {
  1211.         if(view_size != PADJCNT)
  1212.     {
  1213.            tregion_ptr = region_ptr;
  1214.            redraw_area(region_ptr,oldrect,1);   /* Cleanup old area */        
  1215.        region_ptr = gl_region_ptr = tregion_ptr;        
  1216.     }
  1217.     page_redraw(gl_region_ptr);
  1218.     gl_region_ptr = tregion_ptr;
  1219.      }
  1220.      else
  1221.      {
  1222.         update_repel(1,oldrect);
  1223.     gl_grregion_ptr = tregion_ptr;
  1224.      }
  1225.      region_ptr = tregion_ptr;
  1226.      active_prim = TRUE;
  1227.      open_region(region_ptr);
  1228.      set_cur_prim(prim_ptr);
  1229.      calc_prim(opcode,&minx,&miny,&maxx,&maxy,pcount);
  1230.      find_page(region_ptr,&page);
  1231.      region_ptr = get_curreg(&type);
  1232.      outline_primman(minx,miny,maxx,maxy,type,page);
  1233. }
  1234.  
  1235.  
  1236.  
  1237.  
  1238. /**************************************************************************/
  1239. /* Function: outline_primman()                          */
  1240. /* Description: Draws outline arnd active primitive              */
  1241. /*        Works in unison with post_edit_prim()              */
  1242. /**************************************************************************/
  1243. outline_primman(minx,miny,maxx,maxy,type,page)
  1244. int minx,miny,maxx,maxy;
  1245. int type,page;
  1246. {
  1247.      if(type)
  1248.     gl_grregion_ptr = region_ptr;
  1249.      else
  1250.     gl_region_ptr = region_ptr;
  1251.  
  1252.      if((page % 2) && (view_size == PADJCNT))
  1253.      {
  1254.     alt_offset = TRUE;
  1255.     minx += hpage_size;
  1256.     maxx += hpage_size;
  1257.      }
  1258.      mutoscrn(minx,miny,&pxy[0],&pxy[1],0);
  1259.      mutoscrn(maxx,maxy,&pxy[2],&pxy[3],0);
  1260.      gsx_moff();
  1261.      do_outline(xor_handle,pxy);
  1262.      gsx_mon();
  1263. }
  1264.  
  1265.  
  1266.  
  1267. region_front()
  1268. {
  1269.  
  1270.    if(!region_ptr)            /* if none selected, return */
  1271.    {
  1272.       clear_regprim_flags();   
  1273.       return;            /* Just in case          */
  1274.    }
  1275.    do_reg_front(region_ptr);
  1276.    redr_regarea(region_ptr,1);
  1277.    clear_regprim_flags();   
  1278. }
  1279.  
  1280.  
  1281.  
  1282.  
  1283. region_back()
  1284. {
  1285.    if(!region_ptr)            /* if none selected, return */
  1286.    {
  1287.       clear_regprim_flags();
  1288.       return;            /* Just in case          */
  1289.    }
  1290.    do_reg_back(region_ptr);   
  1291.    redr_regarea(region_ptr,1);
  1292.    clear_regprim_flags();
  1293. }
  1294.  
  1295.  
  1296.  
  1297.  
  1298. prim_front()
  1299. {
  1300.    unsigned long pptr;
  1301.    int wrmode;
  1302.    int count;
  1303.  
  1304.  
  1305.    if(!region_ptr)            /* if none selected, return */
  1306.    {
  1307.       clear_regprim_flags();
  1308.       return;            /* Just in case          */
  1309.    }
  1310.    get_cur_prim(&count,&wrmode,&pptr);
  1311.    if(!pptr)
  1312.    {
  1313.        clear_regprim_flags();   
  1314.        return;
  1315.    }
  1316.    do_prim_front(pptr);
  1317.    redr_regarea(region_ptr,1);
  1318.    clear_regprim_flags();
  1319. }
  1320.  
  1321.  
  1322.  
  1323. prim_back()
  1324. {
  1325.    unsigned long pptr;
  1326.    int wrmode;
  1327.    int count;
  1328.  
  1329.  
  1330.    if(!region_ptr)            /* if none selected, return */
  1331.    {
  1332.       clear_regprim_flags();
  1333.       return;            /* Just in case          */
  1334.    }
  1335.    get_cur_prim(&count,&wrmode,&pptr);
  1336.    if(!pptr)
  1337.    {
  1338.         clear_regprim_flags();   
  1339.     return;
  1340.    }
  1341.    do_prim_back(pptr);
  1342.    redr_regarea(region_ptr,1);
  1343.    clear_regprim_flags();
  1344. }
  1345.  
  1346.  
  1347.  
  1348.  
  1349. clear_regprim_flags()
  1350. {
  1351.    curregion = prim_ptr = gl_grregion_ptr = gl_region_ptr = region_ptr = 0L;
  1352.    if(multi_mode)
  1353.    {
  1354.       clr_multi_flags(curr_page);
  1355.       multi_mode = 0;
  1356.    }
  1357.    active_prim = FALSE;
  1358.    
  1359.    menu_ienable(ad_menu,OADDPRIM,FALSE);
  1360.    menu_ienable(ad_menu,ODELPRIM,FALSE);
  1361.    menu_ienable(ad_menu,OPCOORD,FALSE);
  1362.    menu_ienable(ad_menu,OMOVEFNT,FALSE);
  1363.    menu_ienable(ad_menu,OMOVEBAK,FALSE);
  1364.  
  1365.    menu_ienable(ad_menu,RUNLINK,FALSE);
  1366.    menu_ienable(ad_menu,RDELETE,FALSE);
  1367.    menu_ienable(ad_menu,RCOORD,FALSE);
  1368.    menu_ienable(ad_menu,RMOVEFNT,FALSE);
  1369.    menu_ienable(ad_menu,RMOVEBAK,FALSE);
  1370. }
  1371.  
  1372.  
  1373. recalc_alt_text()
  1374. {
  1375.    PAGE    *rpagehd;
  1376.    PAGE    *rcurpage;
  1377.    int     rcurr_page;
  1378.    ARTICLE *rarthd;
  1379.  
  1380.    recalc_txtptrs();        /* recalc current page */
  1381.  
  1382.    rpagehd    = pagehd;        /* save the settings   */
  1383.    rcurpage   = curpage;
  1384.    rcurr_page = curr_page;
  1385.    rarthd     = arthd;
  1386.  
  1387.    if(tmplate_flag)        /* take care of preview window */
  1388.    {                /* and other tmplate page      */
  1389.       arthd = ((curr_page % 2)?(ltarthd):(rtarthd));
  1390.       pagehd = curpage = ((curr_page%2)?(left_tmplate):(right_tmplate));
  1391.       curr_page = pagehd->pagenum;
  1392.       recalc_txtptrs();
  1393.  
  1394.       arthd = tarthd;        /* recalc preview text */
  1395.       pagehd = tpagehd;
  1396.       curpage = tcurpage;
  1397.       curr_page = temp_page;
  1398.       recalc_txtptrs();
  1399.    }
  1400.    else                /* recalc left and right tmplates*/
  1401.    {
  1402.       arthd = ltarthd;
  1403.       pagehd = curpage = left_tmplate;
  1404.       curr_page = pagehd->pagenum;
  1405.       recalc_txtptrs();        /* recalc left tmplate page */      
  1406.  
  1407.       arthd = rtarthd;        /* and recalc right tmplate */
  1408.       pagehd = curpage = right_tmplate;
  1409.       curr_page = pagehd->pagenum;
  1410.       recalc_txtptrs();
  1411.    }
  1412.    pagehd    = rpagehd;            /* restore previous settings */
  1413.    curpage   = rcurpage;
  1414.    curr_page = rcurr_page;
  1415.    arthd     = rarthd;
  1416. }
  1417.  
  1418.  
  1419.  
  1420. /**************************************************************************/
  1421. /* Function: output_doc()                          */
  1422. /* Description: kicks out a file to either the printer or a TDO file...   */
  1423. /**************************************************************************/
  1424. output_doc()
  1425. {
  1426.     int pagenum;
  1427.     int button;
  1428.     int copies;
  1429.     int lastpage;
  1430.     int firstp;
  1431.     int lastp;
  1432.     int firstpage;
  1433.  
  1434.     PAGE *rpagehd;
  1435.     PAGE *rcurpage;
  1436.     int  rtemp_page;
  1437.     int  tdisp_flag;
  1438.     int  rtmplate_flag;
  1439.     int  timage_status;
  1440.     ARTICLE *rarthd;
  1441.  
  1442.     long freemem;
  1443.     int mem_needed;
  1444.     int device;
  1445.     int tview;
  1446.  
  1447.     int dxres,dyres;
  1448.     long *landptr,*landesc;
  1449.     int pxy[4];
  1450.     long membytes;
  1451.  
  1452.     rtmplate_flag = tmplate_flag;
  1453.     rtemp_page = curr_page;
  1454.     timage_status = image_status;
  1455.     image_status = TRUE;
  1456.  
  1457.     if(tmplate_flag)
  1458.     {
  1459.       rpagehd = pagehd;
  1460.       rcurpage = curpage;
  1461.       rarthd   = arthd;
  1462.  
  1463.       pagehd = tpagehd;
  1464.       curpage = tcurpage;
  1465.       arthd   = tarthd;
  1466.  
  1467.       tmplate_flag = FALSE;
  1468.     }
  1469.  
  1470.  
  1471.     tdisp_flag = displ_tmpl_flag;
  1472.     displ_tmpl_flag = TRUE;
  1473.  
  1474.     graf_mouse(ARROW,&dummy);
  1475.     mem_needed = 0;
  1476.     device = OTDO;
  1477.  
  1478.     if(get_fpage(&pagenum))
  1479.     {
  1480.         set_int(adoutput,OFROMPAG,pagenum);
  1481.         firstpage = pagenum;
  1482.         do
  1483.         {
  1484.             lastpage = pagenum;
  1485.         }while(get_npage(&pagenum));
  1486.  
  1487.         set_int(adoutput,OTOPAGE,lastpage);
  1488.         set_int(adoutput,OCOPIES,1);
  1489.         adoutput[OPRINTER].ob_state = SELECTED;
  1490.     adoutput[OTDO].ob_state = NORMAL;
  1491.         button = execform(adoutput,OCOPIES);
  1492.         graf_mouse(BUSY_BEE,&dummy);            /* busy bee     */
  1493.         adoutput[button].ob_state = NORMAL;        /* reset button */
  1494.  
  1495.  
  1496.         if(button == OPRINT)
  1497.         {
  1498.        copies = get_int(adoutput,OCOPIES);
  1499.        firstp = max(get_int(adoutput,OFROMPAG),firstpage);
  1500.        lastp = min(get_int(adoutput,OTOPAGE),lastpage);
  1501.        if(lastp < firstp)
  1502.             lastp = 9999;
  1503.        
  1504.        if(deferhj)            /* if H&J deferred, recalc text)*/
  1505.        {
  1506.         menu_icheck(ad_menu,ADEFER,0);
  1507.         deferhj = 0;
  1508.              tview = view_size;
  1509.         view_size = PACTUAL;
  1510.         recalc_alt_text();
  1511.                  view_size = tview;                
  1512.            }
  1513.        if(!deferhj && view_size == PADJCNT)
  1514.            {
  1515.            tview = view_size;
  1516.            view_size = PACTUAL;
  1517.            recalc_alt_text();
  1518.            view_size = tview;                
  1519.            }
  1520.        
  1521.            
  1522.            if(adoutput[OPRINTER].ob_state == SELECTED)
  1523.            {
  1524.            device = OPRINTER;
  1525.                freemem = Malloc(-1L);
  1526.                if(freemem < 1230000L)
  1527.                {
  1528.           mem_needed = 1;
  1529.           Mfree(page_ptr);        /* Free page buffer  */
  1530.                }
  1531.  
  1532.          if(pagetype > PLEGAL)
  1533.          {
  1534.                    mutolas(hpage_size,vpage_size,&dxres,&dyres);
  1535.            membytes = (long)(((((long)dxres + 15L)/16L)*16L)*((((long)dyres + 15L)/16L) * 16L));
  1536.            membytes /= 8L;
  1537.            membytes += 1;
  1538.            membytes &= 0xFFFFFFFEL;
  1539.               landptr = landesc = Malloc(membytes);
  1540.            daveptr = Malloc(20000L);
  1541.              if(!landptr || !daveptr)
  1542.            {
  1543.             alert_cntre(ALERT3);
  1544.             goto leave;
  1545.              }
  1546.               GDvq_extnd(mhandle,0,intout,dxres,dyres,&landesc);
  1547.            dxres -= 1;
  1548.            dyres -= 1;
  1549.          }
  1550.          else
  1551.          {
  1552.            landptr = 0L;
  1553.            dxres = dyres = 0;
  1554.          }
  1555.     
  1556.                  if(!laser_open(landptr,dyres,dxres))
  1557.          {
  1558.             switch(intout[0])
  1559.             {
  1560.                case 1:  /* No Printer Attached */
  1561.                     alert_cntre(ALERT41);
  1562.                     break;
  1563.  
  1564.                case 2:  /* Not Enough Memory   */
  1565.                     alert_cntre(ALERT42);
  1566.                     break;
  1567.  
  1568.                case 3:  /* Wrong Paper Size with Landscape */
  1569.                     alert_cntre(ALERT43);
  1570.                     break;
  1571.  
  1572.                default: /* Catch All Phrase...*/
  1573.                         alert_cntre(ALERT3);
  1574.                     break;
  1575.             }
  1576.                  }
  1577.              else
  1578.                  {
  1579.             if(pagetype > PLEGAL)
  1580.             {
  1581.                      mutolas(hpage_size,vpage_size,&dxres,&dyres);
  1582.                GDvq_extnd(mhandle,0,intout,dxres,dyres,&landesc);
  1583.             laser_MFDB.fd_w = dxres;
  1584.             laser_MFDB.fd_h = dyres;
  1585.             laser_MFDB.fd_wdwidth = (dxres + 15)/16;
  1586.             laser_bytes = membytes;
  1587.                pxy[0] = pxy[1] = 0;
  1588.                     pxy[2] = dxres-1;
  1589.                        pxy[3] = dyres-1;
  1590.                        vs_clip(mhandle,1,pxy);
  1591.             }
  1592.             laser_out(firstp,lastpage,mem_needed,copies,lastp);
  1593.             laser_close();
  1594.             IF_close();            /* clear the font cache*/
  1595.             IF_open(0);
  1596.                  }
  1597.  
  1598. leave:          
  1599.                print_flag = FALSE;    
  1600.            if(pagetype > PLEGAL)
  1601.            {
  1602.             if(landesc)
  1603.             Mfree(landesc);           
  1604.             if(daveptr)
  1605.             Mfree(daveptr);
  1606.             landesc = daveptr = 0L;
  1607.            }
  1608.  
  1609.               if(mem_needed)
  1610.                {
  1611.                   page_ptr = pagesc = (unsigned long) Malloc(prev_bytes);
  1612.                   page_MFDB.fd_addr = page_ptr;
  1613.               GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr);
  1614.                   }
  1615.            if((pagetype > PLEGAL) && !mem_needed) /* reset ptrs...*/
  1616.                  GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr);    
  1617.            mclip();
  1618.           
  1619.  
  1620.            }  
  1621.            else                 /* TDO        */
  1622.            {
  1623.              device = OTDO;
  1624.              force_blit_redraw(0);
  1625.          tdo_out(firstp,lastpage,lastp,copies);
  1626.            }
  1627.  
  1628.        }                  /* End of Ok BUTTON TO PRINT */
  1629.  
  1630.     }           /* end of no pages to print in the first place */
  1631.  
  1632.     tmplate_flag = rtmplate_flag;
  1633.     curr_page = rtemp_page;
  1634.     image_status = timage_status;
  1635.     if(tmplate_flag)
  1636.     {
  1637.       pagehd = rpagehd;
  1638.       curpage = rcurpage;
  1639.       arthd   = rarthd;
  1640.     }
  1641.     if(device == OPRINTER)
  1642.     {
  1643.  
  1644.        if(view_size == PADJCNT)
  1645.         recalc_alt_text();
  1646.     }
  1647.     displ_tmpl_flag = tdisp_flag;
  1648. /*    if(mem_needed) */
  1649.     force_preview(); /* After printing, the slave is gone...      */
  1650.              /* and we'll have to recreate the slave then */
  1651.     graf_mouse(ARROW,&dummy);
  1652. }
  1653.  
  1654.  
  1655.  
  1656.  
  1657. laser_out(firstp,lastpage,mem_needed,copies,lastp)
  1658. int firstp;
  1659. int lastpage;
  1660. int mem_needed;
  1661. int copies;
  1662. int lastp;
  1663. {
  1664.     int event;
  1665.     int key;
  1666.     int pagenum;
  1667.     int pxy[4];
  1668.     int dummy;
  1669.     int tmp_buff[8];
  1670.     int rmu[4];
  1671.     int gflag;
  1672.     long rptr;
  1673.     int  dxres,dyres;
  1674.    
  1675.     if(copies > 1)
  1676.     v_pgcount(phandle,--copies);
  1677.  
  1678.     if(phandle)
  1679.          init_text(phandle);
  1680.     print_flag = TRUE;
  1681.     
  1682.     force_blit_redraw(mem_needed);  /* SLM 804      */
  1683.     if(pagetype > PLEGAL)
  1684.     {
  1685.        mutolas(hpage_size,vpage_size,&dxres,&dyres);
  1686.        pxy[0] = pxy[1] = 0;
  1687.        pxy[2] = dxres-1;
  1688.        pxy[3] = dyres-1;
  1689.        vs_clip(mhandle,1,pxy);
  1690.     }
  1691.     
  1692.     if((get_fpage(&pagenum)) && (firstp <= lastpage) )
  1693.     {
  1694.     while(pagenum < firstp)
  1695.         get_npage(&pagenum);
  1696.         do
  1697.         {
  1698.            graf_mouse(BUSY_BEE,&dummy);            /* busy bee     */
  1699.  
  1700.        if(view_size == PADJCNT)
  1701.        {
  1702.          if(pagenum % 2)
  1703.          {
  1704.                rptr = get_fregion(pagenum,&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag);
  1705.            while(rptr)
  1706.            {
  1707.           if(!gflag)
  1708.             free_regslv(rptr);
  1709.           rptr = get_nregion(&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag);
  1710.            }
  1711.          }
  1712.         }
  1713.  
  1714.        curr_page = pagenum;
  1715.        redraw_laser(pagenum);
  1716.            pxy[2] = pxres;
  1717.            pxy[3] = pyres;
  1718.            pxy[0] = pxy[1] = 0;
  1719.        vs_clip(phandle,1,pxy);
  1720.  
  1721.            rptr = get_fregion(pagenum,&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag);
  1722.        while(rptr)
  1723.        {
  1724.         if(!gflag)
  1725.             free_regslv(rptr);
  1726.         rptr = get_nregion(&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag);
  1727.        }
  1728.        event = evnt_multi((MU_KEYBD|MU_TIMER),
  1729.                  0,0,0,
  1730.                  0,0,0,0,0,
  1731.                  0,0,0,0,0,
  1732.                  tmp_buff,
  1733.                  0,0,        /* timer == 0 */
  1734.                  &dummy,&dummy,
  1735.                  &dummy,&dummy,
  1736.                  &key,&dummy);
  1737.  
  1738.        if(event != MU_TIMER)
  1739.               break;
  1740.  
  1741.         }while((get_npage(&pagenum)) && (pagenum <= lastp));
  1742.     }
  1743. }
  1744.  
  1745.  
  1746.  
  1747.  
  1748. tdo_out(firstp,lastpage,lastp,copies)
  1749. int firstp;
  1750. int lastpage;
  1751. int lastp;
  1752. int copies;
  1753. {
  1754.  
  1755.     int dummy;
  1756.     int pagenum;
  1757.     int count;
  1758.     int i;
  1759.  
  1760.     strcpy(pathbuf,dpath4);
  1761.     strcat(pathbuf,"*.TYF");
  1762.     if(!get_fs(fbuffer,&dummy))
  1763.     return;
  1764.     extender(fbuffer,".TYF");
  1765.     Fsetdta(&thedta.res[0]);
  1766.     if(Fsfirst(fbuffer,0)==0)
  1767.     {
  1768.     if(alert_cntre(ALERT37)==2)
  1769.         {
  1770.        return;
  1771.         }
  1772.     }
  1773.     if((TYF_handle=Fcreate(fbuffer,0)) <= 0)
  1774.     {
  1775.     alert_cntre(ALERT19);
  1776.         return;
  1777.     }
  1778.     
  1779.     Start_TYF();    
  1780.  
  1781.     if((get_fpage(&pagenum)) && (firstp <= lastpage))
  1782.     {
  1783.     while(pagenum < firstp)
  1784.         get_npage(&pagenum);
  1785.     if(copies == 0) copies = 1;
  1786.         count = copies;
  1787.     do
  1788.         {
  1789.          curr_page = pagenum;
  1790.          for(i=1;i<=count;i++)
  1791.                  redraw_tdo(pagenum,lastp);
  1792.         }while((get_npage(&pagenum)) && (pagenum <= lastp));
  1793.     }
  1794.     End_TYF();
  1795.     Fclose(TYF_handle);
  1796.  
  1797. }
  1798.  
  1799.  
  1800.