home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d7xx / d762 / plotmap.lha / PlotMap / source.lha / coordwindow.c < prev    next >
C/C++ Source or Header  |  1992-10-09  |  5KB  |  169 lines

  1. /* coordinate window routines */
  2.  
  3. #include "PlotMap.h"
  4.  
  5. /********** externals **********/
  6.  
  7. extern struct Screen *screen;
  8. extern struct TextAttr myfont;
  9. extern struct RastPort *rp;
  10. extern struct Menu *menu;
  11. extern struct config config;
  12.  
  13. extern WORD calc_lon(WORD), calc_lat(WORD);
  14.  
  15. /********** Variablen, Daten **********/
  16.  
  17. struct Window *coord_wd = NULL;
  18. static struct RastPort *coord_rp;
  19.  
  20. /********** Routinen **********/
  21.  
  22. void refresh_coord(WORD mx, WORD my)
  23. {
  24.    char str[20];
  25.    struct TextFont *font;
  26.    WORD left, top;
  27.  
  28.    if (coord_wd)                          /* window may be closed! */
  29.    {
  30.       font = coord_rp->Font;
  31.       left = coord_wd->BorderLeft + 2;
  32.       top = coord_wd->BorderTop + 1 + font->tf_Baseline;
  33.       Move(coord_rp, left, top);          /* go to initial pos. */
  34.  
  35.       if (config.coord_mousexy)           /* print mouse-coords */
  36.       {
  37.          sprintf(str, "X: %4d  Y: %3d", mx,my);
  38.          Text(coord_rp, str, 15);
  39.  
  40.          Move(coord_rp, left, top + font->tf_YSize+2);   /* next line */
  41.       }
  42.  
  43.       if (config.coord_degree)         /* print longitude and lattitude */
  44.       {
  45.          WORD lon = calc_lon(mx), lat = calc_lat(my);
  46.          char lon_c = ' ', lat_c = ' ';
  47.  
  48.          if (lon < 0)            /* longitude negativ means */
  49.          {
  50.             lon_c = 'W';         /* west */
  51.             lon = -lon;
  52.          }
  53.          else if (lon > 0)
  54.             lon_c = 'O';
  55.          if (lat < 0)            /* lattitude negativ means */
  56.          {
  57.             lat_c = 'S';         /* south hemisphere */
  58.             lat = -lat;
  59.          }
  60.          else if (lat > 0)
  61.             lat_c = 'N';
  62.  
  63.          sprintf(str, "Lon: %3d° %2d' %c", lon/60, lon%60, lon_c);
  64.          Text(coord_rp, str, 15);
  65.          Move(coord_rp, left, coord_rp->cp_y + font->tf_YSize+2);
  66.          sprintf(str, "Lat: %3d° %2d' %c", lat/60, lat%60, lat_c);
  67.          Text(coord_rp, str, 15);
  68.       } /* if (config.coord_degree) */
  69.    } /* if (coord_wd) */
  70. }
  71.  
  72.  
  73. void set_coord_window_size(void)
  74. {
  75.    WORD wd_y, wd_h;
  76.  
  77.    if (coord_wd)        /* if user changes display while window closed */
  78.    {
  79.       wd_h = screen->WBorTop + myfont.ta_YSize + screen->WBorBottom +
  80.                (config.coord_mousexy + 2*config.coord_degree) *
  81.                (myfont.ta_YSize+2);
  82.  
  83.       wd_y = coord_wd->TopEdge;              /* get top edge */
  84.       if (wd_y + wd_h > screen->Height)      /* move window up a bit */
  85.          wd_y = screen->Height - wd_h - 1;   /* if too far down */
  86.  
  87.       ChangeWindowBox(coord_wd, coord_wd->LeftEdge, wd_y,
  88.             coord_wd->Width, wd_h);
  89.  
  90.       refresh_coord(main_wd->MouseX, main_wd->MouseY);
  91.    } /* if (coord_wd) */
  92. }
  93.  
  94.  
  95. void open_coord_window(void)
  96. {
  97.    WORD wd_w, wd_h;
  98.  
  99.    /* calculate window width and height depending on used font and
  100.     * displayed coordinates (mouse/degree) */
  101.    wd_w = screen->WBorLeft + screen->WBorRight + 5 +
  102.          max(TextLength(rp, "X: 0000  Y: 000", 15),
  103.                TextLength(rp, "Lon: 000° 00` W", 15));
  104.    wd_h = screen->WBorTop + myfont.ta_YSize + screen->WBorBottom +
  105.       (config.coord_mousexy + 2*config.coord_degree) * (myfont.ta_YSize+2);
  106.  
  107.    /* open window at old position */
  108.    if (coord_wd = OpenWindowTags(NULL,
  109.             WA_Left,config.coord_wdx,  WA_Top,config.coord_wdy,
  110.             WA_Width,wd_w,  WA_Height,wd_h,
  111.             WA_CustomScreen,screen,
  112.             WA_Title,"Coords",  WA_AutoAdjust,TRUE,
  113.             WA_Flags, WFLG_NOCAREREFRESH | WFLG_SIMPLE_REFRESH |
  114.                WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_RMBTRAP,
  115.             WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_ACTIVEWINDOW,
  116.             TAG_DONE))
  117.    {
  118.       coord_rp = coord_wd->RPort;            /* init. rastport */
  119.       SetAPen(coord_rp, 1);
  120.       SetBPen(coord_rp, 0);
  121.       SetDrMd(coord_rp, JAM2);
  122.  
  123.       refresh_coord(main_wd->MouseX, main_wd->MouseY);
  124.    }
  125.    else
  126.       TITLE_ERROR("Can`t open window!");
  127. }
  128.  
  129.  
  130. void close_coord_window(void)
  131. {
  132.    if (coord_wd)                       /* why close if it is closed? */
  133.    {
  134.       config.coord_wdx = coord_wd->LeftEdge;    /* remember old position */
  135.       config.coord_wdy = coord_wd->TopEdge;
  136.  
  137.       CloseWindow(coord_wd);
  138.       coord_wd = NULL;
  139.    }
  140. }
  141.  
  142.  
  143. void handlecoordIDCMP(void)
  144. {
  145.    struct IntuiMessage *msg;
  146.    ULONG class;
  147.  
  148.    while (coord_wd && (msg = (struct IntuiMessage *)GetMsg(coord_wd->UserPort)))
  149.    {
  150.       class = msg->Class;
  151.       ReplyMsg((struct Message *)msg);
  152.  
  153.       switch (class)
  154.       {
  155.          case IDCMP_ACTIVEWINDOW:      /* do not allow activation of me */
  156.             ActivateWindow(main_wd);
  157.             break;
  158.          case IDCMP_CLOSEWINDOW:
  159.             config.coord_window = FALSE;
  160.             ClearMenuStrip(main_wd);         /* clear menu`s checkmark */
  161.             ItemAddress(menu, FULLMENUNUM(1,4,NOSUB))->Flags &= ~CHECKED;
  162.             ResetMenuStrip(main_wd, menu);
  163.             close_coord_window();            /* sets coord_wd to NULL */
  164.             break;
  165.       } /* switch (class) */
  166.    } /* while (GetMsg()) */
  167. }
  168.  
  169.