#ifndef lint
static char SccsId[] = "%W% %G%";
#endif
/* Module: wrattach.c (Write Attach)
* Subroutine: btn_WriteMenuAttach() returns: void
* Copyright: 1989 Smithsonian Astrophysical Observatory
* You may do anything you like with this file except remove
* this copyright. The Smithsonian Astrophysical Observatory
* makes no representations about the suitability of this
* software for any purpose. It is provided "as is" without
* express or implied warranty.
* Modified: {0} Michael VanHilst initial version 9 May 1989
* {n} <who> -- <does what> -- <when>
*/
#include <stdio.h>
#include "btnmenu.h"
/*
* Subroutine: btn_WriteMenuAttach
* Purpose: write code to create menu attachments
*/
void btn_WriteMenuAttach ( file, menu )
FILE *file;
MenuSpec *menu;
{
int i;
static void btn_WritePanelAttach();
for( i=0; i<menu->panel_cnt; i++ ) {
if( menu->panel[i].attach != NULL ) {
btn_WritePanelAttach (file, &menu->panel[i], menu);
}
}
}
/*
* Subroutine: btn_WritePanelAttach
*/
static void btn_WritePanelAttach ( file, panel, menu )
FILE *file;
PanelSpec *panel;
MenuSpec *menu;
{
char *pnlname;
int pnum, boxnum, btnnum;
int i;
PanelAttach *attach;
static int btn_FindAttachButton();
attach = panel->attach;
if( btn_FindAttachButton(attach, menu, &pnum, &boxnum, &btnnum) ) {
for( i=0; i<panel->box_cnt; i++ ) {
if( attach->attach ) {
(void)fprintf(file," AttachSubmenu(%s[%d],", panel->title, i);
(void)fprintf(file," %s[%d], %d, 0x%x, 0x%x);\n", attach->panel_title,
boxnum, btnnum, attach->mask, attach->reference);
}
if( attach->join ) {
(void)fprintf(file," JoinMenus(%s[%d], %s[%d]);\n",
panel->title, i, attach->panel_title, boxnum);
}
}
}
}
/*
* Subroutine: btn_FindAttaachButton
* Purpose: get parameters to identify button of attachment
*/
static int btn_FindAttachButton ( attach, menu, panel_num, box_num, btn_num )
PanelAttach *attach;
MenuSpec *menu;
int *panel_num, *box_num, *btn_num;
{
int pl, bx, bn;
int i;
PanelSpec *panel;
BtnSpec *btn;
/* check for reasonableness */
if( (attach->match_cnt <= 0) || (attach->match_cnt > DATA_LIMIT) ) {
(void)fprintf(stderr,"bad menu attachment specification:");
(void)fprintf(stderr,"%s %s\n",attach->panel_title, attach->box_title);
exit(0);
}
/* find the attachment point */
for( pl=0; pl<menu->panel_cnt; pl++ ) {
/* match the panel parent for the panel */
if( (attach->parent_index == menu->panel[pl].parent_index) &&
(strcmp(attach->panel_title, menu->panel[pl].title) == 0) ) {
panel = &menu->panel[pl];
for( bx=0; bx<panel->box_cnt; bx++ ) {
/* match the box title for the box */
if( strcmp(panel->box[bx].title, attach->box_title) == 0 ) {
for( bn=0; bn<panel->box[bx].geo.btn_cnt; bn++ ) {
/* match the data for the button */
btn = &panel->box[bx].btn[bn];
for( i=0;
(i<attach->match_cnt) && (attach->data[i] == btn->data[i]);
i++ );
if( i >= attach->match_cnt ) {
*panel_num = pl;
*box_num = bx;
*btn_num = bn;
return( 1 );
}
}
}
}
}
}
(void)fprintf(stderr,"WARNING: could not find attach button:");
(void)fprintf(stderr,"%s %s\n", attach->panel_title, attach->box_title);
return( 0 );
}
syntax highlighted by Code2HTML, v. 0.9.1