home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-05-15 | 25.5 KB | 1,001 lines |
- XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
- XtSetArg (args[n], XmNscaleMultiple, 1); n++;
- XtSetArg (args[n], XmNshowValue, True); n++;
- azra_w = XmCreateScale (svform_w, "AzRAScale", args, n);
- XtAddCallback (azra_w, XmNvalueChangedCallback, sv_changed_cb, NULL);
- XtManageChild (azra_w);
-
- /* make the left scale */
-
- str = XmStringCreate ("FOV", XmSTRING_DEFAULT_CHARSET);
- n = 0;
- XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
- XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNleftWidget, sep_w); n++;
- XtSetArg (args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNbottomWidget, azra_w); n++;
- XtSetArg (args[n], XmNorientation, XmVERTICAL); n++;
- XtSetArg (args[n], XmNminimum, 1); n++;
- XtSetArg (args[n], XmNmaximum, 180); n++;
- XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_BOTTOM); n++;
- XtSetArg (args[n], XmNscaleMultiple, 1); n++;
- XtSetArg (args[n], XmNshowValue, True); n++;
- XtSetArg (args[n], XmNtitleString, str); n++;
- fov_w = XmCreateScale (svform_w, "FOVScale", args, n);
- XtAddCallback (fov_w, XmNvalueChangedCallback, sv_changed_cb, NULL);
- XtManageChild (fov_w);
- XmStringFree (str);
-
- /* make the right scale */
-
- n = 0;
- XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
- XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
- XtSetArg (args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNbottomWidget, azra_w); n++;
- XtSetArg (args[n], XmNorientation, XmVERTICAL); n++;
- XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_TOP); n++;
- XtSetArg (args[n], XmNscaleMultiple, 1); n++;
- XtSetArg (args[n], XmNshowValue, True); n++;
- altdec_w = XmCreateScale (svform_w, "AltDecScale", args, n);
- XtAddCallback (altdec_w, XmNvalueChangedCallback, sv_changed_cb, NULL);
- XtManageChild (altdec_w);
-
- /* make ra/dec tracking labels just above the bottom scale on either
- * side.
- */
-
- n = 0;
- XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNleftWidget, fov_w); n++;
- XtSetArg (args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNbottomWidget, azra_w); n++;
- XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
- tra_w = XmCreateLabel (svform_w, "TRA", args, n);
- set_xmstring (tra_w, XmNlabelString, " ");
- XtManageChild(tra_w);
-
- n = 0;
- XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNrightWidget, altdec_w); n++;
- XtSetArg (args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNbottomWidget, azra_w); n++;
- XtSetArg (args[n], XmNalignment, XmALIGNMENT_END); n++;
- tdec_w = XmCreateLabel (svform_w, "TDec", args, n);
- set_xmstring (tdec_w, XmNlabelString, " ");
- XtManageChild(tdec_w);
-
- /* make alt/az tracking labels on top on either side */
-
- n = 0;
- XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNleftWidget, fov_w); n++;
- XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
- XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
- talt_w = XmCreateLabel (svform_w, "TAlt", args, n);
- set_xmstring (talt_w, XmNlabelString, " ");
- XtManageChild(talt_w);
-
- n = 0;
- XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNrightWidget, altdec_w); n++;
- XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
- XtSetArg (args[n], XmNalignment, XmALIGNMENT_END); n++;
- taz_w = XmCreateLabel (svform_w, "TAz", args, n);
- set_xmstring (taz_w, XmNlabelString, " ");
- XtManageChild(taz_w);
-
- /* make a drawing area inside the sliders for drawing the sky */
-
- n = 0;
- XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
- XtSetArg (args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNbottomWidget, azra_w); n++;
- XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNleftWidget, fov_w); n++;
- XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
- XtSetArg (args[n], XmNrightWidget, altdec_w); n++;
- svda_w = XmCreateDrawingArea (svform_w, "Map", args, n);
- XtAddCallback (svda_w, XmNexposeCallback, sv_da_exp_cb, 0);
- XtAddCallback (svda_w, XmNinputCallback, sv_da_input_cb, 0);
- mask = Button1MotionMask | ButtonPressMask | ButtonReleaseMask
- | PointerMotionHintMask,
- XtAddEventHandler (svda_w, mask, False, sv_da_motion_cb,0);
- XtManageChild (svda_w);
-
- /* create the filter dialog.
- * it's not managed yet, but its state info is used right off.
- */
- svf_create();
-
- /* create the popup */
- sv_create_popup();
-
- sv_set_view();
- sv_set_scales();
- }
-
- static void
- sv_create_find (parent)
- Widget parent;
- {
- Arg args[20];
- Widget mb_w, menu_w, p_w;
- Widget w;
- int n;
- int i;
-
- /* create menu bar for the cascade button */
-
- n = 0;
- XtSetArg (args[n], XmNrowColumnType, XmMENU_BAR); n++;
- mb_w = XmCreateRowColumn (parent, "PointMB", args, n);
- XtManageChild (mb_w);
-
- /* create pulldown managed by the cascade button */
- n = 0;
- menu_w = XmCreatePulldownMenu (parent, "PointPD", args, n);
-
- /* create the pushbuttons forming the cascade menu.
- * go ahead and fill in and manage the planet names now.
- * we do the user objects just as we are cascading.
- */
- for (i = 0; i < NOBJ; i++) {
- n = 0;
- w = XmCreatePushButton (menu_w, "PointPB", args, n);
- XtAddCallback (w, XmNactivateCallback, sv_find_cb,
- (XtPointer)i);
- if (i >= MERCURY && i <= MOON) {
- Obj *op = db_basic (i);
- set_xmstring (w, XmNlabelString, op->o_name);
- XtManageChild (w);
- } else if (i == OBJX)
- find_w[0] = w;
- else if (i == OBJY)
- find_w[1] = w;
- }
-
- n = 0;
- XtSetArg (args[n], XmNsubMenuId, menu_w); n++;
- XtSetArg (args[n], XmNmarginHeight, 0); n++;
- XtSetArg (args[n], XmNalignment, XmALIGNMENT_CENTER); n++;
- p_w = XmCreateCascadeButton (mb_w, "PointCB", args, n);
- set_xmstring (p_w, XmNlabelString, "Locate...");
- XtAddCallback (p_w, XmNcascadingCallback, sv_finding_cb, 0);
- XtManageChild (p_w);
- }
-
- /* callback from the main Close button.
- */
- /* ARGSUSED */
- static void
- sv_close_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- XtUnmanageChild (svform_w);
- svf_unmanage ();
- if (sv_pm) {
- XFreePixmap (XtDisplay(svda_w), sv_pm);
- sv_pm = (Pixmap) NULL;
- }
- }
-
- /* callback from the Help button.
- */
- /* ARGSUSED */
- static void
- sv_help_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- static char *msg[] = {
- "This displays all database objects currently in memory onto the sky. The view",
- "may be Alt/Az or RA/Dec. The three sliders adjust the field of fov, the",
- "azimuth (or RA), and the altitude (or Dec). Objects may be filtered out by",
- "type and magnitude."
- };
-
- hlp_dialog ("Sky View", msg, sizeof(msg)/sizeof(msg[0]));
- }
-
- /* callback when the alt/az button changes state.
- */
- /* ARGSUSED */
- static void
- sv_aa_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- double lst;
- Now *np;
-
- np = mm_get_now();
- now_lst (np, &lst);
-
- if (aa_mode) {
- /* change from alt/az to ra/dec mode */
- double ha;
- unrefract (pressure, temp, sv_altdec, &sv_altdec);
- aa_hadec (lat, sv_altdec, sv_azra, &ha, &sv_altdec);
- sv_azra = hrrad(lst) - ha;
- range (&sv_azra, 2*PI);
- if (epoch != EOD)
- precess (mjd, epoch, &sv_azra, &sv_altdec);
- } else {
- /* change from ra/dec to alt/az mode if center is above horizon */
- double ha, ra, dec, alt, az;
- ra = sv_azra;
- dec = sv_altdec;
- if (epoch != EOD)
- precess (epoch, mjd, &ra, &dec);
- ha = hrrad(lst) - ra;
- range (&ha, 2*PI);
- hadec_aa (lat, ha, dec, &alt, &az);
- refract (pressure, temp, alt, &alt);
- if (alt < 0.0) {
- xe_msg ("Center would be below horizon.", 1);
- XmToggleButtonSetState (aa_w, False, False);
- XmToggleButtonSetState (rad_w, True, False);
- return;
- }
- sv_altdec = alt;
- sv_azra = az;
- }
-
- aa_mode ^= 1;
- sv_set_scales();
- sv_all(np, 1);
- }
-
- /* callback from the filter button.
- * just toggle the filter dialog.
- * always restore it to the real state before bringing it up.
- */
- /* ARGSUSED */
- static void
- sv_filter_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- svf_manage_toggle ();
- }
-
- /* callback from the grid button.
- * if adding the grid just draw it, but if taking it away copy from pixmap.
- */
- /* ARGSUSED */
- static void
- sv_grid_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- want_grid = XmToggleButtonGetState(w);
-
- sv_all(mm_get_now(), 1);
-
- if (!want_grid) {
- set_xmstring (vgrid_w, XmNlabelString, null_grid_str);
- set_xmstring (hgrid_w, XmNlabelString, null_grid_str);
- }
- }
-
- /* set the altdec_w and azra_w scale values, depending on aa_mode and sv_altdec
- * and sv_azra.
- */
- static void
- sv_set_scales()
- {
- Arg args[20];
- int n;
-
- if (aa_mode) {
- int altitude, azimuth;
-
- altitude = raddeg(sv_altdec) + 0.5;
- azimuth = raddeg(sv_azra) + 0.5;
- if (azimuth >= 360) azimuth -= 360;
- if (azimuth < 0) azimuth += 360;
-
- n = 0;
- XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++;
- XtSetArg (args[n], XmNmaximum, 359); n++;
- XtSetArg (args[n], XmNminimum, 0); n++;
- XtSetArg (args[n], XmNdecimalPoints, 0); n++;
- XtSetArg (args[n], XmNvalue, azimuth); n++;
- XtSetValues (azra_w, args, n);
-
- n = 0;
- XtSetArg (args[n], XmNmaximum, 90); n++;
- XtSetArg (args[n], XmNminimum, 0); n++;
- XtSetArg (args[n], XmNvalue, altitude); n++;
- XtSetValues (altdec_w, args, n);
-
- } else {
- int ra, dec;
-
- ra = radhr(sv_azra)*10.0 + 0.5;
- if (ra >= 240) ra -= 240;
- dec = raddeg(sv_altdec) + (sv_altdec >= 0 ? 0.5 : -0.5);
-
- n = 0;
- XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_LEFT); n++;
- XtSetArg (args[n], XmNmaximum, 239); n++;
- XtSetArg (args[n], XmNminimum, 0); n++;
- XtSetArg (args[n], XmNdecimalPoints, 1); n++;
- XtSetArg (args[n], XmNvalue, ra); n++;
- XtSetValues (azra_w, args, n);
-
- n = 0;
- XtSetArg (args[n], XmNmaximum, 90); n++;
- XtSetArg (args[n], XmNminimum, -90); n++;
- XtSetArg (args[n], XmNvalue, dec); n++;
- XtSetValues (altdec_w, args, n);
- }
- }
-
- /* expose event of sky view drawing area.
- * if same size just copy from pixmap, else recompute all (it's resized).
- * N.B. we set bit_gravity to ForgetGravity so we can just use Expose events.
- * N.B. we turn off backing store since we effectively do it in the pixmap.
- */
- /* ARGSUSED */
- static void
- sv_da_exp_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- static unsigned int wid_last, hei_last;
- XmDrawingAreaCallbackStruct *c = (XmDrawingAreaCallbackStruct *)call;
- Display *dsp = XtDisplay(w);
- Window win = XtWindow(w);
- Window root;
- int x, y;
- unsigned int bw, d;
- unsigned wid, hei;
-
-
- switch (c->reason) {
- case XmCR_EXPOSE: {
- static before;
- XExposeEvent *e = &c->event->xexpose;
- if (!before) {
- XSetWindowAttributes swa;
- unsigned long mask = CWBitGravity | CWBackingStore;
- swa.bit_gravity = ForgetGravity;
- swa.backing_store = NotUseful;
- XChangeWindowAttributes (e->display, e->window, mask, &swa);
- before = 1;
- }
- /* wait for the last in the series */
- if (e->count != 0)
- return;
- break;
- }
- default:
- printf ("Unexpected svda_w event. type=%d\n", c->reason);
- exit(1);
- }
-
- XGetGeometry (dsp, win, &root, &x, &y, &wid, &hei, &bw, &d);
-
- if (!sv_pm || wid != wid_last || hei != hei_last) {
- if (sv_pm)
- XFreePixmap (dsp, sv_pm);
-
- if (!sv_gc)
- sv_mk_gcs(dsp, win);
-
- sv_pm = XCreatePixmap (dsp, win, wid, hei, d);
- wid_last = wid;
- hei_last = hei;
-
- sv_all(mm_get_now(), 1);
- } else {
- /* same size; just copy from the pixmap */
- sv_copy_sky();
- }
- }
-
- /* copy the pixmap to the drawing area
- */
- static void
- sv_copy_sky()
- {
- Display *dsp = XtDisplay (svda_w);
- Window win = XtWindow (svda_w);
- unsigned wid, hei; /* overall width and height */
- unsigned int r; /* circle radius */
- unsigned int xb, yb; /* x and y border */
-
- sv_getcircle (&wid, &hei, &r, &xb, &yb);
-
- XCopyArea (dsp, sv_pm, win, sv_gc, 0, 0, wid, hei, 0, 0);
- }
-
- /* called on receipt of a MotionNotify or ButtonPress or ButtonRelease event
- * while the cursor is wandering over the sky view and button 1 is down.
- * we report the current location in world coordinates.
- */
- /* ARGSUSED */
- static void
- sv_da_motion_cb (w, client, ev, continue_to_dispatch)
- Widget w;
- XtPointer client;
- XEvent *ev;
- Boolean *continue_to_dispatch;
- {
- Now *np = mm_get_now();
- unsigned int wide, h, r, xb, yb;
- double altdec, azra;
- Window root, child;
- int rx, ry, wx, wy;
- unsigned mask;
- char alt_buf[64], az_buf[64];
- char ra_buf[64], dec_buf[64];
- int evt = ev->type;
- int okmotion, okbutton;
- double lst;
-
- /* only interested if motion event or button 1 press/release */
- okmotion = evt == MotionNotify && ev->xmotion.state == Button1Mask;
- okbutton = (evt == ButtonPress || evt == ButtonRelease)
- && ev->xbutton.button == Button1;
- if (!okmotion && !okbutton)
- return;
-
- now_lst (np, &lst);
-
- XQueryPointer (XtDisplay(w), XtWindow(w),
- &root, &child, &rx, &ry, &wx, &wy, &mask);
-
- sv_getcircle (&wide, &h, &r, &xb, &yb);
-
- if (evt != ButtonRelease && sv_unloc (r, wx-xb, wy-yb, &altdec, &azra)){
- double ha, ra, dec, alt, az;
-
- if (aa_mode) {
- /* need to make the ra/dec entries */
- alt = altdec;
- az = azra;
- unrefract (pressure, temp, altdec, &altdec);
- aa_hadec (lat, altdec, azra, &ha, &dec);
- ra = hrrad(lst) - ha;
- range (&ra, 2*PI);
- if (epoch != EOD)
- precess (mjd, epoch, &ra, &dec);
- } else {
- /* need to make the alt/az entries */
- ra = azra;
- dec = altdec;
- if (epoch != EOD)
- precess (epoch, mjd, &azra, &altdec);
- ha = hrrad(lst) - azra;
- range (&ha, 2*PI);
- hadec_aa (lat, ha, altdec, &alt, &az);
- refract (pressure, temp, alt, &alt);
- }
-
- (void) strcpy (alt_buf, "Alt: ");
- fs_angle (alt_buf+5, alt);
- (void) strcpy (az_buf, "Az: ");
- fs_angle (az_buf+4, az);
- (void) strcpy (ra_buf, "RA: ");
- fs_ra (ra_buf+4, ra);
- (void) strcpy (dec_buf, "Dec: ");
- fs_angle (dec_buf+5, dec);
- } else {
- (void) strcpy (alt_buf, " ");
- (void) strcpy (az_buf, " ");
- (void) strcpy (ra_buf, " ");
- (void) strcpy (dec_buf, " ");
- }
-
- f_showit (talt_w, alt_buf);
- f_showit (taz_w, az_buf);
- f_showit (tra_w, ra_buf);
- f_showit (tdec_w, dec_buf);
- }
-
- /* a dot has been picked:
- * find what it is and report stuff about it in a popup.
- */
- /* ARGSUSED */
- static void
- sv_da_input_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- #define PICKRANGE 100 /* sqr of dist allowed from pointer */
- XmDrawingAreaCallbackStruct *c = (XmDrawingAreaCallbackStruct *)call;
- XEvent *ev;
- TrailObj *top;
- unsigned int wide, h, r, xb, yb;
- int x, y;
- int mind = 1000000; /* min distance to far */
- TSky *mintsp = NULL; /* set to a TSky if find one close */
- Obj *minop = NULL; /* set to an Obj if find one closer */
- Obj *op;
- int cx, cy;
- int d;
- int i;
-
- if (c->reason != XmCR_INPUT)
- return;
- ev = c->event;
- if (ev->xany.type != ButtonPress || ev->xbutton.button != 3)
- return;
-
- watch_cursor(1);
-
- sv_getcircle (&wide, &h, &r, &xb, &yb);
-
- /* search everything based on cursor loc within the circle */
- cx = ev->xbutton.x - xb;
- cy = ev->xbutton.y - yb;
-
- /* search the trailed stuff first because
- * the first entry in a trailing list will be both in the db and in
- * the trails list -- we want to find the latter when we can.
- */
- for (top = trailobj; top; top = top->ntop) {
- if (!top->on)
- continue;
- for (i = 0; i < top->nsky; i++) {
- if (!sv_trailobjloc (&top->sky[i], r, &x, &y))
- continue;
- d = (cx - x)*(cx - x) + (cy - y)*(cy - y);
- if (d < mind) {
- mintsp = &top->sky[i];
- mind = d;
- }
- }
- }
-
- /* search the database too -- might be something closer */
- for (op = db_next(NULL, OBJS_ALL); op; op = db_next(op, OBJS_ALL)) {
- if (!(op->o_flags & OBJF_ONSCREEN))
- continue;
- if (!sv_dbobjloc (op, r, &x, &y))
- continue; /* not in the circle now */
- d = (cx - x)*(cx - x) + (cy - y)*(cy - y);
- if (d < mind) {
- minop = op;
- mind = d;
- }
- }
-
- if (mind <= PICKRANGE)
- sv_popup (ev, minop, minop ? NULL : mintsp);
-
- watch_cursor(0);
- }
-
- /* callback when any of the scales change value.
- */
- /* ARGSUSED */
- static void
- sv_changed_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- sv_set_view();
- sv_all(mm_get_now(), 1);
- }
-
- /* callback when the "just dots" toggle button changes state.
- */
- /* ARGSUSED */
- static void
- sv_justdots_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- justdots = XmToggleButtonGetState (w);
- sv_all(mm_get_now(), 1);
- }
-
- /* callback when the "ecliptic" toggle button changes state.
- */
- /* ARGSUSED */
- static void
- sv_ecliptic_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- want_ecliptic = XmToggleButtonGetState (w);
- sv_all(mm_get_now(), 1);
- }
-
- /* callback when the "all labels" toggle button changes state.
- */
- /* ARGSUSED */
- static void
- sv_all_labels_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- all_labels = XmToggleButtonGetState (w);
- sv_all(mm_get_now(), 1);
- }
-
- /* callback when the "Find" cascade button is activated.
- * check the used defined objects and adjust the cascade buttons accordingly.
- */
- /* ARGSUSED */
- static void
- sv_finding_cb (wid, client, call)
- Widget wid;
- XtPointer client;
- XtPointer call;
- {
- int i;
-
- for (i = 0; i < 2; i++) {
- Obj *op = db_basic (i == 0 ? OBJX : OBJY);
- Widget w = find_w[i];
- if (op->type == UNDEFOBJ)
- XtUnmanageChild (w);
- else {
- set_xmstring (w, XmNlabelString, op->o_name);
- XtManageChild (w);
- }
- }
- }
-
- /* callback when one of the "point" cascade buttons changes state.
- * object index is in client.
- */
- /* ARGSUSED */
- static void
- sv_find_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- Obj *op = db_basic((int)client);
-
- switch (sv_id (op)) {
- case 0:
- break;
- case -1:
- xe_msg ("Object is below the horizon now", 1);
- break;
- case -2:
- sv_point (op);
- break;
- }
- }
-
- /* callback as either magnitude scale is dragged.
- * enforce at least a 1 mag window.
- */
- /* ARGSUSED */
- static void
- sv_magdrag_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- int f, b;
-
- XmScaleGetValue (fmag_w, &f);
- XmScaleGetValue (bmag_w, &b);
- if (f - b < 1)
- XmScaleSetValue (w, w == fmag_w ? b+1 : f-1);
- }
-
- /* read the scales and alt-az widgets into the global variables that
- * describe our current display conditions.
- */
- static void
- sv_set_view()
- {
- int i;
-
- XmScaleGetValue (fov_w, &i);
- sv_fov = degrad(i);
-
- XmScaleGetValue (bmag_w, &bmag);
- XmScaleGetValue (fmag_w, &fmag);
-
- XmScaleGetValue (altdec_w, &i);
- sv_altdec = degrad(i);
- XmScaleGetValue (azra_w, &i);
- sv_azra = aa_mode ? degrad(i) : hrrad((double)i/10.0);
- }
-
- /* return the current circle info about svda_w */
- static void
- sv_getcircle (wp, hp, rp, xbp, ybp)
- unsigned int *wp, *hp; /* overall width and height */
- unsigned int *rp; /* circle radius */
- unsigned int *xbp, *ybp; /* x and y border */
- {
- Display *dsp = XtDisplay(svda_w);
- Window win = XtWindow(svda_w);
- Window root;
- int x, y;
- unsigned int w, h;
- unsigned int bw, d;
-
- XGetGeometry (dsp, win, &root, &x, &y, wp, hp, &bw, &d);
- w = *wp/2;
- h = *hp/2;
- *rp = w > h ? h : w; /* radius */
- *xbp = w - *rp; /* x border */
- *ybp = h - *rp; /* y border */
-
- }
-
- /* fill in the popup with goodies from db object *op or *tsp if it is set:
- * if tsp is set use it's Obj -- this is a trailed object.
- * position the popup as indicated by ev and display it.
- * it goes down by itself.
- */
- static void
- sv_popup (ev, op, tsp)
- XEvent *ev;
- Obj *op;
- TSky *tsp;
- {
- char buf[32], buf2[64];
- int trail;
- int label;
- double jd;
-
- if (tsp) {
- /* we were given a trailed Obj */
- TrailObj *top;
- op = &tsp->o;
- jd = tsp->ts_mjd;
- top = tobj_find (op);
- trail = top->on;
- label = !!(tsp->flags & OBJF_LABEL);
- } else {
- /* no tsp trail -- just use the db */
- Now *np = mm_get_now();
- jd = mjd;
- trail = 0;
- label = !!(op->o_flags & OBJF_LABEL);
- }
-
- XmToggleButtonSetState (pu.trail_w, trail, False);
- XmToggleButtonSetState (pu.label_w, label, False);
-
- pu.op = op;
- pu.tsp = tsp;
-
- (void) sprintf (buf2, " Name: %.20s", op->o_name);
- set_xmstring (pu.name_w, XmNlabelString, buf2);
-
- (void) sprintf (buf2, " Type: %.20s", obj_description(op));
- set_xmstring (pu.desc_w, XmNlabelString, buf2);
-
- if (op->type == FIXED && op->f_spect[0]) {
- (void) sprintf (buf2, " Spect: %.*s", sizeof(op->f_spect),
- op->f_spect);
- set_xmstring (pu.spect_w, XmNlabelString, buf2);
- XtManageChild (pu.spect_w);
- } else
- XtUnmanageChild (pu.spect_w);
-
- fs_date (buf, jd);
- (void) sprintf (buf2, "UT Date: %s", buf);
- set_xmstring (pu.ud_w, XmNlabelString, buf2);
-
- fs_time (buf, mjd_hr(jd));
- (void) sprintf (buf2, "UT Time: %s", buf);
- set_xmstring (pu.ut_w, XmNlabelString, buf2);
-
- fs_ra (buf, op->s_ra);
- (void) sprintf (buf2, " RA: %s", buf);
- set_xmstring (pu.ra_w, XmNlabelString, buf2);
-
- fs_angle (buf, op->s_dec);
- (void) sprintf (buf2, " Dec: %s", buf);
- set_xmstring (pu.dec_w, XmNlabelString, buf2);
-
- fs_angle (buf, op->s_alt);
- (void) sprintf (buf2, " Alt: %s", buf);
- set_xmstring (pu.alt_w, XmNlabelString, buf2);
-
- fs_angle (buf, op->s_az);
- (void) sprintf (buf2, " Az: %s", buf);
- set_xmstring (pu.az_w, XmNlabelString, buf2);
-
- (void) sprintf (buf2, " Mag: %.3g", op->s_mag/MAGSCALE);
- set_xmstring (pu.mag_w, XmNlabelString, buf2);
-
- XmMenuPosition (pu.pu_w, (XButtonPressedEvent *)ev);
- XtManageChild (pu.pu_w);
- }
-
- /* create the id popup */
- static void
- sv_create_popup()
- {
- static Widget *puw[] = {
- &pu.name_w,
- &pu.desc_w,
- &pu.spect_w,
- &pu.ud_w,
- &pu.ut_w,
- &pu.ra_w,
- &pu.dec_w,
- &pu.alt_w,
- &pu.az_w,
- &pu.mag_w,
- };
- Arg args[20];
- XmString str;
- Widget w;
- int i, n;
-
- /* create the outer form */
- n = 0;
- XtSetArg (args[n], XmNisAligned, True); n++;
- XtSetArg (args[n], XmNentryAlignment, XmALIGNMENT_CENTER); n++;
- pu.pu_w = XmCreatePopupMenu (toplevel_w, "SVPopup", args, n);
-
- /* create the label widgets */
-
- for (i = 0; i < XtNumber(puw); i++) {
- n = 0;
- *puw[i] = XmCreateLabel (pu.pu_w, "SVPopValueL", args, n);
- XtManageChild (*puw[i]);
- }
-
- /* add a nice separator */
- n = 0;
- w = XmCreateSeparator (pu.pu_w, "SVSep", args, n);
- XtManageChild(w);
-
- /* make the "aim", "ObjX" and "trail" command buttons */
-
- str = XmStringCreateLtoR ("Point", XmSTRING_DEFAULT_CHARSET);
- n = 0;
- XtSetArg (args[n], XmNlabelString, str); n++;
- w = XmCreatePushButton (pu.pu_w, "SVPopPoint", args, n);
- XtAddCallback (w, XmNactivateCallback, sv_pu_activate_cb,
- (XtPointer)AIM);
- XtManageChild (w);
- XmStringFree (str);
-
- str = XmStringCreateLtoR ("Make ObjX/Y", XmSTRING_DEFAULT_CHARSET);
- n = 0;
- XtSetArg (args[n], XmNlabelString, str); n++;
- w = XmCreatePushButton (pu.pu_w, "SVPopMakeObj", args, n);
- XtAddCallback (w, XmNactivateCallback, sv_pu_activate_cb,
- (XtPointer)MK_OBJX);
- XtManageChild (w);
- XmStringFree(str);
-
- str = XmStringCreateLtoR ("Leave Trail", XmSTRING_DEFAULT_CHARSET);
- n = 0;
- XtSetArg (args[n], XmNlabelString, str); n++;
- XtSetArg (args[n], XmNvisibleWhenOff, True); n++;
- pu.trail_w = XmCreateToggleButton (pu.pu_w, "SVPopTrail", args, n);
- XtAddCallback(pu.trail_w, XmNvalueChangedCallback, sv_pu_trail_cb,NULL);
- XtManageChild (pu.trail_w);
- XmStringFree(str);
-
- str = XmStringCreateLtoR ("Persistent Label", XmSTRING_DEFAULT_CHARSET);
- n = 0;
- XtSetArg (args[n], XmNlabelString, str); n++;
- XtSetArg (args[n], XmNvisibleWhenOff, True); n++;
- pu.label_w = XmCreateToggleButton (pu.pu_w, "SVPopLabel", args, n);
- XtAddCallback(pu.label_w, XmNvalueChangedCallback, sv_pu_label_cb,NULL);
- XtManageChild (pu.label_w);
- XmStringFree(str);
- }
-
- /* called when any of the popup's pushbuttons are activated.
- * client is a code to indicate which.
- */
- /* ARGSUSED */
- static void
- sv_pu_activate_cb (w, client, call)
- Widget w;
- XtPointer client;
- XtPointer call;
- {
- switch ((int)client) {
- case AIM:
- sv_point (pu.tsp ? &pu.tsp->o : pu.op);
- break;
- case MK_OBJX: {
- switch (pu.op->type) {
- case HYPERBOLIC: case PARABOLIC: case ELLIPTICAL: case FIXED:
- sv_ournewobj = 1;
- obj_set (pu.op);
- sv_ournewobj = 0;
- break;
- default:
- xe_msg ("User objects can not be of that type.", 0);
- break;
- }
- }
- break;
- }
- }
-
- /* called when the Trail popup toggle button changes.
- * clean up the trailobj stuff.
- */
- /* ARGSUSED */
- static void
- sv_pu_trail_cb (wid, client, call)
- Widget wid;
- XtPointer client;
- XtPointer call;
- {
- if (XmToggleButtonGetState(wid)) {
- /* trail is being turned on.
- * if it already has a trail just turn it back on and draw it, else
- * add a new db obj to trailobj list.
- */
- TrailObj *top = tobj_find (pu.op);
- if (top) {
- unsigned int w, h, r, xb, yb;
- sv_getcircle (&w, &h, &r, &xb, &yb);
- top->on = 1;
- tobj_display_all(r, xb, yb);
- sv_copy_sky();
- } else {
- Now *np = mm_get_now();
- top = tobj_addobj (pu.op);
- (void) tobj_addsky (top, mjd, pu.op);
- /* no need to redraw since a trail of lenth 1 won't *look*
- * any different.
- */
- }
- } else {
- /* trailing is being turned off. mark it as being off.
- * it will get removed at the next update if it's still off.
- * redraw sky so it disappears.
- */
- TrailObj *top = tobj_find (pu.op);
- top->on = 0;
- sv_all (mm_get_now(), 1);
- }
- }
-
- /* called when the Label popup toggle button changes.
- * we get all context from the pu structure.
- */
- /* ARGSUSED */
- static void
- sv_pu_label_cb (wid, client, call)
- Widget wid;
- XtPointer client;
- XtPointer call;
- {
- unsigned int w, h, r, xb, yb;
- int x, y;
- int label;
- char *name;
-
- /* if this is a trailed item then its TSky will be in pu.tsp
- * otherwise it is a plain db object.
- * either way, toggle the corresponding OBJF_LABEL bit too.
- */
- if (pu.tsp) {
- label = (pu.tsp->flags ^= OBJF_LABEL) & OBJF_LABEL;
- if (label) {
- sv_getcircle (&w, &h, &r, &xb, &yb);
- (void) sv_trailobjloc (pu.tsp, r, &x, &y);
- name = pu.tsp->o.o_name;
- }
-