home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / driver / show / amiga / gadget.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-14  |  27.5 KB  |  1,034 lines

  1.  
  2. #ifdef AMIGA
  3.  
  4. #include "defines.h"
  5.  
  6. #include <stdio.h>
  7. #include <fcntl.h>
  8. #include <intuition/intuition.h>
  9. #include <libraries/dos.h>
  10. #include <exec/memory.h>
  11.  
  12. #include <intuition/classusr.h>
  13. #include <intuition/imageclass.h>
  14. #include <intuition/gadgetclass.h>
  15. #include <intuition/cghooks.h>
  16. #include <intuition/icclass.h>
  17. #include <intuition/classes.h>
  18.  
  19. #ifdef AZTEC_C
  20. #  include <functions.h>
  21. #endif
  22.  
  23. #ifdef ANSI
  24. #  include <string.h>
  25. #  include <stdlib.h>
  26. #endif
  27.  
  28. #include <clib/intuition_protos.h>
  29. #include <clib/graphics_protos.h>
  30. #include <clib/exec_protos.h>
  31. #include <clib/dos_protos.h>
  32. #include <pragmas/intuition_pragmas.h>
  33. #include <pragmas/graphics_pragmas.h>
  34. #include <pragmas/exec_pragmas.h>
  35. #include <pragmas/dos_pragmas.h>
  36.  
  37. #define MEM_IN_CHIP
  38.  
  39. #ifndef MEM_IN_CHIP
  40. #  define chip
  41. #endif
  42.  
  43. #ifndef max
  44. #define   max(a,b)    ((a) > (b) ? (a) : (b))
  45. #endif
  46.  
  47.  
  48. #include "globals.h"
  49. #include "gad_def.h"
  50. #include "amscreen.h"
  51. #include "gadget.h"
  52.  
  53. #include "showdvi.i"
  54. #include "gadget.i"
  55. #include "amscreen.i"
  56. #include "globals.i"
  57. #include "am_requ.i"
  58. #include "liste.i"
  59. #include "am_menu.i"
  60. // #include "pgscroll.i"
  61.  
  62.  
  63. /*
  64.  * Fuer die locale-Library:
  65.  *
  66.  * Hier duerfen *nur* die MSG_#? Nummern eingebunden werden!
  67.  * Achtung:
  68.  * Es muss/sollte 'multiple-include' erlaubt sein!
  69.  */
  70. #include "local.i"
  71.  
  72. #undef  CATCOMP_ARRAY
  73. #undef  CATCOMP_BLOCK
  74. #undef  CATCOMP_STRINGS
  75. #define CATCOMP_NUMBERS
  76. #include "localstr.h"
  77.  
  78.  
  79.  
  80. extern long        current_page_phy;
  81. extern long        current_page;
  82.  
  83. static long        x_image_bytes;
  84. static long        y_image_bytes;
  85.  
  86. /* Wird fuer das Gadgetumschalten benoetigt, wenn man ganz nach oben/unten gescrollt hat. */
  87. static char        is_ganz_unten = FALSE;
  88. static char        is_ganz_oben = FALSE;
  89.  
  90.  
  91. static struct Gadget * PgGadLst = NULL;
  92.  
  93. /* lokale Funktionen */
  94. #if !defined(REQ_LIBRARY)    /* color requester comes from the req.library */
  95. static void set_temp_color        Args((int gadid,
  96.                                                 int temp));
  97. #endif
  98.  
  99. static void SetPgUpGad            Args((void));    /* Mit RemoveGad/AddGad/RefreshGad */
  100. static void SetPgDownGad        Args((void));    /* Mit RemoveGad/AddGad/RefreshGad */
  101.  
  102.  
  103.  
  104. /* a macro for the "adjacent" position to the right of a gadget,
  105.  * but safe, if the reference gadget is NULL
  106.  */
  107. #define RIGHTBY( g )    ( ((g)==NULL)? 20: ((g)->LeftEdge + (g)->Width ) )
  108.  
  109.  
  110.  
  111. #define ABSOLUT(x)    (((x)>=0) ? (x) : -(x))
  112.  
  113. /* struct Remember *Rem_Key = NULL; */
  114.  
  115.  
  116.  
  117. #if 0
  118. #define MARGIN_SPRITE_DATA_SIZE    11*2
  119. #define MARGIN_SPRITE_HEIGHT    11
  120. #define MARGIN_SPRITE_WIDTH    16
  121. extern UWORD * margin_sprite_data;
  122. static USHORT __chip margin_sprite_data_fast[] = {
  123.     0x0000, 0x0000,    /* vert. and horiz. start posn. */
  124.     /* Plane 0 */
  125.     0xA0A0, 0x0000,
  126.     0x60C0, 0x0000,
  127.     0xF1E0, 0x0000,
  128.     0x3180, 0x0000,
  129.     0x0A00, 0x0000,
  130.     0x0000, 0x0000,
  131.     0x0A00, 0x0000,
  132.     0x3180, 0x0000,
  133.     0xF1E0, 0x0000,
  134.     0x60C0, 0x0000,
  135.     0xA0A0, 0x0000,
  136.     /* Plane 1 */
  137.     0x60C0, 0x0000,
  138.     0xA0A0, 0x0000,
  139.     0xD160, 0x0000,
  140.     0x2080, 0x0000,
  141.     0x0000, 0x0000,
  142.     0x0000, 0x0000,
  143.     0x0000, 0x0000,
  144.     0x2080, 0x0000,
  145.     0xD160, 0x0000,
  146.     0xA0A0, 0x0000,
  147.     0x60C0, 0x0000,
  148.     0x0000, 0x0000,    /* reserved, must be NULL */
  149. };
  150. #endif
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157. void __inline VSetScrollerValues(void)
  158. {
  159.   UWORD winih = win2->Height - win2->BorderTop - win2->BorderBottom;
  160.   UWORD hidden = max(wy - winih, 0);
  161.   if (static_y_Koo > hidden) static_y_Koo = hidden;
  162.   poty_PropInfo.VertBody = (hidden > 0) 
  163.             ? (UWORD)(((ULONG)(winih-(winih>>3)) * MAXBODY) / (wy-(winih>>3))) 
  164.             : MAXBODY;
  165.   poty_PropInfo.VertPot  = (hidden > 0) 
  166.             ? (UWORD)(((ULONG)static_y_Koo * MAXPOT) / hidden) 
  167.             : 0;
  168. }
  169.  
  170. UWORD __inline VFindScrollerTop(void)
  171. {
  172.   UWORD winih = win2->Height - win2->BorderTop - win2->BorderBottom;
  173.   UWORD top, hidden;
  174.   hidden = max(wy - winih, 0);
  175.   top = (((ULONG)hidden*poty_PropInfo.VertPot) + (MAXPOT/2)) >> 16;
  176.   return top;
  177. }
  178.  
  179. void __inline HSetScrollerValues(void)
  180. {
  181.   UWORD winiw = win2->Width - win2->BorderLeft - win2->BorderRight;
  182.   UWORD hidden = max(wx - winiw, 0);
  183.   if (static_x_Koo > hidden) static_x_Koo = hidden;
  184.   potx_PropInfo.HorizBody = (hidden > 0) ? (UWORD)(((ULONG)(winiw-(winiw>>3)) * MAXBODY) / (wx-(winiw>>3))) : MAXBODY;
  185.   potx_PropInfo.HorizPot  = (hidden > 0) ? (UWORD)(((ULONG)static_x_Koo * MAXPOT) / hidden) : 0;
  186. }
  187.  
  188. UWORD __inline HFindScrollerTop(void)
  189. {
  190.   UWORD winiw = win2->Width - win2->BorderLeft - win2->BorderRight;
  191.   UWORD top, hidden;
  192.   hidden = max(wx - winiw, 0);
  193.   top = (((ULONG)hidden*potx_PropInfo.HorizPot) + (MAXPOT/2)) >> 16;
  194.   return top;
  195. }
  196.  
  197.  
  198.  
  199.  
  200. void ModifyXPot(void)
  201. {
  202.   if (is_gadg) {
  203.       HSetScrollerValues();
  204.       NewModifyProp(&potx_Gad, win2, NULL, potx_PropInfo.Flags, potx_PropInfo.HorizPot, 0,
  205.                 potx_PropInfo.HorizBody, 0, 1);
  206.   }
  207. }
  208.  
  209. void ModifyYPot(void)
  210. {
  211.   if (is_gadg) {
  212.       VSetScrollerValues();
  213.       NewModifyProp(&poty_Gad, win2, NULL, poty_PropInfo.Flags, 0, poty_PropInfo.VertPot,
  214.                 0, poty_PropInfo.VertBody, 1);
  215.   }
  216. }
  217.  
  218.  
  219. void init_gad(void)
  220.  {
  221.   register struct Gadget *gad;
  222.  
  223.   potx_PropInfo.Flags = FREEHORIZ | PROPNEWLOOK | PROPBORDERLESS | AUTOKNOB;
  224.   HSetScrollerValues();
  225.  
  226.   gad = &potx_Gad;
  227.   gad->LeftEdge = width_left_border-1+WIDTH_PAGEX_GAD;
  228.   gad->TopEdge  = -BObj.LArrImage->Height + 3; // -HEIGHT_SCROLL + ((is_os2) ? 3 : 1);
  229.   gad->Width    = - BObj.UArrImage->Width - BObj.DArrImage->Width - BObj.SizeImage->Width - width_left_border + 4 - WIDTH_PAGEX_GAD;
  230.   gad->Height   = BObj.LArrImage->Height - 4;  // (SHORT)HEIGHT_SCROLL_BAR - ((is_os2) ? 4 : 2);
  231.   gad->UserData = 0;  // (APTR)(win2->Width-win2->BorderLeft-WIDTH_SCROLL-2 - 2*WIDTH_RL_ARROW - WIDTH_PAGEX_GAD);
  232.  
  233.   poty_PropInfo.Flags = FREEVERT | PROPNEWLOOK | PROPBORDERLESS | AUTOKNOB;
  234.   VSetScrollerValues();
  235.  
  236.   gad = &poty_Gad;
  237.   gad->LeftEdge = -BObj.SizeImage->Width + 5;  // -WIDTH_SCROLL_BAR + 3; /* relativ zum rechten Rand */
  238.   gad->TopEdge = HeightWinTitle + BObj.UArrImage->Height + BObj.DArrImage->Height + 1;  // 2*HEIGHT_UD_ARROW+1;
  239.   gad->Width = BObj.SizeImage->Width - 8;     // (SHORT)WIDTH_SCROLL_BAR - 6;
  240.   gad->Height = -BObj.SizeImage->Height - 2*(BObj.UArrImage->Height + BObj.DArrImage->Height) - HeightWinTitle - 2;  // 4*HEIGHT_UD_ARROW - HeightWinTitle - 2;
  241.   gad->UserData = 0;  //(APTR)(x_win_i_height-6*HEIGHT_UD_ARROW);
  242.  
  243.   gad = &potx_left_Gad;
  244.   gad->LeftEdge = -BObj.SizeImage->Width - BObj.LArrImage->Width - BObj.RArrImage->Width + 1; // -3 * WIDTH_SCROLL - 1;
  245.   gad->TopEdge = potx_Gad.TopEdge - ((is_os2) ? 2 : 0);
  246.   //gad->Width = (SHORT)WIDTH_X_GADGETS;
  247.   //gad->Height = (SHORT)HEIGHT_SCROLL_BAR;
  248.   gad->GadgetRender = gad->SelectRender = (APTR)BObj.LArrImage;
  249.  
  250.   gad = &potx_right_Gad;
  251.   gad->LeftEdge = -BObj.SizeImage->Width - BObj.RArrImage->Width + 1; // -2 * WIDTH_SCROLL - 1;
  252.   gad->TopEdge = (SHORT)potx_Gad.TopEdge - ((is_os2) ? 2 : 0);
  253.   //gad->Width = (SHORT)WIDTH_X_GADGETS;
  254.   //gad->Height = (SHORT)HEIGHT_SCROLL_BAR;
  255.   gad->GadgetRender = gad->SelectRender = (APTR)BObj.RArrImage;
  256.   
  257.   gad = &poty_up_Gad;
  258.   gad->LeftEdge = (SHORT)poty_Gad.LeftEdge - 4;
  259.   gad->TopEdge = -BObj.SizeImage->Height - BObj.UArrImage->Height - BObj.DArrImage->Height + 1;  // -HEIGHT_SCROLL - 2*HEIGHT_UD_ARROW + 1;
  260.   //gad->Width = (SHORT)WIDTH_SCROLL_BAR;
  261.   //gad->Height = (SHORT)HEIGHT_UD_ARROW;
  262.   gad->GadgetRender = gad->SelectRender = (APTR)BObj.UArrImage;
  263.  
  264.   gad = &poty_up2_Gad;
  265.   gad->LeftEdge = (SHORT)poty_up_Gad.LeftEdge;
  266.   gad->TopEdge = (SHORT)HeightWinTitle;
  267.   //gad->Width = (SHORT)WIDTH_SCROLL_BAR;
  268.   //gad->Height = (SHORT)HEIGHT_UD_ARROW;
  269.   gad->GadgetRender = gad->SelectRender = (APTR)BObj.UArrImage;
  270.  
  271.   gad = &poty_down_Gad;
  272.   gad->LeftEdge = (SHORT)poty_up_Gad.LeftEdge;
  273.   gad->TopEdge = -BObj.SizeImage->Height - BObj.DArrImage->Height + 1;  // -HEIGHT_SCROLL - HEIGHT_UD_ARROW + 1;
  274.   //gad->Width = (SHORT)WIDTH_SCROLL_BAR;
  275.   //gad->Height = (SHORT)HEIGHT_UD_ARROW;
  276.   gad->GadgetRender = gad->SelectRender = (APTR)BObj.DArrImage;
  277.  
  278.   gad = &poty_down2_Gad;
  279.   gad->LeftEdge = (SHORT)poty_up_Gad.LeftEdge;
  280.   gad->TopEdge = (SHORT)HeightWinTitle + BObj.UArrImage->Height;  // HEIGHT_UD_ARROW;
  281.   //gad->Width = (SHORT)WIDTH_SCROLL_BAR;
  282.   //gad->Height = (SHORT)HEIGHT_UD_ARROW;
  283.   gad->GadgetRender = gad->SelectRender = (APTR)BObj.DArrImage;
  284. }
  285.  
  286.  
  287. #if !defined(REQ_LIBRARY)    /* color requester comes from the req.library */
  288. static void set_temp_color(int gadid,int temp)
  289. {
  290.   if (current_col.col_number_t == 0) {
  291.     switch (gadid) {
  292.       case COL_RED_NR      :
  293.     current_col.red_t0 = (short)temp;
  294.     break;
  295.       case COL_GREEN_NR :
  296.     current_col.green_t0 = (short)temp;
  297.     break;
  298.       case COL_BLUE_NR  :
  299.     current_col.blue_t0 = (short)temp;
  300.     break;
  301.       }
  302.   }
  303.   else {
  304.     switch (gadid) {
  305.       case COL_RED_NR      :
  306.     current_col.red_t1 = (short)temp;
  307.     break;
  308.       case COL_GREEN_NR :
  309.     current_col.green_t1 = (short)temp;
  310.     break;
  311.       case COL_BLUE_NR  :
  312.     current_col.blue_t1 = (short)temp;
  313.     break;
  314.     }
  315.   }
  316. }
  317. #endif
  318.  
  319.  
  320. long handle_file_gad(void)
  321. {
  322. #if 0
  323.   register long ret = 0L;
  324.   register char c;
  325.   int i, ac;
  326.   char *str, *tptr, string[250], fname[250];
  327.  
  328.   str = (char *)((struct StringInfo *)(fil_Gad.SpecialInfo))->Buffer;
  329.   strcpy(fname, str);
  330.   if (fname[0]=='\0') {
  331.      strcpy((char *)((struct StringInfo *)(fil_Gad.SpecialInfo))->Buffer,
  332.     (char *)((struct StringInfo *)(fil_Gad.SpecialInfo))->UndoBuffer);
  333.      return ret;
  334.   }
  335.   if ((tptr = strrchr(fname, '.')) == NULL || stricmp(tptr, ".dvi")) {
  336.     strcat(fname, ".dvi");
  337.   }
  338.   /** zu umstaendlich ....
  339.   if (tptr == NULL) {
  340.     strcat(fname, ".dvi");
  341.   }
  342.   else {
  343.     if (stricmp(tptr, ".dvi") != 0) {
  344.        strcat(fname, ".dvi");
  345.     }
  346.   }
  347.   **/
  348.   str = (char *)((struct StringInfo *)(dir_Gad.SpecialInfo))->Buffer;
  349.   strcpy(string,str);
  350.   /* mit ':' ist der Filename schon komplett !!! */
  351.   if (fname[0] == ':') {    /* append device from dir-gad */
  352.     tptr = strrchr(string,':');
  353.     strcpy(tptr,fname);
  354.     strcpy(fname,string);
  355.   }
  356.  
  357.   ac = access(fname,4);    /* Test ob File allein existiert */
  358.   if (ac != 0) {        /* File existiert so noch nicht  */
  359.     /* Directory aus dir_Gad holen */
  360.     str = (char *)((struct StringInfo *)(dir_Gad.SpecialInfo))->Buffer;
  361.     strcpy(string,str);
  362.     i = strlen(string);
  363.     if (i > 0)  {     /* haenge slash an */
  364.        c = string[i-1];
  365.        if (c != ':' && c != '/' )  {
  366.          string[i] = '/';
  367.          string[i+1] = (char)0;
  368.        }
  369.     }
  370.     ac = access(string,0);    /* Test ob Dir. existiert */
  371.     if (ac != 0) {
  372.        strcpy((char *)((struct StringInfo *)(dir_Gad.SpecialInfo))->Buffer,
  373.       (char *)((struct StringInfo *)(dir_Gad.SpecialInfo))->UndoBuffer);
  374.        RefreshGList(&dir_Gad,win2,NULL,2);
  375.        Message("Directory \"%s\" not found!",string);
  376.        beep();
  377.        return ret;
  378.     }
  379.     /* Filename + Directory in fname */
  380.     strcat(string, fname);
  381.     strcpy(fname, string);
  382.   }
  383.   else {    /* fname allein existiert */
  384.     if (strchr(fname,'/') == NULL && strchr(fname,':') == NULL) {
  385.       /* kein Pfad-Anteil */
  386.       getdir("",string);
  387.       strcat(string,fname);
  388.       strcpy(fname,string);
  389.     }
  390.   }
  391.   ac = access(fname, 4);    /* existiert das File mit Direct. */
  392.   if (ac != 0) {        /* Nein... */
  393.       /* dann scheint es ueberhaupt nicht zu existieren */
  394.       strcpy((char *)((struct StringInfo *)(dir_Gad.SpecialInfo))->Buffer,
  395.     (char *)((struct StringInfo *)(dir_Gad.SpecialInfo))->UndoBuffer);
  396.       strcpy((char *)((struct StringInfo *)(fil_Gad.SpecialInfo))->Buffer,
  397.     (char *)((struct StringInfo *)(fil_Gad.SpecialInfo))->UndoBuffer);
  398.       RefreshGList(&dir_Gad,win2,NULL,2);
  399.       Message("File \"%s\" not found!",fname);
  400.       beep();
  401.       return ret;
  402.   }
  403.   /* das File exist. mit Namen fname */
  404.  
  405.   /* das selbe wie zuvor??? */
  406.   if (strcmp(filename, fname) == 0) {
  407.     ret = KOMM + 3L;        /* load again */
  408.     OpenNewDVI(filename, FALSE);
  409.   }
  410.   else {
  411.     strcpy(filename, fname);    /* akt. vollst. Filename */
  412.     /* nun Namen aufsplitten in Dir. und in Filename */
  413.     set_Gadgets_to_fname();
  414.     ret = KOMM +4L;        /* neues File */
  415.     OpenNewDVI(filename, FALSE);
  416.   }
  417.  
  418.   return ret;
  419. #else
  420.   return 0;
  421. #endif
  422. }
  423.  
  424.  
  425.  
  426. /* ToDo: Check auf erste, letzte Seite und geg. Gadget disabeln */ 
  427. void CheckUpDownBorderGad(void)
  428. {
  429.   if (is_pscro) return;
  430.  
  431.   if (is_ganz_unten) {
  432.     if (poty_PropInfo.VertPot <= 65400) {
  433.       is_ganz_unten = FALSE;
  434.       SetPgDownGad();
  435.     }
  436.   }
  437.   else {
  438.     if (poty_PropInfo.VertPot > 65400) {
  439.       is_ganz_unten = TRUE;
  440.       SetPgDownGad();
  441.     }
  442.   }
  443.   if (is_ganz_oben) {
  444.     if (poty_PropInfo.VertPot > 0) {
  445.       is_ganz_oben = FALSE;
  446.       SetPgUpGad();
  447.     }
  448.   }
  449.   else {
  450.     if (poty_PropInfo.VertPot == 0) {
  451.       is_ganz_oben = TRUE;
  452.       SetPgUpGad();
  453.     }
  454.   }
  455. }
  456.  
  457. static void SetPgUpGad(void)
  458. {
  459. #if 0
  460.   if (win2 == NULL || !is_gadg) return;
  461.  
  462.   RemoveGadget(win2, &poty_up2_Gad);
  463.   RemoveGadget(win2, &poty_up_Gad);
  464.   SetPgUp();
  465.   AddGadget(win2, &poty_up_Gad,  POTY_PFEIL_OBEN_GAD_NR);
  466.   AddGadget(win2, &poty_up2_Gad, POTY_PFEIL_OBEN2_GAD_NR);
  467.   RefreshGList(&poty_up_Gad, win2, NULL, 2);
  468. #endif
  469. }
  470.  
  471. static void SetPgDownGad(void)
  472. {
  473. #if 0
  474.   if (win2 == NULL || !is_gadg) return;
  475.  
  476.   RemoveGadget(win2, &poty_down2_Gad);
  477.   RemoveGadget(win2, &poty_down_Gad);
  478.   SetPgDown();
  479.   AddGadget(win2, &poty_down_Gad,    POTY_PFEIL_UNTEN_GAD_NR);
  480.   AddGadget(win2, &poty_down2_Gad,    POTY_PFEIL_UNTEN2_GAD_NR);
  481.   RefreshGList(&poty_down_Gad, win2, NULL, 2);
  482. #endif
  483. }
  484.  
  485.  
  486.  
  487. long check_gad(struct Gadget *m_gad)
  488. {
  489.   register short gadid;
  490.   /* struct PropInfo *pInf; */
  491.   long ret = 0L;
  492.  
  493.   gadid = m_gad->GadgetID;
  494.  
  495.   if (is_print && (gadid == PG_POT_GAD_NR || gadid == PG_LEFT_GAD_NR ||
  496.     gadid == PG_RIGHT_GAD_NR || PG_INT_GAD_NR)) {
  497.     Message(MSG_NOT_WHILE_PRINTING);
  498.     beep();
  499.     Set_PgGadPageCur();    // wieder zuruecksetzen
  500.     return 0L;
  501.   }
  502.  
  503.   switch (gadid) {
  504.     case PG_POT_GAD_NR:
  505.     case PG_LEFT_GAD_NR:
  506.     case PG_RIGHT_GAD_NR:
  507.         {
  508.           long phy;
  509.  
  510.           GetAttr(PGA_Top, pg_pot_Gad, (ULONG *)&phy);
  511.           phy++;    // PGA_Top geht von 0 -- max_page_number-1, ich fang aber bei 1 an!
  512.           
  513.           if (gadid != PG_POT_GAD_NR) {
  514.             if (gadid == PG_LEFT_GAD_NR) phy--;
  515.             else                         phy++;
  516.           
  517.             if (phy < 1)               break; //phy = 1;
  518.             if (phy > max_page_number) break; //phy = max_page_number;
  519.  
  520.             Set_PgGadPage(phy);          
  521.           }
  522.           
  523.           set_tusephy;
  524.           ret = phy;
  525.         }
  526.     break;
  527.     
  528.       case PG_INT_GAD_NR:
  529.         GetAttr(STRINGA_LongVal, pg_int_Gad, (ULONG *)&ret);
  530.         if (is_usephy) {
  531.           if (ret < 1) ret = 1;
  532.           if (ret > max_page_number) ret = max_page_number;
  533.         }
  534.         else {
  535.           if (ret == 0) ret = -1;    // -1 entspricht Seite 0
  536.                          // gibt allerdings Probleme mit wirklich neg. Seiten
  537.         }
  538.         break;
  539.       
  540.       case POTX_PFEIL_LINKS_GAD_NR    :    /* Hit-Gadget  */
  541.          window_plus_sbar_move(-STEP_ARROW_X,0);
  542.          break;
  543.       case POTX_PFEIL_RECHTS_GAD_NR    :    /* Hit-Gadget  */
  544.          window_plus_sbar_move(STEP_ARROW_X,0);
  545.          break;
  546.       case POTY_PFEIL_OBEN_GAD_NR    :    /* Hit-Gadget  */
  547.       case POTY_PFEIL_OBEN2_GAD_NR    :    /* Hit-Gadget  */
  548.          window_plus_sbar_move(0,-STEP_ARROW_Y);
  549.          break;
  550.       case POTY_PFEIL_UNTEN_GAD_NR    :    /* Hit-Gadget  */
  551.       case POTY_PFEIL_UNTEN2_GAD_NR    :    /* Hit-Gadget  */
  552.          window_plus_sbar_move(0,STEP_ARROW_Y);
  553.          break;
  554.          
  555.       case POTX_GAD_NR:
  556.              window_set_x(HFindScrollerTop());
  557.          break;
  558.       case POTY_GAD_NR:
  559.              window_set_y(VFindScrollerTop());
  560.          break;
  561.  
  562.       default: Fatal(20,MSG_INTERNAL_ERROR_W_ARG, "unknown Gadgetnumber");
  563.   }
  564.   return (ret);
  565. }
  566.  
  567.  
  568. long down_gad(long gadid, struct Gadget *m_gad, ULONG time_secs, ULONG time_mics)
  569. {
  570.   register struct PropInfo *pInf;
  571.   struct IntuiMessage *msg2;
  572.   long ret = 0;
  573.   ULONG msg_class = GADGETDOWN;    /* Initialisierung fuer die do {} while Schleife */
  574.   long phy = 0;
  575.  
  576.   /* vv werden fuer den Doppelklick auf den Pfeilen benoetigt */
  577.   static ULONG old_time_secs=0, old_time_mics=0;
  578.   static long old_s_y_koo=0;
  579.  
  580.   pInf = (struct PropInfo *)m_gad->SpecialInfo;
  581.  
  582.   /* Falls eine der Pfeil Tasten gedrueckt wurde, wird auch gleich noch auf */
  583.   /* das GADGETUP oder MOUSEBUTTON..SELECTUP!! gewartet!! */
  584.  
  585.   switch (gadid) {
  586.     case POTX_GAD_NR:
  587.         window_set_x(HFindScrollerTop());
  588.     break;
  589.     case POTY_GAD_NR:
  590.         window_set_y(VFindScrollerTop());
  591.     break;
  592.  
  593.     case PG_LEFT_GAD_NR:
  594.     case PG_RIGHT_GAD_NR:
  595.         phy = 0;
  596.         GetAttr(PGA_Top, pg_pot_Gad, (ULONG *)&phy);
  597.         phy++;    // PGA_Top geht von 0 -- max_page_number-1, ich fang aber bei 1 an!
  598.         
  599.         if (gadid == PG_LEFT_GAD_NR) phy--;
  600.         else                         phy++;
  601.         
  602.         if (phy < 1)               phy = 1;
  603.         if (phy > max_page_number) phy = max_page_number;
  604.  
  605.         Set_PgGadPage(phy);
  606.         Delay(14);
  607.  
  608.     do {
  609.  
  610.       msg2 = (struct IntuiMessage *)GetMsg(win2->UserPort);
  611.       if (msg2 == NULL) {
  612.             phy = 0;
  613.             GetAttr(PGA_Top, pg_pot_Gad, (ULONG *)&phy);
  614.             phy++;    // PGA_Top geht von 0 -- max_page_number-1, ich fang aber bei 1 an!
  615.             
  616.             if (gadid == PG_LEFT_GAD_NR) phy--;
  617.             else                         phy++;
  618.             
  619.             if (phy < 1)               phy = 1;
  620.             if (phy > max_page_number) phy = max_page_number;
  621.  
  622.             Set_PgGadPage(phy);
  623.             Delay(9);
  624.           }
  625.           else {
  626.         msg_class = msg2->Class;
  627.         ReplyMsg(&(msg2->ExecMessage));
  628.       }
  629.     } while(msg_class != GADGETUP && msg_class != MOUSEBUTTONS);
  630.  
  631.     if (msg_class == GADGETUP) {
  632.           GetAttr(PGA_Top, pg_pot_Gad, (ULONG *)&ret);
  633.           ret++;
  634.           set_tusephy;    // interpretiere ret als physikalische Nummer ( => ret >0)
  635.         }
  636.         break;
  637.     case PG_INT_GAD_NR:
  638.     case PG_POT_GAD_NR:
  639.         break;
  640.  
  641.     case POTX_PFEIL_LINKS_GAD_NR:
  642.     case POTX_PFEIL_RECHTS_GAD_NR:
  643.     do {
  644.       msg2 = (struct IntuiMessage *)GetMsg(win2->UserPort);
  645.       if (msg2 == NULL) {
  646.         WaitBOVP(&(screen->ViewPort));
  647.         window_plus_sbar_move(((gadid == POTX_PFEIL_LINKS_GAD_NR) ? -STEP_ARROW_X : STEP_ARROW_X),0);
  648.       }
  649.       else {
  650.         msg_class = msg2->Class;
  651.         ReplyMsg(&(msg2->ExecMessage));
  652.       }
  653.     } while(msg_class != GADGETUP && msg_class != MOUSEBUTTONS);
  654.     break;
  655.     case POTY_PFEIL_OBEN_GAD_NR:
  656.     case POTY_PFEIL_OBEN2_GAD_NR:
  657.     case POTY_PFEIL_UNTEN_GAD_NR:
  658.     case POTY_PFEIL_UNTEN2_GAD_NR:
  659.     do {
  660.       msg2 = (struct IntuiMessage *)GetMsg(win2->UserPort);
  661.       if (msg2 == NULL) {
  662.         //WaitBOVP(&(screen->ViewPort));
  663.         window_plus_sbar_move(0,((gadid == POTY_PFEIL_OBEN_GAD_NR || 
  664.             gadid == POTY_PFEIL_OBEN2_GAD_NR) ? -STEP_ARROW_Y : STEP_ARROW_Y));
  665.       }
  666.       else {
  667.         msg_class = msg2->Class;
  668.         ReplyMsg(&(msg2->ExecMessage));
  669.       }
  670.     } while(msg_class != GADGETUP && msg_class != MOUSEBUTTONS);
  671.  
  672.  
  673.     if (!is_pscro && (static_y_Koo == old_s_y_koo) &&
  674.             DoubleClick(old_time_secs, old_time_mics, time_secs, time_mics)) {
  675.       ret = (gadid == POTY_PFEIL_OBEN_GAD_NR || gadid == POTY_PFEIL_OBEN2_GAD_NR)
  676.             ? (KOMM - 1) : (KOMM + 1);
  677.     }
  678.     old_time_secs = time_secs;
  679.     old_time_mics = time_mics;
  680.     old_s_y_koo = static_y_Koo;
  681.     break;
  682.   }
  683.  
  684.   /* Test ob ich am Rand bin */
  685.   CheckUpDownBorderGad();
  686.   return ret;
  687. }
  688.  
  689.  
  690. void follow_pot_gad(long gadid)
  691. {
  692.   //register struct PropInfo *pInf;
  693.  
  694.   /* updaten des Screens nach einer Mausebewegung auf einem Pot-Gadget */ 
  695.  
  696.   switch (gadid) {
  697.     case POTX_GAD_NR:
  698.       window_set_x(HFindScrollerTop());
  699.       break;
  700.     case POTY_GAD_NR:
  701.       window_set_y(VFindScrollerTop());
  702.       break;
  703.  
  704.         case PG_POT_GAD_NR:
  705.           {
  706.             long phy = 0;
  707.  
  708.         GetAttr(PGA_Top, pg_pot_Gad, (ULONG *)&phy);
  709.             phy++;    // PGA_Top geht von 0 -- max_page_number-1, ich fang aber bei 1 an!
  710.             
  711.             if (is_usephy) {
  712.           Set_PgIntGad(phy);
  713.             }
  714.             else {
  715.               long log = get_log_page_number(phy);
  716.           Set_PgIntGad(log);
  717.             }
  718.           }
  719.       break;
  720.   }
  721. }
  722.  
  723.  
  724.  
  725.  
  726. void Add_system_gadgets(void)
  727. {
  728.   register struct Window * w = win2;
  729.   struct Gadget * tmpgad;
  730.  
  731.   /* setze Boopsi-Gadget in den unteren Rand */
  732.   //InitPGScrollGad(win2, SDVI_DRI);
  733.   //ChangePGScrollGad(win2, max_page_number, current_page_phy);
  734.  
  735.  
  736.   tmpgad = (struct Gadget *)&PgGadLst;
  737.   pg_int_Gad = (struct ExtGadget *)NewObject(NULL, "strgclass", 
  738.         GA_ID,            PG_INT_GAD_NR,
  739.         GA_Width,        3*8,
  740.         GA_Height,        BObj.SizeImage->Height-2,    // HEIGHT_SCROLL_BAR-2,
  741.         GA_RelBottom,        -win2->BorderBottom+2,
  742.         GA_Left,        win2->BorderLeft + 5,
  743.         GA_RelVerify,        TRUE,
  744.         GA_BottomBorder,    TRUE,
  745.         GA_Previous,        tmpgad,
  746.         
  747.         STRINGA_MaxChars,    6,
  748.         STRINGA_LongVal,    0,
  749.         STRINGA_Justification,    STRINGRIGHT,
  750.         TAG_END);
  751.  
  752.   if (pg_int_Gad->Flags & GFLG_EXTENDED) pg_int_Gad->MoreFlags |= GMORE_GADGETHELP;
  753.  
  754.  
  755.   pg_pot_Gad = (struct ExtGadget *)NewObject(NULL, "propgclass", 
  756.         GA_ID,            PG_POT_GAD_NR,
  757.         GA_Height,        BObj.SizeImage->Height-4,    // HEIGHT_SCROLL_BAR - 4,
  758.         GA_Width,        200,
  759.         GA_RelBottom,        -win2->BorderBottom+2+1,
  760.         GA_Left,        RIGHTBY(pg_int_Gad) + 2,
  761.         GA_RelVerify,        TRUE,
  762.         GA_FollowMouse,        TRUE,
  763.         GA_Immediate,        TRUE,
  764.         GA_BottomBorder,    TRUE,
  765.         GA_Previous,        tmpgad,
  766.  
  767.         PGA_Freedom,        FREEHORIZ,
  768.         PGA_NewLook,        TRUE,
  769.         PGA_Borderless,        TRUE,
  770.         PGA_Top,        0,
  771.         PGA_Visible,        0,
  772.         PGA_Total,        0,
  773.         TAG_END);
  774.         
  775.   if (pg_pot_Gad->Flags & GFLG_EXTENDED) pg_pot_Gad->MoreFlags |= GMORE_GADGETHELP;
  776.  
  777.   pg_left_Gad = (struct ExtGadget *)NewObject(NULL, "buttongclass", 
  778.         GA_ID,            PG_LEFT_GAD_NR,
  779.         GA_RelBottom,        -win2->BorderBottom+1,
  780.         GA_Left,        RIGHTBY(pg_pot_Gad) + 2,
  781.         GA_BottomBorder,    TRUE,
  782.         GA_Image,        BObj.LArrImage,
  783.         GA_Immediate,        TRUE,
  784.         GA_RelVerify,        TRUE,
  785.         GA_Previous,        tmpgad,
  786.         TAG_END);
  787.  
  788.   if (pg_left_Gad->Flags & GFLG_EXTENDED) pg_left_Gad->MoreFlags |= GMORE_GADGETHELP;
  789.  
  790.  
  791.   pg_right_Gad = (struct ExtGadget *)NewObject(NULL, "buttongclass", 
  792.         GA_ID,            PG_RIGHT_GAD_NR,
  793.         GA_RelBottom,        -win2->BorderBottom+1,
  794.         GA_Left,        RIGHTBY(pg_left_Gad),
  795.         GA_BottomBorder,    TRUE,
  796.         GA_Image,        BObj.RArrImage,
  797.         GA_Immediate,        TRUE,
  798.         GA_RelVerify,        TRUE,
  799.         GA_Previous,        tmpgad,
  800.         TAG_END);
  801.  
  802.   if (pg_right_Gad->Flags & GFLG_EXTENDED) pg_right_Gad->MoreFlags |= GMORE_GADGETHELP;
  803.  
  804.  
  805.   AddGList( w, PgGadLst, -1, 4, NULL );
  806.   RefreshGList( PgGadLst, w, NULL, 4 );
  807.  
  808. /**
  809.   (void)AddGadget(w, &first_Page_Gad,    FIRST_GAD_NR);
  810.   (void)AddGadget(w, &prev_Page_Gad,    PREV_GAD_NR);
  811.   (void)AddGadget(w, &succ_Page_Gad,    SUCC_GAD_NR);
  812.   (void)AddGadget(w, &last_Page_Gad,    LAST_GAD_NR);
  813.   (void)AddGadget(w, &dir_Gad,        DIR_GAD_NR);
  814.   (void)AddGadget(w, &fil_Gad,        FIL_GAD_NR);
  815.   (void)AddGadget(w, &int_Gad,        INT_GAD_NR);
  816. **/
  817.   /* RefreshGadgets(&first_Page_Gad, w, NULL); wird wohl nicht unbedingt benoetigt!??*/
  818. }
  819.  
  820. void Add_scroll_gadgets(int no_refresh)
  821. {
  822.   register struct Window *w = win2;
  823.  
  824.   w->BorderRight = WIDTH_SCROLL+2;
  825.   // w->BorderBottom = HEIGHT_SCROLL;  argg...Das Sizing-Gadget kommt in den unteren Ramen und so gross wird auch der Rest
  826.  
  827.   x_win_i_width = w->Width - w->BorderLeft - w->BorderRight;
  828.  
  829.   width_left_border  = w->BorderLeft;
  830.   width_right_border = w->BorderRight;
  831.  
  832.   {
  833.     const long winiw = win2->Width - win2->BorderLeft - win2->BorderRight;
  834.     const long winih = win2->Height - win2->BorderTop - win2->BorderBottom;
  835.     
  836.     if (winiw > wx) {
  837.       ((struct PropInfo*)potx_Gad.SpecialInfo)->HorizPot = MAXPOT;
  838.     }
  839.     else {
  840.       ((struct PropInfo*)potx_Gad.SpecialInfo)->HorizPot =
  841.      (USHORT)(((long)(static_x_Koo * MAXPOT))/(wx-(long)x_win_i_width+1L));
  842.     }
  843.  
  844.     if (winih > wy) {
  845.       ((struct PropInfo*)poty_Gad.SpecialInfo)->VertPot = MAXPOT;
  846.     }
  847.     else {
  848.       ((struct PropInfo*)poty_Gad.SpecialInfo)->VertPot =
  849.     (USHORT)(((long)(static_y_Koo * MAXPOT))/(wy-(long)x_win_i_height+1L));
  850.     }
  851.   }
  852.  
  853.  
  854.   (void)AddGadget(w, &potx_left_Gad,    POTX_PFEIL_LINKS_GAD_NR);
  855.   (void)AddGadget(w, &potx_right_Gad,    POTX_PFEIL_RECHTS_GAD_NR);
  856.   (void)AddGadget(w, &poty_up_Gad,    POTY_PFEIL_OBEN_GAD_NR);
  857.   (void)AddGadget(w, &poty_up2_Gad,    POTY_PFEIL_OBEN2_GAD_NR);
  858.   (void)AddGadget(w, &poty_down_Gad,    POTY_PFEIL_UNTEN_GAD_NR);
  859.   (void)AddGadget(w, &poty_down2_Gad,    POTY_PFEIL_UNTEN2_GAD_NR);
  860.   //(void)AddGadget(w, &pgscroll_Gad,    PGSCROLL_GAD_NR);
  861.   (void)AddGadget(w, &potx_Gad,        POTX_GAD_NR);
  862.   (void)AddGadget(w, &poty_Gad,        POTY_GAD_NR);
  863.  
  864.   if (is_pscro) {
  865.     //AddGadget(win2, &pgscroll_no_Gad, PGSCROLL_NO_GAD_NR);
  866.     //AddGadget(win2, &pgscroll_ok_Gad, PGSCROLL_OK_GAD_NR);
  867.   }
  868.   else {
  869.     //AddGadget(win2, &pgscroll_Gad, PGSCROLL_GAD_NR);
  870.   }
  871.  
  872.   /* Teste ob ich am Rand bin */
  873.   CheckUpDownBorderGad();
  874.  
  875.   if (!no_refresh) {
  876.     RefreshGadgets(&potx_left_Gad, w, NULL);
  877.   }
  878. }
  879.  
  880. void Remove_scroll_gadgets(int no_refresh)
  881. {
  882.   register struct Window *w = win2;
  883.  
  884.   if (w == NULL) {
  885.     FatalStr(20, "No window?!");
  886.   }
  887.  
  888.   RemoveGadget(w, &poty_Gad);
  889.   RemoveGadget(w, &potx_Gad);
  890.   RemoveGadget(w, &poty_down_Gad);
  891.   RemoveGadget(w, &poty_down2_Gad);
  892.   RemoveGadget(w, &poty_up_Gad);
  893.   RemoveGadget(w, &poty_up2_Gad);
  894.   RemoveGadget(w, &potx_right_Gad);
  895.   RemoveGadget(w, &potx_left_Gad);
  896.  
  897. /*  RemoveGList(w, &potx_left_Gad, -1); */
  898.  
  899.   if (is_pscro) {
  900.     //RemoveGadget(win2, &pgscroll_ok_Gad);
  901.     //RemoveGadget(win2, &pgscroll_no_Gad);
  902.   }
  903.   else {
  904.     //RemoveGadget(win2, &pgscroll_Gad);
  905.   }
  906.  
  907.   w->BorderRight = w->BorderLeft;
  908.   /* BorderBottom bleibt, da dort das SizingGadget drin ist */
  909.  
  910.   width_left_border  = w->BorderLeft;
  911.   width_right_border = w->BorderRight;
  912.   
  913.   x_win_i_width = w->Width - w->BorderLeft - w->BorderRight;
  914.  
  915.   if (!no_refresh) {        // && is_col4
  916.     /* Im Inneren des win2 die zweite Bitplane loeschen... */
  917.     fill_block(win2->Width+poty_up2_Gad.LeftEdge-1, win2->BorderTop, 17,
  918.         win2->Height-win2->BorderTop-win2->BorderBottom, 0);
  919.     fill_block(win2->BorderLeft, win2->Height+potx_Gad.TopEdge, win2->Width-win2->BorderLeft-win2->BorderRight, potx_Gad.Height, 0);
  920.  
  921. #if 0
  922. #if 0
  923.     fill_block(poty_Gad.LeftEdge, poty_Gad.TopEdge, poty_Gad.Width, (int)poty_Gad.UserData, 0);
  924.     fill_block(potx_Gad.LeftEdge, potx_Gad.TopEdge, (int)potx_Gad.UserData, potx_Gad.Height, 0);
  925. #else
  926.     /* ich loesch das ganze Window, auch wenn's kurz fakelt. :-( */
  927.     fill_block((short)width_left_border,(short)HeightWinTitle,
  928.             (short)x_win_i_width-1,(short)x_win_i_height-1,(short)0);
  929.     /* fill_block(w->LeftEdge, w->TopEdge, x_win_i_width, x_win_i_height, 0); */
  930. #endif
  931. #endif
  932.   }
  933.   
  934. }
  935.  
  936. void Remove_all_gadgets(void)
  937. {
  938.   register struct Window *w = win2;
  939.  
  940.   Remove_scroll_gadgets(FALSE);    // no_refresh == FALSE
  941.  
  942.   /* weg mit dem Boopsi-Gad */
  943.   /* das muss derzeit *nach* rem-scr-gad geschehen, da Disp sonst alle Gadgets loescht :( */
  944.  
  945.   DelPgGad();
  946.  
  947. #if 0
  948.   RemoveGadget(w, &int_Gad);
  949.   RemoveGadget(w, &fil_Gad);
  950.   RemoveGadget(w, &dir_Gad);
  951.   RemoveGadget(w, &first_Page_Gad);
  952.   RemoveGadget(w, &last_Page_Gad);
  953.   RemoveGadget(w, &succ_Page_Gad);
  954.   RemoveGadget(w, &prev_Page_Gad);
  955. #endif
  956.  
  957.   width_left_border  = w->BorderLeft;
  958.   width_right_border = w->BorderRight;
  959.   
  960.   x_win_i_width = w->Width - w->BorderLeft - w->BorderRight;
  961. }
  962.  
  963.  
  964.  
  965. void DelPgGad(void)
  966. {
  967.   if (!PgGadLst || !win2) return;
  968.  
  969.   RemoveGList(win2, PgGadLst, 4);
  970.  
  971.   DisposeObject(pg_right_Gad); pg_right_Gad = NULL;
  972.   DisposeObject(pg_left_Gad);  pg_left_Gad  = NULL;
  973.   DisposeObject(pg_pot_Gad);   pg_pot_Gad   = NULL;
  974.   DisposeObject(pg_int_Gad);   pg_int_Gad   = NULL;
  975.   
  976.   PgGadLst = NULL;
  977. }
  978.  
  979.  
  980. void Set_PgIntGad(long pg)
  981. {
  982.   if (!PgGadLst) return;
  983.  
  984.   SetGadgetAttrs(pg_int_Gad, win2, NULL, 
  985.             STRINGA_LongVal,    pg,
  986.             TAG_END);
  987.   RefreshGadgets(pg_int_Gad, win2, NULL);
  988. }
  989.  
  990. void Set_PgPotGadRange(void)
  991. {
  992.   if (!PgGadLst) return;
  993.  
  994.   SetGadgetAttrs(pg_pot_Gad, win2, NULL, 
  995.             PGA_Visible,        1,
  996.             PGA_Total,        max_page_number,
  997.             TAG_END);
  998.   RefreshGadgets(pg_pot_Gad, win2, NULL);
  999. }
  1000.  
  1001. void Set_PgGadPage(long phy)
  1002. {
  1003.   if (!PgGadLst) return;
  1004.  
  1005.   if (is_usephy) Set_PgIntGad(phy);
  1006.   else          Set_PgIntGad(get_log_page_number(phy));
  1007.  
  1008.   RefreshGadgets(pg_int_Gad, win2, NULL);
  1009.   
  1010.   SetGadgetAttrs(pg_pot_Gad, win2, NULL,
  1011.             PGA_Top,        phy-1,
  1012.             TAG_END);
  1013.   RefreshGadgets(pg_pot_Gad, win2, NULL);
  1014. }
  1015.  
  1016.  
  1017. void Set_PgGadPageCur(void)
  1018. {
  1019.   if (!PgGadLst) return;
  1020.  
  1021.   if (is_usephy) Set_PgIntGad(current_page_phy);
  1022.   else          Set_PgIntGad(current_page);
  1023.  
  1024.   RefreshGadgets(pg_int_Gad, win2, NULL);
  1025.   
  1026.   SetGadgetAttrs(pg_pot_Gad, win2, NULL,
  1027.             PGA_Top,        current_page_phy-1,
  1028.             TAG_END);
  1029.   RefreshGadgets(pg_pot_Gad, win2, NULL);
  1030. }
  1031.  
  1032.  
  1033. #endif
  1034.