1 /**********
2 *
3 * Copyright (c) 2003, Division of Imaging Science and Biomedical Engineering,
4 * University of Manchester, UK. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 *
9 * . Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 *
12 * . Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * . Neither the name of the University of Manchester nor the names of its
17 * contributors may be used to endorse or promote products derived from this
18 * software without specific prior written permission.
19 *
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
33 **********
34 *
35 * Program : TINA
36 * File : $Source: /home/tina/cvs/tina-tools/tinatool/wdgts/gtk2/wdgtsGtk_tw_fglobal.c,v $
37 * Date : $Date: 2007/02/15 01:55:50 $
38 * Version : $Revision: 1.2 $
39 * CVS Id : $Id: wdgtsGtk_tw_fglobal.c,v 1.2 2007/02/15 01:55:50 paul Exp $
40 *
41 * Author : a.lacey@man.ac.uk, giob@man.ac.uk
42 *
43 *********
44 */
45 /**
46 * @file wdgtsGtk_tw_fglobal.c
47 * @brief Define and create GTK float entry field and its associated callbacks.
48 *
49 * Functions to create a GTK float entry field and to define its use by linking it into the TINA
50 * the TINA callback system using a Tw_callback struct. Also defines the callback functions
51 * invoked when the buttons are used. Note that a float entry field in GTK is just a text
52 * entry field, but TINA handles it differently.
53 *
54 * Note that the functions in this file are duplicated for each widget set (xv, GTK, xm, etc ...).
55 *
56 */
57
58 #include "wdgtsGtk_tw_fglobal.h"
59
60 #if HAVE_CONFIG_H
61 # include <config.h>
62 #endif
63
64 #include <stdio.h>
65 #include <string.h>
66 #include <gtk/gtk.h>
67 #include <tinatool/wdgts/gtk2/wdgts_GtkDef.h>
68 #include <tinatool/wdgts/gtk2/wdgtsGtk_tw_command.h>
69 #include <tinatool/wdgts/gtk2/wdgtsGtk_tw_tool.h>
70
71
72 /**
73 * @brief Copy float from entry widget to stored callback data field.
74 * @param twc Pointer to Tw_callback associated with this float entry widget.
75 *
76 * Callback function for float entry widgets. Each of these has an associated
77 * Tw_callback, and this function copies the current widget float into the data
78 * field of the Tw_callback.
79 *
80 * Note that this callback is not invoked directly by the widget, but via a call
81 * to tw_text_callback (in wdgtsGtk_tw_command.c).
82 *
83 */
84 static void fglobal_call(Tw_callback * twc)
85 {
86 double x;
87 double *ptr = (double *) twc->data1;
88 char *string = (char *) gtk_entry_get_text(GTK_ENTRY(twc->widget));
89
90 if (sscanf(string, "%lf", &x) == 1)
91 *ptr = x;
92 }
93
94 /**
95 * @brief Replay float entry from current macro file.
96 * @param twc Pointer to Tw_callback associated with this widget.
97 * @param args Pointer to required data, stored in the macro file.
98 *
99 */
100 static void fglobal_cmnd(Tw_callback * twc, char *args)
101 {
102 double *ptr = (double *) twc->data1;
103 char string[64];
104
105 (void) sscanf(args, "%*s %lf", ptr);
106 (void) sscanf(args, "%*s %s", string);
107 gtk_entry_set_text(GTK_ENTRY(twc->widget), string);
108 }
109
110 /**
111 * @brief Record float entry in current macro file.
112 * @param fp Pointer to current macro file.
113 * @param twc Pointer to Tw_callback associated with this widget.
114 *
115 */
116 static void fglobal_prnt(FILE * fp, Tw_callback * twc)
117 {
118 double x = *(double *) twc->data1;
119
120 (void) fprintf(fp, "%s %g\n", twc->name, x);
121 }
122
123 /**
124 * @brief Create new float entry field and its associated callback struct.
125 * @param name String to be used as entry field identifier and label.
126 * @param ptr Pointer to storage for float entered in the field.
127 * @param nchars Maximum number of characters for input field.
128 * @return Tw_callback Pointer to new Tw_callback associated with this entry field.
129 *
130 * Creates new hbox for float entry field, and packs field and label in it.
131 *
132 * Invokes callback for each keypress, via call to tw_text_callback
133 * (in wdgtsGtk_tw_command.c).
134 *
135 */
136 Tw_callback *tw_fglobal(char *name, double *ptr, int nchars)
137 {
138 GtkWidget *panel= tw_get_panel();
139 GtkWidget *box;
140 GtkWidget *ftxlabel;
141 GtkWidget *ftxentry;
142
143 char string[32];
144 double value;
145
146 Tw_callback *twc;
147 char *fullname = tw_extend_fullname(tw_get_toolname(), name);
148
149 box = gtk_hbox_new(FALSE, 8);
150 gtk_container_add(GTK_CONTAINER(panel), box);
151 gtk_widget_show(box);
152
153 ftxlabel = gtk_label_new(name);
154 ftxentry = gtk_entry_new();
155 gtk_widget_set_usize(ftxentry, (10+6*nchars), 22);
156 gtk_box_pack_start(GTK_BOX(box), ftxlabel, FALSE, FALSE, 0);
157 gtk_box_pack_start(GTK_BOX(box), ftxentry, FALSE, FALSE, 0);
158 gtk_widget_show(ftxlabel);
159 gtk_widget_show(ftxentry);
160
161 value = *ptr;
162 (void) sprintf(string, "%g", value);
163 if (!strchr(string, '.') && !strchr(string, 'e'))
164 {
165 /* Ensure at least one decimal place is shown */
166 (void) sprintf(string, "%.1f", value);
167 }
168 gtk_entry_set_text(GTK_ENTRY(ftxentry), string);
169
170 twc = tw_callback_make(fullname, ftxentry,
171 fglobal_call, fglobal_cmnd, fglobal_prnt, (void (*) ()) NULL,
172 (void *) ptr, NULL);
173
174 /* Invoke callback for GTK entry "changed" event (i.e. for each keypress) */
175 gtk_signal_connect(GTK_OBJECT(ftxentry), "changed",
176 GTK_SIGNAL_FUNC(tw_gtk_callback),
177 (gpointer) twc);
178
179 return (twc);
180 }
181
182 /**
183 * @brief Reset float entry field when value has been altered.
184 * @param twc Pointer to Tw_callback associated with this text entry widget.
185 *
186 * NOTE: NOT TESTED YET - GAB 10 Oct 2003.
187 *
188 */
189 void tw_fglobal_reset(Tw_callback * twc)
190 {
191 double *val;
192 char string[64];
193
194 if (twc == NULL)
195 return;
196
197 val = (double *) twc->data1;
198 (void) sprintf(string, "%g", *val);
199 if (!strchr(string, '.') && !strchr(string, 'e'))
200 {
201 /* Ensure at least one decimal place is shown (JB 2/3/93) */
202 (void) sprintf(string, "%.1f", *val);
203 }
204 gtk_entry_set_text(GTK_ENTRY(twc->widget), string);
205 }
206
207
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.