/* file: annpan.c G. Moody 1 May 1990
Last revised: 29 April 1999
Annotation template panel functions for WAVE
-------------------------------------------------------------------------------
WAVE: Waveform analyzer, viewer, and editor
Copyright (C) 1999 George B. Moody
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, see .
You may contact the author by e-mail (wfdb@physionet.org) or postal mail
(MIT Room E25-505A, Cambridge, MA 02139 USA). For updates to this software,
please visit PhysioNet (http://www.physionet.org/).
_______________________________________________________________________________
*/
#include "wave.h"
#include "xvwave.h"
#include
Frame ann_frame;
Panel ann_panel;
Panel_item anntyp_item, subtyp_item, num_item, chan_item, aux_item;
int ann_popup_active = -1;
/* Make the annotation template popup window disappear. */
static void dismiss_ann_template()
{
if (ann_popup_active > 0) {
xv_set(ann_frame, WIN_MAP, FALSE, 0);
ann_popup_active = 0;
}
}
/* Update the annotation template following a selection in the popup window. */
static void ann_select(item, event)
Panel_item item;
Event *event;
{
int a;
static char client_data, m[2], tmp_aux[257];
switch (a = (int)xv_get(item, PANEL_CLIENT_DATA)) {
case 't': ann_template.anntyp = (int)xv_get(item, PANEL_VALUE); break;
case 's': ann_template.subtyp = (int)xv_get(item, PANEL_VALUE); break;
case 'n': ann_template.num = (int)xv_get(item, PANEL_VALUE); break;
case 'c': ann_template.chan = (int)xv_get(item, PANEL_VALUE); break;
case 'a': strcpy(tmp_aux+1, (char *)xv_get(item, PANEL_VALUE));
if (tmp_aux[0] = strlen(tmp_aux+1))
ann_template.aux = tmp_aux;
else
ann_template.aux = NULL;
break;
}
}
static char *mstr[54];
static void create_mstr_array()
{
char *dp, mbuf[5], *mp, *msp;
int i;
unsigned int l, lm;
mstr[0] = ". (Deleted annotation)";
for (i = 1; i <= ACMAX; i++) {
if ((mp = annstr(i)) == NULL) {
sprintf(mbuf, "[%d]", i);
mp = mbuf;
}
if ((dp = anndesc(i)) == NULL)
dp = "(unassigned annotation type)";
lm = strlen(mp);
l = strlen(dp) + 6;
if (lm > 4) l += lm - 4;
if ((mstr[i] = (char *)malloc(l)) == NULL)
break;
strcpy(mstr[i], mp);
do {
mstr[i][lm] = ' ';
} while (++lm < 5);
strcpy(mstr[i]+lm, dp);
}
mstr[ACMAX+1] = ": (Index mark)";
mstr[ACMAX+2] = "< (Start of analysis)";
mstr[ACMAX+3] = "> (End of analysis)";
mstr[ACMAX+4] = "; (Reference mark)";
}
/* Set up popup window for defining an annotation template. */
static void create_ann_template_popup()
{
Icon icon;
create_mstr_array();
ann_template.anntyp = 1;
icon = xv_create(XV_NULL, ICON,
ICON_IMAGE, icon_image,
ICON_LABEL, "Template",
NULL);
ann_frame = xv_create(frame, FRAME,
XV_LABEL, "Annotation Template",
FRAME_ICON, icon, 0);
ann_panel = xv_create(ann_frame, PANEL, 0);
anntyp_item = xv_create(ann_panel, PANEL_CHOICE,
PANEL_DISPLAY_LEVEL, PANEL_CURRENT,
PANEL_LABEL_STRING, "Type: ",
XV_HELP_DATA, "wave:annot.type",
PANEL_CHOICE_STRINGS,
mstr[ 0], mstr[ 1], mstr[ 2], mstr[ 3], mstr[ 4],
mstr[ 5], mstr[ 6], mstr[ 7], mstr[ 8], mstr[ 9],
mstr[10], mstr[11], mstr[12], mstr[13], mstr[14],
mstr[15], mstr[16], mstr[17], mstr[18], mstr[19],
mstr[20], mstr[21], mstr[22], mstr[23], mstr[24],
mstr[25], mstr[26], mstr[27], mstr[28], mstr[29],
mstr[30], mstr[31], mstr[32], mstr[33], mstr[34],
mstr[35], mstr[36], mstr[37], mstr[38], mstr[39],
mstr[40], mstr[41], mstr[42], mstr[43], mstr[44],
mstr[45], mstr[46], mstr[47], mstr[48], mstr[49],
mstr[50], mstr[51], mstr[52], mstr[53],
NULL,
PANEL_VALUE, 1,
PANEL_NOTIFY_PROC, ann_select,
PANEL_CLIENT_DATA, (caddr_t) 't',
0);
aux_item = xv_create(ann_panel, PANEL_TEXT,
PANEL_LABEL_STRING, "Text: ",
XV_HELP_DATA, "wave:annot.text",
PANEL_VALUE_DISPLAY_LENGTH, 20,
PANEL_VALUE_STORED_LENGTH, 255,
PANEL_VALUE, "",
PANEL_NOTIFY_PROC, ann_select,
PANEL_CLIENT_DATA, (caddr_t) 'a',
0);
subtyp_item = xv_create(ann_panel, PANEL_NUMERIC_TEXT,
PANEL_LABEL_STRING, "Subtype: ",
XV_HELP_DATA, "wave:annot.subtype",
PANEL_VALUE, 0,
PANEL_MIN_VALUE, -128,
PANEL_MAX_VALUE, 127,
PANEL_NOTIFY_PROC, ann_select,
PANEL_CLIENT_DATA, (caddr_t) 's',
0);
chan_item = xv_create(ann_panel, PANEL_NUMERIC_TEXT,
PANEL_LABEL_STRING, "`Chan' field: ",
XV_HELP_DATA, "wave:annot.chan",
PANEL_VALUE, 0,
PANEL_MIN_VALUE, -128,
PANEL_MAX_VALUE, 127,
PANEL_NOTIFY_PROC, ann_select,
PANEL_CLIENT_DATA, (caddr_t) 'c',
0);
num_item = xv_create(ann_panel, PANEL_NUMERIC_TEXT,
PANEL_LABEL_STRING, "`Num' field: ",
XV_HELP_DATA, "wave:annot.num",
PANEL_VALUE, 0,
PANEL_MIN_VALUE, -128,
PANEL_MAX_VALUE, 127,
PANEL_NOTIFY_PROC, ann_select,
PANEL_CLIENT_DATA, (caddr_t) 'n',
0);
xv_create(ann_panel, PANEL_BUTTON,
PANEL_LABEL_STRING, "Change all in range",
XV_HELP_DATA, "wave:annot.change",
PANEL_NOTIFY_PROC, change_annotations,
0);
xv_create(ann_panel, PANEL_BUTTON,
PANEL_LABEL_STRING, "Dismiss",
XV_HELP_DATA, "wave:annot.dismiss",
PANEL_NOTIFY_PROC, dismiss_ann_template,
0);
window_fit(ann_panel);
window_fit(ann_frame);
}
/* Make the annotation template popup window appear. */
void show_ann_template()
{
if (ann_popup_active < 0) create_ann_template_popup();
wmgr_top(ann_frame);
xv_set(ann_frame, WIN_MAP, TRUE, 0);
ann_popup_active = 1;
}
/* Set the annotation template window `Type' item. */
void set_anntyp(i)
int i;
{
if (ann_popup_active < 0) create_ann_template_popup();
xv_set(anntyp_item, PANEL_VALUE, i, NULL);
}
/* Set the annotation template window `Aux' item. */
void set_ann_aux(s)
char *s;
{
if (ann_popup_active >= 0)
xv_set(aux_item, PANEL_VALUE, s ? s+1 : "", NULL);
}
/* Set the annotation template window `Subtype' item. */
void set_ann_subtyp(i)
int i;
{
if (ann_popup_active >= 0)
xv_set(subtyp_item, PANEL_VALUE, i, NULL);
}
/* Set the annotation template window `Chan' item. */
void set_ann_chan(i)
int i;
{
if (ann_popup_active >= 0)
xv_set(chan_item, PANEL_VALUE, i, NULL);
}
/* Set the annotation template window `Num' item. */
void set_ann_num(i)
int i;
{
if (ann_popup_active >= 0)
xv_set(num_item, PANEL_VALUE, i, NULL);
}